blob: 3a720827cdcaf83b3115a5485db547179d95b5fb [file] [log] [blame]
ollie6a600992005-11-26 21:55:36 +00001/*
uweb25f1ea2007-08-29 17:52:32 +00002 * This file is part of the flashrom project.
ollie6a600992005-11-26 21:55:36 +00003 *
uwe555dd972007-09-09 20:21:05 +00004 * Copyright (C) 2000 Silicon Integrated System Corporation
5 * Copyright (C) 2004 Tyan Corp
stepan0ac57fd2008-07-02 13:33:09 +00006 * Copyright (C) 2005-2008 coresystems GmbH <stepan@openbios.org>
hailfingerf60abdb2009-03-19 12:18:13 +00007 * Copyright (C) 2006-2009 Carl-Daniel Hailfinger
snelson63133f92010-01-04 17:15:23 +00008 * Copyright (C) 2009 Sean Nelson <audiohacked@gmail.com>
uweb25f1ea2007-08-29 17:52:32 +00009 *
stepan7cd945e2007-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.
ollie6a600992005-11-26 21:55:36 +000014 *
stepan7cd945e2007-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.
ollie6a600992005-11-26 21:55:36 +000019 *
ollie6a600992005-11-26 21:55:36 +000020 */
21
David Hendricks8c084212015-11-17 22:29:36 -080022#include <stdlib.h>
23#include <string.h>
24
ollie6a600992005-11-26 21:55:36 +000025#include "flash.h"
hailfinger66966da2009-06-15 14:14:48 +000026#include "flashchips.h"
snelson8913d082010-02-26 05:48:29 +000027#include "chipdrivers.h"
David Hendricks23cd7782010-08-25 12:42:38 -070028#include "writeprotect.h"
ollie6a600992005-11-26 21:55:36 +000029
uwec93fbdb2008-03-16 02:06:25 +000030/**
uwe3cfe8a52009-05-21 15:55:46 +000031 * List of supported flash chips.
uwec93fbdb2008-03-16 02:06:25 +000032 *
33 * Please keep the list sorted by vendor name and chip name, so that
34 * the output of 'flashrom -L' is alphabetically sorted.
35 */
hailfinger48ed3e22011-05-04 00:39:50 +000036const struct flashchip flashchips[] = {
uwec93fbdb2008-03-16 02:06:25 +000037
hailfinger3000b1f2009-07-23 12:42:01 +000038 /*
39 * .vendor = Vendor name
40 * .name = Chip name
41 * .bustype = Supported flash bus types (Parallel, LPC...)
42 * .manufacture_id = Manufacturer chip ID
43 * .model_id = Model chip ID
44 * .total_size = Total size in (binary) kbytes
45 * .page_size = Page or eraseblock(?) size in bytes
46 * .tested = Test status
47 * .probe = Probe function
48 * .probe_timing = Probe function delay
hailfinger91cf1032009-10-01 13:15:01 +000049 * .block_erasers[] = Array of erase layouts and erase functions
50 * {
51 * .eraseblocks[] = Array of { blocksize, blockcount }
52 * .block_erase = Block erase function
53 * }
snelson1ee293c2010-02-19 00:52:10 +000054 * .printlock = Chip lock status function
55 * .unlock = Chip unlock function
hailfinger3000b1f2009-07-23 12:42:01 +000056 * .write = Chip write function
57 * .read = Chip read function
stefanct7e00e222011-06-03 07:26:31 +000058 * .voltage = Voltage range in millivolt
stepanaa1b6a22008-12-08 18:15:10 +000059 */
60
hailfinger286829b2009-01-08 03:40:17 +000061 {
62 .vendor = "AMD",
uwe82741f22009-06-19 15:54:39 +000063 .name = "Am29F010A/B",
hailfingere1e41ea2011-07-27 07:13:06 +000064 .bustype = BUS_PARALLEL,
uwe82741f22009-06-19 15:54:39 +000065 .manufacture_id = AMD_ID,
Patrick Georgi6ad860e2017-02-03 19:09:03 +010066 .model_id = AMD_AM29F010, /* Same as Am29F010A */
uwe82741f22009-06-19 15:54:39 +000067 .total_size = 128,
68 .page_size = 16 * 1024,
snelsonc6855342010-01-28 23:55:12 +000069 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
hailfingerd217d122010-10-08 18:52:29 +000070 .tested = TEST_OK_PRE,
snelsonc6855342010-01-28 23:55:12 +000071 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +000072 .probe_timing = TIMING_ZERO,
hailfingerc43afc92009-12-22 22:15:33 +000073 .block_erasers =
74 {
75 {
76 .eraseblocks = { {16 * 1024, 8} },
snelsonc6855342010-01-28 23:55:12 +000077 .block_erase = erase_sector_jedec,
hailfingerc43afc92009-12-22 22:15:33 +000078 }, {
79 .eraseblocks = { {128 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +000080 .block_erase = erase_chip_block_jedec,
hailfingerc43afc92009-12-22 22:15:33 +000081 },
82 },
snelsonc6855342010-01-28 23:55:12 +000083 .write = write_jedec_1,
uwe82741f22009-06-19 15:54:39 +000084 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000085 .voltage = {4500, 5500},
uwe82741f22009-06-19 15:54:39 +000086 },
87
88 {
89 .vendor = "AMD",
hailfinger286829b2009-01-08 03:40:17 +000090 .name = "Am29F002(N)BB",
hailfingere1e41ea2011-07-27 07:13:06 +000091 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000092 .manufacture_id = AMD_ID,
mhmd3c80cd2010-09-15 23:31:03 +000093 .model_id = AMD_AM29F002BB,
hailfinger286829b2009-01-08 03:40:17 +000094 .total_size = 256,
95 .page_size = 256,
snelsonc6855342010-01-28 23:55:12 +000096 .feature_bits = FEATURE_SHORT_RESET | FEATURE_ADDR_2AA,
hailfinger286829b2009-01-08 03:40:17 +000097 .tested = TEST_UNTESTED,
98 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +000099 .probe_timing = TIMING_ZERO,
hailfingerc43afc92009-12-22 22:15:33 +0000100 .block_erasers =
101 {
102 {
103 .eraseblocks = {
104 {16 * 1024, 1},
105 {8 * 1024, 2},
106 {32 * 1024, 1},
107 {64 * 1024, 3},
108 },
109 .block_erase = erase_sector_jedec,
110 }, {
111 .eraseblocks = { {256 * 1024, 1} },
112 .block_erase = erase_chip_block_jedec,
113 },
114 },
hailfingerfff99532009-11-27 17:49:42 +0000115 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +0000116 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +0000117 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
stepanaa1b6a22008-12-08 18:15:10 +0000118 },
119
hailfinger286829b2009-01-08 03:40:17 +0000120 {
121 .vendor = "AMD",
122 .name = "Am29F002(N)BT",
hailfingere1e41ea2011-07-27 07:13:06 +0000123 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +0000124 .manufacture_id = AMD_ID,
mhmd3c80cd2010-09-15 23:31:03 +0000125 .model_id = AMD_AM29F002BT,
hailfinger286829b2009-01-08 03:40:17 +0000126 .total_size = 256,
127 .page_size = 256,
snelsonc6855342010-01-28 23:55:12 +0000128 .feature_bits = FEATURE_EITHER_RESET | FEATURE_ADDR_2AA,
129 .tested = TEST_UNTESTED,
hailfinger286829b2009-01-08 03:40:17 +0000130 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +0000131 .probe_timing = TIMING_ZERO,
hailfingerc43afc92009-12-22 22:15:33 +0000132 .block_erasers =
133 {
134 {
135 .eraseblocks = {
136 {64 * 1024, 3},
137 {32 * 1024, 1},
138 {8 * 1024, 2},
139 {16 * 1024, 1},
140 },
141 .block_erase = erase_sector_jedec,
142 }, {
143 .eraseblocks = { {256 * 1024, 1} },
144 .block_erase = erase_chip_block_jedec,
145 },
146 },
hailfingerfff99532009-11-27 17:49:42 +0000147 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +0000148 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +0000149 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
stepanaa1b6a22008-12-08 18:15:10 +0000150 },
151
hailfinger286829b2009-01-08 03:40:17 +0000152 {
153 .vendor = "AMD",
154 .name = "Am29F016D",
hailfingere1e41ea2011-07-27 07:13:06 +0000155 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +0000156 .manufacture_id = AMD_ID,
mhmd3c80cd2010-09-15 23:31:03 +0000157 .model_id = AMD_AM29F016D,
hailfingerc43afc92009-12-22 22:15:33 +0000158 .total_size = 2 * 1024,
hailfinger286829b2009-01-08 03:40:17 +0000159 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +0000160 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
hailfinger286829b2009-01-08 03:40:17 +0000161 .tested = TEST_UNTESTED,
snelsonc6855342010-01-28 23:55:12 +0000162 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +0000163 .probe_timing = TIMING_ZERO,
hailfingerc43afc92009-12-22 22:15:33 +0000164 .block_erasers =
165 {
166 {
167 .eraseblocks = { {64 * 1024, 32} },
snelsonc6855342010-01-28 23:55:12 +0000168 .block_erase = erase_sector_jedec,
hailfingerc43afc92009-12-22 22:15:33 +0000169 }, {
170 .eraseblocks = { {2048 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +0000171 .block_erase = erase_chip_block_jedec,
hailfingerc43afc92009-12-22 22:15:33 +0000172 },
173 },
snelsonc6855342010-01-28 23:55:12 +0000174 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +0000175 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +0000176 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +0000177 },
178
hailfinger286829b2009-01-08 03:40:17 +0000179 {
180 .vendor = "AMD",
181 .name = "Am29F040B",
hailfingere1e41ea2011-07-27 07:13:06 +0000182 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +0000183 .manufacture_id = AMD_ID,
Patrick Georgi6ad860e2017-02-03 19:09:03 +0100184 .model_id = AMD_AM29F040,
hailfinger286829b2009-01-08 03:40:17 +0000185 .total_size = 512,
186 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +0000187 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
188 .tested = TEST_UNTESTED,
189 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +0000190 .probe_timing = TIMING_ZERO,
hailfingerc43afc92009-12-22 22:15:33 +0000191 .block_erasers =
192 {
193 {
194 .eraseblocks = { {64 * 1024, 8} },
snelsonc6855342010-01-28 23:55:12 +0000195 .block_erase = erase_sector_jedec,
hailfingerc43afc92009-12-22 22:15:33 +0000196 }, {
197 .eraseblocks = { {512 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +0000198 .block_erase = erase_chip_block_jedec,
hailfingerc43afc92009-12-22 22:15:33 +0000199 },
200 },
snelsonc6855342010-01-28 23:55:12 +0000201 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +0000202 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +0000203 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +0000204 },
205
hailfinger286829b2009-01-08 03:40:17 +0000206 {
207 .vendor = "AMD",
stuged9f66152009-01-25 23:55:12 +0000208 .name = "Am29F080B",
hailfingere1e41ea2011-07-27 07:13:06 +0000209 .bustype = BUS_PARALLEL,
hailfingeradd36042009-06-02 00:38:14 +0000210 .manufacture_id = AMD_ID,
Patrick Georgi6ad860e2017-02-03 19:09:03 +0100211 .model_id = AMD_AM29F080,
stuged9f66152009-01-25 23:55:12 +0000212 .total_size = 1024,
213 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +0000214 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
stuged9f66152009-01-25 23:55:12 +0000215 .tested = TEST_UNTESTED,
216 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +0000217 .probe_timing = TIMING_ZERO,
hailfingerc43afc92009-12-22 22:15:33 +0000218 .block_erasers =
219 {
220 {
221 .eraseblocks = { {64 * 1024, 16} },
snelsonc6855342010-01-28 23:55:12 +0000222 .block_erase = erase_sector_jedec,
hailfingerc43afc92009-12-22 22:15:33 +0000223 }, {
224 .eraseblocks = { {1024 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +0000225 .block_erase = erase_chip_block_jedec,
hailfingerc43afc92009-12-22 22:15:33 +0000226 },
227 },
snelsonc6855342010-01-28 23:55:12 +0000228 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +0000229 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +0000230 .voltage = {4500, 5500},
stuged9f66152009-01-25 23:55:12 +0000231 },
232
233 {
234 .vendor = "AMD",
hailfinger5a8bd5a2011-02-05 12:11:17 +0000235 .name = "Am29LV001BB",
hailfingere1e41ea2011-07-27 07:13:06 +0000236 .bustype = BUS_PARALLEL,
hailfinger5a8bd5a2011-02-05 12:11:17 +0000237 .manufacture_id = AMD_ID,
238 .model_id = AMD_AM29LV001BB,
239 .total_size = 128,
240 .page_size = 64 * 1024, /* unused */
241 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
242 .tested = TEST_OK_PREW,
243 .probe = probe_jedec,
244 .probe_timing = TIMING_ZERO,
245 .block_erasers =
246 {
247 {
248 .eraseblocks = {
249 {8 * 1024, 1},
250 {4 * 1024, 2},
251 {16 * 1024, 7},
252 },
253 .block_erase = erase_sector_jedec,
254 }, {
255 .eraseblocks = { {128 * 1024, 1} },
256 .block_erase = erase_chip_block_jedec,
257 },
258 },
259 .write = write_jedec_1,
260 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +0000261 .voltage = {3000, 3600}, /* 3.0-3.6V for type -45R, others 2.7-3.6V */
hailfinger5a8bd5a2011-02-05 12:11:17 +0000262 },
263
264 {
265 .vendor = "AMD",
266 .name = "Am29LV001BT",
hailfingere1e41ea2011-07-27 07:13:06 +0000267 .bustype = BUS_PARALLEL,
hailfinger5a8bd5a2011-02-05 12:11:17 +0000268 .manufacture_id = AMD_ID,
269 .model_id = AMD_AM29LV001BT,
270 .total_size = 128,
271 .page_size = 64 * 1024, /* unused */
272 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
273 .tested = TEST_UNTESTED,
274 .probe = probe_jedec,
275 .probe_timing = TIMING_ZERO,
276 .block_erasers =
277 {
278 {
279 .eraseblocks = {
280 {16 * 1024, 7},
281 {4 * 1024, 2},
282 {8 * 1024, 1},
283 },
284 .block_erase = erase_sector_jedec,
285 }, {
286 .eraseblocks = { {128 * 1024, 1} },
287 .block_erase = erase_chip_block_jedec,
288 },
289 },
290 .write = write_jedec_1,
291 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +0000292 .voltage = {3000, 3600}, /* 3.0-3.6V for type -45R, others 2.7-3.6V */
hailfinger5a8bd5a2011-02-05 12:11:17 +0000293 },
294
295 {
296 .vendor = "AMD",
297 .name = "Am29LV002BB",
hailfingere1e41ea2011-07-27 07:13:06 +0000298 .bustype = BUS_PARALLEL,
hailfinger5a8bd5a2011-02-05 12:11:17 +0000299 .manufacture_id = AMD_ID,
300 .model_id = AMD_AM29LV002BB,
301 .total_size = 256,
302 .page_size = 64 * 1024, /* unused */
303 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
304 .tested = TEST_UNTESTED,
305 .probe = probe_jedec,
306 .probe_timing = TIMING_ZERO,
307 .block_erasers =
308 {
309 {
310 .eraseblocks = {
311 {16 * 1024, 1},
312 {8 * 1024, 2},
313 {32 * 1024, 1},
314 {64 * 1024, 3},
315 },
316 .block_erase = erase_sector_jedec,
317 }, {
318 .eraseblocks = { {256 * 1024, 1} },
319 .block_erase = erase_chip_block_jedec,
320 },
321 },
322 .write = write_jedec_1,
323 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +0000324 .voltage = {3000, 3600}, /* 3.0-3.6V for type -55, others 2.7-3.6V */
hailfinger5a8bd5a2011-02-05 12:11:17 +0000325 },
326
327 {
328 .vendor = "AMD",
329 .name = "Am29LV002BT",
hailfingere1e41ea2011-07-27 07:13:06 +0000330 .bustype = BUS_PARALLEL,
hailfinger5a8bd5a2011-02-05 12:11:17 +0000331 .manufacture_id = AMD_ID,
332 .model_id = AMD_AM29LV002BT,
333 .total_size = 256,
334 .page_size = 64 * 1024, /* unused */
335 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
336 .tested = TEST_UNTESTED,
337 .probe = probe_jedec,
338 .probe_timing = TIMING_ZERO,
339 .block_erasers =
340 {
341 {
342 .eraseblocks = {
343 {64 * 1024, 3},
344 {32 * 1024, 1},
345 {8 * 1024, 2},
346 {16 * 1024, 1},
347 },
348 .block_erase = erase_sector_jedec,
349 }, {
350 .eraseblocks = { {256 * 1024, 1} },
351 .block_erase = erase_chip_block_jedec,
352 },
353 },
354 .write = write_jedec_1,
355 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +0000356 .voltage = {3000, 3600}, /* 3.0-3.6V for type -55, others 2.7-3.6V */
hailfinger5a8bd5a2011-02-05 12:11:17 +0000357 },
358
359 {
360 .vendor = "AMD",
361 .name = "Am29LV004BB",
hailfingere1e41ea2011-07-27 07:13:06 +0000362 .bustype = BUS_PARALLEL,
hailfinger5a8bd5a2011-02-05 12:11:17 +0000363 .manufacture_id = AMD_ID,
364 .model_id = AMD_AM29LV004BB,
365 .total_size = 512,
366 .page_size = 64 * 1024, /* unused */
367 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
368 .tested = TEST_UNTESTED,
369 .probe = probe_jedec,
370 .probe_timing = TIMING_ZERO,
371 .block_erasers =
372 {
373 {
374 .eraseblocks = {
375 {16 * 1024, 1},
376 {8 * 1024, 2},
377 {32 * 1024, 1},
378 {64 * 1024, 7},
379 },
380 .block_erase = erase_sector_jedec,
381 }, {
382 .eraseblocks = { {512 * 1024, 1} },
383 .block_erase = erase_chip_block_jedec,
384 },
385 },
386 .write = write_jedec_1,
387 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +0000388 .voltage = {2700, 3600},
hailfinger5a8bd5a2011-02-05 12:11:17 +0000389 },
390
391 {
392 .vendor = "AMD",
393 .name = "Am29LV004BT",
hailfingere1e41ea2011-07-27 07:13:06 +0000394 .bustype = BUS_PARALLEL,
hailfinger5a8bd5a2011-02-05 12:11:17 +0000395 .manufacture_id = AMD_ID,
396 .model_id = AMD_AM29LV004BT,
397 .total_size = 512,
398 .page_size = 64 * 1024, /* unused */
399 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
400 .tested = TEST_UNTESTED,
401 .probe = probe_jedec,
402 .probe_timing = TIMING_ZERO,
403 .block_erasers =
404 {
405 {
406 .eraseblocks = {
407 {64 * 1024, 7},
408 {32 * 1024, 1},
409 {8 * 1024, 2},
410 {16 * 1024, 1},
411 },
412 .block_erase = erase_sector_jedec,
413 }, {
414 .eraseblocks = { {512 * 1024, 1} },
415 .block_erase = erase_chip_block_jedec,
416 },
417 },
418 .write = write_jedec_1,
419 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +0000420 .voltage = {2700, 3600},
hailfinger5a8bd5a2011-02-05 12:11:17 +0000421 },
422
423 {
424 .vendor = "AMD",
425 .name = "Am29LV008BB",
hailfingere1e41ea2011-07-27 07:13:06 +0000426 .bustype = BUS_PARALLEL,
hailfinger5a8bd5a2011-02-05 12:11:17 +0000427 .manufacture_id = AMD_ID,
428 .model_id = AMD_AM29LV008BB,
429 .total_size = 1024,
430 .page_size = 64 * 1024, /* unused */
431 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
uwe67f685c2011-08-25 22:54:23 +0000432 .tested = TEST_OK_PREW,
hailfinger5a8bd5a2011-02-05 12:11:17 +0000433 .probe = probe_jedec,
434 .probe_timing = TIMING_ZERO,
435 .block_erasers =
436 {
437 {
438 .eraseblocks = {
439 {16 * 1024, 1},
440 {8 * 1024, 2},
441 {32 * 1024, 1},
442 {64 * 1024, 15},
443 },
444 .block_erase = erase_sector_jedec,
445 }, {
446 .eraseblocks = { {1024 * 1024, 1} },
447 .block_erase = erase_chip_block_jedec,
448 },
449 },
450 .write = write_jedec_1,
451 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +0000452 .voltage = {3000, 3600} /* 3.0-3.6V for type -70R, others 2.7-3.6V */
hailfinger5a8bd5a2011-02-05 12:11:17 +0000453 },
454
455 {
456 .vendor = "AMD",
457 .name = "Am29LV008BT",
hailfingere1e41ea2011-07-27 07:13:06 +0000458 .bustype = BUS_PARALLEL,
hailfinger5a8bd5a2011-02-05 12:11:17 +0000459 .manufacture_id = AMD_ID,
460 .model_id = AMD_AM29LV008BT,
461 .total_size = 1024,
462 .page_size = 64 * 1024, /* unused */
463 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
464 .tested = TEST_UNTESTED,
465 .probe = probe_jedec,
466 .probe_timing = TIMING_ZERO,
467 .block_erasers =
468 {
469 {
470 .eraseblocks = {
471 {64 * 1024, 15},
472 {32 * 1024, 1},
473 {8 * 1024, 2},
474 {16 * 1024, 1},
475 },
476 .block_erase = erase_sector_jedec,
477 }, {
478 .eraseblocks = { {1024 * 1024, 1} },
479 .block_erase = erase_chip_block_jedec,
480 },
481 },
482 .write = write_jedec_1,
483 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +0000484 .voltage = {3000, 3600} /* 3.0-3.6V for type -70R, others 2.7-3.6V */
hailfinger5a8bd5a2011-02-05 12:11:17 +0000485 },
486
487 {
488 .vendor = "AMD",
hailfinger286829b2009-01-08 03:40:17 +0000489 .name = "Am29LV040B",
hailfingere1e41ea2011-07-27 07:13:06 +0000490 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +0000491 .manufacture_id = AMD_ID,
mhmd3c80cd2010-09-15 23:31:03 +0000492 .model_id = AMD_AM29LV040B,
hailfinger286829b2009-01-08 03:40:17 +0000493 .total_size = 512,
494 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +0000495 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
hailfingerd217d122010-10-08 18:52:29 +0000496 .tested = TEST_OK_PRE,
snelsonc6855342010-01-28 23:55:12 +0000497 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +0000498 .probe_timing = TIMING_ZERO,
hailfingerc43afc92009-12-22 22:15:33 +0000499 .block_erasers =
500 {
501 {
502 .eraseblocks = { {64 * 1024, 8} },
snelsonc6855342010-01-28 23:55:12 +0000503 .block_erase = erase_sector_jedec,
hailfingerc43afc92009-12-22 22:15:33 +0000504 }, {
505 .eraseblocks = { {512 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +0000506 .block_erase = erase_chip_block_jedec,
hailfingerc43afc92009-12-22 22:15:33 +0000507 },
508 },
snelsonc6855342010-01-28 23:55:12 +0000509 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +0000510 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +0000511 .voltage = {3000, 3600}, /* 3.0-3.6V for type -60R, others 2.7-3.6V*/
stepanaa1b6a22008-12-08 18:15:10 +0000512 },
513
hailfinger286829b2009-01-08 03:40:17 +0000514 {
stuged9f66152009-01-25 23:55:12 +0000515 .vendor = "AMD",
516 .name = "Am29LV081B",
hailfingere1e41ea2011-07-27 07:13:06 +0000517 .bustype = BUS_PARALLEL,
hailfingeradd36042009-06-02 00:38:14 +0000518 .manufacture_id = AMD_ID,
mhmd3c80cd2010-09-15 23:31:03 +0000519 .model_id = AMD_AM29LV080B,
stuged9f66152009-01-25 23:55:12 +0000520 .total_size = 1024,
521 .page_size = 64 * 1024,
hailfinger8ddaff32010-12-04 03:26:40 +0000522 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, /* datasheet specifies address as don't care */
stuged9f66152009-01-25 23:55:12 +0000523 .tested = TEST_UNTESTED,
snelsonc6855342010-01-28 23:55:12 +0000524 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +0000525 .probe_timing = TIMING_ZERO,
hailfingerc43afc92009-12-22 22:15:33 +0000526 .block_erasers =
527 {
528 {
529 .eraseblocks = { {64 * 1024, 16} },
snelsonc6855342010-01-28 23:55:12 +0000530 .block_erase = erase_sector_jedec,
hailfingerc43afc92009-12-22 22:15:33 +0000531 }, {
532 .eraseblocks = { {1024 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +0000533 .block_erase = erase_chip_block_jedec,
hailfingerc43afc92009-12-22 22:15:33 +0000534 },
535 },
snelsonc6855342010-01-28 23:55:12 +0000536 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +0000537 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +0000538 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70R, others 2.7-3.6V */
stuged9f66152009-01-25 23:55:12 +0000539 },
540
541 {
hailfinger61958912010-07-28 22:20:20 +0000542 .vendor = "AMIC",
543 .name = "A25L05PT",
hailfingere1e41ea2011-07-27 07:13:06 +0000544 .bustype = BUS_SPI,
hailfinger61958912010-07-28 22:20:20 +0000545 .manufacture_id = AMIC_ID,
546 .model_id = AMIC_A25L05PT,
547 .total_size = 64,
548 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -0800549 .feature_bits = FEATURE_UNBOUND_READ,
hailfinger61958912010-07-28 22:20:20 +0000550 .tested = TEST_UNTESTED,
551 .probe = probe_spi_rdid4,
552 .probe_timing = TIMING_ZERO,
553 .block_erasers =
554 {
555 {
556 .eraseblocks = {
557 {32 * 1024, 1},
558 {16 * 1024, 1},
559 {8 * 1024, 1},
560 {4 * 1024, 2},
561 },
562 .block_erase = spi_block_erase_d8,
563 }, {
564 .eraseblocks = { {64 * 1024, 1} },
565 .block_erase = spi_block_erase_c7,
566 }
567 },
hailfinger7533bc82011-05-19 00:06:06 +0000568 .printlock = spi_prettyprint_status_register_amic_a25l05p,
hailfinger61958912010-07-28 22:20:20 +0000569 .unlock = spi_disable_blockprotect,
570 .write = spi_chip_write_256,
571 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +0000572 .voltage = {2700, 3600},
hailfinger61958912010-07-28 22:20:20 +0000573 },
574
575 {
576 .vendor = "AMIC",
577 .name = "A25L05PU",
hailfingere1e41ea2011-07-27 07:13:06 +0000578 .bustype = BUS_SPI,
hailfinger61958912010-07-28 22:20:20 +0000579 .manufacture_id = AMIC_ID,
580 .model_id = AMIC_A25L05PU,
581 .total_size = 64,
582 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -0800583 .feature_bits = FEATURE_UNBOUND_READ,
hailfinger61958912010-07-28 22:20:20 +0000584 .tested = TEST_UNTESTED,
585 .probe = probe_spi_rdid4,
586 .probe_timing = TIMING_ZERO,
587 .block_erasers =
588 {
589 {
590 .eraseblocks = {
591 {4 * 1024, 2},
592 {8 * 1024, 1},
593 {16 * 1024, 1},
594 {32 * 1024, 1},
595 },
596 .block_erase = spi_block_erase_d8,
597 }, {
598 .eraseblocks = { {64 * 1024, 1} },
599 .block_erase = spi_block_erase_c7,
600 }
601 },
hailfinger7533bc82011-05-19 00:06:06 +0000602 .printlock = spi_prettyprint_status_register_amic_a25l05p,
hailfinger61958912010-07-28 22:20:20 +0000603 .unlock = spi_disable_blockprotect,
604 .write = spi_chip_write_256,
605 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +0000606 .voltage = {2700, 3600},
hailfinger61958912010-07-28 22:20:20 +0000607 },
608
609 {
610 .vendor = "AMIC",
611 .name = "A25L10PT",
hailfingere1e41ea2011-07-27 07:13:06 +0000612 .bustype = BUS_SPI,
hailfinger61958912010-07-28 22:20:20 +0000613 .manufacture_id = AMIC_ID,
614 .model_id = AMIC_A25L10PT,
615 .total_size = 128,
616 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -0800617 .feature_bits = FEATURE_UNBOUND_READ,
hailfinger61958912010-07-28 22:20:20 +0000618 .tested = TEST_UNTESTED,
619 .probe = probe_spi_rdid4,
620 .probe_timing = TIMING_ZERO,
621 .block_erasers =
622 {
623 {
624 .eraseblocks = {
625 {64 * 1024, 1},
626 {32 * 1024, 1},
627 {16 * 1024, 1},
628 {8 * 1024, 1},
629 {4 * 1024, 2},
630 },
631 .block_erase = spi_block_erase_d8,
632 }, {
633 .eraseblocks = { {128 * 1024, 1} },
634 .block_erase = spi_block_erase_c7,
635 }
636 },
hailfinger7533bc82011-05-19 00:06:06 +0000637 .printlock = spi_prettyprint_status_register_amic_a25l05p,
hailfinger61958912010-07-28 22:20:20 +0000638 .unlock = spi_disable_blockprotect,
639 .write = spi_chip_write_256,
640 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +0000641 .voltage = {2700, 3600},
hailfinger61958912010-07-28 22:20:20 +0000642 },
643
644 {
645 .vendor = "AMIC",
646 .name = "A25L10PU",
hailfingere1e41ea2011-07-27 07:13:06 +0000647 .bustype = BUS_SPI,
hailfinger61958912010-07-28 22:20:20 +0000648 .manufacture_id = AMIC_ID,
649 .model_id = AMIC_A25L10PU,
650 .total_size = 128,
651 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -0800652 .feature_bits = FEATURE_UNBOUND_READ,
hailfinger61958912010-07-28 22:20:20 +0000653 .tested = TEST_UNTESTED,
654 .probe = probe_spi_rdid4,
655 .probe_timing = TIMING_ZERO,
656 .block_erasers =
657 {
658 {
659 .eraseblocks = {
660 {4 * 1024, 2},
661 {8 * 1024, 1},
662 {16 * 1024, 1},
663 {32 * 1024, 1},
664 {64 * 1024, 1},
665 },
666 .block_erase = spi_block_erase_d8,
667 }, {
668 .eraseblocks = { {128 * 1024, 1} },
669 .block_erase = spi_block_erase_c7,
670 }
671 },
hailfinger7533bc82011-05-19 00:06:06 +0000672 .printlock = spi_prettyprint_status_register_amic_a25l05p,
hailfinger61958912010-07-28 22:20:20 +0000673 .unlock = spi_disable_blockprotect,
674 .write = spi_chip_write_256,
675 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +0000676 .voltage = {2700, 3600},
hailfinger61958912010-07-28 22:20:20 +0000677 },
678
679 {
680 .vendor = "AMIC",
681 .name = "A25L20PT",
hailfingere1e41ea2011-07-27 07:13:06 +0000682 .bustype = BUS_SPI,
hailfinger61958912010-07-28 22:20:20 +0000683 .manufacture_id = AMIC_ID,
684 .model_id = AMIC_A25L20PT,
685 .total_size = 256,
686 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -0800687 .feature_bits = FEATURE_UNBOUND_READ,
hailfinger61958912010-07-28 22:20:20 +0000688 .tested = TEST_UNTESTED,
689 .probe = probe_spi_rdid4,
690 .probe_timing = TIMING_ZERO,
691 .block_erasers =
692 {
693 {
694 .eraseblocks = {
695 {64 * 1024, 3},
696 {32 * 1024, 1},
697 {16 * 1024, 1},
698 {8 * 1024, 1},
699 {4 * 1024, 2},
700 },
701 .block_erase = spi_block_erase_d8,
702 }, {
703 .eraseblocks = { {256 * 1024, 1} },
704 .block_erase = spi_block_erase_c7,
705 }
706 },
hailfinger7533bc82011-05-19 00:06:06 +0000707 .printlock = spi_prettyprint_status_register_amic_a25l05p,
hailfinger61958912010-07-28 22:20:20 +0000708 .unlock = spi_disable_blockprotect,
709 .write = spi_chip_write_256,
710 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +0000711 .voltage = {2700, 3600},
hailfinger61958912010-07-28 22:20:20 +0000712 },
713
714 {
715 .vendor = "AMIC",
716 .name = "A25L20PU",
hailfingere1e41ea2011-07-27 07:13:06 +0000717 .bustype = BUS_SPI,
hailfinger61958912010-07-28 22:20:20 +0000718 .manufacture_id = AMIC_ID,
719 .model_id = AMIC_A25L20PU,
720 .total_size = 256,
721 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -0800722 .feature_bits = FEATURE_UNBOUND_READ,
hailfinger61958912010-07-28 22:20:20 +0000723 .tested = TEST_UNTESTED,
724 .probe = probe_spi_rdid4,
725 .probe_timing = TIMING_ZERO,
726 .block_erasers =
727 {
728 {
729 .eraseblocks = {
730 {4 * 1024, 2},
731 {8 * 1024, 1},
732 {16 * 1024, 1},
733 {32 * 1024, 1},
734 {64 * 1024, 3},
735 },
736 .block_erase = spi_block_erase_d8,
737 }, {
738 .eraseblocks = { {256 * 1024, 1} },
739 .block_erase = spi_block_erase_c7,
740 }
741 },
hailfinger7533bc82011-05-19 00:06:06 +0000742 .printlock = spi_prettyprint_status_register_amic_a25l05p,
hailfinger61958912010-07-28 22:20:20 +0000743 .unlock = spi_disable_blockprotect,
744 .write = spi_chip_write_256,
745 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +0000746 .voltage = {2700, 3600},
hailfinger61958912010-07-28 22:20:20 +0000747 },
748
749 /* The A25L40P{T,U} chips are distinguished by their
750 * erase block layouts, but without any distinction in RDID.
751 * This inexplicable quirk was verified by Rudolf Marek
752 * and discussed on the flashrom mailing list on 2010-07-12.
753 */
754 {
755 .vendor = "AMIC",
756 .name = "A25L40PT",
hailfingere1e41ea2011-07-27 07:13:06 +0000757 .bustype = BUS_SPI,
hailfinger61958912010-07-28 22:20:20 +0000758 .manufacture_id = AMIC_ID,
759 .model_id = AMIC_A25L40PT,
760 .total_size = 512,
761 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -0800762 .feature_bits = FEATURE_UNBOUND_READ,
763 .tested = TEST_OK_PRU,
hailfinger61958912010-07-28 22:20:20 +0000764 .probe = probe_spi_rdid4,
765 .probe_timing = TIMING_ZERO,
766 .block_erasers =
767 {
768 {
769 .eraseblocks = {
770 {64 * 1024, 7},
771 {32 * 1024, 1},
772 {16 * 1024, 1},
773 {8 * 1024, 1},
774 {4 * 1024, 2},
775 },
776 .block_erase = spi_block_erase_d8,
777 }, {
778 .eraseblocks = { {512 * 1024, 1} },
779 .block_erase = spi_block_erase_c7,
780 }
781 },
hailfinger7533bc82011-05-19 00:06:06 +0000782 .printlock = spi_prettyprint_status_register_amic_a25l40p,
hailfinger61958912010-07-28 22:20:20 +0000783 .unlock = spi_disable_blockprotect,
784 .write = spi_chip_write_256,
785 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +0000786 .voltage = {2700, 3600},
hailfinger61958912010-07-28 22:20:20 +0000787 },
788
789 {
790 .vendor = "AMIC",
791 .name = "A25L40PU",
hailfingere1e41ea2011-07-27 07:13:06 +0000792 .bustype = BUS_SPI,
hailfinger61958912010-07-28 22:20:20 +0000793 .manufacture_id = AMIC_ID,
794 .model_id = AMIC_A25L40PU,
795 .total_size = 512,
796 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -0800797 .feature_bits = FEATURE_UNBOUND_READ,
798 .tested = TEST_OK_PRU,
hailfinger61958912010-07-28 22:20:20 +0000799 .probe = probe_spi_rdid4,
800 .probe_timing = TIMING_ZERO,
801 .block_erasers =
802 {
803 {
804 .eraseblocks = {
805 {4 * 1024, 2},
806 {8 * 1024, 1},
807 {16 * 1024, 1},
808 {32 * 1024, 1},
809 {64 * 1024, 7},
810 },
811 .block_erase = spi_block_erase_d8,
812 }, {
813 .eraseblocks = { {512 * 1024, 1} },
814 .block_erase = spi_block_erase_c7,
815 }
816 },
hailfinger7533bc82011-05-19 00:06:06 +0000817 .printlock = spi_prettyprint_status_register_amic_a25l40p,
hailfinger61958912010-07-28 22:20:20 +0000818 .unlock = spi_disable_blockprotect,
819 .write = spi_chip_write_256,
820 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +0000821 .voltage = {2700, 3600},
hailfinger61958912010-07-28 22:20:20 +0000822 },
823
824 {
825 .vendor = "AMIC",
826 .name = "A25L80P",
hailfingere1e41ea2011-07-27 07:13:06 +0000827 .bustype = BUS_SPI,
hailfinger61958912010-07-28 22:20:20 +0000828 .manufacture_id = AMIC_ID,
829 .model_id = AMIC_A25L80P,
830 .total_size = 1024,
831 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -0800832 .feature_bits = FEATURE_UNBOUND_READ,
833 .tested = TEST_OK_PREU,
hailfinger61958912010-07-28 22:20:20 +0000834 .probe = probe_spi_rdid4,
835 .probe_timing = TIMING_ZERO,
836 .block_erasers =
837 {
838 {
839 .eraseblocks = {
840 {4 * 1024, 2},
841 {8 * 1024, 1},
842 {16 * 1024, 1},
843 {32 * 1024, 1},
844 {64 * 1024, 15},
845 },
846 .block_erase = spi_block_erase_d8,
847 }, {
848 .eraseblocks = { {1024 * 1024, 1} },
849 .block_erase = spi_block_erase_c7,
850 }
851 },
hailfinger7533bc82011-05-19 00:06:06 +0000852 .printlock = spi_prettyprint_status_register_amic_a25l40p,
hailfinger61958912010-07-28 22:20:20 +0000853 .unlock = spi_disable_blockprotect,
854 .write = spi_chip_write_256,
855 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +0000856 .voltage = {2700, 3600},
hailfinger61958912010-07-28 22:20:20 +0000857 },
858
859 {
860 .vendor = "AMIC",
861 .name = "A25L16PT",
hailfingere1e41ea2011-07-27 07:13:06 +0000862 .bustype = BUS_SPI,
hailfinger61958912010-07-28 22:20:20 +0000863 .manufacture_id = AMIC_ID,
864 .model_id = AMIC_A25L16PT,
865 .total_size = 2048,
866 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -0800867 .feature_bits = FEATURE_UNBOUND_READ,
hailfinger61958912010-07-28 22:20:20 +0000868 .tested = TEST_UNTESTED,
869 .probe = probe_spi_rdid4,
870 .probe_timing = TIMING_ZERO,
871 .block_erasers =
872 {
873 {
874 .eraseblocks = {
875 {64 * 1024, 31},
876 {32 * 1024, 1},
877 {16 * 1024, 1},
878 {8 * 1024, 1},
879 {4 * 1024, 2},
880 },
881 .block_erase = spi_block_erase_d8,
882 }, {
883 .eraseblocks = { {2048 * 1024, 1} },
884 .block_erase = spi_block_erase_60,
885 }, {
886 .eraseblocks = { {2048 * 1024, 1} },
887 .block_erase = spi_block_erase_c7,
888 }
889 },
hailfinger7533bc82011-05-19 00:06:06 +0000890 .printlock = spi_prettyprint_status_register_amic_a25l40p,
hailfinger61958912010-07-28 22:20:20 +0000891 .unlock = spi_disable_blockprotect,
892 .write = spi_chip_write_256,
893 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +0000894 .voltage = {2700, 3600},
hailfinger61958912010-07-28 22:20:20 +0000895 },
896
897 {
898 .vendor = "AMIC",
899 .name = "A25L16PU",
hailfingere1e41ea2011-07-27 07:13:06 +0000900 .bustype = BUS_SPI,
hailfinger61958912010-07-28 22:20:20 +0000901 .manufacture_id = AMIC_ID,
902 .model_id = AMIC_A25L16PU,
903 .total_size = 2048,
904 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -0800905 .feature_bits = FEATURE_UNBOUND_READ,
906 .tested = TEST_OK_PRU,
hailfinger61958912010-07-28 22:20:20 +0000907 .probe = probe_spi_rdid4,
908 .probe_timing = TIMING_ZERO,
909 .block_erasers =
910 {
911 {
912 .eraseblocks = {
913 {4 * 1024, 2},
914 {8 * 1024, 1},
915 {16 * 1024, 1},
916 {32 * 1024, 1},
917 {64 * 1024, 31},
918 },
919 .block_erase = spi_block_erase_d8,
920 }, {
921 .eraseblocks = { {2048 * 1024, 1} },
922 .block_erase = spi_block_erase_60,
923 }, {
924 .eraseblocks = { {2048 * 1024, 1} },
925 .block_erase = spi_block_erase_c7,
926 }
927 },
hailfinger7533bc82011-05-19 00:06:06 +0000928 .printlock = spi_prettyprint_status_register_amic_a25l40p,
hailfinger61958912010-07-28 22:20:20 +0000929 .unlock = spi_disable_blockprotect,
930 .write = spi_chip_write_256,
931 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +0000932 .voltage = {2700, 3600},
hailfinger61958912010-07-28 22:20:20 +0000933 },
934
935 {
936 .vendor = "AMIC",
hailfinger6eb433a2010-07-29 15:00:40 +0000937 .name = "A25L512",
hailfingere1e41ea2011-07-27 07:13:06 +0000938 .bustype = BUS_SPI,
hailfinger6eb433a2010-07-29 15:00:40 +0000939 .manufacture_id = AMIC_ID_NOPREFIX,
940 .model_id = AMIC_A25L512,
941 .total_size = 64,
942 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -0800943 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
hailfinger6eb433a2010-07-29 15:00:40 +0000944 .tested = TEST_UNTESTED,
945 .probe = probe_spi_rdid,
946 .probe_timing = TIMING_ZERO,
947 .block_erasers =
948 {
949 {
950 .eraseblocks = { { 4 * 1024, 16 } },
951 .block_erase = spi_block_erase_20,
952 }, {
953 .eraseblocks = { { 64 * 1024, 1 } },
954 .block_erase = spi_block_erase_d8,
955 }, {
956 .eraseblocks = { { 64 * 1024, 1 } },
957 .block_erase = spi_block_erase_c7,
Simon Glass8dc82732013-07-16 10:13:51 -0600958 }
hailfinger6eb433a2010-07-29 15:00:40 +0000959 },
hailfinger7533bc82011-05-19 00:06:06 +0000960 .printlock = spi_prettyprint_status_register_amic_a25l40p,
hailfinger6eb433a2010-07-29 15:00:40 +0000961 .unlock = spi_disable_blockprotect,
962 .write = spi_chip_write_256,
963 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +0000964 .voltage = {2700, 3600},
hailfinger6eb433a2010-07-29 15:00:40 +0000965 },
966
967 {
968 .vendor = "AMIC",
969 .name = "A25L010",
hailfingere1e41ea2011-07-27 07:13:06 +0000970 .bustype = BUS_SPI,
hailfinger6eb433a2010-07-29 15:00:40 +0000971 .manufacture_id = AMIC_ID_NOPREFIX,
972 .model_id = AMIC_A25L010,
973 .total_size = 128,
974 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -0800975 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
hailfinger6eb433a2010-07-29 15:00:40 +0000976 .tested = TEST_UNTESTED,
977 .probe = probe_spi_rdid,
978 .probe_timing = TIMING_ZERO,
979 .block_erasers =
980 {
981 {
982 .eraseblocks = { { 4 * 1024, 32 } },
983 .block_erase = spi_block_erase_20,
984 }, {
985 .eraseblocks = { { 64 * 1024, 2 } },
986 .block_erase = spi_block_erase_d8,
987 }, {
988 .eraseblocks = { { 128 * 1024, 1 } },
989 .block_erase = spi_block_erase_c7,
Simon Glass8dc82732013-07-16 10:13:51 -0600990 }
hailfinger6eb433a2010-07-29 15:00:40 +0000991 },
hailfinger7533bc82011-05-19 00:06:06 +0000992 .printlock = spi_prettyprint_status_register_amic_a25l40p,
hailfinger6eb433a2010-07-29 15:00:40 +0000993 .unlock = spi_disable_blockprotect,
994 .write = spi_chip_write_256,
995 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +0000996 .voltage = {2700, 3600},
hailfinger6eb433a2010-07-29 15:00:40 +0000997 },
998
999 {
1000 .vendor = "AMIC",
1001 .name = "A25L020",
hailfingere1e41ea2011-07-27 07:13:06 +00001002 .bustype = BUS_SPI,
hailfinger6eb433a2010-07-29 15:00:40 +00001003 .manufacture_id = AMIC_ID_NOPREFIX,
1004 .model_id = AMIC_A25L020,
1005 .total_size = 256,
1006 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08001007 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
hailfinger6eb433a2010-07-29 15:00:40 +00001008 .tested = TEST_UNTESTED,
1009 .probe = probe_spi_rdid,
1010 .probe_timing = TIMING_ZERO,
1011 .block_erasers =
1012 {
1013 {
1014 .eraseblocks = { { 4 * 1024, 64 } },
1015 .block_erase = spi_block_erase_20,
1016 }, {
1017 .eraseblocks = { { 64 * 1024, 4 } },
1018 .block_erase = spi_block_erase_d8,
1019 }, {
1020 .eraseblocks = { { 256 * 1024, 1 } },
1021 .block_erase = spi_block_erase_c7,
Simon Glass8dc82732013-07-16 10:13:51 -06001022 }
hailfinger6eb433a2010-07-29 15:00:40 +00001023 },
hailfinger7533bc82011-05-19 00:06:06 +00001024 .printlock = spi_prettyprint_status_register_amic_a25l40p,
hailfinger6eb433a2010-07-29 15:00:40 +00001025 .unlock = spi_disable_blockprotect,
1026 .write = spi_chip_write_256,
1027 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001028 .voltage = {2700, 3600},
hailfinger6eb433a2010-07-29 15:00:40 +00001029 },
1030
1031 {
1032 .vendor = "AMIC",
1033 .name = "A25L040",
hailfingere1e41ea2011-07-27 07:13:06 +00001034 .bustype = BUS_SPI,
hailfinger6eb433a2010-07-29 15:00:40 +00001035 .manufacture_id = AMIC_ID_NOPREFIX,
1036 .model_id = AMIC_A25L040,
1037 .total_size = 512,
1038 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08001039 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
hailfinger6eb433a2010-07-29 15:00:40 +00001040 .tested = TEST_UNTESTED,
1041 .probe = probe_spi_rdid,
1042 .probe_timing = TIMING_ZERO,
1043 .block_erasers =
1044 {
1045 {
1046 .eraseblocks = { { 4 * 1024, 128 } },
1047 .block_erase = spi_block_erase_20,
1048 }, {
1049 .eraseblocks = { { 64 * 1024, 8 } },
1050 .block_erase = spi_block_erase_d8,
1051 }, {
1052 .eraseblocks = { { 512 * 1024, 1 } },
1053 .block_erase = spi_block_erase_c7,
Simon Glass8dc82732013-07-16 10:13:51 -06001054 }
hailfinger6eb433a2010-07-29 15:00:40 +00001055 },
hailfinger7533bc82011-05-19 00:06:06 +00001056 .printlock = spi_prettyprint_status_register_amic_a25l40p,
hailfinger6eb433a2010-07-29 15:00:40 +00001057 .unlock = spi_disable_blockprotect,
1058 .write = spi_chip_write_256,
1059 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001060 .voltage = {2700, 3600},
Louis Yung-Chieh Loc8ec7152012-09-17 17:38:35 +08001061 .wp = &wp_w25,
hailfinger6eb433a2010-07-29 15:00:40 +00001062 },
1063
1064 {
1065 .vendor = "AMIC",
1066 .name = "A25L080",
hailfingere1e41ea2011-07-27 07:13:06 +00001067 .bustype = BUS_SPI,
hailfinger6eb433a2010-07-29 15:00:40 +00001068 .manufacture_id = AMIC_ID_NOPREFIX,
1069 .model_id = AMIC_A25L080,
1070 .total_size = 1024,
1071 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08001072 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
hailfinger6eb433a2010-07-29 15:00:40 +00001073 .tested = TEST_UNTESTED,
1074 .probe = probe_spi_rdid,
1075 .probe_timing = TIMING_ZERO,
1076 .block_erasers =
1077 {
1078 {
1079 .eraseblocks = { { 4 * 1024, 256 } },
1080 .block_erase = spi_block_erase_20,
1081 }, {
1082 .eraseblocks = { { 64 * 1024, 16 } },
1083 .block_erase = spi_block_erase_d8,
1084 }, {
1085 .eraseblocks = { { 1024 * 1024, 1 } },
1086 .block_erase = spi_block_erase_c7,
Simon Glass8dc82732013-07-16 10:13:51 -06001087 }
hailfinger6eb433a2010-07-29 15:00:40 +00001088 },
hailfinger7533bc82011-05-19 00:06:06 +00001089 .printlock = spi_prettyprint_status_register_amic_a25l40p,
hailfinger6eb433a2010-07-29 15:00:40 +00001090 .unlock = spi_disable_blockprotect,
1091 .write = spi_chip_write_256,
1092 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001093 .voltage = {2700, 3600},
hailfinger6eb433a2010-07-29 15:00:40 +00001094 },
1095
1096 {
1097 .vendor = "AMIC",
1098 .name = "A25L016",
hailfingere1e41ea2011-07-27 07:13:06 +00001099 .bustype = BUS_SPI,
hailfinger6eb433a2010-07-29 15:00:40 +00001100 .manufacture_id = AMIC_ID_NOPREFIX,
1101 .model_id = AMIC_A25L016,
1102 .total_size = 2048,
1103 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08001104 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
hailfinger6eb433a2010-07-29 15:00:40 +00001105 .tested = TEST_UNTESTED,
1106 .probe = probe_spi_rdid,
1107 .probe_timing = TIMING_ZERO,
1108 .block_erasers =
1109 {
1110 {
1111 .eraseblocks = { { 4 * 1024, 512 } },
1112 .block_erase = spi_block_erase_20,
1113 }, {
1114 .eraseblocks = { { 64 * 1024, 32 } },
1115 .block_erase = spi_block_erase_d8,
1116 }, {
1117 .eraseblocks = { { 2048 * 1024, 1 } },
1118 .block_erase = spi_block_erase_c7,
Simon Glass8dc82732013-07-16 10:13:51 -06001119 }
hailfinger6eb433a2010-07-29 15:00:40 +00001120 },
hailfinger7533bc82011-05-19 00:06:06 +00001121 .printlock = spi_prettyprint_status_register_amic_a25l40p,
hailfinger6eb433a2010-07-29 15:00:40 +00001122 .unlock = spi_disable_blockprotect,
1123 .write = spi_chip_write_256,
1124 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001125 .voltage = {2700, 3600},
hailfinger6eb433a2010-07-29 15:00:40 +00001126 },
1127
1128 {
1129 .vendor = "AMIC",
1130 .name = "A25L032",
hailfingere1e41ea2011-07-27 07:13:06 +00001131 .bustype = BUS_SPI,
hailfinger6eb433a2010-07-29 15:00:40 +00001132 .manufacture_id = AMIC_ID_NOPREFIX,
1133 .model_id = AMIC_A25L032,
1134 .total_size = 4096,
1135 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07001136 /* OTP: 64B total; read 0x4B, 0x48; write 0x42 */
1137 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
hailfinger6eb433a2010-07-29 15:00:40 +00001138 .tested = TEST_UNTESTED,
1139 .probe = probe_spi_rdid,
1140 .probe_timing = TIMING_ZERO,
1141 .block_erasers =
1142 {
1143 {
1144 .eraseblocks = { { 4 * 1024, 1024 } },
1145 .block_erase = spi_block_erase_20,
1146 }, {
1147 .eraseblocks = { { 64 * 1024, 64 } },
1148 .block_erase = spi_block_erase_52,
1149 }, {
1150 .eraseblocks = { { 64 * 1024, 64 } },
1151 .block_erase = spi_block_erase_d8,
1152 }, {
1153 .eraseblocks = { { 4096 * 1024, 1 } },
1154 .block_erase = spi_block_erase_60,
1155 }, {
1156 .eraseblocks = { { 4096 * 1024, 1 } },
1157 .block_erase = spi_block_erase_c7,
Simon Glass8dc82732013-07-16 10:13:51 -06001158 }
hailfinger6eb433a2010-07-29 15:00:40 +00001159 },
hailfinger7533bc82011-05-19 00:06:06 +00001160 .printlock = spi_prettyprint_status_register_amic_a25l032,
hailfinger6eb433a2010-07-29 15:00:40 +00001161 .unlock = NULL, /* Two status reg bytes (read with 0x35 and 0x05) */
1162 .write = spi_chip_write_256,
1163 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001164 .voltage = {2700, 3600},
hailfinger6eb433a2010-07-29 15:00:40 +00001165 },
1166
1167 {
1168 .vendor = "AMIC",
1169 .name = "A25LQ032",
hailfingere1e41ea2011-07-27 07:13:06 +00001170 .bustype = BUS_SPI,
hailfinger6eb433a2010-07-29 15:00:40 +00001171 .manufacture_id = AMIC_ID_NOPREFIX,
1172 .model_id = AMIC_A25LQ032,
1173 .total_size = 4096,
1174 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07001175 /* OTP: 64B total; read 0x4B, 0x48; write 0x42 */
1176 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
hailfinger6eb433a2010-07-29 15:00:40 +00001177 .tested = TEST_UNTESTED,
1178 .probe = probe_spi_rdid,
1179 .probe_timing = TIMING_ZERO,
1180 .block_erasers =
1181 {
1182 {
1183 .eraseblocks = { { 4 * 1024, 1024 } },
1184 .block_erase = spi_block_erase_20,
1185 }, {
1186 .eraseblocks = { { 64 * 1024, 64 } },
1187 .block_erase = spi_block_erase_52,
1188 }, {
1189 .eraseblocks = { { 64 * 1024, 64 } },
1190 .block_erase = spi_block_erase_d8,
1191 }, {
1192 .eraseblocks = { { 4096 * 1024, 1 } },
1193 .block_erase = spi_block_erase_60,
1194 }, {
1195 .eraseblocks = { { 4096 * 1024, 1 } },
1196 .block_erase = spi_block_erase_c7,
Simon Glass8dc82732013-07-16 10:13:51 -06001197 }
hailfinger6eb433a2010-07-29 15:00:40 +00001198 },
hailfinger7533bc82011-05-19 00:06:06 +00001199 .printlock = spi_prettyprint_status_register_amic_a25lq032,
hailfinger6eb433a2010-07-29 15:00:40 +00001200 .unlock = NULL, /* Two status reg bytes (read with 0x35 and 0x05) */
1201 .write = spi_chip_write_256,
1202 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001203 .voltage = {2700, 3600},
hailfinger6eb433a2010-07-29 15:00:40 +00001204 },
1205
1206 {
1207 .vendor = "AMIC",
hailfinger61958912010-07-28 22:20:20 +00001208 .name = "A29002B",
hailfingere1e41ea2011-07-27 07:13:06 +00001209 .bustype = BUS_PARALLEL,
hailfinger61958912010-07-28 22:20:20 +00001210 .manufacture_id = AMIC_ID_NOPREFIX,
1211 .model_id = AMIC_A29002B,
1212 .total_size = 256,
1213 .page_size = 64 * 1024,
1214 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
1215 .tested = TEST_UNTESTED,
1216 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +00001217 .probe_timing = TIMING_ZERO,
hailfinger61958912010-07-28 22:20:20 +00001218 .block_erasers =
1219 {
1220 {
Simon Glass8dc82732013-07-16 10:13:51 -06001221 .eraseblocks = {
hailfinger61958912010-07-28 22:20:20 +00001222 {16 * 1024, 1},
1223 {8 * 1024, 2},
1224 {32 * 1024, 1},
1225 {64 * 1024, 3},
1226 },
1227 .block_erase = erase_sector_jedec,
1228 }, {
1229 .eraseblocks = { {256 * 1024, 1} },
1230 .block_erase = erase_chip_block_jedec,
1231 },
1232 },
1233 .write = write_jedec_1,
1234 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00001235 .voltage = {4500, 5500},
hailfinger61958912010-07-28 22:20:20 +00001236 },
1237
1238 {
1239 .vendor = "AMIC",
1240 .name = "A29002T",
hailfingere1e41ea2011-07-27 07:13:06 +00001241 .bustype = BUS_PARALLEL,
hailfinger61958912010-07-28 22:20:20 +00001242 .manufacture_id = AMIC_ID_NOPREFIX,
1243 .model_id = AMIC_A29002T,
1244 .total_size = 256,
1245 .page_size = 64 * 1024,
1246 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
stefanct98d917c2011-10-21 12:33:07 +00001247 .tested = TEST_OK_PREW,
hailfinger61958912010-07-28 22:20:20 +00001248 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +00001249 .probe_timing = TIMING_ZERO,
hailfinger61958912010-07-28 22:20:20 +00001250 .block_erasers =
1251 {
1252 {
Simon Glass8dc82732013-07-16 10:13:51 -06001253 .eraseblocks = {
hailfinger61958912010-07-28 22:20:20 +00001254 {64 * 1024, 3},
1255 {32 * 1024, 1},
1256 {8 * 1024, 2},
1257 {16 * 1024, 1},
1258 },
1259 .block_erase = erase_sector_jedec,
1260 }, {
1261 .eraseblocks = { {256 * 1024, 1} },
1262 .block_erase = erase_chip_block_jedec,
1263 },
1264 },
1265 .write = write_jedec_1,
1266 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00001267 .voltage = {4500, 5500},
hailfinger61958912010-07-28 22:20:20 +00001268 },
1269
1270 {
1271 .vendor = "AMIC",
1272 .name = "A29040B",
hailfingere1e41ea2011-07-27 07:13:06 +00001273 .bustype = BUS_PARALLEL,
hailfinger61958912010-07-28 22:20:20 +00001274 .manufacture_id = AMIC_ID_NOPREFIX,
1275 .model_id = AMIC_A29040B,
1276 .total_size = 512,
1277 .page_size = 64 * 1024,
1278 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
1279 .tested = TEST_UNTESTED,
1280 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +00001281 .probe_timing = TIMING_ZERO,
hailfinger61958912010-07-28 22:20:20 +00001282 .block_erasers =
1283 {
1284 {
1285 .eraseblocks = { {64 * 1024, 8} },
1286 .block_erase = erase_sector_jedec,
1287 }, {
1288 .eraseblocks = { {512 * 1024, 1} },
1289 .block_erase = erase_chip_block_jedec,
1290 },
1291 },
1292 .write = write_jedec_1,
1293 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00001294 .voltage = {4500, 5500},
hailfinger61958912010-07-28 22:20:20 +00001295 },
1296
1297 {
1298 .vendor = "AMIC",
1299 .name = "A49LF040A",
hailfingere1e41ea2011-07-27 07:13:06 +00001300 .bustype = BUS_LPC,
hailfinger61958912010-07-28 22:20:20 +00001301 .manufacture_id = AMIC_ID_NOPREFIX,
1302 .model_id = AMIC_A49LF040A,
1303 .total_size = 512,
1304 .page_size = 64 * 1024,
1305 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Souvik Ghoshd64964a2016-06-13 17:51:25 -07001306 .tested = TEST_OK_PREW,
hailfinger61958912010-07-28 22:20:20 +00001307 .probe = probe_jedec,
1308 .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
1309 .block_erasers =
1310 {
1311 {
1312 .eraseblocks = { {64 * 1024, 8} },
1313 .block_erase = erase_block_jedec,
1314 }, {
1315 .eraseblocks = { {512 * 1024, 1} },
1316 .block_erase = erase_chip_block_jedec,
1317 }
1318 },
1319 .unlock = unlock_49fl00x,
1320 .write = write_jedec_1,
1321 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00001322 .voltage = {3000, 3600},
hailfinger61958912010-07-28 22:20:20 +00001323 },
1324
1325 {
hailfinger286829b2009-01-08 03:40:17 +00001326 .vendor = "Atmel",
Furquan Shaikhb4df8ef2017-01-05 15:05:35 -08001327 .name = "ATMEL_AT25SL128A",
1328 .bustype = BUS_SPI,
1329 .manufacture_id = ATMEL_ID,
1330 .model_id = ATMEL_AT25SL128A,
1331 .total_size = 16384,
1332 .page_size = 256,
1333 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
1334 .tested = TEST_OK_PREWU,
1335 .probe = probe_spi_rdid,
1336 .probe_timing = TIMING_ZERO,
1337 .block_erasers =
1338 {
1339 {
1340 .eraseblocks = { {4 * 1024, 4096} },
1341 .block_erase = spi_block_erase_20,
1342 }, {
1343 .eraseblocks = { {32 * 1024, 512} },
1344 .block_erase = spi_block_erase_52,
1345 }, {
1346 .eraseblocks = { {64 * 1024, 256} },
1347 .block_erase = spi_block_erase_d8,
1348 }, {
1349 .eraseblocks = { {16 * 1024 * 1024, 1} },
1350 .block_erase = spi_block_erase_60,
1351 }, {
1352 .eraseblocks = { {16 * 1024 * 1024, 1} },
1353 .block_erase = spi_block_erase_c7,
1354 }
1355 },
1356 .printlock = spi_prettyprint_status_register_at25df,
1357 .unlock = spi_disable_blockprotect_at25df,
1358 .write = spi_chip_write_256,
1359 .read = spi_chip_read,
1360 .voltage = {1700, 2000},
1361 .wp = &wp_w25q,
1362 },
1363
1364 {
1365 .vendor = "Atmel",
hailfinger286829b2009-01-08 03:40:17 +00001366 .name = "AT25DF021",
hailfingere1e41ea2011-07-27 07:13:06 +00001367 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001368 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001369 .model_id = ATMEL_AT25DF021,
hailfinger286829b2009-01-08 03:40:17 +00001370 .total_size = 256,
1371 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07001372 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1373 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
hailfinger286829b2009-01-08 03:40:17 +00001374 .tested = TEST_UNTESTED,
1375 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001376 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001377 .block_erasers =
1378 {
1379 {
1380 .eraseblocks = { {4 * 1024, 64} },
1381 .block_erase = spi_block_erase_20,
1382 }, {
1383 .eraseblocks = { {32 * 1024, 8} },
1384 .block_erase = spi_block_erase_52,
1385 }, {
1386 .eraseblocks = { {64 * 1024, 4} },
1387 .block_erase = spi_block_erase_d8,
1388 }, {
1389 .eraseblocks = { {256 * 1024, 1} },
1390 .block_erase = spi_block_erase_60,
1391 }, {
1392 .eraseblocks = { {256 * 1024, 1} },
1393 .block_erase = spi_block_erase_c7,
1394 }
1395 },
hailfingerc33d4732010-07-29 13:09:18 +00001396 .printlock = spi_prettyprint_status_register_at25df,
1397 .unlock = spi_disable_blockprotect_at25df,
hailfinger87c05482009-05-09 02:34:18 +00001398 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001399 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +00001400 .voltage = {2700, 3600}, /* 2.3-3.6V & 2.7-3.6V models available */
stepanaa1b6a22008-12-08 18:15:10 +00001401 },
1402
hailfinger286829b2009-01-08 03:40:17 +00001403 {
1404 .vendor = "Atmel",
1405 .name = "AT25DF041A",
hailfingere1e41ea2011-07-27 07:13:06 +00001406 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001407 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001408 .model_id = ATMEL_AT25DF041A,
hailfinger286829b2009-01-08 03:40:17 +00001409 .total_size = 512,
1410 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08001411 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00001412 .tested = TEST_UNTESTED,
1413 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001414 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001415 .block_erasers =
1416 {
1417 {
1418 .eraseblocks = { {4 * 1024, 128} },
1419 .block_erase = spi_block_erase_20,
1420 }, {
1421 .eraseblocks = { {32 * 1024, 16} },
1422 .block_erase = spi_block_erase_52,
1423 }, {
1424 .eraseblocks = { {64 * 1024, 8} },
1425 .block_erase = spi_block_erase_d8,
1426 }, {
1427 .eraseblocks = { {512 * 1024, 1} },
1428 .block_erase = spi_block_erase_60,
1429 }, {
1430 .eraseblocks = { {512 * 1024, 1} },
1431 .block_erase = spi_block_erase_c7,
1432 }
1433 },
hailfingerc33d4732010-07-29 13:09:18 +00001434 .printlock = spi_prettyprint_status_register_at25df,
1435 .unlock = spi_disable_blockprotect_at25df,
hailfinger87c05482009-05-09 02:34:18 +00001436 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001437 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +00001438 .voltage = {2700, 3600}, /* 2.3-3.6V & 2.7-3.6V models available */
stepanaa1b6a22008-12-08 18:15:10 +00001439 },
1440
hailfinger286829b2009-01-08 03:40:17 +00001441 {
1442 .vendor = "Atmel",
1443 .name = "AT25DF081",
hailfingere1e41ea2011-07-27 07:13:06 +00001444 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001445 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001446 .model_id = ATMEL_AT25DF081,
hailfinger286829b2009-01-08 03:40:17 +00001447 .total_size = 1024,
1448 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08001449 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00001450 .tested = TEST_UNTESTED,
1451 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001452 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001453 .block_erasers =
1454 {
1455 {
1456 .eraseblocks = { {4 * 1024, 256} },
1457 .block_erase = spi_block_erase_20,
1458 }, {
1459 .eraseblocks = { {32 * 1024, 32} },
1460 .block_erase = spi_block_erase_52,
1461 }, {
1462 .eraseblocks = { {64 * 1024, 16} },
1463 .block_erase = spi_block_erase_d8,
1464 }, {
1465 .eraseblocks = { {1024 * 1024, 1} },
1466 .block_erase = spi_block_erase_60,
1467 }, {
1468 .eraseblocks = { {1024 * 1024, 1} },
1469 .block_erase = spi_block_erase_c7,
1470 }
1471 },
hailfingerc33d4732010-07-29 13:09:18 +00001472 .printlock = spi_prettyprint_status_register_at25df,
1473 .unlock = spi_disable_blockprotect_at25df,
1474 .write = spi_chip_write_256,
1475 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001476 .voltage = {1600, 2000}, /* Datasheet says range is 1.65-1.95 V */
hailfingerc33d4732010-07-29 13:09:18 +00001477 },
1478
1479 {
1480 .vendor = "Atmel",
1481 .name = "AT25DF081A",
hailfingere1e41ea2011-07-27 07:13:06 +00001482 .bustype = BUS_SPI,
hailfingerc33d4732010-07-29 13:09:18 +00001483 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001484 .model_id = ATMEL_AT25DF081A,
hailfingerc33d4732010-07-29 13:09:18 +00001485 .total_size = 1024,
1486 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08001487 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
hailfingerc33d4732010-07-29 13:09:18 +00001488 .tested = TEST_UNTESTED,
1489 .probe = probe_spi_rdid,
1490 .probe_timing = TIMING_ZERO,
1491 .block_erasers =
1492 {
1493 {
1494 .eraseblocks = { {4 * 1024, 256} },
1495 .block_erase = spi_block_erase_20,
1496 }, {
1497 .eraseblocks = { {32 * 1024, 32} },
1498 .block_erase = spi_block_erase_52,
1499 }, {
1500 .eraseblocks = { {64 * 1024, 16} },
1501 .block_erase = spi_block_erase_d8,
1502 }, {
1503 .eraseblocks = { {1024 * 1024, 1} },
1504 .block_erase = spi_block_erase_60,
1505 }, {
1506 .eraseblocks = { {1024 * 1024, 1} },
1507 .block_erase = spi_block_erase_c7,
1508 }
1509 },
1510 .printlock = spi_prettyprint_status_register_at25df_sec,
1511 .unlock = spi_disable_blockprotect_at25df_sec,
hailfinger87c05482009-05-09 02:34:18 +00001512 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001513 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +00001514 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00001515 },
1516
hailfinger286829b2009-01-08 03:40:17 +00001517 {
1518 .vendor = "Atmel",
1519 .name = "AT25DF161",
hailfingere1e41ea2011-07-27 07:13:06 +00001520 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001521 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001522 .model_id = ATMEL_AT25DF161,
hailfinger286829b2009-01-08 03:40:17 +00001523 .total_size = 2048,
1524 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08001525 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00001526 .tested = TEST_UNTESTED,
1527 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001528 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001529 .block_erasers =
1530 {
1531 {
1532 .eraseblocks = { {4 * 1024, 512} },
1533 .block_erase = spi_block_erase_20,
1534 }, {
1535 .eraseblocks = { {32 * 1024, 64} },
1536 .block_erase = spi_block_erase_52,
1537 }, {
1538 .eraseblocks = { {64 * 1024, 32} },
1539 .block_erase = spi_block_erase_d8,
1540 }, {
1541 .eraseblocks = { {2 * 1024 * 1024, 1} },
1542 .block_erase = spi_block_erase_60,
1543 }, {
1544 .eraseblocks = { {2 * 1024 * 1024, 1} },
1545 .block_erase = spi_block_erase_c7,
1546 }
1547 },
hailfingerc33d4732010-07-29 13:09:18 +00001548 .printlock = spi_prettyprint_status_register_at25df_sec,
1549 .unlock = spi_disable_blockprotect_at25df_sec,
hailfinger87c05482009-05-09 02:34:18 +00001550 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001551 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001552 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00001553 },
1554
hailfinger286829b2009-01-08 03:40:17 +00001555 {
1556 .vendor = "Atmel",
1557 .name = "AT25DF321",
hailfingere1e41ea2011-07-27 07:13:06 +00001558 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001559 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001560 .model_id = ATMEL_AT25DF321,
hailfinger286829b2009-01-08 03:40:17 +00001561 .total_size = 4096,
1562 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08001563 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
1564 .tested = TEST_OK_PREU,
hailfinger286829b2009-01-08 03:40:17 +00001565 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001566 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001567 .block_erasers =
1568 {
1569 {
1570 .eraseblocks = { {4 * 1024, 1024} },
1571 .block_erase = spi_block_erase_20,
1572 }, {
1573 .eraseblocks = { {32 * 1024, 128} },
1574 .block_erase = spi_block_erase_52,
1575 }, {
1576 .eraseblocks = { {64 * 1024, 64} },
1577 .block_erase = spi_block_erase_d8,
1578 }, {
1579 .eraseblocks = { {4 * 1024 * 1024, 1} },
1580 .block_erase = spi_block_erase_60,
1581 }, {
1582 .eraseblocks = { {4 * 1024 * 1024, 1} },
1583 .block_erase = spi_block_erase_c7,
1584 }
1585 },
hailfingerc33d4732010-07-29 13:09:18 +00001586 .printlock = spi_prettyprint_status_register_at25df,
1587 .unlock = spi_disable_blockprotect_at25df,
hailfinger87c05482009-05-09 02:34:18 +00001588 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001589 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001590 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00001591 },
1592
hailfinger286829b2009-01-08 03:40:17 +00001593 {
1594 .vendor = "Atmel",
1595 .name = "AT25DF321A",
hailfingere1e41ea2011-07-27 07:13:06 +00001596 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001597 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001598 .model_id = ATMEL_AT25DF321A,
hailfinger286829b2009-01-08 03:40:17 +00001599 .total_size = 4096,
1600 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07001601 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1602 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
stefanctd6efe1a2011-09-03 11:22:27 +00001603 .tested = TEST_OK_PROBE,
hailfinger286829b2009-01-08 03:40:17 +00001604 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001605 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001606 .block_erasers =
1607 {
1608 {
1609 .eraseblocks = { {4 * 1024, 1024} },
1610 .block_erase = spi_block_erase_20,
1611 }, {
1612 .eraseblocks = { {32 * 1024, 128} },
1613 .block_erase = spi_block_erase_52,
1614 }, {
1615 .eraseblocks = { {64 * 1024, 64} },
1616 .block_erase = spi_block_erase_d8,
1617 }, {
1618 .eraseblocks = { {4 * 1024 * 1024, 1} },
1619 .block_erase = spi_block_erase_60,
1620 }, {
1621 .eraseblocks = { {4 * 1024 * 1024, 1} },
1622 .block_erase = spi_block_erase_c7,
1623 }
1624 },
hailfingerc33d4732010-07-29 13:09:18 +00001625 .printlock = spi_prettyprint_status_register_at25df_sec,
1626 .unlock = spi_disable_blockprotect_at25df_sec,
hailfinger87c05482009-05-09 02:34:18 +00001627 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001628 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001629 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00001630 },
1631
hailfinger286829b2009-01-08 03:40:17 +00001632 {
1633 .vendor = "Atmel",
Stefan Tauner718d1eb2016-08-18 18:00:53 -07001634 .name = "AT25DF641(A)",
hailfingere1e41ea2011-07-27 07:13:06 +00001635 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001636 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001637 .model_id = ATMEL_AT25DF641,
hailfinger286829b2009-01-08 03:40:17 +00001638 .total_size = 8192,
1639 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08001640 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00001641 .tested = TEST_UNTESTED,
1642 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001643 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001644 .block_erasers =
1645 {
1646 {
1647 .eraseblocks = { {4 * 1024, 2048} },
1648 .block_erase = spi_block_erase_20,
1649 }, {
1650 .eraseblocks = { {32 * 1024, 256} },
1651 .block_erase = spi_block_erase_52,
1652 }, {
1653 .eraseblocks = { {64 * 1024, 128} },
1654 .block_erase = spi_block_erase_d8,
1655 }, {
1656 .eraseblocks = { {8 * 1024 * 1024, 1} },
1657 .block_erase = spi_block_erase_60,
1658 }, {
1659 .eraseblocks = { {8 * 1024 * 1024, 1} },
1660 .block_erase = spi_block_erase_c7,
1661 }
1662 },
hailfingerc33d4732010-07-29 13:09:18 +00001663 .printlock = spi_prettyprint_status_register_at25df_sec,
1664 .unlock = spi_disable_blockprotect_at25df_sec,
1665 .write = spi_chip_write_256,
1666 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001667 .voltage = {2700, 3600},
hailfingerc33d4732010-07-29 13:09:18 +00001668 },
1669
1670 {
1671 .vendor = "Atmel",
1672 .name = "AT25DQ161",
hailfingere1e41ea2011-07-27 07:13:06 +00001673 .bustype = BUS_SPI,
hailfingerc33d4732010-07-29 13:09:18 +00001674 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001675 .model_id = ATMEL_AT25DQ161,
hailfingerc33d4732010-07-29 13:09:18 +00001676 .total_size = 2048,
1677 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07001678 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1679 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
hailfingerc33d4732010-07-29 13:09:18 +00001680 .tested = TEST_UNTESTED,
1681 .probe = probe_spi_rdid,
1682 .probe_timing = TIMING_ZERO,
1683 .block_erasers =
1684 {
1685 {
1686 .eraseblocks = { {4 * 1024, 512} },
1687 .block_erase = spi_block_erase_20,
1688 }, {
1689 .eraseblocks = { {32 * 1024, 64} },
1690 .block_erase = spi_block_erase_52,
1691 }, {
1692 .eraseblocks = { {64 * 1024, 32} },
1693 .block_erase = spi_block_erase_d8,
1694 }, {
1695 .eraseblocks = { {2 * 1024 * 1024, 1} },
1696 .block_erase = spi_block_erase_60,
1697 }, {
1698 .eraseblocks = { {2 * 1024 * 1024, 1} },
1699 .block_erase = spi_block_erase_c7,
1700 }
1701 },
1702 .printlock = spi_prettyprint_status_register_at25df_sec,
1703 .unlock = spi_disable_blockprotect_at25df_sec,
hailfinger87c05482009-05-09 02:34:18 +00001704 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001705 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001706 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00001707 },
1708
hailfinger286829b2009-01-08 03:40:17 +00001709 {
1710 .vendor = "Atmel",
1711 .name = "AT25F512B",
hailfingere1e41ea2011-07-27 07:13:06 +00001712 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001713 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001714 .model_id = ATMEL_AT25F512B,
hailfinger286829b2009-01-08 03:40:17 +00001715 .total_size = 64,
1716 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07001717 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1718 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
hailfinger286829b2009-01-08 03:40:17 +00001719 .tested = TEST_UNTESTED,
1720 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001721 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001722 .block_erasers =
1723 {
1724 {
1725 .eraseblocks = { {4 * 1024, 16} },
1726 .block_erase = spi_block_erase_20,
1727 }, {
1728 .eraseblocks = { {32 * 1024, 2} },
1729 .block_erase = spi_block_erase_52,
1730 }, {
1731 .eraseblocks = { {32 * 1024, 2} },
1732 .block_erase = spi_block_erase_d8,
1733 }, {
1734 .eraseblocks = { {64 * 1024, 1} },
1735 .block_erase = spi_block_erase_60,
1736 }, {
1737 .eraseblocks = { {64 * 1024, 1} },
1738 .block_erase = spi_block_erase_c7,
1739 }
1740 },
hailfingerc33d4732010-07-29 13:09:18 +00001741 .printlock = spi_prettyprint_status_register_at25f,
1742 .unlock = spi_disable_blockprotect_at25f,
hailfinger87c05482009-05-09 02:34:18 +00001743 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001744 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001745 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00001746 },
1747
hailfinger286829b2009-01-08 03:40:17 +00001748 {
1749 .vendor = "Atmel",
1750 .name = "AT25FS010",
hailfingere1e41ea2011-07-27 07:13:06 +00001751 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001752 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001753 .model_id = ATMEL_AT25FS010,
hailfinger286829b2009-01-08 03:40:17 +00001754 .total_size = 128,
1755 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08001756 .feature_bits = FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00001757 .tested = TEST_UNTESTED,
1758 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001759 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001760 .block_erasers =
1761 {
1762 {
1763 .eraseblocks = { {4 * 1024, 32} },
1764 .block_erase = spi_block_erase_20,
1765 }, {
hailfingerc33d4732010-07-29 13:09:18 +00001766 .eraseblocks = { {4 * 1024, 32} },
1767 .block_erase = spi_block_erase_d7,
1768 }, {
hailfinger22155a82009-12-23 12:02:55 +00001769 .eraseblocks = { {32 * 1024, 4} },
1770 .block_erase = spi_block_erase_52,
1771 }, {
1772 .eraseblocks = { {32 * 1024, 4} },
1773 .block_erase = spi_block_erase_d8,
1774 }, {
1775 .eraseblocks = { {128 * 1024, 1} },
1776 .block_erase = spi_block_erase_60,
1777 }, {
1778 .eraseblocks = { {128 * 1024, 1} },
1779 .block_erase = spi_block_erase_c7,
1780 }
1781 },
hailfingerc33d4732010-07-29 13:09:18 +00001782 .printlock = spi_prettyprint_status_register_at25fs010,
1783 .unlock = spi_disable_blockprotect_at25fs010,
hailfinger87c05482009-05-09 02:34:18 +00001784 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001785 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001786 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00001787 },
1788
hailfinger286829b2009-01-08 03:40:17 +00001789 {
1790 .vendor = "Atmel",
1791 .name = "AT25FS040",
hailfingere1e41ea2011-07-27 07:13:06 +00001792 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001793 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001794 .model_id = ATMEL_AT25FS040,
hailfinger286829b2009-01-08 03:40:17 +00001795 .total_size = 512,
1796 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08001797 .feature_bits = FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00001798 .tested = TEST_UNTESTED,
1799 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001800 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001801 .block_erasers =
1802 {
1803 {
1804 .eraseblocks = { {4 * 1024, 128} },
1805 .block_erase = spi_block_erase_20,
1806 }, {
1807 .eraseblocks = { {64 * 1024, 8} },
1808 .block_erase = spi_block_erase_52,
1809 }, {
1810 .eraseblocks = { {64 * 1024, 8} },
1811 .block_erase = spi_block_erase_d8,
1812 }, {
1813 .eraseblocks = { {512 * 1024, 1} },
1814 .block_erase = spi_block_erase_60,
1815 }, {
1816 .eraseblocks = { {512 * 1024, 1} },
1817 .block_erase = spi_block_erase_c7,
1818 }
1819 },
hailfingerc33d4732010-07-29 13:09:18 +00001820 .printlock = spi_prettyprint_status_register_at25fs040,
1821 .unlock = spi_disable_blockprotect_at25fs040,
hailfinger87c05482009-05-09 02:34:18 +00001822 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001823 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001824 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00001825 },
1826
hailfinger286829b2009-01-08 03:40:17 +00001827 {
1828 .vendor = "Atmel",
1829 .name = "AT26DF041",
hailfingere1e41ea2011-07-27 07:13:06 +00001830 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001831 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001832 .model_id = ATMEL_AT26DF041,
hailfinger286829b2009-01-08 03:40:17 +00001833 .total_size = 512,
1834 .page_size = 256,
1835 .tested = TEST_UNTESTED,
1836 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001837 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001838 .block_erasers =
1839 {
1840 {
1841 .eraseblocks = { {4 * 1024, 128} },
1842 .block_erase = spi_block_erase_20,
1843 }
1844 },
hailfinger286829b2009-01-08 03:40:17 +00001845 .write = NULL /* Incompatible Page write */,
1846 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +00001847 .voltage = {2700, 3600}, /* 3.0-3.6V for higher speed, 2.7-3.6V normal */
stepanaa1b6a22008-12-08 18:15:10 +00001848 },
1849
hailfinger286829b2009-01-08 03:40:17 +00001850 {
1851 .vendor = "Atmel",
1852 .name = "AT26DF081A",
hailfingere1e41ea2011-07-27 07:13:06 +00001853 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001854 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001855 .model_id = ATMEL_AT26DF081A,
hailfinger286829b2009-01-08 03:40:17 +00001856 .total_size = 1024,
1857 .page_size = 256,
krause9d38a2f2011-01-17 07:45:54 +00001858 .feature_bits = FEATURE_WRSR_WREN,
1859 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00001860 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001861 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001862 .block_erasers =
1863 {
1864 {
1865 .eraseblocks = { {4 * 1024, 256} },
1866 .block_erase = spi_block_erase_20,
1867 }, {
1868 .eraseblocks = { {32 * 1024, 32} },
1869 .block_erase = spi_block_erase_52,
1870 }, {
1871 .eraseblocks = { {64 * 1024, 16} },
1872 .block_erase = spi_block_erase_d8,
1873 }, {
1874 .eraseblocks = { {1024 * 1024, 1} },
1875 .block_erase = spi_block_erase_60,
1876 }, {
1877 .eraseblocks = { {1024 * 1024, 1} },
1878 .block_erase = spi_block_erase_c7,
1879 }
1880 },
Edward O'Callaghanb5dee7a2019-03-05 13:32:51 +11001881 .printlock = spi_prettyprint_status_register_at26df081a,
krause9d38a2f2011-01-17 07:45:54 +00001882 .unlock = spi_disable_blockprotect_at25df,
hailfinger87c05482009-05-09 02:34:18 +00001883 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001884 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001885 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00001886 },
1887
hailfinger286829b2009-01-08 03:40:17 +00001888 {
1889 .vendor = "Atmel",
1890 .name = "AT26DF161",
hailfingere1e41ea2011-07-27 07:13:06 +00001891 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001892 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001893 .model_id = ATMEL_AT26DF161,
hailfinger286829b2009-01-08 03:40:17 +00001894 .total_size = 2048,
1895 .page_size = 256,
1896 .tested = TEST_UNTESTED,
1897 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001898 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001899 .block_erasers =
1900 {
1901 {
1902 .eraseblocks = { {4 * 1024, 512} },
1903 .block_erase = spi_block_erase_20,
1904 }, {
1905 .eraseblocks = { {32 * 1024, 64} },
1906 .block_erase = spi_block_erase_52,
1907 }, {
1908 .eraseblocks = { {64 * 1024, 32} },
1909 .block_erase = spi_block_erase_d8,
1910 }, {
1911 .eraseblocks = { {2 * 1024 * 1024, 1} },
1912 .block_erase = spi_block_erase_60,
1913 }, {
1914 .eraseblocks = { {2 * 1024 * 1024, 1} },
1915 .block_erase = spi_block_erase_c7,
1916 }
1917 },
hailfinger7533bc82011-05-19 00:06:06 +00001918 .printlock = spi_prettyprint_status_register_at25df,
hailfingerb9560ee2010-07-14 20:21:22 +00001919 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00001920 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001921 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001922 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00001923 },
1924
hailfinger286829b2009-01-08 03:40:17 +00001925 {
1926 .vendor = "Atmel",
1927 .name = "AT26DF161A",
hailfingere1e41ea2011-07-27 07:13:06 +00001928 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001929 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001930 .model_id = ATMEL_AT26DF161A,
hailfinger286829b2009-01-08 03:40:17 +00001931 .total_size = 2048,
1932 .page_size = 256,
1933 .tested = TEST_UNTESTED,
1934 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001935 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001936 .block_erasers =
1937 {
1938 {
1939 .eraseblocks = { {4 * 1024, 512} },
1940 .block_erase = spi_block_erase_20,
1941 }, {
1942 .eraseblocks = { {32 * 1024, 64} },
1943 .block_erase = spi_block_erase_52,
1944 }, {
1945 .eraseblocks = { {64 * 1024, 32} },
1946 .block_erase = spi_block_erase_d8,
1947 }, {
1948 .eraseblocks = { {2 * 1024 * 1024, 1} },
1949 .block_erase = spi_block_erase_60,
1950 }, {
1951 .eraseblocks = { {2 * 1024 * 1024, 1} },
1952 .block_erase = spi_block_erase_c7,
1953 }
1954 },
Edward O'Callaghanb5dee7a2019-03-05 13:32:51 +11001955 .printlock = spi_prettyprint_status_register_at26df081a,
hailfingerb9560ee2010-07-14 20:21:22 +00001956 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00001957 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001958 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001959 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00001960 },
1961
1962 /*The AT26DF321 has the same ID as the AT25DF321. */
hailfinger286829b2009-01-08 03:40:17 +00001963 /*{
1964 .vendor = "Atmel",
1965 .name = "AT26DF321",
hailfingere1e41ea2011-07-27 07:13:06 +00001966 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001967 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001968 .model_id = ATMEL_AT26DF321,
hailfinger286829b2009-01-08 03:40:17 +00001969 .total_size = 4096,
1970 .page_size = 256,
1971 .tested = TEST_UNTESTED,
1972 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001973 .probe_timing = TIMING_ZERO,
Edward O'Callaghanb5dee7a2019-03-05 13:32:51 +11001974 .printlock = spi_prettyprint_status_register_at26df081a,
hailfingerb9560ee2010-07-14 20:21:22 +00001975 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00001976 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001977 .read = spi_chip_read,
1978 },*/
stepanaa1b6a22008-12-08 18:15:10 +00001979
hailfinger286829b2009-01-08 03:40:17 +00001980 {
1981 .vendor = "Atmel",
1982 .name = "AT26F004",
hailfingere1e41ea2011-07-27 07:13:06 +00001983 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001984 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001985 .model_id = ATMEL_AT26F004,
hailfinger286829b2009-01-08 03:40:17 +00001986 .total_size = 512,
1987 .page_size = 256,
1988 .tested = TEST_UNTESTED,
1989 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001990 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001991 .block_erasers =
1992 {
1993 {
1994 .eraseblocks = { {4 * 1024, 128} },
1995 .block_erase = spi_block_erase_20,
1996 }, {
1997 .eraseblocks = { {32 * 1024, 16} },
1998 .block_erase = spi_block_erase_52,
1999 }, {
2000 .eraseblocks = { {64 * 1024, 8} },
2001 .block_erase = spi_block_erase_d8,
2002 }, {
2003 .eraseblocks = { {512 * 1024, 1} },
2004 .block_erase = spi_block_erase_60,
2005 }, {
2006 .eraseblocks = { {512 * 1024, 1} },
2007 .block_erase = spi_block_erase_c7,
2008 }
2009 },
hailfinger286829b2009-01-08 03:40:17 +00002010 .write = NULL /* Incompatible Page write */,
2011 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00002012 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00002013 },
2014
hailfinger286829b2009-01-08 03:40:17 +00002015 {
2016 .vendor = "Atmel",
uwed75c4f52009-06-02 16:45:59 +00002017 .name = "AT29C512",
hailfingere1e41ea2011-07-27 07:13:06 +00002018 .bustype = BUS_PARALLEL,
uwed75c4f52009-06-02 16:45:59 +00002019 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002020 .model_id = ATMEL_AT29C512,
uwed75c4f52009-06-02 16:45:59 +00002021 .total_size = 64,
2022 .page_size = 128,
snelsonc6855342010-01-28 23:55:12 +00002023 .feature_bits = FEATURE_LONG_RESET,
Stefan Tauner718d1eb2016-08-18 18:00:53 -07002024 .tested = TEST_OK_PREW,
hailfingerafac00e2010-01-09 02:24:17 +00002025 .probe = probe_jedec,
hailfingerd5b35922009-06-03 14:46:22 +00002026 .probe_timing = 10000, /* 10mS, Enter=Exec */
hailfinger22155a82009-12-23 12:02:55 +00002027 .block_erasers =
2028 {
2029 {
2030 .eraseblocks = { {64 * 1024, 1} },
2031 .block_erase = erase_chip_block_jedec,
2032 }
2033 },
uwed75c4f52009-06-02 16:45:59 +00002034 .write = write_jedec,
2035 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00002036 .voltage = {4500, 5500},
uwed75c4f52009-06-02 16:45:59 +00002037 },
2038
2039 {
2040 .vendor = "Atmel",
uweb3a82ef2009-05-16 21:39:19 +00002041 .name = "AT29C010A",
hailfingere1e41ea2011-07-27 07:13:06 +00002042 .bustype = BUS_PARALLEL,
uweb3a82ef2009-05-16 21:39:19 +00002043 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002044 .model_id = ATMEL_AT29C010A,
uweb3a82ef2009-05-16 21:39:19 +00002045 .total_size = 128,
2046 .page_size = 128,
snelsonc6855342010-01-28 23:55:12 +00002047 .feature_bits = FEATURE_LONG_RESET,
hailfingerd217d122010-10-08 18:52:29 +00002048 .tested = TEST_OK_PRE,
uweb3a82ef2009-05-16 21:39:19 +00002049 .probe = probe_jedec,
hailfingerd5b35922009-06-03 14:46:22 +00002050 .probe_timing = 10000, /* 10mS, Enter=Exec */
hailfinger22155a82009-12-23 12:02:55 +00002051 .block_erasers =
2052 {
2053 {
2054 .eraseblocks = { {128 * 1024, 1} },
2055 .block_erase = erase_chip_block_jedec,
2056 }
2057 },
uweb3a82ef2009-05-16 21:39:19 +00002058 .write = write_jedec, /* FIXME */
2059 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00002060 .voltage = {4500, 5500},
uweb3a82ef2009-05-16 21:39:19 +00002061 },
2062
2063 {
2064 .vendor = "Atmel",
hailfinger286829b2009-01-08 03:40:17 +00002065 .name = "AT29C020",
hailfingere1e41ea2011-07-27 07:13:06 +00002066 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00002067 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002068 .model_id = ATMEL_AT29C020,
hailfinger286829b2009-01-08 03:40:17 +00002069 .total_size = 256,
2070 .page_size = 256,
snelsonc6855342010-01-28 23:55:12 +00002071 .feature_bits = FEATURE_LONG_RESET,
2072 .tested = TEST_UNTESTED,
hailfinger286829b2009-01-08 03:40:17 +00002073 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +00002074 .probe_timing = 10000, /* 10ms */
hailfinger22155a82009-12-23 12:02:55 +00002075 .block_erasers =
2076 {
2077 {
2078 .eraseblocks = { {256 * 1024, 1} },
2079 .block_erase = erase_chip_block_jedec,
2080 }
2081 },
hailfinger286829b2009-01-08 03:40:17 +00002082 .write = write_jedec,
hailfinger23060112009-05-08 12:49:03 +00002083 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00002084 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00002085 },
2086
hailfinger286829b2009-01-08 03:40:17 +00002087 {
2088 .vendor = "Atmel",
2089 .name = "AT29C040A",
hailfingere1e41ea2011-07-27 07:13:06 +00002090 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00002091 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002092 .model_id = ATMEL_AT29C040A,
hailfinger286829b2009-01-08 03:40:17 +00002093 .total_size = 512,
2094 .page_size = 256,
snelsonc6855342010-01-28 23:55:12 +00002095 .feature_bits = FEATURE_LONG_RESET,
hailfinger286829b2009-01-08 03:40:17 +00002096 .tested = TEST_UNTESTED,
2097 .probe = probe_jedec,
hailfingerf850e0a2009-06-12 21:29:36 +00002098 .probe_timing = 10000, /* 10 ms */
hailfinger22155a82009-12-23 12:02:55 +00002099 .block_erasers =
2100 {
2101 {
2102 .eraseblocks = { {512 * 1024, 1} },
2103 .block_erase = erase_chip_block_jedec,
2104 }
2105 },
hailfinger286829b2009-01-08 03:40:17 +00002106 .write = write_jedec,
hailfinger23060112009-05-08 12:49:03 +00002107 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00002108 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00002109 },
2110
hailfinger286829b2009-01-08 03:40:17 +00002111 {
2112 .vendor = "Atmel",
2113 .name = "AT45CS1282",
hailfingere1e41ea2011-07-27 07:13:06 +00002114 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002115 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002116 .model_id = ATMEL_AT45CS1282,
hailfingerf60abdb2009-03-19 12:18:13 +00002117 .total_size = 16896 /* No power of two sizes */,
2118 .page_size = 1056 /* No power of two sizes */,
Patrick Georgiac3423f2017-02-03 20:58:06 +01002119 .tested = { .probe = NT, .read = BAD, .erase = NT, .write = NT, .uread = NT },
hailfinger286829b2009-01-08 03:40:17 +00002120 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00002121 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +00002122 .write = NULL /* Incompatible Page write */,
2123 .read = NULL /* Incompatible read */,
stefanct7e00e222011-06-03 07:26:31 +00002124 .voltage = {2700, 3600},
hailfingerf60abdb2009-03-19 12:18:13 +00002125 },
stepanaa1b6a22008-12-08 18:15:10 +00002126
hailfinger286829b2009-01-08 03:40:17 +00002127 {
2128 .vendor = "Atmel",
2129 .name = "AT45DB011D",
hailfingere1e41ea2011-07-27 07:13:06 +00002130 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002131 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002132 .model_id = ATMEL_AT45DB011D,
hailfingerf60abdb2009-03-19 12:18:13 +00002133 .total_size = 128 /* Size can only be determined from status register */,
2134 .page_size = 256 /* Size can only be determined from status register */,
Patrick Georgiac3423f2017-02-03 20:58:06 +01002135 .tested = { .probe = NT, .read = BAD, .erase = NT, .write = NT, .uread = NT },
hailfinger286829b2009-01-08 03:40:17 +00002136 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00002137 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +00002138 .write = NULL,
2139 .read = NULL,
stefanct7e00e222011-06-03 07:26:31 +00002140 .voltage = {2700, 3600},
hailfingerf60abdb2009-03-19 12:18:13 +00002141 },
stepanaa1b6a22008-12-08 18:15:10 +00002142
hailfinger286829b2009-01-08 03:40:17 +00002143 {
2144 .vendor = "Atmel",
2145 .name = "AT45DB021D",
hailfingere1e41ea2011-07-27 07:13:06 +00002146 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002147 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002148 .model_id = ATMEL_AT45DB021D,
hailfingerf60abdb2009-03-19 12:18:13 +00002149 .total_size = 256 /* Size can only be determined from status register */,
2150 .page_size = 256 /* Size can only be determined from status register */,
Patrick Georgiac3423f2017-02-03 20:58:06 +01002151 .tested = { .probe = NT, .read = BAD, .erase = NT, .write = NT, .uread = NT },
hailfinger286829b2009-01-08 03:40:17 +00002152 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00002153 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +00002154 .write = NULL,
2155 .read = NULL,
stefanct7e00e222011-06-03 07:26:31 +00002156 .voltage = {2700, 3600},
hailfingerf60abdb2009-03-19 12:18:13 +00002157 },
stepanaa1b6a22008-12-08 18:15:10 +00002158
hailfinger286829b2009-01-08 03:40:17 +00002159 {
2160 .vendor = "Atmel",
2161 .name = "AT45DB041D",
hailfingere1e41ea2011-07-27 07:13:06 +00002162 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002163 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002164 .model_id = ATMEL_AT45DB041D,
hailfingerf60abdb2009-03-19 12:18:13 +00002165 .total_size = 512 /* Size can only be determined from status register */,
2166 .page_size = 256 /* Size can only be determined from status register */,
Patrick Georgiac3423f2017-02-03 20:58:06 +01002167 .tested = { .probe = NT, .read = BAD, .erase = NT, .write = NT, .uread = NT },
hailfinger286829b2009-01-08 03:40:17 +00002168 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00002169 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +00002170 .write = NULL,
2171 .read = NULL,
stefanct66c8c1b2011-07-19 08:50:18 +00002172 .voltage = {2500, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
hailfingerf60abdb2009-03-19 12:18:13 +00002173 },
stepanaa1b6a22008-12-08 18:15:10 +00002174
hailfinger286829b2009-01-08 03:40:17 +00002175 {
2176 .vendor = "Atmel",
2177 .name = "AT45DB081D",
hailfingere1e41ea2011-07-27 07:13:06 +00002178 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002179 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002180 .model_id = ATMEL_AT45DB081D,
hailfingerf60abdb2009-03-19 12:18:13 +00002181 .total_size = 1024 /* Size can only be determined from status register */,
2182 .page_size = 256 /* Size can only be determined from status register */,
Patrick Georgiac3423f2017-02-03 20:58:06 +01002183 .tested = { .probe = NT, .read = BAD, .erase = NT, .write = NT, .uread = NT },
hailfinger286829b2009-01-08 03:40:17 +00002184 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00002185 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +00002186 .write = NULL,
2187 .read = NULL,
stefanct66c8c1b2011-07-19 08:50:18 +00002188 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
hailfingerf60abdb2009-03-19 12:18:13 +00002189 },
stepanaa1b6a22008-12-08 18:15:10 +00002190
hailfinger286829b2009-01-08 03:40:17 +00002191 {
2192 .vendor = "Atmel",
2193 .name = "AT45DB161D",
hailfingere1e41ea2011-07-27 07:13:06 +00002194 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002195 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002196 .model_id = ATMEL_AT45DB161D,
hailfingerf60abdb2009-03-19 12:18:13 +00002197 .total_size = 2048 /* Size can only be determined from status register */,
2198 .page_size = 512 /* Size can only be determined from status register */,
Patrick Georgiac3423f2017-02-03 20:58:06 +01002199 .tested = { .probe = NT, .read = BAD, .erase = NT, .write = NT, .uread = NT },
hailfinger286829b2009-01-08 03:40:17 +00002200 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00002201 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +00002202 .write = NULL,
2203 .read = NULL,
stefanct66c8c1b2011-07-19 08:50:18 +00002204 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
hailfingerf60abdb2009-03-19 12:18:13 +00002205 },
stepanaa1b6a22008-12-08 18:15:10 +00002206
hailfinger286829b2009-01-08 03:40:17 +00002207 {
2208 .vendor = "Atmel",
2209 .name = "AT45DB321C",
hailfingere1e41ea2011-07-27 07:13:06 +00002210 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002211 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002212 .model_id = ATMEL_AT45DB321C,
hailfingerf60abdb2009-03-19 12:18:13 +00002213 .total_size = 4224 /* No power of two sizes */,
2214 .page_size = 528 /* No power of two sizes */,
Patrick Georgiac3423f2017-02-03 20:58:06 +01002215 .tested = { .probe = NT, .read = BAD, .erase = NT, .write = NT, .uread = NT },
hailfinger286829b2009-01-08 03:40:17 +00002216 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00002217 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +00002218 .write = NULL,
2219 .read = NULL /* Incompatible read */,
stefanct7e00e222011-06-03 07:26:31 +00002220 .voltage = {2700, 3600},
hailfingerf60abdb2009-03-19 12:18:13 +00002221 },
stepanaa1b6a22008-12-08 18:15:10 +00002222
hailfinger286829b2009-01-08 03:40:17 +00002223 {
2224 .vendor = "Atmel",
2225 .name = "AT45DB321D",
hailfingere1e41ea2011-07-27 07:13:06 +00002226 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002227 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002228 .model_id = ATMEL_AT45DB321D,
hailfingerf60abdb2009-03-19 12:18:13 +00002229 .total_size = 4096 /* Size can only be determined from status register */,
2230 .page_size = 512 /* Size can only be determined from status register */,
Stefan Tauner9816fc82016-08-12 15:47:49 -07002231 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2232 .feature_bits = FEATURE_OTP,
Patrick Georgiac3423f2017-02-03 20:58:06 +01002233 .tested = { .probe = NT, .read = BAD, .erase = NT, .write = NT, .uread = NT },
hailfinger286829b2009-01-08 03:40:17 +00002234 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00002235 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +00002236 .write = NULL,
2237 .read = NULL,
stefanct7e00e222011-06-03 07:26:31 +00002238 .voltage = {2700, 3600},
hailfingerf60abdb2009-03-19 12:18:13 +00002239 },
stepanaa1b6a22008-12-08 18:15:10 +00002240
hailfinger286829b2009-01-08 03:40:17 +00002241 {
2242 .vendor = "Atmel",
2243 .name = "AT45DB642D",
hailfingere1e41ea2011-07-27 07:13:06 +00002244 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002245 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002246 .model_id = ATMEL_AT45DB642D,
hailfingerf60abdb2009-03-19 12:18:13 +00002247 .total_size = 8192 /* Size can only be determined from status register */,
2248 .page_size = 1024 /* Size can only be determined from status register */,
Patrick Georgiac3423f2017-02-03 20:58:06 +01002249 .tested = { .probe = NT, .read = BAD, .erase = NT, .write = NT, .uread = NT },
hailfinger286829b2009-01-08 03:40:17 +00002250 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00002251 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +00002252 .write = NULL,
2253 .read = NULL,
stefanct7e00e222011-06-03 07:26:31 +00002254 .voltage = {2700, 3600},
hailfingerf60abdb2009-03-19 12:18:13 +00002255 },
stepanaa1b6a22008-12-08 18:15:10 +00002256
hailfinger286829b2009-01-08 03:40:17 +00002257 {
2258 .vendor = "Atmel",
uwe0f5a3a22009-05-13 11:36:06 +00002259 .name = "AT49BV512",
hailfingere1e41ea2011-07-27 07:13:06 +00002260 .bustype = BUS_PARALLEL,
uwe0f5a3a22009-05-13 11:36:06 +00002261 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002262 .model_id = ATMEL_AT49BV512,
uwe0f5a3a22009-05-13 11:36:06 +00002263 .total_size = 64,
2264 .page_size = 64,
snelsonc6855342010-01-28 23:55:12 +00002265 .feature_bits = FEATURE_EITHER_RESET,
stefanct896d61e2011-06-04 13:13:34 +00002266 .tested = TEST_OK_PREW,
uwe0f5a3a22009-05-13 11:36:06 +00002267 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00002268 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
hailfinger22155a82009-12-23 12:02:55 +00002269 .block_erasers =
2270 {
2271 {
2272 .eraseblocks = { {64 * 1024, 1} },
2273 .block_erase = erase_chip_block_jedec,
2274 }
2275 },
snelsonc6855342010-01-28 23:55:12 +00002276 .write = write_jedec_1,
uwe0f5a3a22009-05-13 11:36:06 +00002277 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00002278 .voltage = {2700, 3600},
uwe0f5a3a22009-05-13 11:36:06 +00002279 },
2280
2281 {
2282 .vendor = "Atmel",
hailfinger93f8ce22010-06-07 14:10:55 +00002283 .name = "AT49F020",
hailfingere1e41ea2011-07-27 07:13:06 +00002284 .bustype = BUS_PARALLEL,
hailfinger93f8ce22010-06-07 14:10:55 +00002285 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002286 .model_id = ATMEL_AT49F020,
hailfinger93f8ce22010-06-07 14:10:55 +00002287 .total_size = 256,
2288 .page_size = 256,
2289 .feature_bits = FEATURE_EITHER_RESET,
hailfingerd217d122010-10-08 18:52:29 +00002290 .tested = TEST_OK_PRE,
hailfinger93f8ce22010-06-07 14:10:55 +00002291 .probe = probe_jedec,
2292 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
2293 .block_erasers =
2294 {
2295 {
2296 .eraseblocks = { {256 * 1024, 1} },
2297 .block_erase = erase_chip_block_jedec,
2298 }
2299 },
2300 .write = write_jedec_1,
2301 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00002302 .voltage = {4500, 5500},
hailfinger93f8ce22010-06-07 14:10:55 +00002303 },
2304
2305 {
2306 .vendor = "Atmel",
hailfinger286829b2009-01-08 03:40:17 +00002307 .name = "AT49F002(N)",
hailfingere1e41ea2011-07-27 07:13:06 +00002308 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00002309 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002310 .model_id = ATMEL_AT49F002N,
hailfinger286829b2009-01-08 03:40:17 +00002311 .total_size = 256,
2312 .page_size = 256,
snelsonc6855342010-01-28 23:55:12 +00002313 .feature_bits = FEATURE_EITHER_RESET,
hailfinger286829b2009-01-08 03:40:17 +00002314 .tested = TEST_UNTESTED,
2315 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00002316 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
hailfinger22155a82009-12-23 12:02:55 +00002317 .block_erasers =
2318 {
2319 {
2320 .eraseblocks = {
2321 {16 * 1024, 1},
2322 {8 * 1024, 2},
2323 {96 * 1024, 1},
2324 {128 * 1024, 1},
2325 },
2326 .block_erase = erase_sector_jedec,
2327 }, {
2328 .eraseblocks = { {256 * 1024, 1} },
2329 .block_erase = erase_chip_block_jedec,
2330 }
2331 },
snelsonc6855342010-01-28 23:55:12 +00002332 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00002333 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00002334 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00002335 },
2336
hailfinger286829b2009-01-08 03:40:17 +00002337 {
2338 .vendor = "Atmel",
2339 .name = "AT49F002(N)T",
hailfingere1e41ea2011-07-27 07:13:06 +00002340 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00002341 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002342 .model_id = ATMEL_AT49F002NT,
hailfinger286829b2009-01-08 03:40:17 +00002343 .total_size = 256,
2344 .page_size = 256,
snelsonc6855342010-01-28 23:55:12 +00002345 .feature_bits = FEATURE_EITHER_RESET,
hailfingerd217d122010-10-08 18:52:29 +00002346 .tested = TEST_OK_PR,
hailfinger286829b2009-01-08 03:40:17 +00002347 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00002348 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
hailfinger22155a82009-12-23 12:02:55 +00002349 .block_erasers =
2350 {
2351 {
2352 .eraseblocks = {
2353 {128 * 1024, 1},
2354 {96 * 1024, 1},
2355 {8 * 1024, 2},
2356 {16 * 1024, 1},
2357 },
2358 .block_erase = erase_sector_jedec,
2359 }, {
2360 .eraseblocks = { {256 * 1024, 1} },
2361 .block_erase = erase_chip_block_jedec,
2362 }
2363 },
snelsonc6855342010-01-28 23:55:12 +00002364 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00002365 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00002366 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00002367 },
2368
hailfinger867df6b2010-07-22 11:44:38 +00002369 {
uwe598c14d2011-09-08 19:55:18 +00002370 .vendor = "Atmel",
2371 .name = "AT49LH002",
2372 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
2373 .manufacture_id = ATMEL_ID,
2374 .model_id = ATMEL_AT49LH002,
2375 .total_size = 256,
2376 .page_size = 0, /* unused */
2377 .feature_bits = FEATURE_REGISTERMAP, /* TODO: LPC OK too? */
2378 .tested = TEST_UNTESTED,
2379 .probe = probe_82802ab, /* TODO: 0xff cmd not documented? */
2380 .probe_timing = TIMING_FIXME,
2381 .block_erasers =
2382 {
2383 {
2384 .eraseblocks = {
2385 {64 * 1024, 3},
2386 {32 * 1024, 1},
2387 {8 * 1024, 2},
2388 {16 * 1024, 1},
2389 },
2390 .block_erase = erase_block_82802ab,
2391 }, {
2392 .eraseblocks = {
2393 {64 * 1024, 4},
2394 },
2395 .block_erase = NULL, /* TODO: Implement. */
2396 },
2397 },
2398 .printlock = NULL, /* TODO */
2399 .unlock = NULL, /* unlock_82802ab() not correct(?) */
2400 .write = write_82802ab,
2401 .read = read_memmapped,
2402 .voltage = {3000, 3600},
2403 },
2404
2405 {
uwe97b20792011-09-13 22:05:44 +00002406 .vendor = "Catalyst",
2407 .name = "CAT28F512",
2408 .bustype = BUS_PARALLEL,
2409 .manufacture_id = CATALYST_ID,
2410 .model_id = CATALYST_CAT28F512,
2411 .total_size = 64,
2412 .page_size = 0, /* unused */
2413 .feature_bits = 0,
2414 .tested = TEST_OK_PR,
2415 .probe = probe_jedec, /* FIXME! */
2416 .probe_timing = TIMING_ZERO,
2417 .block_erasers =
2418 {
2419 {
2420 .eraseblocks = { {64 * 1024, 1} },
2421 .block_erase = NULL, /* TODO */
2422 },
2423 },
2424 .write = NULL, /* TODO */
2425 .read = read_memmapped,
2426 .voltage = {4500, 5500},
2427 },
2428
2429 {
mhme8e87912010-09-16 00:51:51 +00002430 .vendor = "Bright",
2431 .name = "BM29F040",
hailfingere1e41ea2011-07-27 07:13:06 +00002432 .bustype = BUS_PARALLEL,
mhme8e87912010-09-16 00:51:51 +00002433 .manufacture_id = BRIGHT_ID,
2434 .model_id = BRIGHT_BM29F040,
2435 .total_size = 512,
2436 .page_size = 64 * 1024,
2437 .feature_bits = FEATURE_EITHER_RESET,
2438 .tested = TEST_OK_PR,
2439 .probe = probe_jedec,
2440 .probe_timing = TIMING_ZERO,
2441 .block_erasers =
2442 {
2443 {
2444 .eraseblocks = { {64 * 1024, 8} },
2445 .block_erase = erase_sector_jedec,
2446 }, {
2447 .eraseblocks = { {512 * 1024, 1} },
2448 .block_erase = erase_chip_block_jedec,
2449 },
2450 },
2451 .write = write_jedec_1,
2452 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +00002453 .voltage = {4500, 5500},
mhme8e87912010-09-16 00:51:51 +00002454 },
2455
2456 {
David Hendricksc801adb2010-12-09 16:58:56 -08002457 .vendor = "Bright",
2458 .name = "BM29F040",
hailfingere1e41ea2011-07-27 07:13:06 +00002459 .bustype = BUS_PARALLEL,
David Hendricksc801adb2010-12-09 16:58:56 -08002460 .manufacture_id = BRIGHT_ID,
2461 .model_id = BRIGHT_BM29F040,
2462 .total_size = 512,
2463 .page_size = 64 * 1024,
2464 .feature_bits = FEATURE_EITHER_RESET,
2465 .tested = TEST_OK_PR,
2466 .probe = probe_jedec,
2467 .probe_timing = TIMING_ZERO,
2468 .block_erasers =
2469 {
2470 {
2471 .eraseblocks = { {64 * 1024, 8} },
2472 .block_erase = erase_sector_jedec,
2473 }, {
2474 .eraseblocks = { {512 * 1024, 1} },
2475 .block_erase = erase_chip_block_jedec,
2476 },
2477 },
2478 .write = write_jedec_1,
2479 .read = read_memmapped,
2480 },
2481
2482 {
hailfinger286829b2009-01-08 03:40:17 +00002483 .vendor = "EMST",
2484 .name = "F49B002UA",
hailfingere1e41ea2011-07-27 07:13:06 +00002485 .bustype = BUS_PARALLEL,
Patrick Georgi07e1ed92017-02-06 11:37:23 +01002486 .manufacture_id = ESMT_ID,
2487 .model_id = ESMT_F49B002UA,
hailfinger286829b2009-01-08 03:40:17 +00002488 .total_size = 256,
2489 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +00002490 .feature_bits = FEATURE_EITHER_RESET,
hailfinger286829b2009-01-08 03:40:17 +00002491 .tested = TEST_UNTESTED,
2492 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00002493 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelson2d471072010-01-09 05:30:14 +00002494 .block_erasers =
2495 {
2496 {
Simon Glass8dc82732013-07-16 10:13:51 -06002497 .eraseblocks = {
snelson2d471072010-01-09 05:30:14 +00002498 {128 * 1024, 1},
2499 {96 * 1024, 1},
2500 {8 * 1024, 2},
2501 {16 * 1024, 1},
2502 },
2503 .block_erase = erase_sector_jedec,
2504 }, {
2505 .eraseblocks = { {256 * 1024, 1} },
2506 .block_erase = erase_chip_block_jedec,
2507 }
2508 },
snelsonc6855342010-01-28 23:55:12 +00002509 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00002510 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00002511 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00002512 },
2513
hailfinger286829b2009-01-08 03:40:17 +00002514 {
mkarcherf6986732010-06-19 22:06:35 +00002515 .vendor = "EMST",
2516 .name = "F25L008A",
hailfingere1e41ea2011-07-27 07:13:06 +00002517 .bustype = BUS_SPI,
Patrick Georgi07e1ed92017-02-06 11:37:23 +01002518 .manufacture_id = ESMT_ID,
2519 .model_id = ESMT_F25L008A,
mkarcherf6986732010-06-19 22:06:35 +00002520 .total_size = 1024,
2521 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08002522 .feature_bits = FEATURE_UNBOUND_READ,
mkarcherf6986732010-06-19 22:06:35 +00002523 .tested = TEST_UNTESTED,
2524 .probe = probe_spi_rdid,
2525 .probe_timing = TIMING_ZERO,
2526 .block_erasers =
2527 {
2528 {
2529 .eraseblocks = { {4 * 1024, 256} },
2530 .block_erase = spi_block_erase_20,
2531 }, {
2532 .eraseblocks = { {64 * 1024, 16} },
2533 .block_erase = spi_block_erase_d8,
2534 }, {
2535 .eraseblocks = { {1024 * 1024, 1} },
2536 .block_erase = spi_block_erase_60,
2537 }, {
2538 .eraseblocks = { {1024 * 1024, 1} },
2539 .block_erase = spi_block_erase_c7,
2540 }
2541 },
hailfingerb9560ee2010-07-14 20:21:22 +00002542 .unlock = spi_disable_blockprotect,
hailfingerc7d06c62010-07-14 16:19:05 +00002543 .write = spi_chip_write_1,
mkarcher84fe8cb2010-07-10 19:34:15 +00002544 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00002545 .voltage = {2700, 3600},
mkarcherf6986732010-06-19 22:06:35 +00002546 },
2547
2548 {
hailfingerab07cbd2009-06-05 20:53:07 +00002549 .vendor = "Eon",
2550 .name = "EN25B05",
hailfingere1e41ea2011-07-27 07:13:06 +00002551 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00002552 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00002553 .model_id = EON_EN25B05,
hailfingerab07cbd2009-06-05 20:53:07 +00002554 .total_size = 64,
2555 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08002556 .feature_bits = FEATURE_UNBOUND_READ,
hailfingerab07cbd2009-06-05 20:53:07 +00002557 .tested = TEST_UNTESTED,
2558 .probe = probe_spi_rdid,
2559 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00002560 .block_erasers =
2561 {
2562 {
2563 .eraseblocks = {
2564 {4 * 1024, 2},
2565 {8 * 1024, 1},
2566 {16 * 1024, 1},
2567 {32 * 1024, 1},
2568 },
2569 .block_erase = spi_block_erase_d8,
2570 }, {
2571 .eraseblocks = { {64 * 1024, 1} },
2572 .block_erase = spi_block_erase_c7,
2573 }
2574 },
hailfingerb9560ee2010-07-14 20:21:22 +00002575 .unlock = spi_disable_blockprotect,
snelson2d471072010-01-09 05:30:14 +00002576 .write = spi_chip_write_256,
2577 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00002578 .voltage = {2700, 3600},
snelson2d471072010-01-09 05:30:14 +00002579 },
2580
2581 {
2582 .vendor = "Eon",
2583 .name = "EN25B05T",
hailfingere1e41ea2011-07-27 07:13:06 +00002584 .bustype = BUS_SPI,
snelson2d471072010-01-09 05:30:14 +00002585 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00002586 .model_id = EON_EN25B05,
snelson2d471072010-01-09 05:30:14 +00002587 .total_size = 64,
2588 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08002589 .feature_bits = FEATURE_UNBOUND_READ,
snelson2d471072010-01-09 05:30:14 +00002590 .tested = TEST_UNTESTED,
2591 .probe = probe_spi_rdid,
2592 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00002593 .block_erasers =
2594 {
2595 {
2596 .eraseblocks = {
2597 {32 * 1024, 1},
2598 {16 * 1024, 1},
2599 {8 * 1024, 1},
2600 {4 * 1024, 2},
2601 },
2602 .block_erase = spi_block_erase_d8,
2603 }, {
2604 .eraseblocks = { {64 * 1024, 1} },
2605 .block_erase = spi_block_erase_c7,
2606 }
2607 },
hailfingerb9560ee2010-07-14 20:21:22 +00002608 .unlock = spi_disable_blockprotect,
hailfingerab07cbd2009-06-05 20:53:07 +00002609 .write = spi_chip_write_256,
2610 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00002611 .voltage = {2700, 3600},
hailfingerab07cbd2009-06-05 20:53:07 +00002612 },
2613
2614 {
2615 .vendor = "Eon",
2616 .name = "EN25B10",
hailfingere1e41ea2011-07-27 07:13:06 +00002617 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00002618 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00002619 .model_id = EON_EN25B10,
hailfingerab07cbd2009-06-05 20:53:07 +00002620 .total_size = 128,
2621 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08002622 .feature_bits = FEATURE_UNBOUND_READ,
hailfingerab07cbd2009-06-05 20:53:07 +00002623 .tested = TEST_UNTESTED,
2624 .probe = probe_spi_rdid,
2625 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00002626 .block_erasers =
2627 {
2628 {
2629 .eraseblocks = {
2630 {4 * 1024, 2},
2631 {8 * 1024, 1},
2632 {16 * 1024, 1},
2633 {32 * 1024, 3},
2634 },
2635 .block_erase = spi_block_erase_d8,
2636 }, {
2637 .eraseblocks = { {128 * 1024, 1} },
2638 .block_erase = spi_block_erase_c7,
2639 }
2640 },
hailfingerb9560ee2010-07-14 20:21:22 +00002641 .unlock = spi_disable_blockprotect,
snelson2d471072010-01-09 05:30:14 +00002642 .write = spi_chip_write_256,
2643 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00002644 .voltage = {2700, 3600},
snelson2d471072010-01-09 05:30:14 +00002645 },
2646
2647 {
2648 .vendor = "Eon",
2649 .name = "EN25B10T",
hailfingere1e41ea2011-07-27 07:13:06 +00002650 .bustype = BUS_SPI,
snelson2d471072010-01-09 05:30:14 +00002651 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00002652 .model_id = EON_EN25B10,
snelson2d471072010-01-09 05:30:14 +00002653 .total_size = 128,
2654 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08002655 .feature_bits = FEATURE_UNBOUND_READ,
snelson2d471072010-01-09 05:30:14 +00002656 .tested = TEST_UNTESTED,
2657 .probe = probe_spi_rdid,
2658 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00002659 .block_erasers =
2660 {
2661 {
2662 .eraseblocks = {
2663 {32 * 1024, 3},
2664 {16 * 1024, 1},
2665 {8 * 1024, 1},
2666 {4 * 1024, 2},
2667 },
2668 .block_erase = spi_block_erase_d8,
2669 }, {
2670 .eraseblocks = { {128 * 1024, 1} },
2671 .block_erase = spi_block_erase_c7,
2672 }
2673 },
hailfingerb9560ee2010-07-14 20:21:22 +00002674 .unlock = spi_disable_blockprotect,
hailfingerab07cbd2009-06-05 20:53:07 +00002675 .write = spi_chip_write_256,
2676 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00002677 .voltage = {2700, 3600},
hailfingerab07cbd2009-06-05 20:53:07 +00002678 },
2679
2680 {
2681 .vendor = "Eon",
2682 .name = "EN25B20",
hailfingere1e41ea2011-07-27 07:13:06 +00002683 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00002684 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00002685 .model_id = EON_EN25B20,
hailfingerab07cbd2009-06-05 20:53:07 +00002686 .total_size = 256,
2687 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08002688 .feature_bits = FEATURE_UNBOUND_READ,
hailfingerab07cbd2009-06-05 20:53:07 +00002689 .tested = TEST_UNTESTED,
2690 .probe = probe_spi_rdid,
2691 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00002692 .block_erasers =
2693 {
2694 {
2695 .eraseblocks = {
2696 {4 * 1024, 2},
2697 {8 * 1024, 1},
2698 {16 * 1024, 1},
2699 {32 * 1024, 1},
2700 {64 * 1024, 3}
2701 },
2702 .block_erase = spi_block_erase_d8,
2703 }, {
2704 .eraseblocks = { {256 * 1024, 1} },
2705 .block_erase = spi_block_erase_c7,
2706 }
2707 },
hailfingerb9560ee2010-07-14 20:21:22 +00002708 .unlock = spi_disable_blockprotect,
snelson2d471072010-01-09 05:30:14 +00002709 .write = spi_chip_write_256,
2710 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00002711 .voltage = {2700, 3600},
snelson2d471072010-01-09 05:30:14 +00002712 },
2713
2714 {
2715 .vendor = "Eon",
2716 .name = "EN25B20T",
hailfingere1e41ea2011-07-27 07:13:06 +00002717 .bustype = BUS_SPI,
snelson2d471072010-01-09 05:30:14 +00002718 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00002719 .model_id = EON_EN25B20,
snelson2d471072010-01-09 05:30:14 +00002720 .total_size = 256,
2721 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08002722 .feature_bits = FEATURE_UNBOUND_READ,
snelson2d471072010-01-09 05:30:14 +00002723 .tested = TEST_UNTESTED,
2724 .probe = probe_spi_rdid,
2725 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00002726 .block_erasers =
2727 {
2728 {
2729 .eraseblocks = {
2730 {64 * 1024, 3},
2731 {32 * 1024, 1},
2732 {16 * 1024, 1},
2733 {8 * 1024, 1},
2734 {4 * 1024, 2},
2735 },
2736 .block_erase = spi_block_erase_d8,
2737 }, {
2738 .eraseblocks = { {256 * 1024, 1} },
2739 .block_erase = spi_block_erase_c7,
2740 }
2741 },
hailfingerb9560ee2010-07-14 20:21:22 +00002742 .unlock = spi_disable_blockprotect,
hailfingerab07cbd2009-06-05 20:53:07 +00002743 .write = spi_chip_write_256,
2744 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00002745 .voltage = {2700, 3600},
hailfingerab07cbd2009-06-05 20:53:07 +00002746 },
2747
2748 {
2749 .vendor = "Eon",
2750 .name = "EN25B40",
hailfingere1e41ea2011-07-27 07:13:06 +00002751 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00002752 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00002753 .model_id = EON_EN25B40,
hailfingerab07cbd2009-06-05 20:53:07 +00002754 .total_size = 512,
2755 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08002756 .feature_bits = FEATURE_UNBOUND_READ,
hailfingerab07cbd2009-06-05 20:53:07 +00002757 .tested = TEST_UNTESTED,
2758 .probe = probe_spi_rdid,
2759 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00002760 .block_erasers =
2761 {
2762 {
2763 .eraseblocks = {
2764 {4 * 1024, 2},
2765 {8 * 1024, 1},
2766 {16 * 1024, 1},
2767 {32 * 1024, 1},
2768 {64 * 1024, 7}
2769 },
2770 .block_erase = spi_block_erase_d8,
2771 }, {
2772 .eraseblocks = { {512 * 1024, 1} },
2773 .block_erase = spi_block_erase_c7,
2774 }
2775 },
hailfingerb9560ee2010-07-14 20:21:22 +00002776 .unlock = spi_disable_blockprotect,
snelson2d471072010-01-09 05:30:14 +00002777 .write = spi_chip_write_256,
2778 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00002779 .voltage = {2700, 3600},
snelson2d471072010-01-09 05:30:14 +00002780 },
2781
2782 {
2783 .vendor = "Eon",
2784 .name = "EN25B40T",
hailfingere1e41ea2011-07-27 07:13:06 +00002785 .bustype = BUS_SPI,
snelson2d471072010-01-09 05:30:14 +00002786 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00002787 .model_id = EON_EN25B40,
snelson2d471072010-01-09 05:30:14 +00002788 .total_size = 512,
2789 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08002790 .feature_bits = FEATURE_UNBOUND_READ,
snelson2d471072010-01-09 05:30:14 +00002791 .tested = TEST_UNTESTED,
2792 .probe = probe_spi_rdid,
2793 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00002794 .block_erasers =
2795 {
2796 {
2797 .eraseblocks = {
2798 {64 * 1024, 7},
2799 {32 * 1024, 1},
2800 {16 * 1024, 1},
2801 {8 * 1024, 1},
2802 {4 * 1024, 2},
2803 },
2804 .block_erase = spi_block_erase_d8,
2805 }, {
2806 .eraseblocks = { {512 * 1024, 1} },
2807 .block_erase = spi_block_erase_c7,
2808 }
2809 },
hailfingerb9560ee2010-07-14 20:21:22 +00002810 .unlock = spi_disable_blockprotect,
hailfingerab07cbd2009-06-05 20:53:07 +00002811 .write = spi_chip_write_256,
2812 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00002813 .voltage = {2700, 3600},
hailfingerab07cbd2009-06-05 20:53:07 +00002814 },
2815
2816 {
2817 .vendor = "Eon",
2818 .name = "EN25B80",
hailfingere1e41ea2011-07-27 07:13:06 +00002819 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00002820 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00002821 .model_id = EON_EN25B80,
hailfingerab07cbd2009-06-05 20:53:07 +00002822 .total_size = 1024,
2823 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08002824 .feature_bits = FEATURE_UNBOUND_READ,
hailfingerab07cbd2009-06-05 20:53:07 +00002825 .tested = TEST_UNTESTED,
2826 .probe = probe_spi_rdid,
2827 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00002828 .block_erasers =
2829 {
2830 {
2831 .eraseblocks = {
2832 {4 * 1024, 2},
2833 {8 * 1024, 1},
2834 {16 * 1024, 1},
2835 {32 * 1024, 1},
2836 {64 * 1024, 15}
2837 },
2838 .block_erase = spi_block_erase_d8,
2839 }, {
2840 .eraseblocks = { {1024 * 1024, 1} },
2841 .block_erase = spi_block_erase_c7,
2842 }
2843 },
hailfingerb9560ee2010-07-14 20:21:22 +00002844 .unlock = spi_disable_blockprotect,
snelson2d471072010-01-09 05:30:14 +00002845 .write = spi_chip_write_256,
2846 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00002847 .voltage = {2700, 3600},
snelson2d471072010-01-09 05:30:14 +00002848 },
2849
2850 {
2851 .vendor = "Eon",
2852 .name = "EN25B80T",
hailfingere1e41ea2011-07-27 07:13:06 +00002853 .bustype = BUS_SPI,
snelson2d471072010-01-09 05:30:14 +00002854 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00002855 .model_id = EON_EN25B80,
snelson2d471072010-01-09 05:30:14 +00002856 .total_size = 1024,
2857 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08002858 .feature_bits = FEATURE_UNBOUND_READ,
snelson2d471072010-01-09 05:30:14 +00002859 .tested = TEST_UNTESTED,
2860 .probe = probe_spi_rdid,
2861 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00002862 .block_erasers =
2863 {
2864 {
2865 .eraseblocks = {
2866 {64 * 1024, 15},
2867 {32 * 1024, 1},
2868 {16 * 1024, 1},
2869 {8 * 1024, 1},
2870 {4 * 1024, 2},
2871 },
2872 .block_erase = spi_block_erase_d8,
2873 }, {
2874 .eraseblocks = { {1024 * 1024, 1} },
2875 .block_erase = spi_block_erase_c7,
2876 }
2877 },
hailfingerb9560ee2010-07-14 20:21:22 +00002878 .unlock = spi_disable_blockprotect,
hailfingerab07cbd2009-06-05 20:53:07 +00002879 .write = spi_chip_write_256,
2880 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00002881 .voltage = {2700, 3600},
hailfingerab07cbd2009-06-05 20:53:07 +00002882 },
2883
2884 {
2885 .vendor = "Eon",
2886 .name = "EN25B16",
hailfingere1e41ea2011-07-27 07:13:06 +00002887 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00002888 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00002889 .model_id = EON_EN25B16,
hailfingerab07cbd2009-06-05 20:53:07 +00002890 .total_size = 2048,
2891 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08002892 .feature_bits = FEATURE_UNBOUND_READ,
hailfingerab07cbd2009-06-05 20:53:07 +00002893 .tested = TEST_UNTESTED,
2894 .probe = probe_spi_rdid,
2895 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00002896 .block_erasers =
2897 {
2898 {
2899 .eraseblocks = {
2900 {4 * 1024, 2},
2901 {8 * 1024, 1},
2902 {16 * 1024, 1},
2903 {32 * 1024, 1},
2904 {64 * 1024, 31},
2905 },
2906 .block_erase = spi_block_erase_d8,
2907 }, {
2908 .eraseblocks = { {2 * 1024 * 1024, 1} },
2909 .block_erase = spi_block_erase_c7,
2910 }
2911 },
hailfingerb9560ee2010-07-14 20:21:22 +00002912 .unlock = spi_disable_blockprotect,
snelson2d471072010-01-09 05:30:14 +00002913 .write = spi_chip_write_256,
2914 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00002915 .voltage = {2700, 3600},
snelson2d471072010-01-09 05:30:14 +00002916 },
2917
2918 {
2919 .vendor = "Eon",
2920 .name = "EN25B16T",
hailfingere1e41ea2011-07-27 07:13:06 +00002921 .bustype = BUS_SPI,
snelson2d471072010-01-09 05:30:14 +00002922 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00002923 .model_id = EON_EN25B16,
snelson2d471072010-01-09 05:30:14 +00002924 .total_size = 2048,
2925 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08002926 .feature_bits = FEATURE_UNBOUND_READ,
snelson2d471072010-01-09 05:30:14 +00002927 .tested = TEST_UNTESTED,
2928 .probe = probe_spi_rdid,
2929 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00002930 .block_erasers =
2931 {
2932 {
2933 .eraseblocks = {
2934 {64 * 1024, 31},
2935 {32 * 1024, 1},
2936 {16 * 1024, 1},
2937 {8 * 1024, 1},
2938 {4 * 1024, 2},
2939 },
2940 .block_erase = spi_block_erase_d8,
2941 }, {
2942 .eraseblocks = { {2 * 1024 * 1024, 1} },
2943 .block_erase = spi_block_erase_c7,
2944 }
2945 },
hailfingerb9560ee2010-07-14 20:21:22 +00002946 .unlock = spi_disable_blockprotect,
hailfingerab07cbd2009-06-05 20:53:07 +00002947 .write = spi_chip_write_256,
2948 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00002949 .voltage = {2700, 3600},
hailfingerab07cbd2009-06-05 20:53:07 +00002950 },
2951
2952 {
2953 .vendor = "Eon",
2954 .name = "EN25B32",
hailfingere1e41ea2011-07-27 07:13:06 +00002955 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00002956 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00002957 .model_id = EON_EN25B32,
hailfingerab07cbd2009-06-05 20:53:07 +00002958 .total_size = 4096,
2959 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08002960 .feature_bits = FEATURE_UNBOUND_READ,
hailfingerab07cbd2009-06-05 20:53:07 +00002961 .tested = TEST_UNTESTED,
2962 .probe = probe_spi_rdid,
2963 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00002964 .block_erasers =
2965 {
2966 {
2967 .eraseblocks = {
2968 {4 * 1024, 2},
2969 {8 * 1024, 1},
2970 {16 * 1024, 1},
2971 {32 * 1024, 1},
2972 {64 * 1024, 63},
2973 },
2974 .block_erase = spi_block_erase_d8,
2975 }, {
2976 .eraseblocks = { {4 * 1024 * 1024, 1} },
2977 .block_erase = spi_block_erase_c7,
2978 }
2979 },
hailfingerb9560ee2010-07-14 20:21:22 +00002980 .unlock = spi_disable_blockprotect,
snelson2d471072010-01-09 05:30:14 +00002981 .write = spi_chip_write_256,
2982 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00002983 .voltage = {2700, 3600},
snelson2d471072010-01-09 05:30:14 +00002984 },
2985
2986 {
2987 .vendor = "Eon",
2988 .name = "EN25B32T",
hailfingere1e41ea2011-07-27 07:13:06 +00002989 .bustype = BUS_SPI,
snelson2d471072010-01-09 05:30:14 +00002990 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00002991 .model_id = EON_EN25B32,
snelson2d471072010-01-09 05:30:14 +00002992 .total_size = 4096,
2993 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08002994 .feature_bits = FEATURE_UNBOUND_READ,
snelson2d471072010-01-09 05:30:14 +00002995 .tested = TEST_UNTESTED,
2996 .probe = probe_spi_rdid,
2997 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00002998 .block_erasers =
2999 {
3000 {
3001 .eraseblocks = {
3002 {64 * 1024, 63},
3003 {32 * 1024, 1},
3004 {16 * 1024, 1},
3005 {8 * 1024, 1},
3006 {4 * 1024, 2},
3007 },
3008 .block_erase = spi_block_erase_d8,
3009 }, {
3010 .eraseblocks = { {4 * 1024 * 1024, 1} },
3011 .block_erase = spi_block_erase_c7,
3012 }
3013 },
hailfingerb9560ee2010-07-14 20:21:22 +00003014 .unlock = spi_disable_blockprotect,
hailfingerab07cbd2009-06-05 20:53:07 +00003015 .write = spi_chip_write_256,
3016 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00003017 .voltage = {2700, 3600},
hailfingerab07cbd2009-06-05 20:53:07 +00003018 },
3019
3020 {
3021 .vendor = "Eon",
3022 .name = "EN25B64",
hailfingere1e41ea2011-07-27 07:13:06 +00003023 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00003024 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00003025 .model_id = EON_EN25B64,
hailfingerab07cbd2009-06-05 20:53:07 +00003026 .total_size = 8192,
3027 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08003028 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
hailfingerab07cbd2009-06-05 20:53:07 +00003029 .tested = TEST_UNTESTED,
3030 .probe = probe_spi_rdid,
3031 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00003032 .block_erasers =
3033 {
3034 {
3035 .eraseblocks = {
3036 {4 * 1024, 2},
3037 {8 * 1024, 1},
3038 {16 * 1024, 1},
3039 {32 * 1024, 1},
3040 {64 * 1024, 127},
3041 },
3042 .block_erase = spi_block_erase_d8,
3043 }, {
3044 .eraseblocks = { {8 * 1024 * 1024, 1} },
3045 .block_erase = spi_block_erase_c7,
3046 }
3047 },
hailfingerb9560ee2010-07-14 20:21:22 +00003048 .unlock = spi_disable_blockprotect,
snelson2d471072010-01-09 05:30:14 +00003049 .write = spi_chip_write_256,
3050 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00003051 .voltage = {2700, 3600},
snelson2d471072010-01-09 05:30:14 +00003052 },
3053
3054 {
3055 .vendor = "Eon",
3056 .name = "EN25B64T",
hailfingere1e41ea2011-07-27 07:13:06 +00003057 .bustype = BUS_SPI,
snelson2d471072010-01-09 05:30:14 +00003058 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00003059 .model_id = EON_EN25B64,
snelson2d471072010-01-09 05:30:14 +00003060 .total_size = 8192,
3061 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08003062 .feature_bits = FEATURE_UNBOUND_READ,
snelson2d471072010-01-09 05:30:14 +00003063 .tested = TEST_UNTESTED,
3064 .probe = probe_spi_rdid,
3065 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00003066 .block_erasers =
3067 {
3068 {
3069 .eraseblocks = {
3070 {64 * 1024, 127},
3071 {32 * 1024, 1},
3072 {16 * 1024, 1},
3073 {8 * 1024, 1},
3074 {4 * 1024, 2},
3075 },
3076 .block_erase = spi_block_erase_d8,
3077 }, {
3078 .eraseblocks = { {8 * 1024 * 1024, 1} },
3079 .block_erase = spi_block_erase_c7,
3080 }
3081 },
hailfingerb9560ee2010-07-14 20:21:22 +00003082 .unlock = spi_disable_blockprotect,
hailfingerab07cbd2009-06-05 20:53:07 +00003083 .write = spi_chip_write_256,
3084 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00003085 .voltage = {2700, 3600},
hailfingerab07cbd2009-06-05 20:53:07 +00003086 },
3087
3088 {
David Hendrickse185bf22011-05-24 15:34:18 -07003089 /* Note: EN25Q16 is an evil twin which shares the model ID
3090 but has different write protection capabilities */
hailfingerab07cbd2009-06-05 20:53:07 +00003091 .vendor = "Eon",
hailfinger77c5d932009-06-15 12:10:57 +00003092 .name = "EN25D16",
hailfingere1e41ea2011-07-27 07:13:06 +00003093 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00003094 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00003095 .model_id = EON_EN25D16,
hailfinger77c5d932009-06-15 12:10:57 +00003096 .total_size = 2048,
3097 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07003098 /* OTP: D16 512B/Q16 128B total; enter 0x3A */
3099 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
hailfinger77c5d932009-06-15 12:10:57 +00003100 .tested = TEST_UNTESTED,
3101 .probe = probe_spi_rdid,
3102 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00003103 .block_erasers =
3104 {
3105 {
3106 .eraseblocks = { {4 * 1024, 512} },
3107 .block_erase = spi_block_erase_20,
3108 }, {
3109 .eraseblocks = { {64 * 1024, 32} },
3110 .block_erase = spi_block_erase_d8,
3111 }, {
3112 .eraseblocks = { {64 * 1024, 32} },
3113 .block_erase = spi_block_erase_52,
3114 }, {
3115 .eraseblocks = { {2 * 1024 * 1024, 1} },
3116 .block_erase = spi_block_erase_60,
3117 }, {
3118 .eraseblocks = { {2 * 1024 * 1024, 1} },
3119 .block_erase = spi_block_erase_c7,
3120 }
3121 },
hailfingerb9560ee2010-07-14 20:21:22 +00003122 .unlock = spi_disable_blockprotect,
hailfinger77c5d932009-06-15 12:10:57 +00003123 .write = spi_chip_write_256,
3124 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00003125 .voltage = {2700, 3600},
hailfinger77c5d932009-06-15 12:10:57 +00003126 },
3127
3128 {
3129 .vendor = "Eon",
3130 .name = "EN25F05",
hailfingere1e41ea2011-07-27 07:13:06 +00003131 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00003132 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00003133 .model_id = EON_EN25F05,
hailfinger77c5d932009-06-15 12:10:57 +00003134 .total_size = 64,
3135 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08003136 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
hailfinger77c5d932009-06-15 12:10:57 +00003137 .tested = TEST_UNTESTED,
3138 .probe = probe_spi_rdid,
3139 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00003140 .block_erasers =
3141 {
3142 {
3143 .eraseblocks = { {4 * 1024, 16} },
3144 .block_erase = spi_block_erase_20,
3145 }, {
3146 .eraseblocks = { {32 * 1024, 2} },
3147 .block_erase = spi_block_erase_d8,
3148 }, {
3149 .eraseblocks = { {32 * 1024, 2} },
3150 .block_erase = spi_block_erase_52,
3151 }, {
3152 .eraseblocks = { {64 * 1024, 1} },
3153 .block_erase = spi_block_erase_60,
3154 }, {
3155 .eraseblocks = { {64 * 1024, 1} },
3156 .block_erase = spi_block_erase_c7,
3157 }
3158 },
hailfingerb9560ee2010-07-14 20:21:22 +00003159 .unlock = spi_disable_blockprotect,
hailfinger77c5d932009-06-15 12:10:57 +00003160 .write = spi_chip_write_256,
3161 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00003162 .voltage = {2700, 3600},
hailfinger77c5d932009-06-15 12:10:57 +00003163 },
3164
3165 {
3166 .vendor = "Eon",
3167 .name = "EN25F10",
hailfingere1e41ea2011-07-27 07:13:06 +00003168 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00003169 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00003170 .model_id = EON_EN25F10,
hailfinger77c5d932009-06-15 12:10:57 +00003171 .total_size = 128,
3172 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08003173 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
hailfinger77c5d932009-06-15 12:10:57 +00003174 .tested = TEST_UNTESTED,
3175 .probe = probe_spi_rdid,
3176 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00003177 .block_erasers =
3178 {
3179 {
3180 .eraseblocks = { {4 * 1024, 32} },
3181 .block_erase = spi_block_erase_20,
3182 }, {
3183 .eraseblocks = { {32 * 1024, 4} },
3184 .block_erase = spi_block_erase_d8,
3185 }, {
3186 .eraseblocks = { {32 * 1024, 4} },
3187 .block_erase = spi_block_erase_52,
3188 }, {
3189 .eraseblocks = { {128 * 1024, 1} },
3190 .block_erase = spi_block_erase_60,
3191 }, {
3192 .eraseblocks = { {128 * 1024, 1} },
3193 .block_erase = spi_block_erase_c7,
3194 }
3195 },
hailfingerb9560ee2010-07-14 20:21:22 +00003196 .unlock = spi_disable_blockprotect,
hailfinger77c5d932009-06-15 12:10:57 +00003197 .write = spi_chip_write_256,
3198 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00003199 .voltage = {2700, 3600},
hailfinger77c5d932009-06-15 12:10:57 +00003200 },
3201
3202 {
3203 .vendor = "Eon",
3204 .name = "EN25F20",
hailfingere1e41ea2011-07-27 07:13:06 +00003205 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00003206 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00003207 .model_id = EON_EN25F20,
hailfinger77c5d932009-06-15 12:10:57 +00003208 .total_size = 256,
3209 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08003210 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
hailfinger77c5d932009-06-15 12:10:57 +00003211 .tested = TEST_UNTESTED,
3212 .probe = probe_spi_rdid,
3213 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00003214 .block_erasers =
3215 {
3216 {
3217 .eraseblocks = { {4 * 1024, 64} },
3218 .block_erase = spi_block_erase_20,
3219 }, {
3220 .eraseblocks = { {64 * 1024, 4} },
3221 .block_erase = spi_block_erase_d8,
3222 }, {
3223 .eraseblocks = { {64 * 1024, 4} },
3224 .block_erase = spi_block_erase_52,
3225 }, {
3226 .eraseblocks = { {256 * 1024, 1} },
3227 .block_erase = spi_block_erase_60,
3228 }, {
3229 .eraseblocks = { {256 * 1024, 1} },
3230 .block_erase = spi_block_erase_c7,
3231 }
3232 },
hailfingerb9560ee2010-07-14 20:21:22 +00003233 .unlock = spi_disable_blockprotect,
hailfinger77c5d932009-06-15 12:10:57 +00003234 .write = spi_chip_write_256,
3235 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00003236 .voltage = {2700, 3600},
hailfinger77c5d932009-06-15 12:10:57 +00003237 },
3238
3239 {
3240 .vendor = "Eon",
hailfingerab07cbd2009-06-05 20:53:07 +00003241 .name = "EN25F40",
hailfingere1e41ea2011-07-27 07:13:06 +00003242 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00003243 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00003244 .model_id = EON_EN25F40,
hailfingerab07cbd2009-06-05 20:53:07 +00003245 .total_size = 512,
3246 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08003247 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
hailfinger27a59132009-06-22 10:06:28 +00003248 .tested = TEST_OK_PROBE,
hailfingerab07cbd2009-06-05 20:53:07 +00003249 .probe = probe_spi_rdid,
3250 .probe_timing = TIMING_ZERO,
snelson1c03aa12009-12-23 17:05:59 +00003251 .block_erasers =
3252 {
3253 {
snelson2d471072010-01-09 05:30:14 +00003254 .eraseblocks = { {4 * 1024, 128} },
snelson1c03aa12009-12-23 17:05:59 +00003255 .block_erase = spi_block_erase_20,
3256 }, {
snelson2d471072010-01-09 05:30:14 +00003257 .eraseblocks = { {64 * 1024, 8} },
snelson1c03aa12009-12-23 17:05:59 +00003258 .block_erase = spi_block_erase_d8,
3259 }, {
snelson2d471072010-01-09 05:30:14 +00003260 .eraseblocks = { {512 * 1024, 1} },
snelson1c03aa12009-12-23 17:05:59 +00003261 .block_erase = spi_block_erase_60,
3262 }, {
snelson2d471072010-01-09 05:30:14 +00003263 .eraseblocks = { {512 * 1024, 1} },
snelson1c03aa12009-12-23 17:05:59 +00003264 .block_erase = spi_block_erase_c7,
3265 },
3266 },
hailfingerb9560ee2010-07-14 20:21:22 +00003267 .unlock = spi_disable_blockprotect,
hailfingerab07cbd2009-06-05 20:53:07 +00003268 .write = spi_chip_write_256,
3269 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00003270 .voltage = {2700, 3600},
Louis Yung-Chieh Lod6572b32011-05-24 16:28:27 +08003271 .wp = &wp_w25,
hailfingerab07cbd2009-06-05 20:53:07 +00003272 },
3273
3274 {
3275 .vendor = "Eon",
3276 .name = "EN25F80",
hailfingere1e41ea2011-07-27 07:13:06 +00003277 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00003278 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00003279 .model_id = EON_EN25F80,
hailfingerab07cbd2009-06-05 20:53:07 +00003280 .total_size = 1024,
3281 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08003282 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
3283 .tested = TEST_OK_PREWU,
hailfingerab07cbd2009-06-05 20:53:07 +00003284 .probe = probe_spi_rdid,
3285 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00003286 .block_erasers =
3287 {
3288 {
3289 .eraseblocks = { {4 * 1024, 256} },
3290 .block_erase = spi_block_erase_20,
3291 }, {
3292 .eraseblocks = { {64 * 1024, 16} },
3293 .block_erase = spi_block_erase_d8,
3294 }, {
3295 .eraseblocks = { {1024 * 1024, 1} },
3296 .block_erase = spi_block_erase_60,
3297 }, {
3298 .eraseblocks = { {1024 * 1024, 1} },
3299 .block_erase = spi_block_erase_c7,
3300 }
3301 },
hailfingerb9560ee2010-07-14 20:21:22 +00003302 .unlock = spi_disable_blockprotect,
hailfingerab07cbd2009-06-05 20:53:07 +00003303 .write = spi_chip_write_256,
3304 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00003305 .voltage = {2700, 3600},
hailfingerab07cbd2009-06-05 20:53:07 +00003306 },
3307
3308 {
3309 .vendor = "Eon",
3310 .name = "EN25F16",
hailfingere1e41ea2011-07-27 07:13:06 +00003311 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00003312 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00003313 .model_id = EON_EN25F16,
hailfingerab07cbd2009-06-05 20:53:07 +00003314 .total_size = 2048,
3315 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08003316 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
3317 .tested = TEST_OK_PREWU,
hailfingerab07cbd2009-06-05 20:53:07 +00003318 .probe = probe_spi_rdid,
3319 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00003320 .block_erasers =
3321 {
3322 {
3323 .eraseblocks = { {4 * 1024, 512} },
3324 .block_erase = spi_block_erase_20,
3325 }, {
3326 .eraseblocks = { {64 * 1024, 32} },
3327 .block_erase = spi_block_erase_d8,
3328 }, {
3329 .eraseblocks = { {2 * 1024 * 1024, 1} },
3330 .block_erase = spi_block_erase_60,
3331 }, {
3332 .eraseblocks = { {2 * 1024 * 1024, 1} },
3333 .block_erase = spi_block_erase_c7,
3334 }
3335 },
hailfingerb9560ee2010-07-14 20:21:22 +00003336 .unlock = spi_disable_blockprotect,
hailfingerab07cbd2009-06-05 20:53:07 +00003337 .write = spi_chip_write_256,
3338 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00003339 .voltage = {2700, 3600},
hailfingerab07cbd2009-06-05 20:53:07 +00003340 },
3341
3342 {
hailfinger77c5d932009-06-15 12:10:57 +00003343 .vendor = "Eon",
3344 .name = "EN25F32",
hailfingere1e41ea2011-07-27 07:13:06 +00003345 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00003346 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00003347 .model_id = EON_EN25F32,
hailfinger77c5d932009-06-15 12:10:57 +00003348 .total_size = 4096,
3349 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08003350 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
hailfinger77c5d932009-06-15 12:10:57 +00003351 .tested = TEST_UNTESTED,
3352 .probe = probe_spi_rdid,
3353 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00003354 .block_erasers =
3355 {
3356 {
3357 .eraseblocks = { {4 * 1024, 1024} },
3358 .block_erase = spi_block_erase_20,
3359 }, {
3360 .eraseblocks = { {64 * 1024, 64} },
3361 .block_erase = spi_block_erase_d8,
3362 }, {
3363 .eraseblocks = { {4 * 1024 * 1024, 1} },
3364 .block_erase = spi_block_erase_60,
3365 }, {
3366 .eraseblocks = { {4 * 1024 * 1024, 1} },
3367 .block_erase = spi_block_erase_c7,
3368 }
3369 },
hailfingerb9560ee2010-07-14 20:21:22 +00003370 .unlock = spi_disable_blockprotect,
hailfinger77c5d932009-06-15 12:10:57 +00003371 .write = spi_chip_write_256,
3372 .read = spi_chip_read,
3373 },
3374
3375 {
snelson2b18d0f2010-03-05 08:44:11 +00003376 .vendor = "Eon",
David Hendrickse185bf22011-05-24 15:34:18 -07003377 .name = "EN25Q40",
hailfingere1e41ea2011-07-27 07:13:06 +00003378 .bustype = BUS_SPI,
David Hendrickse185bf22011-05-24 15:34:18 -07003379 .manufacture_id = EON_ID_NOPREFIX,
3380 .model_id = EON_EN25Q40,
3381 .total_size = 512,
3382 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08003383 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
David Hendrickse185bf22011-05-24 15:34:18 -07003384 .tested = TEST_UNTESTED,
3385 .probe = probe_spi_rdid,
3386 .probe_timing = TIMING_ZERO,
3387 .block_erasers =
3388 {
3389 {
3390 .eraseblocks = { {4 * 1024, 128} },
3391 .block_erase = spi_block_erase_20,
3392 }, {
3393 .eraseblocks = { {64 * 1024, 8} },
3394 .block_erase = spi_block_erase_d8,
3395 }, {
3396 .eraseblocks = { {512 * 1024, 1} },
3397 .block_erase = spi_block_erase_60,
3398 }, {
3399 .eraseblocks = { {512 * 1024, 1} },
3400 .block_erase = spi_block_erase_c7,
3401 }
3402 },
3403 .unlock = spi_disable_blockprotect,
3404 .write = spi_chip_write_256,
3405 .read = spi_chip_read,
3406 .wp = &wp_w25,
3407 },
3408
3409 {
3410 .vendor = "Eon",
3411 .name = "EN25Q80(A)",
hailfingere1e41ea2011-07-27 07:13:06 +00003412 .bustype = BUS_SPI,
David Hendrickse185bf22011-05-24 15:34:18 -07003413 .manufacture_id = EON_ID_NOPREFIX,
3414 .model_id = EON_EN25Q80,
3415 .total_size = 1024,
3416 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08003417 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
David Hendrickse185bf22011-05-24 15:34:18 -07003418 .tested = TEST_UNTESTED,
3419 .probe = probe_spi_rdid,
3420 .probe_timing = TIMING_ZERO,
3421 .block_erasers =
3422 {
3423 {
3424 .eraseblocks = { {4 * 1024, 256} },
3425 .block_erase = spi_block_erase_20,
3426 }, {
3427 .eraseblocks = { {64 * 1024, 16} },
3428 .block_erase = spi_block_erase_d8,
3429 }, {
3430 .eraseblocks = { {1024 * 1024, 1} },
3431 .block_erase = spi_block_erase_60,
3432 }, {
3433 .eraseblocks = { {1024 * 1024, 1} },
3434 .block_erase = spi_block_erase_c7,
3435 }
3436 },
3437 .unlock = spi_disable_blockprotect,
3438 .write = spi_chip_write_256,
3439 .read = spi_chip_read,
3440 .wp = &wp_w25,
3441 },
3442
3443 {
3444 .vendor = "Eon",
3445 .name = "EN25Q32(A)(B)",
hailfingere1e41ea2011-07-27 07:13:06 +00003446 .bustype = BUS_SPI,
David Hendrickse185bf22011-05-24 15:34:18 -07003447 .manufacture_id = EON_ID_NOPREFIX,
3448 .model_id = EON_EN25Q32,
3449 .total_size = 4096,
3450 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08003451 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
David Hendrickse185bf22011-05-24 15:34:18 -07003452 .tested = TEST_UNTESTED,
3453 .probe = probe_spi_rdid,
3454 .probe_timing = TIMING_ZERO,
3455 .block_erasers =
3456 {
3457 {
3458 .eraseblocks = { {4 * 1024, 1024} },
3459 .block_erase = spi_block_erase_20,
3460 }, {
3461 .eraseblocks = { {64 * 1024, 64} },
3462 .block_erase = spi_block_erase_d8,
3463 }, {
3464 .eraseblocks = { {4 * 1024 * 1024, 1} },
3465 .block_erase = spi_block_erase_60,
3466 }, {
3467 .eraseblocks = { {4 * 1024 * 1024, 1} },
3468 .block_erase = spi_block_erase_c7,
3469 }
3470 },
3471 .unlock = spi_disable_blockprotect,
3472 .write = spi_chip_write_256,
3473 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00003474 .voltage = {2700, 3600},
David Hendrickse185bf22011-05-24 15:34:18 -07003475 .wp = &wp_w25,
3476 },
3477
3478 {
3479 .vendor = "Eon",
3480 .name = "EN25Q64",
hailfingere1e41ea2011-07-27 07:13:06 +00003481 .bustype = BUS_SPI,
David Hendrickse185bf22011-05-24 15:34:18 -07003482 .manufacture_id = EON_ID_NOPREFIX,
3483 .model_id = EON_EN25Q64,
3484 .total_size = 8192,
3485 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08003486 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
David Hendrickse185bf22011-05-24 15:34:18 -07003487 .tested = TEST_UNTESTED,
3488 .probe = probe_spi_rdid,
3489 .probe_timing = TIMING_ZERO,
3490 .block_erasers =
3491 {
3492 {
3493 .eraseblocks = { {4 * 1024, 2048} },
3494 .block_erase = spi_block_erase_20,
3495 }, {
3496 .eraseblocks = { {64 * 1024, 128} },
3497 .block_erase = spi_block_erase_d8,
3498 }, {
3499 .eraseblocks = { {8 * 1024 * 1024, 1} },
3500 .block_erase = spi_block_erase_60,
3501 }, {
3502 .eraseblocks = { {8 * 1024 * 1024, 1} },
3503 .block_erase = spi_block_erase_c7,
3504 }
3505 },
3506 .unlock = spi_disable_blockprotect,
3507 .write = spi_chip_write_256,
3508 .read = spi_chip_read,
3509 .wp = &wp_w25,
3510 },
3511
3512 {
3513 .vendor = "Eon",
3514 .name = "EN25Q128",
hailfingere1e41ea2011-07-27 07:13:06 +00003515 .bustype = BUS_SPI,
David Hendrickse185bf22011-05-24 15:34:18 -07003516 .manufacture_id = EON_ID_NOPREFIX,
3517 .model_id = EON_EN25Q128,
3518 .total_size = 16384,
3519 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08003520 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
David Hendrickse185bf22011-05-24 15:34:18 -07003521 .tested = TEST_UNTESTED,
3522 .probe = probe_spi_rdid,
3523 .probe_timing = TIMING_ZERO,
3524 .block_erasers =
3525 {
3526 {
3527 .eraseblocks = { {4 * 1024, 4096} },
3528 .block_erase = spi_block_erase_20,
3529 }, {
3530 .eraseblocks = { {64 * 1024, 256} },
3531 .block_erase = spi_block_erase_d8,
3532 }, {
3533 .eraseblocks = { {16 * 1024 * 1024, 1} },
3534 .block_erase = spi_block_erase_60,
3535 }, {
3536 .eraseblocks = { {16 * 1024 * 1024, 1} },
3537 .block_erase = spi_block_erase_c7,
3538 }
3539 },
3540 .unlock = spi_disable_blockprotect,
3541 .write = spi_chip_write_256,
3542 .read = spi_chip_read,
3543 .wp = &wp_w25,
stepanaa1b6a22008-12-08 18:15:10 +00003544 },
3545
hailfinger286829b2009-01-08 03:40:17 +00003546 {
snelson2b18d0f2010-03-05 08:44:11 +00003547 .vendor = "Eon",
stefanct5d10cff2011-07-24 22:21:57 +00003548 .name = "EN25Q40",
hailfingere1e41ea2011-07-27 07:13:06 +00003549 .bustype = BUS_SPI,
stefanct5d10cff2011-07-24 22:21:57 +00003550 .manufacture_id = EON_ID_NOPREFIX,
3551 .model_id = EON_EN25Q40,
3552 .total_size = 512,
3553 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07003554 /* OTP: 256B total; enter 0x3A */
3555 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
stefanct5d10cff2011-07-24 22:21:57 +00003556 .tested = TEST_UNTESTED,
3557 .probe = probe_spi_rdid,
3558 .probe_timing = TIMING_ZERO,
3559 .block_erasers =
3560 {
3561 {
3562 .eraseblocks = { {4 * 1024, 128} },
3563 .block_erase = spi_block_erase_20,
3564 }, {
3565 .eraseblocks = { {64 * 1024, 8} },
3566 .block_erase = spi_block_erase_d8,
3567 }, {
3568 .eraseblocks = { {512 * 1024, 1} },
3569 .block_erase = spi_block_erase_60,
3570 }, {
3571 .eraseblocks = { {512 * 1024, 1} },
3572 .block_erase = spi_block_erase_c7,
3573 }
3574 },
3575 .unlock = spi_disable_blockprotect,
3576 .write = spi_chip_write_256,
3577 .read = spi_chip_read,
3578 .voltage = {2700, 3600},
3579 },
3580
3581 {
3582 .vendor = "Eon",
3583 .name = "EN25Q80(A)",
hailfingere1e41ea2011-07-27 07:13:06 +00003584 .bustype = BUS_SPI,
stefanct5d10cff2011-07-24 22:21:57 +00003585 .manufacture_id = EON_ID_NOPREFIX,
3586 .model_id = EON_EN25Q80,
3587 .total_size = 1024,
3588 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07003589 /* OTP: 256B total; enter 0x3A */
3590 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
stefanct5d10cff2011-07-24 22:21:57 +00003591 .tested = TEST_UNTESTED,
3592 .probe = probe_spi_rdid,
3593 .probe_timing = TIMING_ZERO,
3594 .block_erasers =
3595 {
3596 {
3597 .eraseblocks = { {4 * 1024, 256} },
3598 .block_erase = spi_block_erase_20,
3599 }, {
3600 .eraseblocks = { {64 * 1024, 16} },
3601 .block_erase = spi_block_erase_d8,
3602 }, {
3603 .eraseblocks = { {1024 * 1024, 1} },
3604 .block_erase = spi_block_erase_60,
3605 }, {
3606 .eraseblocks = { {1024 * 1024, 1} },
3607 .block_erase = spi_block_erase_c7,
3608 }
3609 },
3610 .unlock = spi_disable_blockprotect,
3611 .write = spi_chip_write_256,
3612 .read = spi_chip_read,
3613 .voltage = {2700, 3600},
3614 },
3615
3616 {
3617 .vendor = "Eon",
3618 .name = "EN25Q32(A/B)",
hailfingere1e41ea2011-07-27 07:13:06 +00003619 .bustype = BUS_SPI,
stefanct5d10cff2011-07-24 22:21:57 +00003620 .manufacture_id = EON_ID_NOPREFIX,
3621 .model_id = EON_EN25Q32,
3622 .total_size = 4096,
3623 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07003624 /* OTP: 512B total; enter 0x3A */
3625 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
stefanct5d10cff2011-07-24 22:21:57 +00003626 .tested = TEST_UNTESTED,
3627 .probe = probe_spi_rdid,
3628 .probe_timing = TIMING_ZERO,
3629 .block_erasers =
3630 {
3631 {
3632 .eraseblocks = { {4 * 1024, 1024} },
3633 .block_erase = spi_block_erase_20,
3634 }, {
3635 .eraseblocks = { {64 * 1024, 64} },
3636 .block_erase = spi_block_erase_d8,
3637 }, {
3638 .eraseblocks = { {4 * 1024 * 1024, 1} },
3639 .block_erase = spi_block_erase_60,
3640 }, {
3641 .eraseblocks = { {4 * 1024 * 1024, 1} },
3642 .block_erase = spi_block_erase_c7,
3643 }
3644 },
3645 .unlock = spi_disable_blockprotect,
3646 .write = spi_chip_write_256,
3647 .read = spi_chip_read,
3648 .voltage = {2700, 3600},
3649 },
3650
3651 {
3652 .vendor = "Eon",
3653 .name = "EN25Q64",
hailfingere1e41ea2011-07-27 07:13:06 +00003654 .bustype = BUS_SPI,
stefanct5d10cff2011-07-24 22:21:57 +00003655 .manufacture_id = EON_ID_NOPREFIX,
3656 .model_id = EON_EN25Q64,
3657 .total_size = 8192,
3658 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07003659 /* OTP: 512B total; enter 0x3A */
3660 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
stefanct5d10cff2011-07-24 22:21:57 +00003661 .tested = TEST_UNTESTED,
3662 .probe = probe_spi_rdid,
3663 .probe_timing = TIMING_ZERO,
3664 .block_erasers =
3665 {
3666 {
3667 .eraseblocks = { {4 * 1024, 2048} },
3668 .block_erase = spi_block_erase_20,
3669 }, {
3670 .eraseblocks = { {64 * 1024, 128} },
3671 .block_erase = spi_block_erase_d8,
3672 }, {
3673 .eraseblocks = { {8 * 1024 * 1024, 1} },
3674 .block_erase = spi_block_erase_60,
3675 }, {
3676 .eraseblocks = { {8 * 1024 * 1024, 1} },
3677 .block_erase = spi_block_erase_c7,
3678 }
3679 },
3680 .unlock = spi_disable_blockprotect,
3681 .write = spi_chip_write_256,
3682 .read = spi_chip_read,
3683 .voltage = {2700, 3600},
3684 },
3685
3686 {
3687 .vendor = "Eon",
3688 .name = "EN25Q128",
hailfingere1e41ea2011-07-27 07:13:06 +00003689 .bustype = BUS_SPI,
stefanct5d10cff2011-07-24 22:21:57 +00003690 .manufacture_id = EON_ID_NOPREFIX,
3691 .model_id = EON_EN25Q128,
3692 .total_size = 16384,
3693 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07003694 /* OTP: 512B total; enter 0x3A */
3695 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
stefanct5d10cff2011-07-24 22:21:57 +00003696 .tested = TEST_UNTESTED,
3697 .probe = probe_spi_rdid,
3698 .probe_timing = TIMING_ZERO,
3699 .block_erasers =
3700 {
3701 {
3702 .eraseblocks = { {4 * 1024, 4096} },
3703 .block_erase = spi_block_erase_20,
3704 }, {
3705 .eraseblocks = { {64 * 1024, 256} },
3706 .block_erase = spi_block_erase_d8,
3707 }, {
3708 .eraseblocks = { {16 * 1024 * 1024, 1} },
3709 .block_erase = spi_block_erase_60,
3710 }, {
3711 .eraseblocks = { {16 * 1024 * 1024, 1} },
3712 .block_erase = spi_block_erase_c7,
3713 }
3714 },
3715 .unlock = spi_disable_blockprotect,
3716 .write = spi_chip_write_256,
3717 .read = spi_chip_read,
3718 },
3719
3720 {
3721 .vendor = "Eon",
3722 .name = "EN25QH16",
hailfingere1e41ea2011-07-27 07:13:06 +00003723 .bustype = BUS_SPI,
stefanct5d10cff2011-07-24 22:21:57 +00003724 .manufacture_id = EON_ID_NOPREFIX,
3725 .model_id = EON_EN25QH16,
3726 .total_size = 2048,
3727 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07003728 /* supports SFDP */
3729 /* OTP: 512B total; enter 0x3A */
3730 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
stefanct5d10cff2011-07-24 22:21:57 +00003731 .tested = TEST_UNTESTED,
3732 .probe = probe_spi_rdid,
3733 .probe_timing = TIMING_ZERO,
3734 .block_erasers =
3735 {
3736 {
3737 .eraseblocks = { {4 * 1024, 512} },
3738 .block_erase = spi_block_erase_20,
3739 }, {
3740 .eraseblocks = { {64 * 1024, 32} },
3741 .block_erase = spi_block_erase_d8,
3742 }, {
3743 .eraseblocks = { {1024 * 2048, 1} },
3744 .block_erase = spi_block_erase_60,
3745 }, {
3746 .eraseblocks = { {1024 * 2048, 1} },
3747 .block_erase = spi_block_erase_c7,
3748 }
3749 },
3750 .unlock = spi_disable_blockprotect,
3751 .write = spi_chip_write_256,
3752 .read = spi_chip_read,
3753 .voltage = {2700, 3600},
3754 },
Marc Jonesb2f90022014-04-29 17:37:23 -06003755 {
3756 .vendor = "Eon",
3757 .name = "EN25S64",
3758 .bustype = BUS_SPI,
3759 .manufacture_id = EON_ID_NOPREFIX,
3760 .model_id = EON_EN25S64,
3761 .total_size = 8192,
3762 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07003763 /* FIXME: add FEATURE_QPI removed */
Marc Jonesb2f90022014-04-29 17:37:23 -06003764 /* OTP: 512B total; enter 0x3A */
Stefan Tauner9816fc82016-08-12 15:47:49 -07003765 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
David Hendricks488cf072015-11-23 16:45:07 -08003766 .tested = TEST_OK_PREWU,
Marc Jonesb2f90022014-04-29 17:37:23 -06003767 .probe = probe_spi_rdid,
3768 .probe_timing = TIMING_ZERO,
3769 .block_erasers = {
3770 {
3771 .eraseblocks = { {4 * 1024, 2048} },
3772 .block_erase = spi_block_erase_20,
3773 }, {
3774 .eraseblocks = { {64 * 1024, 128} },
3775 .block_erase = spi_block_erase_d8,
3776 }, {
3777 .eraseblocks = { {8192 * 1024, 1} },
3778 .block_erase = spi_block_erase_60,
3779 }, {
3780 .eraseblocks = { {8192 * 1024, 1} },
3781 .block_erase = spi_block_erase_c7,
3782 }
3783 },
3784 .unlock = spi_disable_blockprotect,
3785 .write = spi_chip_write_256,
3786 .read = spi_chip_read,
3787 .voltage = {1650, 1950},
Marc Jones51c8a162014-05-06 15:02:14 -06003788 .wp = &wp_w25,
Marc Jonesb2f90022014-04-29 17:37:23 -06003789 },
stefanct5d10cff2011-07-24 22:21:57 +00003790
3791 {
3792 .vendor = "Eon",
snelson2b18d0f2010-03-05 08:44:11 +00003793 .name = "EN29F010",
hailfingere1e41ea2011-07-27 07:13:06 +00003794 .bustype = BUS_PARALLEL,
snelson2b18d0f2010-03-05 08:44:11 +00003795 .manufacture_id = EON_ID,
mhmd3c80cd2010-09-15 23:31:03 +00003796 .model_id = EON_EN29F010,
snelson2b18d0f2010-03-05 08:44:11 +00003797 .total_size = 128,
3798 .page_size = 128,
3799 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
hailfingerd217d122010-10-08 18:52:29 +00003800 .tested = TEST_OK_PRE,
snelson2b18d0f2010-03-05 08:44:11 +00003801 .probe = probe_jedec,
3802 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3803 .block_erasers =
3804 {
3805 {
3806 .eraseblocks = { {16 * 1024, 8} },
3807 .block_erase = erase_sector_jedec,
3808 },
3809 {
3810 .eraseblocks = { {128 * 1024, 1} },
3811 .block_erase = erase_chip_block_jedec,
3812 },
3813 },
3814 .write = write_jedec_1,
3815 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00003816 .voltage = {4500, 5500},
snelson2b18d0f2010-03-05 08:44:11 +00003817 },
3818
3819 {
hailfinger61958912010-07-28 22:20:20 +00003820 .vendor = "Eon",
stepanaa1b6a22008-12-08 18:15:10 +00003821 .name = "EN29F002(A)(N)B",
hailfingere1e41ea2011-07-27 07:13:06 +00003822 .bustype = BUS_PARALLEL,
stepanaa1b6a22008-12-08 18:15:10 +00003823 .manufacture_id = EON_ID,
mhmd3c80cd2010-09-15 23:31:03 +00003824 .model_id = EON_EN29F002B,
stepanaa1b6a22008-12-08 18:15:10 +00003825 .total_size = 256,
3826 .page_size = 256,
snelsonc6855342010-01-28 23:55:12 +00003827 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
stefanct98d917c2011-10-21 12:33:07 +00003828 .tested = TEST_OK_PREW,
stepanaa1b6a22008-12-08 18:15:10 +00003829 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00003830 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelson1c03aa12009-12-23 17:05:59 +00003831 .block_erasers =
3832 {
3833 {
Simon Glass8dc82732013-07-16 10:13:51 -06003834 .eraseblocks = {
snelson1c03aa12009-12-23 17:05:59 +00003835 {16 * 1024, 1},
mkarcher8dc09ff2010-03-13 23:47:09 +00003836 {8 * 1024, 2},
3837 {32 * 1024, 1},
3838 {64 * 1024, 3},
snelson1c03aa12009-12-23 17:05:59 +00003839 },
3840 .block_erase = erase_sector_jedec,
3841 }, {
3842 .eraseblocks = { {256 * 1024, 1} },
3843 .block_erase = erase_chip_block_jedec,
3844 },
3845 },
hailfingerfff99532009-11-27 17:49:42 +00003846 .write = write_jedec_1,
stepanaa1b6a22008-12-08 18:15:10 +00003847 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00003848 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00003849 },
3850
3851 {
hailfinger61958912010-07-28 22:20:20 +00003852 .vendor = "Eon",
stepanaa1b6a22008-12-08 18:15:10 +00003853 .name = "EN29F002(A)(N)T",
hailfingere1e41ea2011-07-27 07:13:06 +00003854 .bustype = BUS_PARALLEL,
stepanaa1b6a22008-12-08 18:15:10 +00003855 .manufacture_id = EON_ID,
mhmd3c80cd2010-09-15 23:31:03 +00003856 .model_id = EON_EN29F002T,
stepanaa1b6a22008-12-08 18:15:10 +00003857 .total_size = 256,
3858 .page_size = 256,
snelsonc6855342010-01-28 23:55:12 +00003859 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
hailfingerd217d122010-10-08 18:52:29 +00003860 .tested = TEST_OK_PR,
stepanaa1b6a22008-12-08 18:15:10 +00003861 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00003862 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelson1c03aa12009-12-23 17:05:59 +00003863 .block_erasers =
3864 {
3865 {
Simon Glass8dc82732013-07-16 10:13:51 -06003866 .eraseblocks = {
snelson1c03aa12009-12-23 17:05:59 +00003867 {64 * 1024, 3},
mkarcher8dc09ff2010-03-13 23:47:09 +00003868 {32 * 1024, 1},
3869 {8 * 1024, 2},
3870 {16 * 1024, 1},
snelson1c03aa12009-12-23 17:05:59 +00003871 },
3872 .block_erase = erase_sector_jedec,
3873 }, {
3874 .eraseblocks = { {256 * 1024, 1} },
3875 .block_erase = erase_chip_block_jedec,
3876 },
3877 },
hailfingerfff99532009-11-27 17:49:42 +00003878 .write = write_jedec_1,
stepanaa1b6a22008-12-08 18:15:10 +00003879 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00003880 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00003881 },
3882
3883 {
3884 .vendor = "Fujitsu",
3885 .name = "MBM29F004BC",
hailfingere1e41ea2011-07-27 07:13:06 +00003886 .bustype = BUS_PARALLEL,
stepanaa1b6a22008-12-08 18:15:10 +00003887 .manufacture_id = FUJITSU_ID,
mhmd3c80cd2010-09-15 23:31:03 +00003888 .model_id = FUJITSU_MBM29F004BC,
stepanaa1b6a22008-12-08 18:15:10 +00003889 .total_size = 512,
3890 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00003891 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
stepanaa1b6a22008-12-08 18:15:10 +00003892 .tested = TEST_UNTESTED,
3893 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00003894 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelson1c03aa12009-12-23 17:05:59 +00003895 .block_erasers =
3896 {
3897 {
Simon Glass8dc82732013-07-16 10:13:51 -06003898 .eraseblocks = {
snelson1c03aa12009-12-23 17:05:59 +00003899 {16 * 1024, 1},
3900 {8 * 1024, 2},
3901 {32 * 1024, 1},
3902 {64 * 1024, 7},
3903 },
snelsonc6855342010-01-28 23:55:12 +00003904 .block_erase = erase_sector_jedec,
snelson1c03aa12009-12-23 17:05:59 +00003905 }, {
3906 .eraseblocks = { {512 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +00003907 .block_erase = erase_chip_block_jedec,
snelson1c03aa12009-12-23 17:05:59 +00003908 },
3909 },
stepanaa1b6a22008-12-08 18:15:10 +00003910 .write = NULL,
3911 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00003912 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00003913 },
3914
3915 {
3916 .vendor = "Fujitsu",
3917 .name = "MBM29F004TC",
hailfingere1e41ea2011-07-27 07:13:06 +00003918 .bustype = BUS_PARALLEL,
stepanaa1b6a22008-12-08 18:15:10 +00003919 .manufacture_id = FUJITSU_ID,
mhmd3c80cd2010-09-15 23:31:03 +00003920 .model_id = FUJITSU_MBM29F004TC,
stepanaa1b6a22008-12-08 18:15:10 +00003921 .total_size = 512,
3922 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00003923 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
stepanaa1b6a22008-12-08 18:15:10 +00003924 .tested = TEST_UNTESTED,
3925 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00003926 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelson1c03aa12009-12-23 17:05:59 +00003927 .block_erasers =
3928 {
3929 {
Simon Glass8dc82732013-07-16 10:13:51 -06003930 .eraseblocks = {
snelson1c03aa12009-12-23 17:05:59 +00003931 {64 * 1024, 7},
3932 {32 * 1024, 1},
3933 {8 * 1024, 2},
3934 {16 * 1024, 1},
3935 },
snelsonc6855342010-01-28 23:55:12 +00003936 .block_erase = erase_sector_jedec,
snelson1c03aa12009-12-23 17:05:59 +00003937 }, {
3938 .eraseblocks = { {512 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +00003939 .block_erase = erase_chip_block_jedec,
snelson1c03aa12009-12-23 17:05:59 +00003940 },
3941 },
stepanaa1b6a22008-12-08 18:15:10 +00003942 .write = NULL,
3943 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00003944 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00003945 },
3946
3947 {
snelsonc6855342010-01-28 23:55:12 +00003948 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
stepanaa1b6a22008-12-08 18:15:10 +00003949 .vendor = "Fujitsu",
3950 .name = "MBM29F400BC",
hailfingere1e41ea2011-07-27 07:13:06 +00003951 .bustype = BUS_PARALLEL,
stepanaa1b6a22008-12-08 18:15:10 +00003952 .manufacture_id = FUJITSU_ID,
mhmd3c80cd2010-09-15 23:31:03 +00003953 .model_id = FUJITSU_MBM29F400BC,
stepanaa1b6a22008-12-08 18:15:10 +00003954 .total_size = 512,
3955 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00003956 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
hailfinger86bf3b52010-10-13 21:49:30 +00003957 .tested = TEST_UNTESTED,
stepanaa1b6a22008-12-08 18:15:10 +00003958 .probe = probe_m29f400bt,
uwe37f43422011-06-19 17:23:55 +00003959 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
snelson1c03aa12009-12-23 17:05:59 +00003960 .block_erasers =
3961 {
3962 {
Simon Glass8dc82732013-07-16 10:13:51 -06003963 .eraseblocks = {
snelson1c03aa12009-12-23 17:05:59 +00003964 {16 * 1024, 1},
3965 {8 * 1024, 2},
3966 {32 * 1024, 1},
3967 {64 * 1024, 7},
3968 },
3969 .block_erase = block_erase_m29f400bt,
3970 }, {
3971 .eraseblocks = { {512 * 1024, 1} },
3972 .block_erase = block_erase_chip_m29f400bt,
3973 },
3974 },
hailfinger86bf3b52010-10-13 21:49:30 +00003975 .write = write_m29f400bt,
stepanaa1b6a22008-12-08 18:15:10 +00003976 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +00003977 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
stepanaa1b6a22008-12-08 18:15:10 +00003978 },
3979
hailfinger286829b2009-01-08 03:40:17 +00003980 {
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07003981 .vendor = "GigaDevice",
3982 .name = "GD25Q20",
3983 .bustype = BUS_SPI,
3984 .manufacture_id = GIGADEVICE_ID,
3985 .model_id = GIGADEVICE_GD25Q20,
3986 .total_size = 256,
3987 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08003988 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07003989 .tested = TEST_UNTESTED,
3990 .probe = probe_spi_rdid,
3991 .probe_timing = TIMING_ZERO,
3992 .block_erasers =
3993 {
3994 {
3995 .eraseblocks = { {4 * 1024, 64} },
3996 .block_erase = spi_block_erase_20,
3997 }, {
3998 .eraseblocks = { {32 * 1024, 8} },
3999 .block_erase = spi_block_erase_52,
4000 }, {
4001 .eraseblocks = { {64 * 1024, 4} },
4002 .block_erase = spi_block_erase_d8,
4003 }, {
4004 .eraseblocks = { {256 * 1024, 1} },
4005 .block_erase = spi_block_erase_60,
4006 }, {
4007 .eraseblocks = { {256 * 1024, 1} },
4008 .block_erase = spi_block_erase_c7,
4009 }
4010 },
4011 .unlock = spi_disable_blockprotect,
4012 .write = spi_chip_write_256,
4013 .read = spi_chip_read,
4014 .voltage = {2700, 3600},
4015 },
4016
4017 {
4018 .vendor = "GigaDevice",
4019 .name = "GD25Q40",
4020 .bustype = BUS_SPI,
4021 .manufacture_id = GIGADEVICE_ID,
4022 .model_id = GIGADEVICE_GD25Q40,
4023 .total_size = 512,
4024 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08004025 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07004026 .tested = TEST_UNTESTED,
4027 .probe = probe_spi_rdid,
4028 .probe_timing = TIMING_ZERO,
4029 .block_erasers =
4030 {
4031 {
4032 .eraseblocks = { {4 * 1024, 128} },
4033 .block_erase = spi_block_erase_20,
4034 }, {
4035 .eraseblocks = { {32 * 1024, 16} },
4036 .block_erase = spi_block_erase_52,
4037 }, {
4038 .eraseblocks = { {64 * 1024, 8} },
4039 .block_erase = spi_block_erase_d8,
4040 }, {
4041 .eraseblocks = { {512 * 1024, 1} },
4042 .block_erase = spi_block_erase_60,
4043 }, {
4044 .eraseblocks = { {512 * 1024, 1} },
4045 .block_erase = spi_block_erase_c7,
4046 }
4047 },
4048 .unlock = spi_disable_blockprotect,
4049 .write = spi_chip_write_256,
4050 .read = spi_chip_read,
4051 .voltage = {2700, 3600},
4052 },
4053
4054 {
4055 .vendor = "GigaDevice",
David Schneider59543cd2016-04-27 02:11:00 -07004056 .name = "GD25LQ40",
4057 .bustype = BUS_SPI,
4058 .manufacture_id = GIGADEVICE_ID,
4059 .model_id = GIGADEVICE_GD25LQ40,
4060 .total_size = 512,
4061 .page_size = 256,
4062 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
4063 .tested = TEST_UNTESTED,
4064 .probe = probe_spi_rdid,
4065 .probe_timing = TIMING_ZERO,
4066 .block_erasers =
4067 {
4068 {
4069 .eraseblocks = { {4 * 1024, 128} },
4070 .block_erase = spi_block_erase_20,
4071 }, {
4072 .eraseblocks = { {32 * 1024, 16} },
4073 .block_erase = spi_block_erase_52,
4074 }, {
4075 .eraseblocks = { {64 * 1024, 8} },
4076 .block_erase = spi_block_erase_d8,
4077 }, {
4078 .eraseblocks = { {512 * 1024, 1} },
4079 .block_erase = spi_block_erase_60,
4080 }, {
4081 .eraseblocks = { {512 * 1024, 1} },
4082 .block_erase = spi_block_erase_c7,
4083 }
4084 },
4085 .unlock = spi_disable_blockprotect,
4086 .write = spi_chip_write_256,
4087 .read = spi_chip_read,
4088 .voltage = {1650, 1950},
4089 },
4090
4091 {
4092 .vendor = "GigaDevice",
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07004093 .name = "GD25Q80",
4094 .bustype = BUS_SPI,
4095 .manufacture_id = GIGADEVICE_ID,
4096 .model_id = GIGADEVICE_GD25Q80,
4097 .total_size = 1024,
4098 .page_size = 256,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07004099 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
Stefan Tauner9816fc82016-08-12 15:47:49 -07004100 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
David Hendricks488cf072015-11-23 16:45:07 -08004101 .tested = TEST_OK_PREWU,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07004102 .probe = probe_spi_rdid,
4103 .probe_timing = TIMING_ZERO,
4104 .block_erasers =
4105 {
4106 {
4107 .eraseblocks = { {4 * 1024, 256} },
4108 .block_erase = spi_block_erase_20,
4109 }, {
4110 .eraseblocks = { {32 * 1024, 32} },
4111 .block_erase = spi_block_erase_52,
4112 }, {
4113 .eraseblocks = { {64 * 1024, 16} },
4114 .block_erase = spi_block_erase_d8,
4115 }, {
4116 .eraseblocks = { {1024 * 1024, 1} },
4117 .block_erase = spi_block_erase_60,
4118 }, {
4119 .eraseblocks = { {1024 * 1024, 1} },
4120 .block_erase = spi_block_erase_c7,
4121 }
4122 },
4123 .unlock = spi_disable_blockprotect,
4124 .write = spi_chip_write_256,
4125 .read = spi_chip_read,
4126 .voltage = {2700, 3600},
4127 },
4128
4129 {
4130 .vendor = "GigaDevice",
4131 .name = "GD25Q16",
4132 .bustype = BUS_SPI,
4133 .manufacture_id = GIGADEVICE_ID,
4134 .model_id = GIGADEVICE_GD25Q16,
4135 .total_size = 2048,
4136 .page_size = 256,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07004137 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
Stefan Tauner9816fc82016-08-12 15:47:49 -07004138 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07004139 .tested = TEST_UNTESTED,
4140 .probe = probe_spi_rdid,
4141 .probe_timing = TIMING_ZERO,
4142 .block_erasers =
4143 {
4144 {
4145 .eraseblocks = { {4 * 1024, 512} },
4146 .block_erase = spi_block_erase_20,
4147 }, {
4148 .eraseblocks = { {32 * 1024, 64} },
4149 .block_erase = spi_block_erase_52,
4150 }, {
4151 .eraseblocks = { {64 * 1024, 32} },
4152 .block_erase = spi_block_erase_d8,
4153 }, {
4154 .eraseblocks = { {2 * 1024 * 1024, 1} },
4155 .block_erase = spi_block_erase_60,
4156 }, {
4157 .eraseblocks = { {2 * 1024 * 1024, 1} },
4158 .block_erase = spi_block_erase_c7,
4159 }
4160 },
4161 .unlock = spi_disable_blockprotect,
4162 .write = spi_chip_write_256,
4163 .read = spi_chip_read,
4164 .voltage = {2700, 3600},
4165 },
4166
4167 {
4168 .vendor = "GigaDevice",
4169 .name = "GD25Q32",
4170 .bustype = BUS_SPI,
4171 .manufacture_id = GIGADEVICE_ID,
4172 .model_id = GIGADEVICE_GD25Q32,
4173 .total_size = 4096,
4174 .page_size = 256,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07004175 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
Stefan Tauner9816fc82016-08-12 15:47:49 -07004176 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
David Hendricks488cf072015-11-23 16:45:07 -08004177 .tested = TEST_OK_PREWU,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07004178 .probe = probe_spi_rdid,
4179 .probe_timing = TIMING_ZERO,
4180 .block_erasers =
4181 {
4182 {
4183 .eraseblocks = { {4 * 1024, 1024} },
4184 .block_erase = spi_block_erase_20,
4185 }, {
4186 .eraseblocks = { {32 * 1024, 128} },
4187 .block_erase = spi_block_erase_52,
4188 }, {
4189 .eraseblocks = { {64 * 1024, 64} },
4190 .block_erase = spi_block_erase_d8,
4191 }, {
4192 .eraseblocks = { {4 * 1024 * 1024, 1} },
4193 .block_erase = spi_block_erase_60,
4194 }, {
4195 .eraseblocks = { {4 * 1024 * 1024, 1} },
4196 .block_erase = spi_block_erase_c7,
4197 }
4198 },
4199 .unlock = spi_disable_blockprotect,
4200 .write = spi_chip_write_256,
4201 .read = spi_chip_read,
David Hendricksaf3944a2014-07-28 18:37:40 -07004202 .wp = &wp_generic,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07004203 .voltage = {2700, 3600},
4204 },
4205
4206 {
4207 .vendor = "GigaDevice",
4208 .name = "GD25Q64",
4209 .bustype = BUS_SPI,
4210 .manufacture_id = GIGADEVICE_ID,
4211 .model_id = GIGADEVICE_GD25Q64,
4212 .total_size = 8192,
4213 .page_size = 256,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07004214 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
Stefan Tauner9816fc82016-08-12 15:47:49 -07004215 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
David Hendricks488cf072015-11-23 16:45:07 -08004216 .tested = TEST_OK_PREWU,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07004217 .probe = probe_spi_rdid,
4218 .probe_timing = TIMING_ZERO,
4219 .block_erasers =
4220 {
4221 {
4222 .eraseblocks = { {4 * 1024, 2048} },
4223 .block_erase = spi_block_erase_20,
4224 }, {
4225 .eraseblocks = { {32 * 1024, 256} },
4226 .block_erase = spi_block_erase_52,
4227 }, {
4228 .eraseblocks = { {64 * 1024, 128} },
4229 .block_erase = spi_block_erase_d8,
4230 }, {
4231 .eraseblocks = { {8 * 1024 * 1024, 1} },
4232 .block_erase = spi_block_erase_60,
4233 }, {
4234 .eraseblocks = { {8 * 1024 * 1024, 1} },
4235 .block_erase = spi_block_erase_c7,
4236 }
4237 },
4238 .unlock = spi_disable_blockprotect,
4239 .write = spi_chip_write_256,
4240 .read = spi_chip_read,
4241 .wp = &wp_w25,
4242 },
4243
4244 {
David Hendricksf5c122d2016-03-14 15:46:04 -07004245 /*
Stefan Tauner9816fc82016-08-12 15:47:49 -07004246 * TODO: There is a GD25Q128B without QPI support which can
4247 * be differentiated using SFDP, but for now we only care
4248 * about the GD25Q128C.
David Hendricksf5c122d2016-03-14 15:46:04 -07004249 */
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07004250 .vendor = "GigaDevice",
Martin Roth4216ba32017-05-10 21:20:47 -06004251 .name = "GD25Q127C/GD25Q128C",
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07004252 .bustype = BUS_SPI,
4253 .manufacture_id = GIGADEVICE_ID,
4254 .model_id = GIGADEVICE_GD25Q128,
4255 .total_size = 16384,
4256 .page_size = 256,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07004257 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
Stefan Tauner9816fc82016-08-12 15:47:49 -07004258 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
David Hendricksf5c122d2016-03-14 15:46:04 -07004259 .tested = TEST_OK_PREWU,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07004260 .probe = probe_spi_rdid,
4261 .probe_timing = TIMING_ZERO,
4262 .block_erasers =
4263 {
4264 {
4265 .eraseblocks = { {4 * 1024, 4096} },
4266 .block_erase = spi_block_erase_20,
4267 }, {
4268 .eraseblocks = { {32 * 1024, 512} },
4269 .block_erase = spi_block_erase_52,
4270 }, {
4271 .eraseblocks = { {64 * 1024, 256} },
4272 .block_erase = spi_block_erase_d8,
4273 }, {
4274 .eraseblocks = { {16 * 1024 * 1024, 1} },
4275 .block_erase = spi_block_erase_60,
4276 }, {
4277 .eraseblocks = { {16 * 1024 * 1024, 1} },
4278 .block_erase = spi_block_erase_c7,
4279 }
4280 },
4281 .unlock = spi_disable_blockprotect,
4282 .write = spi_chip_write_256,
4283 .read = spi_chip_read,
Martin Roth95785bd2017-05-09 23:47:20 -06004284 .wp = &wp_w25,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07004285 },
4286
4287 {
hailfinger286829b2009-01-08 03:40:17 +00004288 .vendor = "Fujitsu",
4289 .name = "MBM29F400TC",
hailfingere1e41ea2011-07-27 07:13:06 +00004290 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00004291 .manufacture_id = FUJITSU_ID,
mhmd3c80cd2010-09-15 23:31:03 +00004292 .model_id = FUJITSU_MBM29F400TC,
hailfinger286829b2009-01-08 03:40:17 +00004293 .total_size = 512,
4294 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00004295 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
hailfinger286829b2009-01-08 03:40:17 +00004296 .tested = TEST_UNTESTED,
4297 .probe = probe_m29f400bt,
uwe37f43422011-06-19 17:23:55 +00004298 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
snelson1c03aa12009-12-23 17:05:59 +00004299 .block_erasers =
4300 {
4301 {
Simon Glass8dc82732013-07-16 10:13:51 -06004302 .eraseblocks = {
snelson1c03aa12009-12-23 17:05:59 +00004303 {64 * 1024, 7},
4304 {32 * 1024, 1},
4305 {8 * 1024, 2},
4306 {16 * 1024, 1},
4307 },
4308 .block_erase = block_erase_m29f400bt,
4309 }, {
4310 .eraseblocks = { {512 * 1024, 1} },
4311 .block_erase = block_erase_chip_m29f400bt,
4312 },
4313 },
hailfingerfa513302010-07-16 22:07:20 +00004314 .write = write_m29f400bt,
hailfinger23060112009-05-08 12:49:03 +00004315 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +00004316 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
stepanaa1b6a22008-12-08 18:15:10 +00004317 },
4318
hailfinger286829b2009-01-08 03:40:17 +00004319 {
Bryan Freed9a0051f2012-05-22 16:06:09 -07004320 .vendor = "GigaDevice",
4321 .name = "GD25LQ32",
4322 .bustype = BUS_SPI,
4323 .manufacture_id = GIGADEVICE_ID,
4324 .model_id = GIGADEVICE_GD25LQ32,
4325 .total_size = 4096,
4326 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08004327 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
4328 .tested = TEST_OK_PREWU,
Bryan Freed9a0051f2012-05-22 16:06:09 -07004329 .probe = probe_spi_rdid,
4330 .probe_timing = TIMING_ZERO,
4331 .block_erasers =
4332 {
4333 {
4334 .eraseblocks = { {4 * 1024, 1024} },
4335 .block_erase = spi_block_erase_20,
4336 }, {
4337 .eraseblocks = { {32 * 1024, 128} },
4338 .block_erase = spi_block_erase_52,
4339 }, {
4340 .eraseblocks = { {64 * 1024, 64} },
4341 .block_erase = spi_block_erase_d8,
4342 }, {
4343 .eraseblocks = { {4 * 1024 * 1024, 1} },
4344 .block_erase = spi_block_erase_60,
4345 }, {
4346 .eraseblocks = { {4 * 1024 * 1024, 1} },
4347 .block_erase = spi_block_erase_c7,
4348 }
4349 },
4350 .unlock = spi_disable_blockprotect,
4351 .write = spi_chip_write_256,
4352 .read = spi_chip_read,
4353 .voltage = {1700, 1950},
4354 .wp = &wp_w25,
4355 },
4356
4357 {
Marc Jonesb18734f2014-04-03 16:19:47 -06004358 .vendor = "GigaDevice",
4359 .name = "GD25LQ64",
4360 .bustype = BUS_SPI,
4361 .manufacture_id = GIGADEVICE_ID,
4362 .model_id = GIGADEVICE_GD25LQ64,
4363 .total_size = 8192,
4364 .page_size = 256,
Marc Jonesb18734f2014-04-03 16:19:47 -06004365 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
Stefan Tauner9816fc82016-08-12 15:47:49 -07004366 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
David Hendricks488cf072015-11-23 16:45:07 -08004367 .tested = TEST_OK_PREWU,
Marc Jonesb18734f2014-04-03 16:19:47 -06004368 .probe = probe_spi_rdid,
4369 .probe_timing = TIMING_ZERO,
4370 .block_erasers =
4371 {
4372 {
4373 .eraseblocks = { {4 * 1024, 2048} },
4374 .block_erase = spi_block_erase_20,
4375 }, {
4376 .eraseblocks = { {32 * 1024, 256} },
4377 .block_erase = spi_block_erase_52,
4378 }, {
4379 .eraseblocks = { {64 * 1024, 128} },
4380 .block_erase = spi_block_erase_d8,
4381 }, {
4382 .eraseblocks = { {8 * 1024 * 1024, 1} },
4383 .block_erase = spi_block_erase_60,
4384 }, {
4385 .eraseblocks = { {8 * 1024 * 1024, 1} },
4386 .block_erase = spi_block_erase_c7,
4387 }
4388 },
4389 .unlock = spi_disable_blockprotect,
4390 .write = spi_chip_write_256,
4391 .read = spi_chip_read,
4392 .wp = &wp_w25,
4393 },
4394
Furquan Shaikh62cd8102016-07-17 23:04:06 -07004395 {
4396 .vendor = "GigaDevice",
Aaron Durbin6c957d72018-08-20 09:31:01 -06004397 .name = "GD25LQ128C/GD25LQ128D",
Furquan Shaikh62cd8102016-07-17 23:04:06 -07004398 .bustype = BUS_SPI,
4399 .manufacture_id = GIGADEVICE_ID,
Aaron Durbin6c957d72018-08-20 09:31:01 -06004400 .model_id = GIGADEVICE_GD25LQ128CD,
Furquan Shaikh62cd8102016-07-17 23:04:06 -07004401 .total_size = 16384,
4402 .page_size = 256,
4403 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
4404 .tested = TEST_OK_PREWU,
4405 .probe = probe_spi_rdid,
4406 .probe_timing = TIMING_ZERO,
4407 .block_erasers =
4408 {
4409 {
4410 .eraseblocks = { {4 * 1024, 4096} },
4411 .block_erase = spi_block_erase_20,
4412 }, {
4413 .eraseblocks = { {32 * 1024, 512} },
4414 .block_erase = spi_block_erase_52,
4415 }, {
4416 .eraseblocks = { {64 * 1024, 256} },
4417 .block_erase = spi_block_erase_d8,
4418 }, {
4419 .eraseblocks = { {16 * 1024 * 1024, 1} },
4420 .block_erase = spi_block_erase_60,
4421 }, {
4422 .eraseblocks = { {16 * 1024 * 1024, 1} },
4423 .block_erase = spi_block_erase_c7,
4424 }
4425 },
4426 .unlock = spi_disable_blockprotect,
4427 .write = spi_chip_write_256,
4428 .read = spi_chip_read,
4429 .wp = &wp_generic,
4430 },
4431
Marc Jonesb18734f2014-04-03 16:19:47 -06004432 {
hailfingerc6950ad2010-06-21 16:12:22 +00004433 .vendor = "Hyundai",
4434 .name = "HY29F002T",
hailfingere1e41ea2011-07-27 07:13:06 +00004435 .bustype = BUS_PARALLEL,
hailfingerc6950ad2010-06-21 16:12:22 +00004436 .manufacture_id = HYUNDAI_ID,
mhmd3c80cd2010-09-15 23:31:03 +00004437 .model_id = HYUNDAI_HY29F002T,
hailfingerc6950ad2010-06-21 16:12:22 +00004438 .total_size = 256,
4439 .page_size = 256 * 1024,
4440 .feature_bits = FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */
hailfingerd217d122010-10-08 18:52:29 +00004441 .tested = TEST_OK_PRE,
hailfingerc6950ad2010-06-21 16:12:22 +00004442 .probe = probe_jedec,
4443 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
4444 .block_erasers =
4445 {
4446 {
4447 .eraseblocks = {
4448 {64 * 1024, 3},
4449 {32 * 1024, 1},
4450 {8 * 1024, 2},
4451 {16 * 1024, 1},
4452 },
4453 .block_erase = erase_sector_jedec,
4454 }, {
4455 .eraseblocks = { {256 * 1024, 1} },
4456 .block_erase = erase_chip_block_jedec,
4457 },
4458 },
4459 .write = write_jedec_1,
4460 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +00004461 .voltage = {4750, 5250}, /* 4.75-5.25V for type -45, others 4.5-5.5V */
hailfingerc6950ad2010-06-21 16:12:22 +00004462 },
4463
4464 {
4465 .vendor = "Hyundai",
4466 .name = "HY29F002B",
hailfingere1e41ea2011-07-27 07:13:06 +00004467 .bustype = BUS_PARALLEL,
hailfingerc6950ad2010-06-21 16:12:22 +00004468 .manufacture_id = HYUNDAI_ID,
mhmd3c80cd2010-09-15 23:31:03 +00004469 .model_id = HYUNDAI_HY29F002B,
hailfingerc6950ad2010-06-21 16:12:22 +00004470 .total_size = 256,
4471 .page_size = 256 * 1024,
4472 .feature_bits = FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */
4473 .tested = TEST_UNTESTED,
4474 .probe = probe_jedec,
4475 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
4476 .block_erasers =
4477 {
4478 {
4479 .eraseblocks = {
4480 {16 * 1024, 1},
4481 {8 * 1024, 2},
4482 {32 * 1024, 1},
4483 {64 * 1024, 3},
4484 },
4485 .block_erase = erase_sector_jedec,
4486 }, {
4487 .eraseblocks = { {256 * 1024, 1} },
4488 .block_erase = erase_chip_block_jedec,
4489 },
4490 },
4491 .write = write_jedec_1,
4492 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +00004493 .voltage = {4750, 5250}, /* 4.75-5.25V for type -45, others 4.5-5.5V */
hailfingerc6950ad2010-06-21 16:12:22 +00004494 },
4495
4496 {
mhme8e87912010-09-16 00:51:51 +00004497 .vendor = "Hyundai",
4498 .name = "HY29F040A",
hailfingere1e41ea2011-07-27 07:13:06 +00004499 .bustype = BUS_PARALLEL,
mhme8e87912010-09-16 00:51:51 +00004500 .manufacture_id = HYUNDAI_ID,
4501 .model_id = HYUNDAI_HY29F040A,
4502 .total_size = 512,
4503 .page_size = 64 * 1024,
4504 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
4505 .tested = TEST_UNTESTED,
4506 .probe = probe_jedec,
4507 .probe_timing = TIMING_ZERO,
4508 .block_erasers =
4509 {
4510 {
4511 .eraseblocks = { {64 * 1024, 8} },
4512 .block_erase = erase_sector_jedec,
4513 }, {
4514 .eraseblocks = { {512 * 1024, 1} },
4515 .block_erase = erase_chip_block_jedec,
4516 },
4517 },
4518 .write = write_jedec_1,
4519 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +00004520 .voltage = {4500, 5500},
mhme8e87912010-09-16 00:51:51 +00004521 },
4522
4523 {
hailfinger286829b2009-01-08 03:40:17 +00004524 .vendor = "Intel",
mhm54b83562010-10-05 20:28:36 +00004525 .name = "28F001BN/BX-B",
hailfingere1e41ea2011-07-27 07:13:06 +00004526 .bustype = BUS_PARALLEL,
hailfingerd4d97b92009-05-29 12:55:31 +00004527 .manufacture_id = INTEL_ID,
mhm54b83562010-10-05 20:28:36 +00004528 .model_id = INTEL_28F001B,
hailfingerd4d97b92009-05-29 12:55:31 +00004529 .total_size = 128,
4530 .page_size = 128 * 1024, /* 8k + 2x4k + 112k */
snelsona013bf62010-03-22 04:39:31 +00004531 .tested = TEST_UNTESTED,
hailfingerd4d97b92009-05-29 12:55:31 +00004532 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00004533 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelson2d471072010-01-09 05:30:14 +00004534 .block_erasers =
4535 {
4536 {
Simon Glass8dc82732013-07-16 10:13:51 -06004537 .eraseblocks = {
snelson2d471072010-01-09 05:30:14 +00004538 {8 * 1024, 1},
4539 {4 * 1024, 2},
4540 {112 * 1024, 1},
4541 },
snelsonc0acbeb2010-03-19 18:47:06 +00004542 .block_erase = erase_block_82802ab,
snelson2d471072010-01-09 05:30:14 +00004543 },
4544 },
snelsona013bf62010-03-22 04:39:31 +00004545 .write = write_82802ab,
hailfingerd4d97b92009-05-29 12:55:31 +00004546 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00004547 .voltage = {4500, 5500},
hailfingerd4d97b92009-05-29 12:55:31 +00004548 },
4549
4550 {
4551 .vendor = "Intel",
mhm54b83562010-10-05 20:28:36 +00004552 .name = "28F001BN/BX-T",
hailfingere1e41ea2011-07-27 07:13:06 +00004553 .bustype = BUS_PARALLEL,
hailfingerd4d97b92009-05-29 12:55:31 +00004554 .manufacture_id = INTEL_ID,
mhm54b83562010-10-05 20:28:36 +00004555 .model_id = INTEL_28F001T,
hailfingerd4d97b92009-05-29 12:55:31 +00004556 .total_size = 128,
4557 .page_size = 128 * 1024, /* 112k + 2x4k + 8k */
stefanctd6efe1a2011-09-03 11:22:27 +00004558 .tested = TEST_OK_PR,
hailfingerd4d97b92009-05-29 12:55:31 +00004559 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00004560 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelson2d471072010-01-09 05:30:14 +00004561 .block_erasers =
4562 {
4563 {
stefanctd6efe1a2011-09-03 11:22:27 +00004564 .eraseblocks = {
snelson2d471072010-01-09 05:30:14 +00004565 {112 * 1024, 1},
4566 {4 * 1024, 2},
4567 {8 * 1024, 1},
4568 },
snelsonc0acbeb2010-03-19 18:47:06 +00004569 .block_erase = erase_block_82802ab,
snelson2d471072010-01-09 05:30:14 +00004570 },
4571 },
snelsona013bf62010-03-22 04:39:31 +00004572 .write = write_82802ab,
hailfingerd4d97b92009-05-29 12:55:31 +00004573 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00004574 .voltage = {4500, 5500},
hailfingerd4d97b92009-05-29 12:55:31 +00004575 },
4576
4577 {
4578 .vendor = "Intel",
mhm54b83562010-10-05 20:28:36 +00004579 .name = "28F002BC/BL/BV/BX-T",
hailfingere1e41ea2011-07-27 07:13:06 +00004580 .bustype = BUS_PARALLEL,
hailfingerf1f559e2010-07-22 15:20:43 +00004581 .manufacture_id = INTEL_ID,
mhm54b83562010-10-05 20:28:36 +00004582 .model_id = INTEL_28F002T,
hailfingerf1f559e2010-07-22 15:20:43 +00004583 .total_size = 256,
4584 .page_size = 256 * 1024,
hailfingerd217d122010-10-08 18:52:29 +00004585 .tested = TEST_OK_PRE,
hailfingerf1f559e2010-07-22 15:20:43 +00004586 .probe = probe_82802ab,
4587 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
4588 .block_erasers =
4589 {
4590 {
4591 .eraseblocks = {
4592 {128 * 1024, 1},
4593 {96 * 1024, 1},
4594 {8 * 1024, 2},
4595 {16 * 1024, 1},
4596 },
4597 .block_erase = erase_block_82802ab,
4598 },
4599 },
4600 .write = write_82802ab,
4601 .read = read_memmapped,
4602 },
4603
4604 {
4605 .vendor = "Intel",
mhm54b83562010-10-05 20:28:36 +00004606 .name = "28F008S3/S5/SC",
hailfingere1e41ea2011-07-27 07:13:06 +00004607 .bustype = BUS_PARALLEL,
snelsonee09b3d2010-02-13 18:41:53 +00004608 .manufacture_id = INTEL_ID,
mhm54b83562010-10-05 20:28:36 +00004609 .model_id = INTEL_28F004S3,
snelsonee09b3d2010-02-13 18:41:53 +00004610 .total_size = 512,
4611 .page_size = 256,
4612 .tested = TEST_UNTESTED,
4613 .probe = probe_82802ab,
4614 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelsonee09b3d2010-02-13 18:41:53 +00004615 .block_erasers =
4616 {
4617 {
4618 .eraseblocks = { {64 * 1024, 8} },
snelsonc0acbeb2010-03-19 18:47:06 +00004619 .block_erase = erase_block_82802ab,
snelsonee09b3d2010-02-13 18:41:53 +00004620 },
4621 },
snelsona013bf62010-03-22 04:39:31 +00004622 .unlock = unlock_28f004s5,
snelsonee09b3d2010-02-13 18:41:53 +00004623 .write = write_82802ab,
4624 .read = read_memmapped,
4625 },
4626
4627 {
4628 .vendor = "Intel",
mhm54b83562010-10-05 20:28:36 +00004629 .name = "28F004B5/BE/BV/BX-B",
hailfingere1e41ea2011-07-27 07:13:06 +00004630 .bustype = BUS_PARALLEL,
mkarcher9ded5fe2010-04-03 10:27:08 +00004631 .manufacture_id = INTEL_ID,
mhm54b83562010-10-05 20:28:36 +00004632 .model_id = INTEL_28F004B,
mkarcher9ded5fe2010-04-03 10:27:08 +00004633 .total_size = 512,
4634 .page_size = 128 * 1024, /* maximal block size */
4635 .tested = TEST_UNTESTED,
4636 .probe = probe_82802ab,
4637 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
4638 .block_erasers =
4639 {
4640 {
Simon Glass8dc82732013-07-16 10:13:51 -06004641 .eraseblocks = {
mkarcher9ded5fe2010-04-03 10:27:08 +00004642 {16 * 1024, 1},
4643 {8 * 1024, 2},
4644 {96 * 1024, 1},
4645 {128 * 1024, 3},
4646 },
4647 .block_erase = erase_block_82802ab,
4648 },
4649 },
4650 .write = write_82802ab,
4651 .read = read_memmapped,
4652 },
4653
4654 {
4655 .vendor = "Intel",
mhm54b83562010-10-05 20:28:36 +00004656 .name = "28F004B5/BE/BV/BX-T",
hailfingere1e41ea2011-07-27 07:13:06 +00004657 .bustype = BUS_PARALLEL,
mkarcher9ded5fe2010-04-03 10:27:08 +00004658 .manufacture_id = INTEL_ID,
mhm54b83562010-10-05 20:28:36 +00004659 .model_id = INTEL_28F004T,
mkarcher9ded5fe2010-04-03 10:27:08 +00004660 .total_size = 512,
4661 .page_size = 128 * 1024, /* maximal block size */
4662 .tested = TEST_UNTESTED,
4663 .probe = probe_82802ab,
4664 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
4665 .block_erasers =
4666 {
4667 {
Simon Glass8dc82732013-07-16 10:13:51 -06004668 .eraseblocks = {
mkarcher9ded5fe2010-04-03 10:27:08 +00004669 {128 * 1024, 3},
4670 {96 * 1024, 1},
4671 {8 * 1024, 2},
4672 {16 * 1024, 1},
4673 },
4674 .block_erase = erase_block_82802ab,
4675 },
4676 },
4677 .write = write_82802ab,
4678 .read = read_memmapped,
4679 },
4680
4681 {
4682 .vendor = "Intel",
mhm54b83562010-10-05 20:28:36 +00004683 .name = "28F400BV/BX/CE/CV-B",
hailfingere1e41ea2011-07-27 07:13:06 +00004684 .bustype = BUS_PARALLEL,
mkarcher9ded5fe2010-04-03 10:27:08 +00004685 .manufacture_id = INTEL_ID,
mhm54b83562010-10-05 20:28:36 +00004686 .model_id = INTEL_28F400B,
mkarcher9ded5fe2010-04-03 10:27:08 +00004687 .total_size = 512,
4688 .page_size = 128 * 1024, /* maximal block size */
4689 .feature_bits = FEATURE_ADDR_SHIFTED,
4690 .tested = TEST_UNTESTED,
4691 .probe = probe_82802ab,
4692 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
4693 .block_erasers =
4694 {
4695 {
Simon Glass8dc82732013-07-16 10:13:51 -06004696 .eraseblocks = {
mkarcher9ded5fe2010-04-03 10:27:08 +00004697 {16 * 1024, 1},
4698 {8 * 1024, 2},
4699 {96 * 1024, 1},
4700 {128 * 1024, 3},
4701 },
4702 .block_erase = erase_block_82802ab,
4703 },
4704 },
4705 .write = write_82802ab,
4706 .read = read_memmapped,
4707 },
4708
4709 {
4710 .vendor = "Intel",
mhm54b83562010-10-05 20:28:36 +00004711 .name = "28F400BV/BX/CE/CV-T",
hailfingere1e41ea2011-07-27 07:13:06 +00004712 .bustype = BUS_PARALLEL,
mkarcher9ded5fe2010-04-03 10:27:08 +00004713 .manufacture_id = INTEL_ID,
mhm54b83562010-10-05 20:28:36 +00004714 .model_id = INTEL_28F400T,
mkarcher9ded5fe2010-04-03 10:27:08 +00004715 .total_size = 512,
4716 .page_size = 128 * 1024, /* maximal block size */
4717 .feature_bits = FEATURE_ADDR_SHIFTED,
4718 .tested = TEST_UNTESTED,
4719 .probe = probe_82802ab,
4720 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
4721 .block_erasers =
4722 {
4723 {
Simon Glass8dc82732013-07-16 10:13:51 -06004724 .eraseblocks = {
mkarcher9ded5fe2010-04-03 10:27:08 +00004725 {128 * 1024, 3},
4726 {96 * 1024, 1},
4727 {8 * 1024, 2},
4728 {16 * 1024, 1},
4729 },
4730 .block_erase = erase_block_82802ab,
4731 },
4732 },
4733 .write = write_82802ab,
4734 .read = read_memmapped,
4735 },
4736
4737 {
4738 .vendor = "Intel",
hailfinger286829b2009-01-08 03:40:17 +00004739 .name = "82802AB",
hailfingere1e41ea2011-07-27 07:13:06 +00004740 .bustype = BUS_FWH,
hailfinger286829b2009-01-08 03:40:17 +00004741 .manufacture_id = INTEL_ID,
mhm54b83562010-10-05 20:28:36 +00004742 .model_id = INTEL_82802AB,
hailfinger286829b2009-01-08 03:40:17 +00004743 .total_size = 512,
4744 .page_size = 64 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00004745 .feature_bits = FEATURE_REGISTERMAP,
stefanct312d9ff2011-06-12 19:47:55 +00004746 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00004747 .probe = probe_82802ab,
hailfingere3095d92009-06-05 13:46:17 +00004748 .probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
snelson2d471072010-01-09 05:30:14 +00004749 .block_erasers =
4750 {
4751 {
4752 .eraseblocks = { {64 * 1024, 8} },
snelsonc0acbeb2010-03-19 18:47:06 +00004753 .block_erase = erase_block_82802ab,
snelson2d471072010-01-09 05:30:14 +00004754 },
4755 },
snelsonc0acbeb2010-03-19 18:47:06 +00004756 .unlock = unlock_82802ab,
hailfinger286829b2009-01-08 03:40:17 +00004757 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00004758 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00004759 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00004760 },
4761
hailfinger286829b2009-01-08 03:40:17 +00004762 {
4763 .vendor = "Intel",
4764 .name = "82802AC",
hailfingere1e41ea2011-07-27 07:13:06 +00004765 .bustype = BUS_FWH,
hailfinger286829b2009-01-08 03:40:17 +00004766 .manufacture_id = INTEL_ID,
mhm54b83562010-10-05 20:28:36 +00004767 .model_id = INTEL_82802AC,
hailfinger286829b2009-01-08 03:40:17 +00004768 .total_size = 1024,
4769 .page_size = 64 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00004770 .feature_bits = FEATURE_REGISTERMAP,
snelsonc0acbeb2010-03-19 18:47:06 +00004771 .tested = TEST_OK_PR,
hailfinger286829b2009-01-08 03:40:17 +00004772 .probe = probe_82802ab,
hailfingere3095d92009-06-05 13:46:17 +00004773 .probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
snelson2d471072010-01-09 05:30:14 +00004774 .block_erasers =
4775 {
4776 {
4777 .eraseblocks = { {64 * 1024, 16} },
snelsonc0acbeb2010-03-19 18:47:06 +00004778 .block_erase = erase_block_82802ab,
snelson2d471072010-01-09 05:30:14 +00004779 },
4780 },
snelsonc0acbeb2010-03-19 18:47:06 +00004781 .unlock = unlock_82802ab,
hailfinger286829b2009-01-08 03:40:17 +00004782 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00004783 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00004784 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00004785 },
4786
hailfinger286829b2009-01-08 03:40:17 +00004787 {
4788 .vendor = "Macronix",
Vic Yang848bfd12018-03-23 10:24:07 -07004789 .name = "MX25L25635F",
4790 .bustype = BUS_SPI,
4791 .manufacture_id = MACRONIX_ID,
4792 .model_id = MACRONIX_MX25L25635F,
4793 .total_size = 32768,
4794 .page_size = 256,
4795 .feature_bits =
4796 FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_4BA_SUPPORT,
4797 .four_bytes_addr_funcs =
4798 {
4799 .set_4ba = spi_enter_4ba_b7,
4800 .read_nbyte = spi_nbyte_read_4ba_direct,
4801 .program_byte = spi_byte_program_4ba_direct,
4802 .program_nbyte = spi_nbyte_program_4ba_direct
4803 },
4804 .tested = TEST_UNTESTED,
4805 .probe = probe_spi_rdid,
4806 .probe_timing = TIMING_ZERO,
4807 .block_erasers =
4808 {
4809 {
4810 .eraseblocks = { {4 * 1024, 8192} },
4811 .block_erase = spi_block_erase_21_4ba_direct,
4812 }, {
4813 .eraseblocks = { {32 * 1024, 1024} },
4814 .block_erase = spi_block_erase_5c_4ba_direct,
4815 }, {
4816 .eraseblocks = { {64 * 1024, 512} },
4817 .block_erase = spi_block_erase_dc_4ba_direct,
4818 }, {
4819 .eraseblocks = { {32768 * 1024, 1} },
4820 .block_erase = spi_block_erase_60,
4821 }, {
4822 .eraseblocks = { {32768 * 1024, 1} },
4823 .block_erase = spi_block_erase_c7,
4824 },
4825 },
4826 .unlock = spi_disable_blockprotect,
4827 .write = spi_chip_write_256,
4828 .read = spi_chip_read,
4829 .voltage = {2700, 3600},
4830 .wp = &wp_generic,
4831 },
4832
4833 {
4834 .vendor = "Macronix",
Vincent Palatina699d262013-02-28 14:31:12 -08004835 .name = "MX25L512(E)/MX25V512(C)",
hailfingere1e41ea2011-07-27 07:13:06 +00004836 .bustype = BUS_SPI,
mhmd3c80cd2010-09-15 23:31:03 +00004837 .manufacture_id = MACRONIX_ID,
4838 .model_id = MACRONIX_MX25L512,
hailfinger286829b2009-01-08 03:40:17 +00004839 .total_size = 64,
4840 .page_size = 256,
Vincent Palatina699d262013-02-28 14:31:12 -08004841 /* MX25L512E supports SFDP */
David Hendricks488cf072015-11-23 16:45:07 -08004842 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00004843 .tested = TEST_UNTESTED,
4844 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00004845 .probe_timing = TIMING_ZERO,
hailfinger7df21362009-09-05 02:30:58 +00004846 .block_erasers =
4847 {
4848 {
4849 .eraseblocks = { {4 * 1024, 16} },
4850 .block_erase = spi_block_erase_20,
hailfinger91cf1032009-10-01 13:15:01 +00004851 }, {
hailfinger7df21362009-09-05 02:30:58 +00004852 .eraseblocks = { {64 * 1024, 1} },
4853 .block_erase = spi_block_erase_52,
hailfinger91cf1032009-10-01 13:15:01 +00004854 }, {
hailfinger7df21362009-09-05 02:30:58 +00004855 .eraseblocks = { {64 * 1024, 1} },
4856 .block_erase = spi_block_erase_d8,
hailfinger91cf1032009-10-01 13:15:01 +00004857 }, {
hailfinger7df21362009-09-05 02:30:58 +00004858 .eraseblocks = { {64 * 1024, 1} },
4859 .block_erase = spi_block_erase_60,
hailfinger91cf1032009-10-01 13:15:01 +00004860 }, {
hailfinger7df21362009-09-05 02:30:58 +00004861 .eraseblocks = { {64 * 1024, 1} },
4862 .block_erase = spi_block_erase_c7,
4863 },
4864 },
hailfingerb9560ee2010-07-14 20:21:22 +00004865 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00004866 .write = spi_chip_write_256,
Vincent Palatina699d262013-02-28 14:31:12 -08004867 .read = spi_chip_read, /* Fast read (0x0B) supported, MX25L512E supports dual I/O */
4868 .voltage = {2700, 3600}, /* 2.35-3.6V for MX25V512(C) */
stepanaa1b6a22008-12-08 18:15:10 +00004869 },
4870
hailfinger286829b2009-01-08 03:40:17 +00004871 {
4872 .vendor = "Macronix",
Vincent Palatina699d262013-02-28 14:31:12 -08004873 .name = "MX25L1005(C)/MX25L1006E",
hailfingere1e41ea2011-07-27 07:13:06 +00004874 .bustype = BUS_SPI,
mhmd3c80cd2010-09-15 23:31:03 +00004875 .manufacture_id = MACRONIX_ID,
4876 .model_id = MACRONIX_MX25L1005,
hailfinger286829b2009-01-08 03:40:17 +00004877 .total_size = 128,
4878 .page_size = 256,
Vincent Palatina699d262013-02-28 14:31:12 -08004879 /* MX25L1006E supports SFDP */
David Hendricks488cf072015-11-23 16:45:07 -08004880 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
4881 .tested = TEST_OK_PREWU,
hailfinger286829b2009-01-08 03:40:17 +00004882 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00004883 .probe_timing = TIMING_ZERO,
hailfinger7df21362009-09-05 02:30:58 +00004884 .block_erasers =
4885 {
4886 {
4887 .eraseblocks = { {4 * 1024, 32} },
4888 .block_erase = spi_block_erase_20,
hailfinger91cf1032009-10-01 13:15:01 +00004889 }, {
hailfinger7df21362009-09-05 02:30:58 +00004890 .eraseblocks = { {64 * 1024, 2} },
4891 .block_erase = spi_block_erase_d8,
hailfinger91cf1032009-10-01 13:15:01 +00004892 }, {
hailfinger7df21362009-09-05 02:30:58 +00004893 .eraseblocks = { {128 * 1024, 1} },
4894 .block_erase = spi_block_erase_60,
hailfinger91cf1032009-10-01 13:15:01 +00004895 }, {
hailfinger7df21362009-09-05 02:30:58 +00004896 .eraseblocks = { {128 * 1024, 1} },
4897 .block_erase = spi_block_erase_c7,
4898 },
4899 },
hailfingerb9560ee2010-07-14 20:21:22 +00004900 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00004901 .write = spi_chip_write_256,
Vincent Palatina699d262013-02-28 14:31:12 -08004902 .read = spi_chip_read, /* Fast read (0x0B) supported, MX25L1006E supports dual I/O */
stefanct7e00e222011-06-03 07:26:31 +00004903 .voltage = {2700, 3600},
David Hendricksf8f00c72011-02-01 12:39:46 -08004904 .wp = &wp_w25,
stepanaa1b6a22008-12-08 18:15:10 +00004905 },
4906
hailfinger286829b2009-01-08 03:40:17 +00004907 {
4908 .vendor = "Macronix",
Vincent Palatina699d262013-02-28 14:31:12 -08004909 .name = "MX25L2005(C)",
hailfingere1e41ea2011-07-27 07:13:06 +00004910 .bustype = BUS_SPI,
mhmd3c80cd2010-09-15 23:31:03 +00004911 .manufacture_id = MACRONIX_ID,
4912 .model_id = MACRONIX_MX25L2005,
hailfinger286829b2009-01-08 03:40:17 +00004913 .total_size = 256,
4914 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08004915 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00004916 .tested = TEST_UNTESTED,
4917 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00004918 .probe_timing = TIMING_ZERO,
hailfinger91cf1032009-10-01 13:15:01 +00004919 .block_erasers =
4920 {
4921 {
4922 .eraseblocks = { {4 * 1024, 64} },
4923 .block_erase = spi_block_erase_20,
4924 }, {
4925 .eraseblocks = { {64 * 1024, 4} },
4926 .block_erase = spi_block_erase_52,
4927 }, {
4928 .eraseblocks = { {64 * 1024, 4} },
4929 .block_erase = spi_block_erase_d8,
4930 }, {
4931 .eraseblocks = { {256 * 1024, 1} },
4932 .block_erase = spi_block_erase_60,
4933 }, {
4934 .eraseblocks = { {256 * 1024, 1} },
4935 .block_erase = spi_block_erase_c7,
4936 },
4937 },
hailfingerb9560ee2010-07-14 20:21:22 +00004938 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00004939 .write = spi_chip_write_256,
Vincent Palatina699d262013-02-28 14:31:12 -08004940 .read = spi_chip_read, /* Fast read (0x0B) supported */
stefanct7e00e222011-06-03 07:26:31 +00004941 .voltage = {2700, 3600},
David Hendricksf8f00c72011-02-01 12:39:46 -08004942 .wp = &wp_w25,
stepanaa1b6a22008-12-08 18:15:10 +00004943 },
4944
hailfinger286829b2009-01-08 03:40:17 +00004945 {
4946 .vendor = "Macronix",
Vincent Palatina699d262013-02-28 14:31:12 -08004947 .name = "MX25L4005(A/C)",
hailfingere1e41ea2011-07-27 07:13:06 +00004948 .bustype = BUS_SPI,
mhmd3c80cd2010-09-15 23:31:03 +00004949 .manufacture_id = MACRONIX_ID,
4950 .model_id = MACRONIX_MX25L4005,
hailfinger286829b2009-01-08 03:40:17 +00004951 .total_size = 512,
4952 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08004953 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
4954 .tested = TEST_OK_PREWU,
hailfinger286829b2009-01-08 03:40:17 +00004955 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00004956 .probe_timing = TIMING_ZERO,
hailfinger91cf1032009-10-01 13:15:01 +00004957 .block_erasers =
4958 {
4959 {
4960 .eraseblocks = { {4 * 1024, 128} },
4961 .block_erase = spi_block_erase_20,
4962 }, {
4963 .eraseblocks = { {64 * 1024, 8} },
4964 .block_erase = spi_block_erase_52,
4965 }, {
4966 .eraseblocks = { {64 * 1024, 8} },
4967 .block_erase = spi_block_erase_d8,
4968 }, {
4969 .eraseblocks = { {512 * 1024, 1} },
4970 .block_erase = spi_block_erase_60,
4971 }, {
4972 .eraseblocks = { {512 * 1024, 1} },
4973 .block_erase = spi_block_erase_c7,
4974 },
4975 },
hailfingerb9560ee2010-07-14 20:21:22 +00004976 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00004977 .write = spi_chip_write_256,
Vincent Palatina699d262013-02-28 14:31:12 -08004978 .read = spi_chip_read, /* Fast read (0x0B) supported */
stefanct7e00e222011-06-03 07:26:31 +00004979 .voltage = {2700, 3600},
David Hendricksf8f00c72011-02-01 12:39:46 -08004980 .wp = &wp_w25,
stepanaa1b6a22008-12-08 18:15:10 +00004981 },
4982
hailfinger286829b2009-01-08 03:40:17 +00004983 {
4984 .vendor = "Macronix",
Vincent Palatina699d262013-02-28 14:31:12 -08004985 .name = "MX25L8005/MX25V8005",
hailfingere1e41ea2011-07-27 07:13:06 +00004986 .bustype = BUS_SPI,
mhmd3c80cd2010-09-15 23:31:03 +00004987 .manufacture_id = MACRONIX_ID,
4988 .model_id = MACRONIX_MX25L8005,
hailfinger286829b2009-01-08 03:40:17 +00004989 .total_size = 1024,
4990 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08004991 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
4992 .tested = TEST_OK_PREWU,
hailfinger286829b2009-01-08 03:40:17 +00004993 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00004994 .probe_timing = TIMING_ZERO,
hailfinger91cf1032009-10-01 13:15:01 +00004995 .block_erasers =
4996 {
4997 {
4998 .eraseblocks = { {4 * 1024, 256} },
4999 .block_erase = spi_block_erase_20,
5000 }, {
5001 .eraseblocks = { {64 * 1024, 16} },
5002 .block_erase = spi_block_erase_52,
5003 }, {
5004 .eraseblocks = { {64 * 1024, 16} },
5005 .block_erase = spi_block_erase_d8,
5006 }, {
5007 .eraseblocks = { {1024 * 1024, 1} },
5008 .block_erase = spi_block_erase_60,
5009 }, {
5010 .eraseblocks = { {1024 * 1024, 1} },
5011 .block_erase = spi_block_erase_c7,
5012 },
5013 },
hailfingerb9560ee2010-07-14 20:21:22 +00005014 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00005015 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00005016 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00005017 .voltage = {2700, 3600},
David Hendricksf8f00c72011-02-01 12:39:46 -08005018 .wp = &wp_w25,
stepanaa1b6a22008-12-08 18:15:10 +00005019 },
5020
hailfinger286829b2009-01-08 03:40:17 +00005021 {
5022 .vendor = "Macronix",
5023 .name = "MX25L1605",
hailfingere1e41ea2011-07-27 07:13:06 +00005024 .bustype = BUS_SPI,
mhmd3c80cd2010-09-15 23:31:03 +00005025 .manufacture_id = MACRONIX_ID,
5026 .model_id = MACRONIX_MX25L1605,
hailfinger286829b2009-01-08 03:40:17 +00005027 .total_size = 2048,
5028 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08005029 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
5030 .tested = TEST_OK_PREWU,
hailfinger286829b2009-01-08 03:40:17 +00005031 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00005032 .probe_timing = TIMING_ZERO,
hailfinger91cf1032009-10-01 13:15:01 +00005033 .block_erasers =
5034 {
5035 {
5036 .eraseblocks = { {4 * 1024, 512} },
5037 .block_erase = spi_block_erase_20, /* This erase function has 64k blocksize for eLiteFlash */
5038 }, {
5039 .eraseblocks = { {64 * 1024, 32} }, /* Not supported in MX25L1605 (eLiteFlash) and MX25L1605D */
5040 .block_erase = spi_block_erase_52,
5041 }, {
5042 .eraseblocks = { {64 * 1024, 32} },
5043 .block_erase = spi_block_erase_d8,
5044 }, {
5045 .eraseblocks = { {2 * 1024 * 1024, 1} },
5046 .block_erase = spi_block_erase_60,
5047 }, {
5048 .eraseblocks = { {2 * 1024 * 1024, 1} },
5049 .block_erase = spi_block_erase_c7,
5050 },
5051 },
hailfingerb9560ee2010-07-14 20:21:22 +00005052 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00005053 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00005054 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00005055 .voltage = {2700, 3600},
David Hendricksf8f00c72011-02-01 12:39:46 -08005056 .wp = &wp_w25,
stepanaa1b6a22008-12-08 18:15:10 +00005057 },
5058
hailfinger286829b2009-01-08 03:40:17 +00005059 {
5060 .vendor = "Macronix",
hailfinger0a2fef02009-04-19 23:04:00 +00005061 .name = "MX25L1635D",
hailfingere1e41ea2011-07-27 07:13:06 +00005062 .bustype = BUS_SPI,
mhmd3c80cd2010-09-15 23:31:03 +00005063 .manufacture_id = MACRONIX_ID,
5064 .model_id = MACRONIX_MX25L1635D,
hailfinger0a2fef02009-04-19 23:04:00 +00005065 .total_size = 2048,
5066 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08005067 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
hailfinger0a2fef02009-04-19 23:04:00 +00005068 .tested = TEST_UNTESTED,
5069 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00005070 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00005071 .block_erasers =
5072 {
5073 {
5074 .eraseblocks = { {4 * 1024, 512} },
5075 .block_erase = spi_block_erase_20,
5076 }, {
5077 .eraseblocks = { {64 * 1024, 32} },
5078 .block_erase = spi_block_erase_d8,
5079 }, {
5080 .eraseblocks = { {2 * 1024 * 1024, 1} },
5081 .block_erase = spi_block_erase_60,
5082 }, {
5083 .eraseblocks = { {2 * 1024 * 1024, 1} },
5084 .block_erase = spi_block_erase_c7,
5085 }
5086 },
hailfingerb9560ee2010-07-14 20:21:22 +00005087 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00005088 .write = spi_chip_write_256,
hailfinger0a2fef02009-04-19 23:04:00 +00005089 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00005090 .voltage = {2700, 3600},
hailfinger0a2fef02009-04-19 23:04:00 +00005091 },
hailfingerf1255892009-04-20 22:54:13 +00005092
hailfinger0a2fef02009-04-19 23:04:00 +00005093 {
5094 .vendor = "Macronix",
uwef926ca22010-09-13 19:59:28 +00005095 .name = "MX25L1635E",
hailfingere1e41ea2011-07-27 07:13:06 +00005096 .bustype = BUS_SPI,
mhmd3c80cd2010-09-15 23:31:03 +00005097 .manufacture_id = MACRONIX_ID,
5098 .model_id = MACRONIX_MX25L1635E,
uwef926ca22010-09-13 19:59:28 +00005099 .total_size = 2048,
5100 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08005101 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
uwef926ca22010-09-13 19:59:28 +00005102 .tested = TEST_UNTESTED,
5103 .probe = probe_spi_rdid,
5104 .probe_timing = TIMING_ZERO,
5105 .block_erasers =
5106 {
5107 {
5108 .eraseblocks = { {4 * 1024, 512} },
5109 .block_erase = spi_block_erase_20,
5110 }, {
5111 .eraseblocks = { {64 * 1024, 32} },
5112 .block_erase = spi_block_erase_d8,
5113 }, {
5114 .eraseblocks = { {2 * 1024 * 1024, 1} },
5115 .block_erase = spi_block_erase_60,
5116 }, {
5117 .eraseblocks = { {2 * 1024 * 1024, 1} },
5118 .block_erase = spi_block_erase_c7,
5119 }
5120 },
5121 .unlock = spi_disable_blockprotect,
5122 .write = spi_chip_write_256,
5123 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +00005124 .voltage = {2700, 3600},
uwef926ca22010-09-13 19:59:28 +00005125 },
5126
5127 {
5128 .vendor = "Macronix",
hailfinger286829b2009-01-08 03:40:17 +00005129 .name = "MX25L3205",
hailfingere1e41ea2011-07-27 07:13:06 +00005130 .bustype = BUS_SPI,
mhmd3c80cd2010-09-15 23:31:03 +00005131 .manufacture_id = MACRONIX_ID,
5132 .model_id = MACRONIX_MX25L3205,
hailfinger286829b2009-01-08 03:40:17 +00005133 .total_size = 4096,
5134 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08005135 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
5136 .tested = TEST_OK_PREWU,
hailfinger286829b2009-01-08 03:40:17 +00005137 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00005138 .probe_timing = TIMING_ZERO,
snelson1c03aa12009-12-23 17:05:59 +00005139 .block_erasers =
5140 {
5141 {
5142 .eraseblocks = { {4 * 1024, 1024} },
5143 .block_erase = spi_block_erase_20,
5144 }, {
5145 .eraseblocks = { {4 * 1024, 1024} },
5146 .block_erase = spi_block_erase_d8,
5147 }, {
5148 .eraseblocks = { {4 * 1024 * 1024, 1} },
5149 .block_erase = spi_block_erase_60,
5150 }, {
5151 .eraseblocks = { {4 * 1024 * 1024, 1} },
5152 .block_erase = spi_block_erase_c7,
5153 },
5154 },
hailfingerb9560ee2010-07-14 20:21:22 +00005155 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00005156 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00005157 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00005158 .voltage = {2700, 3600},
David Hendricksf8f00c72011-02-01 12:39:46 -08005159 .wp = &wp_w25,
stepanaa1b6a22008-12-08 18:15:10 +00005160 },
5161
hailfinger286829b2009-01-08 03:40:17 +00005162 {
5163 .vendor = "Macronix",
stuge38d77d22009-04-23 22:51:56 +00005164 .name = "MX25L3235D",
hailfingere1e41ea2011-07-27 07:13:06 +00005165 .bustype = BUS_SPI,
mhmd3c80cd2010-09-15 23:31:03 +00005166 .manufacture_id = MACRONIX_ID,
5167 .model_id = MACRONIX_MX25L3235D,
stuge38d77d22009-04-23 22:51:56 +00005168 .total_size = 4096,
5169 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08005170 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
stuge38d77d22009-04-23 22:51:56 +00005171 .tested = TEST_UNTESTED,
5172 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00005173 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00005174 .block_erasers =
5175 {
5176 {
5177 .eraseblocks = { {4 * 1024, 1024} },
5178 .block_erase = spi_block_erase_20,
5179 }, {
5180 .eraseblocks = { {64 * 1024, 64} },
5181 .block_erase = spi_block_erase_d8,
5182 }, {
5183 .eraseblocks = { {4 * 1024 * 1024, 1} },
5184 .block_erase = spi_block_erase_60,
5185 }, {
5186 .eraseblocks = { {4 * 1024 * 1024, 1} },
5187 .block_erase = spi_block_erase_c7,
5188 }
5189 },
hailfingerb9560ee2010-07-14 20:21:22 +00005190 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00005191 .write = spi_chip_write_256,
stuge38d77d22009-04-23 22:51:56 +00005192 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00005193 .voltage = {2700, 3600},
stuge38d77d22009-04-23 22:51:56 +00005194 },
5195
Vincent Palatin87e092a2013-02-28 15:46:14 -08005196 {
5197 .vendor = "Macronix",
5198 .name = "MX25U3235E/F",
5199 .bustype = BUS_SPI,
5200 .manufacture_id = MACRONIX_ID,
5201 .model_id = MACRONIX_MX25U3235E,
5202 .total_size = 4096,
5203 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08005204 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
Vincent Palatin87e092a2013-02-28 15:46:14 -08005205 .tested = TEST_UNTESTED,
5206 .probe = probe_spi_rdid,
5207 .probe_timing = TIMING_ZERO,
5208 .block_erasers =
5209 {
5210 {
5211 .eraseblocks = { {4 * 1024, 1024} },
5212 .block_erase = spi_block_erase_20,
5213 }, {
5214 .eraseblocks = { {32 * 1024, 128} },
5215 .block_erase = spi_block_erase_52,
5216 }, {
5217 .eraseblocks = { {64 * 1024, 64} },
5218 .block_erase = spi_block_erase_d8,
5219 }, {
5220 .eraseblocks = { {4 * 1024 * 1024, 1} },
5221 .block_erase = spi_block_erase_60,
5222 }, {
5223 .eraseblocks = { {4 * 1024 * 1024, 1} },
5224 .block_erase = spi_block_erase_c7,
5225 }
5226 },
5227 .unlock = spi_disable_blockprotect,
5228 .write = spi_chip_write_256,
5229 .read = spi_chip_read, /* Fast read (0x0B) supported */
5230 .voltage = {1650, 2000},
5231 .wp = &wp_w25,
5232 },
5233
David Hendricks1c9bc9c2011-07-20 15:25:44 -07005234#if 0
stuge38d77d22009-04-23 22:51:56 +00005235 {
5236 .vendor = "Macronix",
hailfinger286829b2009-01-08 03:40:17 +00005237 .name = "MX25L6405",
hailfingere1e41ea2011-07-27 07:13:06 +00005238 .bustype = BUS_SPI,
mhmd3c80cd2010-09-15 23:31:03 +00005239 .manufacture_id = MACRONIX_ID,
5240 .model_id = MACRONIX_MX25L6405,
hailfinger286829b2009-01-08 03:40:17 +00005241 .total_size = 8192,
5242 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08005243 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
Stefan Tauner718d1eb2016-08-18 18:00:53 -07005244 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00005245 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00005246 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00005247 .block_erasers =
5248 {
5249 {
5250 .eraseblocks = { {64 * 1024, 128} },
5251 .block_erase = spi_block_erase_20,
5252 }, {
5253 .eraseblocks = { {64 * 1024, 128} },
5254 .block_erase = spi_block_erase_d8,
5255 }, {
5256 .eraseblocks = { {8 * 1024 * 1024, 1} },
5257 .block_erase = spi_block_erase_60,
5258 }, {
5259 .eraseblocks = { {8 * 1024 * 1024, 1} },
5260 .block_erase = spi_block_erase_c7,
5261 }
5262 },
hailfingerb9560ee2010-07-14 20:21:22 +00005263 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00005264 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00005265 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00005266 .voltage = {2700, 3600},
David Hendricksf8f00c72011-02-01 12:39:46 -08005267 .wp = &wp_w25,
stepanaa1b6a22008-12-08 18:15:10 +00005268 },
David Hendricks1c9bc9c2011-07-20 15:25:44 -07005269#endif
5270
5271 {
5272 /* FIXME: This is an evil twin of the MX25L6405, with the same
5273 * ID bytes but different block erase capabilities */
5274 .vendor = "Macronix",
5275 .name = "MX25L6406E",
hailfingere1e41ea2011-07-27 07:13:06 +00005276 .bustype = BUS_SPI,
David Hendricks1c9bc9c2011-07-20 15:25:44 -07005277 .manufacture_id = MACRONIX_ID,
5278 .model_id = MACRONIX_MX25L6405,
5279 .total_size = 8192,
5280 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08005281 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
5282 .tested = TEST_OK_PREWU,
David Hendricks1c9bc9c2011-07-20 15:25:44 -07005283 .probe = probe_spi_rdid,
5284 .probe_timing = TIMING_ZERO,
5285 .block_erasers =
5286 {
5287 {
5288 .eraseblocks = { {4 * 1024, 2048} },
5289 .block_erase = spi_block_erase_20,
5290 }, {
5291 .eraseblocks = { {64 * 1024, 128} },
5292 .block_erase = spi_block_erase_d8,
5293 }, {
5294 .eraseblocks = { {64 * 1024, 128} },
5295 .block_erase = spi_block_erase_52,
5296 }, {
5297 .eraseblocks = { {8 * 1024 * 1024, 1} },
5298 .block_erase = spi_block_erase_60,
5299 }, {
5300 .eraseblocks = { {8 * 1024 * 1024, 1} },
5301 .block_erase = spi_block_erase_c7,
5302 }
5303 },
5304 .unlock = spi_disable_blockprotect,
5305 .write = spi_chip_write_256,
Vincent Palatina699d262013-02-28 14:31:12 -08005306 .read = spi_chip_read, /* Fast read (0x0B) supported */
5307 .voltage = {2700, 3600}, /* 2.35-3.6V for MX25V8005 */
David Hendricks83541d32014-07-15 20:58:21 -07005308 .wp = &wp_generic,
David Hendricks1c9bc9c2011-07-20 15:25:44 -07005309 },
stepanaa1b6a22008-12-08 18:15:10 +00005310
hailfinger286829b2009-01-08 03:40:17 +00005311 {
5312 .vendor = "Macronix",
David Hendricksc3496092014-11-13 17:20:55 -08005313 .name = "MX25L6495F",
5314 .bustype = BUS_SPI,
5315 .manufacture_id = MACRONIX_ID,
5316 .model_id = MACRONIX_MX25L6495F,
5317 .total_size = 8192,
5318 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08005319 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
5320 .tested = TEST_OK_PREWU,
David Hendricksc3496092014-11-13 17:20:55 -08005321 .probe = probe_spi_rdid,
5322 .probe_timing = TIMING_ZERO,
5323 .block_erasers =
5324 {
5325 {
5326 .eraseblocks = { {4 * 1024, 2048} },
5327 .block_erase = spi_block_erase_20,
5328 }, {
5329 .eraseblocks = { {64 * 1024, 128} },
5330 .block_erase = spi_block_erase_d8,
5331 }, {
5332 .eraseblocks = { {32 * 1024, 256} },
5333 .block_erase = spi_block_erase_52,
5334 }, {
5335 .eraseblocks = { {8 * 1024 * 1024, 1} },
5336 .block_erase = spi_block_erase_60,
5337 }, {
5338 .eraseblocks = { {8 * 1024 * 1024, 1} },
5339 .block_erase = spi_block_erase_c7,
5340 }
5341 },
5342 .unlock = spi_disable_blockprotect,
5343 .write = spi_chip_write_256,
5344 .read = spi_chip_read, /* Fast read (0x0B) supported */
5345 .voltage = {2700, 3600},
5346 .wp = &wp_generic,
5347 },
5348
5349 {
5350 .vendor = "Macronix",
Jongpil66a96492014-08-14 17:59:06 +09005351 .name = "MX25U6435E/F",
5352 .bustype = BUS_SPI,
5353 .manufacture_id = MACRONIX_ID,
5354 .model_id = MACRONIX_MX25U6435E,
5355 .total_size = 8192,
5356 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08005357 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
5358 .tested = TEST_OK_PREWU,
Jongpil66a96492014-08-14 17:59:06 +09005359 .probe = probe_spi_rdid,
5360 .probe_timing = TIMING_ZERO,
5361 .block_erasers =
5362 {
5363 {
5364 .eraseblocks = { {4 * 1024, 2048} },
5365 .block_erase = spi_block_erase_20,
5366 }, {
5367 .eraseblocks = { {32 * 1024, 256} },
5368 .block_erase = spi_block_erase_52,
5369 }, {
5370 .eraseblocks = { {64 * 1024, 128} },
5371 .block_erase = spi_block_erase_d8,
5372 }, {
5373 .eraseblocks = { {8 * 1024 * 1024, 1} },
5374 .block_erase = spi_block_erase_60,
5375 }, {
5376 .eraseblocks = { {8 * 1024 * 1024, 1} },
5377 .block_erase = spi_block_erase_c7,
5378 }
5379 },
5380 .unlock = spi_disable_blockprotect,
5381 .write = spi_chip_write_256,
5382 .read = spi_chip_read, /* Fast read (0x0B) supported */
5383 .voltage = {1650, 2000},
5384 .wp = &wp_w25,
5385 },
5386
Alex Lu831c6092017-11-02 23:19:34 -07005387
5388 {
5389 .vendor = "Macronix",
5390 .name = "MX25U12835F",
5391 .bustype = BUS_SPI,
5392 .manufacture_id = MACRONIX_ID,
5393 .model_id = MACRONIX_MX25U12835F,
5394 .total_size = 16384,
5395 .page_size = 256,
5396 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
5397 .tested = TEST_OK_PREWU,
5398 .probe = probe_spi_rdid,
5399 .probe_timing = TIMING_ZERO,
5400 .block_erasers =
5401 {
5402 {
5403 .eraseblocks = { {4 * 1024, 4096} },
5404 .block_erase = spi_block_erase_20,
5405 }, {
5406 .eraseblocks = { {32 * 1024, 512} },
5407 .block_erase = spi_block_erase_52,
5408 }, {
5409 .eraseblocks = { {64 * 1024, 256} },
5410 .block_erase = spi_block_erase_d8,
5411 }, {
5412 .eraseblocks = { {8 * 1024 * 2048, 1} },
5413 .block_erase = spi_block_erase_60,
5414 }, {
5415 .eraseblocks = { {8 * 1024 * 2048, 1} },
5416 .block_erase = spi_block_erase_c7,
5417 }
5418 },
5419 .unlock = spi_disable_blockprotect,
5420 .write = spi_chip_write_256,
5421 .read = spi_chip_read, /* Fast read (0x0B) supported */
5422 .voltage = {1650, 2000},
5423 .wp = &wp_w25,
5424 },
5425
Jongpil66a96492014-08-14 17:59:06 +09005426 {
5427 .vendor = "Macronix",
David Hendricks419e32a2015-04-07 17:25:14 -07005428 .name = "MX25U25635F",
5429 .bustype = BUS_SPI,
5430 .manufacture_id = MACRONIX_ID,
5431 .model_id = MACRONIX_MX25U25635F,
5432 /* FIXME(dhendrix): support 32-bit addressing */
5433 .total_size = 32768/2,
5434 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08005435 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
5436 .tested = TEST_OK_PREWU,
David Hendricks419e32a2015-04-07 17:25:14 -07005437 .probe = probe_spi_rdid,
5438 .probe_timing = TIMING_ZERO,
5439 .block_erasers =
5440 {
5441 /* FIXME(dhendrix): support 32-bit addressing */
5442 {
5443 .eraseblocks = { {4 * 1024, 8192/2} },
5444 .block_erase = spi_block_erase_20,
5445 }, {
5446 .eraseblocks = { {32 * 1024, 1024/2} },
5447 .block_erase = spi_block_erase_52,
5448 }, {
5449 .eraseblocks = { {64 * 1024, 512/2} },
5450 .block_erase = spi_block_erase_d8,
5451 }, {
5452 .eraseblocks = { {32/2 * 1024 * 1024, 1} },
5453 .block_erase = spi_block_erase_60,
5454 }, {
5455 .eraseblocks = { {32/2 * 1024 * 1024, 1} },
5456 .block_erase = spi_block_erase_c7,
5457 }
5458 },
5459 .unlock = spi_disable_blockprotect,
5460 .write = spi_chip_write_256,
5461 .read = spi_chip_read, /* Fast read (0x0B) supported */
5462 .voltage = {1650, 2000},
5463 /* FIXME(dhendrix): write-protect support */
5464// .wp = &wp_generic,
5465 },
5466
5467 {
5468 .vendor = "Macronix",
stuged8f34912009-04-21 01:47:16 +00005469 .name = "MX25L12805",
hailfingere1e41ea2011-07-27 07:13:06 +00005470 .bustype = BUS_SPI,
mhmd3c80cd2010-09-15 23:31:03 +00005471 .manufacture_id = MACRONIX_ID,
5472 .model_id = MACRONIX_MX25L12805,
stuged8f34912009-04-21 01:47:16 +00005473 .total_size = 16384,
5474 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08005475 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
stuged8f34912009-04-21 01:47:16 +00005476 .tested = TEST_UNTESTED,
5477 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00005478 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00005479 .block_erasers =
5480 {
5481 {
5482 .eraseblocks = { {4 * 1024, 4096} },
5483 .block_erase = spi_block_erase_20,
5484 }, {
5485 .eraseblocks = { {64 * 1024, 256} },
5486 .block_erase = spi_block_erase_d8,
5487 }, {
5488 .eraseblocks = { {16 * 1024 * 1024, 1} },
5489 .block_erase = spi_block_erase_60,
5490 }, {
5491 .eraseblocks = { {16 * 1024 * 1024, 1} },
5492 .block_erase = spi_block_erase_c7,
5493 }
5494 },
hailfingerb9560ee2010-07-14 20:21:22 +00005495 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00005496 .write = spi_chip_write_256,
stuged8f34912009-04-21 01:47:16 +00005497 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00005498 .voltage = {2700, 3600},
stuged8f34912009-04-21 01:47:16 +00005499 },
5500
5501 {
5502 .vendor = "Macronix",
hailfinger377ee962009-08-24 01:42:24 +00005503 .name = "MX29F001B",
hailfingere1e41ea2011-07-27 07:13:06 +00005504 .bustype = BUS_PARALLEL,
mhmd3c80cd2010-09-15 23:31:03 +00005505 .manufacture_id = MACRONIX_ID,
5506 .model_id = MACRONIX_MX29F001B,
hailfinger377ee962009-08-24 01:42:24 +00005507 .total_size = 128,
5508 .page_size = 32 * 1024,
snelsonc6855342010-01-28 23:55:12 +00005509 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5510 .tested = TEST_UNTESTED,
5511 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +00005512 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00005513 .block_erasers =
5514 {
5515 {
Simon Glass8dc82732013-07-16 10:13:51 -06005516 .eraseblocks = {
snelson2d471072010-01-09 05:30:14 +00005517 {8 * 1024, 1},
5518 {4 * 1024, 2},
5519 {8 * 1024, 2},
5520 {32 * 1024, 1},
5521 {64 * 1024, 1},
5522 },
snelsonc6855342010-01-28 23:55:12 +00005523 .block_erase = erase_sector_jedec,
snelson2d471072010-01-09 05:30:14 +00005524 }, {
5525 .eraseblocks = { {128 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +00005526 .block_erase = erase_chip_block_jedec,
snelson2d471072010-01-09 05:30:14 +00005527 }
5528 },
hailfingerfff99532009-11-27 17:49:42 +00005529 .write = write_jedec_1,
hailfinger377ee962009-08-24 01:42:24 +00005530 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00005531 .voltage = {4500, 5500},
hailfinger377ee962009-08-24 01:42:24 +00005532 },
5533
5534 {
5535 .vendor = "Macronix",
5536 .name = "MX29F001T",
hailfingere1e41ea2011-07-27 07:13:06 +00005537 .bustype = BUS_PARALLEL,
mhmd3c80cd2010-09-15 23:31:03 +00005538 .manufacture_id = MACRONIX_ID,
5539 .model_id = MACRONIX_MX29F001T,
hailfinger377ee962009-08-24 01:42:24 +00005540 .total_size = 128,
5541 .page_size = 32 * 1024,
snelsonc6855342010-01-28 23:55:12 +00005542 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
stefanct4cc44652011-05-18 01:31:46 +00005543 .tested = TEST_OK_PREW,
snelsonc6855342010-01-28 23:55:12 +00005544 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +00005545 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00005546 .block_erasers =
5547 {
5548 {
Simon Glass8dc82732013-07-16 10:13:51 -06005549 .eraseblocks = {
snelson2d471072010-01-09 05:30:14 +00005550 {64 * 1024, 1},
5551 {32 * 1024, 1},
5552 {8 * 1024, 2},
5553 {4 * 1024, 2},
5554 {8 * 1024, 1},
5555 },
snelsonc6855342010-01-28 23:55:12 +00005556 .block_erase = erase_sector_jedec,
snelson2d471072010-01-09 05:30:14 +00005557 }, {
5558 .eraseblocks = { {128 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +00005559 .block_erase = erase_chip_block_jedec,
snelson2d471072010-01-09 05:30:14 +00005560 }
5561 },
hailfingerfff99532009-11-27 17:49:42 +00005562 .write = write_jedec_1,
hailfinger377ee962009-08-24 01:42:24 +00005563 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00005564 .voltage = {4500, 5500},
hailfinger377ee962009-08-24 01:42:24 +00005565 },
5566
5567 {
5568 .vendor = "Macronix",
stefanctd6efe1a2011-09-03 11:22:27 +00005569 .name = "MX29F002(N)B",
hailfingere1e41ea2011-07-27 07:13:06 +00005570 .bustype = BUS_PARALLEL,
mhmd3c80cd2010-09-15 23:31:03 +00005571 .manufacture_id = MACRONIX_ID,
5572 .model_id = MACRONIX_MX29F002B,
hailfinger286829b2009-01-08 03:40:17 +00005573 .total_size = 256,
5574 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00005575 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
hailfinger286829b2009-01-08 03:40:17 +00005576 .tested = TEST_UNTESTED,
snelsonc6855342010-01-28 23:55:12 +00005577 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +00005578 .probe_timing = TIMING_ZERO,
snelson1c03aa12009-12-23 17:05:59 +00005579 .block_erasers =
5580 {
5581 {
5582 .eraseblocks = {
5583 {16 * 1024, 1},
5584 {8 * 1024, 2},
5585 {32 * 1024, 1},
5586 {64 * 1024, 3},
5587 },
snelsonc6855342010-01-28 23:55:12 +00005588 .block_erase = erase_sector_jedec,
snelson1c03aa12009-12-23 17:05:59 +00005589 }, {
5590 .eraseblocks = { {256 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +00005591 .block_erase = erase_chip_block_jedec,
snelson1c03aa12009-12-23 17:05:59 +00005592 },
5593 },
hailfingerfff99532009-11-27 17:49:42 +00005594 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00005595 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00005596 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00005597 },
5598
hailfinger286829b2009-01-08 03:40:17 +00005599 {
5600 .vendor = "Macronix",
stefanctd6efe1a2011-09-03 11:22:27 +00005601 .name = "MX29F002(N)T",
hailfingere1e41ea2011-07-27 07:13:06 +00005602 .bustype = BUS_PARALLEL,
mhmd3c80cd2010-09-15 23:31:03 +00005603 .manufacture_id = MACRONIX_ID,
5604 .model_id = MACRONIX_MX29F002T,
hailfinger286829b2009-01-08 03:40:17 +00005605 .total_size = 256,
5606 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00005607 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
stefanct98d917c2011-10-21 12:33:07 +00005608 .tested = TEST_OK_PREW,
snelsonc6855342010-01-28 23:55:12 +00005609 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +00005610 .probe_timing = TIMING_ZERO,
snelson1c03aa12009-12-23 17:05:59 +00005611 .block_erasers =
5612 {
5613 {
5614 .eraseblocks = {
5615 {64 * 1024, 3},
5616 {32 * 1024, 1},
5617 {8 * 1024, 2},
5618 {16 * 1024, 1},
5619 },
snelsonc6855342010-01-28 23:55:12 +00005620 .block_erase = erase_sector_jedec,
snelson1c03aa12009-12-23 17:05:59 +00005621 }, {
5622 .eraseblocks = { {256 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +00005623 .block_erase = erase_chip_block_jedec,
snelson1c03aa12009-12-23 17:05:59 +00005624 },
5625 },
hailfingerfff99532009-11-27 17:49:42 +00005626 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00005627 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00005628 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00005629 },
5630
hailfinger286829b2009-01-08 03:40:17 +00005631 {
5632 .vendor = "Macronix",
mhme8e87912010-09-16 00:51:51 +00005633 .name = "MX29F040",
hailfingere1e41ea2011-07-27 07:13:06 +00005634 .bustype = BUS_PARALLEL,
mhme8e87912010-09-16 00:51:51 +00005635 .manufacture_id = MACRONIX_ID,
5636 .model_id = MACRONIX_MX29F040,
5637 .total_size = 512,
5638 .page_size = 64 * 1024,
5639 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5640 .tested = TEST_UNTESTED,
5641 .probe = probe_jedec,
5642 .probe_timing = TIMING_ZERO,
5643 .block_erasers =
5644 {
5645 {
5646 .eraseblocks = { {64 * 1024, 8} },
5647 .block_erase = erase_sector_jedec,
5648 }, {
5649 .eraseblocks = { {512 * 1024, 1} },
5650 .block_erase = erase_chip_block_jedec,
5651 },
5652 },
5653 .write = write_jedec_1,
5654 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +00005655 .voltage = {4500, 5500},
mhme8e87912010-09-16 00:51:51 +00005656 },
5657
5658 {
5659 .vendor = "Macronix",
David Hendricksc801adb2010-12-09 16:58:56 -08005660 .name = "MX29F040",
hailfingere1e41ea2011-07-27 07:13:06 +00005661 .bustype = BUS_PARALLEL,
David Hendricksc801adb2010-12-09 16:58:56 -08005662 .manufacture_id = MACRONIX_ID,
5663 .model_id = MACRONIX_MX29F040,
5664 .total_size = 512,
5665 .page_size = 64 * 1024,
5666 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5667 .tested = TEST_UNTESTED,
5668 .probe = probe_jedec,
5669 .probe_timing = TIMING_ZERO,
5670 .block_erasers =
5671 {
5672 {
5673 .eraseblocks = { {64 * 1024, 8} },
5674 .block_erase = erase_sector_jedec,
5675 }, {
5676 .eraseblocks = { {512 * 1024, 1} },
5677 .block_erase = erase_chip_block_jedec,
5678 },
5679 },
5680 .write = write_jedec_1,
5681 .read = read_memmapped,
5682 },
5683
5684 {
5685 .vendor = "Macronix",
hailfinger94c758e2009-07-24 13:59:27 +00005686 .name = "MX29LV040",
hailfingere1e41ea2011-07-27 07:13:06 +00005687 .bustype = BUS_PARALLEL,
mhmd3c80cd2010-09-15 23:31:03 +00005688 .manufacture_id = MACRONIX_ID,
5689 .model_id = MACRONIX_MX29LV040,
hailfinger286829b2009-01-08 03:40:17 +00005690 .total_size = 512,
5691 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00005692 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5693 .tested = TEST_UNTESTED,
5694 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +00005695 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00005696 .block_erasers =
5697 {
5698 {
5699 .eraseblocks = { {64 * 1024, 8}, },
snelsonc6855342010-01-28 23:55:12 +00005700 .block_erase = erase_sector_jedec,
snelson2d471072010-01-09 05:30:14 +00005701 }, {
5702 .eraseblocks = { {512 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +00005703 .block_erase = erase_chip_block_jedec,
snelson2d471072010-01-09 05:30:14 +00005704 },
5705 },
hailfingerfff99532009-11-27 17:49:42 +00005706 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00005707 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00005708 .voltage = {2700, 3600},
hailfinger033cdf02008-12-10 10:32:05 +00005709 },
5710
hailfinger286829b2009-01-08 03:40:17 +00005711 {
hailfinger0ae231d2010-07-29 20:01:13 +00005712 .vendor = "MoselVitelic",
5713 .name = "V29C51000B",
hailfingere1e41ea2011-07-27 07:13:06 +00005714 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +00005715 .manufacture_id = SYNCMOS_MVC_ID,
5716 .model_id = MVC_V29C51000B,
5717 .total_size = 64,
5718 .page_size = 512,
5719 .feature_bits = FEATURE_EITHER_RESET,
5720 .tested = TEST_UNTESTED,
5721 .probe = probe_jedec,
5722 .probe_timing = TIMING_ZERO,
5723 .block_erasers =
5724 {
5725 {
5726 .eraseblocks = { {512, 128} },
5727 .block_erase = erase_sector_jedec,
5728 }, {
5729 .eraseblocks = { {64 * 1024, 1} },
5730 .block_erase = erase_chip_block_jedec,
5731 },
5732 },
5733 .write = write_jedec_1,
5734 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00005735 .voltage = {4500, 5500},
hailfinger0ae231d2010-07-29 20:01:13 +00005736 },
5737
5738 {
5739 .vendor = "MoselVitelic",
5740 .name = "V29C51000T",
hailfingere1e41ea2011-07-27 07:13:06 +00005741 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +00005742 .manufacture_id = SYNCMOS_MVC_ID,
5743 .model_id = MVC_V29C51000T,
5744 .total_size = 64,
5745 .page_size = 512,
5746 .feature_bits = FEATURE_EITHER_RESET,
5747 .tested = TEST_UNTESTED,
5748 .probe = probe_jedec,
5749 .probe_timing = TIMING_ZERO,
5750 .block_erasers =
5751 {
5752 {
5753 .eraseblocks = { {512, 128} },
5754 .block_erase = erase_sector_jedec,
5755 }, {
5756 .eraseblocks = { {64 * 1024, 1} },
5757 .block_erase = erase_chip_block_jedec,
5758 },
5759 },
5760 .write = write_jedec_1,
5761 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00005762 .voltage = {4500, 5500},
hailfinger0ae231d2010-07-29 20:01:13 +00005763 },
5764
5765 {
5766 .vendor = "MoselVitelic",
5767 .name = "V29C51400B",
hailfingere1e41ea2011-07-27 07:13:06 +00005768 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +00005769 .manufacture_id = SYNCMOS_MVC_ID,
5770 .model_id = MVC_V29C51400B,
5771 .total_size = 512,
5772 .page_size = 1024,
5773 .feature_bits = FEATURE_EITHER_RESET,
5774 .tested = TEST_UNTESTED,
5775 .probe = probe_jedec,
5776 .probe_timing = TIMING_ZERO,
5777 .block_erasers =
5778 {
5779 {
5780 .eraseblocks = { {1024, 512} },
5781 .block_erase = erase_sector_jedec,
5782 }, {
5783 .eraseblocks = { {512 * 1024, 1} },
5784 .block_erase = erase_chip_block_jedec,
5785 },
5786 },
5787 .write = write_jedec_1,
5788 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00005789 .voltage = {4500, 5500},
hailfinger0ae231d2010-07-29 20:01:13 +00005790 },
5791
5792 {
5793 .vendor = "MoselVitelic",
5794 .name = "V29C51400T",
hailfingere1e41ea2011-07-27 07:13:06 +00005795 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +00005796 .manufacture_id = SYNCMOS_MVC_ID,
5797 .model_id = MVC_V29C51400T,
5798 .total_size = 512,
5799 .page_size = 1024,
5800 .feature_bits = FEATURE_EITHER_RESET,
5801 .tested = TEST_UNTESTED,
5802 .probe = probe_jedec,
5803 .probe_timing = TIMING_ZERO,
5804 .block_erasers =
5805 {
5806 {
5807 .eraseblocks = { {1024, 512} },
5808 .block_erase = erase_sector_jedec,
5809 }, {
5810 .eraseblocks = { {512 * 1024, 1} },
5811 .block_erase = erase_chip_block_jedec,
5812 },
5813 },
5814 .write = write_jedec_1,
5815 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00005816 .voltage = {4500, 5500},
hailfinger0ae231d2010-07-29 20:01:13 +00005817 },
5818
5819 {
5820 .vendor = "MoselVitelic",
5821 .name = "V29LC51000",
hailfingere1e41ea2011-07-27 07:13:06 +00005822 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +00005823 .manufacture_id = SYNCMOS_MVC_ID,
5824 .model_id = MVC_V29LC51000,
5825 .total_size = 64,
5826 .page_size = 512,
5827 .feature_bits = FEATURE_EITHER_RESET,
5828 .tested = TEST_UNTESTED,
5829 .probe = probe_jedec,
5830 .probe_timing = TIMING_ZERO,
5831 .block_erasers =
5832 {
5833 {
5834 .eraseblocks = { {512, 128} },
5835 .block_erase = erase_sector_jedec,
5836 }, {
5837 .eraseblocks = { {64 * 1024, 1} },
5838 .block_erase = erase_chip_block_jedec,
5839 },
5840 },
5841 .write = write_jedec_1,
5842 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00005843 .voltage = {4500, 5500},
hailfinger0ae231d2010-07-29 20:01:13 +00005844 },
5845
5846 {
5847 .vendor = "MoselVitelic",
5848 .name = "V29LC51001",
hailfingere1e41ea2011-07-27 07:13:06 +00005849 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +00005850 .manufacture_id = SYNCMOS_MVC_ID,
5851 .model_id = MVC_V29LC51001,
5852 .total_size = 128,
5853 .page_size = 512,
5854 .feature_bits = FEATURE_EITHER_RESET,
5855 .tested = TEST_UNTESTED,
5856 .probe = probe_jedec,
5857 .probe_timing = TIMING_ZERO,
5858 .block_erasers =
5859 {
5860 {
5861 .eraseblocks = { {512, 256} },
5862 .block_erase = erase_sector_jedec,
5863 }, {
5864 .eraseblocks = { {128 * 1024, 1} },
5865 .block_erase = erase_chip_block_jedec,
5866 },
5867 },
5868 .write = write_jedec_1,
5869 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00005870 .voltage = {4500, 5500},
hailfinger0ae231d2010-07-29 20:01:13 +00005871 },
5872
5873 {
5874 .vendor = "MoselVitelic",
5875 .name = "V29LC51002",
hailfingere1e41ea2011-07-27 07:13:06 +00005876 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +00005877 .manufacture_id = SYNCMOS_MVC_ID,
5878 .model_id = MVC_V29LC51002,
5879 .total_size = 256,
5880 .page_size = 512,
5881 .feature_bits = FEATURE_EITHER_RESET,
5882 .tested = TEST_UNTESTED,
5883 .probe = probe_jedec,
5884 .probe_timing = TIMING_ZERO,
5885 .block_erasers =
5886 {
5887 {
5888 .eraseblocks = { {512, 512} },
5889 .block_erase = erase_sector_jedec,
5890 }, {
5891 .eraseblocks = { {256 * 1024, 1} },
5892 .block_erase = erase_chip_block_jedec,
5893 },
5894 },
5895 .write = write_jedec_1,
5896 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00005897 .voltage = {4500, 5500},
hailfinger0ae231d2010-07-29 20:01:13 +00005898 },
5899
5900 {
hailfinger286829b2009-01-08 03:40:17 +00005901 .vendor = "Numonyx",
5902 .name = "M25PE10",
hailfingere1e41ea2011-07-27 07:13:06 +00005903 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00005904 .manufacture_id = ST_ID,
hailfingerc391ccb2009-06-12 11:45:10 +00005905 .model_id = ST_M25PE10,
hailfinger286829b2009-01-08 03:40:17 +00005906 .total_size = 128,
5907 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08005908 .feature_bits = FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00005909 .tested = TEST_UNTESTED,
5910 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00005911 .probe_timing = TIMING_ZERO,
snelson4d31f0d2010-01-19 03:23:07 +00005912 .block_erasers =
5913 {
5914 {
5915 .eraseblocks = { {4 * 1024, 32} },
5916 .block_erase = spi_block_erase_20,
5917 }, {
5918 .eraseblocks = { {64 * 1024, 2} },
5919 .block_erase = spi_block_erase_d8,
5920 }, {
5921 .eraseblocks = { {128 * 1024, 1} },
5922 .block_erase = spi_block_erase_c7,
5923 }
5924 },
hailfingerb9560ee2010-07-14 20:21:22 +00005925 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00005926 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00005927 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00005928 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00005929 },
5930
hailfinger286829b2009-01-08 03:40:17 +00005931 {
5932 .vendor = "Numonyx",
5933 .name = "M25PE20",
hailfingere1e41ea2011-07-27 07:13:06 +00005934 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00005935 .manufacture_id = ST_ID,
hailfingerc391ccb2009-06-12 11:45:10 +00005936 .model_id = ST_M25PE20,
hailfinger286829b2009-01-08 03:40:17 +00005937 .total_size = 256,
5938 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08005939 .feature_bits = FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00005940 .tested = TEST_UNTESTED,
5941 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00005942 .probe_timing = TIMING_ZERO,
snelson4d31f0d2010-01-19 03:23:07 +00005943 .block_erasers =
5944 {
5945 {
5946 .eraseblocks = { {4 * 1024, 64} },
5947 .block_erase = spi_block_erase_20,
5948 }, {
5949 .eraseblocks = { {64 * 1024, 4} },
5950 .block_erase = spi_block_erase_d8,
5951 }, {
5952 .eraseblocks = { {256 * 1024, 1} },
5953 .block_erase = spi_block_erase_c7,
5954 }
5955 },
hailfingerb9560ee2010-07-14 20:21:22 +00005956 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00005957 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00005958 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00005959 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00005960 },
5961
hailfinger286829b2009-01-08 03:40:17 +00005962 {
5963 .vendor = "Numonyx",
5964 .name = "M25PE40",
hailfingere1e41ea2011-07-27 07:13:06 +00005965 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00005966 .manufacture_id = ST_ID,
hailfingerc391ccb2009-06-12 11:45:10 +00005967 .model_id = ST_M25PE40,
snelson4d31f0d2010-01-19 03:23:07 +00005968 .total_size = 512,
hailfinger286829b2009-01-08 03:40:17 +00005969 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08005970 .feature_bits = FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00005971 .tested = TEST_UNTESTED,
5972 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00005973 .probe_timing = TIMING_ZERO,
snelson4d31f0d2010-01-19 03:23:07 +00005974 .block_erasers =
5975 {
5976 {
5977 .eraseblocks = { {4 * 1024, 128} },
5978 .block_erase = spi_block_erase_20,
5979 }, {
5980 .eraseblocks = { {64 * 1024, 8} },
5981 .block_erase = spi_block_erase_d8,
5982 }, {
5983 .eraseblocks = { {512 * 1024, 1} },
5984 .block_erase = spi_block_erase_c7,
5985 }
5986 },
hailfingerb9560ee2010-07-14 20:21:22 +00005987 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00005988 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00005989 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00005990 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00005991 },
5992
hailfinger286829b2009-01-08 03:40:17 +00005993 {
5994 .vendor = "Numonyx",
5995 .name = "M25PE80",
hailfingere1e41ea2011-07-27 07:13:06 +00005996 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00005997 .manufacture_id = ST_ID,
hailfingerc391ccb2009-06-12 11:45:10 +00005998 .model_id = ST_M25PE80,
hailfinger286829b2009-01-08 03:40:17 +00005999 .total_size = 1024,
6000 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08006001 .feature_bits = FEATURE_UNBOUND_READ,
Stefan Tauner718d1eb2016-08-18 18:00:53 -07006002 .tested = TEST_OK_PREWU,
hailfinger286829b2009-01-08 03:40:17 +00006003 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00006004 .probe_timing = TIMING_ZERO,
snelson4d31f0d2010-01-19 03:23:07 +00006005 .block_erasers =
6006 {
6007 {
6008 .eraseblocks = { {4 * 1024, 256} },
6009 .block_erase = spi_block_erase_20,
6010 }, {
6011 .eraseblocks = { {64 * 1024, 16} },
6012 .block_erase = spi_block_erase_d8,
6013 }, {
6014 .eraseblocks = { {1024 * 1024, 1} },
6015 .block_erase = spi_block_erase_c7,
6016 }
6017 },
hailfingerb9560ee2010-07-14 20:21:22 +00006018 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00006019 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00006020 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00006021 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00006022 },
6023
hailfinger286829b2009-01-08 03:40:17 +00006024 {
6025 .vendor = "Numonyx",
6026 .name = "M25PE16",
hailfingere1e41ea2011-07-27 07:13:06 +00006027 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00006028 .manufacture_id = ST_ID,
hailfingerc391ccb2009-06-12 11:45:10 +00006029 .model_id = ST_M25PE16,
hailfinger286829b2009-01-08 03:40:17 +00006030 .total_size = 2048,
6031 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08006032 .feature_bits = FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00006033 .tested = TEST_UNTESTED,
6034 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00006035 .probe_timing = TIMING_ZERO,
snelson4d31f0d2010-01-19 03:23:07 +00006036 .block_erasers =
6037 {
6038 {
6039 .eraseblocks = { {4 * 1024, 512} },
6040 .block_erase = spi_block_erase_20,
6041 }, {
6042 .eraseblocks = { {64 * 1024, 32} },
6043 .block_erase = spi_block_erase_d8,
6044 }, {
6045 .eraseblocks = { {2 * 1024 * 1024, 1} },
6046 .block_erase = spi_block_erase_c7,
6047 }
6048 },
hailfingerb9560ee2010-07-14 20:21:22 +00006049 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00006050 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00006051 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00006052 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00006053 },
6054
hailfinger286829b2009-01-08 03:40:17 +00006055 {
David Hendricksbfa624b2012-07-24 12:47:59 -07006056 .vendor = "Numonyx",
6057 /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */
6058 .name = "N25Q064..1E",
6059 .bustype = BUS_SPI,
6060 .manufacture_id = ST_ID,
6061 .model_id = ST_N25Q064__1E,
6062 .total_size = 8192,
6063 .page_size = 256,
6064 /* supports SFDP */
6065 /* OTP: 64B total; read 0x4B, write 0x42 */
Stefan Tauner9816fc82016-08-12 15:47:49 -07006066 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
David Hendricks488cf072015-11-23 16:45:07 -08006067 .tested = TEST_OK_PREWU,
David Hendricksbfa624b2012-07-24 12:47:59 -07006068 .probe = probe_spi_rdid,
6069 .probe_timing = TIMING_ZERO,
6070 .block_erasers =
6071 {
6072 {
6073 .eraseblocks = { {4 * 1024, 2048 } },
6074 .block_erase = spi_block_erase_20,
6075 }, {
6076 .eraseblocks = { {64 * 1024, 128} },
6077 .block_erase = spi_block_erase_d8,
6078 }, {
6079 .eraseblocks = { {8 * 1024 * 1024, 1} },
6080 .block_erase = spi_block_erase_c7,
6081 }
6082 },
6083 .unlock = spi_disable_blockprotect,
6084 .write = spi_chip_write_256,
6085 .read = spi_chip_read,
6086 .voltage = {1700, 2000},
6087 .wp = &wp_w25,
6088 },
6089
6090 {
6091 .vendor = "Numonyx",
6092 /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */
6093 .name = "N25Q064..3E",
6094 .bustype = BUS_SPI,
6095 .manufacture_id = ST_ID,
6096 .model_id = ST_N25Q064__3E,
6097 .total_size = 8192,
6098 .page_size = 256,
6099 /* supports SFDP */
6100 /* OTP: 64B total; read 0x4B, write 0x42 */
Stefan Tauner9816fc82016-08-12 15:47:49 -07006101 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
David Hendricks488cf072015-11-23 16:45:07 -08006102 .tested = TEST_OK_PREWU,
David Hendricksbfa624b2012-07-24 12:47:59 -07006103 .probe = probe_spi_rdid,
6104 .probe_timing = TIMING_ZERO,
6105 .block_erasers =
6106 {
6107 {
6108 .eraseblocks = { {4 * 1024, 2048 } },
6109 .block_erase = spi_block_erase_20,
6110 }, {
6111 .eraseblocks = { {64 * 1024, 128} },
6112 .block_erase = spi_block_erase_d8,
6113 }, {
6114 .eraseblocks = { {8 * 1024 * 1024, 1} },
6115 .block_erase = spi_block_erase_c7,
6116 }
6117 },
6118 .unlock = spi_disable_blockprotect,
6119 .write = spi_chip_write_256,
6120 .read = spi_chip_read,
6121 .voltage = {2700, 3600},
6122 .wp = &wp_w25,
6123 },
6124
6125 {
David Hendricks828a9b12015-03-20 11:24:28 -07006126 .vendor = "Numonyx",
Ed Swierkc3290082017-07-03 13:33:44 -07006127 .name = "N25Q256..3E/MT25QL256", /* ..3E/L = 3V, uniform 64KB/4KB blocks/sectors */
David Hendricks828a9b12015-03-20 11:24:28 -07006128 .bustype = BUS_SPI,
Ed Swierkc3290082017-07-03 13:33:44 -07006129 .manufacture_id = ST_ID,
David Hendricks828a9b12015-03-20 11:24:28 -07006130 .model_id = ST_N25Q256__3E,
Ed Swierkc3290082017-07-03 13:33:44 -07006131 .total_size = 32768,
David Hendricks828a9b12015-03-20 11:24:28 -07006132 .page_size = 256,
6133 /* supports SFDP */
6134 /* OTP: 64B total; read 0x4B, write 0x42 */
Ed Swierkc3290082017-07-03 13:33:44 -07006135 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP | FEATURE_4BA_SUPPORT,
6136 .four_bytes_addr_funcs =
6137 {
6138 .read_nbyte = spi_nbyte_read_4ba_direct,
6139 .program_byte = spi_byte_program_4ba_direct,
6140 .program_nbyte = spi_nbyte_program_4ba_direct
6141 },
David Hendricks488cf072015-11-23 16:45:07 -08006142 .tested = TEST_OK_PREWU,
David Hendricks828a9b12015-03-20 11:24:28 -07006143 .probe = probe_spi_rdid,
6144 .probe_timing = TIMING_ZERO,
Ed Swierkc3290082017-07-03 13:33:44 -07006145 .block_erasers = {
David Hendricks828a9b12015-03-20 11:24:28 -07006146 {
Ed Swierkc3290082017-07-03 13:33:44 -07006147 .eraseblocks = { {4 * 1024, 8192} },
6148 .block_erase = spi_block_erase_21_4ba_direct,
David Hendricks828a9b12015-03-20 11:24:28 -07006149 }, {
6150 .eraseblocks = { {64 * 1024, 512} },
Ed Swierkc3290082017-07-03 13:33:44 -07006151 .block_erase = spi_block_erase_dc_4ba_direct,
David Hendricks828a9b12015-03-20 11:24:28 -07006152 }, {
Ed Swierkc3290082017-07-03 13:33:44 -07006153 .eraseblocks = { {32768 * 1024, 1} },
David Hendricks828a9b12015-03-20 11:24:28 -07006154 .block_erase = spi_block_erase_c7,
6155 }
6156 },
Ed Swierkc3290082017-07-03 13:33:44 -07006157 .unlock = spi_disable_blockprotect, /* TODO: per 64kB sector lock registers */
6158 .write = spi_chip_write_256, /* Multi I/O supported */
6159 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
David Hendricks828a9b12015-03-20 11:24:28 -07006160 .voltage = {2700, 3600},
Ed Swierkc3290082017-07-03 13:33:44 -07006161 },
6162
6163 {
6164 .vendor = "Micron",
6165 .name = "N25Q512..3E/MT25QL512", /* ..3E/L = 3V, uniform 64KB/4KB blocks/sectors */
6166 .bustype = BUS_SPI,
6167 .manufacture_id = ST_ID,
6168 .model_id = ST_N25Q512__3E,
6169 .total_size = 65536,
6170 .page_size = 256,
6171 /* supports SFDP */
6172 /* OTP: 64B total; read 0x4B, write 0x42 */
6173 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_SUPPORT,
6174 .four_bytes_addr_funcs =
6175 {
6176 .read_nbyte = spi_nbyte_read_4ba_direct,
6177 .program_byte = spi_byte_program_4ba_direct,
6178 .program_nbyte = spi_nbyte_program_4ba_direct
6179 },
6180 .tested = TEST_OK_PREW,
6181 .probe = probe_spi_rdid,
6182 .probe_timing = TIMING_ZERO,
6183 .block_erasers = {
6184 {
6185 .eraseblocks = { {4 * 1024, 16384} },
6186 .block_erase = spi_block_erase_21_4ba_direct,
6187 }, {
6188 .eraseblocks = { {64 * 1024, 1024} },
6189 .block_erase = spi_block_erase_dc_4ba_direct,
6190 }, {
6191 .eraseblocks = { {65536 * 1024, 1} },
6192 .block_erase = spi_block_erase_c7,
6193 }
6194 },
6195 .unlock = spi_disable_blockprotect, /* TODO: per 64kB sector lock registers */
6196 .write = spi_chip_write_256, /* Multi I/O supported */
6197 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6198 .voltage = {2700, 3600},
David Hendricks828a9b12015-03-20 11:24:28 -07006199 },
6200
6201 {
hailfinger286829b2009-01-08 03:40:17 +00006202 .vendor = "PMC",
6203 .name = "Pm25LV010",
hailfingere1e41ea2011-07-27 07:13:06 +00006204 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00006205 .manufacture_id = PMC_ID,
mhmd3c80cd2010-09-15 23:31:03 +00006206 .model_id = PMC_PM25LV010,
hailfinger286829b2009-01-08 03:40:17 +00006207 .total_size = 128,
6208 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08006209 .feature_bits = FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00006210 .tested = TEST_UNTESTED,
6211 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00006212 .probe_timing = TIMING_ZERO,
snelson4d31f0d2010-01-19 03:23:07 +00006213 .block_erasers =
6214 {
6215 {
6216 .eraseblocks = { {4 * 1024, 32} },
6217 .block_erase = spi_block_erase_d7,
6218 }, {
6219 .eraseblocks = { {32 * 1024, 4} },
6220 .block_erase = spi_block_erase_d8,
6221 }, {
6222 .eraseblocks = { {128 * 1024, 1} },
6223 .block_erase = spi_block_erase_c7,
6224 }
6225 },
hailfingerb9560ee2010-07-14 20:21:22 +00006226 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00006227 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00006228 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00006229 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00006230 },
6231
hailfinger286829b2009-01-08 03:40:17 +00006232 {
6233 .vendor = "PMC",
6234 .name = "Pm25LV016B",
hailfingere1e41ea2011-07-27 07:13:06 +00006235 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00006236 .manufacture_id = PMC_ID,
mhmd3c80cd2010-09-15 23:31:03 +00006237 .model_id = PMC_PM25LV016B,
hailfinger286829b2009-01-08 03:40:17 +00006238 .total_size = 2048,
6239 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08006240 .feature_bits = FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00006241 .tested = TEST_UNTESTED,
6242 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00006243 .probe_timing = TIMING_ZERO,
snelson4d31f0d2010-01-19 03:23:07 +00006244 .block_erasers =
6245 {
6246 {
6247 .eraseblocks = { {4 * 1024, 512} },
6248 .block_erase = spi_block_erase_d7,
6249 }, {
6250 .eraseblocks = { {4 * 1024, 512} },
6251 .block_erase = spi_block_erase_20,
6252 }, {
6253 .eraseblocks = { {64 * 1024, 32} },
6254 .block_erase = spi_block_erase_d8,
6255 }, {
6256 .eraseblocks = { {2 * 1024 * 1024, 1} },
6257 .block_erase = spi_block_erase_60,
6258 }, {
6259 .eraseblocks = { {2 * 1024 * 1024, 1} },
6260 .block_erase = spi_block_erase_c7,
6261 }
6262 },
hailfingerb9560ee2010-07-14 20:21:22 +00006263 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00006264 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00006265 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +00006266 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00006267 },
6268
hailfinger286829b2009-01-08 03:40:17 +00006269 {
6270 .vendor = "PMC",
6271 .name = "Pm25LV020",
hailfingere1e41ea2011-07-27 07:13:06 +00006272 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00006273 .manufacture_id = PMC_ID,
mhmd3c80cd2010-09-15 23:31:03 +00006274 .model_id = PMC_PM25LV020,
hailfinger286829b2009-01-08 03:40:17 +00006275 .total_size = 256,
6276 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08006277 .feature_bits = FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00006278 .tested = TEST_UNTESTED,
6279 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00006280 .probe_timing = TIMING_ZERO,
snelson4d31f0d2010-01-19 03:23:07 +00006281 .block_erasers =
6282 {
6283 {
6284 .eraseblocks = { {4 * 1024, 64} },
6285 .block_erase = spi_block_erase_d7,
6286 }, {
6287 .eraseblocks = { {64 * 1024, 4} },
6288 .block_erase = spi_block_erase_d8,
6289 }, {
6290 .eraseblocks = { {256 * 1024, 1} },
6291 .block_erase = spi_block_erase_c7,
6292 }
6293 },
hailfingerb9560ee2010-07-14 20:21:22 +00006294 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00006295 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00006296 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00006297 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00006298 },
6299
hailfinger286829b2009-01-08 03:40:17 +00006300 {
6301 .vendor = "PMC",
6302 .name = "Pm25LV040",
hailfingere1e41ea2011-07-27 07:13:06 +00006303 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00006304 .manufacture_id = PMC_ID,
mhmd3c80cd2010-09-15 23:31:03 +00006305 .model_id = PMC_PM25LV040,
hailfinger286829b2009-01-08 03:40:17 +00006306 .total_size = 512,
6307 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08006308 .feature_bits = FEATURE_UNBOUND_READ,
6309 .tested = TEST_OK_PREWU,
hailfinger286829b2009-01-08 03:40:17 +00006310 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00006311 .probe_timing = TIMING_ZERO,
snelson4d31f0d2010-01-19 03:23:07 +00006312 .block_erasers =
6313 {
6314 {
6315 .eraseblocks = { {4 * 1024, 128} },
6316 .block_erase = spi_block_erase_d7,
6317 }, {
6318 .eraseblocks = { {64 * 1024, 8} },
6319 .block_erase = spi_block_erase_d8,
6320 }, {
6321 .eraseblocks = { {512 * 1024, 1} },
6322 .block_erase = spi_block_erase_c7,
6323 }
6324 },
hailfingerb9560ee2010-07-14 20:21:22 +00006325 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00006326 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00006327 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00006328 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00006329 },
6330
hailfinger286829b2009-01-08 03:40:17 +00006331 {
6332 .vendor = "PMC",
6333 .name = "Pm25LV080B",
hailfingere1e41ea2011-07-27 07:13:06 +00006334 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00006335 .manufacture_id = PMC_ID,
mhmd3c80cd2010-09-15 23:31:03 +00006336 .model_id = PMC_PM25LV080B,
hailfinger286829b2009-01-08 03:40:17 +00006337 .total_size = 1024,
6338 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08006339 .feature_bits = FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00006340 .tested = TEST_UNTESTED,
6341 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00006342 .probe_timing = TIMING_ZERO,
snelson4d31f0d2010-01-19 03:23:07 +00006343 .block_erasers =
6344 {
6345 {
6346 .eraseblocks = { {4 * 1024, 256} },
6347 .block_erase = spi_block_erase_d7,
6348 }, {
6349 .eraseblocks = { {4 * 1024, 256} },
6350 .block_erase = spi_block_erase_20,
6351 }, {
6352 .eraseblocks = { {64 * 1024, 16} },
6353 .block_erase = spi_block_erase_d8,
6354 }, {
6355 .eraseblocks = { {1024 * 1024, 1} },
6356 .block_erase = spi_block_erase_60,
6357 }, {
6358 .eraseblocks = { {1024 * 1024, 1} },
6359 .block_erase = spi_block_erase_c7,
6360 }
6361 },
hailfingerb9560ee2010-07-14 20:21:22 +00006362 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00006363 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00006364 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00006365 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00006366 },
6367
hailfinger286829b2009-01-08 03:40:17 +00006368 {
6369 .vendor = "PMC",
6370 .name = "Pm25LV512",
hailfingere1e41ea2011-07-27 07:13:06 +00006371 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00006372 .manufacture_id = PMC_ID,
mhmd3c80cd2010-09-15 23:31:03 +00006373 .model_id = PMC_PM25LV512,
hailfinger286829b2009-01-08 03:40:17 +00006374 .total_size = 64,
6375 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08006376 .feature_bits = FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00006377 .tested = TEST_UNTESTED,
6378 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00006379 .probe_timing = TIMING_ZERO,
snelson4d31f0d2010-01-19 03:23:07 +00006380 .block_erasers =
6381 {
6382 {
6383 .eraseblocks = { {4 * 1024, 16} },
6384 .block_erase = spi_block_erase_d7,
6385 }, {
6386 .eraseblocks = { {32 * 1024, 2} },
6387 .block_erase = spi_block_erase_d8,
6388 }, {
6389 .eraseblocks = { {64 * 1024, 1} },
6390 .block_erase = spi_block_erase_c7,
6391 }
6392 },
hailfingerb9560ee2010-07-14 20:21:22 +00006393 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00006394 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00006395 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +00006396 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00006397 },
6398
hailfinger286829b2009-01-08 03:40:17 +00006399 {
6400 .vendor = "PMC",
hailfingerc43afc92009-12-22 22:15:33 +00006401 .name = "Pm29F002T",
hailfingere1e41ea2011-07-27 07:13:06 +00006402 .bustype = BUS_PARALLEL,
uwe7a083f82009-06-14 21:53:26 +00006403 .manufacture_id = PMC_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00006404 .model_id = PMC_PM29F002T,
uwe7a083f82009-06-14 21:53:26 +00006405 .total_size = 256,
hailfingerc43afc92009-12-22 22:15:33 +00006406 .page_size = 8 * 1024,
snelsonc6855342010-01-28 23:55:12 +00006407 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Souvik Ghoshd64964a2016-06-13 17:51:25 -07006408 .tested = TEST_OK_PREW,
snelsonc6855342010-01-28 23:55:12 +00006409 .probe = probe_jedec,
Simon Glass8dc82732013-07-16 10:13:51 -06006410 .probe_timing = TIMING_FIXME,
hailfingerc43afc92009-12-22 22:15:33 +00006411 .block_erasers =
6412 {
6413 {
6414 .eraseblocks = {
6415 {128 * 1024, 1},
6416 {96 * 1024, 1},
6417 {8 * 1024, 2},
6418 {16 * 1024, 1},
6419 },
snelsonc6855342010-01-28 23:55:12 +00006420 .block_erase = erase_sector_jedec,
hailfingerc43afc92009-12-22 22:15:33 +00006421 }, {
6422 .eraseblocks = { {256 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +00006423 .block_erase = erase_chip_block_jedec,
hailfingerc43afc92009-12-22 22:15:33 +00006424 },
6425 },
snelsonc6855342010-01-28 23:55:12 +00006426 .write = write_jedec_1,
uwe7a083f82009-06-14 21:53:26 +00006427 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00006428 .voltage = {4500, 5500},
uwe7a083f82009-06-14 21:53:26 +00006429 },
6430
6431 {
6432 .vendor = "PMC",
hailfingerc43afc92009-12-22 22:15:33 +00006433 .name = "Pm29F002B",
hailfingere1e41ea2011-07-27 07:13:06 +00006434 .bustype = BUS_PARALLEL,
uwe7a083f82009-06-14 21:53:26 +00006435 .manufacture_id = PMC_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00006436 .model_id = PMC_PM29F002B,
uwe7a083f82009-06-14 21:53:26 +00006437 .total_size = 256,
hailfingerc43afc92009-12-22 22:15:33 +00006438 .page_size = 8 * 1024,
snelsonc6855342010-01-28 23:55:12 +00006439 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
uwe7a083f82009-06-14 21:53:26 +00006440 .tested = TEST_UNTESTED,
snelsonc6855342010-01-28 23:55:12 +00006441 .probe = probe_jedec,
Simon Glass8dc82732013-07-16 10:13:51 -06006442 .probe_timing = TIMING_FIXME,
hailfingerc43afc92009-12-22 22:15:33 +00006443 .block_erasers =
6444 {
6445 {
6446 .eraseblocks = {
6447 {16 * 1024, 1},
6448 {8 * 1024, 2},
6449 {96 * 1024, 1},
6450 {128 * 1024, 1},
6451 },
snelsonc6855342010-01-28 23:55:12 +00006452 .block_erase = erase_sector_jedec,
hailfingerc43afc92009-12-22 22:15:33 +00006453 }, {
6454 .eraseblocks = { {256 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +00006455 .block_erase = erase_chip_block_jedec,
hailfingerc43afc92009-12-22 22:15:33 +00006456 },
6457 },
snelsonc6855342010-01-28 23:55:12 +00006458 .write = write_jedec_1,
uwe7a083f82009-06-14 21:53:26 +00006459 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00006460 .voltage = {4500, 5500},
uwe7a083f82009-06-14 21:53:26 +00006461 },
6462
6463 {
6464 .vendor = "PMC",
ruika316f402009-05-17 17:02:07 +00006465 .name = "Pm39LV010",
hailfingere1e41ea2011-07-27 07:13:06 +00006466 .bustype = BUS_PARALLEL,
ruika316f402009-05-17 17:02:07 +00006467 .manufacture_id = PMC_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00006468 .model_id = PMC_PM39F010, /* Pm39LV010 and Pm39F010 have identical IDs but different voltage */
ruika316f402009-05-17 17:02:07 +00006469 .total_size = 128,
6470 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +00006471 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
stefanct98d917c2011-10-21 12:33:07 +00006472 .tested = TEST_OK_PREW,
ruika316f402009-05-17 17:02:07 +00006473 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00006474 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelson4d31f0d2010-01-19 03:23:07 +00006475 .block_erasers =
6476 {
6477 {
6478 .eraseblocks = { {4 * 1024, 32} },
6479 .block_erase = erase_sector_jedec,
6480 }, {
6481 .eraseblocks = { {64 * 1024, 2} },
6482 .block_erase = erase_block_jedec,
6483 }, {
6484 .eraseblocks = { {128 * 1024, 1} },
6485 .block_erase = erase_chip_block_jedec,
6486 }
6487 },
snelsonc6855342010-01-28 23:55:12 +00006488 .write = write_jedec_1,
ruika316f402009-05-17 17:02:07 +00006489 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00006490 .voltage = {2700, 3600},
ruika316f402009-05-17 17:02:07 +00006491 },
6492
6493 {
6494 .vendor = "PMC",
hailfingerd444cc72010-03-27 23:25:14 +00006495 .name = "Pm39LV020",
hailfingere1e41ea2011-07-27 07:13:06 +00006496 .bustype = BUS_PARALLEL,
hailfingerd444cc72010-03-27 23:25:14 +00006497 .manufacture_id = PMC_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00006498 .model_id = PMC_PM39LV020,
hailfingerd444cc72010-03-27 23:25:14 +00006499 .total_size = 256,
6500 .page_size = 4096,
6501 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
6502 .tested = TEST_UNTESTED,
6503 .probe = probe_jedec,
6504 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
6505 .block_erasers =
6506 {
6507 {
6508 .eraseblocks = { {4 * 1024, 64} },
6509 .block_erase = erase_sector_jedec,
6510 }, {
6511 .eraseblocks = { {64 * 1024, 4} },
6512 .block_erase = erase_block_jedec,
6513 }, {
6514 .eraseblocks = { {256 * 1024, 1} },
6515 .block_erase = erase_chip_block_jedec,
6516 }
6517 },
6518 .write = write_jedec_1,
6519 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00006520 .voltage = {2700, 3600},
hailfingerd444cc72010-03-27 23:25:14 +00006521 },
6522
6523 {
6524 .vendor = "PMC",
6525 .name = "Pm39LV040",
hailfingere1e41ea2011-07-27 07:13:06 +00006526 .bustype = BUS_PARALLEL,
hailfingerd444cc72010-03-27 23:25:14 +00006527 .manufacture_id = PMC_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00006528 .model_id = PMC_PM39LV040,
hailfingerd444cc72010-03-27 23:25:14 +00006529 .total_size = 512,
6530 .page_size = 4096,
6531 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
stefanct98d917c2011-10-21 12:33:07 +00006532 .tested = TEST_OK_PR,
hailfingerd444cc72010-03-27 23:25:14 +00006533 .probe = probe_jedec,
6534 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
6535 .block_erasers =
6536 {
6537 {
6538 .eraseblocks = { {4 * 1024, 128} },
6539 .block_erase = erase_sector_jedec,
6540 }, {
6541 .eraseblocks = { {64 * 1024, 8} },
6542 .block_erase = erase_block_jedec,
6543 }, {
6544 .eraseblocks = { {512 * 1024, 1} },
6545 .block_erase = erase_chip_block_jedec,
6546 }
6547 },
6548 .write = write_jedec_1,
6549 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00006550 .voltage = {2700, 3600},
hailfingerd444cc72010-03-27 23:25:14 +00006551 },
Simon Glass8dc82732013-07-16 10:13:51 -06006552
hailfingerd444cc72010-03-27 23:25:14 +00006553 {
6554 .vendor = "PMC",
hailfinger286829b2009-01-08 03:40:17 +00006555 .name = "Pm49FL002",
hailfingere1e41ea2011-07-27 07:13:06 +00006556 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00006557 .manufacture_id = PMC_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00006558 .model_id = PMC_PM49FL002,
hailfinger286829b2009-01-08 03:40:17 +00006559 .total_size = 256,
6560 .page_size = 16 * 1024,
snelsonc6855342010-01-28 23:55:12 +00006561 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
David Hendricksc801adb2010-12-09 16:58:56 -08006562 .tested = TEST_OK_PRE,
hailfingerafac00e2010-01-09 02:24:17 +00006563 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00006564 .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
snelson4d31f0d2010-01-19 03:23:07 +00006565 .block_erasers =
6566 {
6567 {
6568 .eraseblocks = { {4 * 1024, 64} },
6569 .block_erase = erase_sector_jedec,
6570 }, {
6571 .eraseblocks = { {16 * 1024, 16} },
6572 .block_erase = erase_block_jedec,
6573 }, {
6574 .eraseblocks = { {256 * 1024, 1} },
6575 .block_erase = erase_chip_block_jedec,
6576 }
6577 },
snelson1ee293c2010-02-19 00:52:10 +00006578 .unlock = unlock_49fl00x,
snelson59c83d22010-02-27 18:01:15 +00006579 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00006580 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00006581 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00006582 },
6583
hailfinger286829b2009-01-08 03:40:17 +00006584 {
6585 .vendor = "PMC",
6586 .name = "Pm49FL004",
hailfingere1e41ea2011-07-27 07:13:06 +00006587 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00006588 .manufacture_id = PMC_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00006589 .model_id = PMC_PM49FL004,
hailfinger286829b2009-01-08 03:40:17 +00006590 .total_size = 512,
6591 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00006592 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
David Hendricksc801adb2010-12-09 16:58:56 -08006593 .tested = TEST_OK_PRE,
hailfingerafac00e2010-01-09 02:24:17 +00006594 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00006595 .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
snelson4d31f0d2010-01-19 03:23:07 +00006596 .block_erasers =
6597 {
6598 {
6599 .eraseblocks = { {4 * 1024, 128} },
6600 .block_erase = erase_sector_jedec,
6601 }, {
6602 .eraseblocks = { {64 * 1024, 8} },
6603 .block_erase = erase_block_jedec,
6604 }, {
6605 .eraseblocks = { {512 * 1024, 1} },
6606 .block_erase = erase_chip_block_jedec,
6607 }
6608 },
snelson1ee293c2010-02-19 00:52:10 +00006609 .unlock = unlock_49fl00x,
snelson59c83d22010-02-27 18:01:15 +00006610 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00006611 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00006612 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00006613 },
6614
hailfinger286829b2009-01-08 03:40:17 +00006615 {
hailfingerf6aa9cc2009-11-24 02:11:08 +00006616 .vendor = "Sanyo",
6617 .name = "LF25FW203A",
hailfingere1e41ea2011-07-27 07:13:06 +00006618 .bustype = BUS_SPI,
hailfingerf6aa9cc2009-11-24 02:11:08 +00006619 .manufacture_id = SANYO_ID,
6620 .model_id = SANYO_LE25FW203A,
6621 .total_size = 2048,
6622 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08006623 .feature_bits = FEATURE_UNBOUND_READ,
hailfingerf6aa9cc2009-11-24 02:11:08 +00006624 .tested = TEST_UNTESTED,
6625 .probe = probe_spi_rdid,
6626 .probe_timing = TIMING_ZERO,
snelson4d31f0d2010-01-19 03:23:07 +00006627 .block_erasers =
6628 {
6629 {
6630 .eraseblocks = { {64 * 1024, 32} },
6631 .block_erase = spi_block_erase_d8,
6632 }, {
6633 .eraseblocks = { {2 * 1024 * 1024, 1} },
6634 .block_erase = spi_block_erase_c7,
6635 }
6636 },
hailfingerb9560ee2010-07-14 20:21:22 +00006637 .unlock = spi_disable_blockprotect,
hailfingerf6aa9cc2009-11-24 02:11:08 +00006638 .write = spi_chip_write_256,
6639 .read = spi_chip_read,
6640 },
6641
6642 {
hailfinger286829b2009-01-08 03:40:17 +00006643 .vendor = "Sharp",
uwe8e0cff52011-08-25 22:44:11 +00006644 .name = "LH28F008BJT-BTLZ1",
6645 .bustype = BUS_PARALLEL,
6646 .manufacture_id = SHARP_ID,
Patrick Georgi07e1ed92017-02-06 11:37:23 +01006647 .model_id = SHARP_LH28F008BJ__PB,
uwe8e0cff52011-08-25 22:44:11 +00006648 .total_size = 1024,
6649 .page_size = 64 * 1024,
6650 .tested = TEST_OK_PREW,
6651 .probe = probe_82802ab,
6652 .probe_timing = TIMING_ZERO,
6653 .block_erasers =
6654 {
6655 {
6656 .eraseblocks = {
6657 {8 * 1024, 8},
6658 {64 * 1024, 15}
6659 },
6660 .block_erase = erase_block_82802ab,
6661 }, {
6662 .eraseblocks = { {1024 * 1024, 1} },
6663 .block_erase = erase_sector_49lfxxxc,
6664 }
6665 },
6666 .unlock = unlock_lh28f008bjt,
6667 .write = write_82802ab,
6668 .read = read_memmapped,
6669 .voltage = {2700, 3600},
6670 },
6671
6672 {
6673 .vendor = "Sharp",
hailfinger286829b2009-01-08 03:40:17 +00006674 .name = "LHF00L04",
hailfingere1e41ea2011-07-27 07:13:06 +00006675 .bustype = BUS_FWH, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00006676 .manufacture_id = SHARP_ID,
6677 .model_id = SHARP_LHF00L04,
6678 .total_size = 1024,
6679 .page_size = 64 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00006680 .feature_bits = FEATURE_EITHER_RESET | FEATURE_REGISTERMAP,
hailfinger286829b2009-01-08 03:40:17 +00006681 .tested = TEST_UNTESTED,
hailfingerb8e4e212010-03-15 03:48:42 +00006682 .probe = probe_82802ab,
hailfinger4481d9d2010-01-07 21:23:45 +00006683 .probe_timing = TIMING_ZERO,
hailfinger4481d9d2010-01-07 21:23:45 +00006684 .block_erasers =
6685 {
6686 {
6687 .eraseblocks = {
6688 {64 * 1024, 15},
6689 {8 * 1024, 8}
6690 },
snelsonc0acbeb2010-03-19 18:47:06 +00006691 .block_erase = erase_block_82802ab,
hailfinger4481d9d2010-01-07 21:23:45 +00006692 }, {
6693 .eraseblocks = {
6694 {1024 * 1024, 1}
6695 },
snelson264e57c2010-01-20 20:55:53 +00006696 .block_erase = NULL, /* 30 D0, only in A/A mux mode */
hailfinger4481d9d2010-01-07 21:23:45 +00006697 },
6698 },
snelsonc0acbeb2010-03-19 18:47:06 +00006699 .unlock = unlock_82802ab,
6700 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00006701 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00006702 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00006703 },
6704
hailfinger286829b2009-01-08 03:40:17 +00006705 {
6706 .vendor = "Spansion",
hailfinger5fece212010-11-29 00:37:49 +00006707 .name = "S25FL004A",
hailfingere1e41ea2011-07-27 07:13:06 +00006708 .bustype = BUS_SPI,
hailfinger5fece212010-11-29 00:37:49 +00006709 .manufacture_id = SPANSION_ID,
6710 .model_id = SPANSION_S25FL004A,
6711 .total_size = 512,
6712 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08006713 .feature_bits = FEATURE_UNBOUND_READ,
hailfinger5fece212010-11-29 00:37:49 +00006714 .tested = TEST_UNTESTED,
6715 .probe = probe_spi_rdid,
6716 .probe_timing = TIMING_ZERO,
6717 .block_erasers =
6718 {
6719 {
6720 .eraseblocks = { {64 * 1024, 8} },
6721 .block_erase = spi_block_erase_d8,
6722 }, {
6723 .eraseblocks = { {512 * 1024, 1} },
6724 .block_erase = spi_block_erase_c7,
6725 }
6726 },
6727 .unlock = spi_disable_blockprotect,
6728 .write = spi_chip_write_256,
6729 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +00006730 .voltage = {2700, 3600},
hailfinger5fece212010-11-29 00:37:49 +00006731 },
6732
6733 {
6734 .vendor = "Spansion",
David Hendricks668f29d2011-01-27 18:51:45 -08006735 .name = "S25FL004A",
hailfingere1e41ea2011-07-27 07:13:06 +00006736 .bustype = BUS_SPI,
David Hendricks668f29d2011-01-27 18:51:45 -08006737 .manufacture_id = SPANSION_ID,
6738 .model_id = SPANSION_S25FL004A,
6739 .total_size = 512,
6740 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08006741 .feature_bits = FEATURE_UNBOUND_READ,
David Hendricks668f29d2011-01-27 18:51:45 -08006742 .tested = TEST_UNTESTED,
6743 .probe = probe_spi_rdid,
6744 .probe_timing = TIMING_ZERO,
6745 .block_erasers =
6746 {
6747 {
6748 .eraseblocks = { {64 * 1024, 8} },
6749 .block_erase = spi_block_erase_d8,
6750 }, {
6751 .eraseblocks = { {512 * 1024, 1} },
6752 .block_erase = spi_block_erase_c7,
6753 }
6754 },
6755 .unlock = spi_disable_blockprotect,
6756 .write = spi_chip_write_256,
6757 .read = spi_chip_read,
6758 },
6759
6760 {
6761 .vendor = "Spansion",
mkarcher7b3a9152010-01-12 23:29:30 +00006762 .name = "S25FL008A",
hailfingere1e41ea2011-07-27 07:13:06 +00006763 .bustype = BUS_SPI,
mkarcher7b3a9152010-01-12 23:29:30 +00006764 .manufacture_id = SPANSION_ID,
6765 .model_id = SPANSION_S25FL008A,
6766 .total_size = 1024,
6767 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08006768 .feature_bits = FEATURE_UNBOUND_READ,
6769 .tested = TEST_OK_PREU,
mkarcher7b3a9152010-01-12 23:29:30 +00006770 .probe = probe_spi_rdid,
6771 .probe_timing = TIMING_ZERO,
mkarcher7b3a9152010-01-12 23:29:30 +00006772 .block_erasers =
6773 {
6774 {
6775 .eraseblocks = { {64 * 1024, 16} },
6776 .block_erase = spi_block_erase_d8,
6777 }, {
6778 .eraseblocks = { {1024 * 1024, 1} },
6779 .block_erase = spi_block_erase_c7,
6780 }
6781 },
hailfingerb9560ee2010-07-14 20:21:22 +00006782 .unlock = spi_disable_blockprotect,
mkarcher7b3a9152010-01-12 23:29:30 +00006783 .write = spi_chip_write_256,
6784 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00006785 .voltage = {2700, 3600},
mkarcher7b3a9152010-01-12 23:29:30 +00006786 },
6787
6788 {
6789 .vendor = "Spansion",
hailfinger286829b2009-01-08 03:40:17 +00006790 .name = "S25FL016A",
hailfingere1e41ea2011-07-27 07:13:06 +00006791 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00006792 .manufacture_id = SPANSION_ID,
6793 .model_id = SPANSION_S25FL016A,
6794 .total_size = 2048,
6795 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08006796 .feature_bits = FEATURE_UNBOUND_READ,
6797 .tested = TEST_OK_PRU,
hailfinger286829b2009-01-08 03:40:17 +00006798 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00006799 .probe_timing = TIMING_ZERO,
snelson4d31f0d2010-01-19 03:23:07 +00006800 .block_erasers =
6801 {
6802 {
6803 .eraseblocks = { {64 * 1024, 32} },
6804 .block_erase = spi_block_erase_d8,
6805 }, {
6806 .eraseblocks = { {2 * 1024 * 1024, 1} },
6807 .block_erase = spi_block_erase_c7,
6808 }
6809 },
hailfingerb9560ee2010-07-14 20:21:22 +00006810 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00006811 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00006812 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00006813 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00006814 },
6815
hailfinger286829b2009-01-08 03:40:17 +00006816 {
hailfinger5fece212010-11-29 00:37:49 +00006817 .vendor = "Spansion",
6818 .name = "S25FL032A",
hailfingere1e41ea2011-07-27 07:13:06 +00006819 .bustype = BUS_SPI,
hailfinger5fece212010-11-29 00:37:49 +00006820 .manufacture_id = SPANSION_ID,
6821 .model_id = SPANSION_S25FL032A,
6822 .total_size = 4096,
6823 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08006824 .feature_bits = FEATURE_UNBOUND_READ,
hailfinger5fece212010-11-29 00:37:49 +00006825 .tested = TEST_UNTESTED,
6826 .probe = probe_spi_rdid,
6827 .probe_timing = TIMING_ZERO,
6828 .block_erasers =
6829 {
6830 {
6831 .eraseblocks = { {64 * 1024, 64} },
6832 .block_erase = spi_block_erase_d8,
6833 }, {
6834 .eraseblocks = { {4 * 1024 * 1024, 1} },
6835 .block_erase = spi_block_erase_c7,
6836 }
6837 },
6838 .unlock = spi_disable_blockprotect,
6839 .write = spi_chip_write_256,
6840 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +00006841 .voltage = {2700, 3600},
hailfinger5fece212010-11-29 00:37:49 +00006842 },
6843
6844 {
6845 .vendor = "Spansion",
6846 .name = "S25FL064A",
hailfingere1e41ea2011-07-27 07:13:06 +00006847 .bustype = BUS_SPI,
hailfinger5fece212010-11-29 00:37:49 +00006848 .manufacture_id = SPANSION_ID,
6849 .model_id = SPANSION_S25FL064A,
6850 .total_size = 8192,
6851 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08006852 .feature_bits = FEATURE_UNBOUND_READ,
6853 .tested = TEST_OK_PREWU,
hailfinger5fece212010-11-29 00:37:49 +00006854 .probe = probe_spi_rdid,
6855 .probe_timing = TIMING_ZERO,
6856 .block_erasers =
6857 {
6858 {
6859 .eraseblocks = { {64 * 1024, 128} },
6860 .block_erase = spi_block_erase_d8,
6861 }, {
6862 .eraseblocks = { {8 * 1024 * 1024, 1} },
6863 .block_erase = spi_block_erase_c7,
6864 }
6865 },
6866 .unlock = spi_disable_blockprotect,
6867 .write = spi_chip_write_256,
6868 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +00006869 .voltage = {2700, 3600},
hailfinger5fece212010-11-29 00:37:49 +00006870 },
6871
6872 {
David Hendrickse0a15c42014-06-20 18:21:25 -07006873 .vendor = "Spansion",
David Hendricks8401b922014-11-21 16:45:08 -08006874 .name = "S25FL116K",
6875 .bustype = BUS_SPI,
6876 .manufacture_id = SPANSION_ID,
6877 .model_id = SPANSION_S25FL116K,
6878 .total_size = 2048,
6879 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08006880 .feature_bits = FEATURE_UNBOUND_READ,
6881 .tested = TEST_OK_PREWU,
David Hendricks8401b922014-11-21 16:45:08 -08006882 .probe = probe_spi_rdid,
6883 .probe_timing = TIMING_ZERO,
6884 .block_erasers =
6885 {
6886 {
6887 .eraseblocks = { {4 * 1024, 512} },
6888 .block_erase = spi_block_erase_20,
6889 }, {
6890 .eraseblocks = { {64 * 1024, 32} },
6891 .block_erase = spi_block_erase_d8,
6892 }, {
6893 .eraseblocks = { {2 * 1024 * 1024, 1} },
6894 .block_erase = spi_block_erase_c7,
6895 }
6896 },
6897 .unlock = spi_disable_blockprotect,
6898 .write = spi_chip_write_256,
6899 .read = spi_chip_read,
6900 .voltage = {2700, 3600},
6901 /* TODO: write-protection */
6902 },
6903
6904 {
6905 .vendor = "Spansion",
Vadim Bendebury3a501162014-10-21 20:38:13 -07006906 .name = "S25FS128S Large Sectors",
David Hendrickse0a15c42014-06-20 18:21:25 -07006907 .bustype = BUS_SPI,
6908 .manufacture_id = SPANSION_ID,
Vadim Bendebury3a501162014-10-21 20:38:13 -07006909 .model_id = SPANSION_S25FS128S_L,
David Hendrickse0a15c42014-06-20 18:21:25 -07006910 .total_size = 16384,
6911 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08006912 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
Vadim Bendebury3a501162014-10-21 20:38:13 -07006913 .tested = TEST_UNTESTED,
6914 .probe = probe_spi_big_spansion,
David Hendrickse0a15c42014-06-20 18:21:25 -07006915 .probe_timing = TIMING_ZERO,
6916 .block_erasers =
6917 {
6918 {
6919 .eraseblocks = { {64 * 1024, 256} },
David Hendricks398714f2014-07-03 17:49:41 -07006920 .block_erase = s25fs_block_erase_d8,
David Hendrickse0a15c42014-06-20 18:21:25 -07006921 }, {
6922 .eraseblocks = { {16 * 1024 * 1024, 1} },
6923 .block_erase = spi_block_erase_60,
6924 }, {
6925 .eraseblocks = { {16 * 1024 * 1024, 1} },
6926 .block_erase = spi_block_erase_c7,
6927 },
6928 },
6929 .unlock = spi_disable_blockprotect,
6930 .write = spi_chip_write_256,
6931 .read = spi_chip_read,
6932 .voltage = {1700, 2000},
David Hendricksa9884852014-12-11 15:31:12 -08006933 .wp = &wp_generic,
David Hendrickse0a15c42014-06-20 18:21:25 -07006934 },
6935
6936 {
Vadim Bendebury3a501162014-10-21 20:38:13 -07006937 .vendor = "Spansion",
6938 .name = "S25FS128S Small Sectors",
6939 .bustype = BUS_SPI,
6940 .manufacture_id = SPANSION_ID,
6941 .model_id = SPANSION_S25FS128S_S,
6942 .total_size = 16384,
6943 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08006944 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
6945 .tested = TEST_OK_PREWU,
Vadim Bendebury3a501162014-10-21 20:38:13 -07006946 .probe = probe_spi_big_spansion,
6947 .probe_timing = TIMING_ZERO,
6948 .block_erasers =
6949 {
6950 {
6951 .eraseblocks = { {64 * 1024, 256} },
6952 .block_erase = s25fs_block_erase_d8,
6953 }, {
6954 .eraseblocks = { {16 * 1024 * 1024, 1} },
6955 .block_erase = spi_block_erase_60,
6956 }, {
6957 .eraseblocks = { {16 * 1024 * 1024, 1} },
6958 .block_erase = spi_block_erase_c7,
6959 },
6960 },
6961 .unlock = spi_disable_blockprotect,
6962 .write = spi_chip_write_256,
6963 .read = spi_chip_read,
6964 .voltage = {1700, 2000},
David Hendricksa9884852014-12-11 15:31:12 -08006965 .wp = &wp_generic,
Vadim Bendebury3a501162014-10-21 20:38:13 -07006966 },
6967
6968 {
6969 .vendor = "Spansion",
6970 .name = "S25FL256S Large Sectors",
6971 .bustype = BUS_SPI,
6972 .manufacture_id = SPANSION_ID,
Shelley Chen93a1c802014-12-30 17:09:48 -08006973 .model_id = SPANSION_S25FL256S_UL,
Vadim Bendebury3a501162014-10-21 20:38:13 -07006974 .total_size = 16384, /* This is just half the size.... */
6975 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08006976 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
Vadim Bendebury3a501162014-10-21 20:38:13 -07006977 .tested = TEST_UNTESTED,
6978 .probe = probe_spi_big_spansion,
6979 .probe_timing = TIMING_ZERO,
6980 .block_erasers =
6981 {
6982 {
6983 .eraseblocks = { {256 * 1024, 64} },
6984 .block_erase = s25fl_block_erase,
6985 }, {
6986 .eraseblocks = { {16 * 1024 * 1024, 1} },
6987 .block_erase = spi_block_erase_60,
6988 },
6989 },
6990 .unlock = spi_disable_blockprotect,
6991 .write = spi_chip_write_256,
6992 .read = spi_chip_read,
6993 .voltage = {1700, 2000},
David Hendricksc694bb82015-02-25 14:52:17 -08006994 .wp = &wp_generic,
Vadim Bendebury3a501162014-10-21 20:38:13 -07006995 },
6996
6997 {
6998 .vendor = "Spansion",
6999 .name = "S25FL256S Small Sectors",
7000 .bustype = BUS_SPI,
7001 .manufacture_id = SPANSION_ID,
Shelley Chen93a1c802014-12-30 17:09:48 -08007002 .model_id = SPANSION_S25FL256S_US,
Vadim Bendebury3a501162014-10-21 20:38:13 -07007003 .total_size = 16384, /* This is just half the size.... */
7004 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08007005 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
7006 .tested = TEST_OK_PREWU,
Vadim Bendebury3a501162014-10-21 20:38:13 -07007007 .probe = probe_spi_big_spansion,
7008 .probe_timing = TIMING_ZERO,
7009 .block_erasers =
7010 {
7011 {
7012 .eraseblocks = { {64 * 1024, 256} },
7013 .block_erase = s25fl_block_erase,
7014 }, {
7015 .eraseblocks = { {16 * 1024 * 1024, 1} },
7016 .block_erase = spi_block_erase_60,
7017 },
7018 },
7019 .unlock = spi_disable_blockprotect,
7020 .write = spi_chip_write_256,
7021 .read = spi_chip_read,
7022 .voltage = {1700, 2000},
David Hendricksc694bb82015-02-25 14:52:17 -08007023 .wp = &wp_generic,
Vadim Bendebury3a501162014-10-21 20:38:13 -07007024 },
7025
7026 {
Shelley Chen93a1c802014-12-30 17:09:48 -08007027 .vendor = "Spansion",
7028 .name = "S25FL128S_UL Uniform 128 kB Sectors",
7029 .bustype = BUS_SPI,
7030 .manufacture_id = SPANSION_ID,
7031 .model_id = SPANSION_S25FL128S_UL,
7032 .total_size = 16384,
7033 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08007034 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
Shelley Chen93a1c802014-12-30 17:09:48 -08007035 .tested = TEST_UNTESTED,
7036 .probe = probe_spi_big_spansion,
7037 .probe_timing = TIMING_ZERO,
7038 .block_erasers =
7039 {
7040 {
7041 .eraseblocks = { {128 * 1024, 128} },
7042 .block_erase = spi_block_erase_d8,
7043 }, {
7044 .eraseblocks = { {16 * 1024 * 1024, 1} },
7045 .block_erase = spi_block_erase_60,
7046 }, {
7047 .eraseblocks = { {16 * 1024 * 1024, 1} },
7048 .block_erase = spi_block_erase_c7,
7049 },
7050 },
7051 .unlock = spi_disable_blockprotect,
7052 .write = spi_chip_write_256,
7053 .read = spi_chip_read,
7054 .voltage = {1700, 2000},
7055 .wp = &wp_generic,
7056 },
7057
7058 {
7059 .vendor = "Spansion",
7060 .name = "S25FL128S_US Uniform 64 kB Sectors",
7061 .bustype = BUS_SPI,
7062 .manufacture_id = SPANSION_ID,
7063 .model_id = SPANSION_S25FL128S_US,
7064 .total_size = 16384,
7065 .page_size = 256,
7066 .feature_bits = FEATURE_WRSR_WREN,
7067 .tested = TEST_UNTESTED,
7068 .probe = probe_spi_big_spansion,
7069 .probe_timing = TIMING_ZERO,
7070 .block_erasers =
7071 {
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 },
7083 .unlock = spi_disable_blockprotect,
7084 .write = spi_chip_write_256,
7085 .read = spi_chip_read,
7086 .voltage = {1700, 2000},
7087 .wp = &wp_generic,
7088 },
7089
7090 {
hailfinger286829b2009-01-08 03:40:17 +00007091 .vendor = "SST",
stefanct753c1a52011-08-17 09:50:11 +00007092 .name = "SST25LF040A",
7093 .bustype = BUS_SPI,
7094 .manufacture_id = SST_ID,
7095 .model_id = SST_SST25VF040_REMS,
7096 .total_size = 512,
7097 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08007098 .feature_bits = FEATURE_UNBOUND_READ,
7099 .tested = TEST_OK_PREWU,
stefanct753c1a52011-08-17 09:50:11 +00007100 .probe = probe_spi_res2,
7101 .probe_timing = TIMING_ZERO,
7102 .block_erasers =
7103 {
7104 {
7105 .eraseblocks = { {4 * 1024, 128} },
7106 .block_erase = spi_block_erase_20,
7107 }, {
7108 .eraseblocks = { {32 * 1024, 16} },
7109 .block_erase = spi_block_erase_52,
7110 }, {
7111 .eraseblocks = { {512 * 1024, 1} },
7112 .block_erase = spi_block_erase_60,
7113 },
7114 },
7115 .unlock = spi_disable_blockprotect,
7116 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
7117 .read = spi_chip_read,
7118 .voltage = {3000, 3600},
7119 },
7120
7121 {
7122 .vendor = "SST",
7123 .name = "SST25LF080A",
7124 .bustype = BUS_SPI,
7125 .manufacture_id = SST_ID,
7126 .model_id = SST_SST25VF080_REMS,
7127 .total_size = 1024,
7128 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08007129 .feature_bits = FEATURE_UNBOUND_READ,
stefanct753c1a52011-08-17 09:50:11 +00007130 .tested = TEST_UNTESTED,
7131 .probe = probe_spi_res2,
7132 .probe_timing = TIMING_ZERO,
7133 .block_erasers =
7134 {
7135 {
7136 .eraseblocks = { {4 * 1024, 256} },
7137 .block_erase = spi_block_erase_20,
7138 }, {
7139 .eraseblocks = { {32 * 1024, 32} },
7140 .block_erase = spi_block_erase_52,
7141 }, {
7142 .eraseblocks = { {1024 * 1024, 1} },
7143 .block_erase = spi_block_erase_60,
7144 },
7145 },
7146 .unlock = spi_disable_blockprotect,
7147 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
7148 .read = spi_chip_read,
7149 .voltage = {3000, 3600},
7150 },
7151
7152 {
7153 .vendor = "SST",
stefanctd6efe1a2011-09-03 11:22:27 +00007154 .name = "SST25VF010",
hailfingere1e41ea2011-07-27 07:13:06 +00007155 .bustype = BUS_SPI,
hailfingerfb1f31f2010-12-03 14:48:11 +00007156 .manufacture_id = SST_ID,
7157 .model_id = SST_SST25VF010_REMS,
7158 .total_size = 128,
7159 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08007160 .feature_bits = FEATURE_UNBOUND_READ,
7161 .tested = TEST_OK_PREWU,
hailfingerfb1f31f2010-12-03 14:48:11 +00007162 .probe = probe_spi_rems,
7163 .probe_timing = TIMING_ZERO,
7164 .block_erasers =
7165 {
7166 {
7167 .eraseblocks = { {4 * 1024, 32} },
7168 .block_erase = spi_block_erase_20,
7169 }, {
7170 .eraseblocks = { {32 * 1024, 4} },
7171 .block_erase = spi_block_erase_52,
7172 }, {
7173 .eraseblocks = { {128 * 1024, 1} },
7174 .block_erase = spi_block_erase_60,
7175 },
7176 },
7177 .unlock = spi_disable_blockprotect,
stefanct449d0342011-08-01 18:39:28 +00007178 .write = spi_aai_write,
hailfingerfb1f31f2010-12-03 14:48:11 +00007179 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +00007180 .voltage = {2700, 3600},
hailfingerfb1f31f2010-12-03 14:48:11 +00007181 },
7182
7183 {
David Hendricks668f29d2011-01-27 18:51:45 -08007184 .vendor = "Spansion",
7185 .name = "S25FL032A",
hailfingere1e41ea2011-07-27 07:13:06 +00007186 .bustype = BUS_SPI,
David Hendricks668f29d2011-01-27 18:51:45 -08007187 .manufacture_id = SPANSION_ID,
7188 .model_id = SPANSION_S25FL032A,
7189 .total_size = 4096,
7190 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08007191 .feature_bits = FEATURE_UNBOUND_READ,
David Hendricks668f29d2011-01-27 18:51:45 -08007192 .tested = TEST_UNTESTED,
7193 .probe = probe_spi_rdid,
7194 .probe_timing = TIMING_ZERO,
7195 .block_erasers =
7196 {
7197 {
7198 .eraseblocks = { {64 * 1024, 64} },
7199 .block_erase = spi_block_erase_d8,
7200 }, {
7201 .eraseblocks = { {4 * 1024 * 1024, 1} },
7202 .block_erase = spi_block_erase_c7,
7203 }
7204 },
7205 .unlock = spi_disable_blockprotect,
7206 .write = spi_chip_write_256,
7207 .read = spi_chip_read,
7208 },
7209
7210 {
7211 .vendor = "Spansion",
7212 .name = "S25FL064A",
hailfingere1e41ea2011-07-27 07:13:06 +00007213 .bustype = BUS_SPI,
David Hendricks668f29d2011-01-27 18:51:45 -08007214 .manufacture_id = SPANSION_ID,
7215 .model_id = SPANSION_S25FL064A,
7216 .total_size = 8192,
7217 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08007218 .feature_bits = FEATURE_UNBOUND_READ,
7219 .tested = TEST_OK_PREWU,
David Hendricks668f29d2011-01-27 18:51:45 -08007220 .probe = probe_spi_rdid,
7221 .probe_timing = TIMING_ZERO,
7222 .block_erasers =
7223 {
7224 {
7225 .eraseblocks = { {64 * 1024, 128} },
7226 .block_erase = spi_block_erase_d8,
7227 }, {
7228 .eraseblocks = { {8 * 1024 * 1024, 1} },
7229 .block_erase = spi_block_erase_c7,
7230 }
7231 },
7232 .unlock = spi_disable_blockprotect,
7233 .write = spi_chip_write_256,
7234 .read = spi_chip_read,
7235 },
7236
7237 {
7238 .vendor = "SST",
7239 .name = "SST25VF010.REMS",
hailfingere1e41ea2011-07-27 07:13:06 +00007240 .bustype = BUS_SPI,
David Hendricks668f29d2011-01-27 18:51:45 -08007241 .manufacture_id = SST_ID,
7242 .model_id = SST_SST25VF010_REMS,
7243 .total_size = 128,
7244 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08007245 .feature_bits = FEATURE_UNBOUND_READ,
7246 .tested = TEST_OK_PREWU,
David Hendricks668f29d2011-01-27 18:51:45 -08007247 .probe = probe_spi_rems,
7248 .probe_timing = TIMING_ZERO,
7249 .block_erasers =
7250 {
7251 {
7252 .eraseblocks = { {4 * 1024, 32} },
7253 .block_erase = spi_block_erase_20,
7254 }, {
7255 .eraseblocks = { {32 * 1024, 4} },
7256 .block_erase = spi_block_erase_52,
7257 }, {
7258 .eraseblocks = { {128 * 1024, 1} },
7259 .block_erase = spi_block_erase_60,
7260 },
7261 },
7262 .unlock = spi_disable_blockprotect,
7263 .write = spi_chip_write_1,
7264 .read = spi_chip_read,
7265 },
7266
7267 {
hailfingerfb1f31f2010-12-03 14:48:11 +00007268 .vendor = "SST",
hailfinger286829b2009-01-08 03:40:17 +00007269 .name = "SST25VF016B",
hailfingere1e41ea2011-07-27 07:13:06 +00007270 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00007271 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007272 .model_id = SST_SST25VF016B,
hailfinger286829b2009-01-08 03:40:17 +00007273 .total_size = 2048,
7274 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08007275 .feature_bits = FEATURE_UNBOUND_READ,
7276 .tested = TEST_OK_PREWU,
hailfinger286829b2009-01-08 03:40:17 +00007277 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00007278 .probe_timing = TIMING_ZERO,
hailfinger3aa0df12009-12-23 12:16:47 +00007279 .block_erasers =
7280 {
7281 {
7282 .eraseblocks = { {4 * 1024, 512} },
7283 .block_erase = spi_block_erase_20,
7284 }, {
7285 .eraseblocks = { {32 * 1024, 64} },
7286 .block_erase = spi_block_erase_52,
7287 }, {
7288 .eraseblocks = { {64 * 1024, 32} },
7289 .block_erase = spi_block_erase_d8,
7290 }, {
7291 .eraseblocks = { {2 * 1024 * 1024, 1} },
7292 .block_erase = spi_block_erase_60,
7293 }, {
7294 .eraseblocks = { {2 * 1024 * 1024, 1} },
7295 .block_erase = spi_block_erase_c7,
7296 },
7297 },
hailfingerb9560ee2010-07-14 20:21:22 +00007298 .unlock = spi_disable_blockprotect,
stefanct449d0342011-08-01 18:39:28 +00007299 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
hailfinger286829b2009-01-08 03:40:17 +00007300 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00007301 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00007302 },
7303
hailfinger286829b2009-01-08 03:40:17 +00007304 {
7305 .vendor = "SST",
7306 .name = "SST25VF032B",
hailfingere1e41ea2011-07-27 07:13:06 +00007307 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00007308 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007309 .model_id = SST_SST25VF032B,
hailfinger286829b2009-01-08 03:40:17 +00007310 .total_size = 4096,
7311 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08007312 .feature_bits = FEATURE_UNBOUND_READ,
7313 .tested = TEST_OK_PREWU,
hailfinger286829b2009-01-08 03:40:17 +00007314 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00007315 .probe_timing = TIMING_ZERO,
hailfinger3aa0df12009-12-23 12:16:47 +00007316 .block_erasers =
7317 {
7318 {
7319 .eraseblocks = { {4 * 1024, 1024} },
7320 .block_erase = spi_block_erase_20,
7321 }, {
7322 .eraseblocks = { {32 * 1024, 128} },
7323 .block_erase = spi_block_erase_52,
7324 }, {
7325 .eraseblocks = { {64 * 1024, 64} },
7326 .block_erase = spi_block_erase_d8,
7327 }, {
7328 .eraseblocks = { {4 * 1024 * 1024, 1} },
7329 .block_erase = spi_block_erase_60,
7330 }, {
7331 .eraseblocks = { {4 * 1024 * 1024, 1} },
7332 .block_erase = spi_block_erase_c7,
7333 },
7334 },
hailfingerb9560ee2010-07-14 20:21:22 +00007335 .unlock = spi_disable_blockprotect,
hailfinger081e3512010-10-05 22:29:08 +00007336 .write = spi_aai_write,
hailfinger3aa0df12009-12-23 12:16:47 +00007337 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00007338 .voltage = {2700, 3600},
hailfinger3aa0df12009-12-23 12:16:47 +00007339 },
7340
7341 {
7342 .vendor = "SST",
hailfingerea6fc922010-07-21 15:02:22 +00007343 .name = "SST25VF064C",
hailfingere1e41ea2011-07-27 07:13:06 +00007344 .bustype = BUS_SPI,
hailfingerea6fc922010-07-21 15:02:22 +00007345 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007346 .model_id = SST_SST25VF064C,
hailfingerea6fc922010-07-21 15:02:22 +00007347 .total_size = 8192,
7348 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08007349 .feature_bits = FEATURE_UNBOUND_READ,
7350 .tested = TEST_OK_PREU,
hailfingerea6fc922010-07-21 15:02:22 +00007351 .probe = probe_spi_rdid,
7352 .probe_timing = TIMING_ZERO,
7353 .block_erasers =
7354 {
7355 {
7356 .eraseblocks = { {4 * 1024, 2048} },
7357 .block_erase = spi_block_erase_20,
7358 }, {
7359 .eraseblocks = { {32 * 1024, 256} },
7360 .block_erase = spi_block_erase_52,
7361 }, {
7362 .eraseblocks = { {64 * 1024, 128} },
7363 .block_erase = spi_block_erase_d8,
7364 }, {
7365 .eraseblocks = { {8 * 1024 * 1024, 1} },
7366 .block_erase = spi_block_erase_60,
7367 }, {
7368 .eraseblocks = { {8 * 1024 * 1024, 1} },
7369 .block_erase = spi_block_erase_c7,
7370 },
7371 },
7372 .unlock = spi_disable_blockprotect,
hailfinger081e3512010-10-05 22:29:08 +00007373 .write = spi_chip_write_256,
hailfingerea6fc922010-07-21 15:02:22 +00007374 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00007375 .voltage = {2700, 3600},
hailfingerea6fc922010-07-21 15:02:22 +00007376 },
7377
7378 {
7379 .vendor = "SST",
stefanctd6efe1a2011-09-03 11:22:27 +00007380 .name = "SST25VF040",
hailfingere1e41ea2011-07-27 07:13:06 +00007381 .bustype = BUS_SPI,
hailfinger3aa0df12009-12-23 12:16:47 +00007382 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007383 .model_id = SST_SST25VF040_REMS,
hailfinger3aa0df12009-12-23 12:16:47 +00007384 .total_size = 512,
7385 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08007386 .feature_bits = FEATURE_UNBOUND_READ,
7387 .tested = TEST_OK_PRU,
hailfinger3aa0df12009-12-23 12:16:47 +00007388 .probe = probe_spi_rems,
7389 .probe_timing = TIMING_ZERO,
hailfinger3aa0df12009-12-23 12:16:47 +00007390 .block_erasers =
7391 {
7392 {
7393 .eraseblocks = { {4 * 1024, 128} },
7394 .block_erase = spi_block_erase_20,
7395 }, {
7396 .eraseblocks = { {32 * 1024, 16} },
7397 .block_erase = spi_block_erase_52,
7398 }, {
7399 .eraseblocks = { {512 * 1024, 1} },
7400 .block_erase = spi_block_erase_60,
7401 },
7402 },
hailfingerb9560ee2010-07-14 20:21:22 +00007403 .unlock = spi_disable_blockprotect,
stefanct449d0342011-08-01 18:39:28 +00007404 .write = spi_aai_write,
hailfinger286829b2009-01-08 03:40:17 +00007405 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +00007406 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00007407 },
7408
hailfinger286829b2009-01-08 03:40:17 +00007409 {
7410 .vendor = "SST",
7411 .name = "SST25VF040B",
hailfingere1e41ea2011-07-27 07:13:06 +00007412 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00007413 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007414 .model_id = SST_SST25VF040B,
hailfinger286829b2009-01-08 03:40:17 +00007415 .total_size = 512,
7416 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08007417 .feature_bits = FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00007418 .tested = TEST_UNTESTED,
7419 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00007420 .probe_timing = TIMING_ZERO,
hailfinger3aa0df12009-12-23 12:16:47 +00007421 .block_erasers =
7422 {
7423 {
7424 .eraseblocks = { {4 * 1024, 128} },
7425 .block_erase = spi_block_erase_20,
7426 }, {
7427 .eraseblocks = { {32 * 1024, 16} },
7428 .block_erase = spi_block_erase_52,
7429 }, {
7430 .eraseblocks = { {64 * 1024, 8} },
7431 .block_erase = spi_block_erase_d8,
7432 }, {
7433 .eraseblocks = { {512 * 1024, 1} },
7434 .block_erase = spi_block_erase_60,
7435 }, {
7436 .eraseblocks = { {512 * 1024, 1} },
7437 .block_erase = spi_block_erase_c7,
7438 },
7439 },
hailfingerb9560ee2010-07-14 20:21:22 +00007440 .unlock = spi_disable_blockprotect,
stefanct449d0342011-08-01 18:39:28 +00007441 .write = spi_aai_write,
stuge48dda5c2009-02-25 08:07:33 +00007442 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00007443 .voltage = {2700, 3600},
stuge48dda5c2009-02-25 08:07:33 +00007444 },
7445
7446 {
7447 .vendor = "SST",
stuge712ce862009-01-26 03:37:40 +00007448 .name = "SST25VF040B.REMS",
hailfingere1e41ea2011-07-27 07:13:06 +00007449 .bustype = BUS_SPI,
hailfingerc391ccb2009-06-12 11:45:10 +00007450 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007451 .model_id = SST_SST25VF040B_REMS,
stuge712ce862009-01-26 03:37:40 +00007452 .total_size = 512,
hailfinger3aa0df12009-12-23 12:16:47 +00007453 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08007454 .feature_bits = FEATURE_UNBOUND_READ,
7455 .tested = TEST_OK_PRU,
stuge712ce862009-01-26 03:37:40 +00007456 .probe = probe_spi_rems,
hailfingere3095d92009-06-05 13:46:17 +00007457 .probe_timing = TIMING_ZERO,
hailfinger3aa0df12009-12-23 12:16:47 +00007458 .block_erasers =
7459 {
7460 {
7461 .eraseblocks = { {4 * 1024, 128} },
7462 .block_erase = spi_block_erase_20,
7463 }, {
7464 .eraseblocks = { {32 * 1024, 16} },
7465 .block_erase = spi_block_erase_52,
7466 }, {
7467 .eraseblocks = { {64 * 1024, 8} },
7468 .block_erase = spi_block_erase_d8,
7469 }, {
7470 .eraseblocks = { {512 * 1024, 1} },
7471 .block_erase = spi_block_erase_60,
7472 }, {
7473 .eraseblocks = { {512 * 1024, 1} },
7474 .block_erase = spi_block_erase_c7,
7475 },
7476 },
hailfingerb9560ee2010-07-14 20:21:22 +00007477 .unlock = spi_disable_blockprotect,
stefanct449d0342011-08-01 18:39:28 +00007478 .write = spi_aai_write,
stuge712ce862009-01-26 03:37:40 +00007479 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +00007480 .voltage = {2700, 3600},
stuge712ce862009-01-26 03:37:40 +00007481 },
7482
7483 {
7484 .vendor = "SST",
hailfinger286829b2009-01-08 03:40:17 +00007485 .name = "SST25VF080B",
hailfingere1e41ea2011-07-27 07:13:06 +00007486 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00007487 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007488 .model_id = SST_SST25VF080B,
hailfinger286829b2009-01-08 03:40:17 +00007489 .total_size = 1024,
7490 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08007491 .feature_bits = FEATURE_UNBOUND_READ,
7492 .tested = TEST_OK_PREU,
hailfinger286829b2009-01-08 03:40:17 +00007493 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00007494 .probe_timing = TIMING_ZERO,
hailfinger3aa0df12009-12-23 12:16:47 +00007495 .block_erasers =
7496 {
7497 {
7498 .eraseblocks = { {4 * 1024, 256} },
7499 .block_erase = spi_block_erase_20,
7500 }, {
7501 .eraseblocks = { {32 * 1024, 32} },
7502 .block_erase = spi_block_erase_52,
7503 }, {
7504 .eraseblocks = { {64 * 1024, 16} },
7505 .block_erase = spi_block_erase_d8,
7506 }, {
7507 .eraseblocks = { {1024 * 1024, 1} },
7508 .block_erase = spi_block_erase_60,
7509 }, {
7510 .eraseblocks = { {1024 * 1024, 1} },
7511 .block_erase = spi_block_erase_c7,
7512 },
7513 },
hailfingerb9560ee2010-07-14 20:21:22 +00007514 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00007515 .write = spi_chip_write_1,
hailfinger286829b2009-01-08 03:40:17 +00007516 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00007517 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00007518 },
7519
hailfinger286829b2009-01-08 03:40:17 +00007520 {
7521 .vendor = "SST",
7522 .name = "SST28SF040A",
hailfingere1e41ea2011-07-27 07:13:06 +00007523 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00007524 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007525 .model_id = SST_SST28SF040,
hailfinger286829b2009-01-08 03:40:17 +00007526 .total_size = 512,
7527 .page_size = 256,
snelsonc6855342010-01-28 23:55:12 +00007528 .feature_bits = 0,
hailfinger286829b2009-01-08 03:40:17 +00007529 .tested = TEST_UNTESTED,
hailfingerb8e4e212010-03-15 03:48:42 +00007530 .probe = probe_82802ab,
uwe37f43422011-06-19 17:23:55 +00007531 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst28sf040.c) */
snelson264e57c2010-01-20 20:55:53 +00007532 .block_erasers =
7533 {
7534 {
7535 .eraseblocks = { {128, 4096} },
7536 .block_erase = erase_sector_28sf040,
7537 }, {
7538 .eraseblocks = { {512 * 1024, 1} },
7539 .block_erase = erase_chip_28sf040,
7540 }
7541 },
hailfinger86bf3b52010-10-13 21:49:30 +00007542 .unlock = unprotect_28sf040,
hailfinger286829b2009-01-08 03:40:17 +00007543 .write = write_28sf040,
hailfinger23060112009-05-08 12:49:03 +00007544 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007545 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00007546 },
7547
hailfinger286829b2009-01-08 03:40:17 +00007548 {
7549 .vendor = "SST",
7550 .name = "SST29EE010",
hailfingere1e41ea2011-07-27 07:13:06 +00007551 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00007552 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007553 .model_id = SST_SST29EE010,
hailfinger286829b2009-01-08 03:40:17 +00007554 .total_size = 128,
7555 .page_size = 128,
snelsonc6855342010-01-28 23:55:12 +00007556 .feature_bits = FEATURE_LONG_RESET,
hailfingerd217d122010-10-08 18:52:29 +00007557 .tested = TEST_OK_PR,
hailfinger286829b2009-01-08 03:40:17 +00007558 .probe = probe_jedec,
Simon Glass8dc82732013-07-16 10:13:51 -06007559 .probe_timing = 10,
snelson264e57c2010-01-20 20:55:53 +00007560 .block_erasers =
7561 {
7562 {
7563 .eraseblocks = { {128 * 1024, 1} },
7564 .block_erase = erase_chip_block_jedec,
7565 }
7566 },
hailfinger286829b2009-01-08 03:40:17 +00007567 .write = write_jedec,
hailfinger23060112009-05-08 12:49:03 +00007568 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007569 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00007570 },
7571
hailfinger286829b2009-01-08 03:40:17 +00007572 {
7573 .vendor = "SST",
7574 .name = "SST29LE010",
hailfingere1e41ea2011-07-27 07:13:06 +00007575 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00007576 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007577 .model_id = SST_SST29LE010,
hailfinger286829b2009-01-08 03:40:17 +00007578 .total_size = 128,
7579 .page_size = 128,
snelsonc6855342010-01-28 23:55:12 +00007580 .feature_bits = FEATURE_LONG_RESET,
hailfinger286829b2009-01-08 03:40:17 +00007581 .tested = TEST_UNTESTED,
7582 .probe = probe_jedec,
Simon Glass8dc82732013-07-16 10:13:51 -06007583 .probe_timing = 10,
snelson264e57c2010-01-20 20:55:53 +00007584 .block_erasers =
7585 {
7586 {
7587 .eraseblocks = { {128 * 1024, 1} },
7588 .block_erase = erase_chip_block_jedec,
7589 }
7590 },
hailfinger286829b2009-01-08 03:40:17 +00007591 .write = write_jedec,
hailfinger23060112009-05-08 12:49:03 +00007592 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007593 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00007594 },
7595
hailfinger286829b2009-01-08 03:40:17 +00007596 {
7597 .vendor = "SST",
7598 .name = "SST29EE020A",
hailfingere1e41ea2011-07-27 07:13:06 +00007599 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00007600 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007601 .model_id = SST_SST29EE020A,
hailfinger286829b2009-01-08 03:40:17 +00007602 .total_size = 256,
7603 .page_size = 128,
snelsonc6855342010-01-28 23:55:12 +00007604 .feature_bits = FEATURE_LONG_RESET,
hailfingerd217d122010-10-08 18:52:29 +00007605 .tested = TEST_OK_PRE,
hailfinger286829b2009-01-08 03:40:17 +00007606 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00007607 .probe_timing = 10,
snelson264e57c2010-01-20 20:55:53 +00007608 .block_erasers =
7609 {
7610 {
7611 .eraseblocks = { {256 * 1024, 1} },
7612 .block_erase = erase_chip_block_jedec,
7613 }
7614 },
hailfinger286829b2009-01-08 03:40:17 +00007615 .write = write_jedec,
hailfinger23060112009-05-08 12:49:03 +00007616 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007617 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00007618 },
7619
hailfinger286829b2009-01-08 03:40:17 +00007620 {
7621 .vendor = "SST",
7622 .name = "SST29LE020",
hailfingere1e41ea2011-07-27 07:13:06 +00007623 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00007624 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007625 .model_id = SST_SST29LE020,
hailfinger286829b2009-01-08 03:40:17 +00007626 .total_size = 256,
7627 .page_size = 128,
snelsonc6855342010-01-28 23:55:12 +00007628 .feature_bits = FEATURE_LONG_RESET,
hailfingerd217d122010-10-08 18:52:29 +00007629 .tested = TEST_OK_PRE,
hailfinger286829b2009-01-08 03:40:17 +00007630 .probe = probe_jedec,
Simon Glass8dc82732013-07-16 10:13:51 -06007631 .probe_timing = 10,
snelson264e57c2010-01-20 20:55:53 +00007632 .block_erasers =
7633 {
7634 {
7635 .eraseblocks = { {256 * 1024, 1} },
7636 .block_erase = erase_chip_block_jedec,
7637 }
7638 },
hailfinger286829b2009-01-08 03:40:17 +00007639 .write = write_jedec,
hailfinger23060112009-05-08 12:49:03 +00007640 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007641 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00007642 },
7643
hailfinger286829b2009-01-08 03:40:17 +00007644 {
7645 .vendor = "SST",
uwe2c909142010-01-23 15:15:19 +00007646 .name = "SST39SF512",
hailfingere1e41ea2011-07-27 07:13:06 +00007647 .bustype = BUS_PARALLEL,
uwe2c909142010-01-23 15:15:19 +00007648 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007649 .model_id = SST_SST39SF512,
uwe2c909142010-01-23 15:15:19 +00007650 .total_size = 64,
7651 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +00007652 .feature_bits = FEATURE_EITHER_RESET,
hailfingerf35c3932011-03-07 15:32:58 +00007653 .tested = TEST_OK_PREW,
uwe2c909142010-01-23 15:15:19 +00007654 .probe = probe_jedec,
7655 .probe_timing = 1, /* 150 ns */
uwe2c909142010-01-23 15:15:19 +00007656 .block_erasers =
7657 {
7658 {
7659 .eraseblocks = { {4 * 1024, 16} },
7660 .block_erase = erase_sector_jedec,
7661 }, {
7662 .eraseblocks = { {64 * 1024, 1} },
7663 .block_erase = erase_chip_block_jedec,
7664 }
7665 },
snelsonc6855342010-01-28 23:55:12 +00007666 .write = write_jedec_1,
uwe2c909142010-01-23 15:15:19 +00007667 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007668 .voltage = {4500, 5500},
uwe2c909142010-01-23 15:15:19 +00007669 },
7670
7671 {
7672 .vendor = "SST",
hailfinger286829b2009-01-08 03:40:17 +00007673 .name = "SST39SF010A",
hailfingere1e41ea2011-07-27 07:13:06 +00007674 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00007675 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007676 .model_id = SST_SST39SF010,
hailfinger286829b2009-01-08 03:40:17 +00007677 .total_size = 128,
7678 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +00007679 .feature_bits = FEATURE_EITHER_RESET,
stefanct371e7e82011-07-07 19:56:58 +00007680 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00007681 .probe = probe_jedec,
hailfingerc391ccb2009-06-12 11:45:10 +00007682 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +00007683 .block_erasers =
7684 {
7685 {
7686 .eraseblocks = { {4 * 1024, 32} },
7687 .block_erase = erase_sector_jedec,
7688 }, {
7689 .eraseblocks = { {128 * 1024, 1} },
7690 .block_erase = erase_chip_block_jedec,
7691 }
7692 },
snelsonc6855342010-01-28 23:55:12 +00007693 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00007694 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007695 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00007696 },
7697
hailfinger286829b2009-01-08 03:40:17 +00007698 {
7699 .vendor = "SST",
7700 .name = "SST39SF020A",
hailfingere1e41ea2011-07-27 07:13:06 +00007701 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00007702 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007703 .model_id = SST_SST39SF020,
hailfinger286829b2009-01-08 03:40:17 +00007704 .total_size = 256,
7705 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +00007706 .feature_bits = FEATURE_EITHER_RESET,
David Hendricksc801adb2010-12-09 16:58:56 -08007707 .tested = TEST_OK_PRE,
hailfinger286829b2009-01-08 03:40:17 +00007708 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +00007709 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +00007710 .block_erasers =
7711 {
7712 {
7713 .eraseblocks = { {4 * 1024, 64} },
7714 .block_erase = erase_sector_jedec,
7715 }, {
7716 .eraseblocks = { {256 * 1024, 1} },
7717 .block_erase = erase_chip_block_jedec,
7718 }
7719 },
snelsonc6855342010-01-28 23:55:12 +00007720 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00007721 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007722 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00007723 },
7724
hailfinger286829b2009-01-08 03:40:17 +00007725 {
7726 .vendor = "SST",
7727 .name = "SST39SF040",
hailfingere1e41ea2011-07-27 07:13:06 +00007728 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00007729 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007730 .model_id = SST_SST39SF040,
hailfinger286829b2009-01-08 03:40:17 +00007731 .total_size = 512,
7732 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +00007733 .feature_bits = FEATURE_EITHER_RESET,
stefanctd6efe1a2011-09-03 11:22:27 +00007734 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00007735 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +00007736 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +00007737 .block_erasers =
7738 {
7739 {
7740 .eraseblocks = { {4 * 1024, 128} },
7741 .block_erase = erase_sector_jedec,
7742 }, {
7743 .eraseblocks = { {512 * 1024, 1} },
7744 .block_erase = erase_chip_block_jedec,
7745 }
7746 },
snelsonc6855342010-01-28 23:55:12 +00007747 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00007748 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007749 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00007750 },
7751
hailfinger286829b2009-01-08 03:40:17 +00007752 {
7753 .vendor = "SST",
7754 .name = "SST39VF512",
hailfingere1e41ea2011-07-27 07:13:06 +00007755 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00007756 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007757 .model_id = SST_SST39VF512,
hailfinger286829b2009-01-08 03:40:17 +00007758 .total_size = 64,
7759 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +00007760 .feature_bits = FEATURE_EITHER_RESET,
hailfingerd217d122010-10-08 18:52:29 +00007761 .tested = TEST_OK_PRE,
hailfinger286829b2009-01-08 03:40:17 +00007762 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +00007763 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +00007764 .block_erasers =
7765 {
7766 {
7767 .eraseblocks = { {4 * 1024, 16} },
7768 .block_erase = erase_sector_jedec,
7769 }, {
7770 .eraseblocks = { {64 * 1024, 1} },
7771 .block_erase = erase_chip_block_jedec,
7772 }
7773 },
snelsonc6855342010-01-28 23:55:12 +00007774 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00007775 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007776 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00007777 },
7778
hailfinger286829b2009-01-08 03:40:17 +00007779 {
7780 .vendor = "SST",
7781 .name = "SST39VF010",
hailfingere1e41ea2011-07-27 07:13:06 +00007782 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00007783 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007784 .model_id = SST_SST39VF010,
hailfinger286829b2009-01-08 03:40:17 +00007785 .total_size = 128,
7786 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +00007787 .feature_bits = FEATURE_EITHER_RESET,
hailfingerd217d122010-10-08 18:52:29 +00007788 .tested = TEST_OK_PRE,
hailfinger286829b2009-01-08 03:40:17 +00007789 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +00007790 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +00007791 .block_erasers =
7792 {
7793 {
7794 .eraseblocks = { {4 * 1024, 32} },
7795 .block_erase = erase_sector_jedec,
7796 }, {
7797 .eraseblocks = { {128 * 1024, 1} },
7798 .block_erase = erase_chip_block_jedec,
7799 }
7800 },
snelsonc6855342010-01-28 23:55:12 +00007801 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00007802 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007803 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00007804 },
7805
hailfinger286829b2009-01-08 03:40:17 +00007806 {
7807 .vendor = "SST",
7808 .name = "SST39VF020",
hailfingere1e41ea2011-07-27 07:13:06 +00007809 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00007810 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007811 .model_id = SST_SST39VF020,
hailfinger286829b2009-01-08 03:40:17 +00007812 .total_size = 256,
7813 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +00007814 .feature_bits = FEATURE_EITHER_RESET,
7815 .tested = TEST_UNTESTED,
hailfinger286829b2009-01-08 03:40:17 +00007816 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +00007817 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +00007818 .block_erasers =
7819 {
7820 {
7821 .eraseblocks = { {4 * 1024, 64} },
7822 .block_erase = erase_sector_jedec,
7823 }, {
7824 .eraseblocks = { {256 * 1024, 1} },
7825 .block_erase = erase_chip_block_jedec,
7826 }
7827 },
snelsonc6855342010-01-28 23:55:12 +00007828 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00007829 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007830 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00007831 },
7832
hailfinger286829b2009-01-08 03:40:17 +00007833 {
7834 .vendor = "SST",
7835 .name = "SST39VF040",
hailfingere1e41ea2011-07-27 07:13:06 +00007836 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00007837 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007838 .model_id = SST_SST39VF040,
hailfinger286829b2009-01-08 03:40:17 +00007839 .total_size = 512,
7840 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +00007841 .feature_bits = FEATURE_EITHER_RESET,
7842 .tested = TEST_UNTESTED,
hailfinger286829b2009-01-08 03:40:17 +00007843 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +00007844 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +00007845 .block_erasers =
7846 {
7847 {
7848 .eraseblocks = { {4 * 1024, 128} },
7849 .block_erase = erase_sector_jedec,
7850 }, {
7851 .eraseblocks = { {512 * 1024, 1} },
7852 .block_erase = erase_chip_block_jedec,
7853 }
7854 },
snelsonc6855342010-01-28 23:55:12 +00007855 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00007856 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007857 .voltage = {2700, 3600},
hailfingerdfa338f2008-12-08 23:51:45 +00007858 },
stepanaa1b6a22008-12-08 18:15:10 +00007859
hailfinger286829b2009-01-08 03:40:17 +00007860 {
7861 .vendor = "SST",
stuged9f66152009-01-25 23:55:12 +00007862 .name = "SST39VF080",
hailfingere1e41ea2011-07-27 07:13:06 +00007863 .bustype = BUS_PARALLEL,
hailfingerc391ccb2009-06-12 11:45:10 +00007864 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007865 .model_id = SST_SST39VF080,
stuged9f66152009-01-25 23:55:12 +00007866 .total_size = 1024,
7867 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +00007868 .feature_bits = FEATURE_EITHER_RESET,
stuged9f66152009-01-25 23:55:12 +00007869 .tested = TEST_UNTESTED,
7870 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +00007871 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +00007872 .block_erasers =
7873 {
7874 {
7875 .eraseblocks = { {4 * 1024, 256} },
7876 .block_erase = erase_sector_jedec,
7877 }, {
7878 .eraseblocks = { {64 * 1024, 16} },
7879 .block_erase = erase_block_jedec,
7880 }, {
7881 .eraseblocks = { {1024 * 1024, 1} },
7882 .block_erase = erase_chip_block_jedec,
7883 }
7884 },
snelsonc6855342010-01-28 23:55:12 +00007885 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00007886 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007887 .voltage = {2700, 3600},
stuged9f66152009-01-25 23:55:12 +00007888 },
7889
7890 {
7891 .vendor = "SST",
hailfinger286829b2009-01-08 03:40:17 +00007892 .name = "SST49LF002A/B",
hailfingere1e41ea2011-07-27 07:13:06 +00007893 .bustype = BUS_FWH, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00007894 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007895 .model_id = SST_SST49LF002A,
hailfinger286829b2009-01-08 03:40:17 +00007896 .total_size = 256,
7897 .page_size = 16 * 1024,
snelsonc6855342010-01-28 23:55:12 +00007898 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
David Hendricksc801adb2010-12-09 16:58:56 -08007899 .tested = TEST_OK_PRE,
hailfingerb8e4e212010-03-15 03:48:42 +00007900 .probe = probe_jedec,
7901 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +00007902 .block_erasers =
7903 {
7904 {
7905 .eraseblocks = { {4 * 1024, 64} },
snelson712e72d2010-03-16 03:09:10 +00007906 .block_erase = erase_sector_jedec,
snelson264e57c2010-01-20 20:55:53 +00007907 }, {
7908 .eraseblocks = { {16 * 1024, 16} },
snelson712e72d2010-03-16 03:09:10 +00007909 .block_erase = erase_block_jedec,
snelson264e57c2010-01-20 20:55:53 +00007910 }, {
7911 .eraseblocks = { {256 * 1024, 1} },
7912 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
7913 }
7914 },
hailfingerb8e4e212010-03-15 03:48:42 +00007915 .printlock = printlock_sst_fwhub,
snelson712e72d2010-03-16 03:09:10 +00007916 .unlock = unlock_sst_fwhub,
7917 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00007918 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007919 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00007920 },
7921
hailfinger286829b2009-01-08 03:40:17 +00007922 {
7923 .vendor = "SST",
7924 .name = "SST49LF003A/B",
hailfingere1e41ea2011-07-27 07:13:06 +00007925 .bustype = BUS_FWH, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00007926 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007927 .model_id = SST_SST49LF003A,
hailfinger286829b2009-01-08 03:40:17 +00007928 .total_size = 384,
7929 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00007930 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
uwe63555e62009-09-25 01:09:18 +00007931 .tested = TEST_OK_PR,
hailfingerb8e4e212010-03-15 03:48:42 +00007932 .probe = probe_jedec,
7933 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +00007934 .block_erasers =
7935 {
7936 {
7937 .eraseblocks = { {4 * 1024, 96} },
snelson712e72d2010-03-16 03:09:10 +00007938 .block_erase = erase_sector_jedec,
snelson264e57c2010-01-20 20:55:53 +00007939 }, {
7940 .eraseblocks = { {64 * 1024, 6} },
snelson712e72d2010-03-16 03:09:10 +00007941 .block_erase = erase_block_jedec,
snelson264e57c2010-01-20 20:55:53 +00007942 }, {
7943 .eraseblocks = { {384 * 1024, 1} },
7944 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
7945 }
7946 },
hailfingerb8e4e212010-03-15 03:48:42 +00007947 .printlock = printlock_sst_fwhub,
snelson712e72d2010-03-16 03:09:10 +00007948 .unlock = unlock_sst_fwhub,
7949 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00007950 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007951 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00007952 },
7953
hailfinger286829b2009-01-08 03:40:17 +00007954 {
hailfinger80f48682009-09-23 22:01:33 +00007955 /* Contrary to the data sheet, TBL# on the SST49LF004B affects the top 128kB (instead of 64kB)
7956 * and is only honored for 64k block erase, but not 4k sector erase.
7957 */
hailfinger286829b2009-01-08 03:40:17 +00007958 .vendor = "SST",
7959 .name = "SST49LF004A/B",
hailfingere1e41ea2011-07-27 07:13:06 +00007960 .bustype = BUS_FWH, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00007961 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007962 .model_id = SST_SST49LF004A,
hailfinger286829b2009-01-08 03:40:17 +00007963 .total_size = 512,
7964 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00007965 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
David Hendricksc801adb2010-12-09 16:58:56 -08007966 .tested = TEST_OK_PRE,
hailfingerb8e4e212010-03-15 03:48:42 +00007967 .probe = probe_jedec,
7968 .probe_timing = 1, /* 150 ns */
hailfinger80f48682009-09-23 22:01:33 +00007969 .block_erasers =
7970 {
7971 {
7972 .eraseblocks = { {4 * 1024, 128} },
snelson712e72d2010-03-16 03:09:10 +00007973 .block_erase = erase_sector_jedec,
hailfinger80f48682009-09-23 22:01:33 +00007974 }, {
7975 .eraseblocks = { {64 * 1024, 8} },
snelson712e72d2010-03-16 03:09:10 +00007976 .block_erase = erase_block_jedec,
hailfinger80f48682009-09-23 22:01:33 +00007977 }, {
7978 .eraseblocks = { {512 * 1024, 1} },
snelson264e57c2010-01-20 20:55:53 +00007979 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
hailfinger80f48682009-09-23 22:01:33 +00007980 },
7981 },
hailfingerb8e4e212010-03-15 03:48:42 +00007982 .printlock = printlock_sst_fwhub,
snelson712e72d2010-03-16 03:09:10 +00007983 .unlock = unlock_sst_fwhub,
7984 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00007985 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007986 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00007987 },
7988
hailfinger286829b2009-01-08 03:40:17 +00007989 {
7990 .vendor = "SST",
7991 .name = "SST49LF004C",
hailfingere1e41ea2011-07-27 07:13:06 +00007992 .bustype = BUS_FWH,
hailfinger286829b2009-01-08 03:40:17 +00007993 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007994 .model_id = SST_SST49LF004C,
hailfinger286829b2009-01-08 03:40:17 +00007995 .total_size = 512,
7996 .page_size = 4 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00007997 .feature_bits = FEATURE_REGISTERMAP,
hailfinger286829b2009-01-08 03:40:17 +00007998 .tested = TEST_UNTESTED,
hailfingerb8e4e212010-03-15 03:48:42 +00007999 .probe = probe_82802ab,
uwe37f43422011-06-19 17:23:55 +00008000 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
snelson264e57c2010-01-20 20:55:53 +00008001 .block_erasers =
8002 {
8003 {
8004 .eraseblocks = { {4 * 1024, 128} },
8005 .block_erase = erase_sector_49lfxxxc,
8006 }, {
Simon Glass8dc82732013-07-16 10:13:51 -06008007 .eraseblocks = {
snelson264e57c2010-01-20 20:55:53 +00008008 {64 * 1024, 7},
8009 {32 * 1024, 1},
8010 {8 * 1024, 2},
8011 {16 * 1024, 1},
8012 },
snelson3a69e422010-03-23 17:10:28 +00008013 .block_erase = erase_block_82802ab,
snelson264e57c2010-01-20 20:55:53 +00008014 }
8015 },
snelson3a69e422010-03-23 17:10:28 +00008016 .unlock = unlock_49lfxxxc,
hailfinger86bf3b52010-10-13 21:49:30 +00008017 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00008018 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008019 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00008020 },
8021
hailfinger286829b2009-01-08 03:40:17 +00008022 {
8023 .vendor = "SST",
8024 .name = "SST49LF008A",
hailfingere1e41ea2011-07-27 07:13:06 +00008025 .bustype = BUS_FWH, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00008026 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00008027 .model_id = SST_SST49LF008A,
hailfinger286829b2009-01-08 03:40:17 +00008028 .total_size = 1024,
8029 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00008030 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
stefanct98d917c2011-10-21 12:33:07 +00008031 .tested = TEST_OK_PREW,
hailfingerb8e4e212010-03-15 03:48:42 +00008032 .probe = probe_jedec,
8033 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +00008034 .block_erasers =
8035 {
8036 {
8037 .eraseblocks = { {4 * 1024, 256} },
snelson712e72d2010-03-16 03:09:10 +00008038 .block_erase = erase_sector_jedec,
snelson264e57c2010-01-20 20:55:53 +00008039 }, {
8040 .eraseblocks = { {64 * 1024, 16} },
snelson712e72d2010-03-16 03:09:10 +00008041 .block_erase = erase_block_jedec,
snelson264e57c2010-01-20 20:55:53 +00008042 }, {
8043 .eraseblocks = { {1024 * 1024, 1} },
8044 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
8045 }
8046 },
hailfingerb8e4e212010-03-15 03:48:42 +00008047 .printlock = printlock_sst_fwhub,
snelson712e72d2010-03-16 03:09:10 +00008048 .unlock = unlock_sst_fwhub,
8049 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00008050 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008051 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00008052 },
8053
hailfinger286829b2009-01-08 03:40:17 +00008054 {
8055 .vendor = "SST",
8056 .name = "SST49LF008C",
hailfingere1e41ea2011-07-27 07:13:06 +00008057 .bustype = BUS_FWH,
hailfinger286829b2009-01-08 03:40:17 +00008058 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00008059 .model_id = SST_SST49LF008C,
hailfinger286829b2009-01-08 03:40:17 +00008060 .total_size = 1024,
8061 .page_size = 4 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00008062 .feature_bits = FEATURE_REGISTERMAP,
hailfinger286829b2009-01-08 03:40:17 +00008063 .tested = TEST_UNTESTED,
hailfingerb8e4e212010-03-15 03:48:42 +00008064 .probe = probe_82802ab,
uwe37f43422011-06-19 17:23:55 +00008065 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
snelson264e57c2010-01-20 20:55:53 +00008066 .block_erasers =
8067 {
8068 {
8069 .eraseblocks = { {4 * 1024, 256} },
8070 .block_erase = erase_sector_49lfxxxc,
8071 }, {
Simon Glass8dc82732013-07-16 10:13:51 -06008072 .eraseblocks = {
snelson264e57c2010-01-20 20:55:53 +00008073 {64 * 1024, 15},
8074 {32 * 1024, 1},
8075 {8 * 1024, 2},
8076 {16 * 1024, 1},
8077 },
snelson3a69e422010-03-23 17:10:28 +00008078 .block_erase = erase_block_82802ab,
snelson264e57c2010-01-20 20:55:53 +00008079 }
8080 },
snelson3a69e422010-03-23 17:10:28 +00008081 .unlock = unlock_49lfxxxc,
hailfinger86bf3b52010-10-13 21:49:30 +00008082 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00008083 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008084 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00008085 },
8086
hailfinger286829b2009-01-08 03:40:17 +00008087 {
8088 .vendor = "SST",
8089 .name = "SST49LF016C",
hailfingere1e41ea2011-07-27 07:13:06 +00008090 .bustype = BUS_FWH,
hailfinger286829b2009-01-08 03:40:17 +00008091 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00008092 .model_id = SST_SST49LF016C,
hailfinger286829b2009-01-08 03:40:17 +00008093 .total_size = 2048,
8094 .page_size = 4 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00008095 .feature_bits = FEATURE_REGISTERMAP,
hailfingerd217d122010-10-08 18:52:29 +00008096 .tested = TEST_OK_PR,
hailfingerb8e4e212010-03-15 03:48:42 +00008097 .probe = probe_82802ab,
uwe37f43422011-06-19 17:23:55 +00008098 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
snelson264e57c2010-01-20 20:55:53 +00008099 .block_erasers =
8100 {
8101 {
8102 .eraseblocks = { {4 * 1024, 512} },
8103 .block_erase = erase_sector_49lfxxxc,
8104 }, {
Simon Glass8dc82732013-07-16 10:13:51 -06008105 .eraseblocks = {
snelson264e57c2010-01-20 20:55:53 +00008106 {64 * 1024, 31},
8107 {32 * 1024, 1},
8108 {8 * 1024, 2},
8109 {16 * 1024, 1},
8110 },
snelson3a69e422010-03-23 17:10:28 +00008111 .block_erase = erase_block_82802ab,
snelson264e57c2010-01-20 20:55:53 +00008112 }
8113 },
snelson3a69e422010-03-23 17:10:28 +00008114 .unlock = unlock_49lfxxxc,
hailfinger86bf3b52010-10-13 21:49:30 +00008115 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00008116 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008117 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00008118 },
8119
hailfinger286829b2009-01-08 03:40:17 +00008120 {
8121 .vendor = "SST",
8122 .name = "SST49LF020",
hailfingere1e41ea2011-07-27 07:13:06 +00008123 .bustype = BUS_LPC,
hailfinger286829b2009-01-08 03:40:17 +00008124 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00008125 .model_id = SST_SST49LF020,
hailfinger286829b2009-01-08 03:40:17 +00008126 .total_size = 256,
8127 .page_size = 16 * 1024,
snelsonc6855342010-01-28 23:55:12 +00008128 .feature_bits = FEATURE_EITHER_RESET,
David Hendricksc801adb2010-12-09 16:58:56 -08008129 .tested = TEST_OK_PRE,
hailfinger286829b2009-01-08 03:40:17 +00008130 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +00008131 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +00008132 .block_erasers =
8133 {
8134 {
8135 .eraseblocks = { {4 * 1024, 64} },
8136 .block_erase = erase_sector_jedec,
8137 }, {
8138 .eraseblocks = { {16 * 1024, 16} },
8139 .block_erase = erase_block_jedec,
8140 }, {
8141 .eraseblocks = { {256 * 1024, 1} },
8142 .block_erase = NULL,
8143 }
8144 },
snelsonc6855342010-01-28 23:55:12 +00008145 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00008146 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008147 .voltage = {3000, 3600},
uwebf4a9a92009-01-07 12:35:09 +00008148 },
8149
hailfinger286829b2009-01-08 03:40:17 +00008150 {
8151 .vendor = "SST",
8152 .name = "SST49LF020A",
hailfingere1e41ea2011-07-27 07:13:06 +00008153 .bustype = BUS_LPC,
hailfinger286829b2009-01-08 03:40:17 +00008154 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00008155 .model_id = SST_SST49LF020A,
hailfinger286829b2009-01-08 03:40:17 +00008156 .total_size = 256,
hailfinger73134c42009-07-23 01:44:38 +00008157 .page_size = 4 * 1024,
snelsonc6855342010-01-28 23:55:12 +00008158 .feature_bits = FEATURE_EITHER_RESET,
hailfingerd217d122010-10-08 18:52:29 +00008159 .tested = TEST_OK_PRE,
hailfinger286829b2009-01-08 03:40:17 +00008160 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +00008161 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +00008162 .block_erasers =
8163 {
8164 {
8165 .eraseblocks = { {4 * 1024, 64} },
8166 .block_erase = erase_sector_jedec,
8167 }, {
8168 .eraseblocks = { {16 * 1024, 16} },
8169 .block_erase = erase_block_jedec,
8170 }, {
8171 .eraseblocks = { {256 * 1024, 1} },
8172 .block_erase = NULL,
8173 }
8174 },
snelsonc6855342010-01-28 23:55:12 +00008175 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00008176 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008177 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00008178 },
8179
hailfinger286829b2009-01-08 03:40:17 +00008180 {
8181 .vendor = "SST",
8182 .name = "SST49LF040",
hailfingere1e41ea2011-07-27 07:13:06 +00008183 .bustype = BUS_LPC,
hailfinger286829b2009-01-08 03:40:17 +00008184 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00008185 .model_id = SST_SST49LF040,
hailfinger286829b2009-01-08 03:40:17 +00008186 .total_size = 512,
8187 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +00008188 .feature_bits = FEATURE_EITHER_RESET,
hailfingerd217d122010-10-08 18:52:29 +00008189 .tested = TEST_OK_PRE,
hailfinger286829b2009-01-08 03:40:17 +00008190 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +00008191 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +00008192 .block_erasers =
8193 {
8194 {
8195 .eraseblocks = { {4 * 1024, 128} },
8196 .block_erase = erase_sector_jedec,
8197 }, {
8198 .eraseblocks = { {64 * 1024, 8} },
8199 .block_erase = erase_block_jedec,
8200 }, {
8201 .eraseblocks = { {512 * 1024, 1} },
8202 .block_erase = NULL,
8203 }
8204 },
snelsonc6855342010-01-28 23:55:12 +00008205 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00008206 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008207 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00008208 },
8209
hailfinger286829b2009-01-08 03:40:17 +00008210 {
8211 .vendor = "SST",
8212 .name = "SST49LF040B",
hailfingere1e41ea2011-07-27 07:13:06 +00008213 .bustype = BUS_LPC, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00008214 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00008215 .model_id = SST_SST49LF040B,
hailfinger286829b2009-01-08 03:40:17 +00008216 .total_size = 512,
8217 .page_size = 64 * 1024,
mkarcher83414fc2010-08-16 22:12:39 +00008218 .feature_bits = FEATURE_EITHER_RESET | FEATURE_REGISTERMAP,
stefanctd6efe1a2011-09-03 11:22:27 +00008219 .tested = TEST_OK_PREW,
snelson264e57c2010-01-20 20:55:53 +00008220 .probe = probe_jedec,
hailfingerb8e4e212010-03-15 03:48:42 +00008221 .probe_timing = 1, /* 150ns */
snelson264e57c2010-01-20 20:55:53 +00008222 .block_erasers =
8223 {
8224 {
8225 .eraseblocks = { {4 * 1024, 128} },
8226 .block_erase = erase_sector_jedec,
8227 }, {
8228 .eraseblocks = { {64 * 1024, 8} },
8229 .block_erase = erase_block_jedec,
8230 }, {
8231 .eraseblocks = { {512 * 1024, 1} },
8232 .block_erase = NULL,
8233 }
8234 },
mkarcher83414fc2010-08-16 22:12:39 +00008235 .unlock = unlock_82802ab,
snelsonc6855342010-01-28 23:55:12 +00008236 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00008237 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008238 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00008239 },
8240
hailfinger286829b2009-01-08 03:40:17 +00008241 {
8242 .vendor = "SST",
8243 .name = "SST49LF080A",
hailfingere1e41ea2011-07-27 07:13:06 +00008244 .bustype = BUS_LPC, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00008245 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00008246 .model_id = SST_SST49LF080A,
hailfinger286829b2009-01-08 03:40:17 +00008247 .total_size = 1024,
8248 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +00008249 .feature_bits = FEATURE_EITHER_RESET,
David Hendricksc801adb2010-12-09 16:58:56 -08008250 .tested = TEST_OK_PRE,
hailfinger286829b2009-01-08 03:40:17 +00008251 .probe = probe_jedec,
Simon Glass8dc82732013-07-16 10:13:51 -06008252 .probe_timing = TIMING_FIXME,
snelson264e57c2010-01-20 20:55:53 +00008253 .block_erasers =
8254 {
8255 {
8256 .eraseblocks = { {4 * 1024, 256} },
8257 .block_erase = erase_sector_jedec,
8258 }, {
8259 .eraseblocks = { {64 * 1024, 16} },
8260 .block_erase = erase_block_jedec,
8261 }, {
8262 .eraseblocks = { {1024 * 1024, 1} },
8263 .block_erase = NULL,
8264 }
8265 },
snelsonc6855342010-01-28 23:55:12 +00008266 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00008267 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008268 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00008269 },
8270
hailfinger286829b2009-01-08 03:40:17 +00008271 {
8272 .vendor = "SST",
8273 .name = "SST49LF160C",
hailfingere1e41ea2011-07-27 07:13:06 +00008274 .bustype = BUS_LPC,
hailfinger286829b2009-01-08 03:40:17 +00008275 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00008276 .model_id = SST_SST49LF160C,
hailfinger286829b2009-01-08 03:40:17 +00008277 .total_size = 2048,
8278 .page_size = 4 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00008279 .feature_bits = FEATURE_REGISTERMAP,
hailfingerd217d122010-10-08 18:52:29 +00008280 .tested = TEST_OK_PRE,
hailfingerb8e4e212010-03-15 03:48:42 +00008281 .probe = probe_82802ab,
uwe37f43422011-06-19 17:23:55 +00008282 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
snelson264e57c2010-01-20 20:55:53 +00008283 .block_erasers =
8284 {
8285 {
8286 .eraseblocks = { {4 * 1024, 512} },
8287 .block_erase = erase_sector_49lfxxxc,
8288 }, {
Simon Glass8dc82732013-07-16 10:13:51 -06008289 .eraseblocks = {
snelson264e57c2010-01-20 20:55:53 +00008290 {64 * 1024, 31},
8291 {32 * 1024, 1},
8292 {8 * 1024, 2},
8293 {16 * 1024, 1},
8294 },
snelson3a69e422010-03-23 17:10:28 +00008295 .block_erase = erase_block_82802ab,
snelson264e57c2010-01-20 20:55:53 +00008296 }
8297 },
snelson1ee293c2010-02-19 00:52:10 +00008298 .unlock = unlock_49lfxxxc,
hailfinger86bf3b52010-10-13 21:49:30 +00008299 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00008300 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008301 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00008302 },
8303
hailfinger286829b2009-01-08 03:40:17 +00008304 {
8305 .vendor = "ST",
8306 .name = "M25P05-A",
hailfingere1e41ea2011-07-27 07:13:06 +00008307 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00008308 .manufacture_id = ST_ID,
8309 .model_id = ST_M25P05A,
8310 .total_size = 64,
8311 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08008312 .feature_bits = FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00008313 .tested = TEST_UNTESTED,
8314 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00008315 .probe_timing = TIMING_ZERO,
snelsone0c56352010-01-19 16:08:51 +00008316 .block_erasers =
8317 {
8318 {
8319 .eraseblocks = { {32 * 1024, 2} },
8320 .block_erase = spi_block_erase_d8,
8321 }, {
8322 .eraseblocks = { {64 * 1024, 1} },
8323 .block_erase = spi_block_erase_c7,
8324 }
8325 },
hailfingerb9560ee2010-07-14 20:21:22 +00008326 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00008327 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00008328 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00008329 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00008330 },
8331
hailfingerfb513de2009-07-23 01:40:20 +00008332 /* The ST M25P05 is a bit of a problem. It has the same ID as the
8333 * ST M25P05-A in RES mode, but supports only 128 byte writes instead
hailfinger59a83572010-05-28 17:07:57 +00008334 * of 256 byte writes. We rely heavily on the fact that probe_spi_res1
hailfingerfb513de2009-07-23 01:40:20 +00008335 * only is successful if RDID does not work.
8336 */
8337 {
8338 .vendor = "ST",
stefanctd6efe1a2011-09-03 11:22:27 +00008339 .name = "M25P05",
hailfingere1e41ea2011-07-27 07:13:06 +00008340 .bustype = BUS_SPI,
hailfinger59a83572010-05-28 17:07:57 +00008341 .manufacture_id = 0, /* Not used. */
hailfingerfb513de2009-07-23 01:40:20 +00008342 .model_id = ST_M25P05_RES,
8343 .total_size = 64,
8344 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08008345 .feature_bits = FEATURE_UNBOUND_READ,
hailfingerfb513de2009-07-23 01:40:20 +00008346 .tested = TEST_UNTESTED,
hailfinger59a83572010-05-28 17:07:57 +00008347 .probe = probe_spi_res1,
hailfingerfb513de2009-07-23 01:40:20 +00008348 .probe_timing = TIMING_ZERO,
snelsone0c56352010-01-19 16:08:51 +00008349 .block_erasers =
8350 {
8351 {
8352 .eraseblocks = { {32 * 1024, 2} },
8353 .block_erase = spi_block_erase_d8,
8354 }, {
8355 .eraseblocks = { {64 * 1024, 1} },
8356 .block_erase = spi_block_erase_c7,
8357 }
8358 },
hailfingerb9560ee2010-07-14 20:21:22 +00008359 .unlock = spi_disable_blockprotect,
hailfingerfb513de2009-07-23 01:40:20 +00008360 .write = spi_chip_write_1, /* 128 */
8361 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00008362 .voltage = {2700, 3600},
hailfingerfb513de2009-07-23 01:40:20 +00008363 },
8364
hailfinger286829b2009-01-08 03:40:17 +00008365 {
8366 .vendor = "ST",
8367 .name = "M25P10-A",
hailfingere1e41ea2011-07-27 07:13:06 +00008368 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00008369 .manufacture_id = ST_ID,
8370 .model_id = ST_M25P10A,
8371 .total_size = 128,
8372 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08008373 .feature_bits = FEATURE_UNBOUND_READ,
8374 .tested = TEST_OK_PREU,
hailfinger286829b2009-01-08 03:40:17 +00008375 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00008376 .probe_timing = TIMING_ZERO,
snelsone0c56352010-01-19 16:08:51 +00008377 .block_erasers =
8378 {
8379 {
8380 .eraseblocks = { {32 * 1024, 4} },
8381 .block_erase = spi_block_erase_d8,
8382 }, {
8383 .eraseblocks = { {128 * 1024, 1} },
8384 .block_erase = spi_block_erase_c7,
8385 }
8386 },
hailfingerb9560ee2010-07-14 20:21:22 +00008387 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00008388 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00008389 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00008390 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00008391 },
8392
hailfingerfb513de2009-07-23 01:40:20 +00008393 /* The ST M25P10 has the same problem as the M25P05. */
8394 {
8395 .vendor = "ST",
stefanctd6efe1a2011-09-03 11:22:27 +00008396 .name = "M25P10",
hailfingere1e41ea2011-07-27 07:13:06 +00008397 .bustype = BUS_SPI,
hailfinger59a83572010-05-28 17:07:57 +00008398 .manufacture_id = 0, /* Not used. */
hailfingerfb513de2009-07-23 01:40:20 +00008399 .model_id = ST_M25P10_RES,
8400 .total_size = 128,
8401 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08008402 .feature_bits = FEATURE_UNBOUND_READ,
hailfingerfb513de2009-07-23 01:40:20 +00008403 .tested = TEST_UNTESTED,
hailfinger59a83572010-05-28 17:07:57 +00008404 .probe = probe_spi_res1,
hailfingerfb513de2009-07-23 01:40:20 +00008405 .probe_timing = TIMING_ZERO,
snelsone0c56352010-01-19 16:08:51 +00008406 .block_erasers =
8407 {
8408 {
8409 .eraseblocks = { {32 * 1024, 4} },
8410 .block_erase = spi_block_erase_d8,
8411 }, {
8412 .eraseblocks = { {128 * 1024, 1} },
8413 .block_erase = spi_block_erase_c7,
8414 }
8415 },
hailfingerb9560ee2010-07-14 20:21:22 +00008416 .unlock = spi_disable_blockprotect,
hailfingerfb513de2009-07-23 01:40:20 +00008417 .write = spi_chip_write_1, /* 128 */
8418 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00008419 .voltage = {2700, 3600},
hailfingerfb513de2009-07-23 01:40:20 +00008420 },
8421
hailfinger286829b2009-01-08 03:40:17 +00008422 {
8423 .vendor = "ST",
8424 .name = "M25P20",
hailfingere1e41ea2011-07-27 07:13:06 +00008425 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00008426 .manufacture_id = ST_ID,
8427 .model_id = ST_M25P20,
8428 .total_size = 256,
8429 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08008430 .feature_bits = FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00008431 .tested = TEST_UNTESTED,
8432 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00008433 .probe_timing = TIMING_ZERO,
snelsone0c56352010-01-19 16:08:51 +00008434 .block_erasers =
8435 {
8436 {
8437 .eraseblocks = { {64 * 1024, 4} },
8438 .block_erase = spi_block_erase_d8,
8439 }, {
8440 .eraseblocks = { {256 * 1024, 1} },
8441 .block_erase = spi_block_erase_c7,
8442 }
8443 },
hailfingerb9560ee2010-07-14 20:21:22 +00008444 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00008445 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00008446 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00008447 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00008448 },
8449
hailfinger286829b2009-01-08 03:40:17 +00008450 {
stefanctd6efe1a2011-09-03 11:22:27 +00008451 .vendor = "ST", /* Numonyx */
hailfinger286829b2009-01-08 03:40:17 +00008452 .name = "M25P40",
hailfingere1e41ea2011-07-27 07:13:06 +00008453 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00008454 .manufacture_id = ST_ID,
8455 .model_id = ST_M25P40,
8456 .total_size = 512,
8457 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08008458 .feature_bits = FEATURE_UNBOUND_READ,
Stefan Tauner718d1eb2016-08-18 18:00:53 -07008459 .tested = TEST_OK_PREWU,
hailfinger286829b2009-01-08 03:40:17 +00008460 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00008461 .probe_timing = TIMING_ZERO,
snelsone0c56352010-01-19 16:08:51 +00008462 .block_erasers =
8463 {
8464 {
8465 .eraseblocks = { {64 * 1024, 8} },
8466 .block_erase = spi_block_erase_d8,
8467 }, {
8468 .eraseblocks = { {512 * 1024, 1} },
8469 .block_erase = spi_block_erase_c7,
8470 }
8471 },
hailfingerb9560ee2010-07-14 20:21:22 +00008472 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00008473 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00008474 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00008475 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00008476 },
8477
hailfinger286829b2009-01-08 03:40:17 +00008478 {
8479 .vendor = "ST",
8480 .name = "M25P40-old",
hailfingere1e41ea2011-07-27 07:13:06 +00008481 .bustype = BUS_SPI,
hailfinger59a83572010-05-28 17:07:57 +00008482 .manufacture_id = 0, /* Not used. */
hailfinger286829b2009-01-08 03:40:17 +00008483 .model_id = ST_M25P40_RES,
8484 .total_size = 512,
8485 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08008486 .feature_bits = FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00008487 .tested = TEST_UNTESTED,
hailfinger59a83572010-05-28 17:07:57 +00008488 .probe = probe_spi_res1,
hailfingere3095d92009-06-05 13:46:17 +00008489 .probe_timing = TIMING_ZERO,
snelsone0c56352010-01-19 16:08:51 +00008490 .block_erasers =
8491 {
8492 {
8493 .eraseblocks = { {64 * 1024, 8} },
8494 .block_erase = spi_block_erase_d8,
8495 }, {
8496 .eraseblocks = { {512 * 1024, 1} },
8497 .block_erase = spi_block_erase_c7,
8498 }
8499 },
hailfingerb9560ee2010-07-14 20:21:22 +00008500 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00008501 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00008502 .read = spi_chip_read,
stepanaa1b6a22008-12-08 18:15:10 +00008503 },
8504
hailfinger286829b2009-01-08 03:40:17 +00008505 {
8506 .vendor = "ST",
8507 .name = "M25P80",
hailfingere1e41ea2011-07-27 07:13:06 +00008508 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00008509 .manufacture_id = ST_ID,
8510 .model_id = ST_M25P80,
8511 .total_size = 1024,
8512 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08008513 .feature_bits = FEATURE_UNBOUND_READ,
8514 .tested = TEST_OK_PREWU,
hailfinger286829b2009-01-08 03:40:17 +00008515 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00008516 .probe_timing = TIMING_ZERO,
snelsone0c56352010-01-19 16:08:51 +00008517 .block_erasers =
8518 {
8519 {
8520 .eraseblocks = { {64 * 1024, 16} },
8521 .block_erase = spi_block_erase_d8,
8522 }, {
8523 .eraseblocks = { {1024 * 1024, 1} },
8524 .block_erase = spi_block_erase_c7,
8525 }
8526 },
hailfingerb9560ee2010-07-14 20:21:22 +00008527 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00008528 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00008529 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00008530 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00008531 },
8532
hailfinger286829b2009-01-08 03:40:17 +00008533 {
8534 .vendor = "ST",
8535 .name = "M25P16",
hailfingere1e41ea2011-07-27 07:13:06 +00008536 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00008537 .manufacture_id = ST_ID,
8538 .model_id = ST_M25P16,
8539 .total_size = 2048,
8540 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08008541 .feature_bits = FEATURE_UNBOUND_READ,
8542 .tested = TEST_OK_PRU,
hailfinger286829b2009-01-08 03:40:17 +00008543 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00008544 .probe_timing = TIMING_ZERO,
snelsone0c56352010-01-19 16:08:51 +00008545 .block_erasers =
8546 {
8547 {
8548 .eraseblocks = { {64 * 1024, 32} },
8549 .block_erase = spi_block_erase_d8,
8550 }, {
8551 .eraseblocks = { {2 * 1024 * 1024, 1} },
8552 .block_erase = spi_block_erase_c7,
8553 }
8554 },
hailfingerb9560ee2010-07-14 20:21:22 +00008555 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00008556 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00008557 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00008558 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00008559 },
8560
hailfinger286829b2009-01-08 03:40:17 +00008561 {
8562 .vendor = "ST",
8563 .name = "M25P32",
hailfingere1e41ea2011-07-27 07:13:06 +00008564 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00008565 .manufacture_id = ST_ID,
8566 .model_id = ST_M25P32,
8567 .total_size = 4096,
8568 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08008569 .feature_bits = FEATURE_UNBOUND_READ,
8570 .tested = TEST_OK_PREWU,
hailfinger286829b2009-01-08 03:40:17 +00008571 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00008572 .probe_timing = TIMING_ZERO,
snelsone0c56352010-01-19 16:08:51 +00008573 .block_erasers =
8574 {
8575 {
8576 .eraseblocks = { {64 * 1024, 64} },
8577 .block_erase = spi_block_erase_d8,
8578 }, {
8579 .eraseblocks = { {4 * 1024 * 1024, 1} },
8580 .block_erase = spi_block_erase_c7,
8581 }
8582 },
hailfingerb9560ee2010-07-14 20:21:22 +00008583 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00008584 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00008585 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00008586 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00008587 },
8588
hailfinger286829b2009-01-08 03:40:17 +00008589 {
8590 .vendor = "ST",
8591 .name = "M25P64",
hailfingere1e41ea2011-07-27 07:13:06 +00008592 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00008593 .manufacture_id = ST_ID,
8594 .model_id = ST_M25P64,
8595 .total_size = 8192,
8596 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08008597 .feature_bits = FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00008598 .tested = TEST_UNTESTED,
8599 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00008600 .probe_timing = TIMING_ZERO,
snelsone0c56352010-01-19 16:08:51 +00008601 .block_erasers =
8602 {
8603 {
8604 .eraseblocks = { {64 * 1024, 128} },
8605 .block_erase = spi_block_erase_d8,
8606 }, {
8607 .eraseblocks = { {8 * 1024 * 1024, 1} },
8608 .block_erase = spi_block_erase_c7,
8609 }
8610 },
hailfingerb9560ee2010-07-14 20:21:22 +00008611 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00008612 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00008613 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00008614 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00008615 },
8616
hailfinger286829b2009-01-08 03:40:17 +00008617 {
8618 .vendor = "ST",
8619 .name = "M25P128",
hailfingere1e41ea2011-07-27 07:13:06 +00008620 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00008621 .manufacture_id = ST_ID,
8622 .model_id = ST_M25P128,
8623 .total_size = 16384,
8624 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08008625 .feature_bits = FEATURE_UNBOUND_READ,
8626 .tested = TEST_OK_PREWU,
hailfinger286829b2009-01-08 03:40:17 +00008627 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00008628 .probe_timing = TIMING_ZERO,
snelsone0c56352010-01-19 16:08:51 +00008629 .block_erasers =
8630 {
8631 {
8632 .eraseblocks = { {256 * 1024, 64} },
8633 .block_erase = spi_block_erase_d8,
8634 }, {
8635 .eraseblocks = { {16 * 1024 * 1024, 1} },
8636 .block_erase = spi_block_erase_c7,
8637 }
8638 },
hailfingerb9560ee2010-07-14 20:21:22 +00008639 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00008640 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00008641 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00008642 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00008643 },
8644
hailfinger286829b2009-01-08 03:40:17 +00008645 {
8646 .vendor = "ST",
hailfinger38fd4992011-03-06 18:45:40 +00008647 .name = "M25PX16",
hailfingere1e41ea2011-07-27 07:13:06 +00008648 .bustype = BUS_SPI,
hailfinger38fd4992011-03-06 18:45:40 +00008649 .manufacture_id = ST_ID,
8650 .model_id = ST_M25PX16,
8651 .total_size = 2048,
8652 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07008653 /* OTP: 64B total; read 0x4B; write 0x42 */
8654 .feature_bits = FEATURE_UNBOUND_READ | FEATURE_OTP,
David Hendricks488cf072015-11-23 16:45:07 -08008655 .tested = TEST_OK_PREWU,
hailfinger38fd4992011-03-06 18:45:40 +00008656 .probe = probe_spi_rdid,
8657 .probe_timing = TIMING_ZERO,
8658 .block_erasers =
8659 {
8660 {
8661 .eraseblocks = { { 4 * 1024, 512 } },
8662 .block_erase = spi_block_erase_20,
8663 }, {
8664 .eraseblocks = { {64 * 1024, 32} },
8665 .block_erase = spi_block_erase_d8,
8666 }, {
8667 .eraseblocks = { {2 * 1024 * 1024, 1} },
8668 .block_erase = spi_block_erase_c7,
8669 }
8670 },
8671 .unlock = spi_disable_blockprotect,
8672 .write = spi_chip_write_256,
8673 .read = spi_chip_read,
8674 },
8675
8676 {
8677 .vendor = "ST",
uwe8b50b592010-09-14 13:16:01 +00008678 .name = "M25PX32",
hailfingere1e41ea2011-07-27 07:13:06 +00008679 .bustype = BUS_SPI,
uwe8b50b592010-09-14 13:16:01 +00008680 .manufacture_id = ST_ID,
8681 .model_id = ST_M25PX32,
8682 .total_size = 4096,
8683 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08008684 .feature_bits = FEATURE_UNBOUND_READ,
8685 .tested = TEST_OK_PREU,
uwe8b50b592010-09-14 13:16:01 +00008686 .probe = probe_spi_rdid,
8687 .probe_timing = TIMING_ZERO,
8688 .block_erasers =
8689 {
8690 {
8691 .eraseblocks = { { 4 * 1024, 1024 } },
8692 .block_erase = spi_block_erase_20,
8693 }, {
8694 .eraseblocks = { {64 * 1024, 64} },
8695 .block_erase = spi_block_erase_d8,
8696 }, {
8697 .eraseblocks = { {4 * 1024 * 1024, 1} },
8698 .block_erase = spi_block_erase_c7,
8699 }
8700 },
8701 .unlock = spi_disable_blockprotect,
8702 .write = spi_chip_write_256,
8703 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +00008704 .voltage = {2700, 3600},
uwe8b50b592010-09-14 13:16:01 +00008705 },
8706
8707 {
8708 .vendor = "ST",
8709 .name = "M25PX64",
hailfingere1e41ea2011-07-27 07:13:06 +00008710 .bustype = BUS_SPI,
uwe8b50b592010-09-14 13:16:01 +00008711 .manufacture_id = ST_ID,
8712 .model_id = ST_M25PX64,
8713 .total_size = 8192,
8714 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08008715 .feature_bits = FEATURE_UNBOUND_READ,
8716 .tested = TEST_OK_PREU,
uwe8b50b592010-09-14 13:16:01 +00008717 .probe = probe_spi_rdid,
8718 .probe_timing = TIMING_ZERO,
8719 .block_erasers =
8720 {
8721 {
8722 .eraseblocks = { { 4 * 1024, 2048 } },
8723 .block_erase = spi_block_erase_20,
8724 }, {
8725 .eraseblocks = { {64 * 1024, 128} },
8726 .block_erase = spi_block_erase_d8,
8727 }, {
8728 .eraseblocks = { {8 * 1024 * 1024, 1} },
8729 .block_erase = spi_block_erase_c7,
8730 }
8731 },
8732 .unlock = spi_disable_blockprotect,
8733 .write = spi_chip_write_256,
8734 .read = spi_chip_read,
8735 },
8736
8737 {
8738 .vendor = "ST",
David Hendricksc801adb2010-12-09 16:58:56 -08008739 .name = "M25PX32",
hailfingere1e41ea2011-07-27 07:13:06 +00008740 .bustype = BUS_SPI,
David Hendricksc801adb2010-12-09 16:58:56 -08008741 .manufacture_id = ST_ID,
8742 .model_id = ST_M25PX32,
8743 .total_size = 4096,
8744 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08008745 .feature_bits = FEATURE_UNBOUND_READ,
8746 .tested = TEST_OK_PREU,
David Hendricksc801adb2010-12-09 16:58:56 -08008747 .probe = probe_spi_rdid,
8748 .probe_timing = TIMING_ZERO,
8749 .block_erasers =
8750 {
8751 {
8752 .eraseblocks = { { 4 * 1024, 1024 } },
8753 .block_erase = spi_block_erase_20,
8754 }, {
8755 .eraseblocks = { {64 * 1024, 64} },
8756 .block_erase = spi_block_erase_d8,
8757 }, {
8758 .eraseblocks = { {4 * 1024 * 1024, 1} },
8759 .block_erase = spi_block_erase_c7,
8760 }
8761 },
8762 .unlock = spi_disable_blockprotect,
8763 .write = spi_chip_write_256,
8764 .read = spi_chip_read,
8765 },
8766
8767 {
8768 .vendor = "ST",
8769 .name = "M25PX64",
hailfingere1e41ea2011-07-27 07:13:06 +00008770 .bustype = BUS_SPI,
David Hendricksc801adb2010-12-09 16:58:56 -08008771 .manufacture_id = ST_ID,
8772 .model_id = ST_M25PX64,
8773 .total_size = 8192,
8774 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08008775 .feature_bits = FEATURE_UNBOUND_READ,
8776 .tested = TEST_OK_PREU,
David Hendricksc801adb2010-12-09 16:58:56 -08008777 .probe = probe_spi_rdid,
8778 .probe_timing = TIMING_ZERO,
8779 .block_erasers =
8780 {
8781 {
8782 .eraseblocks = { { 4 * 1024, 2048 } },
8783 .block_erase = spi_block_erase_20,
8784 }, {
8785 .eraseblocks = { {64 * 1024, 128} },
8786 .block_erase = spi_block_erase_d8,
8787 }, {
8788 .eraseblocks = { {8 * 1024 * 1024, 1} },
8789 .block_erase = spi_block_erase_c7,
8790 }
8791 },
8792 .unlock = spi_disable_blockprotect,
8793 .write = spi_chip_write_256,
8794 .read = spi_chip_read,
8795 },
8796
8797 {
8798 .vendor = "ST",
hailfinger286829b2009-01-08 03:40:17 +00008799 .name = "M29F002B",
hailfingere1e41ea2011-07-27 07:13:06 +00008800 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00008801 .manufacture_id = ST_ID,
8802 .model_id = ST_M29F002B,
8803 .total_size = 256,
8804 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00008805 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
hailfinger286829b2009-01-08 03:40:17 +00008806 .tested = TEST_UNTESTED,
8807 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00008808 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelsone0c56352010-01-19 16:08:51 +00008809 .block_erasers =
8810 {
8811 {
8812 .eraseblocks = {
8813 {16 * 1024, 1},
8814 {8 * 1024, 2},
8815 {32 * 1024, 1},
8816 {64 * 1024, 3},
8817 },
8818 .block_erase = erase_sector_jedec,
8819 }, {
8820 .eraseblocks = { {256 * 1024, 1} },
8821 .block_erase = erase_chip_block_jedec,
8822 }
8823 },
snelsonc6855342010-01-28 23:55:12 +00008824 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00008825 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +00008826 .voltage = {4750, 5250}, /* 4.75-5.25V for type -X, others 4.5-5.5V */
stepanaa1b6a22008-12-08 18:15:10 +00008827 },
8828
hailfinger286829b2009-01-08 03:40:17 +00008829 {
8830 .vendor = "ST",
8831 .name = "M29F002T/NT",
hailfingere1e41ea2011-07-27 07:13:06 +00008832 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00008833 .manufacture_id = ST_ID,
8834 .model_id = ST_M29F002T,
8835 .total_size = 256,
8836 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00008837 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
8838 .tested = TEST_UNTESTED,
hailfinger286829b2009-01-08 03:40:17 +00008839 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00008840 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelsone0c56352010-01-19 16:08:51 +00008841 .block_erasers =
8842 {
8843 {
8844 .eraseblocks = {
8845 {64 * 1024, 3},
8846 {32 * 1024, 1},
8847 {8 * 1024, 2},
8848 {16 * 1024, 1},
8849 },
8850 .block_erase = erase_sector_jedec,
8851 }, {
8852 .eraseblocks = { {256 * 1024, 1} },
8853 .block_erase = erase_chip_block_jedec,
8854 }
8855 },
snelsonc6855342010-01-28 23:55:12 +00008856 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00008857 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +00008858 .voltage = {4750, 5250}, /* 4.75-5.25V for type -X, others 4.5-5.5V */
stepanaa1b6a22008-12-08 18:15:10 +00008859 },
8860
hailfinger286829b2009-01-08 03:40:17 +00008861 {
8862 .vendor = "ST",
8863 .name = "M29F040B",
hailfingere1e41ea2011-07-27 07:13:06 +00008864 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00008865 .manufacture_id = ST_ID,
8866 .model_id = ST_M29F040B,
8867 .total_size = 512,
8868 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00008869 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
8870 .tested = TEST_UNTESTED,
8871 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +00008872 .probe_timing = TIMING_ZERO, /* datasheet specifies no timing */
snelsone0c56352010-01-19 16:08:51 +00008873 .block_erasers =
8874 {
8875 {
8876 .eraseblocks = { {64 * 1024, 8}, },
snelsonc6855342010-01-28 23:55:12 +00008877 .block_erase = erase_sector_jedec,
snelsone0c56352010-01-19 16:08:51 +00008878 }, {
8879 .eraseblocks = { {512 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +00008880 .block_erase = erase_chip_block_jedec,
snelsone0c56352010-01-19 16:08:51 +00008881 }
8882 },
snelsonc6855342010-01-28 23:55:12 +00008883 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00008884 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008885 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00008886 },
8887
hailfinger286829b2009-01-08 03:40:17 +00008888 {
snelsonc6855342010-01-28 23:55:12 +00008889 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
hailfinger286829b2009-01-08 03:40:17 +00008890 .vendor = "ST",
hailfingerfa513302010-07-16 22:07:20 +00008891 .name = "M29F400BB",
hailfingere1e41ea2011-07-27 07:13:06 +00008892 .bustype = BUS_PARALLEL,
hailfingerfa513302010-07-16 22:07:20 +00008893 .manufacture_id = ST_ID,
8894 .model_id = ST_M29F400BB,
8895 .total_size = 512,
8896 .page_size = 64 * 1024,
8897 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
hailfinger86bf3b52010-10-13 21:49:30 +00008898 .tested = TEST_UNTESTED,
hailfingerfa513302010-07-16 22:07:20 +00008899 .probe = probe_m29f400bt,
8900 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
8901 .block_erasers =
8902 {
8903 {
8904 .eraseblocks = {
8905 {16 * 1024, 1},
8906 {8 * 1024, 2},
8907 {32 * 1024, 1},
8908 {64 * 1024, 7},
8909 },
8910 .block_erase = block_erase_m29f400bt,
8911 }, {
8912 .eraseblocks = { {512 * 1024, 1} },
8913 .block_erase = block_erase_chip_m29f400bt,
8914 }
8915 },
hailfinger86bf3b52010-10-13 21:49:30 +00008916 .write = write_m29f400bt,
hailfingerfa513302010-07-16 22:07:20 +00008917 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008918 .voltage = {4500, 5500},
hailfingerfa513302010-07-16 22:07:20 +00008919 },
8920 {
8921 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
8922 .vendor = "ST",
hailfinger286829b2009-01-08 03:40:17 +00008923 .name = "M29F400BT",
hailfingere1e41ea2011-07-27 07:13:06 +00008924 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00008925 .manufacture_id = ST_ID,
8926 .model_id = ST_M29F400BT,
8927 .total_size = 512,
8928 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00008929 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
hailfinger286829b2009-01-08 03:40:17 +00008930 .tested = TEST_UNTESTED,
8931 .probe = probe_m29f400bt,
uwe37f43422011-06-19 17:23:55 +00008932 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
snelsone0c56352010-01-19 16:08:51 +00008933 .block_erasers =
8934 {
8935 {
8936 .eraseblocks = {
8937 {64 * 1024, 7},
8938 {32 * 1024, 1},
8939 {8 * 1024, 2},
8940 {16 * 1024, 1},
8941 },
8942 .block_erase = block_erase_m29f400bt,
8943 }, {
8944 .eraseblocks = { {512 * 1024, 1} },
8945 .block_erase = block_erase_chip_m29f400bt,
8946 }
8947 },
hailfingerfa513302010-07-16 22:07:20 +00008948 .write = write_m29f400bt,
hailfinger23060112009-05-08 12:49:03 +00008949 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008950 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00008951 },
8952
hailfinger286829b2009-01-08 03:40:17 +00008953 {
8954 .vendor = "ST",
8955 .name = "M29W010B",
hailfingere1e41ea2011-07-27 07:13:06 +00008956 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00008957 .manufacture_id = ST_ID,
8958 .model_id = ST_M29W010B,
8959 .total_size = 128,
8960 .page_size = 16 * 1024,
snelsonc6855342010-01-28 23:55:12 +00008961 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
hailfinger286829b2009-01-08 03:40:17 +00008962 .tested = TEST_UNTESTED,
8963 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00008964 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelsone0c56352010-01-19 16:08:51 +00008965 .block_erasers =
8966 {
8967 {
8968 .eraseblocks = { {16 * 1024, 8}, },
8969 .block_erase = erase_sector_jedec,
8970 }, {
8971 .eraseblocks = { {128 * 1024, 1} },
8972 .block_erase = erase_chip_block_jedec,
8973 }
8974 },
snelsonc6855342010-01-28 23:55:12 +00008975 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00008976 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008977 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00008978 },
8979
hailfinger286829b2009-01-08 03:40:17 +00008980 {
8981 .vendor = "ST",
8982 .name = "M29W040B",
hailfingere1e41ea2011-07-27 07:13:06 +00008983 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00008984 .manufacture_id = ST_ID,
8985 .model_id = ST_M29W040B,
8986 .total_size = 512,
8987 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00008988 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
hailfinger286829b2009-01-08 03:40:17 +00008989 .tested = TEST_UNTESTED,
8990 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00008991 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelsone0c56352010-01-19 16:08:51 +00008992 .block_erasers =
8993 {
8994 {
8995 .eraseblocks = { {64 * 1024, 8}, },
8996 .block_erase = erase_sector_jedec,
8997 }, {
8998 .eraseblocks = { {512 * 1024, 1} },
8999 .block_erase = erase_chip_block_jedec,
9000 }
9001 },
snelsonc6855342010-01-28 23:55:12 +00009002 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00009003 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009004 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00009005 },
9006
snelson91cd0662010-02-01 05:49:46 +00009007 {
9008 .vendor = "ST",
9009 .name = "M29W512B",
hailfingere1e41ea2011-07-27 07:13:06 +00009010 .bustype = BUS_PARALLEL,
snelson91cd0662010-02-01 05:49:46 +00009011 .manufacture_id = ST_ID,
9012 .model_id = ST_M29W512B,
9013 .total_size = 64,
9014 .page_size = 64 * 1024,
9015 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
hailfingerd217d122010-10-08 18:52:29 +00009016 .tested = TEST_OK_PRE,
snelson91cd0662010-02-01 05:49:46 +00009017 .probe = probe_jedec,
9018 .probe_timing = TIMING_ZERO,
snelson91cd0662010-02-01 05:49:46 +00009019 .block_erasers =
9020 {
9021 {
9022 .eraseblocks = { {64 * 1024, 1} },
9023 .block_erase = erase_chip_block_jedec,
9024 }
9025 },
9026 .write = write_jedec_1,
9027 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009028 .voltage = {2700, 3600},
snelson91cd0662010-02-01 05:49:46 +00009029 },
9030
hailfinger286829b2009-01-08 03:40:17 +00009031 {
9032 .vendor = "ST",
9033 .name = "M50FLW040A",
hailfingere1e41ea2011-07-27 07:13:06 +00009034 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00009035 .manufacture_id = ST_ID,
9036 .model_id = ST_M50FLW040A,
9037 .total_size = 512,
9038 .page_size = 64 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00009039 .feature_bits = FEATURE_REGISTERMAP,
hailfinger286829b2009-01-08 03:40:17 +00009040 .tested = TEST_UNTESTED,
snelsonc6855342010-01-28 23:55:12 +00009041 .probe = probe_82802ab,
hailfinger4d547032010-01-10 01:34:00 +00009042 .probe_timing = TIMING_FIXME,
snelsone0c56352010-01-19 16:08:51 +00009043 .block_erasers =
9044 {
9045 {
snelsonf88616b2010-01-19 16:39:19 +00009046 .eraseblocks = {
uwe81d75ab2010-09-05 12:41:25 +00009047 {4 * 1024, 16}, /* sector */
snelsonf88616b2010-01-19 16:39:19 +00009048 {64 * 1024, 5}, /* block */
9049 {4 * 1024, 16}, /* sector */
9050 {4 * 1024, 16}, /* sector */
9051 },
9052 .block_erase = NULL,
9053 }, {
snelsone0c56352010-01-19 16:08:51 +00009054 .eraseblocks = { {64 * 1024, 8}, },
snelsonc0acbeb2010-03-19 18:47:06 +00009055 .block_erase = erase_block_82802ab,
snelsone0c56352010-01-19 16:08:51 +00009056 }
9057 },
snelsonc0acbeb2010-03-19 18:47:06 +00009058 .unlock = unlock_stm50flw0x0x,
9059 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00009060 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009061 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
stepanaa1b6a22008-12-08 18:15:10 +00009062 },
9063
hailfinger286829b2009-01-08 03:40:17 +00009064 {
9065 .vendor = "ST",
9066 .name = "M50FLW040B",
hailfingere1e41ea2011-07-27 07:13:06 +00009067 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00009068 .manufacture_id = ST_ID,
9069 .model_id = ST_M50FLW040B,
9070 .total_size = 512,
9071 .page_size = 64 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00009072 .feature_bits = FEATURE_REGISTERMAP,
hailfinger286829b2009-01-08 03:40:17 +00009073 .tested = TEST_UNTESTED,
snelsonc6855342010-01-28 23:55:12 +00009074 .probe = probe_82802ab,
hailfinger4d547032010-01-10 01:34:00 +00009075 .probe_timing = TIMING_FIXME,
snelsone0c56352010-01-19 16:08:51 +00009076 .block_erasers =
9077 {
9078 {
snelsonf88616b2010-01-19 16:39:19 +00009079 .eraseblocks = {
uwe81d75ab2010-09-05 12:41:25 +00009080 {4 * 1024, 16}, /* sector */
snelsonf88616b2010-01-19 16:39:19 +00009081 {4 * 1024, 16}, /* sector */
9082 {64 * 1024, 5}, /* block */
9083 {4 * 1024, 16}, /* sector */
9084 },
9085 .block_erase = NULL,
9086 }, {
snelsone0c56352010-01-19 16:08:51 +00009087 .eraseblocks = { {64 * 1024, 8}, },
snelsonc0acbeb2010-03-19 18:47:06 +00009088 .block_erase = erase_block_82802ab,
snelsone0c56352010-01-19 16:08:51 +00009089 }
9090 },
snelsonc0acbeb2010-03-19 18:47:06 +00009091 .unlock = unlock_stm50flw0x0x,
9092 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00009093 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009094 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
stepanaa1b6a22008-12-08 18:15:10 +00009095 },
9096
hailfinger286829b2009-01-08 03:40:17 +00009097 {
9098 .vendor = "ST",
9099 .name = "M50FLW080A",
hailfingere1e41ea2011-07-27 07:13:06 +00009100 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00009101 .manufacture_id = ST_ID,
9102 .model_id = ST_M50FLW080A,
9103 .total_size = 1024,
9104 .page_size = 64 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00009105 .feature_bits = FEATURE_REGISTERMAP,
hailfingerd217d122010-10-08 18:52:29 +00009106 .tested = TEST_OK_PRE,
snelsonc6855342010-01-28 23:55:12 +00009107 .probe = probe_82802ab,
hailfinger4d547032010-01-10 01:34:00 +00009108 .probe_timing = TIMING_FIXME,
snelsone0c56352010-01-19 16:08:51 +00009109 .block_erasers =
9110 {
9111 {
snelsonf88616b2010-01-19 16:39:19 +00009112 .eraseblocks = {
uwe81d75ab2010-09-05 12:41:25 +00009113 {4 * 1024, 16}, /* sector */
snelsonf88616b2010-01-19 16:39:19 +00009114 {64 * 1024, 13}, /* block */
9115 {4 * 1024, 16}, /* sector */
9116 {4 * 1024, 16}, /* sector */
9117 },
9118 .block_erase = NULL,
9119 }, {
snelsone0c56352010-01-19 16:08:51 +00009120 .eraseblocks = { {64 * 1024, 16}, },
snelsonc0acbeb2010-03-19 18:47:06 +00009121 .block_erase = erase_block_82802ab,
snelsone0c56352010-01-19 16:08:51 +00009122 }
9123 },
snelsonc0acbeb2010-03-19 18:47:06 +00009124 .unlock = unlock_stm50flw0x0x,
9125 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00009126 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009127 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
stepanaa1b6a22008-12-08 18:15:10 +00009128 },
9129
hailfinger286829b2009-01-08 03:40:17 +00009130 {
9131 .vendor = "ST",
9132 .name = "M50FLW080B",
hailfingere1e41ea2011-07-27 07:13:06 +00009133 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00009134 .manufacture_id = ST_ID,
9135 .model_id = ST_M50FLW080B,
9136 .total_size = 1024,
9137 .page_size = 64 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00009138 .feature_bits = FEATURE_REGISTERMAP,
hailfinger286829b2009-01-08 03:40:17 +00009139 .tested = TEST_UNTESTED,
snelsonc6855342010-01-28 23:55:12 +00009140 .probe = probe_82802ab,
hailfinger4d547032010-01-10 01:34:00 +00009141 .probe_timing = TIMING_FIXME,
snelsone0c56352010-01-19 16:08:51 +00009142 .block_erasers =
9143 {
9144 {
snelsonf88616b2010-01-19 16:39:19 +00009145 .eraseblocks = {
uwe81d75ab2010-09-05 12:41:25 +00009146 {4 * 1024, 16}, /* sector */
snelsonf88616b2010-01-19 16:39:19 +00009147 {4 * 1024, 16}, /* sector */
9148 {64 * 1024, 13}, /* block */
9149 {4 * 1024, 16}, /* sector */
9150 },
9151 .block_erase = NULL,
9152 }, {
snelsone0c56352010-01-19 16:08:51 +00009153 .eraseblocks = { {64 * 1024, 16}, },
snelsonc0acbeb2010-03-19 18:47:06 +00009154 .block_erase = erase_block_82802ab,
snelsone0c56352010-01-19 16:08:51 +00009155 }
9156 },
snelsonc0acbeb2010-03-19 18:47:06 +00009157 .unlock = unlock_stm50flw0x0x,
9158 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00009159 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009160 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
stepanaa1b6a22008-12-08 18:15:10 +00009161 },
9162
hailfinger286829b2009-01-08 03:40:17 +00009163 {
9164 .vendor = "ST",
9165 .name = "M50FW002",
hailfingere1e41ea2011-07-27 07:13:06 +00009166 .bustype = BUS_FWH, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00009167 .manufacture_id = ST_ID,
9168 .model_id = ST_M50FW002,
9169 .total_size = 256,
9170 .page_size = 64 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00009171 .feature_bits = FEATURE_REGISTERMAP,
hailfinger286829b2009-01-08 03:40:17 +00009172 .tested = TEST_UNTESTED,
snelsonc6855342010-01-28 23:55:12 +00009173 .probe = probe_82802ab,
uwe37f43422011-06-19 17:23:55 +00009174 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
snelsone0c56352010-01-19 16:08:51 +00009175 .block_erasers =
9176 {
9177 {
9178 .eraseblocks = {
9179 {64 * 1024, 3},
9180 {32 * 1024, 1},
9181 {8 * 1024, 2},
9182 {16 * 1024, 1},
9183 },
snelsonc0acbeb2010-03-19 18:47:06 +00009184 .block_erase = erase_block_82802ab,
snelsone0c56352010-01-19 16:08:51 +00009185 }
9186 },
snelsonc0acbeb2010-03-19 18:47:06 +00009187 .unlock = unlock_stm50flw0x0x,
9188 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00009189 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009190 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
stepanaa1b6a22008-12-08 18:15:10 +00009191 },
9192
hailfinger286829b2009-01-08 03:40:17 +00009193 {
9194 .vendor = "ST",
9195 .name = "M50FW016",
hailfingere1e41ea2011-07-27 07:13:06 +00009196 .bustype = BUS_FWH, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00009197 .manufacture_id = ST_ID,
9198 .model_id = ST_M50FW016,
9199 .total_size = 2048,
9200 .page_size = 64 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00009201 .feature_bits = FEATURE_REGISTERMAP,
hailfinger286829b2009-01-08 03:40:17 +00009202 .tested = TEST_UNTESTED,
9203 .probe = probe_82802ab,
uwe37f43422011-06-19 17:23:55 +00009204 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
snelsone0c56352010-01-19 16:08:51 +00009205 .block_erasers =
9206 {
9207 {
9208 .eraseblocks = { {64 * 1024, 32}, },
snelsonc0acbeb2010-03-19 18:47:06 +00009209 .block_erase = erase_block_82802ab,
snelsone0c56352010-01-19 16:08:51 +00009210 }
9211 },
snelsonc0acbeb2010-03-19 18:47:06 +00009212 .unlock = unlock_stm50flw0x0x,
9213 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00009214 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009215 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
stepanaa1b6a22008-12-08 18:15:10 +00009216 },
9217
hailfinger286829b2009-01-08 03:40:17 +00009218 {
9219 .vendor = "ST",
9220 .name = "M50FW040",
hailfingere1e41ea2011-07-27 07:13:06 +00009221 .bustype = BUS_FWH, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00009222 .manufacture_id = ST_ID,
9223 .model_id = ST_M50FW040,
9224 .total_size = 512,
9225 .page_size = 64 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00009226 .feature_bits = FEATURE_REGISTERMAP,
snelsonc0acbeb2010-03-19 18:47:06 +00009227 .tested = TEST_OK_PR,
hailfinger286829b2009-01-08 03:40:17 +00009228 .probe = probe_82802ab,
uwe37f43422011-06-19 17:23:55 +00009229 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
snelsone0c56352010-01-19 16:08:51 +00009230 .block_erasers =
9231 {
9232 {
9233 .eraseblocks = { {64 * 1024, 8}, },
snelsonc0acbeb2010-03-19 18:47:06 +00009234 .block_erase = erase_block_82802ab,
snelsone0c56352010-01-19 16:08:51 +00009235 }
9236 },
snelsonc0acbeb2010-03-19 18:47:06 +00009237 .unlock = unlock_stm50flw0x0x,
9238 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00009239 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009240 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
stepanaa1b6a22008-12-08 18:15:10 +00009241 },
9242
hailfinger286829b2009-01-08 03:40:17 +00009243 {
9244 .vendor = "ST",
9245 .name = "M50FW080",
hailfingere1e41ea2011-07-27 07:13:06 +00009246 .bustype = BUS_FWH, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00009247 .manufacture_id = ST_ID,
9248 .model_id = ST_M50FW080,
9249 .total_size = 1024,
9250 .page_size = 64 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00009251 .feature_bits = FEATURE_REGISTERMAP,
stefancte0e52902011-05-26 14:28:51 +00009252 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00009253 .probe = probe_82802ab,
uwe37f43422011-06-19 17:23:55 +00009254 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
snelsone0c56352010-01-19 16:08:51 +00009255 .block_erasers =
9256 {
9257 {
9258 .eraseblocks = { {64 * 1024, 16}, },
snelsonc0acbeb2010-03-19 18:47:06 +00009259 .block_erase = erase_block_82802ab,
snelsone0c56352010-01-19 16:08:51 +00009260 }
9261 },
snelsonc0acbeb2010-03-19 18:47:06 +00009262 .unlock = unlock_stm50flw0x0x,
9263 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00009264 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009265 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
stepanaa1b6a22008-12-08 18:15:10 +00009266 },
9267
hailfinger286829b2009-01-08 03:40:17 +00009268 {
9269 .vendor = "ST",
9270 .name = "M50LPW116",
hailfingere1e41ea2011-07-27 07:13:06 +00009271 .bustype = BUS_LPC, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00009272 .manufacture_id = ST_ID,
9273 .model_id = ST_M50LPW116,
9274 .total_size = 2048,
9275 .page_size = 64 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00009276 .feature_bits = FEATURE_REGISTERMAP,
hailfinger286829b2009-01-08 03:40:17 +00009277 .tested = TEST_UNTESTED,
snelsonc6855342010-01-28 23:55:12 +00009278 .probe = probe_82802ab,
hailfinger94466802009-09-05 01:31:32 +00009279 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelsone0c56352010-01-19 16:08:51 +00009280 .block_erasers =
9281 {
9282 {
9283 .eraseblocks = {
9284 {4 * 1024, 16},
9285 {64 * 1024, 30},
9286 {32 * 1024, 1},
9287 {8 * 1024, 2},
9288 {16 * 1024, 1},
9289 },
snelsonc0acbeb2010-03-19 18:47:06 +00009290 .block_erase = erase_block_82802ab,
snelsone0c56352010-01-19 16:08:51 +00009291 }
9292 },
snelsonc0acbeb2010-03-19 18:47:06 +00009293 .unlock = unlock_stm50flw0x0x,
9294 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00009295 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009296 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
stepanaa1b6a22008-12-08 18:15:10 +00009297 },
9298
hailfinger286829b2009-01-08 03:40:17 +00009299 {
hailfinger0ae231d2010-07-29 20:01:13 +00009300 .vendor = "SyncMOS/MoselVitelic",
9301 .name = "{F,S,V}29C51001B",
hailfingere1e41ea2011-07-27 07:13:06 +00009302 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +00009303 .manufacture_id = SYNCMOS_MVC_ID,
9304 .model_id = SM_MVC_29C51001B,
hailfinger286829b2009-01-08 03:40:17 +00009305 .total_size = 128,
hailfinger0ae231d2010-07-29 20:01:13 +00009306 .page_size = 512,
snelsonc6855342010-01-28 23:55:12 +00009307 .feature_bits = FEATURE_EITHER_RESET,
hailfinger286829b2009-01-08 03:40:17 +00009308 .tested = TEST_UNTESTED,
9309 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00009310 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelsone0c56352010-01-19 16:08:51 +00009311 .block_erasers =
9312 {
9313 {
9314 .eraseblocks = { {512, 256} },
9315 .block_erase = erase_sector_jedec,
9316 }, {
9317 .eraseblocks = { {128 * 1024, 1} },
9318 .block_erase = erase_chip_block_jedec,
9319 },
9320 },
snelsonc6855342010-01-28 23:55:12 +00009321 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00009322 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009323 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00009324 },
9325
hailfinger286829b2009-01-08 03:40:17 +00009326 {
hailfinger0ae231d2010-07-29 20:01:13 +00009327 .vendor = "SyncMOS/MoselVitelic",
9328 .name = "{F,S,V}29C51001T",
hailfingere1e41ea2011-07-27 07:13:06 +00009329 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +00009330 .manufacture_id = SYNCMOS_MVC_ID,
9331 .model_id = SM_MVC_29C51001T,
9332 .total_size = 128,
9333 .page_size = 512,
snelsonc6855342010-01-28 23:55:12 +00009334 .feature_bits = FEATURE_EITHER_RESET,
hailfinger0ae231d2010-07-29 20:01:13 +00009335 .tested = TEST_UNTESTED,
9336 .probe = probe_jedec,
9337 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
9338 .block_erasers =
9339 {
9340 {
9341 .eraseblocks = { {512, 256} },
9342 .block_erase = erase_sector_jedec,
9343 }, {
9344 .eraseblocks = { {128 * 1024, 1} },
9345 .block_erase = erase_chip_block_jedec,
9346 },
9347 },
9348 .write = write_jedec_1,
9349 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009350 .voltage = {4500, 5500},
hailfinger0ae231d2010-07-29 20:01:13 +00009351 },
9352
9353 {
9354 .vendor = "SyncMOS/MoselVitelic",
9355 .name = "{F,S,V}29C51002B",
hailfingere1e41ea2011-07-27 07:13:06 +00009356 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +00009357 .manufacture_id = SYNCMOS_MVC_ID,
9358 .model_id = SM_MVC_29C51002B,
9359 .total_size = 256,
9360 .page_size = 512,
9361 .feature_bits = FEATURE_EITHER_RESET,
9362 .tested = TEST_UNTESTED,
hailfinger286829b2009-01-08 03:40:17 +00009363 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00009364 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelsone0c56352010-01-19 16:08:51 +00009365 .block_erasers =
9366 {
9367 {
9368 .eraseblocks = { {512, 512} },
9369 .block_erase = erase_sector_jedec,
9370 }, {
9371 .eraseblocks = { {256 * 1024, 1} },
9372 .block_erase = erase_chip_block_jedec,
9373 },
9374 },
snelsonc6855342010-01-28 23:55:12 +00009375 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00009376 .read = read_memmapped,
stepanaa1b6a22008-12-08 18:15:10 +00009377 },
9378
hailfinger286829b2009-01-08 03:40:17 +00009379 {
hailfinger0ae231d2010-07-29 20:01:13 +00009380 .vendor = "SyncMOS/MoselVitelic",
9381 .name = "{F,S,V}29C51002T",
hailfingere1e41ea2011-07-27 07:13:06 +00009382 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +00009383 .manufacture_id = SYNCMOS_MVC_ID,
9384 .model_id = SM_MVC_29C51002T,
9385 .total_size = 256,
9386 .page_size = 512,
9387 .feature_bits = FEATURE_EITHER_RESET,
stefanct98d917c2011-10-21 12:33:07 +00009388 .tested = TEST_OK_PREW,
hailfinger0ae231d2010-07-29 20:01:13 +00009389 .probe = probe_jedec,
9390 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
9391 .block_erasers =
9392 {
9393 {
9394 .eraseblocks = { {512, 512} },
9395 .block_erase = erase_sector_jedec,
9396 }, {
9397 .eraseblocks = { {256 * 1024, 1} },
9398 .block_erase = erase_chip_block_jedec,
9399 },
9400 },
9401 .write = write_jedec_1,
9402 .read = read_memmapped,
9403 },
9404
9405 {
9406 .vendor = "SyncMOS/MoselVitelic",
9407 .name = "{F,S,V}29C51004B",
hailfingere1e41ea2011-07-27 07:13:06 +00009408 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +00009409 .manufacture_id = SYNCMOS_MVC_ID,
9410 .model_id = SM_MVC_29C51004B,
hailfinger286829b2009-01-08 03:40:17 +00009411 .total_size = 512,
hailfinger0ae231d2010-07-29 20:01:13 +00009412 .page_size = 1024,
snelsonc6855342010-01-28 23:55:12 +00009413 .feature_bits = FEATURE_EITHER_RESET,
hailfinger286829b2009-01-08 03:40:17 +00009414 .tested = TEST_UNTESTED,
9415 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00009416 .probe_timing = TIMING_ZERO,
snelsone0c56352010-01-19 16:08:51 +00009417 .block_erasers =
9418 {
9419 {
hailfinger0ae231d2010-07-29 20:01:13 +00009420 .eraseblocks = { {1024, 512} },
9421 .block_erase = erase_sector_jedec,
9422 }, {
9423 .eraseblocks = { {512 * 1024, 1} },
9424 .block_erase = erase_chip_block_jedec,
9425 },
9426 },
9427 .write = write_jedec_1,
9428 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009429 .voltage = {4500, 5500},
hailfinger0ae231d2010-07-29 20:01:13 +00009430 },
9431
9432 {
9433 .vendor = "SyncMOS/MoselVitelic",
9434 .name = "{F,S,V}29C51004T",
hailfingere1e41ea2011-07-27 07:13:06 +00009435 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +00009436 .manufacture_id = SYNCMOS_MVC_ID,
9437 .model_id = SM_MVC_29C51004T,
9438 .total_size = 512,
9439 .page_size = 1024,
9440 .feature_bits = FEATURE_EITHER_RESET,
9441 .tested = TEST_UNTESTED,
9442 .probe = probe_jedec,
9443 .probe_timing = TIMING_ZERO,
9444 .block_erasers =
9445 {
9446 {
9447 .eraseblocks = { {1024, 512} },
9448 .block_erase = erase_sector_jedec,
9449 }, {
9450 .eraseblocks = { {512 * 1024, 1} },
9451 .block_erase = erase_chip_block_jedec,
9452 },
9453 },
9454 .write = write_jedec_1,
9455 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009456 .voltage = {4500, 5500},
hailfinger0ae231d2010-07-29 20:01:13 +00009457 },
9458
9459 {
9460 .vendor = "SyncMOS/MoselVitelic",
9461 .name = "{S,V}29C31004B",
hailfingere1e41ea2011-07-27 07:13:06 +00009462 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +00009463 .manufacture_id = SYNCMOS_MVC_ID,
9464 .model_id = SM_MVC_29C31004B,
9465 .total_size = 512,
9466 .page_size = 1024,
9467 .feature_bits = FEATURE_EITHER_RESET,
9468 .tested = TEST_UNTESTED,
9469 .probe = probe_jedec,
9470 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
9471 .block_erasers =
9472 {
9473 {
9474 .eraseblocks = { {1024, 512} },
9475 .block_erase = erase_sector_jedec,
9476 }, {
9477 .eraseblocks = { {512 * 1024, 1} },
9478 .block_erase = erase_chip_block_jedec,
9479 },
9480 },
9481 .write = write_jedec_1,
9482 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009483 .voltage = {3000, 3600},
hailfinger0ae231d2010-07-29 20:01:13 +00009484 },
9485
9486 {
9487 .vendor = "SyncMOS/MoselVitelic",
9488 .name = "{S,V}29C31004T",
hailfingere1e41ea2011-07-27 07:13:06 +00009489 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +00009490 .manufacture_id = SYNCMOS_MVC_ID,
9491 .model_id = SM_MVC_29C31004T,
9492 .total_size = 512,
9493 .page_size = 1024,
9494 .feature_bits = FEATURE_EITHER_RESET,
9495 .tested = TEST_UNTESTED,
9496 .probe = probe_jedec,
9497 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
9498 .block_erasers =
9499 {
9500 {
9501 .eraseblocks = { {1024, 512} },
snelsone0c56352010-01-19 16:08:51 +00009502 .block_erase = erase_sector_jedec,
9503 }, {
9504 .eraseblocks = { {512 * 1024, 1} },
9505 .block_erase = erase_chip_block_jedec,
9506 },
9507 },
snelsonc6855342010-01-28 23:55:12 +00009508 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00009509 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009510 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00009511 },
9512
hailfinger286829b2009-01-08 03:40:17 +00009513 {
uwe77048c72009-05-27 23:17:40 +00009514 .vendor = "TI",
hailfingerf66fa232009-05-26 21:26:23 +00009515 .name = "TMS29F002RB",
hailfingere1e41ea2011-07-27 07:13:06 +00009516 .bustype = BUS_PARALLEL,
hailfingerf66fa232009-05-26 21:26:23 +00009517 .manufacture_id = TI_OLD_ID,
9518 .model_id = TI_TMS29F002RB,
9519 .total_size = 256,
9520 .page_size = 16384, /* Non-uniform sectors */
snelsonc6855342010-01-28 23:55:12 +00009521 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
hailfingerf66fa232009-05-26 21:26:23 +00009522 .tested = TEST_UNTESTED,
9523 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00009524 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelsone0c56352010-01-19 16:08:51 +00009525 .block_erasers =
9526 {
9527 {
9528 .eraseblocks = {
9529 {16 * 1024, 1},
9530 {8 * 1024, 2},
9531 {32 * 1024, 1},
9532 {64 * 1024, 3},
9533 },
9534 .block_erase = erase_sector_jedec,
9535 }, {
9536 .eraseblocks = { {256 * 1024, 1} },
9537 .block_erase = erase_chip_block_jedec,
9538 },
9539 },
snelsonc6855342010-01-28 23:55:12 +00009540 .write = write_jedec_1,
hailfingerf66fa232009-05-26 21:26:23 +00009541 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009542 .voltage = {4500, 5500},
hailfingerf66fa232009-05-26 21:26:23 +00009543 },
9544
9545 {
uwe77048c72009-05-27 23:17:40 +00009546 .vendor = "TI",
hailfingerf66fa232009-05-26 21:26:23 +00009547 .name = "TMS29F002RT",
hailfingere1e41ea2011-07-27 07:13:06 +00009548 .bustype = BUS_PARALLEL,
hailfingerf66fa232009-05-26 21:26:23 +00009549 .manufacture_id = TI_OLD_ID,
9550 .model_id = TI_TMS29F002RT,
9551 .total_size = 256,
9552 .page_size = 16384, /* Non-uniform sectors */
snelsonc6855342010-01-28 23:55:12 +00009553 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
hailfingerf66fa232009-05-26 21:26:23 +00009554 .tested = TEST_UNTESTED,
9555 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00009556 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelsone0c56352010-01-19 16:08:51 +00009557 .block_erasers =
9558 {
9559 {
9560 .eraseblocks = {
9561 {64 * 1024, 3},
9562 {32 * 1024, 1},
9563 {8 * 1024, 2},
9564 {16 * 1024, 1},
9565 },
9566 .block_erase = erase_sector_jedec,
9567 }, {
9568 .eraseblocks = { {256 * 1024, 1} },
9569 .block_erase = erase_chip_block_jedec,
9570 },
9571 },
snelsonc6855342010-01-28 23:55:12 +00009572 .write = write_jedec_1,
hailfingerf66fa232009-05-26 21:26:23 +00009573 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009574 .voltage = {4500, 5500},
hailfingerf66fa232009-05-26 21:26:23 +00009575 },
9576
9577 {
hailfinger286829b2009-01-08 03:40:17 +00009578 .vendor = "Winbond",
Boris Baykov5edaccd2016-06-11 18:29:01 +02009579 .name = "W25Q256.V",
9580 .bustype = BUS_SPI,
9581 .manufacture_id = WINBOND_NEX_ID,
9582 .model_id = WINBOND_NEX_W25Q256_V,
9583 .total_size = 32768,
9584 .page_size = 256,
9585 /* supports SFDP */
9586 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
9587 /* FOUR_BYTE_ADDR: supports 4-bytes addressing mode */
Duncan Laurie118ff9f2018-10-05 10:53:59 -07009588 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP | FEATURE_4BA_SUPPORT,
Boris Baykov5edaccd2016-06-11 18:29:01 +02009589 .four_bytes_addr_funcs =
9590 {
Ed Swierk28cf7992017-07-03 13:17:18 -07009591 .set_4ba = spi_enter_4ba_b7_we, /* enter 4-bytes addressing mode by CMD B7 + WREN */
Boris Baykov6323c242016-06-11 18:29:03 +02009592 .read_nbyte = spi_nbyte_read_4ba_direct, /* read directly from any mode, no need to enter 4ba */
Boris Baykov5edaccd2016-06-11 18:29:01 +02009593 .program_byte = spi_byte_program_4ba, /* write from 4-bytes addressing mode */
9594 .program_nbyte = spi_nbyte_program_4ba /* write from 4-bytes addressing mode */
9595 },
Duncan Laurie118ff9f2018-10-05 10:53:59 -07009596 .tested = TEST_OK_PREWU,
Boris Baykov5edaccd2016-06-11 18:29:01 +02009597 .probe = probe_spi_rdid,
9598 .probe_timing = TIMING_ZERO,
9599 .block_erasers =
9600 {
9601 {
9602 .eraseblocks = { {4 * 1024, 8192} },
9603 .block_erase = spi_block_erase_20_4ba, /* erases 4k from 4-bytes addressing mode */
9604 }, {
9605 .eraseblocks = { {32 * 1024, 1024} },
9606 .block_erase = spi_block_erase_52_4ba, /* erases 32k from 4-bytes addressing mode */
9607 }, {
9608 .eraseblocks = { {64 * 1024, 512} },
9609 .block_erase = spi_block_erase_d8_4ba, /* erases 64k from 4-bytes addressing mode */
9610 }, {
9611 .eraseblocks = { {32 * 1024 * 1024, 1} },
9612 .block_erase = spi_block_erase_60,
9613 }, {
9614 .eraseblocks = { {32 * 1024 * 1024, 1} },
9615 .block_erase = spi_block_erase_c7,
9616 }
9617 },
9618 .unlock = spi_disable_blockprotect,
9619 .write = spi_chip_write_256,
9620 .read = spi_chip_read,
9621 .voltage = {2700, 3600},
9622 },
9623
9624 {
9625 .vendor = "Winbond",
David Hendricks3c06e312016-05-05 20:27:18 -07009626 .name = "W25Q40EW",
9627 .bustype = BUS_SPI,
9628 .manufacture_id = WINBOND_NEX_ID,
9629 .model_id = WINBOND_NEX_W25Q40EW,
9630 .total_size = 512,
9631 .page_size = 256,
9632 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
9633 .tested = TEST_OK_PREWU,
9634 .probe = probe_spi_rdid,
9635 .probe_timing = TIMING_ZERO,
9636 .block_erasers =
9637 {
9638 {
9639 .eraseblocks = { {4 * 1024, 128} },
9640 .block_erase = spi_block_erase_20,
9641 }, {
9642 .eraseblocks = { {32 * 1024, 16} },
9643 .block_erase = spi_block_erase_52,
9644 }, {
9645 .eraseblocks = { {64 * 1024, 8} },
9646 .block_erase = spi_block_erase_d8,
9647 }, {
9648 .eraseblocks = { {1024 * 512, 1} },
9649 .block_erase = spi_block_erase_60,
9650 }, {
9651 .eraseblocks = { {1024 * 512, 1} },
9652 .block_erase = spi_block_erase_c7,
9653 }
9654 },
9655 .unlock = spi_disable_blockprotect,
9656 .write = spi_chip_write_256,
9657 .read = spi_chip_read,
9658 .voltage = {1650, 1950},
9659 /* FIXME(dhendrix): Add write-protection support */
9660 },
9661
9662 {
9663 .vendor = "Winbond",
ruikfbf40532010-04-20 19:34:31 +00009664 .name = "W25Q80",
hailfingere1e41ea2011-07-27 07:13:06 +00009665 .bustype = BUS_SPI,
ruikfbf40532010-04-20 19:34:31 +00009666 .manufacture_id = WINBOND_NEX_ID,
Patrick Georgicc04a452017-02-06 12:14:43 +01009667 .model_id = WINBOND_NEX_W25Q80_V,
ruikfbf40532010-04-20 19:34:31 +00009668 .total_size = 1024,
9669 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07009670 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
9671 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
David Hendricks488cf072015-11-23 16:45:07 -08009672 .tested = TEST_OK_PREWU,
ruikfbf40532010-04-20 19:34:31 +00009673 .probe = probe_spi_rdid,
9674 .probe_timing = TIMING_ZERO,
9675 .block_erasers =
9676 {
9677 {
9678 .eraseblocks = { {4 * 1024, 256} },
9679 .block_erase = spi_block_erase_20,
9680 }, {
9681 .eraseblocks = { {32 * 1024, 32} },
9682 .block_erase = spi_block_erase_52,
9683 }, {
9684 .eraseblocks = { {64 * 1024, 16} },
9685 .block_erase = spi_block_erase_d8,
9686 }, {
9687 .eraseblocks = { {1024 * 1024, 1} },
9688 .block_erase = spi_block_erase_60,
9689 }, {
9690 .eraseblocks = { {1024 * 1024, 1} },
9691 .block_erase = spi_block_erase_c7,
9692 }
9693 },
hailfingerb9560ee2010-07-14 20:21:22 +00009694 .unlock = spi_disable_blockprotect,
ruikfbf40532010-04-20 19:34:31 +00009695 .write = spi_chip_write_256,
9696 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00009697 .voltage = {2700, 3600},
David Hendricks1c09f802012-10-03 11:03:48 -07009698 .wp = &wp_w25q,
ruikfbf40532010-04-20 19:34:31 +00009699 },
9700
9701 {
9702 .vendor = "Winbond",
9703 .name = "W25Q16",
hailfingere1e41ea2011-07-27 07:13:06 +00009704 .bustype = BUS_SPI,
ruikfbf40532010-04-20 19:34:31 +00009705 .manufacture_id = WINBOND_NEX_ID,
Patrick Georgicc04a452017-02-06 12:14:43 +01009706 .model_id = WINBOND_NEX_W25Q16_V,
ruikfbf40532010-04-20 19:34:31 +00009707 .total_size = 2048,
9708 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07009709 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
9710 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
David Hendricks488cf072015-11-23 16:45:07 -08009711 .tested = TEST_OK_PREWU,
ruikfbf40532010-04-20 19:34:31 +00009712 .probe = probe_spi_rdid,
9713 .probe_timing = TIMING_ZERO,
9714 .block_erasers =
9715 {
9716 {
9717 .eraseblocks = { {4 * 1024, 512} },
9718 .block_erase = spi_block_erase_20,
9719 }, {
9720 .eraseblocks = { {32 * 1024, 64} },
9721 .block_erase = spi_block_erase_52,
9722 }, {
9723 .eraseblocks = { {64 * 1024, 32} },
9724 .block_erase = spi_block_erase_d8,
9725 }, {
9726 .eraseblocks = { {2 * 1024 * 1024, 1} },
9727 .block_erase = spi_block_erase_60,
9728 }, {
9729 .eraseblocks = { {2 * 1024 * 1024, 1} },
9730 .block_erase = spi_block_erase_c7,
9731 }
9732 },
hailfingerb9560ee2010-07-14 20:21:22 +00009733 .unlock = spi_disable_blockprotect,
ruikfbf40532010-04-20 19:34:31 +00009734 .write = spi_chip_write_256,
9735 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00009736 .voltage = {2700, 3600},
David Hendricks1c09f802012-10-03 11:03:48 -07009737 .wp = &wp_w25q,
ruikfbf40532010-04-20 19:34:31 +00009738 },
9739
9740 {
9741 .vendor = "Winbond",
9742 .name = "W25Q32",
hailfingere1e41ea2011-07-27 07:13:06 +00009743 .bustype = BUS_SPI,
ruikfbf40532010-04-20 19:34:31 +00009744 .manufacture_id = WINBOND_NEX_ID,
Patrick Georgicc04a452017-02-06 12:14:43 +01009745 .model_id = WINBOND_NEX_W25Q32_V,
ruikfbf40532010-04-20 19:34:31 +00009746 .total_size = 4096,
9747 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07009748 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
9749 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
David Hendricks488cf072015-11-23 16:45:07 -08009750 .tested = TEST_OK_PREWU,
ruikfbf40532010-04-20 19:34:31 +00009751 .probe = probe_spi_rdid,
9752 .probe_timing = TIMING_ZERO,
9753 .block_erasers =
9754 {
9755 {
9756 .eraseblocks = { {4 * 1024, 1024} },
9757 .block_erase = spi_block_erase_20,
9758 }, {
9759 .eraseblocks = { {32 * 1024, 128} },
9760 .block_erase = spi_block_erase_52,
9761 }, {
9762 .eraseblocks = { {64 * 1024, 64} },
9763 .block_erase = spi_block_erase_d8,
9764 }, {
9765 .eraseblocks = { {4 * 1024 * 1024, 1} },
9766 .block_erase = spi_block_erase_60,
9767 }, {
9768 .eraseblocks = { {4 * 1024 * 1024, 1} },
9769 .block_erase = spi_block_erase_c7,
9770 }
9771 },
hailfingerb9560ee2010-07-14 20:21:22 +00009772 .unlock = spi_disable_blockprotect,
ruikfbf40532010-04-20 19:34:31 +00009773 .write = spi_chip_write_256,
9774 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00009775 .voltage = {2700, 3600},
David Hendricks1c09f802012-10-03 11:03:48 -07009776 .wp = &wp_w25q,
ruikfbf40532010-04-20 19:34:31 +00009777 },
9778
9779 {
9780 .vendor = "Winbond",
Louis Yung-Chieh Lo469707f2012-05-18 16:38:37 +08009781 .name = "W25Q32DW",
9782 .bustype = BUS_SPI,
9783 .manufacture_id = WINBOND_NEX_ID,
Patrick Georgicc04a452017-02-06 12:14:43 +01009784 .model_id = WINBOND_NEX_W25Q32_W,
Louis Yung-Chieh Lo469707f2012-05-18 16:38:37 +08009785 .total_size = 4096,
9786 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08009787 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
9788 .tested = TEST_OK_PREWU,
Louis Yung-Chieh Lo469707f2012-05-18 16:38:37 +08009789 .probe = probe_spi_rdid,
9790 .probe_timing = TIMING_ZERO,
9791 .block_erasers =
9792 {
9793 {
9794 .eraseblocks = { {4 * 1024, 1024} },
9795 .block_erase = spi_block_erase_20,
9796 }, {
9797 .eraseblocks = { {32 * 1024, 128} },
9798 .block_erase = spi_block_erase_52,
9799 }, {
9800 .eraseblocks = { {64 * 1024, 64} },
9801 .block_erase = spi_block_erase_d8,
9802 }, {
9803 .eraseblocks = { {4 * 1024 * 1024, 1} },
9804 .block_erase = spi_block_erase_60,
9805 }, {
9806 .eraseblocks = { {4 * 1024 * 1024, 1} },
9807 .block_erase = spi_block_erase_c7,
9808 }
9809 },
9810 .unlock = spi_disable_blockprotect,
9811 .write = spi_chip_write_256,
9812 .read = spi_chip_read,
9813 .voltage = {1700, 1950},
David Hendricks1c09f802012-10-03 11:03:48 -07009814 .wp = &wp_w25q,
Louis Yung-Chieh Lo469707f2012-05-18 16:38:37 +08009815 },
9816
9817 {
9818 .vendor = "Winbond",
hailfingerceb59bb2010-06-24 11:39:57 +00009819 .name = "W25Q64",
hailfingere1e41ea2011-07-27 07:13:06 +00009820 .bustype = BUS_SPI,
hailfingerceb59bb2010-06-24 11:39:57 +00009821 .manufacture_id = WINBOND_NEX_ID,
Patrick Georgicc04a452017-02-06 12:14:43 +01009822 .model_id = WINBOND_NEX_W25Q64_V,
hailfingerceb59bb2010-06-24 11:39:57 +00009823 .total_size = 8192,
9824 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07009825 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
9826 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
David Hendricks488cf072015-11-23 16:45:07 -08009827 .tested = TEST_OK_PREWU,
hailfingerceb59bb2010-06-24 11:39:57 +00009828 .probe = probe_spi_rdid,
9829 .probe_timing = TIMING_ZERO,
9830 .block_erasers =
9831 {
9832 {
9833 .eraseblocks = { {4 * 1024, 2048} },
9834 .block_erase = spi_block_erase_20,
9835 }, {
9836 .eraseblocks = { {32 * 1024, 256} },
9837 .block_erase = spi_block_erase_52,
9838 }, {
9839 .eraseblocks = { {64 * 1024, 128} },
9840 .block_erase = spi_block_erase_d8,
9841 }, {
9842 .eraseblocks = { {8 * 1024 * 1024, 1} },
9843 .block_erase = spi_block_erase_60,
9844 }, {
9845 .eraseblocks = { {8 * 1024 * 1024, 1} },
9846 .block_erase = spi_block_erase_c7,
9847 }
9848 },
hailfingerb9560ee2010-07-14 20:21:22 +00009849 .unlock = spi_disable_blockprotect,
hailfingerceb59bb2010-06-24 11:39:57 +00009850 .write = spi_chip_write_256,
9851 .read = spi_chip_read,
David Hendricks8322c982015-11-20 13:42:53 -08009852 .voltage = {2700, 3600},
David Hendricks1c09f802012-10-03 11:03:48 -07009853 .wp = &wp_w25q,
hailfingerceb59bb2010-06-24 11:39:57 +00009854 },
9855
9856 {
9857 .vendor = "Winbond",
Nick Sanders08d08222013-06-10 22:15:30 -07009858 .name = "W25Q64DW",
9859 .bustype = BUS_SPI,
9860 .manufacture_id = WINBOND_NEX_ID,
Patrick Georgicc04a452017-02-06 12:14:43 +01009861 .model_id = WINBOND_NEX_W25Q64_W,
Nick Sanders08d08222013-06-10 22:15:30 -07009862 .total_size = 8192,
9863 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08009864 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
9865 .tested = TEST_OK_PREWU,
Nick Sanders08d08222013-06-10 22:15:30 -07009866 .probe = probe_spi_rdid,
9867 .probe_timing = TIMING_ZERO,
9868 .block_erasers =
9869 {
9870 {
9871 .eraseblocks = { {4 * 1024, 2048} },
9872 .block_erase = spi_block_erase_20,
9873 }, {
9874 .eraseblocks = { {32 * 1024, 256} },
9875 .block_erase = spi_block_erase_52,
9876 }, {
9877 .eraseblocks = { {64 * 1024, 128} },
9878 .block_erase = spi_block_erase_d8,
9879 }, {
9880 .eraseblocks = { {8 * 1024 * 1024, 1} },
9881 .block_erase = spi_block_erase_60,
9882 }, {
9883 .eraseblocks = { {8 * 1024 * 1024, 1} },
9884 .block_erase = spi_block_erase_c7,
9885 }
9886 },
9887 .unlock = spi_disable_blockprotect,
9888 .write = spi_chip_write_256,
9889 .read = spi_chip_read,
David Hendricks8322c982015-11-20 13:42:53 -08009890 .voltage = {1700, 1950},
Nick Sanders08d08222013-06-10 22:15:30 -07009891 .wp = &wp_w25q,
9892 },
9893
9894 {
9895 .vendor = "Winbond",
David Hendricks07153282016-12-22 16:07:00 -08009896 .name = "W25Q128.V",
hailfingere1e41ea2011-07-27 07:13:06 +00009897 .bustype = BUS_SPI,
stefancte0e52902011-05-26 14:28:51 +00009898 .manufacture_id = WINBOND_NEX_ID,
Patrick Georgicc04a452017-02-06 12:14:43 +01009899 .model_id = WINBOND_NEX_W25Q128_V,
David Hendricks9356d162015-03-06 14:07:25 -08009900 .total_size = 16384,
stefancte0e52902011-05-26 14:28:51 +00009901 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07009902 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
9903 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
Duncan Laurie96c67aa2015-10-26 13:21:46 -07009904 .tested = TEST_OK_PREWU,
stefancte0e52902011-05-26 14:28:51 +00009905 .probe = probe_spi_rdid,
9906 .probe_timing = TIMING_ZERO,
9907 .block_erasers =
9908 {
9909 {
David Hendricks9356d162015-03-06 14:07:25 -08009910 .eraseblocks = { {4 * 1024, 4096} },
stefancte0e52902011-05-26 14:28:51 +00009911 .block_erase = spi_block_erase_20,
9912 }, {
David Hendricks9356d162015-03-06 14:07:25 -08009913 .eraseblocks = { {32 * 1024, 512} },
stefancte0e52902011-05-26 14:28:51 +00009914 .block_erase = spi_block_erase_52,
9915 }, {
David Hendricks9356d162015-03-06 14:07:25 -08009916 .eraseblocks = { {64 * 1024, 256} },
stefancte0e52902011-05-26 14:28:51 +00009917 .block_erase = spi_block_erase_d8,
9918 }, {
David Hendricks9356d162015-03-06 14:07:25 -08009919 .eraseblocks = { {16 * 1024 * 1024, 1} },
stefancte0e52902011-05-26 14:28:51 +00009920 .block_erase = spi_block_erase_60,
9921 }, {
David Hendricks9356d162015-03-06 14:07:25 -08009922 .eraseblocks = { {16 * 1024 * 1024, 1} },
stefancte0e52902011-05-26 14:28:51 +00009923 .block_erase = spi_block_erase_c7,
9924 }
9925 },
9926 .unlock = spi_disable_blockprotect,
9927 .write = spi_chip_write_256,
9928 .read = spi_chip_read,
Duncan Laurieed32d7b2015-05-27 11:28:18 -07009929 .wp = &wp_w25q,
stefancte0e52902011-05-26 14:28:51 +00009930 },
9931
9932 {
9933 .vendor = "Winbond",
Stephen Barber6e15a532015-05-22 16:23:39 -07009934 .name = "W25Q128FW",
9935 .bustype = BUS_SPI,
9936 .manufacture_id = WINBOND_NEX_ID,
Patrick Georgicc04a452017-02-06 12:14:43 +01009937 .model_id = WINBOND_NEX_W25Q128_W,
Stephen Barber6e15a532015-05-22 16:23:39 -07009938 .total_size = 16384,
9939 .page_size = 256,
David Hendricks07153282016-12-22 16:07:00 -08009940 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
David Hendricksb8696182016-05-20 16:38:35 -07009941 .tested = TEST_OK_PREWU,
Stephen Barber6e15a532015-05-22 16:23:39 -07009942 .probe = probe_spi_rdid,
9943 .probe_timing = TIMING_ZERO,
9944 .block_erasers =
9945 {
9946 {
9947 .eraseblocks = { {4 * 1024, 4096} },
9948 .block_erase = spi_block_erase_20,
9949 }, {
9950 .eraseblocks = { {32 * 1024, 512} },
9951 .block_erase = spi_block_erase_52,
9952 }, {
9953 .eraseblocks = { {64 * 1024, 256} },
9954 .block_erase = spi_block_erase_d8,
9955 }, {
9956 .eraseblocks = { {16 * 1024 * 1024, 1} },
9957 .block_erase = spi_block_erase_60,
9958 }, {
9959 .eraseblocks = { {16 * 1024 * 1024, 1} },
9960 .block_erase = spi_block_erase_c7,
9961 }
9962 },
9963 .unlock = spi_disable_blockprotect,
9964 .write = spi_chip_write_256,
9965 .read = spi_chip_read,
David Hendricks07153282016-12-22 16:07:00 -08009966 /*
9967 * W25Q128FW is a 1.8V chip, however 3.3V variants with the same
9968 * model ID exist. We'll err on the side of caution here. A user
9969 * with a 3.3V chip sharing the model ID will need to either
9970 * specify voltage on the command line or duplicate this struct
9971 * with a different name/voltage and specify it with "-c".
9972 */
9973 .voltage = {1650, 1950},
Duncan Laurieed32d7b2015-05-27 11:28:18 -07009974 .wp = &wp_w25q,
Stephen Barber6e15a532015-05-22 16:23:39 -07009975 },
9976
9977 {
9978 .vendor = "Winbond",
Martin Rothee8dcf92017-05-10 19:16:19 -06009979 .name = "W25Q128J",
9980 .bustype = BUS_SPI,
9981 .manufacture_id = WINBOND_NEX_ID,
9982 .model_id = WINBOND_NEX_W25Q128J,
9983 .total_size = 16384,
9984 .page_size = 256,
9985 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
9986 .tested = TEST_OK_PREWU,
9987 .probe = probe_spi_rdid,
9988 .probe_timing = TIMING_ZERO,
9989 .block_erasers =
9990 {
9991 {
9992 .eraseblocks = { {4 * 1024, 4096} },
9993 .block_erase = spi_block_erase_20,
9994 }, {
9995 .eraseblocks = { {32 * 1024, 512} },
9996 .block_erase = spi_block_erase_52,
9997 }, {
9998 .eraseblocks = { {64 * 1024, 256} },
9999 .block_erase = spi_block_erase_d8,
10000 }, {
10001 .eraseblocks = { {16 * 1024 * 1024, 1} },
10002 .block_erase = spi_block_erase_60,
10003 }, {
10004 .eraseblocks = { {16 * 1024 * 1024, 1} },
10005 .block_erase = spi_block_erase_c7,
10006 }
10007 },
10008 .unlock = spi_disable_blockprotect,
10009 .write = spi_chip_write_256,
10010 .read = spi_chip_read,
10011 .voltage = {2700, 3600},
10012 .wp = &wp_w25,
10013 },
10014 {
10015 .vendor = "Winbond",
Shelley Chenfc338ee2018-07-20 16:27:15 -070010016 .name = "W25Q256JV",
10017 .bustype = BUS_SPI,
10018 .manufacture_id = WINBOND_NEX_ID,
10019 .model_id = WINBOND_NEX_W25Q256JV,
10020 .total_size = 32768,
10021 .page_size = 256,
Duncan Laurie118ff9f2018-10-05 10:53:59 -070010022 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP | FEATURE_4BA_SUPPORT,
Shelley Chen91f320e2018-07-24 16:47:06 -070010023 .four_bytes_addr_funcs =
10024 {
10025 .set_4ba = spi_enter_4ba_b7_we, /* enter 4-bytes addressing mode by CMD B7 + WREN */
10026 .read_nbyte = spi_nbyte_read_4ba_direct, /* read directly from any mode, no need to enter 4ba */
10027 .program_byte = spi_byte_program_4ba, /* write from 4-bytes addressing mode */
10028 .program_nbyte = spi_nbyte_program_4ba /* write from 4-bytes addressing mode */
10029 },
Shelley Chenfc338ee2018-07-20 16:27:15 -070010030 .tested = TEST_OK_PREWU,
10031 .probe = probe_spi_rdid,
10032 .probe_timing = TIMING_ZERO,
10033 .block_erasers =
10034 {
10035 {
10036 .eraseblocks = { {4 * 1024, 8192} },
Shelley Chen91f320e2018-07-24 16:47:06 -070010037 .block_erase = spi_block_erase_20_4ba, /* erases 4k from 4-bytes addressing mode */
Shelley Chenfc338ee2018-07-20 16:27:15 -070010038 }, {
10039 .eraseblocks = { {32 * 1024, 1024} },
Shelley Chen91f320e2018-07-24 16:47:06 -070010040 .block_erase = spi_block_erase_52_4ba, /* erases 32k from 4-bytes addressing mode */
Shelley Chenfc338ee2018-07-20 16:27:15 -070010041 }, {
10042 .eraseblocks = { {64 * 1024, 512} },
Shelley Chen91f320e2018-07-24 16:47:06 -070010043 .block_erase = spi_block_erase_d8_4ba, /* erases 64k from 4-bytes addressing mode */
Shelley Chenfc338ee2018-07-20 16:27:15 -070010044 }, {
10045 .eraseblocks = { {32 * 1024 * 1024, 1} },
10046 .block_erase = spi_block_erase_60,
10047 }, {
10048 .eraseblocks = { {32 * 1024 * 1024, 1} },
10049 .block_erase = spi_block_erase_c7,
10050 }
10051 },
10052 .unlock = spi_disable_blockprotect,
10053 .write = spi_chip_write_256,
10054 .read = spi_chip_read,
10055 .voltage = {2700, 3600},
Duncan Laurie1801f7c2019-01-09 18:02:51 -080010056 .wp = &wp_w25q_large,
Shelley Chenfc338ee2018-07-20 16:27:15 -070010057 },
10058 {
10059 .vendor = "Winbond",
stefanct371e7e82011-07-07 19:56:58 +000010060 .name = "W25X10",
hailfingere1e41ea2011-07-27 07:13:06 +000010061 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +000010062 .manufacture_id = WINBOND_NEX_ID,
mhm38e577e2010-09-14 23:56:56 +000010063 .model_id = WINBOND_NEX_W25X10,
hailfinger286829b2009-01-08 03:40:17 +000010064 .total_size = 128,
10065 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -080010066 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
10067 .tested = TEST_OK_PREWU,
hailfinger286829b2009-01-08 03:40:17 +000010068 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000010069 .probe_timing = TIMING_ZERO,
snelson376060c2010-01-19 03:24:55 +000010070 .block_erasers =
10071 {
10072 {
10073 .eraseblocks = { {4 * 1024, 32} },
10074 .block_erase = spi_block_erase_20,
10075 }, {
snelson376060c2010-01-19 03:24:55 +000010076 .eraseblocks = { {64 * 1024, 2} },
10077 .block_erase = spi_block_erase_d8,
10078 }, {
10079 .eraseblocks = { {128 * 1024, 1} },
snelson376060c2010-01-19 03:24:55 +000010080 .block_erase = spi_block_erase_c7,
10081 }
10082 },
hailfingerb9560ee2010-07-14 20:21:22 +000010083 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +000010084 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +000010085 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +000010086 .voltage = {2700, 3600},
Louis Yung-Chieh Lo232951f2010-09-16 11:30:00 +080010087 .wp = &wp_w25,
stepanaa1b6a22008-12-08 18:15:10 +000010088 },
10089
hailfinger286829b2009-01-08 03:40:17 +000010090 {
10091 .vendor = "Winbond",
stefanct371e7e82011-07-07 19:56:58 +000010092 .name = "W25X20",
hailfingere1e41ea2011-07-27 07:13:06 +000010093 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +000010094 .manufacture_id = WINBOND_NEX_ID,
mhm38e577e2010-09-14 23:56:56 +000010095 .model_id = WINBOND_NEX_W25X20,
hailfinger286829b2009-01-08 03:40:17 +000010096 .total_size = 256,
10097 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -080010098 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +000010099 .tested = TEST_UNTESTED,
10100 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000010101 .probe_timing = TIMING_ZERO,
snelson376060c2010-01-19 03:24:55 +000010102 .block_erasers =
10103 {
10104 {
10105 .eraseblocks = { {4 * 1024, 64} },
10106 .block_erase = spi_block_erase_20,
10107 }, {
snelson376060c2010-01-19 03:24:55 +000010108 .eraseblocks = { {64 * 1024, 4} },
10109 .block_erase = spi_block_erase_d8,
10110 }, {
10111 .eraseblocks = { {256 * 1024, 1} },
snelson376060c2010-01-19 03:24:55 +000010112 .block_erase = spi_block_erase_c7,
10113 }
10114 },
hailfingerb9560ee2010-07-14 20:21:22 +000010115 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +000010116 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +000010117 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +000010118 .voltage = {2700, 3600},
Louis Yung-Chieh Lo232951f2010-09-16 11:30:00 +080010119 .wp = &wp_w25,
stepanaa1b6a22008-12-08 18:15:10 +000010120 },
10121
hailfinger286829b2009-01-08 03:40:17 +000010122 {
10123 .vendor = "Winbond",
stefanct371e7e82011-07-07 19:56:58 +000010124 .name = "W25X40",
hailfingere1e41ea2011-07-27 07:13:06 +000010125 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +000010126 .manufacture_id = WINBOND_NEX_ID,
mhm38e577e2010-09-14 23:56:56 +000010127 .model_id = WINBOND_NEX_W25X40,
hailfinger286829b2009-01-08 03:40:17 +000010128 .total_size = 512,
10129 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -080010130 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
10131 .tested = TEST_OK_PREWU,
hailfinger286829b2009-01-08 03:40:17 +000010132 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000010133 .probe_timing = TIMING_ZERO,
snelson376060c2010-01-19 03:24:55 +000010134 .block_erasers =
10135 {
10136 {
10137 .eraseblocks = { {4 * 1024, 128} },
10138 .block_erase = spi_block_erase_20,
10139 }, {
snelson376060c2010-01-19 03:24:55 +000010140 .eraseblocks = { {64 * 1024, 8} },
10141 .block_erase = spi_block_erase_d8,
10142 }, {
10143 .eraseblocks = { {512 * 1024, 1} },
snelson376060c2010-01-19 03:24:55 +000010144 .block_erase = spi_block_erase_c7,
10145 }
10146 },
hailfingerb9560ee2010-07-14 20:21:22 +000010147 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +000010148 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +000010149 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +000010150 .voltage = {2700, 3600},
Louis Yung-Chieh Lo232951f2010-09-16 11:30:00 +080010151 .wp = &wp_w25,
stepanaa1b6a22008-12-08 18:15:10 +000010152 },
10153
hailfinger286829b2009-01-08 03:40:17 +000010154 {
10155 .vendor = "Winbond",
stefanct371e7e82011-07-07 19:56:58 +000010156 .name = "W25X80",
hailfingere1e41ea2011-07-27 07:13:06 +000010157 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +000010158 .manufacture_id = WINBOND_NEX_ID,
mhm38e577e2010-09-14 23:56:56 +000010159 .model_id = WINBOND_NEX_W25X80,
hailfinger286829b2009-01-08 03:40:17 +000010160 .total_size = 1024,
10161 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -080010162 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
10163 .tested = TEST_OK_PREWU,
hailfinger286829b2009-01-08 03:40:17 +000010164 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000010165 .probe_timing = TIMING_ZERO,
snelson376060c2010-01-19 03:24:55 +000010166 .block_erasers =
10167 {
10168 {
10169 .eraseblocks = { {4 * 1024, 256} },
10170 .block_erase = spi_block_erase_20,
10171 }, {
snelson376060c2010-01-19 03:24:55 +000010172 .eraseblocks = { {64 * 1024, 16} },
10173 .block_erase = spi_block_erase_d8,
10174 }, {
10175 .eraseblocks = { {1024 * 1024, 1} },
snelson376060c2010-01-19 03:24:55 +000010176 .block_erase = spi_block_erase_c7,
10177 }
10178 },
hailfingerb9560ee2010-07-14 20:21:22 +000010179 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +000010180 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +000010181 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +000010182 .voltage = {2700, 3600},
Louis Yung-Chieh Lo232951f2010-09-16 11:30:00 +080010183 .wp = &wp_w25,
stepanaa1b6a22008-12-08 18:15:10 +000010184 },
10185
hailfinger286829b2009-01-08 03:40:17 +000010186 {
10187 .vendor = "Winbond",
stefanct371e7e82011-07-07 19:56:58 +000010188 .name = "W25X16",
hailfingere1e41ea2011-07-27 07:13:06 +000010189 .bustype = BUS_SPI,
hailfingerea04a9e2009-07-11 19:39:11 +000010190 .manufacture_id = WINBOND_NEX_ID,
mhm38e577e2010-09-14 23:56:56 +000010191 .model_id = WINBOND_NEX_W25X16,
hailfingerea04a9e2009-07-11 19:39:11 +000010192 .total_size = 2048,
10193 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -080010194 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
10195 .tested = TEST_OK_PREWU,
hailfingerea04a9e2009-07-11 19:39:11 +000010196 .probe = probe_spi_rdid,
10197 .probe_timing = TIMING_ZERO,
snelson376060c2010-01-19 03:24:55 +000010198 .block_erasers =
10199 {
10200 {
10201 .eraseblocks = { {4 * 1024, 512} },
10202 .block_erase = spi_block_erase_20,
10203 }, {
10204 .eraseblocks = { {32 * 1024, 64} },
10205 .block_erase = spi_block_erase_52,
10206 }, {
10207 .eraseblocks = { {64 * 1024, 32} },
10208 .block_erase = spi_block_erase_d8,
10209 }, {
10210 .eraseblocks = { {2 * 1024 * 1024, 1} },
10211 .block_erase = spi_block_erase_60,
10212 }, {
10213 .eraseblocks = { {2 * 1024 * 1024, 1} },
10214 .block_erase = spi_block_erase_c7,
10215 }
10216 },
hailfingerb9560ee2010-07-14 20:21:22 +000010217 .unlock = spi_disable_blockprotect,
hailfingerea04a9e2009-07-11 19:39:11 +000010218 .write = spi_chip_write_256,
10219 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +000010220 .voltage = {2700, 3600},
hailfingerea04a9e2009-07-11 19:39:11 +000010221 },
10222
10223 {
10224 .vendor = "Winbond",
stefanct371e7e82011-07-07 19:56:58 +000010225 .name = "W25X32",
hailfingere1e41ea2011-07-27 07:13:06 +000010226 .bustype = BUS_SPI,
hailfingerd5431fb2009-11-26 11:05:01 +000010227 .manufacture_id = WINBOND_NEX_ID,
mhm38e577e2010-09-14 23:56:56 +000010228 .model_id = WINBOND_NEX_W25X32,
hailfingerd5431fb2009-11-26 11:05:01 +000010229 .total_size = 4096,
10230 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -080010231 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
hailfingerd5431fb2009-11-26 11:05:01 +000010232 .tested = TEST_OK_PROBE,
10233 .probe = probe_spi_rdid,
10234 .probe_timing = TIMING_ZERO,
snelson376060c2010-01-19 03:24:55 +000010235 .block_erasers =
10236 {
10237 {
10238 .eraseblocks = { {4 * 1024, 1024} },
10239 .block_erase = spi_block_erase_20,
10240 }, {
10241 .eraseblocks = { {32 * 1024, 128} },
10242 .block_erase = spi_block_erase_52,
10243 }, {
10244 .eraseblocks = { {64 * 1024, 64} },
10245 .block_erase = spi_block_erase_d8,
10246 }, {
10247 .eraseblocks = { {4 * 1024 * 1024, 1} },
10248 .block_erase = spi_block_erase_60,
10249 }, {
10250 .eraseblocks = { {4 * 1024 * 1024, 1} },
10251 .block_erase = spi_block_erase_c7,
10252 }
10253 },
hailfingerb9560ee2010-07-14 20:21:22 +000010254 .unlock = spi_disable_blockprotect,
hailfingerd5431fb2009-11-26 11:05:01 +000010255 .write = spi_chip_write_256,
10256 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +000010257 .voltage = {2700, 3600},
hailfingerd5431fb2009-11-26 11:05:01 +000010258 },
10259
10260 {
10261 .vendor = "Winbond",
stefanct371e7e82011-07-07 19:56:58 +000010262 .name = "W25X64",
hailfingere1e41ea2011-07-27 07:13:06 +000010263 .bustype = BUS_SPI,
hailfingerd5431fb2009-11-26 11:05:01 +000010264 .manufacture_id = WINBOND_NEX_ID,
mhm38e577e2010-09-14 23:56:56 +000010265 .model_id = WINBOND_NEX_W25X64,
hailfingerd5431fb2009-11-26 11:05:01 +000010266 .total_size = 8192,
10267 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -080010268 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
stefancte0e52902011-05-26 14:28:51 +000010269 .tested = TEST_OK_PROBE,
hailfingerd5431fb2009-11-26 11:05:01 +000010270 .probe = probe_spi_rdid,
10271 .probe_timing = TIMING_ZERO,
snelson376060c2010-01-19 03:24:55 +000010272 .block_erasers =
10273 {
10274 {
10275 .eraseblocks = { {4 * 1024, 2048} },
10276 .block_erase = spi_block_erase_20,
10277 }, {
10278 .eraseblocks = { {32 * 1024, 256} },
10279 .block_erase = spi_block_erase_52,
10280 }, {
10281 .eraseblocks = { {64 * 1024, 128} },
10282 .block_erase = spi_block_erase_d8,
10283 }, {
10284 .eraseblocks = { {8 * 1024 * 1024, 1} },
10285 .block_erase = spi_block_erase_60,
10286 }, {
10287 .eraseblocks = { {8 * 1024 * 1024, 1} },
10288 .block_erase = spi_block_erase_c7,
10289 }
10290 },
hailfingerb9560ee2010-07-14 20:21:22 +000010291 .unlock = spi_disable_blockprotect,
hailfingerd5431fb2009-11-26 11:05:01 +000010292 .write = spi_chip_write_256,
10293 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +000010294 .voltage = {2700, 3600},
hailfingerd5431fb2009-11-26 11:05:01 +000010295 },
10296
10297 {
10298 .vendor = "Winbond",
hailfingere51a2012011-07-26 14:18:52 +000010299 .name = "W29C010(M)/W29C011A/W29EE011/W29EE012-old",
hailfingere1e41ea2011-07-27 07:13:06 +000010300 .bustype = BUS_PARALLEL,
hailfingere51a2012011-07-26 14:18:52 +000010301 .manufacture_id = WINBOND_ID,
10302 .model_id = WINBOND_W29C010,
10303 .total_size = 128,
10304 .page_size = 128,
10305 .feature_bits = FEATURE_LONG_RESET,
10306 .tested = TEST_OK_PRE,
10307 .probe = probe_w29ee011,
10308 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (w29ee011.c) */
10309 .block_erasers =
10310 {
10311 {
10312 .eraseblocks = { {128 * 1024, 1} },
10313 .block_erase = erase_chip_block_jedec,
10314 }
10315 },
10316 .write = write_jedec,
10317 .read = read_memmapped,
10318 },
10319
10320 {/* W29EE011, W29EE012, W29C010M, W29C011A do not support probe_jedec according to the datasheet, but it works for newer(?) steppings. */
10321 .vendor = "Winbond",
mhm38e577e2010-09-14 23:56:56 +000010322 .name = "W29C010(M)/W29C011A/W29EE011/W29EE012",
hailfingere1e41ea2011-07-27 07:13:06 +000010323 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000010324 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000010325 .model_id = WINBOND_W29C010,
hailfinger286829b2009-01-08 03:40:17 +000010326 .total_size = 128,
10327 .page_size = 128,
snelsonc6855342010-01-28 23:55:12 +000010328 .feature_bits = FEATURE_LONG_RESET,
stefanctf4eea092011-05-18 01:31:03 +000010329 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000010330 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +000010331 .probe_timing = 10, /* used datasheet for the W29C011A */
snelson376060c2010-01-19 03:24:55 +000010332 .block_erasers =
10333 {
10334 {
10335 .eraseblocks = { {128 * 1024, 1} },
10336 .block_erase = erase_chip_block_jedec,
10337 }
10338 },
hailfinger286829b2009-01-08 03:40:17 +000010339 .write = write_jedec,
hailfinger23060112009-05-08 12:49:03 +000010340 .read = read_memmapped,
stepanaa1b6a22008-12-08 18:15:10 +000010341 },
10342
hailfinger286829b2009-01-08 03:40:17 +000010343 {
10344 .vendor = "Winbond",
mhm38e577e2010-09-14 23:56:56 +000010345 .name = "W29C020(C)/W29C022",
hailfingere1e41ea2011-07-27 07:13:06 +000010346 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000010347 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000010348 .model_id = WINBOND_W29C020,
hailfinger286829b2009-01-08 03:40:17 +000010349 .total_size = 256,
10350 .page_size = 128,
snelsonc6855342010-01-28 23:55:12 +000010351 .feature_bits = FEATURE_LONG_RESET,
David Hendricksc801adb2010-12-09 16:58:56 -080010352 .tested = TEST_OK_PRE,
hailfinger286829b2009-01-08 03:40:17 +000010353 .probe = probe_jedec,
stefanct371e7e82011-07-07 19:56:58 +000010354 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000010355 .block_erasers =
10356 {
10357 {
10358 .eraseblocks = { {256 * 1024, 1} },
10359 .block_erase = erase_chip_block_jedec,
10360 }
10361 },
hailfinger286829b2009-01-08 03:40:17 +000010362 .write = write_jedec,
hailfinger23060112009-05-08 12:49:03 +000010363 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000010364 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +000010365 },
10366
hailfinger286829b2009-01-08 03:40:17 +000010367 {
10368 .vendor = "Winbond",
mhm38e577e2010-09-14 23:56:56 +000010369 .name = "W29C040/P",
hailfingere1e41ea2011-07-27 07:13:06 +000010370 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000010371 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000010372 .model_id = WINBOND_W29C040,
hailfinger286829b2009-01-08 03:40:17 +000010373 .total_size = 512,
10374 .page_size = 256,
snelsonc6855342010-01-28 23:55:12 +000010375 .feature_bits = FEATURE_LONG_RESET,
10376 .tested = TEST_UNTESTED,
hailfinger286829b2009-01-08 03:40:17 +000010377 .probe = probe_jedec,
Simon Glass8dc82732013-07-16 10:13:51 -060010378 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000010379 .block_erasers =
10380 {
10381 {
10382 .eraseblocks = { {512 * 1024, 1} },
10383 .block_erase = erase_chip_block_jedec,
10384 }
10385 },
hailfinger286829b2009-01-08 03:40:17 +000010386 .write = write_jedec,
hailfinger23060112009-05-08 12:49:03 +000010387 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000010388 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +000010389 },
10390
hailfinger286829b2009-01-08 03:40:17 +000010391 {
10392 .vendor = "Winbond",
mkarcherb8f55a62011-03-06 17:58:05 +000010393 .name = "W39L040",
hailfingere1e41ea2011-07-27 07:13:06 +000010394 .bustype = BUS_PARALLEL,
mkarcherb8f55a62011-03-06 17:58:05 +000010395 .manufacture_id = WINBOND_ID,
10396 .model_id = WINBOND_W39L040,
10397 .total_size = 512,
10398 .page_size = 64 * 1024,
10399 .feature_bits = FEATURE_EITHER_RESET,
10400 .tested = TEST_OK_PR,
10401 .probe = probe_jedec,
10402 .probe_timing = 10,
10403 .block_erasers =
10404 {
10405 {
10406 .eraseblocks = { {4 * 1024, 128} },
10407 .block_erase = erase_block_jedec,
10408 }, {
10409 .eraseblocks = { {64 * 1024, 8} },
10410 .block_erase = erase_sector_jedec,
10411 }, {
10412 .eraseblocks = { {512 * 1024, 1} },
10413 .block_erase = erase_chip_block_jedec,
10414 }
10415 },
10416 .printlock = printlock_w39l040,
10417 .write = write_jedec_1,
10418 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +000010419 .voltage = {3000, 3600},
mkarcherb8f55a62011-03-06 17:58:05 +000010420 },
10421
10422 {
10423 .vendor = "Winbond",
hailfinger286829b2009-01-08 03:40:17 +000010424 .name = "W39V040A",
hailfingere1e41ea2011-07-27 07:13:06 +000010425 .bustype = BUS_LPC,
hailfinger286829b2009-01-08 03:40:17 +000010426 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000010427 .model_id = WINBOND_W39V040A,
hailfinger286829b2009-01-08 03:40:17 +000010428 .total_size = 512,
hailfingerc43afc92009-12-22 22:15:33 +000010429 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +000010430 .feature_bits = FEATURE_EITHER_RESET,
stefanctdfd58832011-07-25 20:38:52 +000010431 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000010432 .probe = probe_jedec,
stefanctdfd58832011-07-25 20:38:52 +000010433 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000010434 .block_erasers =
10435 {
10436 {
10437 .eraseblocks = { {64 * 1024, 8} },
10438 .block_erase = erase_sector_jedec,
10439 }, {
10440 .eraseblocks = { {512 * 1024, 1} },
10441 .block_erase = erase_chip_block_jedec,
10442 }
10443 },
hailfingerf8993012010-12-05 16:33:59 +000010444 .printlock = printlock_w39v040a,
snelsonc6855342010-01-28 23:55:12 +000010445 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000010446 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000010447 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000010448 },
10449
hailfinger286829b2009-01-08 03:40:17 +000010450 {
10451 .vendor = "Winbond",
hailfingerf8993012010-12-05 16:33:59 +000010452 .name = "W39V040B",
hailfingere1e41ea2011-07-27 07:13:06 +000010453 .bustype = BUS_LPC,
hailfinger286829b2009-01-08 03:40:17 +000010454 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000010455 .model_id = WINBOND_W39V040B,
hailfinger286829b2009-01-08 03:40:17 +000010456 .total_size = 512,
hailfingerc43afc92009-12-22 22:15:33 +000010457 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +000010458 .feature_bits = FEATURE_EITHER_RESET,
stefanct98d917c2011-10-21 12:33:07 +000010459 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000010460 .probe = probe_jedec,
stefanct98d917c2011-10-21 12:33:07 +000010461 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000010462 .block_erasers =
10463 {
10464 {
10465 .eraseblocks = { {64 * 1024, 8} },
10466 .block_erase = erase_sector_jedec,
10467 }, {
10468 .eraseblocks = { {512 * 1024, 1} },
10469 .block_erase = erase_chip_block_jedec,
10470 }
10471 },
hailfingerf8993012010-12-05 16:33:59 +000010472 .printlock = printlock_w39v040b,
snelsonc6855342010-01-28 23:55:12 +000010473 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000010474 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000010475 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000010476 },
10477
hailfinger286829b2009-01-08 03:40:17 +000010478 {
10479 .vendor = "Winbond",
hailfingerf8993012010-12-05 16:33:59 +000010480 .name = "W39V040C",
hailfingere1e41ea2011-07-27 07:13:06 +000010481 .bustype = BUS_LPC,
hailfinger286829b2009-01-08 03:40:17 +000010482 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000010483 .model_id = WINBOND_W39V040C,
hailfinger286829b2009-01-08 03:40:17 +000010484 .total_size = 512,
hailfingerc43afc92009-12-22 22:15:33 +000010485 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +000010486 .feature_bits = FEATURE_EITHER_RESET,
stefanct98d917c2011-10-21 12:33:07 +000010487 .tested = TEST_OK_PREW,
snelsonc6855342010-01-28 23:55:12 +000010488 .probe = probe_jedec,
hailfingerf8993012010-12-05 16:33:59 +000010489 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000010490 .block_erasers =
10491 {
10492 {
10493 .eraseblocks = { {64 * 1024, 8} },
10494 .block_erase = erase_sector_jedec,
10495 }, {
10496 .eraseblocks = { {512 * 1024, 1} },
10497 .block_erase = erase_chip_block_jedec,
10498 }
10499 },
snelson1ee293c2010-02-19 00:52:10 +000010500 .printlock = printlock_w39v040c,
snelsonc6855342010-01-28 23:55:12 +000010501 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000010502 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000010503 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000010504 },
10505
hailfinger286829b2009-01-08 03:40:17 +000010506 {
10507 .vendor = "Winbond",
10508 .name = "W39V040FA",
hailfingere1e41ea2011-07-27 07:13:06 +000010509 .bustype = BUS_FWH,
hailfinger286829b2009-01-08 03:40:17 +000010510 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000010511 .model_id = WINBOND_W39V040FA,
hailfinger286829b2009-01-08 03:40:17 +000010512 .total_size = 512,
hailfingerc43afc92009-12-22 22:15:33 +000010513 .page_size = 64 * 1024,
mkarcher74173032010-05-30 16:55:18 +000010514 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
David Hendricksc801adb2010-12-09 16:58:56 -080010515 .tested = TEST_OK_PRE,
hailfinger286829b2009-01-08 03:40:17 +000010516 .probe = probe_jedec,
stefancte0e52902011-05-26 14:28:51 +000010517 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000010518 .block_erasers =
10519 {
10520 {
10521 .eraseblocks = { {4 * 1024, 128} },
10522 .block_erase = erase_block_jedec,
10523 }, {
10524 .eraseblocks = { {64 * 1024, 8} },
10525 .block_erase = erase_sector_jedec,
10526 }, {
10527 .eraseblocks = { {512 * 1024, 1} },
10528 .block_erase = erase_chip_block_jedec,
10529 }
10530 },
hailfingerf8993012010-12-05 16:33:59 +000010531 .printlock = printlock_w39v040fa,
mkarcher74173032010-05-30 16:55:18 +000010532 .unlock = unlock_sst_fwhub,
snelsonc6855342010-01-28 23:55:12 +000010533 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000010534 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000010535 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000010536 },
10537
hailfinger286829b2009-01-08 03:40:17 +000010538 {
10539 .vendor = "Winbond",
hailfingerf8993012010-12-05 16:33:59 +000010540 .name = "W39V040FB",
hailfingere1e41ea2011-07-27 07:13:06 +000010541 .bustype = BUS_FWH,
hailfingerf8993012010-12-05 16:33:59 +000010542 .manufacture_id = WINBOND_ID,
10543 .model_id = WINBOND_W39V040B,
10544 .total_size = 512,
10545 .page_size = 64 * 1024,
10546 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
hailfingere29b25b2011-03-06 22:26:23 +000010547 .tested = TEST_OK_PREW,
hailfingerf8993012010-12-05 16:33:59 +000010548 .probe = probe_jedec,
Simon Glass8dc82732013-07-16 10:13:51 -060010549 .probe_timing = 10,
hailfingerf8993012010-12-05 16:33:59 +000010550 .block_erasers =
10551 {
10552 {
10553 .eraseblocks = { {64 * 1024, 8} },
10554 .block_erase = erase_sector_jedec,
10555 }, {
10556 .eraseblocks = { {512 * 1024, 1} },
10557 .block_erase = erase_chip_block_jedec,
10558 }
10559 },
10560 .printlock = printlock_w39v040fb,
mkarcher64dbd922010-12-26 23:55:12 +000010561 .unlock = unlock_w39v040fb,
hailfingerf8993012010-12-05 16:33:59 +000010562 .write = write_jedec_1,
10563 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +000010564 .voltage = {3000, 3600}, /* Also has 12V fast program */
hailfingerf8993012010-12-05 16:33:59 +000010565 },
10566
10567 {
10568 .vendor = "Winbond",
10569 .name = "W39V040FC",
hailfingere1e41ea2011-07-27 07:13:06 +000010570 .bustype = BUS_FWH,
hailfingerf8993012010-12-05 16:33:59 +000010571 .manufacture_id = WINBOND_ID,
10572 .model_id = WINBOND_W39V040C,
10573 .total_size = 512,
10574 .page_size = 64 * 1024,
10575 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Souvik Ghoshd64964a2016-06-13 17:51:25 -070010576 .tested = TEST_OK_PREW,
hailfingerf8993012010-12-05 16:33:59 +000010577 .probe = probe_jedec,
10578 .probe_timing = 10,
10579 .block_erasers =
10580 {
10581 {
10582 .eraseblocks = { {64 * 1024, 8} },
10583 .block_erase = erase_sector_jedec,
10584 }, {
10585 .eraseblocks = { {512 * 1024, 1} },
10586 .block_erase = erase_chip_block_jedec,
10587 }
10588 },
10589 .printlock = printlock_w39v040fc,
10590 .write = write_jedec_1,
10591 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +000010592 .voltage = {3000, 3600}, /* Also has 12V fast program */
hailfingerf8993012010-12-05 16:33:59 +000010593 },
10594
10595 {
10596 .vendor = "Winbond",
David Hendricks668f29d2011-01-27 18:51:45 -080010597 .name = "W39V040FB",
hailfingere1e41ea2011-07-27 07:13:06 +000010598 .bustype = BUS_FWH,
David Hendricks668f29d2011-01-27 18:51:45 -080010599 .manufacture_id = WINBOND_ID,
10600 .model_id = WINBOND_W39V040B,
10601 .total_size = 512,
10602 .page_size = 64 * 1024,
10603 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
10604 .tested = TEST_OK_PRE,
10605 .probe = probe_jedec,
Simon Glass8dc82732013-07-16 10:13:51 -060010606 .probe_timing = 10,
David Hendricks668f29d2011-01-27 18:51:45 -080010607 .block_erasers =
10608 {
10609 {
10610 .eraseblocks = { {64 * 1024, 8} },
10611 .block_erase = erase_sector_jedec,
10612 }, {
10613 .eraseblocks = { {512 * 1024, 1} },
10614 .block_erase = erase_chip_block_jedec,
10615 }
10616 },
10617 .printlock = printlock_w39v040fb,
10618 .unlock = unlock_w39v040fb,
10619 .write = write_jedec_1,
10620 .read = read_memmapped,
10621 },
10622
10623 {
10624 .vendor = "Winbond",
10625 .name = "W39V040FC",
hailfingere1e41ea2011-07-27 07:13:06 +000010626 .bustype = BUS_FWH,
David Hendricks668f29d2011-01-27 18:51:45 -080010627 .manufacture_id = WINBOND_ID,
10628 .model_id = WINBOND_W39V040C,
10629 .total_size = 512,
10630 .page_size = 64 * 1024,
10631 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
10632 .tested = TEST_UNTESTED,
10633 .probe = probe_jedec,
10634 .probe_timing = 10,
10635 .block_erasers =
10636 {
10637 {
10638 .eraseblocks = { {64 * 1024, 8} },
10639 .block_erase = erase_sector_jedec,
10640 }, {
10641 .eraseblocks = { {512 * 1024, 1} },
10642 .block_erase = erase_chip_block_jedec,
10643 }
10644 },
10645 .printlock = printlock_w39v040fc,
10646 .write = write_jedec_1,
10647 .read = read_memmapped,
10648 },
10649
10650 {
10651 .vendor = "Winbond",
hailfinger286829b2009-01-08 03:40:17 +000010652 .name = "W39V080A",
hailfingere1e41ea2011-07-27 07:13:06 +000010653 .bustype = BUS_LPC,
hailfinger286829b2009-01-08 03:40:17 +000010654 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000010655 .model_id = WINBOND_W39V080A,
hailfinger286829b2009-01-08 03:40:17 +000010656 .total_size = 1024,
hailfingerc43afc92009-12-22 22:15:33 +000010657 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +000010658 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner718d1eb2016-08-18 18:00:53 -070010659 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000010660 .probe = probe_jedec,
Simon Glass8dc82732013-07-16 10:13:51 -060010661 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000010662 .block_erasers =
10663 {
10664 {
10665 .eraseblocks = { {64 * 1024, 16} },
10666 .block_erase = erase_sector_jedec,
10667 }, {
10668 .eraseblocks = { {1024 * 1024, 1} },
10669 .block_erase = erase_chip_block_jedec,
10670 }
10671 },
hailfingerf8993012010-12-05 16:33:59 +000010672 .printlock = printlock_w39v080a,
snelsonc6855342010-01-28 23:55:12 +000010673 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000010674 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000010675 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000010676 },
10677
hailfinger286829b2009-01-08 03:40:17 +000010678 {
10679 .vendor = "Winbond",
mhm38e577e2010-09-14 23:56:56 +000010680 .name = "W49F002U/N",
hailfingere1e41ea2011-07-27 07:13:06 +000010681 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000010682 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000010683 .model_id = WINBOND_W49F002U,
hailfinger286829b2009-01-08 03:40:17 +000010684 .total_size = 256,
10685 .page_size = 128,
snelsonc6855342010-01-28 23:55:12 +000010686 .feature_bits = FEATURE_EITHER_RESET,
stefanctdfd58832011-07-25 20:38:52 +000010687 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000010688 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +000010689 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000010690 .block_erasers =
10691 {
10692 {
10693 .eraseblocks = {
10694 {128 * 1024, 1},
10695 {96 * 1024, 1},
10696 {8 * 1024, 2},
10697 {16 * 1024, 1},
10698 },
10699 .block_erase = erase_sector_jedec,
10700 }, {
10701 .eraseblocks = { {256 * 1024, 1} },
10702 .block_erase = erase_chip_block_jedec,
10703 }
10704 },
snelsonc6855342010-01-28 23:55:12 +000010705 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000010706 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000010707 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +000010708 },
10709
hailfinger286829b2009-01-08 03:40:17 +000010710 {
10711 .vendor = "Winbond",
hailfinger808e6aa2010-07-17 13:45:42 +000010712 .name = "W49F020",
hailfingere1e41ea2011-07-27 07:13:06 +000010713 .bustype = BUS_PARALLEL,
hailfinger808e6aa2010-07-17 13:45:42 +000010714 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000010715 .model_id = WINBOND_W49F020,
hailfinger808e6aa2010-07-17 13:45:42 +000010716 .total_size = 256,
10717 .page_size = 128,
10718 .feature_bits = FEATURE_EITHER_RESET,
10719 .tested = TEST_OK_PROBE,
10720 .probe = probe_jedec,
10721 .probe_timing = 10,
10722 .block_erasers =
10723 {
10724 {
10725 .eraseblocks = { {256 * 1024, 1} },
10726 .block_erase = erase_chip_block_jedec,
10727 }
10728 },
10729 .write = write_jedec_1,
10730 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000010731 .voltage = {4500, 5500},
hailfinger808e6aa2010-07-17 13:45:42 +000010732 },
10733
10734 {
10735 .vendor = "Winbond",
hailfinger286829b2009-01-08 03:40:17 +000010736 .name = "W49V002A",
hailfingere1e41ea2011-07-27 07:13:06 +000010737 .bustype = BUS_LPC,
hailfinger286829b2009-01-08 03:40:17 +000010738 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000010739 .model_id = WINBOND_W49V002A,
hailfinger286829b2009-01-08 03:40:17 +000010740 .total_size = 256,
10741 .page_size = 128,
snelsonc6855342010-01-28 23:55:12 +000010742 .feature_bits = FEATURE_EITHER_RESET,
David Hendricksc801adb2010-12-09 16:58:56 -080010743 .tested = TEST_OK_PRE,
hailfinger286829b2009-01-08 03:40:17 +000010744 .probe = probe_jedec,
stefanct371e7e82011-07-07 19:56:58 +000010745 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000010746 .block_erasers =
10747 {
10748 {
10749 .eraseblocks = {
10750 {64 * 1024, 3},
10751 {32 * 1024, 1},
10752 {8 * 1024, 2},
10753 {16 * 1024, 1},
10754 },
10755 .block_erase = erase_sector_jedec,
10756 }, {
10757 .eraseblocks = { {256 * 1024, 1} },
10758 .block_erase = erase_chip_block_jedec,
10759 }
10760 },
snelsonc6855342010-01-28 23:55:12 +000010761 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000010762 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000010763 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000010764 },
10765
hailfinger286829b2009-01-08 03:40:17 +000010766 {
10767 .vendor = "Winbond",
10768 .name = "W49V002FA",
hailfingere1e41ea2011-07-27 07:13:06 +000010769 .bustype = BUS_FWH,
hailfinger286829b2009-01-08 03:40:17 +000010770 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000010771 .model_id = WINBOND_W49V002FA,
hailfinger286829b2009-01-08 03:40:17 +000010772 .total_size = 256,
10773 .page_size = 128,
snelsonc6855342010-01-28 23:55:12 +000010774 .feature_bits = FEATURE_EITHER_RESET,
hailfingerd217d122010-10-08 18:52:29 +000010775 .tested = TEST_OK_PR,
hailfinger286829b2009-01-08 03:40:17 +000010776 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +000010777 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000010778 .block_erasers =
10779 {
10780 {
10781 .eraseblocks = {
10782 {64 * 1024, 3},
10783 {32 * 1024, 1},
10784 {8 * 1024, 2},
10785 {16 * 1024, 1},
10786 },
10787 .block_erase = erase_sector_jedec,
10788 }, {
10789 .eraseblocks = { {256 * 1024, 1} },
10790 .block_erase = erase_chip_block_jedec,
10791 }
10792 },
snelsonc6855342010-01-28 23:55:12 +000010793 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000010794 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000010795 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000010796 },
10797
hailfinger286829b2009-01-08 03:40:17 +000010798 {
10799 .vendor = "Winbond",
10800 .name = "W39V080FA",
hailfingere1e41ea2011-07-27 07:13:06 +000010801 .bustype = BUS_FWH,
hailfinger286829b2009-01-08 03:40:17 +000010802 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000010803 .model_id = WINBOND_W39V080FA,
hailfinger286829b2009-01-08 03:40:17 +000010804 .total_size = 1024,
hailfingerc43afc92009-12-22 22:15:33 +000010805 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +000010806 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
stefanctdfd58832011-07-25 20:38:52 +000010807 .tested = TEST_OK_PREW,
hailfingerafac00e2010-01-09 02:24:17 +000010808 .probe = probe_jedec,
hailfingerf8993012010-12-05 16:33:59 +000010809 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000010810 .block_erasers =
10811 {
10812 {
10813 .eraseblocks = { {64 * 1024, 16}, },
10814 .block_erase = erase_sector_jedec,
10815 }, {
10816 .eraseblocks = { {1024 * 1024, 1} },
10817 .block_erase = erase_chip_block_jedec,
10818 }
10819 },
hailfingerf8993012010-12-05 16:33:59 +000010820 .printlock = printlock_w39v080fa,
10821 .unlock = unlock_w39v080fa,
snelsonc6855342010-01-28 23:55:12 +000010822 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000010823 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +000010824 .voltage = {3000, 3600}, /* Also has 12V fast program */
stepanaa1b6a22008-12-08 18:15:10 +000010825 },
10826
hailfinger286829b2009-01-08 03:40:17 +000010827 {
10828 .vendor = "Winbond",
10829 .name = "W39V080FA (dual mode)",
hailfingere1e41ea2011-07-27 07:13:06 +000010830 .bustype = BUS_FWH,
hailfinger286829b2009-01-08 03:40:17 +000010831 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000010832 .model_id = WINBOND_W39V080FA_DM,
hailfinger286829b2009-01-08 03:40:17 +000010833 .total_size = 512,
hailfingerc43afc92009-12-22 22:15:33 +000010834 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +000010835 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
hailfinger286829b2009-01-08 03:40:17 +000010836 .tested = TEST_UNTESTED,
hailfingerafac00e2010-01-09 02:24:17 +000010837 .probe = probe_jedec,
hailfingerf8993012010-12-05 16:33:59 +000010838 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000010839 .block_erasers =
10840 {
10841 {
10842 .eraseblocks = { {64 * 1024, 8}, },
10843 .block_erase = erase_sector_jedec,
10844 }, {
10845 .eraseblocks = { {512 * 1024, 1} },
10846 .block_erase = erase_chip_block_jedec,
10847 }
10848 },
hailfingerf8993012010-12-05 16:33:59 +000010849 .printlock = printlock_w39v080fa_dual,
snelsonc6855342010-01-28 23:55:12 +000010850 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000010851 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +000010852 .voltage = {3000, 3600}, /* Also has 12V fast program */
stepanaa1b6a22008-12-08 18:15:10 +000010853 },
David Hendricks89a45e52011-11-22 16:56:22 -080010854
hailfinger286829b2009-01-08 03:40:17 +000010855 {
Duncan Laurie89ee23d2015-05-08 20:27:50 +000010856 .vendor = "Programmer",
10857 .name = "Opaque flash chip",
10858 .bustype = BUS_PROG,
10859 .manufacture_id = PROGMANUF_ID,
10860 .model_id = PROGDEV_ID,
10861 .total_size = 0,
10862 .page_size = 256,
10863 /* probe is assumed to work, rest will be filled in by probe */
10864 .tested = TEST_OK_PROBE,
10865 .probe = probe_opaque,
10866 /* eraseblock sizes will be set by the probing function */
10867 .block_erasers =
10868 {
10869 {
10870 .block_erase = erase_opaque,
10871 }
10872 },
10873 .write = write_opaque,
10874 .read = read_opaque,
10875 },
10876
10877 {
hailfinger867df6b2010-07-22 11:44:38 +000010878 .vendor = "AMIC",
10879 .name = "unknown AMIC SPI chip",
hailfingere1e41ea2011-07-27 07:13:06 +000010880 .bustype = BUS_SPI,
hailfinger867df6b2010-07-22 11:44:38 +000010881 .manufacture_id = AMIC_ID,
10882 .model_id = GENERIC_DEVICE_ID,
10883 .total_size = 0,
10884 .page_size = 256,
10885 .tested = TEST_BAD_PREW,
10886 .probe = probe_spi_rdid4,
10887 .probe_timing = TIMING_ZERO,
10888 .write = NULL,
10889 .read = NULL,
10890 },
10891
10892 {
hailfinger286829b2009-01-08 03:40:17 +000010893 .vendor = "Atmel",
10894 .name = "unknown Atmel SPI chip",
hailfingere1e41ea2011-07-27 07:13:06 +000010895 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +000010896 .manufacture_id = ATMEL_ID,
10897 .model_id = GENERIC_DEVICE_ID,
10898 .total_size = 0,
10899 .page_size = 256,
hailfinger97ab2632009-04-22 13:33:43 +000010900 .tested = TEST_BAD_PREW,
hailfinger286829b2009-01-08 03:40:17 +000010901 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000010902 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +000010903 .write = NULL,
hailfinger23060112009-05-08 12:49:03 +000010904 .read = NULL,
stepanaa1b6a22008-12-08 18:15:10 +000010905 },
10906
hailfinger286829b2009-01-08 03:40:17 +000010907 {
hailfinger61958912010-07-28 22:20:20 +000010908 .vendor = "Eon",
10909 .name = "unknown Eon SPI chip",
hailfingere1e41ea2011-07-27 07:13:06 +000010910 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +000010911 .manufacture_id = EON_ID_NOPREFIX,
10912 .model_id = GENERIC_DEVICE_ID,
10913 .total_size = 0,
10914 .page_size = 256,
hailfinger97ab2632009-04-22 13:33:43 +000010915 .tested = TEST_BAD_PREW,
hailfinger286829b2009-01-08 03:40:17 +000010916 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000010917 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +000010918 .write = NULL,
hailfinger23060112009-05-08 12:49:03 +000010919 .read = NULL,
stepanaa1b6a22008-12-08 18:15:10 +000010920 },
10921
hailfinger286829b2009-01-08 03:40:17 +000010922 {
10923 .vendor = "Macronix",
10924 .name = "unknown Macronix SPI chip",
hailfingere1e41ea2011-07-27 07:13:06 +000010925 .bustype = BUS_SPI,
mhmd3c80cd2010-09-15 23:31:03 +000010926 .manufacture_id = MACRONIX_ID,
hailfinger286829b2009-01-08 03:40:17 +000010927 .model_id = GENERIC_DEVICE_ID,
10928 .total_size = 0,
10929 .page_size = 256,
hailfinger97ab2632009-04-22 13:33:43 +000010930 .tested = TEST_BAD_PREW,
hailfinger286829b2009-01-08 03:40:17 +000010931 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000010932 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +000010933 .write = NULL,
hailfinger23060112009-05-08 12:49:03 +000010934 .read = NULL,
stepanaa1b6a22008-12-08 18:15:10 +000010935 },
10936
hailfinger286829b2009-01-08 03:40:17 +000010937 {
10938 .vendor = "PMC",
10939 .name = "unknown PMC SPI chip",
hailfingere1e41ea2011-07-27 07:13:06 +000010940 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +000010941 .manufacture_id = PMC_ID,
10942 .model_id = GENERIC_DEVICE_ID,
10943 .total_size = 0,
10944 .page_size = 256,
hailfinger97ab2632009-04-22 13:33:43 +000010945 .tested = TEST_BAD_PREW,
hailfinger286829b2009-01-08 03:40:17 +000010946 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000010947 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +000010948 .write = NULL,
hailfinger23060112009-05-08 12:49:03 +000010949 .read = NULL,
stepanaa1b6a22008-12-08 18:15:10 +000010950 },
10951
hailfinger286829b2009-01-08 03:40:17 +000010952 {
10953 .vendor = "SST",
10954 .name = "unknown SST SPI chip",
hailfingere1e41ea2011-07-27 07:13:06 +000010955 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +000010956 .manufacture_id = SST_ID,
10957 .model_id = GENERIC_DEVICE_ID,
10958 .total_size = 0,
10959 .page_size = 256,
hailfinger97ab2632009-04-22 13:33:43 +000010960 .tested = TEST_BAD_PREW,
hailfinger286829b2009-01-08 03:40:17 +000010961 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000010962 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +000010963 .write = NULL,
hailfinger23060112009-05-08 12:49:03 +000010964 .read = NULL,
stepanaa1b6a22008-12-08 18:15:10 +000010965 },
10966
hailfinger286829b2009-01-08 03:40:17 +000010967 {
10968 .vendor = "ST",
10969 .name = "unknown ST SPI chip",
hailfingere1e41ea2011-07-27 07:13:06 +000010970 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +000010971 .manufacture_id = ST_ID,
10972 .model_id = GENERIC_DEVICE_ID,
10973 .total_size = 0,
10974 .page_size = 256,
hailfinger97ab2632009-04-22 13:33:43 +000010975 .tested = TEST_BAD_PREW,
hailfinger286829b2009-01-08 03:40:17 +000010976 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000010977 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +000010978 .write = NULL,
hailfinger23060112009-05-08 12:49:03 +000010979 .read = NULL,
stepanaa1b6a22008-12-08 18:15:10 +000010980 },
uwec93fbdb2008-03-16 02:06:25 +000010981
hailfinger63165602009-11-20 01:12:45 +000010982 {
hailfinger201f62f2009-11-24 02:08:11 +000010983 .vendor = "Sanyo",
10984 .name = "unknown Sanyo SPI chip",
hailfingere1e41ea2011-07-27 07:13:06 +000010985 .bustype = BUS_SPI,
hailfinger201f62f2009-11-24 02:08:11 +000010986 .manufacture_id = SANYO_ID,
10987 .model_id = GENERIC_DEVICE_ID,
10988 .total_size = 0,
10989 .page_size = 256,
10990 .tested = TEST_BAD_PREW,
10991 .probe = probe_spi_rdid,
10992 .probe_timing = TIMING_ZERO,
hailfinger201f62f2009-11-24 02:08:11 +000010993 .write = NULL,
10994 .read = NULL,
10995 },
10996
10997 {
hailfinger63165602009-11-20 01:12:45 +000010998 .vendor = "Generic",
Louis Yung-Chieh Loe53fa0f2011-04-11 17:18:41 +080010999 .name = "Variable Size SPI chip",
hailfingere1e41ea2011-07-27 07:13:06 +000011000 .bustype = BUS_SPI,
Louis Yung-Chieh Loe53fa0f2011-04-11 17:18:41 +080011001 .manufacture_id = VARIABLE_SIZE_MANUF_ID,
11002 .model_id = VARIABLE_SIZE_DEVICE_ID,
11003 .total_size = 64, /* This size is set temporarily */
11004 .page_size = 256,
11005 .tested = TEST_OK_PREW,
11006 .probe = probe_variable_size,
11007 .block_erasers =
11008 {
11009 {
11010 .eraseblocks = { {4 * 1024, 16} },
11011 .block_erase = spi_block_erase_20,
11012 }, {
11013 .eraseblocks = { {64 * 1024, 1} },
11014 .block_erase = spi_block_erase_d8,
11015 }
11016 },
11017 .write = spi_chip_write_256,
11018 .read = spi_chip_read,
11019 },
11020
11021 {
11022 .vendor = "Generic",
hailfinger63165602009-11-20 01:12:45 +000011023 .name = "unknown SPI chip (RDID)",
hailfingere1e41ea2011-07-27 07:13:06 +000011024 .bustype = BUS_SPI,
hailfinger63165602009-11-20 01:12:45 +000011025 .manufacture_id = GENERIC_MANUF_ID,
11026 .model_id = GENERIC_DEVICE_ID,
11027 .total_size = 0,
11028 .page_size = 256,
11029 .tested = TEST_BAD_PREW,
11030 .probe = probe_spi_rdid,
hailfinger63165602009-11-20 01:12:45 +000011031 .write = NULL,
11032 },
David Hendricks07af3a42011-07-11 22:13:02 -070011033
hailfinger63165602009-11-20 01:12:45 +000011034 {
11035 .vendor = "Generic",
11036 .name = "unknown SPI chip (REMS)",
hailfingere1e41ea2011-07-27 07:13:06 +000011037 .bustype = BUS_SPI,
hailfinger63165602009-11-20 01:12:45 +000011038 .manufacture_id = GENERIC_MANUF_ID,
11039 .model_id = GENERIC_DEVICE_ID,
11040 .total_size = 0,
11041 .page_size = 256,
11042 .tested = TEST_BAD_PREW,
11043 .probe = probe_spi_rems,
hailfinger63165602009-11-20 01:12:45 +000011044 .write = NULL,
11045 },
11046
hailfinger286829b2009-01-08 03:40:17 +000011047 { NULL }
stuge7be5d032009-04-21 01:46:07 +000011048};
Simon Glass4c214132013-07-16 10:09:28 -060011049
David Hendricks07153282016-12-22 16:07:00 -080011050/* Generic flashchip struct for platforms that use Intel hardware sequencing. */
Ramya Vijaykumare6a7ca82015-05-12 14:27:29 +053011051const struct flashchip flashchips_hwseq[] = {
11052 {
David Hendricks07153282016-12-22 16:07:00 -080011053 .vendor = "Generic",
11054 .name = "HWSEQ chip",
Ramya Vijaykumare6a7ca82015-05-12 14:27:29 +053011055 .bustype = BUS_PROG,
Ramya Vijaykumare6a7ca82015-05-12 14:27:29 +053011056 /* probe is assumed to work, rest will be filled in by probe */
David Hendricksb8696182016-05-20 16:38:35 -070011057 .tested = TEST_OK_PREWU,
Ramya Vijaykumare6a7ca82015-05-12 14:27:29 +053011058 .probe = probe_opaque,
11059 /* eraseblock sizes will be set by the probing function */
11060 .block_erasers =
11061 {
11062 {
11063 .block_erase = erase_opaque,
11064 }
11065 },
11066 .write = write_opaque,
11067 .read = read_opaque,
Ramya Vijaykumar4af3f822016-01-27 11:51:27 +053011068 .read_status = read_status_opaque,
11069 .write_status = write_status_opaque,
11070 .wp = &wp_w25,
Furquan Shaikhc5bc5cd2019-01-07 04:25:59 -080011071 .unlock = &spi_disable_blockprotect,
Ramya Vijaykumare6a7ca82015-05-12 14:27:29 +053011072 },
11073
11074 {NULL}
11075};
11076
Souvik Ghoshd75cd672016-06-17 14:21:39 -070011077int flash_erase_value(struct flashctx *flash)
Simon Glass4c214132013-07-16 10:09:28 -060011078{
Patrick Georgif3fa2992017-02-02 16:24:44 +010011079 return flash->chip->feature_bits & FEATURE_ERASE_TO_ZERO ? 0 : 0xff;
Simon Glass4c214132013-07-16 10:09:28 -060011080}
11081
Souvik Ghoshd75cd672016-06-17 14:21:39 -070011082int flash_unerased_value(struct flashctx *flash)
Simon Glass4c214132013-07-16 10:09:28 -060011083{
Patrick Georgif3fa2992017-02-02 16:24:44 +010011084 return flash->chip->feature_bits & FEATURE_ERASE_TO_ZERO ? 0xff : 0;
Simon Glass4c214132013-07-16 10:09:28 -060011085}
David Hendricks8c084212015-11-17 22:29:36 -080011086
David Hendricks40df5b52016-12-22 15:36:28 -080011087const struct flashchip *flash_id_to_entry(uint32_t mfg_id, uint32_t model_id)
11088{
11089 const struct flashchip *chip;
11090
11091 for (chip = &flashchips[0]; chip->vendor; chip++) {
11092 if ((chip->manufacture_id == mfg_id) &&
11093 (chip->model_id == model_id))
11094 return chip;
11095 }
11096
11097 return NULL;
11098}
11099
David Hendricks8c084212015-11-17 22:29:36 -080011100struct voltage_range voltage_ranges[NUM_VOLTAGE_RANGES];
11101
11102static int compar(const void *_x, const void *_y)
11103{
11104 const struct voltage_range *x = _x;
11105 const struct voltage_range *y = _y;
11106
11107 /*
11108 * qsort() places entries in ascending order. We will sort by minimum
11109 * voltage primarily and max voltage secondarily, and move empty sets
11110 * to the end of array.
11111 */
11112 if (x->min == 0)
11113 return 1;
11114 if (y->min == 0)
11115 return -1;
11116
11117 if (x->min < y->min)
11118 return -1;
11119 if (x->min > y->min)
11120 return 1;
11121
11122 if (x->min == y->min) {
11123 if (x->max < y->max)
11124 return -1;
11125 if (x->max > y->max)
11126 return 1;
11127 }
11128
11129 return 0;
11130}
11131
11132int flash_supported_voltage_ranges(enum chipbustype bus)
11133{
11134 int i;
11135 int unique_ranges = 0;
11136
11137 /* clear array in case user calls this function multiple times */
11138 memset(voltage_ranges, 0, sizeof(voltage_ranges));
11139
11140 for (i = 0; i < ARRAY_SIZE(flashchips); i++) {
11141 int j;
11142 int match_found = 0;
11143
11144 if (unique_ranges >= NUM_VOLTAGE_RANGES) {
11145 msg_cerr("Increase NUM_VOLTAGE_RANGES.\n");
11146 return -1;
11147 }
11148
11149 if (!(flashchips[i].bustype & bus))
11150 continue;
11151
11152 for (j = 0; j < NUM_VOLTAGE_RANGES; j++) {
11153 if ((flashchips[i].voltage.min == voltage_ranges[j].min) &&
11154 (flashchips[i].voltage.max == voltage_ranges[j].max))
11155 match_found |= 1;
11156
11157 if (!voltage_ranges[j].min && !voltage_ranges[j].max)
11158 break;
11159 }
11160
11161 if (!match_found) {
11162 voltage_ranges[j] = flashchips[i].voltage;
11163 unique_ranges++;
11164 }
11165 }
11166
11167 qsort(&voltage_ranges[0], NUM_VOLTAGE_RANGES,
11168 sizeof(voltage_ranges[0]), compar);
11169
11170 for (i = 0; i < NUM_VOLTAGE_RANGES; i++) {
11171 msg_cspew("%s: voltage_range[%d]: { %u, %u }\n",
11172 __func__, i, voltage_ranges[i].min, voltage_ranges[i].max);
11173 }
11174
11175 return unique_ranges;
11176}