blob: 680230b09f2461731ec15474c13837b544e4bda0 [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",
Edward O'Callaghan1fa87e02019-05-03 02:27:24 -04001366 .name = "ATMEL_AT25SF128A",
1367 .bustype = BUS_SPI,
1368 .manufacture_id = ATMEL_ID,
1369 .model_id = ATMEL_AT25SF128A,
1370 .total_size = 16384,
1371 .page_size = 256,
1372 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
1373 .tested = TEST_OK_PREWU,
1374 .probe = probe_spi_rdid,
1375 .probe_timing = TIMING_ZERO,
1376 .block_erasers =
1377 {
1378 {
1379 .eraseblocks = { {4 * 1024, 4096} },
1380 .block_erase = spi_block_erase_20,
1381 }, {
1382 .eraseblocks = { {32 * 1024, 512} },
1383 .block_erase = spi_block_erase_52,
1384 }, {
1385 .eraseblocks = { {64 * 1024, 256} },
1386 .block_erase = spi_block_erase_d8,
1387 }, {
1388 .eraseblocks = { {16 * 1024 * 1024, 1} },
1389 .block_erase = spi_block_erase_60,
1390 }, {
1391 .eraseblocks = { {16 * 1024 * 1024, 1} },
1392 .block_erase = spi_block_erase_c7,
1393 }
1394 },
1395 .printlock = spi_prettyprint_status_register_at25df,
1396 .unlock = spi_disable_blockprotect_at25df,
1397 .write = spi_chip_write_256,
1398 .read = spi_chip_read,
1399 .voltage = {1700, 2000},
1400 .wp = &wp_w25q,
1401 },
1402
1403 {
1404 .vendor = "Atmel",
hailfinger286829b2009-01-08 03:40:17 +00001405 .name = "AT25DF021",
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_AT25DF021,
hailfinger286829b2009-01-08 03:40:17 +00001409 .total_size = 256,
1410 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07001411 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1412 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
hailfinger286829b2009-01-08 03:40:17 +00001413 .tested = TEST_UNTESTED,
1414 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001415 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001416 .block_erasers =
1417 {
1418 {
1419 .eraseblocks = { {4 * 1024, 64} },
1420 .block_erase = spi_block_erase_20,
1421 }, {
1422 .eraseblocks = { {32 * 1024, 8} },
1423 .block_erase = spi_block_erase_52,
1424 }, {
1425 .eraseblocks = { {64 * 1024, 4} },
1426 .block_erase = spi_block_erase_d8,
1427 }, {
1428 .eraseblocks = { {256 * 1024, 1} },
1429 .block_erase = spi_block_erase_60,
1430 }, {
1431 .eraseblocks = { {256 * 1024, 1} },
1432 .block_erase = spi_block_erase_c7,
1433 }
1434 },
hailfingerc33d4732010-07-29 13:09:18 +00001435 .printlock = spi_prettyprint_status_register_at25df,
1436 .unlock = spi_disable_blockprotect_at25df,
hailfinger87c05482009-05-09 02:34:18 +00001437 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001438 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +00001439 .voltage = {2700, 3600}, /* 2.3-3.6V & 2.7-3.6V models available */
stepanaa1b6a22008-12-08 18:15:10 +00001440 },
1441
hailfinger286829b2009-01-08 03:40:17 +00001442 {
1443 .vendor = "Atmel",
1444 .name = "AT25DF041A",
hailfingere1e41ea2011-07-27 07:13:06 +00001445 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001446 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001447 .model_id = ATMEL_AT25DF041A,
hailfinger286829b2009-01-08 03:40:17 +00001448 .total_size = 512,
1449 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08001450 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00001451 .tested = TEST_UNTESTED,
1452 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001453 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001454 .block_erasers =
1455 {
1456 {
1457 .eraseblocks = { {4 * 1024, 128} },
1458 .block_erase = spi_block_erase_20,
1459 }, {
1460 .eraseblocks = { {32 * 1024, 16} },
1461 .block_erase = spi_block_erase_52,
1462 }, {
1463 .eraseblocks = { {64 * 1024, 8} },
1464 .block_erase = spi_block_erase_d8,
1465 }, {
1466 .eraseblocks = { {512 * 1024, 1} },
1467 .block_erase = spi_block_erase_60,
1468 }, {
1469 .eraseblocks = { {512 * 1024, 1} },
1470 .block_erase = spi_block_erase_c7,
1471 }
1472 },
hailfingerc33d4732010-07-29 13:09:18 +00001473 .printlock = spi_prettyprint_status_register_at25df,
1474 .unlock = spi_disable_blockprotect_at25df,
hailfinger87c05482009-05-09 02:34:18 +00001475 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001476 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +00001477 .voltage = {2700, 3600}, /* 2.3-3.6V & 2.7-3.6V models available */
stepanaa1b6a22008-12-08 18:15:10 +00001478 },
1479
hailfinger286829b2009-01-08 03:40:17 +00001480 {
1481 .vendor = "Atmel",
1482 .name = "AT25DF081",
hailfingere1e41ea2011-07-27 07:13:06 +00001483 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001484 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001485 .model_id = ATMEL_AT25DF081,
hailfinger286829b2009-01-08 03:40:17 +00001486 .total_size = 1024,
1487 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08001488 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00001489 .tested = TEST_UNTESTED,
1490 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001491 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001492 .block_erasers =
1493 {
1494 {
1495 .eraseblocks = { {4 * 1024, 256} },
1496 .block_erase = spi_block_erase_20,
1497 }, {
1498 .eraseblocks = { {32 * 1024, 32} },
1499 .block_erase = spi_block_erase_52,
1500 }, {
1501 .eraseblocks = { {64 * 1024, 16} },
1502 .block_erase = spi_block_erase_d8,
1503 }, {
1504 .eraseblocks = { {1024 * 1024, 1} },
1505 .block_erase = spi_block_erase_60,
1506 }, {
1507 .eraseblocks = { {1024 * 1024, 1} },
1508 .block_erase = spi_block_erase_c7,
1509 }
1510 },
hailfingerc33d4732010-07-29 13:09:18 +00001511 .printlock = spi_prettyprint_status_register_at25df,
1512 .unlock = spi_disable_blockprotect_at25df,
1513 .write = spi_chip_write_256,
1514 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001515 .voltage = {1600, 2000}, /* Datasheet says range is 1.65-1.95 V */
hailfingerc33d4732010-07-29 13:09:18 +00001516 },
1517
1518 {
1519 .vendor = "Atmel",
1520 .name = "AT25DF081A",
hailfingere1e41ea2011-07-27 07:13:06 +00001521 .bustype = BUS_SPI,
hailfingerc33d4732010-07-29 13:09:18 +00001522 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001523 .model_id = ATMEL_AT25DF081A,
hailfingerc33d4732010-07-29 13:09:18 +00001524 .total_size = 1024,
1525 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08001526 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
hailfingerc33d4732010-07-29 13:09:18 +00001527 .tested = TEST_UNTESTED,
1528 .probe = probe_spi_rdid,
1529 .probe_timing = TIMING_ZERO,
1530 .block_erasers =
1531 {
1532 {
1533 .eraseblocks = { {4 * 1024, 256} },
1534 .block_erase = spi_block_erase_20,
1535 }, {
1536 .eraseblocks = { {32 * 1024, 32} },
1537 .block_erase = spi_block_erase_52,
1538 }, {
1539 .eraseblocks = { {64 * 1024, 16} },
1540 .block_erase = spi_block_erase_d8,
1541 }, {
1542 .eraseblocks = { {1024 * 1024, 1} },
1543 .block_erase = spi_block_erase_60,
1544 }, {
1545 .eraseblocks = { {1024 * 1024, 1} },
1546 .block_erase = spi_block_erase_c7,
1547 }
1548 },
1549 .printlock = spi_prettyprint_status_register_at25df_sec,
1550 .unlock = spi_disable_blockprotect_at25df_sec,
hailfinger87c05482009-05-09 02:34:18 +00001551 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001552 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +00001553 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00001554 },
1555
hailfinger286829b2009-01-08 03:40:17 +00001556 {
1557 .vendor = "Atmel",
1558 .name = "AT25DF161",
hailfingere1e41ea2011-07-27 07:13:06 +00001559 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001560 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001561 .model_id = ATMEL_AT25DF161,
hailfinger286829b2009-01-08 03:40:17 +00001562 .total_size = 2048,
1563 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08001564 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00001565 .tested = TEST_UNTESTED,
1566 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001567 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001568 .block_erasers =
1569 {
1570 {
1571 .eraseblocks = { {4 * 1024, 512} },
1572 .block_erase = spi_block_erase_20,
1573 }, {
1574 .eraseblocks = { {32 * 1024, 64} },
1575 .block_erase = spi_block_erase_52,
1576 }, {
1577 .eraseblocks = { {64 * 1024, 32} },
1578 .block_erase = spi_block_erase_d8,
1579 }, {
1580 .eraseblocks = { {2 * 1024 * 1024, 1} },
1581 .block_erase = spi_block_erase_60,
1582 }, {
1583 .eraseblocks = { {2 * 1024 * 1024, 1} },
1584 .block_erase = spi_block_erase_c7,
1585 }
1586 },
hailfingerc33d4732010-07-29 13:09:18 +00001587 .printlock = spi_prettyprint_status_register_at25df_sec,
1588 .unlock = spi_disable_blockprotect_at25df_sec,
hailfinger87c05482009-05-09 02:34:18 +00001589 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001590 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001591 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00001592 },
1593
hailfinger286829b2009-01-08 03:40:17 +00001594 {
1595 .vendor = "Atmel",
1596 .name = "AT25DF321",
hailfingere1e41ea2011-07-27 07:13:06 +00001597 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001598 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001599 .model_id = ATMEL_AT25DF321,
hailfinger286829b2009-01-08 03:40:17 +00001600 .total_size = 4096,
1601 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08001602 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
1603 .tested = TEST_OK_PREU,
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,
1626 .unlock = spi_disable_blockprotect_at25df,
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",
1634 .name = "AT25DF321A",
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_AT25DF321A,
hailfinger286829b2009-01-08 03:40:17 +00001638 .total_size = 4096,
1639 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07001640 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1641 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
stefanctd6efe1a2011-09-03 11:22:27 +00001642 .tested = TEST_OK_PROBE,
hailfinger286829b2009-01-08 03:40:17 +00001643 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001644 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001645 .block_erasers =
1646 {
1647 {
1648 .eraseblocks = { {4 * 1024, 1024} },
1649 .block_erase = spi_block_erase_20,
1650 }, {
1651 .eraseblocks = { {32 * 1024, 128} },
1652 .block_erase = spi_block_erase_52,
1653 }, {
1654 .eraseblocks = { {64 * 1024, 64} },
1655 .block_erase = spi_block_erase_d8,
1656 }, {
1657 .eraseblocks = { {4 * 1024 * 1024, 1} },
1658 .block_erase = spi_block_erase_60,
1659 }, {
1660 .eraseblocks = { {4 * 1024 * 1024, 1} },
1661 .block_erase = spi_block_erase_c7,
1662 }
1663 },
hailfingerc33d4732010-07-29 13:09:18 +00001664 .printlock = spi_prettyprint_status_register_at25df_sec,
1665 .unlock = spi_disable_blockprotect_at25df_sec,
hailfinger87c05482009-05-09 02:34:18 +00001666 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001667 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001668 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00001669 },
1670
hailfinger286829b2009-01-08 03:40:17 +00001671 {
1672 .vendor = "Atmel",
Stefan Tauner718d1eb2016-08-18 18:00:53 -07001673 .name = "AT25DF641(A)",
hailfingere1e41ea2011-07-27 07:13:06 +00001674 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001675 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001676 .model_id = ATMEL_AT25DF641,
hailfinger286829b2009-01-08 03:40:17 +00001677 .total_size = 8192,
1678 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08001679 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00001680 .tested = TEST_UNTESTED,
1681 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001682 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001683 .block_erasers =
1684 {
1685 {
1686 .eraseblocks = { {4 * 1024, 2048} },
1687 .block_erase = spi_block_erase_20,
1688 }, {
1689 .eraseblocks = { {32 * 1024, 256} },
1690 .block_erase = spi_block_erase_52,
1691 }, {
1692 .eraseblocks = { {64 * 1024, 128} },
1693 .block_erase = spi_block_erase_d8,
1694 }, {
1695 .eraseblocks = { {8 * 1024 * 1024, 1} },
1696 .block_erase = spi_block_erase_60,
1697 }, {
1698 .eraseblocks = { {8 * 1024 * 1024, 1} },
1699 .block_erase = spi_block_erase_c7,
1700 }
1701 },
hailfingerc33d4732010-07-29 13:09:18 +00001702 .printlock = spi_prettyprint_status_register_at25df_sec,
1703 .unlock = spi_disable_blockprotect_at25df_sec,
1704 .write = spi_chip_write_256,
1705 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001706 .voltage = {2700, 3600},
hailfingerc33d4732010-07-29 13:09:18 +00001707 },
1708
1709 {
1710 .vendor = "Atmel",
1711 .name = "AT25DQ161",
hailfingere1e41ea2011-07-27 07:13:06 +00001712 .bustype = BUS_SPI,
hailfingerc33d4732010-07-29 13:09:18 +00001713 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001714 .model_id = ATMEL_AT25DQ161,
hailfingerc33d4732010-07-29 13:09:18 +00001715 .total_size = 2048,
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,
hailfingerc33d4732010-07-29 13:09:18 +00001719 .tested = TEST_UNTESTED,
1720 .probe = probe_spi_rdid,
1721 .probe_timing = TIMING_ZERO,
1722 .block_erasers =
1723 {
1724 {
1725 .eraseblocks = { {4 * 1024, 512} },
1726 .block_erase = spi_block_erase_20,
1727 }, {
1728 .eraseblocks = { {32 * 1024, 64} },
1729 .block_erase = spi_block_erase_52,
1730 }, {
1731 .eraseblocks = { {64 * 1024, 32} },
1732 .block_erase = spi_block_erase_d8,
1733 }, {
1734 .eraseblocks = { {2 * 1024 * 1024, 1} },
1735 .block_erase = spi_block_erase_60,
1736 }, {
1737 .eraseblocks = { {2 * 1024 * 1024, 1} },
1738 .block_erase = spi_block_erase_c7,
1739 }
1740 },
1741 .printlock = spi_prettyprint_status_register_at25df_sec,
1742 .unlock = spi_disable_blockprotect_at25df_sec,
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 = "AT25F512B",
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_AT25F512B,
hailfinger286829b2009-01-08 03:40:17 +00001754 .total_size = 64,
1755 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07001756 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1757 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
hailfinger286829b2009-01-08 03:40:17 +00001758 .tested = TEST_UNTESTED,
1759 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001760 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001761 .block_erasers =
1762 {
1763 {
1764 .eraseblocks = { {4 * 1024, 16} },
1765 .block_erase = spi_block_erase_20,
1766 }, {
1767 .eraseblocks = { {32 * 1024, 2} },
1768 .block_erase = spi_block_erase_52,
1769 }, {
1770 .eraseblocks = { {32 * 1024, 2} },
1771 .block_erase = spi_block_erase_d8,
1772 }, {
1773 .eraseblocks = { {64 * 1024, 1} },
1774 .block_erase = spi_block_erase_60,
1775 }, {
1776 .eraseblocks = { {64 * 1024, 1} },
1777 .block_erase = spi_block_erase_c7,
1778 }
1779 },
hailfingerc33d4732010-07-29 13:09:18 +00001780 .printlock = spi_prettyprint_status_register_at25f,
1781 .unlock = spi_disable_blockprotect_at25f,
hailfinger87c05482009-05-09 02:34:18 +00001782 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001783 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001784 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00001785 },
1786
hailfinger286829b2009-01-08 03:40:17 +00001787 {
1788 .vendor = "Atmel",
1789 .name = "AT25FS010",
hailfingere1e41ea2011-07-27 07:13:06 +00001790 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001791 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001792 .model_id = ATMEL_AT25FS010,
hailfinger286829b2009-01-08 03:40:17 +00001793 .total_size = 128,
1794 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08001795 .feature_bits = FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00001796 .tested = TEST_UNTESTED,
1797 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001798 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001799 .block_erasers =
1800 {
1801 {
1802 .eraseblocks = { {4 * 1024, 32} },
1803 .block_erase = spi_block_erase_20,
1804 }, {
hailfingerc33d4732010-07-29 13:09:18 +00001805 .eraseblocks = { {4 * 1024, 32} },
1806 .block_erase = spi_block_erase_d7,
1807 }, {
hailfinger22155a82009-12-23 12:02:55 +00001808 .eraseblocks = { {32 * 1024, 4} },
1809 .block_erase = spi_block_erase_52,
1810 }, {
1811 .eraseblocks = { {32 * 1024, 4} },
1812 .block_erase = spi_block_erase_d8,
1813 }, {
1814 .eraseblocks = { {128 * 1024, 1} },
1815 .block_erase = spi_block_erase_60,
1816 }, {
1817 .eraseblocks = { {128 * 1024, 1} },
1818 .block_erase = spi_block_erase_c7,
1819 }
1820 },
hailfingerc33d4732010-07-29 13:09:18 +00001821 .printlock = spi_prettyprint_status_register_at25fs010,
1822 .unlock = spi_disable_blockprotect_at25fs010,
hailfinger87c05482009-05-09 02:34:18 +00001823 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001824 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001825 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00001826 },
1827
hailfinger286829b2009-01-08 03:40:17 +00001828 {
1829 .vendor = "Atmel",
1830 .name = "AT25FS040",
hailfingere1e41ea2011-07-27 07:13:06 +00001831 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001832 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001833 .model_id = ATMEL_AT25FS040,
hailfinger286829b2009-01-08 03:40:17 +00001834 .total_size = 512,
1835 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08001836 .feature_bits = FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00001837 .tested = TEST_UNTESTED,
1838 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001839 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001840 .block_erasers =
1841 {
1842 {
1843 .eraseblocks = { {4 * 1024, 128} },
1844 .block_erase = spi_block_erase_20,
1845 }, {
1846 .eraseblocks = { {64 * 1024, 8} },
1847 .block_erase = spi_block_erase_52,
1848 }, {
1849 .eraseblocks = { {64 * 1024, 8} },
1850 .block_erase = spi_block_erase_d8,
1851 }, {
1852 .eraseblocks = { {512 * 1024, 1} },
1853 .block_erase = spi_block_erase_60,
1854 }, {
1855 .eraseblocks = { {512 * 1024, 1} },
1856 .block_erase = spi_block_erase_c7,
1857 }
1858 },
hailfingerc33d4732010-07-29 13:09:18 +00001859 .printlock = spi_prettyprint_status_register_at25fs040,
1860 .unlock = spi_disable_blockprotect_at25fs040,
hailfinger87c05482009-05-09 02:34:18 +00001861 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001862 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001863 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00001864 },
1865
hailfinger286829b2009-01-08 03:40:17 +00001866 {
1867 .vendor = "Atmel",
1868 .name = "AT26DF041",
hailfingere1e41ea2011-07-27 07:13:06 +00001869 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001870 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001871 .model_id = ATMEL_AT26DF041,
hailfinger286829b2009-01-08 03:40:17 +00001872 .total_size = 512,
1873 .page_size = 256,
1874 .tested = TEST_UNTESTED,
1875 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001876 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001877 .block_erasers =
1878 {
1879 {
1880 .eraseblocks = { {4 * 1024, 128} },
1881 .block_erase = spi_block_erase_20,
1882 }
1883 },
hailfinger286829b2009-01-08 03:40:17 +00001884 .write = NULL /* Incompatible Page write */,
1885 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +00001886 .voltage = {2700, 3600}, /* 3.0-3.6V for higher speed, 2.7-3.6V normal */
stepanaa1b6a22008-12-08 18:15:10 +00001887 },
1888
hailfinger286829b2009-01-08 03:40:17 +00001889 {
1890 .vendor = "Atmel",
1891 .name = "AT26DF081A",
hailfingere1e41ea2011-07-27 07:13:06 +00001892 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001893 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001894 .model_id = ATMEL_AT26DF081A,
hailfinger286829b2009-01-08 03:40:17 +00001895 .total_size = 1024,
1896 .page_size = 256,
krause9d38a2f2011-01-17 07:45:54 +00001897 .feature_bits = FEATURE_WRSR_WREN,
1898 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00001899 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001900 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001901 .block_erasers =
1902 {
1903 {
1904 .eraseblocks = { {4 * 1024, 256} },
1905 .block_erase = spi_block_erase_20,
1906 }, {
1907 .eraseblocks = { {32 * 1024, 32} },
1908 .block_erase = spi_block_erase_52,
1909 }, {
1910 .eraseblocks = { {64 * 1024, 16} },
1911 .block_erase = spi_block_erase_d8,
1912 }, {
1913 .eraseblocks = { {1024 * 1024, 1} },
1914 .block_erase = spi_block_erase_60,
1915 }, {
1916 .eraseblocks = { {1024 * 1024, 1} },
1917 .block_erase = spi_block_erase_c7,
1918 }
1919 },
Edward O'Callaghanb5dee7a2019-03-05 13:32:51 +11001920 .printlock = spi_prettyprint_status_register_at26df081a,
krause9d38a2f2011-01-17 07:45:54 +00001921 .unlock = spi_disable_blockprotect_at25df,
hailfinger87c05482009-05-09 02:34:18 +00001922 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001923 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001924 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00001925 },
1926
hailfinger286829b2009-01-08 03:40:17 +00001927 {
1928 .vendor = "Atmel",
1929 .name = "AT26DF161",
hailfingere1e41ea2011-07-27 07:13:06 +00001930 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001931 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001932 .model_id = ATMEL_AT26DF161,
hailfinger286829b2009-01-08 03:40:17 +00001933 .total_size = 2048,
1934 .page_size = 256,
1935 .tested = TEST_UNTESTED,
1936 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001937 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001938 .block_erasers =
1939 {
1940 {
1941 .eraseblocks = { {4 * 1024, 512} },
1942 .block_erase = spi_block_erase_20,
1943 }, {
1944 .eraseblocks = { {32 * 1024, 64} },
1945 .block_erase = spi_block_erase_52,
1946 }, {
1947 .eraseblocks = { {64 * 1024, 32} },
1948 .block_erase = spi_block_erase_d8,
1949 }, {
1950 .eraseblocks = { {2 * 1024 * 1024, 1} },
1951 .block_erase = spi_block_erase_60,
1952 }, {
1953 .eraseblocks = { {2 * 1024 * 1024, 1} },
1954 .block_erase = spi_block_erase_c7,
1955 }
1956 },
hailfinger7533bc82011-05-19 00:06:06 +00001957 .printlock = spi_prettyprint_status_register_at25df,
hailfingerb9560ee2010-07-14 20:21:22 +00001958 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00001959 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001960 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001961 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00001962 },
1963
hailfinger286829b2009-01-08 03:40:17 +00001964 {
1965 .vendor = "Atmel",
1966 .name = "AT26DF161A",
hailfingere1e41ea2011-07-27 07:13:06 +00001967 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001968 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001969 .model_id = ATMEL_AT26DF161A,
hailfinger286829b2009-01-08 03:40:17 +00001970 .total_size = 2048,
1971 .page_size = 256,
1972 .tested = TEST_UNTESTED,
1973 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001974 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001975 .block_erasers =
1976 {
1977 {
1978 .eraseblocks = { {4 * 1024, 512} },
1979 .block_erase = spi_block_erase_20,
1980 }, {
1981 .eraseblocks = { {32 * 1024, 64} },
1982 .block_erase = spi_block_erase_52,
1983 }, {
1984 .eraseblocks = { {64 * 1024, 32} },
1985 .block_erase = spi_block_erase_d8,
1986 }, {
1987 .eraseblocks = { {2 * 1024 * 1024, 1} },
1988 .block_erase = spi_block_erase_60,
1989 }, {
1990 .eraseblocks = { {2 * 1024 * 1024, 1} },
1991 .block_erase = spi_block_erase_c7,
1992 }
1993 },
Edward O'Callaghanb5dee7a2019-03-05 13:32:51 +11001994 .printlock = spi_prettyprint_status_register_at26df081a,
hailfingerb9560ee2010-07-14 20:21:22 +00001995 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00001996 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001997 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001998 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00001999 },
2000
2001 /*The AT26DF321 has the same ID as the AT25DF321. */
hailfinger286829b2009-01-08 03:40:17 +00002002 /*{
2003 .vendor = "Atmel",
2004 .name = "AT26DF321",
hailfingere1e41ea2011-07-27 07:13:06 +00002005 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002006 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002007 .model_id = ATMEL_AT26DF321,
hailfinger286829b2009-01-08 03:40:17 +00002008 .total_size = 4096,
2009 .page_size = 256,
2010 .tested = TEST_UNTESTED,
2011 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00002012 .probe_timing = TIMING_ZERO,
Edward O'Callaghanb5dee7a2019-03-05 13:32:51 +11002013 .printlock = spi_prettyprint_status_register_at26df081a,
hailfingerb9560ee2010-07-14 20:21:22 +00002014 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00002015 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00002016 .read = spi_chip_read,
2017 },*/
stepanaa1b6a22008-12-08 18:15:10 +00002018
hailfinger286829b2009-01-08 03:40:17 +00002019 {
2020 .vendor = "Atmel",
2021 .name = "AT26F004",
hailfingere1e41ea2011-07-27 07:13:06 +00002022 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002023 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002024 .model_id = ATMEL_AT26F004,
hailfinger286829b2009-01-08 03:40:17 +00002025 .total_size = 512,
2026 .page_size = 256,
2027 .tested = TEST_UNTESTED,
2028 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00002029 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00002030 .block_erasers =
2031 {
2032 {
2033 .eraseblocks = { {4 * 1024, 128} },
2034 .block_erase = spi_block_erase_20,
2035 }, {
2036 .eraseblocks = { {32 * 1024, 16} },
2037 .block_erase = spi_block_erase_52,
2038 }, {
2039 .eraseblocks = { {64 * 1024, 8} },
2040 .block_erase = spi_block_erase_d8,
2041 }, {
2042 .eraseblocks = { {512 * 1024, 1} },
2043 .block_erase = spi_block_erase_60,
2044 }, {
2045 .eraseblocks = { {512 * 1024, 1} },
2046 .block_erase = spi_block_erase_c7,
2047 }
2048 },
hailfinger286829b2009-01-08 03:40:17 +00002049 .write = NULL /* Incompatible Page write */,
2050 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00002051 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00002052 },
2053
hailfinger286829b2009-01-08 03:40:17 +00002054 {
2055 .vendor = "Atmel",
uwed75c4f52009-06-02 16:45:59 +00002056 .name = "AT29C512",
hailfingere1e41ea2011-07-27 07:13:06 +00002057 .bustype = BUS_PARALLEL,
uwed75c4f52009-06-02 16:45:59 +00002058 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002059 .model_id = ATMEL_AT29C512,
uwed75c4f52009-06-02 16:45:59 +00002060 .total_size = 64,
2061 .page_size = 128,
snelsonc6855342010-01-28 23:55:12 +00002062 .feature_bits = FEATURE_LONG_RESET,
Stefan Tauner718d1eb2016-08-18 18:00:53 -07002063 .tested = TEST_OK_PREW,
hailfingerafac00e2010-01-09 02:24:17 +00002064 .probe = probe_jedec,
hailfingerd5b35922009-06-03 14:46:22 +00002065 .probe_timing = 10000, /* 10mS, Enter=Exec */
hailfinger22155a82009-12-23 12:02:55 +00002066 .block_erasers =
2067 {
2068 {
2069 .eraseblocks = { {64 * 1024, 1} },
2070 .block_erase = erase_chip_block_jedec,
2071 }
2072 },
uwed75c4f52009-06-02 16:45:59 +00002073 .write = write_jedec,
2074 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00002075 .voltage = {4500, 5500},
uwed75c4f52009-06-02 16:45:59 +00002076 },
2077
2078 {
2079 .vendor = "Atmel",
uweb3a82ef2009-05-16 21:39:19 +00002080 .name = "AT29C010A",
hailfingere1e41ea2011-07-27 07:13:06 +00002081 .bustype = BUS_PARALLEL,
uweb3a82ef2009-05-16 21:39:19 +00002082 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002083 .model_id = ATMEL_AT29C010A,
uweb3a82ef2009-05-16 21:39:19 +00002084 .total_size = 128,
2085 .page_size = 128,
snelsonc6855342010-01-28 23:55:12 +00002086 .feature_bits = FEATURE_LONG_RESET,
hailfingerd217d122010-10-08 18:52:29 +00002087 .tested = TEST_OK_PRE,
uweb3a82ef2009-05-16 21:39:19 +00002088 .probe = probe_jedec,
hailfingerd5b35922009-06-03 14:46:22 +00002089 .probe_timing = 10000, /* 10mS, Enter=Exec */
hailfinger22155a82009-12-23 12:02:55 +00002090 .block_erasers =
2091 {
2092 {
2093 .eraseblocks = { {128 * 1024, 1} },
2094 .block_erase = erase_chip_block_jedec,
2095 }
2096 },
uweb3a82ef2009-05-16 21:39:19 +00002097 .write = write_jedec, /* FIXME */
2098 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00002099 .voltage = {4500, 5500},
uweb3a82ef2009-05-16 21:39:19 +00002100 },
2101
2102 {
2103 .vendor = "Atmel",
hailfinger286829b2009-01-08 03:40:17 +00002104 .name = "AT29C020",
hailfingere1e41ea2011-07-27 07:13:06 +00002105 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00002106 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002107 .model_id = ATMEL_AT29C020,
hailfinger286829b2009-01-08 03:40:17 +00002108 .total_size = 256,
2109 .page_size = 256,
snelsonc6855342010-01-28 23:55:12 +00002110 .feature_bits = FEATURE_LONG_RESET,
2111 .tested = TEST_UNTESTED,
hailfinger286829b2009-01-08 03:40:17 +00002112 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +00002113 .probe_timing = 10000, /* 10ms */
hailfinger22155a82009-12-23 12:02:55 +00002114 .block_erasers =
2115 {
2116 {
2117 .eraseblocks = { {256 * 1024, 1} },
2118 .block_erase = erase_chip_block_jedec,
2119 }
2120 },
hailfinger286829b2009-01-08 03:40:17 +00002121 .write = write_jedec,
hailfinger23060112009-05-08 12:49:03 +00002122 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00002123 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00002124 },
2125
hailfinger286829b2009-01-08 03:40:17 +00002126 {
2127 .vendor = "Atmel",
2128 .name = "AT29C040A",
hailfingere1e41ea2011-07-27 07:13:06 +00002129 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00002130 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002131 .model_id = ATMEL_AT29C040A,
hailfinger286829b2009-01-08 03:40:17 +00002132 .total_size = 512,
2133 .page_size = 256,
snelsonc6855342010-01-28 23:55:12 +00002134 .feature_bits = FEATURE_LONG_RESET,
hailfinger286829b2009-01-08 03:40:17 +00002135 .tested = TEST_UNTESTED,
2136 .probe = probe_jedec,
hailfingerf850e0a2009-06-12 21:29:36 +00002137 .probe_timing = 10000, /* 10 ms */
hailfinger22155a82009-12-23 12:02:55 +00002138 .block_erasers =
2139 {
2140 {
2141 .eraseblocks = { {512 * 1024, 1} },
2142 .block_erase = erase_chip_block_jedec,
2143 }
2144 },
hailfinger286829b2009-01-08 03:40:17 +00002145 .write = write_jedec,
hailfinger23060112009-05-08 12:49:03 +00002146 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00002147 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00002148 },
2149
hailfinger286829b2009-01-08 03:40:17 +00002150 {
2151 .vendor = "Atmel",
2152 .name = "AT45CS1282",
hailfingere1e41ea2011-07-27 07:13:06 +00002153 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002154 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002155 .model_id = ATMEL_AT45CS1282,
hailfingerf60abdb2009-03-19 12:18:13 +00002156 .total_size = 16896 /* No power of two sizes */,
2157 .page_size = 1056 /* No power of two sizes */,
Patrick Georgiac3423f2017-02-03 20:58:06 +01002158 .tested = { .probe = NT, .read = BAD, .erase = NT, .write = NT, .uread = NT },
hailfinger286829b2009-01-08 03:40:17 +00002159 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00002160 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +00002161 .write = NULL /* Incompatible Page write */,
2162 .read = NULL /* Incompatible read */,
stefanct7e00e222011-06-03 07:26:31 +00002163 .voltage = {2700, 3600},
hailfingerf60abdb2009-03-19 12:18:13 +00002164 },
stepanaa1b6a22008-12-08 18:15:10 +00002165
hailfinger286829b2009-01-08 03:40:17 +00002166 {
2167 .vendor = "Atmel",
2168 .name = "AT45DB011D",
hailfingere1e41ea2011-07-27 07:13:06 +00002169 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002170 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002171 .model_id = ATMEL_AT45DB011D,
hailfingerf60abdb2009-03-19 12:18:13 +00002172 .total_size = 128 /* Size can only be determined from status register */,
2173 .page_size = 256 /* Size can only be determined from status register */,
Patrick Georgiac3423f2017-02-03 20:58:06 +01002174 .tested = { .probe = NT, .read = BAD, .erase = NT, .write = NT, .uread = NT },
hailfinger286829b2009-01-08 03:40:17 +00002175 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00002176 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +00002177 .write = NULL,
2178 .read = NULL,
stefanct7e00e222011-06-03 07:26:31 +00002179 .voltage = {2700, 3600},
hailfingerf60abdb2009-03-19 12:18:13 +00002180 },
stepanaa1b6a22008-12-08 18:15:10 +00002181
hailfinger286829b2009-01-08 03:40:17 +00002182 {
2183 .vendor = "Atmel",
2184 .name = "AT45DB021D",
hailfingere1e41ea2011-07-27 07:13:06 +00002185 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002186 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002187 .model_id = ATMEL_AT45DB021D,
hailfingerf60abdb2009-03-19 12:18:13 +00002188 .total_size = 256 /* Size can only be determined from status register */,
2189 .page_size = 256 /* Size can only be determined from status register */,
Patrick Georgiac3423f2017-02-03 20:58:06 +01002190 .tested = { .probe = NT, .read = BAD, .erase = NT, .write = NT, .uread = NT },
hailfinger286829b2009-01-08 03:40:17 +00002191 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00002192 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +00002193 .write = NULL,
2194 .read = NULL,
stefanct7e00e222011-06-03 07:26:31 +00002195 .voltage = {2700, 3600},
hailfingerf60abdb2009-03-19 12:18:13 +00002196 },
stepanaa1b6a22008-12-08 18:15:10 +00002197
hailfinger286829b2009-01-08 03:40:17 +00002198 {
2199 .vendor = "Atmel",
2200 .name = "AT45DB041D",
hailfingere1e41ea2011-07-27 07:13:06 +00002201 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002202 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002203 .model_id = ATMEL_AT45DB041D,
hailfingerf60abdb2009-03-19 12:18:13 +00002204 .total_size = 512 /* Size can only be determined from status register */,
2205 .page_size = 256 /* Size can only be determined from status register */,
Patrick Georgiac3423f2017-02-03 20:58:06 +01002206 .tested = { .probe = NT, .read = BAD, .erase = NT, .write = NT, .uread = NT },
hailfinger286829b2009-01-08 03:40:17 +00002207 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00002208 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +00002209 .write = NULL,
2210 .read = NULL,
stefanct66c8c1b2011-07-19 08:50:18 +00002211 .voltage = {2500, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
hailfingerf60abdb2009-03-19 12:18:13 +00002212 },
stepanaa1b6a22008-12-08 18:15:10 +00002213
hailfinger286829b2009-01-08 03:40:17 +00002214 {
2215 .vendor = "Atmel",
2216 .name = "AT45DB081D",
hailfingere1e41ea2011-07-27 07:13:06 +00002217 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002218 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002219 .model_id = ATMEL_AT45DB081D,
hailfingerf60abdb2009-03-19 12:18:13 +00002220 .total_size = 1024 /* Size can only be determined from status register */,
2221 .page_size = 256 /* Size can only be determined from status register */,
Patrick Georgiac3423f2017-02-03 20:58:06 +01002222 .tested = { .probe = NT, .read = BAD, .erase = NT, .write = NT, .uread = NT },
hailfinger286829b2009-01-08 03:40:17 +00002223 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00002224 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +00002225 .write = NULL,
2226 .read = NULL,
stefanct66c8c1b2011-07-19 08:50:18 +00002227 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
hailfingerf60abdb2009-03-19 12:18:13 +00002228 },
stepanaa1b6a22008-12-08 18:15:10 +00002229
hailfinger286829b2009-01-08 03:40:17 +00002230 {
2231 .vendor = "Atmel",
2232 .name = "AT45DB161D",
hailfingere1e41ea2011-07-27 07:13:06 +00002233 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002234 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002235 .model_id = ATMEL_AT45DB161D,
hailfingerf60abdb2009-03-19 12:18:13 +00002236 .total_size = 2048 /* Size can only be determined from status register */,
2237 .page_size = 512 /* Size can only be determined from status register */,
Patrick Georgiac3423f2017-02-03 20:58:06 +01002238 .tested = { .probe = NT, .read = BAD, .erase = NT, .write = NT, .uread = NT },
hailfinger286829b2009-01-08 03:40:17 +00002239 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00002240 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +00002241 .write = NULL,
2242 .read = NULL,
stefanct66c8c1b2011-07-19 08:50:18 +00002243 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
hailfingerf60abdb2009-03-19 12:18:13 +00002244 },
stepanaa1b6a22008-12-08 18:15:10 +00002245
hailfinger286829b2009-01-08 03:40:17 +00002246 {
2247 .vendor = "Atmel",
2248 .name = "AT45DB321C",
hailfingere1e41ea2011-07-27 07:13:06 +00002249 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002250 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002251 .model_id = ATMEL_AT45DB321C,
hailfingerf60abdb2009-03-19 12:18:13 +00002252 .total_size = 4224 /* No power of two sizes */,
2253 .page_size = 528 /* No power of two sizes */,
Patrick Georgiac3423f2017-02-03 20:58:06 +01002254 .tested = { .probe = NT, .read = BAD, .erase = NT, .write = NT, .uread = NT },
hailfinger286829b2009-01-08 03:40:17 +00002255 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00002256 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +00002257 .write = NULL,
2258 .read = NULL /* Incompatible read */,
stefanct7e00e222011-06-03 07:26:31 +00002259 .voltage = {2700, 3600},
hailfingerf60abdb2009-03-19 12:18:13 +00002260 },
stepanaa1b6a22008-12-08 18:15:10 +00002261
hailfinger286829b2009-01-08 03:40:17 +00002262 {
2263 .vendor = "Atmel",
2264 .name = "AT45DB321D",
hailfingere1e41ea2011-07-27 07:13:06 +00002265 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002266 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002267 .model_id = ATMEL_AT45DB321D,
hailfingerf60abdb2009-03-19 12:18:13 +00002268 .total_size = 4096 /* Size can only be determined from status register */,
2269 .page_size = 512 /* Size can only be determined from status register */,
Stefan Tauner9816fc82016-08-12 15:47:49 -07002270 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2271 .feature_bits = FEATURE_OTP,
Patrick Georgiac3423f2017-02-03 20:58:06 +01002272 .tested = { .probe = NT, .read = BAD, .erase = NT, .write = NT, .uread = NT },
hailfinger286829b2009-01-08 03:40:17 +00002273 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00002274 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +00002275 .write = NULL,
2276 .read = NULL,
stefanct7e00e222011-06-03 07:26:31 +00002277 .voltage = {2700, 3600},
hailfingerf60abdb2009-03-19 12:18:13 +00002278 },
stepanaa1b6a22008-12-08 18:15:10 +00002279
hailfinger286829b2009-01-08 03:40:17 +00002280 {
2281 .vendor = "Atmel",
2282 .name = "AT45DB642D",
hailfingere1e41ea2011-07-27 07:13:06 +00002283 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002284 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002285 .model_id = ATMEL_AT45DB642D,
hailfingerf60abdb2009-03-19 12:18:13 +00002286 .total_size = 8192 /* Size can only be determined from status register */,
2287 .page_size = 1024 /* Size can only be determined from status register */,
Patrick Georgiac3423f2017-02-03 20:58:06 +01002288 .tested = { .probe = NT, .read = BAD, .erase = NT, .write = NT, .uread = NT },
hailfinger286829b2009-01-08 03:40:17 +00002289 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00002290 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +00002291 .write = NULL,
2292 .read = NULL,
stefanct7e00e222011-06-03 07:26:31 +00002293 .voltage = {2700, 3600},
hailfingerf60abdb2009-03-19 12:18:13 +00002294 },
stepanaa1b6a22008-12-08 18:15:10 +00002295
hailfinger286829b2009-01-08 03:40:17 +00002296 {
2297 .vendor = "Atmel",
uwe0f5a3a22009-05-13 11:36:06 +00002298 .name = "AT49BV512",
hailfingere1e41ea2011-07-27 07:13:06 +00002299 .bustype = BUS_PARALLEL,
uwe0f5a3a22009-05-13 11:36:06 +00002300 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002301 .model_id = ATMEL_AT49BV512,
uwe0f5a3a22009-05-13 11:36:06 +00002302 .total_size = 64,
2303 .page_size = 64,
snelsonc6855342010-01-28 23:55:12 +00002304 .feature_bits = FEATURE_EITHER_RESET,
stefanct896d61e2011-06-04 13:13:34 +00002305 .tested = TEST_OK_PREW,
uwe0f5a3a22009-05-13 11:36:06 +00002306 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00002307 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
hailfinger22155a82009-12-23 12:02:55 +00002308 .block_erasers =
2309 {
2310 {
2311 .eraseblocks = { {64 * 1024, 1} },
2312 .block_erase = erase_chip_block_jedec,
2313 }
2314 },
snelsonc6855342010-01-28 23:55:12 +00002315 .write = write_jedec_1,
uwe0f5a3a22009-05-13 11:36:06 +00002316 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00002317 .voltage = {2700, 3600},
uwe0f5a3a22009-05-13 11:36:06 +00002318 },
2319
2320 {
2321 .vendor = "Atmel",
hailfinger93f8ce22010-06-07 14:10:55 +00002322 .name = "AT49F020",
hailfingere1e41ea2011-07-27 07:13:06 +00002323 .bustype = BUS_PARALLEL,
hailfinger93f8ce22010-06-07 14:10:55 +00002324 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002325 .model_id = ATMEL_AT49F020,
hailfinger93f8ce22010-06-07 14:10:55 +00002326 .total_size = 256,
2327 .page_size = 256,
2328 .feature_bits = FEATURE_EITHER_RESET,
hailfingerd217d122010-10-08 18:52:29 +00002329 .tested = TEST_OK_PRE,
hailfinger93f8ce22010-06-07 14:10:55 +00002330 .probe = probe_jedec,
2331 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
2332 .block_erasers =
2333 {
2334 {
2335 .eraseblocks = { {256 * 1024, 1} },
2336 .block_erase = erase_chip_block_jedec,
2337 }
2338 },
2339 .write = write_jedec_1,
2340 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00002341 .voltage = {4500, 5500},
hailfinger93f8ce22010-06-07 14:10:55 +00002342 },
2343
2344 {
2345 .vendor = "Atmel",
hailfinger286829b2009-01-08 03:40:17 +00002346 .name = "AT49F002(N)",
hailfingere1e41ea2011-07-27 07:13:06 +00002347 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00002348 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002349 .model_id = ATMEL_AT49F002N,
hailfinger286829b2009-01-08 03:40:17 +00002350 .total_size = 256,
2351 .page_size = 256,
snelsonc6855342010-01-28 23:55:12 +00002352 .feature_bits = FEATURE_EITHER_RESET,
hailfinger286829b2009-01-08 03:40:17 +00002353 .tested = TEST_UNTESTED,
2354 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00002355 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
hailfinger22155a82009-12-23 12:02:55 +00002356 .block_erasers =
2357 {
2358 {
2359 .eraseblocks = {
2360 {16 * 1024, 1},
2361 {8 * 1024, 2},
2362 {96 * 1024, 1},
2363 {128 * 1024, 1},
2364 },
2365 .block_erase = erase_sector_jedec,
2366 }, {
2367 .eraseblocks = { {256 * 1024, 1} },
2368 .block_erase = erase_chip_block_jedec,
2369 }
2370 },
snelsonc6855342010-01-28 23:55:12 +00002371 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00002372 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00002373 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00002374 },
2375
hailfinger286829b2009-01-08 03:40:17 +00002376 {
2377 .vendor = "Atmel",
2378 .name = "AT49F002(N)T",
hailfingere1e41ea2011-07-27 07:13:06 +00002379 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00002380 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002381 .model_id = ATMEL_AT49F002NT,
hailfinger286829b2009-01-08 03:40:17 +00002382 .total_size = 256,
2383 .page_size = 256,
snelsonc6855342010-01-28 23:55:12 +00002384 .feature_bits = FEATURE_EITHER_RESET,
hailfingerd217d122010-10-08 18:52:29 +00002385 .tested = TEST_OK_PR,
hailfinger286829b2009-01-08 03:40:17 +00002386 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00002387 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
hailfinger22155a82009-12-23 12:02:55 +00002388 .block_erasers =
2389 {
2390 {
2391 .eraseblocks = {
2392 {128 * 1024, 1},
2393 {96 * 1024, 1},
2394 {8 * 1024, 2},
2395 {16 * 1024, 1},
2396 },
2397 .block_erase = erase_sector_jedec,
2398 }, {
2399 .eraseblocks = { {256 * 1024, 1} },
2400 .block_erase = erase_chip_block_jedec,
2401 }
2402 },
snelsonc6855342010-01-28 23:55:12 +00002403 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00002404 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00002405 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00002406 },
2407
hailfinger867df6b2010-07-22 11:44:38 +00002408 {
uwe598c14d2011-09-08 19:55:18 +00002409 .vendor = "Atmel",
2410 .name = "AT49LH002",
2411 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
2412 .manufacture_id = ATMEL_ID,
2413 .model_id = ATMEL_AT49LH002,
2414 .total_size = 256,
2415 .page_size = 0, /* unused */
2416 .feature_bits = FEATURE_REGISTERMAP, /* TODO: LPC OK too? */
2417 .tested = TEST_UNTESTED,
2418 .probe = probe_82802ab, /* TODO: 0xff cmd not documented? */
2419 .probe_timing = TIMING_FIXME,
2420 .block_erasers =
2421 {
2422 {
2423 .eraseblocks = {
2424 {64 * 1024, 3},
2425 {32 * 1024, 1},
2426 {8 * 1024, 2},
2427 {16 * 1024, 1},
2428 },
2429 .block_erase = erase_block_82802ab,
2430 }, {
2431 .eraseblocks = {
2432 {64 * 1024, 4},
2433 },
2434 .block_erase = NULL, /* TODO: Implement. */
2435 },
2436 },
2437 .printlock = NULL, /* TODO */
2438 .unlock = NULL, /* unlock_82802ab() not correct(?) */
2439 .write = write_82802ab,
2440 .read = read_memmapped,
2441 .voltage = {3000, 3600},
2442 },
2443
2444 {
uwe97b20792011-09-13 22:05:44 +00002445 .vendor = "Catalyst",
2446 .name = "CAT28F512",
2447 .bustype = BUS_PARALLEL,
2448 .manufacture_id = CATALYST_ID,
2449 .model_id = CATALYST_CAT28F512,
2450 .total_size = 64,
2451 .page_size = 0, /* unused */
2452 .feature_bits = 0,
2453 .tested = TEST_OK_PR,
2454 .probe = probe_jedec, /* FIXME! */
2455 .probe_timing = TIMING_ZERO,
2456 .block_erasers =
2457 {
2458 {
2459 .eraseblocks = { {64 * 1024, 1} },
2460 .block_erase = NULL, /* TODO */
2461 },
2462 },
2463 .write = NULL, /* TODO */
2464 .read = read_memmapped,
2465 .voltage = {4500, 5500},
2466 },
2467
2468 {
mhme8e87912010-09-16 00:51:51 +00002469 .vendor = "Bright",
2470 .name = "BM29F040",
hailfingere1e41ea2011-07-27 07:13:06 +00002471 .bustype = BUS_PARALLEL,
mhme8e87912010-09-16 00:51:51 +00002472 .manufacture_id = BRIGHT_ID,
2473 .model_id = BRIGHT_BM29F040,
2474 .total_size = 512,
2475 .page_size = 64 * 1024,
2476 .feature_bits = FEATURE_EITHER_RESET,
2477 .tested = TEST_OK_PR,
2478 .probe = probe_jedec,
2479 .probe_timing = TIMING_ZERO,
2480 .block_erasers =
2481 {
2482 {
2483 .eraseblocks = { {64 * 1024, 8} },
2484 .block_erase = erase_sector_jedec,
2485 }, {
2486 .eraseblocks = { {512 * 1024, 1} },
2487 .block_erase = erase_chip_block_jedec,
2488 },
2489 },
2490 .write = write_jedec_1,
2491 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +00002492 .voltage = {4500, 5500},
mhme8e87912010-09-16 00:51:51 +00002493 },
2494
2495 {
David Hendricksc801adb2010-12-09 16:58:56 -08002496 .vendor = "Bright",
2497 .name = "BM29F040",
hailfingere1e41ea2011-07-27 07:13:06 +00002498 .bustype = BUS_PARALLEL,
David Hendricksc801adb2010-12-09 16:58:56 -08002499 .manufacture_id = BRIGHT_ID,
2500 .model_id = BRIGHT_BM29F040,
2501 .total_size = 512,
2502 .page_size = 64 * 1024,
2503 .feature_bits = FEATURE_EITHER_RESET,
2504 .tested = TEST_OK_PR,
2505 .probe = probe_jedec,
2506 .probe_timing = TIMING_ZERO,
2507 .block_erasers =
2508 {
2509 {
2510 .eraseblocks = { {64 * 1024, 8} },
2511 .block_erase = erase_sector_jedec,
2512 }, {
2513 .eraseblocks = { {512 * 1024, 1} },
2514 .block_erase = erase_chip_block_jedec,
2515 },
2516 },
2517 .write = write_jedec_1,
2518 .read = read_memmapped,
2519 },
2520
2521 {
hailfinger286829b2009-01-08 03:40:17 +00002522 .vendor = "EMST",
2523 .name = "F49B002UA",
hailfingere1e41ea2011-07-27 07:13:06 +00002524 .bustype = BUS_PARALLEL,
Patrick Georgi07e1ed92017-02-06 11:37:23 +01002525 .manufacture_id = ESMT_ID,
2526 .model_id = ESMT_F49B002UA,
hailfinger286829b2009-01-08 03:40:17 +00002527 .total_size = 256,
2528 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +00002529 .feature_bits = FEATURE_EITHER_RESET,
hailfinger286829b2009-01-08 03:40:17 +00002530 .tested = TEST_UNTESTED,
2531 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00002532 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelson2d471072010-01-09 05:30:14 +00002533 .block_erasers =
2534 {
2535 {
Simon Glass8dc82732013-07-16 10:13:51 -06002536 .eraseblocks = {
snelson2d471072010-01-09 05:30:14 +00002537 {128 * 1024, 1},
2538 {96 * 1024, 1},
2539 {8 * 1024, 2},
2540 {16 * 1024, 1},
2541 },
2542 .block_erase = erase_sector_jedec,
2543 }, {
2544 .eraseblocks = { {256 * 1024, 1} },
2545 .block_erase = erase_chip_block_jedec,
2546 }
2547 },
snelsonc6855342010-01-28 23:55:12 +00002548 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00002549 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00002550 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00002551 },
2552
hailfinger286829b2009-01-08 03:40:17 +00002553 {
mkarcherf6986732010-06-19 22:06:35 +00002554 .vendor = "EMST",
2555 .name = "F25L008A",
hailfingere1e41ea2011-07-27 07:13:06 +00002556 .bustype = BUS_SPI,
Patrick Georgi07e1ed92017-02-06 11:37:23 +01002557 .manufacture_id = ESMT_ID,
2558 .model_id = ESMT_F25L008A,
mkarcherf6986732010-06-19 22:06:35 +00002559 .total_size = 1024,
2560 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08002561 .feature_bits = FEATURE_UNBOUND_READ,
mkarcherf6986732010-06-19 22:06:35 +00002562 .tested = TEST_UNTESTED,
2563 .probe = probe_spi_rdid,
2564 .probe_timing = TIMING_ZERO,
2565 .block_erasers =
2566 {
2567 {
2568 .eraseblocks = { {4 * 1024, 256} },
2569 .block_erase = spi_block_erase_20,
2570 }, {
2571 .eraseblocks = { {64 * 1024, 16} },
2572 .block_erase = spi_block_erase_d8,
2573 }, {
2574 .eraseblocks = { {1024 * 1024, 1} },
2575 .block_erase = spi_block_erase_60,
2576 }, {
2577 .eraseblocks = { {1024 * 1024, 1} },
2578 .block_erase = spi_block_erase_c7,
2579 }
2580 },
hailfingerb9560ee2010-07-14 20:21:22 +00002581 .unlock = spi_disable_blockprotect,
hailfingerc7d06c62010-07-14 16:19:05 +00002582 .write = spi_chip_write_1,
mkarcher84fe8cb2010-07-10 19:34:15 +00002583 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00002584 .voltage = {2700, 3600},
mkarcherf6986732010-06-19 22:06:35 +00002585 },
2586
2587 {
hailfingerab07cbd2009-06-05 20:53:07 +00002588 .vendor = "Eon",
2589 .name = "EN25B05",
hailfingere1e41ea2011-07-27 07:13:06 +00002590 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00002591 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00002592 .model_id = EON_EN25B05,
hailfingerab07cbd2009-06-05 20:53:07 +00002593 .total_size = 64,
2594 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08002595 .feature_bits = FEATURE_UNBOUND_READ,
hailfingerab07cbd2009-06-05 20:53:07 +00002596 .tested = TEST_UNTESTED,
2597 .probe = probe_spi_rdid,
2598 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00002599 .block_erasers =
2600 {
2601 {
2602 .eraseblocks = {
2603 {4 * 1024, 2},
2604 {8 * 1024, 1},
2605 {16 * 1024, 1},
2606 {32 * 1024, 1},
2607 },
2608 .block_erase = spi_block_erase_d8,
2609 }, {
2610 .eraseblocks = { {64 * 1024, 1} },
2611 .block_erase = spi_block_erase_c7,
2612 }
2613 },
hailfingerb9560ee2010-07-14 20:21:22 +00002614 .unlock = spi_disable_blockprotect,
snelson2d471072010-01-09 05:30:14 +00002615 .write = spi_chip_write_256,
2616 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00002617 .voltage = {2700, 3600},
snelson2d471072010-01-09 05:30:14 +00002618 },
2619
2620 {
2621 .vendor = "Eon",
2622 .name = "EN25B05T",
hailfingere1e41ea2011-07-27 07:13:06 +00002623 .bustype = BUS_SPI,
snelson2d471072010-01-09 05:30:14 +00002624 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00002625 .model_id = EON_EN25B05,
snelson2d471072010-01-09 05:30:14 +00002626 .total_size = 64,
2627 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08002628 .feature_bits = FEATURE_UNBOUND_READ,
snelson2d471072010-01-09 05:30:14 +00002629 .tested = TEST_UNTESTED,
2630 .probe = probe_spi_rdid,
2631 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00002632 .block_erasers =
2633 {
2634 {
2635 .eraseblocks = {
2636 {32 * 1024, 1},
2637 {16 * 1024, 1},
2638 {8 * 1024, 1},
2639 {4 * 1024, 2},
2640 },
2641 .block_erase = spi_block_erase_d8,
2642 }, {
2643 .eraseblocks = { {64 * 1024, 1} },
2644 .block_erase = spi_block_erase_c7,
2645 }
2646 },
hailfingerb9560ee2010-07-14 20:21:22 +00002647 .unlock = spi_disable_blockprotect,
hailfingerab07cbd2009-06-05 20:53:07 +00002648 .write = spi_chip_write_256,
2649 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00002650 .voltage = {2700, 3600},
hailfingerab07cbd2009-06-05 20:53:07 +00002651 },
2652
2653 {
2654 .vendor = "Eon",
2655 .name = "EN25B10",
hailfingere1e41ea2011-07-27 07:13:06 +00002656 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00002657 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00002658 .model_id = EON_EN25B10,
hailfingerab07cbd2009-06-05 20:53:07 +00002659 .total_size = 128,
2660 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08002661 .feature_bits = FEATURE_UNBOUND_READ,
hailfingerab07cbd2009-06-05 20:53:07 +00002662 .tested = TEST_UNTESTED,
2663 .probe = probe_spi_rdid,
2664 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00002665 .block_erasers =
2666 {
2667 {
2668 .eraseblocks = {
2669 {4 * 1024, 2},
2670 {8 * 1024, 1},
2671 {16 * 1024, 1},
2672 {32 * 1024, 3},
2673 },
2674 .block_erase = spi_block_erase_d8,
2675 }, {
2676 .eraseblocks = { {128 * 1024, 1} },
2677 .block_erase = spi_block_erase_c7,
2678 }
2679 },
hailfingerb9560ee2010-07-14 20:21:22 +00002680 .unlock = spi_disable_blockprotect,
snelson2d471072010-01-09 05:30:14 +00002681 .write = spi_chip_write_256,
2682 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00002683 .voltage = {2700, 3600},
snelson2d471072010-01-09 05:30:14 +00002684 },
2685
2686 {
2687 .vendor = "Eon",
2688 .name = "EN25B10T",
hailfingere1e41ea2011-07-27 07:13:06 +00002689 .bustype = BUS_SPI,
snelson2d471072010-01-09 05:30:14 +00002690 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00002691 .model_id = EON_EN25B10,
snelson2d471072010-01-09 05:30:14 +00002692 .total_size = 128,
2693 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08002694 .feature_bits = FEATURE_UNBOUND_READ,
snelson2d471072010-01-09 05:30:14 +00002695 .tested = TEST_UNTESTED,
2696 .probe = probe_spi_rdid,
2697 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00002698 .block_erasers =
2699 {
2700 {
2701 .eraseblocks = {
2702 {32 * 1024, 3},
2703 {16 * 1024, 1},
2704 {8 * 1024, 1},
2705 {4 * 1024, 2},
2706 },
2707 .block_erase = spi_block_erase_d8,
2708 }, {
2709 .eraseblocks = { {128 * 1024, 1} },
2710 .block_erase = spi_block_erase_c7,
2711 }
2712 },
hailfingerb9560ee2010-07-14 20:21:22 +00002713 .unlock = spi_disable_blockprotect,
hailfingerab07cbd2009-06-05 20:53:07 +00002714 .write = spi_chip_write_256,
2715 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00002716 .voltage = {2700, 3600},
hailfingerab07cbd2009-06-05 20:53:07 +00002717 },
2718
2719 {
2720 .vendor = "Eon",
2721 .name = "EN25B20",
hailfingere1e41ea2011-07-27 07:13:06 +00002722 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00002723 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00002724 .model_id = EON_EN25B20,
hailfingerab07cbd2009-06-05 20:53:07 +00002725 .total_size = 256,
2726 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08002727 .feature_bits = FEATURE_UNBOUND_READ,
hailfingerab07cbd2009-06-05 20:53:07 +00002728 .tested = TEST_UNTESTED,
2729 .probe = probe_spi_rdid,
2730 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00002731 .block_erasers =
2732 {
2733 {
2734 .eraseblocks = {
2735 {4 * 1024, 2},
2736 {8 * 1024, 1},
2737 {16 * 1024, 1},
2738 {32 * 1024, 1},
2739 {64 * 1024, 3}
2740 },
2741 .block_erase = spi_block_erase_d8,
2742 }, {
2743 .eraseblocks = { {256 * 1024, 1} },
2744 .block_erase = spi_block_erase_c7,
2745 }
2746 },
hailfingerb9560ee2010-07-14 20:21:22 +00002747 .unlock = spi_disable_blockprotect,
snelson2d471072010-01-09 05:30:14 +00002748 .write = spi_chip_write_256,
2749 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00002750 .voltage = {2700, 3600},
snelson2d471072010-01-09 05:30:14 +00002751 },
2752
2753 {
2754 .vendor = "Eon",
2755 .name = "EN25B20T",
hailfingere1e41ea2011-07-27 07:13:06 +00002756 .bustype = BUS_SPI,
snelson2d471072010-01-09 05:30:14 +00002757 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00002758 .model_id = EON_EN25B20,
snelson2d471072010-01-09 05:30:14 +00002759 .total_size = 256,
2760 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08002761 .feature_bits = FEATURE_UNBOUND_READ,
snelson2d471072010-01-09 05:30:14 +00002762 .tested = TEST_UNTESTED,
2763 .probe = probe_spi_rdid,
2764 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00002765 .block_erasers =
2766 {
2767 {
2768 .eraseblocks = {
2769 {64 * 1024, 3},
2770 {32 * 1024, 1},
2771 {16 * 1024, 1},
2772 {8 * 1024, 1},
2773 {4 * 1024, 2},
2774 },
2775 .block_erase = spi_block_erase_d8,
2776 }, {
2777 .eraseblocks = { {256 * 1024, 1} },
2778 .block_erase = spi_block_erase_c7,
2779 }
2780 },
hailfingerb9560ee2010-07-14 20:21:22 +00002781 .unlock = spi_disable_blockprotect,
hailfingerab07cbd2009-06-05 20:53:07 +00002782 .write = spi_chip_write_256,
2783 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00002784 .voltage = {2700, 3600},
hailfingerab07cbd2009-06-05 20:53:07 +00002785 },
2786
2787 {
2788 .vendor = "Eon",
2789 .name = "EN25B40",
hailfingere1e41ea2011-07-27 07:13:06 +00002790 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00002791 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00002792 .model_id = EON_EN25B40,
hailfingerab07cbd2009-06-05 20:53:07 +00002793 .total_size = 512,
2794 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08002795 .feature_bits = FEATURE_UNBOUND_READ,
hailfingerab07cbd2009-06-05 20:53:07 +00002796 .tested = TEST_UNTESTED,
2797 .probe = probe_spi_rdid,
2798 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00002799 .block_erasers =
2800 {
2801 {
2802 .eraseblocks = {
2803 {4 * 1024, 2},
2804 {8 * 1024, 1},
2805 {16 * 1024, 1},
2806 {32 * 1024, 1},
2807 {64 * 1024, 7}
2808 },
2809 .block_erase = spi_block_erase_d8,
2810 }, {
2811 .eraseblocks = { {512 * 1024, 1} },
2812 .block_erase = spi_block_erase_c7,
2813 }
2814 },
hailfingerb9560ee2010-07-14 20:21:22 +00002815 .unlock = spi_disable_blockprotect,
snelson2d471072010-01-09 05:30:14 +00002816 .write = spi_chip_write_256,
2817 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00002818 .voltage = {2700, 3600},
snelson2d471072010-01-09 05:30:14 +00002819 },
2820
2821 {
2822 .vendor = "Eon",
2823 .name = "EN25B40T",
hailfingere1e41ea2011-07-27 07:13:06 +00002824 .bustype = BUS_SPI,
snelson2d471072010-01-09 05:30:14 +00002825 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00002826 .model_id = EON_EN25B40,
snelson2d471072010-01-09 05:30:14 +00002827 .total_size = 512,
2828 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08002829 .feature_bits = FEATURE_UNBOUND_READ,
snelson2d471072010-01-09 05:30:14 +00002830 .tested = TEST_UNTESTED,
2831 .probe = probe_spi_rdid,
2832 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00002833 .block_erasers =
2834 {
2835 {
2836 .eraseblocks = {
2837 {64 * 1024, 7},
2838 {32 * 1024, 1},
2839 {16 * 1024, 1},
2840 {8 * 1024, 1},
2841 {4 * 1024, 2},
2842 },
2843 .block_erase = spi_block_erase_d8,
2844 }, {
2845 .eraseblocks = { {512 * 1024, 1} },
2846 .block_erase = spi_block_erase_c7,
2847 }
2848 },
hailfingerb9560ee2010-07-14 20:21:22 +00002849 .unlock = spi_disable_blockprotect,
hailfingerab07cbd2009-06-05 20:53:07 +00002850 .write = spi_chip_write_256,
2851 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00002852 .voltage = {2700, 3600},
hailfingerab07cbd2009-06-05 20:53:07 +00002853 },
2854
2855 {
2856 .vendor = "Eon",
2857 .name = "EN25B80",
hailfingere1e41ea2011-07-27 07:13:06 +00002858 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00002859 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00002860 .model_id = EON_EN25B80,
hailfingerab07cbd2009-06-05 20:53:07 +00002861 .total_size = 1024,
2862 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08002863 .feature_bits = FEATURE_UNBOUND_READ,
hailfingerab07cbd2009-06-05 20:53:07 +00002864 .tested = TEST_UNTESTED,
2865 .probe = probe_spi_rdid,
2866 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00002867 .block_erasers =
2868 {
2869 {
2870 .eraseblocks = {
2871 {4 * 1024, 2},
2872 {8 * 1024, 1},
2873 {16 * 1024, 1},
2874 {32 * 1024, 1},
2875 {64 * 1024, 15}
2876 },
2877 .block_erase = spi_block_erase_d8,
2878 }, {
2879 .eraseblocks = { {1024 * 1024, 1} },
2880 .block_erase = spi_block_erase_c7,
2881 }
2882 },
hailfingerb9560ee2010-07-14 20:21:22 +00002883 .unlock = spi_disable_blockprotect,
snelson2d471072010-01-09 05:30:14 +00002884 .write = spi_chip_write_256,
2885 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00002886 .voltage = {2700, 3600},
snelson2d471072010-01-09 05:30:14 +00002887 },
2888
2889 {
2890 .vendor = "Eon",
2891 .name = "EN25B80T",
hailfingere1e41ea2011-07-27 07:13:06 +00002892 .bustype = BUS_SPI,
snelson2d471072010-01-09 05:30:14 +00002893 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00002894 .model_id = EON_EN25B80,
snelson2d471072010-01-09 05:30:14 +00002895 .total_size = 1024,
2896 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08002897 .feature_bits = FEATURE_UNBOUND_READ,
snelson2d471072010-01-09 05:30:14 +00002898 .tested = TEST_UNTESTED,
2899 .probe = probe_spi_rdid,
2900 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00002901 .block_erasers =
2902 {
2903 {
2904 .eraseblocks = {
2905 {64 * 1024, 15},
2906 {32 * 1024, 1},
2907 {16 * 1024, 1},
2908 {8 * 1024, 1},
2909 {4 * 1024, 2},
2910 },
2911 .block_erase = spi_block_erase_d8,
2912 }, {
2913 .eraseblocks = { {1024 * 1024, 1} },
2914 .block_erase = spi_block_erase_c7,
2915 }
2916 },
hailfingerb9560ee2010-07-14 20:21:22 +00002917 .unlock = spi_disable_blockprotect,
hailfingerab07cbd2009-06-05 20:53:07 +00002918 .write = spi_chip_write_256,
2919 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00002920 .voltage = {2700, 3600},
hailfingerab07cbd2009-06-05 20:53:07 +00002921 },
2922
2923 {
2924 .vendor = "Eon",
2925 .name = "EN25B16",
hailfingere1e41ea2011-07-27 07:13:06 +00002926 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00002927 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00002928 .model_id = EON_EN25B16,
hailfingerab07cbd2009-06-05 20:53:07 +00002929 .total_size = 2048,
2930 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08002931 .feature_bits = FEATURE_UNBOUND_READ,
hailfingerab07cbd2009-06-05 20:53:07 +00002932 .tested = TEST_UNTESTED,
2933 .probe = probe_spi_rdid,
2934 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00002935 .block_erasers =
2936 {
2937 {
2938 .eraseblocks = {
2939 {4 * 1024, 2},
2940 {8 * 1024, 1},
2941 {16 * 1024, 1},
2942 {32 * 1024, 1},
2943 {64 * 1024, 31},
2944 },
2945 .block_erase = spi_block_erase_d8,
2946 }, {
2947 .eraseblocks = { {2 * 1024 * 1024, 1} },
2948 .block_erase = spi_block_erase_c7,
2949 }
2950 },
hailfingerb9560ee2010-07-14 20:21:22 +00002951 .unlock = spi_disable_blockprotect,
snelson2d471072010-01-09 05:30:14 +00002952 .write = spi_chip_write_256,
2953 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00002954 .voltage = {2700, 3600},
snelson2d471072010-01-09 05:30:14 +00002955 },
2956
2957 {
2958 .vendor = "Eon",
2959 .name = "EN25B16T",
hailfingere1e41ea2011-07-27 07:13:06 +00002960 .bustype = BUS_SPI,
snelson2d471072010-01-09 05:30:14 +00002961 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00002962 .model_id = EON_EN25B16,
snelson2d471072010-01-09 05:30:14 +00002963 .total_size = 2048,
2964 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08002965 .feature_bits = FEATURE_UNBOUND_READ,
snelson2d471072010-01-09 05:30:14 +00002966 .tested = TEST_UNTESTED,
2967 .probe = probe_spi_rdid,
2968 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00002969 .block_erasers =
2970 {
2971 {
2972 .eraseblocks = {
2973 {64 * 1024, 31},
2974 {32 * 1024, 1},
2975 {16 * 1024, 1},
2976 {8 * 1024, 1},
2977 {4 * 1024, 2},
2978 },
2979 .block_erase = spi_block_erase_d8,
2980 }, {
2981 .eraseblocks = { {2 * 1024 * 1024, 1} },
2982 .block_erase = spi_block_erase_c7,
2983 }
2984 },
hailfingerb9560ee2010-07-14 20:21:22 +00002985 .unlock = spi_disable_blockprotect,
hailfingerab07cbd2009-06-05 20:53:07 +00002986 .write = spi_chip_write_256,
2987 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00002988 .voltage = {2700, 3600},
hailfingerab07cbd2009-06-05 20:53:07 +00002989 },
2990
2991 {
2992 .vendor = "Eon",
2993 .name = "EN25B32",
hailfingere1e41ea2011-07-27 07:13:06 +00002994 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00002995 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00002996 .model_id = EON_EN25B32,
hailfingerab07cbd2009-06-05 20:53:07 +00002997 .total_size = 4096,
2998 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08002999 .feature_bits = FEATURE_UNBOUND_READ,
hailfingerab07cbd2009-06-05 20:53:07 +00003000 .tested = TEST_UNTESTED,
3001 .probe = probe_spi_rdid,
3002 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00003003 .block_erasers =
3004 {
3005 {
3006 .eraseblocks = {
3007 {4 * 1024, 2},
3008 {8 * 1024, 1},
3009 {16 * 1024, 1},
3010 {32 * 1024, 1},
3011 {64 * 1024, 63},
3012 },
3013 .block_erase = spi_block_erase_d8,
3014 }, {
3015 .eraseblocks = { {4 * 1024 * 1024, 1} },
3016 .block_erase = spi_block_erase_c7,
3017 }
3018 },
hailfingerb9560ee2010-07-14 20:21:22 +00003019 .unlock = spi_disable_blockprotect,
snelson2d471072010-01-09 05:30:14 +00003020 .write = spi_chip_write_256,
3021 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00003022 .voltage = {2700, 3600},
snelson2d471072010-01-09 05:30:14 +00003023 },
3024
3025 {
3026 .vendor = "Eon",
3027 .name = "EN25B32T",
hailfingere1e41ea2011-07-27 07:13:06 +00003028 .bustype = BUS_SPI,
snelson2d471072010-01-09 05:30:14 +00003029 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00003030 .model_id = EON_EN25B32,
snelson2d471072010-01-09 05:30:14 +00003031 .total_size = 4096,
3032 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08003033 .feature_bits = FEATURE_UNBOUND_READ,
snelson2d471072010-01-09 05:30:14 +00003034 .tested = TEST_UNTESTED,
3035 .probe = probe_spi_rdid,
3036 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00003037 .block_erasers =
3038 {
3039 {
3040 .eraseblocks = {
3041 {64 * 1024, 63},
3042 {32 * 1024, 1},
3043 {16 * 1024, 1},
3044 {8 * 1024, 1},
3045 {4 * 1024, 2},
3046 },
3047 .block_erase = spi_block_erase_d8,
3048 }, {
3049 .eraseblocks = { {4 * 1024 * 1024, 1} },
3050 .block_erase = spi_block_erase_c7,
3051 }
3052 },
hailfingerb9560ee2010-07-14 20:21:22 +00003053 .unlock = spi_disable_blockprotect,
hailfingerab07cbd2009-06-05 20:53:07 +00003054 .write = spi_chip_write_256,
3055 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00003056 .voltage = {2700, 3600},
hailfingerab07cbd2009-06-05 20:53:07 +00003057 },
3058
3059 {
3060 .vendor = "Eon",
3061 .name = "EN25B64",
hailfingere1e41ea2011-07-27 07:13:06 +00003062 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00003063 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00003064 .model_id = EON_EN25B64,
hailfingerab07cbd2009-06-05 20:53:07 +00003065 .total_size = 8192,
3066 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08003067 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
hailfingerab07cbd2009-06-05 20:53:07 +00003068 .tested = TEST_UNTESTED,
3069 .probe = probe_spi_rdid,
3070 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00003071 .block_erasers =
3072 {
3073 {
3074 .eraseblocks = {
3075 {4 * 1024, 2},
3076 {8 * 1024, 1},
3077 {16 * 1024, 1},
3078 {32 * 1024, 1},
3079 {64 * 1024, 127},
3080 },
3081 .block_erase = spi_block_erase_d8,
3082 }, {
3083 .eraseblocks = { {8 * 1024 * 1024, 1} },
3084 .block_erase = spi_block_erase_c7,
3085 }
3086 },
hailfingerb9560ee2010-07-14 20:21:22 +00003087 .unlock = spi_disable_blockprotect,
snelson2d471072010-01-09 05:30:14 +00003088 .write = spi_chip_write_256,
3089 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00003090 .voltage = {2700, 3600},
snelson2d471072010-01-09 05:30:14 +00003091 },
3092
3093 {
3094 .vendor = "Eon",
3095 .name = "EN25B64T",
hailfingere1e41ea2011-07-27 07:13:06 +00003096 .bustype = BUS_SPI,
snelson2d471072010-01-09 05:30:14 +00003097 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00003098 .model_id = EON_EN25B64,
snelson2d471072010-01-09 05:30:14 +00003099 .total_size = 8192,
3100 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08003101 .feature_bits = FEATURE_UNBOUND_READ,
snelson2d471072010-01-09 05:30:14 +00003102 .tested = TEST_UNTESTED,
3103 .probe = probe_spi_rdid,
3104 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00003105 .block_erasers =
3106 {
3107 {
3108 .eraseblocks = {
3109 {64 * 1024, 127},
3110 {32 * 1024, 1},
3111 {16 * 1024, 1},
3112 {8 * 1024, 1},
3113 {4 * 1024, 2},
3114 },
3115 .block_erase = spi_block_erase_d8,
3116 }, {
3117 .eraseblocks = { {8 * 1024 * 1024, 1} },
3118 .block_erase = spi_block_erase_c7,
3119 }
3120 },
hailfingerb9560ee2010-07-14 20:21:22 +00003121 .unlock = spi_disable_blockprotect,
hailfingerab07cbd2009-06-05 20:53:07 +00003122 .write = spi_chip_write_256,
3123 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00003124 .voltage = {2700, 3600},
hailfingerab07cbd2009-06-05 20:53:07 +00003125 },
3126
3127 {
David Hendrickse185bf22011-05-24 15:34:18 -07003128 /* Note: EN25Q16 is an evil twin which shares the model ID
3129 but has different write protection capabilities */
hailfingerab07cbd2009-06-05 20:53:07 +00003130 .vendor = "Eon",
hailfinger77c5d932009-06-15 12:10:57 +00003131 .name = "EN25D16",
hailfingere1e41ea2011-07-27 07:13:06 +00003132 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00003133 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00003134 .model_id = EON_EN25D16,
hailfinger77c5d932009-06-15 12:10:57 +00003135 .total_size = 2048,
3136 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07003137 /* OTP: D16 512B/Q16 128B total; enter 0x3A */
3138 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
hailfinger77c5d932009-06-15 12:10:57 +00003139 .tested = TEST_UNTESTED,
3140 .probe = probe_spi_rdid,
3141 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00003142 .block_erasers =
3143 {
3144 {
3145 .eraseblocks = { {4 * 1024, 512} },
3146 .block_erase = spi_block_erase_20,
3147 }, {
3148 .eraseblocks = { {64 * 1024, 32} },
3149 .block_erase = spi_block_erase_d8,
3150 }, {
3151 .eraseblocks = { {64 * 1024, 32} },
3152 .block_erase = spi_block_erase_52,
3153 }, {
3154 .eraseblocks = { {2 * 1024 * 1024, 1} },
3155 .block_erase = spi_block_erase_60,
3156 }, {
3157 .eraseblocks = { {2 * 1024 * 1024, 1} },
3158 .block_erase = spi_block_erase_c7,
3159 }
3160 },
hailfingerb9560ee2010-07-14 20:21:22 +00003161 .unlock = spi_disable_blockprotect,
hailfinger77c5d932009-06-15 12:10:57 +00003162 .write = spi_chip_write_256,
3163 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00003164 .voltage = {2700, 3600},
hailfinger77c5d932009-06-15 12:10:57 +00003165 },
3166
3167 {
3168 .vendor = "Eon",
3169 .name = "EN25F05",
hailfingere1e41ea2011-07-27 07:13:06 +00003170 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00003171 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00003172 .model_id = EON_EN25F05,
hailfinger77c5d932009-06-15 12:10:57 +00003173 .total_size = 64,
3174 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08003175 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
hailfinger77c5d932009-06-15 12:10:57 +00003176 .tested = TEST_UNTESTED,
3177 .probe = probe_spi_rdid,
3178 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00003179 .block_erasers =
3180 {
3181 {
3182 .eraseblocks = { {4 * 1024, 16} },
3183 .block_erase = spi_block_erase_20,
3184 }, {
3185 .eraseblocks = { {32 * 1024, 2} },
3186 .block_erase = spi_block_erase_d8,
3187 }, {
3188 .eraseblocks = { {32 * 1024, 2} },
3189 .block_erase = spi_block_erase_52,
3190 }, {
3191 .eraseblocks = { {64 * 1024, 1} },
3192 .block_erase = spi_block_erase_60,
3193 }, {
3194 .eraseblocks = { {64 * 1024, 1} },
3195 .block_erase = spi_block_erase_c7,
3196 }
3197 },
hailfingerb9560ee2010-07-14 20:21:22 +00003198 .unlock = spi_disable_blockprotect,
hailfinger77c5d932009-06-15 12:10:57 +00003199 .write = spi_chip_write_256,
3200 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00003201 .voltage = {2700, 3600},
hailfinger77c5d932009-06-15 12:10:57 +00003202 },
3203
3204 {
3205 .vendor = "Eon",
3206 .name = "EN25F10",
hailfingere1e41ea2011-07-27 07:13:06 +00003207 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00003208 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00003209 .model_id = EON_EN25F10,
hailfinger77c5d932009-06-15 12:10:57 +00003210 .total_size = 128,
3211 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08003212 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
hailfinger77c5d932009-06-15 12:10:57 +00003213 .tested = TEST_UNTESTED,
3214 .probe = probe_spi_rdid,
3215 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00003216 .block_erasers =
3217 {
3218 {
3219 .eraseblocks = { {4 * 1024, 32} },
3220 .block_erase = spi_block_erase_20,
3221 }, {
3222 .eraseblocks = { {32 * 1024, 4} },
3223 .block_erase = spi_block_erase_d8,
3224 }, {
3225 .eraseblocks = { {32 * 1024, 4} },
3226 .block_erase = spi_block_erase_52,
3227 }, {
3228 .eraseblocks = { {128 * 1024, 1} },
3229 .block_erase = spi_block_erase_60,
3230 }, {
3231 .eraseblocks = { {128 * 1024, 1} },
3232 .block_erase = spi_block_erase_c7,
3233 }
3234 },
hailfingerb9560ee2010-07-14 20:21:22 +00003235 .unlock = spi_disable_blockprotect,
hailfinger77c5d932009-06-15 12:10:57 +00003236 .write = spi_chip_write_256,
3237 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00003238 .voltage = {2700, 3600},
hailfinger77c5d932009-06-15 12:10:57 +00003239 },
3240
3241 {
3242 .vendor = "Eon",
3243 .name = "EN25F20",
hailfingere1e41ea2011-07-27 07:13:06 +00003244 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00003245 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00003246 .model_id = EON_EN25F20,
hailfinger77c5d932009-06-15 12:10:57 +00003247 .total_size = 256,
3248 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08003249 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
hailfinger77c5d932009-06-15 12:10:57 +00003250 .tested = TEST_UNTESTED,
3251 .probe = probe_spi_rdid,
3252 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00003253 .block_erasers =
3254 {
3255 {
3256 .eraseblocks = { {4 * 1024, 64} },
3257 .block_erase = spi_block_erase_20,
3258 }, {
3259 .eraseblocks = { {64 * 1024, 4} },
3260 .block_erase = spi_block_erase_d8,
3261 }, {
3262 .eraseblocks = { {64 * 1024, 4} },
3263 .block_erase = spi_block_erase_52,
3264 }, {
3265 .eraseblocks = { {256 * 1024, 1} },
3266 .block_erase = spi_block_erase_60,
3267 }, {
3268 .eraseblocks = { {256 * 1024, 1} },
3269 .block_erase = spi_block_erase_c7,
3270 }
3271 },
hailfingerb9560ee2010-07-14 20:21:22 +00003272 .unlock = spi_disable_blockprotect,
hailfinger77c5d932009-06-15 12:10:57 +00003273 .write = spi_chip_write_256,
3274 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00003275 .voltage = {2700, 3600},
hailfinger77c5d932009-06-15 12:10:57 +00003276 },
3277
3278 {
3279 .vendor = "Eon",
hailfingerab07cbd2009-06-05 20:53:07 +00003280 .name = "EN25F40",
hailfingere1e41ea2011-07-27 07:13:06 +00003281 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00003282 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00003283 .model_id = EON_EN25F40,
hailfingerab07cbd2009-06-05 20:53:07 +00003284 .total_size = 512,
3285 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08003286 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
hailfinger27a59132009-06-22 10:06:28 +00003287 .tested = TEST_OK_PROBE,
hailfingerab07cbd2009-06-05 20:53:07 +00003288 .probe = probe_spi_rdid,
3289 .probe_timing = TIMING_ZERO,
snelson1c03aa12009-12-23 17:05:59 +00003290 .block_erasers =
3291 {
3292 {
snelson2d471072010-01-09 05:30:14 +00003293 .eraseblocks = { {4 * 1024, 128} },
snelson1c03aa12009-12-23 17:05:59 +00003294 .block_erase = spi_block_erase_20,
3295 }, {
snelson2d471072010-01-09 05:30:14 +00003296 .eraseblocks = { {64 * 1024, 8} },
snelson1c03aa12009-12-23 17:05:59 +00003297 .block_erase = spi_block_erase_d8,
3298 }, {
snelson2d471072010-01-09 05:30:14 +00003299 .eraseblocks = { {512 * 1024, 1} },
snelson1c03aa12009-12-23 17:05:59 +00003300 .block_erase = spi_block_erase_60,
3301 }, {
snelson2d471072010-01-09 05:30:14 +00003302 .eraseblocks = { {512 * 1024, 1} },
snelson1c03aa12009-12-23 17:05:59 +00003303 .block_erase = spi_block_erase_c7,
3304 },
3305 },
hailfingerb9560ee2010-07-14 20:21:22 +00003306 .unlock = spi_disable_blockprotect,
hailfingerab07cbd2009-06-05 20:53:07 +00003307 .write = spi_chip_write_256,
3308 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00003309 .voltage = {2700, 3600},
Louis Yung-Chieh Lod6572b32011-05-24 16:28:27 +08003310 .wp = &wp_w25,
hailfingerab07cbd2009-06-05 20:53:07 +00003311 },
3312
3313 {
3314 .vendor = "Eon",
3315 .name = "EN25F80",
hailfingere1e41ea2011-07-27 07:13:06 +00003316 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00003317 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00003318 .model_id = EON_EN25F80,
hailfingerab07cbd2009-06-05 20:53:07 +00003319 .total_size = 1024,
3320 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08003321 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
3322 .tested = TEST_OK_PREWU,
hailfingerab07cbd2009-06-05 20:53:07 +00003323 .probe = probe_spi_rdid,
3324 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00003325 .block_erasers =
3326 {
3327 {
3328 .eraseblocks = { {4 * 1024, 256} },
3329 .block_erase = spi_block_erase_20,
3330 }, {
3331 .eraseblocks = { {64 * 1024, 16} },
3332 .block_erase = spi_block_erase_d8,
3333 }, {
3334 .eraseblocks = { {1024 * 1024, 1} },
3335 .block_erase = spi_block_erase_60,
3336 }, {
3337 .eraseblocks = { {1024 * 1024, 1} },
3338 .block_erase = spi_block_erase_c7,
3339 }
3340 },
hailfingerb9560ee2010-07-14 20:21:22 +00003341 .unlock = spi_disable_blockprotect,
hailfingerab07cbd2009-06-05 20:53:07 +00003342 .write = spi_chip_write_256,
3343 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00003344 .voltage = {2700, 3600},
hailfingerab07cbd2009-06-05 20:53:07 +00003345 },
3346
3347 {
3348 .vendor = "Eon",
3349 .name = "EN25F16",
hailfingere1e41ea2011-07-27 07:13:06 +00003350 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00003351 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00003352 .model_id = EON_EN25F16,
hailfingerab07cbd2009-06-05 20:53:07 +00003353 .total_size = 2048,
3354 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08003355 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
3356 .tested = TEST_OK_PREWU,
hailfingerab07cbd2009-06-05 20:53:07 +00003357 .probe = probe_spi_rdid,
3358 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00003359 .block_erasers =
3360 {
3361 {
3362 .eraseblocks = { {4 * 1024, 512} },
3363 .block_erase = spi_block_erase_20,
3364 }, {
3365 .eraseblocks = { {64 * 1024, 32} },
3366 .block_erase = spi_block_erase_d8,
3367 }, {
3368 .eraseblocks = { {2 * 1024 * 1024, 1} },
3369 .block_erase = spi_block_erase_60,
3370 }, {
3371 .eraseblocks = { {2 * 1024 * 1024, 1} },
3372 .block_erase = spi_block_erase_c7,
3373 }
3374 },
hailfingerb9560ee2010-07-14 20:21:22 +00003375 .unlock = spi_disable_blockprotect,
hailfingerab07cbd2009-06-05 20:53:07 +00003376 .write = spi_chip_write_256,
3377 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00003378 .voltage = {2700, 3600},
hailfingerab07cbd2009-06-05 20:53:07 +00003379 },
3380
3381 {
hailfinger77c5d932009-06-15 12:10:57 +00003382 .vendor = "Eon",
3383 .name = "EN25F32",
hailfingere1e41ea2011-07-27 07:13:06 +00003384 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00003385 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00003386 .model_id = EON_EN25F32,
hailfinger77c5d932009-06-15 12:10:57 +00003387 .total_size = 4096,
3388 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08003389 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
hailfinger77c5d932009-06-15 12:10:57 +00003390 .tested = TEST_UNTESTED,
3391 .probe = probe_spi_rdid,
3392 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00003393 .block_erasers =
3394 {
3395 {
3396 .eraseblocks = { {4 * 1024, 1024} },
3397 .block_erase = spi_block_erase_20,
3398 }, {
3399 .eraseblocks = { {64 * 1024, 64} },
3400 .block_erase = spi_block_erase_d8,
3401 }, {
3402 .eraseblocks = { {4 * 1024 * 1024, 1} },
3403 .block_erase = spi_block_erase_60,
3404 }, {
3405 .eraseblocks = { {4 * 1024 * 1024, 1} },
3406 .block_erase = spi_block_erase_c7,
3407 }
3408 },
hailfingerb9560ee2010-07-14 20:21:22 +00003409 .unlock = spi_disable_blockprotect,
hailfinger77c5d932009-06-15 12:10:57 +00003410 .write = spi_chip_write_256,
3411 .read = spi_chip_read,
3412 },
3413
3414 {
snelson2b18d0f2010-03-05 08:44:11 +00003415 .vendor = "Eon",
David Hendrickse185bf22011-05-24 15:34:18 -07003416 .name = "EN25Q40",
hailfingere1e41ea2011-07-27 07:13:06 +00003417 .bustype = BUS_SPI,
David Hendrickse185bf22011-05-24 15:34:18 -07003418 .manufacture_id = EON_ID_NOPREFIX,
3419 .model_id = EON_EN25Q40,
3420 .total_size = 512,
3421 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08003422 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
David Hendrickse185bf22011-05-24 15:34:18 -07003423 .tested = TEST_UNTESTED,
3424 .probe = probe_spi_rdid,
3425 .probe_timing = TIMING_ZERO,
3426 .block_erasers =
3427 {
3428 {
3429 .eraseblocks = { {4 * 1024, 128} },
3430 .block_erase = spi_block_erase_20,
3431 }, {
3432 .eraseblocks = { {64 * 1024, 8} },
3433 .block_erase = spi_block_erase_d8,
3434 }, {
3435 .eraseblocks = { {512 * 1024, 1} },
3436 .block_erase = spi_block_erase_60,
3437 }, {
3438 .eraseblocks = { {512 * 1024, 1} },
3439 .block_erase = spi_block_erase_c7,
3440 }
3441 },
3442 .unlock = spi_disable_blockprotect,
3443 .write = spi_chip_write_256,
3444 .read = spi_chip_read,
3445 .wp = &wp_w25,
3446 },
3447
3448 {
3449 .vendor = "Eon",
3450 .name = "EN25Q80(A)",
hailfingere1e41ea2011-07-27 07:13:06 +00003451 .bustype = BUS_SPI,
David Hendrickse185bf22011-05-24 15:34:18 -07003452 .manufacture_id = EON_ID_NOPREFIX,
3453 .model_id = EON_EN25Q80,
3454 .total_size = 1024,
3455 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08003456 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
David Hendrickse185bf22011-05-24 15:34:18 -07003457 .tested = TEST_UNTESTED,
3458 .probe = probe_spi_rdid,
3459 .probe_timing = TIMING_ZERO,
3460 .block_erasers =
3461 {
3462 {
3463 .eraseblocks = { {4 * 1024, 256} },
3464 .block_erase = spi_block_erase_20,
3465 }, {
3466 .eraseblocks = { {64 * 1024, 16} },
3467 .block_erase = spi_block_erase_d8,
3468 }, {
3469 .eraseblocks = { {1024 * 1024, 1} },
3470 .block_erase = spi_block_erase_60,
3471 }, {
3472 .eraseblocks = { {1024 * 1024, 1} },
3473 .block_erase = spi_block_erase_c7,
3474 }
3475 },
3476 .unlock = spi_disable_blockprotect,
3477 .write = spi_chip_write_256,
3478 .read = spi_chip_read,
3479 .wp = &wp_w25,
3480 },
3481
3482 {
3483 .vendor = "Eon",
3484 .name = "EN25Q32(A)(B)",
hailfingere1e41ea2011-07-27 07:13:06 +00003485 .bustype = BUS_SPI,
David Hendrickse185bf22011-05-24 15:34:18 -07003486 .manufacture_id = EON_ID_NOPREFIX,
3487 .model_id = EON_EN25Q32,
3488 .total_size = 4096,
3489 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08003490 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
David Hendrickse185bf22011-05-24 15:34:18 -07003491 .tested = TEST_UNTESTED,
3492 .probe = probe_spi_rdid,
3493 .probe_timing = TIMING_ZERO,
3494 .block_erasers =
3495 {
3496 {
3497 .eraseblocks = { {4 * 1024, 1024} },
3498 .block_erase = spi_block_erase_20,
3499 }, {
3500 .eraseblocks = { {64 * 1024, 64} },
3501 .block_erase = spi_block_erase_d8,
3502 }, {
3503 .eraseblocks = { {4 * 1024 * 1024, 1} },
3504 .block_erase = spi_block_erase_60,
3505 }, {
3506 .eraseblocks = { {4 * 1024 * 1024, 1} },
3507 .block_erase = spi_block_erase_c7,
3508 }
3509 },
3510 .unlock = spi_disable_blockprotect,
3511 .write = spi_chip_write_256,
3512 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00003513 .voltage = {2700, 3600},
David Hendrickse185bf22011-05-24 15:34:18 -07003514 .wp = &wp_w25,
3515 },
3516
3517 {
3518 .vendor = "Eon",
3519 .name = "EN25Q64",
hailfingere1e41ea2011-07-27 07:13:06 +00003520 .bustype = BUS_SPI,
David Hendrickse185bf22011-05-24 15:34:18 -07003521 .manufacture_id = EON_ID_NOPREFIX,
3522 .model_id = EON_EN25Q64,
3523 .total_size = 8192,
3524 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08003525 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
David Hendrickse185bf22011-05-24 15:34:18 -07003526 .tested = TEST_UNTESTED,
3527 .probe = probe_spi_rdid,
3528 .probe_timing = TIMING_ZERO,
3529 .block_erasers =
3530 {
3531 {
3532 .eraseblocks = { {4 * 1024, 2048} },
3533 .block_erase = spi_block_erase_20,
3534 }, {
3535 .eraseblocks = { {64 * 1024, 128} },
3536 .block_erase = spi_block_erase_d8,
3537 }, {
3538 .eraseblocks = { {8 * 1024 * 1024, 1} },
3539 .block_erase = spi_block_erase_60,
3540 }, {
3541 .eraseblocks = { {8 * 1024 * 1024, 1} },
3542 .block_erase = spi_block_erase_c7,
3543 }
3544 },
3545 .unlock = spi_disable_blockprotect,
3546 .write = spi_chip_write_256,
3547 .read = spi_chip_read,
3548 .wp = &wp_w25,
3549 },
3550
3551 {
3552 .vendor = "Eon",
3553 .name = "EN25Q128",
hailfingere1e41ea2011-07-27 07:13:06 +00003554 .bustype = BUS_SPI,
David Hendrickse185bf22011-05-24 15:34:18 -07003555 .manufacture_id = EON_ID_NOPREFIX,
3556 .model_id = EON_EN25Q128,
3557 .total_size = 16384,
3558 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08003559 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
David Hendrickse185bf22011-05-24 15:34:18 -07003560 .tested = TEST_UNTESTED,
3561 .probe = probe_spi_rdid,
3562 .probe_timing = TIMING_ZERO,
3563 .block_erasers =
3564 {
3565 {
3566 .eraseblocks = { {4 * 1024, 4096} },
3567 .block_erase = spi_block_erase_20,
3568 }, {
3569 .eraseblocks = { {64 * 1024, 256} },
3570 .block_erase = spi_block_erase_d8,
3571 }, {
3572 .eraseblocks = { {16 * 1024 * 1024, 1} },
3573 .block_erase = spi_block_erase_60,
3574 }, {
3575 .eraseblocks = { {16 * 1024 * 1024, 1} },
3576 .block_erase = spi_block_erase_c7,
3577 }
3578 },
3579 .unlock = spi_disable_blockprotect,
3580 .write = spi_chip_write_256,
3581 .read = spi_chip_read,
3582 .wp = &wp_w25,
stepanaa1b6a22008-12-08 18:15:10 +00003583 },
3584
hailfinger286829b2009-01-08 03:40:17 +00003585 {
snelson2b18d0f2010-03-05 08:44:11 +00003586 .vendor = "Eon",
stefanct5d10cff2011-07-24 22:21:57 +00003587 .name = "EN25Q40",
hailfingere1e41ea2011-07-27 07:13:06 +00003588 .bustype = BUS_SPI,
stefanct5d10cff2011-07-24 22:21:57 +00003589 .manufacture_id = EON_ID_NOPREFIX,
3590 .model_id = EON_EN25Q40,
3591 .total_size = 512,
3592 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07003593 /* OTP: 256B total; enter 0x3A */
3594 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
stefanct5d10cff2011-07-24 22:21:57 +00003595 .tested = TEST_UNTESTED,
3596 .probe = probe_spi_rdid,
3597 .probe_timing = TIMING_ZERO,
3598 .block_erasers =
3599 {
3600 {
3601 .eraseblocks = { {4 * 1024, 128} },
3602 .block_erase = spi_block_erase_20,
3603 }, {
3604 .eraseblocks = { {64 * 1024, 8} },
3605 .block_erase = spi_block_erase_d8,
3606 }, {
3607 .eraseblocks = { {512 * 1024, 1} },
3608 .block_erase = spi_block_erase_60,
3609 }, {
3610 .eraseblocks = { {512 * 1024, 1} },
3611 .block_erase = spi_block_erase_c7,
3612 }
3613 },
3614 .unlock = spi_disable_blockprotect,
3615 .write = spi_chip_write_256,
3616 .read = spi_chip_read,
3617 .voltage = {2700, 3600},
3618 },
3619
3620 {
3621 .vendor = "Eon",
3622 .name = "EN25Q80(A)",
hailfingere1e41ea2011-07-27 07:13:06 +00003623 .bustype = BUS_SPI,
stefanct5d10cff2011-07-24 22:21:57 +00003624 .manufacture_id = EON_ID_NOPREFIX,
3625 .model_id = EON_EN25Q80,
3626 .total_size = 1024,
3627 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07003628 /* OTP: 256B total; enter 0x3A */
3629 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
stefanct5d10cff2011-07-24 22:21:57 +00003630 .tested = TEST_UNTESTED,
3631 .probe = probe_spi_rdid,
3632 .probe_timing = TIMING_ZERO,
3633 .block_erasers =
3634 {
3635 {
3636 .eraseblocks = { {4 * 1024, 256} },
3637 .block_erase = spi_block_erase_20,
3638 }, {
3639 .eraseblocks = { {64 * 1024, 16} },
3640 .block_erase = spi_block_erase_d8,
3641 }, {
3642 .eraseblocks = { {1024 * 1024, 1} },
3643 .block_erase = spi_block_erase_60,
3644 }, {
3645 .eraseblocks = { {1024 * 1024, 1} },
3646 .block_erase = spi_block_erase_c7,
3647 }
3648 },
3649 .unlock = spi_disable_blockprotect,
3650 .write = spi_chip_write_256,
3651 .read = spi_chip_read,
3652 .voltage = {2700, 3600},
3653 },
3654
3655 {
3656 .vendor = "Eon",
3657 .name = "EN25Q32(A/B)",
hailfingere1e41ea2011-07-27 07:13:06 +00003658 .bustype = BUS_SPI,
stefanct5d10cff2011-07-24 22:21:57 +00003659 .manufacture_id = EON_ID_NOPREFIX,
3660 .model_id = EON_EN25Q32,
3661 .total_size = 4096,
3662 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07003663 /* OTP: 512B total; enter 0x3A */
3664 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
stefanct5d10cff2011-07-24 22:21:57 +00003665 .tested = TEST_UNTESTED,
3666 .probe = probe_spi_rdid,
3667 .probe_timing = TIMING_ZERO,
3668 .block_erasers =
3669 {
3670 {
3671 .eraseblocks = { {4 * 1024, 1024} },
3672 .block_erase = spi_block_erase_20,
3673 }, {
3674 .eraseblocks = { {64 * 1024, 64} },
3675 .block_erase = spi_block_erase_d8,
3676 }, {
3677 .eraseblocks = { {4 * 1024 * 1024, 1} },
3678 .block_erase = spi_block_erase_60,
3679 }, {
3680 .eraseblocks = { {4 * 1024 * 1024, 1} },
3681 .block_erase = spi_block_erase_c7,
3682 }
3683 },
3684 .unlock = spi_disable_blockprotect,
3685 .write = spi_chip_write_256,
3686 .read = spi_chip_read,
3687 .voltage = {2700, 3600},
3688 },
3689
3690 {
3691 .vendor = "Eon",
3692 .name = "EN25Q64",
hailfingere1e41ea2011-07-27 07:13:06 +00003693 .bustype = BUS_SPI,
stefanct5d10cff2011-07-24 22:21:57 +00003694 .manufacture_id = EON_ID_NOPREFIX,
3695 .model_id = EON_EN25Q64,
3696 .total_size = 8192,
3697 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07003698 /* OTP: 512B total; enter 0x3A */
3699 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
stefanct5d10cff2011-07-24 22:21:57 +00003700 .tested = TEST_UNTESTED,
3701 .probe = probe_spi_rdid,
3702 .probe_timing = TIMING_ZERO,
3703 .block_erasers =
3704 {
3705 {
3706 .eraseblocks = { {4 * 1024, 2048} },
3707 .block_erase = spi_block_erase_20,
3708 }, {
3709 .eraseblocks = { {64 * 1024, 128} },
3710 .block_erase = spi_block_erase_d8,
3711 }, {
3712 .eraseblocks = { {8 * 1024 * 1024, 1} },
3713 .block_erase = spi_block_erase_60,
3714 }, {
3715 .eraseblocks = { {8 * 1024 * 1024, 1} },
3716 .block_erase = spi_block_erase_c7,
3717 }
3718 },
3719 .unlock = spi_disable_blockprotect,
3720 .write = spi_chip_write_256,
3721 .read = spi_chip_read,
3722 .voltage = {2700, 3600},
3723 },
3724
3725 {
3726 .vendor = "Eon",
3727 .name = "EN25Q128",
hailfingere1e41ea2011-07-27 07:13:06 +00003728 .bustype = BUS_SPI,
stefanct5d10cff2011-07-24 22:21:57 +00003729 .manufacture_id = EON_ID_NOPREFIX,
3730 .model_id = EON_EN25Q128,
3731 .total_size = 16384,
3732 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07003733 /* OTP: 512B total; enter 0x3A */
3734 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
stefanct5d10cff2011-07-24 22:21:57 +00003735 .tested = TEST_UNTESTED,
3736 .probe = probe_spi_rdid,
3737 .probe_timing = TIMING_ZERO,
3738 .block_erasers =
3739 {
3740 {
3741 .eraseblocks = { {4 * 1024, 4096} },
3742 .block_erase = spi_block_erase_20,
3743 }, {
3744 .eraseblocks = { {64 * 1024, 256} },
3745 .block_erase = spi_block_erase_d8,
3746 }, {
3747 .eraseblocks = { {16 * 1024 * 1024, 1} },
3748 .block_erase = spi_block_erase_60,
3749 }, {
3750 .eraseblocks = { {16 * 1024 * 1024, 1} },
3751 .block_erase = spi_block_erase_c7,
3752 }
3753 },
3754 .unlock = spi_disable_blockprotect,
3755 .write = spi_chip_write_256,
3756 .read = spi_chip_read,
3757 },
3758
3759 {
3760 .vendor = "Eon",
3761 .name = "EN25QH16",
hailfingere1e41ea2011-07-27 07:13:06 +00003762 .bustype = BUS_SPI,
stefanct5d10cff2011-07-24 22:21:57 +00003763 .manufacture_id = EON_ID_NOPREFIX,
3764 .model_id = EON_EN25QH16,
3765 .total_size = 2048,
3766 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07003767 /* supports SFDP */
3768 /* OTP: 512B total; enter 0x3A */
3769 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
stefanct5d10cff2011-07-24 22:21:57 +00003770 .tested = TEST_UNTESTED,
3771 .probe = probe_spi_rdid,
3772 .probe_timing = TIMING_ZERO,
3773 .block_erasers =
3774 {
3775 {
3776 .eraseblocks = { {4 * 1024, 512} },
3777 .block_erase = spi_block_erase_20,
3778 }, {
3779 .eraseblocks = { {64 * 1024, 32} },
3780 .block_erase = spi_block_erase_d8,
3781 }, {
3782 .eraseblocks = { {1024 * 2048, 1} },
3783 .block_erase = spi_block_erase_60,
3784 }, {
3785 .eraseblocks = { {1024 * 2048, 1} },
3786 .block_erase = spi_block_erase_c7,
3787 }
3788 },
3789 .unlock = spi_disable_blockprotect,
3790 .write = spi_chip_write_256,
3791 .read = spi_chip_read,
3792 .voltage = {2700, 3600},
3793 },
Marc Jonesb2f90022014-04-29 17:37:23 -06003794 {
3795 .vendor = "Eon",
3796 .name = "EN25S64",
3797 .bustype = BUS_SPI,
3798 .manufacture_id = EON_ID_NOPREFIX,
3799 .model_id = EON_EN25S64,
3800 .total_size = 8192,
3801 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07003802 /* FIXME: add FEATURE_QPI removed */
Marc Jonesb2f90022014-04-29 17:37:23 -06003803 /* OTP: 512B total; enter 0x3A */
Stefan Tauner9816fc82016-08-12 15:47:49 -07003804 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
David Hendricks488cf072015-11-23 16:45:07 -08003805 .tested = TEST_OK_PREWU,
Marc Jonesb2f90022014-04-29 17:37:23 -06003806 .probe = probe_spi_rdid,
3807 .probe_timing = TIMING_ZERO,
3808 .block_erasers = {
3809 {
3810 .eraseblocks = { {4 * 1024, 2048} },
3811 .block_erase = spi_block_erase_20,
3812 }, {
3813 .eraseblocks = { {64 * 1024, 128} },
3814 .block_erase = spi_block_erase_d8,
3815 }, {
3816 .eraseblocks = { {8192 * 1024, 1} },
3817 .block_erase = spi_block_erase_60,
3818 }, {
3819 .eraseblocks = { {8192 * 1024, 1} },
3820 .block_erase = spi_block_erase_c7,
3821 }
3822 },
3823 .unlock = spi_disable_blockprotect,
3824 .write = spi_chip_write_256,
3825 .read = spi_chip_read,
3826 .voltage = {1650, 1950},
Marc Jones51c8a162014-05-06 15:02:14 -06003827 .wp = &wp_w25,
Marc Jonesb2f90022014-04-29 17:37:23 -06003828 },
stefanct5d10cff2011-07-24 22:21:57 +00003829
3830 {
3831 .vendor = "Eon",
snelson2b18d0f2010-03-05 08:44:11 +00003832 .name = "EN29F010",
hailfingere1e41ea2011-07-27 07:13:06 +00003833 .bustype = BUS_PARALLEL,
snelson2b18d0f2010-03-05 08:44:11 +00003834 .manufacture_id = EON_ID,
mhmd3c80cd2010-09-15 23:31:03 +00003835 .model_id = EON_EN29F010,
snelson2b18d0f2010-03-05 08:44:11 +00003836 .total_size = 128,
3837 .page_size = 128,
3838 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
hailfingerd217d122010-10-08 18:52:29 +00003839 .tested = TEST_OK_PRE,
snelson2b18d0f2010-03-05 08:44:11 +00003840 .probe = probe_jedec,
3841 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3842 .block_erasers =
3843 {
3844 {
3845 .eraseblocks = { {16 * 1024, 8} },
3846 .block_erase = erase_sector_jedec,
3847 },
3848 {
3849 .eraseblocks = { {128 * 1024, 1} },
3850 .block_erase = erase_chip_block_jedec,
3851 },
3852 },
3853 .write = write_jedec_1,
3854 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00003855 .voltage = {4500, 5500},
snelson2b18d0f2010-03-05 08:44:11 +00003856 },
3857
3858 {
hailfinger61958912010-07-28 22:20:20 +00003859 .vendor = "Eon",
stepanaa1b6a22008-12-08 18:15:10 +00003860 .name = "EN29F002(A)(N)B",
hailfingere1e41ea2011-07-27 07:13:06 +00003861 .bustype = BUS_PARALLEL,
stepanaa1b6a22008-12-08 18:15:10 +00003862 .manufacture_id = EON_ID,
mhmd3c80cd2010-09-15 23:31:03 +00003863 .model_id = EON_EN29F002B,
stepanaa1b6a22008-12-08 18:15:10 +00003864 .total_size = 256,
3865 .page_size = 256,
snelsonc6855342010-01-28 23:55:12 +00003866 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
stefanct98d917c2011-10-21 12:33:07 +00003867 .tested = TEST_OK_PREW,
stepanaa1b6a22008-12-08 18:15:10 +00003868 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00003869 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelson1c03aa12009-12-23 17:05:59 +00003870 .block_erasers =
3871 {
3872 {
Simon Glass8dc82732013-07-16 10:13:51 -06003873 .eraseblocks = {
snelson1c03aa12009-12-23 17:05:59 +00003874 {16 * 1024, 1},
mkarcher8dc09ff2010-03-13 23:47:09 +00003875 {8 * 1024, 2},
3876 {32 * 1024, 1},
3877 {64 * 1024, 3},
snelson1c03aa12009-12-23 17:05:59 +00003878 },
3879 .block_erase = erase_sector_jedec,
3880 }, {
3881 .eraseblocks = { {256 * 1024, 1} },
3882 .block_erase = erase_chip_block_jedec,
3883 },
3884 },
hailfingerfff99532009-11-27 17:49:42 +00003885 .write = write_jedec_1,
stepanaa1b6a22008-12-08 18:15:10 +00003886 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00003887 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00003888 },
3889
3890 {
hailfinger61958912010-07-28 22:20:20 +00003891 .vendor = "Eon",
stepanaa1b6a22008-12-08 18:15:10 +00003892 .name = "EN29F002(A)(N)T",
hailfingere1e41ea2011-07-27 07:13:06 +00003893 .bustype = BUS_PARALLEL,
stepanaa1b6a22008-12-08 18:15:10 +00003894 .manufacture_id = EON_ID,
mhmd3c80cd2010-09-15 23:31:03 +00003895 .model_id = EON_EN29F002T,
stepanaa1b6a22008-12-08 18:15:10 +00003896 .total_size = 256,
3897 .page_size = 256,
snelsonc6855342010-01-28 23:55:12 +00003898 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
hailfingerd217d122010-10-08 18:52:29 +00003899 .tested = TEST_OK_PR,
stepanaa1b6a22008-12-08 18:15:10 +00003900 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00003901 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelson1c03aa12009-12-23 17:05:59 +00003902 .block_erasers =
3903 {
3904 {
Simon Glass8dc82732013-07-16 10:13:51 -06003905 .eraseblocks = {
snelson1c03aa12009-12-23 17:05:59 +00003906 {64 * 1024, 3},
mkarcher8dc09ff2010-03-13 23:47:09 +00003907 {32 * 1024, 1},
3908 {8 * 1024, 2},
3909 {16 * 1024, 1},
snelson1c03aa12009-12-23 17:05:59 +00003910 },
3911 .block_erase = erase_sector_jedec,
3912 }, {
3913 .eraseblocks = { {256 * 1024, 1} },
3914 .block_erase = erase_chip_block_jedec,
3915 },
3916 },
hailfingerfff99532009-11-27 17:49:42 +00003917 .write = write_jedec_1,
stepanaa1b6a22008-12-08 18:15:10 +00003918 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00003919 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00003920 },
3921
3922 {
3923 .vendor = "Fujitsu",
3924 .name = "MBM29F004BC",
hailfingere1e41ea2011-07-27 07:13:06 +00003925 .bustype = BUS_PARALLEL,
stepanaa1b6a22008-12-08 18:15:10 +00003926 .manufacture_id = FUJITSU_ID,
mhmd3c80cd2010-09-15 23:31:03 +00003927 .model_id = FUJITSU_MBM29F004BC,
stepanaa1b6a22008-12-08 18:15:10 +00003928 .total_size = 512,
3929 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00003930 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
stepanaa1b6a22008-12-08 18:15:10 +00003931 .tested = TEST_UNTESTED,
3932 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00003933 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelson1c03aa12009-12-23 17:05:59 +00003934 .block_erasers =
3935 {
3936 {
Simon Glass8dc82732013-07-16 10:13:51 -06003937 .eraseblocks = {
snelson1c03aa12009-12-23 17:05:59 +00003938 {16 * 1024, 1},
3939 {8 * 1024, 2},
3940 {32 * 1024, 1},
3941 {64 * 1024, 7},
3942 },
snelsonc6855342010-01-28 23:55:12 +00003943 .block_erase = erase_sector_jedec,
snelson1c03aa12009-12-23 17:05:59 +00003944 }, {
3945 .eraseblocks = { {512 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +00003946 .block_erase = erase_chip_block_jedec,
snelson1c03aa12009-12-23 17:05:59 +00003947 },
3948 },
stepanaa1b6a22008-12-08 18:15:10 +00003949 .write = NULL,
3950 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00003951 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00003952 },
3953
3954 {
3955 .vendor = "Fujitsu",
3956 .name = "MBM29F004TC",
hailfingere1e41ea2011-07-27 07:13:06 +00003957 .bustype = BUS_PARALLEL,
stepanaa1b6a22008-12-08 18:15:10 +00003958 .manufacture_id = FUJITSU_ID,
mhmd3c80cd2010-09-15 23:31:03 +00003959 .model_id = FUJITSU_MBM29F004TC,
stepanaa1b6a22008-12-08 18:15:10 +00003960 .total_size = 512,
3961 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00003962 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
stepanaa1b6a22008-12-08 18:15:10 +00003963 .tested = TEST_UNTESTED,
3964 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00003965 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelson1c03aa12009-12-23 17:05:59 +00003966 .block_erasers =
3967 {
3968 {
Simon Glass8dc82732013-07-16 10:13:51 -06003969 .eraseblocks = {
snelson1c03aa12009-12-23 17:05:59 +00003970 {64 * 1024, 7},
3971 {32 * 1024, 1},
3972 {8 * 1024, 2},
3973 {16 * 1024, 1},
3974 },
snelsonc6855342010-01-28 23:55:12 +00003975 .block_erase = erase_sector_jedec,
snelson1c03aa12009-12-23 17:05:59 +00003976 }, {
3977 .eraseblocks = { {512 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +00003978 .block_erase = erase_chip_block_jedec,
snelson1c03aa12009-12-23 17:05:59 +00003979 },
3980 },
stepanaa1b6a22008-12-08 18:15:10 +00003981 .write = NULL,
3982 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00003983 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00003984 },
3985
3986 {
snelsonc6855342010-01-28 23:55:12 +00003987 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
stepanaa1b6a22008-12-08 18:15:10 +00003988 .vendor = "Fujitsu",
3989 .name = "MBM29F400BC",
hailfingere1e41ea2011-07-27 07:13:06 +00003990 .bustype = BUS_PARALLEL,
stepanaa1b6a22008-12-08 18:15:10 +00003991 .manufacture_id = FUJITSU_ID,
mhmd3c80cd2010-09-15 23:31:03 +00003992 .model_id = FUJITSU_MBM29F400BC,
stepanaa1b6a22008-12-08 18:15:10 +00003993 .total_size = 512,
3994 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00003995 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
hailfinger86bf3b52010-10-13 21:49:30 +00003996 .tested = TEST_UNTESTED,
stepanaa1b6a22008-12-08 18:15:10 +00003997 .probe = probe_m29f400bt,
uwe37f43422011-06-19 17:23:55 +00003998 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
snelson1c03aa12009-12-23 17:05:59 +00003999 .block_erasers =
4000 {
4001 {
Simon Glass8dc82732013-07-16 10:13:51 -06004002 .eraseblocks = {
snelson1c03aa12009-12-23 17:05:59 +00004003 {16 * 1024, 1},
4004 {8 * 1024, 2},
4005 {32 * 1024, 1},
4006 {64 * 1024, 7},
4007 },
4008 .block_erase = block_erase_m29f400bt,
4009 }, {
4010 .eraseblocks = { {512 * 1024, 1} },
4011 .block_erase = block_erase_chip_m29f400bt,
4012 },
4013 },
hailfinger86bf3b52010-10-13 21:49:30 +00004014 .write = write_m29f400bt,
stepanaa1b6a22008-12-08 18:15:10 +00004015 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +00004016 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
stepanaa1b6a22008-12-08 18:15:10 +00004017 },
4018
hailfinger286829b2009-01-08 03:40:17 +00004019 {
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07004020 .vendor = "GigaDevice",
4021 .name = "GD25Q20",
4022 .bustype = BUS_SPI,
4023 .manufacture_id = GIGADEVICE_ID,
4024 .model_id = GIGADEVICE_GD25Q20,
4025 .total_size = 256,
4026 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08004027 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07004028 .tested = TEST_UNTESTED,
4029 .probe = probe_spi_rdid,
4030 .probe_timing = TIMING_ZERO,
4031 .block_erasers =
4032 {
4033 {
4034 .eraseblocks = { {4 * 1024, 64} },
4035 .block_erase = spi_block_erase_20,
4036 }, {
4037 .eraseblocks = { {32 * 1024, 8} },
4038 .block_erase = spi_block_erase_52,
4039 }, {
4040 .eraseblocks = { {64 * 1024, 4} },
4041 .block_erase = spi_block_erase_d8,
4042 }, {
4043 .eraseblocks = { {256 * 1024, 1} },
4044 .block_erase = spi_block_erase_60,
4045 }, {
4046 .eraseblocks = { {256 * 1024, 1} },
4047 .block_erase = spi_block_erase_c7,
4048 }
4049 },
4050 .unlock = spi_disable_blockprotect,
4051 .write = spi_chip_write_256,
4052 .read = spi_chip_read,
4053 .voltage = {2700, 3600},
4054 },
4055
4056 {
4057 .vendor = "GigaDevice",
4058 .name = "GD25Q40",
4059 .bustype = BUS_SPI,
4060 .manufacture_id = GIGADEVICE_ID,
4061 .model_id = GIGADEVICE_GD25Q40,
4062 .total_size = 512,
4063 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08004064 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07004065 .tested = TEST_UNTESTED,
4066 .probe = probe_spi_rdid,
4067 .probe_timing = TIMING_ZERO,
4068 .block_erasers =
4069 {
4070 {
4071 .eraseblocks = { {4 * 1024, 128} },
4072 .block_erase = spi_block_erase_20,
4073 }, {
4074 .eraseblocks = { {32 * 1024, 16} },
4075 .block_erase = spi_block_erase_52,
4076 }, {
4077 .eraseblocks = { {64 * 1024, 8} },
4078 .block_erase = spi_block_erase_d8,
4079 }, {
4080 .eraseblocks = { {512 * 1024, 1} },
4081 .block_erase = spi_block_erase_60,
4082 }, {
4083 .eraseblocks = { {512 * 1024, 1} },
4084 .block_erase = spi_block_erase_c7,
4085 }
4086 },
4087 .unlock = spi_disable_blockprotect,
4088 .write = spi_chip_write_256,
4089 .read = spi_chip_read,
4090 .voltage = {2700, 3600},
4091 },
4092
4093 {
4094 .vendor = "GigaDevice",
David Schneider59543cd2016-04-27 02:11:00 -07004095 .name = "GD25LQ40",
4096 .bustype = BUS_SPI,
4097 .manufacture_id = GIGADEVICE_ID,
4098 .model_id = GIGADEVICE_GD25LQ40,
4099 .total_size = 512,
4100 .page_size = 256,
4101 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
4102 .tested = TEST_UNTESTED,
4103 .probe = probe_spi_rdid,
4104 .probe_timing = TIMING_ZERO,
4105 .block_erasers =
4106 {
4107 {
4108 .eraseblocks = { {4 * 1024, 128} },
4109 .block_erase = spi_block_erase_20,
4110 }, {
4111 .eraseblocks = { {32 * 1024, 16} },
4112 .block_erase = spi_block_erase_52,
4113 }, {
4114 .eraseblocks = { {64 * 1024, 8} },
4115 .block_erase = spi_block_erase_d8,
4116 }, {
4117 .eraseblocks = { {512 * 1024, 1} },
4118 .block_erase = spi_block_erase_60,
4119 }, {
4120 .eraseblocks = { {512 * 1024, 1} },
4121 .block_erase = spi_block_erase_c7,
4122 }
4123 },
4124 .unlock = spi_disable_blockprotect,
4125 .write = spi_chip_write_256,
4126 .read = spi_chip_read,
4127 .voltage = {1650, 1950},
4128 },
4129
4130 {
4131 .vendor = "GigaDevice",
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07004132 .name = "GD25Q80",
4133 .bustype = BUS_SPI,
4134 .manufacture_id = GIGADEVICE_ID,
4135 .model_id = GIGADEVICE_GD25Q80,
4136 .total_size = 1024,
4137 .page_size = 256,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07004138 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
Stefan Tauner9816fc82016-08-12 15:47:49 -07004139 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
David Hendricks488cf072015-11-23 16:45:07 -08004140 .tested = TEST_OK_PREWU,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07004141 .probe = probe_spi_rdid,
4142 .probe_timing = TIMING_ZERO,
4143 .block_erasers =
4144 {
4145 {
4146 .eraseblocks = { {4 * 1024, 256} },
4147 .block_erase = spi_block_erase_20,
4148 }, {
4149 .eraseblocks = { {32 * 1024, 32} },
4150 .block_erase = spi_block_erase_52,
4151 }, {
4152 .eraseblocks = { {64 * 1024, 16} },
4153 .block_erase = spi_block_erase_d8,
4154 }, {
4155 .eraseblocks = { {1024 * 1024, 1} },
4156 .block_erase = spi_block_erase_60,
4157 }, {
4158 .eraseblocks = { {1024 * 1024, 1} },
4159 .block_erase = spi_block_erase_c7,
4160 }
4161 },
4162 .unlock = spi_disable_blockprotect,
4163 .write = spi_chip_write_256,
4164 .read = spi_chip_read,
4165 .voltage = {2700, 3600},
4166 },
4167
4168 {
4169 .vendor = "GigaDevice",
4170 .name = "GD25Q16",
4171 .bustype = BUS_SPI,
4172 .manufacture_id = GIGADEVICE_ID,
4173 .model_id = GIGADEVICE_GD25Q16,
4174 .total_size = 2048,
4175 .page_size = 256,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07004176 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
Stefan Tauner9816fc82016-08-12 15:47:49 -07004177 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07004178 .tested = TEST_UNTESTED,
4179 .probe = probe_spi_rdid,
4180 .probe_timing = TIMING_ZERO,
4181 .block_erasers =
4182 {
4183 {
4184 .eraseblocks = { {4 * 1024, 512} },
4185 .block_erase = spi_block_erase_20,
4186 }, {
4187 .eraseblocks = { {32 * 1024, 64} },
4188 .block_erase = spi_block_erase_52,
4189 }, {
4190 .eraseblocks = { {64 * 1024, 32} },
4191 .block_erase = spi_block_erase_d8,
4192 }, {
4193 .eraseblocks = { {2 * 1024 * 1024, 1} },
4194 .block_erase = spi_block_erase_60,
4195 }, {
4196 .eraseblocks = { {2 * 1024 * 1024, 1} },
4197 .block_erase = spi_block_erase_c7,
4198 }
4199 },
4200 .unlock = spi_disable_blockprotect,
4201 .write = spi_chip_write_256,
4202 .read = spi_chip_read,
4203 .voltage = {2700, 3600},
4204 },
4205
4206 {
4207 .vendor = "GigaDevice",
4208 .name = "GD25Q32",
4209 .bustype = BUS_SPI,
4210 .manufacture_id = GIGADEVICE_ID,
4211 .model_id = GIGADEVICE_GD25Q32,
4212 .total_size = 4096,
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, 1024} },
4223 .block_erase = spi_block_erase_20,
4224 }, {
4225 .eraseblocks = { {32 * 1024, 128} },
4226 .block_erase = spi_block_erase_52,
4227 }, {
4228 .eraseblocks = { {64 * 1024, 64} },
4229 .block_erase = spi_block_erase_d8,
4230 }, {
4231 .eraseblocks = { {4 * 1024 * 1024, 1} },
4232 .block_erase = spi_block_erase_60,
4233 }, {
4234 .eraseblocks = { {4 * 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,
David Hendricksaf3944a2014-07-28 18:37:40 -07004241 .wp = &wp_generic,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07004242 .voltage = {2700, 3600},
4243 },
4244
4245 {
4246 .vendor = "GigaDevice",
4247 .name = "GD25Q64",
4248 .bustype = BUS_SPI,
4249 .manufacture_id = GIGADEVICE_ID,
4250 .model_id = GIGADEVICE_GD25Q64,
4251 .total_size = 8192,
4252 .page_size = 256,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07004253 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
Stefan Tauner9816fc82016-08-12 15:47:49 -07004254 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
David Hendricks488cf072015-11-23 16:45:07 -08004255 .tested = TEST_OK_PREWU,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07004256 .probe = probe_spi_rdid,
4257 .probe_timing = TIMING_ZERO,
4258 .block_erasers =
4259 {
4260 {
4261 .eraseblocks = { {4 * 1024, 2048} },
4262 .block_erase = spi_block_erase_20,
4263 }, {
4264 .eraseblocks = { {32 * 1024, 256} },
4265 .block_erase = spi_block_erase_52,
4266 }, {
4267 .eraseblocks = { {64 * 1024, 128} },
4268 .block_erase = spi_block_erase_d8,
4269 }, {
4270 .eraseblocks = { {8 * 1024 * 1024, 1} },
4271 .block_erase = spi_block_erase_60,
4272 }, {
4273 .eraseblocks = { {8 * 1024 * 1024, 1} },
4274 .block_erase = spi_block_erase_c7,
4275 }
4276 },
4277 .unlock = spi_disable_blockprotect,
4278 .write = spi_chip_write_256,
4279 .read = spi_chip_read,
4280 .wp = &wp_w25,
4281 },
4282
4283 {
David Hendricksf5c122d2016-03-14 15:46:04 -07004284 /*
Stefan Tauner9816fc82016-08-12 15:47:49 -07004285 * TODO: There is a GD25Q128B without QPI support which can
4286 * be differentiated using SFDP, but for now we only care
4287 * about the GD25Q128C.
David Hendricksf5c122d2016-03-14 15:46:04 -07004288 */
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07004289 .vendor = "GigaDevice",
Martin Roth4216ba32017-05-10 21:20:47 -06004290 .name = "GD25Q127C/GD25Q128C",
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07004291 .bustype = BUS_SPI,
4292 .manufacture_id = GIGADEVICE_ID,
4293 .model_id = GIGADEVICE_GD25Q128,
4294 .total_size = 16384,
4295 .page_size = 256,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07004296 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
Stefan Tauner9816fc82016-08-12 15:47:49 -07004297 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
David Hendricksf5c122d2016-03-14 15:46:04 -07004298 .tested = TEST_OK_PREWU,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07004299 .probe = probe_spi_rdid,
4300 .probe_timing = TIMING_ZERO,
4301 .block_erasers =
4302 {
4303 {
4304 .eraseblocks = { {4 * 1024, 4096} },
4305 .block_erase = spi_block_erase_20,
4306 }, {
4307 .eraseblocks = { {32 * 1024, 512} },
4308 .block_erase = spi_block_erase_52,
4309 }, {
4310 .eraseblocks = { {64 * 1024, 256} },
4311 .block_erase = spi_block_erase_d8,
4312 }, {
4313 .eraseblocks = { {16 * 1024 * 1024, 1} },
4314 .block_erase = spi_block_erase_60,
4315 }, {
4316 .eraseblocks = { {16 * 1024 * 1024, 1} },
4317 .block_erase = spi_block_erase_c7,
4318 }
4319 },
4320 .unlock = spi_disable_blockprotect,
4321 .write = spi_chip_write_256,
4322 .read = spi_chip_read,
Martin Roth95785bd2017-05-09 23:47:20 -06004323 .wp = &wp_w25,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07004324 },
4325
4326 {
Duncan Laurie0c383552019-03-16 12:35:16 -07004327 .vendor = "GigaDevice",
4328 .name = "GD25Q256D",
4329 .bustype = BUS_SPI,
4330 .manufacture_id = GIGADEVICE_ID,
4331 .model_id = GIGADEVICE_GD25Q256D,
4332 .total_size = 32768,
4333 .page_size = 256,
4334 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP | FEATURE_4BA_SUPPORT,
4335 .four_bytes_addr_funcs =
4336 {
4337 .set_4ba = spi_enter_4ba_b7_we, /* enter 4-bytes addressing mode by CMD B7 + WREN */
4338 .read_nbyte = spi_nbyte_read_4ba_direct, /* read directly from any mode, no need to enter 4ba */
4339 .program_byte = spi_byte_program_4ba, /* write from 4-bytes addressing mode */
4340 .program_nbyte = spi_nbyte_program_4ba /* write from 4-bytes addressing mode */
4341 },
4342 .tested = TEST_OK_PREWU,
4343 .probe = probe_spi_rdid,
4344 .probe_timing = TIMING_ZERO,
4345 .block_erasers =
4346 {
4347 {
4348 .eraseblocks = { {4 * 1024, 8192} },
4349 .block_erase = spi_block_erase_20_4ba, /* erases 4k from 4-bytes addressing mode */
4350 }, {
4351 .eraseblocks = { {32 * 1024, 1024} },
4352 .block_erase = spi_block_erase_52_4ba, /* erases 32k from 4-bytes addressing mode */
4353 }, {
4354 .eraseblocks = { {64 * 1024, 512} },
4355 .block_erase = spi_block_erase_d8_4ba, /* erases 64k from 4-bytes addressing mode */
4356 }, {
4357 .eraseblocks = { {32 * 1024 * 1024, 1} },
4358 .block_erase = spi_block_erase_60,
4359 }, {
4360 .eraseblocks = { {32 * 1024 * 1024, 1} },
4361 .block_erase = spi_block_erase_c7,
4362 }
4363 },
4364 .unlock = spi_disable_blockprotect,
4365 .write = spi_chip_write_256,
4366 .read = spi_chip_read,
4367 .voltage = {2700, 3600},
4368 .wp = &wp_w25q_large,
4369 },
4370
4371 {
hailfinger286829b2009-01-08 03:40:17 +00004372 .vendor = "Fujitsu",
4373 .name = "MBM29F400TC",
hailfingere1e41ea2011-07-27 07:13:06 +00004374 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00004375 .manufacture_id = FUJITSU_ID,
mhmd3c80cd2010-09-15 23:31:03 +00004376 .model_id = FUJITSU_MBM29F400TC,
hailfinger286829b2009-01-08 03:40:17 +00004377 .total_size = 512,
4378 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00004379 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
hailfinger286829b2009-01-08 03:40:17 +00004380 .tested = TEST_UNTESTED,
4381 .probe = probe_m29f400bt,
uwe37f43422011-06-19 17:23:55 +00004382 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
snelson1c03aa12009-12-23 17:05:59 +00004383 .block_erasers =
4384 {
4385 {
Simon Glass8dc82732013-07-16 10:13:51 -06004386 .eraseblocks = {
snelson1c03aa12009-12-23 17:05:59 +00004387 {64 * 1024, 7},
4388 {32 * 1024, 1},
4389 {8 * 1024, 2},
4390 {16 * 1024, 1},
4391 },
4392 .block_erase = block_erase_m29f400bt,
4393 }, {
4394 .eraseblocks = { {512 * 1024, 1} },
4395 .block_erase = block_erase_chip_m29f400bt,
4396 },
4397 },
hailfingerfa513302010-07-16 22:07:20 +00004398 .write = write_m29f400bt,
hailfinger23060112009-05-08 12:49:03 +00004399 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +00004400 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
stepanaa1b6a22008-12-08 18:15:10 +00004401 },
4402
hailfinger286829b2009-01-08 03:40:17 +00004403 {
Bryan Freed9a0051f2012-05-22 16:06:09 -07004404 .vendor = "GigaDevice",
4405 .name = "GD25LQ32",
4406 .bustype = BUS_SPI,
4407 .manufacture_id = GIGADEVICE_ID,
4408 .model_id = GIGADEVICE_GD25LQ32,
4409 .total_size = 4096,
4410 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08004411 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
4412 .tested = TEST_OK_PREWU,
Bryan Freed9a0051f2012-05-22 16:06:09 -07004413 .probe = probe_spi_rdid,
4414 .probe_timing = TIMING_ZERO,
4415 .block_erasers =
4416 {
4417 {
4418 .eraseblocks = { {4 * 1024, 1024} },
4419 .block_erase = spi_block_erase_20,
4420 }, {
4421 .eraseblocks = { {32 * 1024, 128} },
4422 .block_erase = spi_block_erase_52,
4423 }, {
4424 .eraseblocks = { {64 * 1024, 64} },
4425 .block_erase = spi_block_erase_d8,
4426 }, {
4427 .eraseblocks = { {4 * 1024 * 1024, 1} },
4428 .block_erase = spi_block_erase_60,
4429 }, {
4430 .eraseblocks = { {4 * 1024 * 1024, 1} },
4431 .block_erase = spi_block_erase_c7,
4432 }
4433 },
4434 .unlock = spi_disable_blockprotect,
4435 .write = spi_chip_write_256,
4436 .read = spi_chip_read,
4437 .voltage = {1700, 1950},
4438 .wp = &wp_w25,
4439 },
4440
4441 {
Marc Jonesb18734f2014-04-03 16:19:47 -06004442 .vendor = "GigaDevice",
4443 .name = "GD25LQ64",
4444 .bustype = BUS_SPI,
4445 .manufacture_id = GIGADEVICE_ID,
4446 .model_id = GIGADEVICE_GD25LQ64,
4447 .total_size = 8192,
4448 .page_size = 256,
Marc Jonesb18734f2014-04-03 16:19:47 -06004449 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
Stefan Tauner9816fc82016-08-12 15:47:49 -07004450 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
David Hendricks488cf072015-11-23 16:45:07 -08004451 .tested = TEST_OK_PREWU,
Marc Jonesb18734f2014-04-03 16:19:47 -06004452 .probe = probe_spi_rdid,
4453 .probe_timing = TIMING_ZERO,
4454 .block_erasers =
4455 {
4456 {
4457 .eraseblocks = { {4 * 1024, 2048} },
4458 .block_erase = spi_block_erase_20,
4459 }, {
4460 .eraseblocks = { {32 * 1024, 256} },
4461 .block_erase = spi_block_erase_52,
4462 }, {
4463 .eraseblocks = { {64 * 1024, 128} },
4464 .block_erase = spi_block_erase_d8,
4465 }, {
4466 .eraseblocks = { {8 * 1024 * 1024, 1} },
4467 .block_erase = spi_block_erase_60,
4468 }, {
4469 .eraseblocks = { {8 * 1024 * 1024, 1} },
4470 .block_erase = spi_block_erase_c7,
4471 }
4472 },
4473 .unlock = spi_disable_blockprotect,
4474 .write = spi_chip_write_256,
4475 .read = spi_chip_read,
4476 .wp = &wp_w25,
4477 },
4478
Furquan Shaikh62cd8102016-07-17 23:04:06 -07004479 {
4480 .vendor = "GigaDevice",
Aaron Durbin6c957d72018-08-20 09:31:01 -06004481 .name = "GD25LQ128C/GD25LQ128D",
Furquan Shaikh62cd8102016-07-17 23:04:06 -07004482 .bustype = BUS_SPI,
4483 .manufacture_id = GIGADEVICE_ID,
Aaron Durbin6c957d72018-08-20 09:31:01 -06004484 .model_id = GIGADEVICE_GD25LQ128CD,
Furquan Shaikh62cd8102016-07-17 23:04:06 -07004485 .total_size = 16384,
4486 .page_size = 256,
4487 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
4488 .tested = TEST_OK_PREWU,
4489 .probe = probe_spi_rdid,
4490 .probe_timing = TIMING_ZERO,
4491 .block_erasers =
4492 {
4493 {
4494 .eraseblocks = { {4 * 1024, 4096} },
4495 .block_erase = spi_block_erase_20,
4496 }, {
4497 .eraseblocks = { {32 * 1024, 512} },
4498 .block_erase = spi_block_erase_52,
4499 }, {
4500 .eraseblocks = { {64 * 1024, 256} },
4501 .block_erase = spi_block_erase_d8,
4502 }, {
4503 .eraseblocks = { {16 * 1024 * 1024, 1} },
4504 .block_erase = spi_block_erase_60,
4505 }, {
4506 .eraseblocks = { {16 * 1024 * 1024, 1} },
4507 .block_erase = spi_block_erase_c7,
4508 }
4509 },
4510 .unlock = spi_disable_blockprotect,
4511 .write = spi_chip_write_256,
4512 .read = spi_chip_read,
4513 .wp = &wp_generic,
4514 },
4515
Marc Jonesb18734f2014-04-03 16:19:47 -06004516 {
hailfingerc6950ad2010-06-21 16:12:22 +00004517 .vendor = "Hyundai",
4518 .name = "HY29F002T",
hailfingere1e41ea2011-07-27 07:13:06 +00004519 .bustype = BUS_PARALLEL,
hailfingerc6950ad2010-06-21 16:12:22 +00004520 .manufacture_id = HYUNDAI_ID,
mhmd3c80cd2010-09-15 23:31:03 +00004521 .model_id = HYUNDAI_HY29F002T,
hailfingerc6950ad2010-06-21 16:12:22 +00004522 .total_size = 256,
4523 .page_size = 256 * 1024,
4524 .feature_bits = FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */
hailfingerd217d122010-10-08 18:52:29 +00004525 .tested = TEST_OK_PRE,
hailfingerc6950ad2010-06-21 16:12:22 +00004526 .probe = probe_jedec,
4527 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
4528 .block_erasers =
4529 {
4530 {
4531 .eraseblocks = {
4532 {64 * 1024, 3},
4533 {32 * 1024, 1},
4534 {8 * 1024, 2},
4535 {16 * 1024, 1},
4536 },
4537 .block_erase = erase_sector_jedec,
4538 }, {
4539 .eraseblocks = { {256 * 1024, 1} },
4540 .block_erase = erase_chip_block_jedec,
4541 },
4542 },
4543 .write = write_jedec_1,
4544 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +00004545 .voltage = {4750, 5250}, /* 4.75-5.25V for type -45, others 4.5-5.5V */
hailfingerc6950ad2010-06-21 16:12:22 +00004546 },
4547
4548 {
4549 .vendor = "Hyundai",
4550 .name = "HY29F002B",
hailfingere1e41ea2011-07-27 07:13:06 +00004551 .bustype = BUS_PARALLEL,
hailfingerc6950ad2010-06-21 16:12:22 +00004552 .manufacture_id = HYUNDAI_ID,
mhmd3c80cd2010-09-15 23:31:03 +00004553 .model_id = HYUNDAI_HY29F002B,
hailfingerc6950ad2010-06-21 16:12:22 +00004554 .total_size = 256,
4555 .page_size = 256 * 1024,
4556 .feature_bits = FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */
4557 .tested = TEST_UNTESTED,
4558 .probe = probe_jedec,
4559 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
4560 .block_erasers =
4561 {
4562 {
4563 .eraseblocks = {
4564 {16 * 1024, 1},
4565 {8 * 1024, 2},
4566 {32 * 1024, 1},
4567 {64 * 1024, 3},
4568 },
4569 .block_erase = erase_sector_jedec,
4570 }, {
4571 .eraseblocks = { {256 * 1024, 1} },
4572 .block_erase = erase_chip_block_jedec,
4573 },
4574 },
4575 .write = write_jedec_1,
4576 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +00004577 .voltage = {4750, 5250}, /* 4.75-5.25V for type -45, others 4.5-5.5V */
hailfingerc6950ad2010-06-21 16:12:22 +00004578 },
4579
4580 {
mhme8e87912010-09-16 00:51:51 +00004581 .vendor = "Hyundai",
4582 .name = "HY29F040A",
hailfingere1e41ea2011-07-27 07:13:06 +00004583 .bustype = BUS_PARALLEL,
mhme8e87912010-09-16 00:51:51 +00004584 .manufacture_id = HYUNDAI_ID,
4585 .model_id = HYUNDAI_HY29F040A,
4586 .total_size = 512,
4587 .page_size = 64 * 1024,
4588 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
4589 .tested = TEST_UNTESTED,
4590 .probe = probe_jedec,
4591 .probe_timing = TIMING_ZERO,
4592 .block_erasers =
4593 {
4594 {
4595 .eraseblocks = { {64 * 1024, 8} },
4596 .block_erase = erase_sector_jedec,
4597 }, {
4598 .eraseblocks = { {512 * 1024, 1} },
4599 .block_erase = erase_chip_block_jedec,
4600 },
4601 },
4602 .write = write_jedec_1,
4603 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +00004604 .voltage = {4500, 5500},
mhme8e87912010-09-16 00:51:51 +00004605 },
4606
4607 {
hailfinger286829b2009-01-08 03:40:17 +00004608 .vendor = "Intel",
mhm54b83562010-10-05 20:28:36 +00004609 .name = "28F001BN/BX-B",
hailfingere1e41ea2011-07-27 07:13:06 +00004610 .bustype = BUS_PARALLEL,
hailfingerd4d97b92009-05-29 12:55:31 +00004611 .manufacture_id = INTEL_ID,
mhm54b83562010-10-05 20:28:36 +00004612 .model_id = INTEL_28F001B,
hailfingerd4d97b92009-05-29 12:55:31 +00004613 .total_size = 128,
4614 .page_size = 128 * 1024, /* 8k + 2x4k + 112k */
snelsona013bf62010-03-22 04:39:31 +00004615 .tested = TEST_UNTESTED,
hailfingerd4d97b92009-05-29 12:55:31 +00004616 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00004617 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelson2d471072010-01-09 05:30:14 +00004618 .block_erasers =
4619 {
4620 {
Simon Glass8dc82732013-07-16 10:13:51 -06004621 .eraseblocks = {
snelson2d471072010-01-09 05:30:14 +00004622 {8 * 1024, 1},
4623 {4 * 1024, 2},
4624 {112 * 1024, 1},
4625 },
snelsonc0acbeb2010-03-19 18:47:06 +00004626 .block_erase = erase_block_82802ab,
snelson2d471072010-01-09 05:30:14 +00004627 },
4628 },
snelsona013bf62010-03-22 04:39:31 +00004629 .write = write_82802ab,
hailfingerd4d97b92009-05-29 12:55:31 +00004630 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00004631 .voltage = {4500, 5500},
hailfingerd4d97b92009-05-29 12:55:31 +00004632 },
4633
4634 {
4635 .vendor = "Intel",
mhm54b83562010-10-05 20:28:36 +00004636 .name = "28F001BN/BX-T",
hailfingere1e41ea2011-07-27 07:13:06 +00004637 .bustype = BUS_PARALLEL,
hailfingerd4d97b92009-05-29 12:55:31 +00004638 .manufacture_id = INTEL_ID,
mhm54b83562010-10-05 20:28:36 +00004639 .model_id = INTEL_28F001T,
hailfingerd4d97b92009-05-29 12:55:31 +00004640 .total_size = 128,
4641 .page_size = 128 * 1024, /* 112k + 2x4k + 8k */
stefanctd6efe1a2011-09-03 11:22:27 +00004642 .tested = TEST_OK_PR,
hailfingerd4d97b92009-05-29 12:55:31 +00004643 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00004644 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelson2d471072010-01-09 05:30:14 +00004645 .block_erasers =
4646 {
4647 {
stefanctd6efe1a2011-09-03 11:22:27 +00004648 .eraseblocks = {
snelson2d471072010-01-09 05:30:14 +00004649 {112 * 1024, 1},
4650 {4 * 1024, 2},
4651 {8 * 1024, 1},
4652 },
snelsonc0acbeb2010-03-19 18:47:06 +00004653 .block_erase = erase_block_82802ab,
snelson2d471072010-01-09 05:30:14 +00004654 },
4655 },
snelsona013bf62010-03-22 04:39:31 +00004656 .write = write_82802ab,
hailfingerd4d97b92009-05-29 12:55:31 +00004657 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00004658 .voltage = {4500, 5500},
hailfingerd4d97b92009-05-29 12:55:31 +00004659 },
4660
4661 {
4662 .vendor = "Intel",
mhm54b83562010-10-05 20:28:36 +00004663 .name = "28F002BC/BL/BV/BX-T",
hailfingere1e41ea2011-07-27 07:13:06 +00004664 .bustype = BUS_PARALLEL,
hailfingerf1f559e2010-07-22 15:20:43 +00004665 .manufacture_id = INTEL_ID,
mhm54b83562010-10-05 20:28:36 +00004666 .model_id = INTEL_28F002T,
hailfingerf1f559e2010-07-22 15:20:43 +00004667 .total_size = 256,
4668 .page_size = 256 * 1024,
hailfingerd217d122010-10-08 18:52:29 +00004669 .tested = TEST_OK_PRE,
hailfingerf1f559e2010-07-22 15:20:43 +00004670 .probe = probe_82802ab,
4671 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
4672 .block_erasers =
4673 {
4674 {
4675 .eraseblocks = {
4676 {128 * 1024, 1},
4677 {96 * 1024, 1},
4678 {8 * 1024, 2},
4679 {16 * 1024, 1},
4680 },
4681 .block_erase = erase_block_82802ab,
4682 },
4683 },
4684 .write = write_82802ab,
4685 .read = read_memmapped,
4686 },
4687
4688 {
4689 .vendor = "Intel",
mhm54b83562010-10-05 20:28:36 +00004690 .name = "28F008S3/S5/SC",
hailfingere1e41ea2011-07-27 07:13:06 +00004691 .bustype = BUS_PARALLEL,
snelsonee09b3d2010-02-13 18:41:53 +00004692 .manufacture_id = INTEL_ID,
mhm54b83562010-10-05 20:28:36 +00004693 .model_id = INTEL_28F004S3,
snelsonee09b3d2010-02-13 18:41:53 +00004694 .total_size = 512,
4695 .page_size = 256,
4696 .tested = TEST_UNTESTED,
4697 .probe = probe_82802ab,
4698 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelsonee09b3d2010-02-13 18:41:53 +00004699 .block_erasers =
4700 {
4701 {
4702 .eraseblocks = { {64 * 1024, 8} },
snelsonc0acbeb2010-03-19 18:47:06 +00004703 .block_erase = erase_block_82802ab,
snelsonee09b3d2010-02-13 18:41:53 +00004704 },
4705 },
snelsona013bf62010-03-22 04:39:31 +00004706 .unlock = unlock_28f004s5,
snelsonee09b3d2010-02-13 18:41:53 +00004707 .write = write_82802ab,
4708 .read = read_memmapped,
4709 },
4710
4711 {
4712 .vendor = "Intel",
mhm54b83562010-10-05 20:28:36 +00004713 .name = "28F004B5/BE/BV/BX-B",
hailfingere1e41ea2011-07-27 07:13:06 +00004714 .bustype = BUS_PARALLEL,
mkarcher9ded5fe2010-04-03 10:27:08 +00004715 .manufacture_id = INTEL_ID,
mhm54b83562010-10-05 20:28:36 +00004716 .model_id = INTEL_28F004B,
mkarcher9ded5fe2010-04-03 10:27:08 +00004717 .total_size = 512,
4718 .page_size = 128 * 1024, /* maximal block size */
4719 .tested = TEST_UNTESTED,
4720 .probe = probe_82802ab,
4721 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
4722 .block_erasers =
4723 {
4724 {
Simon Glass8dc82732013-07-16 10:13:51 -06004725 .eraseblocks = {
mkarcher9ded5fe2010-04-03 10:27:08 +00004726 {16 * 1024, 1},
4727 {8 * 1024, 2},
4728 {96 * 1024, 1},
4729 {128 * 1024, 3},
4730 },
4731 .block_erase = erase_block_82802ab,
4732 },
4733 },
4734 .write = write_82802ab,
4735 .read = read_memmapped,
4736 },
4737
4738 {
4739 .vendor = "Intel",
mhm54b83562010-10-05 20:28:36 +00004740 .name = "28F004B5/BE/BV/BX-T",
hailfingere1e41ea2011-07-27 07:13:06 +00004741 .bustype = BUS_PARALLEL,
mkarcher9ded5fe2010-04-03 10:27:08 +00004742 .manufacture_id = INTEL_ID,
mhm54b83562010-10-05 20:28:36 +00004743 .model_id = INTEL_28F004T,
mkarcher9ded5fe2010-04-03 10:27:08 +00004744 .total_size = 512,
4745 .page_size = 128 * 1024, /* maximal block size */
4746 .tested = TEST_UNTESTED,
4747 .probe = probe_82802ab,
4748 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
4749 .block_erasers =
4750 {
4751 {
Simon Glass8dc82732013-07-16 10:13:51 -06004752 .eraseblocks = {
mkarcher9ded5fe2010-04-03 10:27:08 +00004753 {128 * 1024, 3},
4754 {96 * 1024, 1},
4755 {8 * 1024, 2},
4756 {16 * 1024, 1},
4757 },
4758 .block_erase = erase_block_82802ab,
4759 },
4760 },
4761 .write = write_82802ab,
4762 .read = read_memmapped,
4763 },
4764
4765 {
4766 .vendor = "Intel",
mhm54b83562010-10-05 20:28:36 +00004767 .name = "28F400BV/BX/CE/CV-B",
hailfingere1e41ea2011-07-27 07:13:06 +00004768 .bustype = BUS_PARALLEL,
mkarcher9ded5fe2010-04-03 10:27:08 +00004769 .manufacture_id = INTEL_ID,
mhm54b83562010-10-05 20:28:36 +00004770 .model_id = INTEL_28F400B,
mkarcher9ded5fe2010-04-03 10:27:08 +00004771 .total_size = 512,
4772 .page_size = 128 * 1024, /* maximal block size */
4773 .feature_bits = FEATURE_ADDR_SHIFTED,
4774 .tested = TEST_UNTESTED,
4775 .probe = probe_82802ab,
4776 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
4777 .block_erasers =
4778 {
4779 {
Simon Glass8dc82732013-07-16 10:13:51 -06004780 .eraseblocks = {
mkarcher9ded5fe2010-04-03 10:27:08 +00004781 {16 * 1024, 1},
4782 {8 * 1024, 2},
4783 {96 * 1024, 1},
4784 {128 * 1024, 3},
4785 },
4786 .block_erase = erase_block_82802ab,
4787 },
4788 },
4789 .write = write_82802ab,
4790 .read = read_memmapped,
4791 },
4792
4793 {
4794 .vendor = "Intel",
mhm54b83562010-10-05 20:28:36 +00004795 .name = "28F400BV/BX/CE/CV-T",
hailfingere1e41ea2011-07-27 07:13:06 +00004796 .bustype = BUS_PARALLEL,
mkarcher9ded5fe2010-04-03 10:27:08 +00004797 .manufacture_id = INTEL_ID,
mhm54b83562010-10-05 20:28:36 +00004798 .model_id = INTEL_28F400T,
mkarcher9ded5fe2010-04-03 10:27:08 +00004799 .total_size = 512,
4800 .page_size = 128 * 1024, /* maximal block size */
4801 .feature_bits = FEATURE_ADDR_SHIFTED,
4802 .tested = TEST_UNTESTED,
4803 .probe = probe_82802ab,
4804 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
4805 .block_erasers =
4806 {
4807 {
Simon Glass8dc82732013-07-16 10:13:51 -06004808 .eraseblocks = {
mkarcher9ded5fe2010-04-03 10:27:08 +00004809 {128 * 1024, 3},
4810 {96 * 1024, 1},
4811 {8 * 1024, 2},
4812 {16 * 1024, 1},
4813 },
4814 .block_erase = erase_block_82802ab,
4815 },
4816 },
4817 .write = write_82802ab,
4818 .read = read_memmapped,
4819 },
4820
4821 {
4822 .vendor = "Intel",
hailfinger286829b2009-01-08 03:40:17 +00004823 .name = "82802AB",
hailfingere1e41ea2011-07-27 07:13:06 +00004824 .bustype = BUS_FWH,
hailfinger286829b2009-01-08 03:40:17 +00004825 .manufacture_id = INTEL_ID,
mhm54b83562010-10-05 20:28:36 +00004826 .model_id = INTEL_82802AB,
hailfinger286829b2009-01-08 03:40:17 +00004827 .total_size = 512,
4828 .page_size = 64 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00004829 .feature_bits = FEATURE_REGISTERMAP,
stefanct312d9ff2011-06-12 19:47:55 +00004830 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00004831 .probe = probe_82802ab,
hailfingere3095d92009-06-05 13:46:17 +00004832 .probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
snelson2d471072010-01-09 05:30:14 +00004833 .block_erasers =
4834 {
4835 {
4836 .eraseblocks = { {64 * 1024, 8} },
snelsonc0acbeb2010-03-19 18:47:06 +00004837 .block_erase = erase_block_82802ab,
snelson2d471072010-01-09 05:30:14 +00004838 },
4839 },
snelsonc0acbeb2010-03-19 18:47:06 +00004840 .unlock = unlock_82802ab,
hailfinger286829b2009-01-08 03:40:17 +00004841 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00004842 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00004843 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00004844 },
4845
hailfinger286829b2009-01-08 03:40:17 +00004846 {
4847 .vendor = "Intel",
4848 .name = "82802AC",
hailfingere1e41ea2011-07-27 07:13:06 +00004849 .bustype = BUS_FWH,
hailfinger286829b2009-01-08 03:40:17 +00004850 .manufacture_id = INTEL_ID,
mhm54b83562010-10-05 20:28:36 +00004851 .model_id = INTEL_82802AC,
hailfinger286829b2009-01-08 03:40:17 +00004852 .total_size = 1024,
4853 .page_size = 64 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00004854 .feature_bits = FEATURE_REGISTERMAP,
snelsonc0acbeb2010-03-19 18:47:06 +00004855 .tested = TEST_OK_PR,
hailfinger286829b2009-01-08 03:40:17 +00004856 .probe = probe_82802ab,
hailfingere3095d92009-06-05 13:46:17 +00004857 .probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
snelson2d471072010-01-09 05:30:14 +00004858 .block_erasers =
4859 {
4860 {
4861 .eraseblocks = { {64 * 1024, 16} },
snelsonc0acbeb2010-03-19 18:47:06 +00004862 .block_erase = erase_block_82802ab,
snelson2d471072010-01-09 05:30:14 +00004863 },
4864 },
snelsonc0acbeb2010-03-19 18:47:06 +00004865 .unlock = unlock_82802ab,
hailfinger286829b2009-01-08 03:40:17 +00004866 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00004867 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00004868 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00004869 },
4870
hailfinger286829b2009-01-08 03:40:17 +00004871 {
4872 .vendor = "Macronix",
Chris Zhoud9780512019-04-11 10:04:08 +08004873 .name = "MX25L25635F/MX25L25645G",
Vic Yang848bfd12018-03-23 10:24:07 -07004874 .bustype = BUS_SPI,
4875 .manufacture_id = MACRONIX_ID,
4876 .model_id = MACRONIX_MX25L25635F,
4877 .total_size = 32768,
4878 .page_size = 256,
4879 .feature_bits =
4880 FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_4BA_SUPPORT,
4881 .four_bytes_addr_funcs =
4882 {
4883 .set_4ba = spi_enter_4ba_b7,
4884 .read_nbyte = spi_nbyte_read_4ba_direct,
4885 .program_byte = spi_byte_program_4ba_direct,
4886 .program_nbyte = spi_nbyte_program_4ba_direct
4887 },
4888 .tested = TEST_UNTESTED,
4889 .probe = probe_spi_rdid,
4890 .probe_timing = TIMING_ZERO,
4891 .block_erasers =
4892 {
4893 {
4894 .eraseblocks = { {4 * 1024, 8192} },
4895 .block_erase = spi_block_erase_21_4ba_direct,
4896 }, {
4897 .eraseblocks = { {32 * 1024, 1024} },
4898 .block_erase = spi_block_erase_5c_4ba_direct,
4899 }, {
4900 .eraseblocks = { {64 * 1024, 512} },
4901 .block_erase = spi_block_erase_dc_4ba_direct,
4902 }, {
4903 .eraseblocks = { {32768 * 1024, 1} },
4904 .block_erase = spi_block_erase_60,
4905 }, {
4906 .eraseblocks = { {32768 * 1024, 1} },
4907 .block_erase = spi_block_erase_c7,
4908 },
4909 },
4910 .unlock = spi_disable_blockprotect,
4911 .write = spi_chip_write_256,
4912 .read = spi_chip_read,
4913 .voltage = {2700, 3600},
4914 .wp = &wp_generic,
4915 },
4916
4917 {
4918 .vendor = "Macronix",
Vincent Palatina699d262013-02-28 14:31:12 -08004919 .name = "MX25L512(E)/MX25V512(C)",
hailfingere1e41ea2011-07-27 07:13:06 +00004920 .bustype = BUS_SPI,
mhmd3c80cd2010-09-15 23:31:03 +00004921 .manufacture_id = MACRONIX_ID,
4922 .model_id = MACRONIX_MX25L512,
hailfinger286829b2009-01-08 03:40:17 +00004923 .total_size = 64,
4924 .page_size = 256,
Vincent Palatina699d262013-02-28 14:31:12 -08004925 /* MX25L512E supports SFDP */
David Hendricks488cf072015-11-23 16:45:07 -08004926 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00004927 .tested = TEST_UNTESTED,
4928 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00004929 .probe_timing = TIMING_ZERO,
hailfinger7df21362009-09-05 02:30:58 +00004930 .block_erasers =
4931 {
4932 {
4933 .eraseblocks = { {4 * 1024, 16} },
4934 .block_erase = spi_block_erase_20,
hailfinger91cf1032009-10-01 13:15:01 +00004935 }, {
hailfinger7df21362009-09-05 02:30:58 +00004936 .eraseblocks = { {64 * 1024, 1} },
4937 .block_erase = spi_block_erase_52,
hailfinger91cf1032009-10-01 13:15:01 +00004938 }, {
hailfinger7df21362009-09-05 02:30:58 +00004939 .eraseblocks = { {64 * 1024, 1} },
4940 .block_erase = spi_block_erase_d8,
hailfinger91cf1032009-10-01 13:15:01 +00004941 }, {
hailfinger7df21362009-09-05 02:30:58 +00004942 .eraseblocks = { {64 * 1024, 1} },
4943 .block_erase = spi_block_erase_60,
hailfinger91cf1032009-10-01 13:15:01 +00004944 }, {
hailfinger7df21362009-09-05 02:30:58 +00004945 .eraseblocks = { {64 * 1024, 1} },
4946 .block_erase = spi_block_erase_c7,
4947 },
4948 },
hailfingerb9560ee2010-07-14 20:21:22 +00004949 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00004950 .write = spi_chip_write_256,
Vincent Palatina699d262013-02-28 14:31:12 -08004951 .read = spi_chip_read, /* Fast read (0x0B) supported, MX25L512E supports dual I/O */
4952 .voltage = {2700, 3600}, /* 2.35-3.6V for MX25V512(C) */
stepanaa1b6a22008-12-08 18:15:10 +00004953 },
4954
hailfinger286829b2009-01-08 03:40:17 +00004955 {
4956 .vendor = "Macronix",
Vincent Palatina699d262013-02-28 14:31:12 -08004957 .name = "MX25L1005(C)/MX25L1006E",
hailfingere1e41ea2011-07-27 07:13:06 +00004958 .bustype = BUS_SPI,
mhmd3c80cd2010-09-15 23:31:03 +00004959 .manufacture_id = MACRONIX_ID,
4960 .model_id = MACRONIX_MX25L1005,
hailfinger286829b2009-01-08 03:40:17 +00004961 .total_size = 128,
4962 .page_size = 256,
Vincent Palatina699d262013-02-28 14:31:12 -08004963 /* MX25L1006E supports SFDP */
David Hendricks488cf072015-11-23 16:45:07 -08004964 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
4965 .tested = TEST_OK_PREWU,
hailfinger286829b2009-01-08 03:40:17 +00004966 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00004967 .probe_timing = TIMING_ZERO,
hailfinger7df21362009-09-05 02:30:58 +00004968 .block_erasers =
4969 {
4970 {
4971 .eraseblocks = { {4 * 1024, 32} },
4972 .block_erase = spi_block_erase_20,
hailfinger91cf1032009-10-01 13:15:01 +00004973 }, {
hailfinger7df21362009-09-05 02:30:58 +00004974 .eraseblocks = { {64 * 1024, 2} },
4975 .block_erase = spi_block_erase_d8,
hailfinger91cf1032009-10-01 13:15:01 +00004976 }, {
hailfinger7df21362009-09-05 02:30:58 +00004977 .eraseblocks = { {128 * 1024, 1} },
4978 .block_erase = spi_block_erase_60,
hailfinger91cf1032009-10-01 13:15:01 +00004979 }, {
hailfinger7df21362009-09-05 02:30:58 +00004980 .eraseblocks = { {128 * 1024, 1} },
4981 .block_erase = spi_block_erase_c7,
4982 },
4983 },
hailfingerb9560ee2010-07-14 20:21:22 +00004984 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00004985 .write = spi_chip_write_256,
Vincent Palatina699d262013-02-28 14:31:12 -08004986 .read = spi_chip_read, /* Fast read (0x0B) supported, MX25L1006E supports dual I/O */
stefanct7e00e222011-06-03 07:26:31 +00004987 .voltage = {2700, 3600},
David Hendricksf8f00c72011-02-01 12:39:46 -08004988 .wp = &wp_w25,
stepanaa1b6a22008-12-08 18:15:10 +00004989 },
4990
hailfinger286829b2009-01-08 03:40:17 +00004991 {
4992 .vendor = "Macronix",
Vincent Palatina699d262013-02-28 14:31:12 -08004993 .name = "MX25L2005(C)",
hailfingere1e41ea2011-07-27 07:13:06 +00004994 .bustype = BUS_SPI,
mhmd3c80cd2010-09-15 23:31:03 +00004995 .manufacture_id = MACRONIX_ID,
4996 .model_id = MACRONIX_MX25L2005,
hailfinger286829b2009-01-08 03:40:17 +00004997 .total_size = 256,
4998 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08004999 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00005000 .tested = TEST_UNTESTED,
5001 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00005002 .probe_timing = TIMING_ZERO,
hailfinger91cf1032009-10-01 13:15:01 +00005003 .block_erasers =
5004 {
5005 {
5006 .eraseblocks = { {4 * 1024, 64} },
5007 .block_erase = spi_block_erase_20,
5008 }, {
5009 .eraseblocks = { {64 * 1024, 4} },
5010 .block_erase = spi_block_erase_52,
5011 }, {
5012 .eraseblocks = { {64 * 1024, 4} },
5013 .block_erase = spi_block_erase_d8,
5014 }, {
5015 .eraseblocks = { {256 * 1024, 1} },
5016 .block_erase = spi_block_erase_60,
5017 }, {
5018 .eraseblocks = { {256 * 1024, 1} },
5019 .block_erase = spi_block_erase_c7,
5020 },
5021 },
hailfingerb9560ee2010-07-14 20:21:22 +00005022 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00005023 .write = spi_chip_write_256,
Vincent Palatina699d262013-02-28 14:31:12 -08005024 .read = spi_chip_read, /* Fast read (0x0B) supported */
stefanct7e00e222011-06-03 07:26:31 +00005025 .voltage = {2700, 3600},
David Hendricksf8f00c72011-02-01 12:39:46 -08005026 .wp = &wp_w25,
stepanaa1b6a22008-12-08 18:15:10 +00005027 },
5028
hailfinger286829b2009-01-08 03:40:17 +00005029 {
5030 .vendor = "Macronix",
Vincent Palatina699d262013-02-28 14:31:12 -08005031 .name = "MX25L4005(A/C)",
hailfingere1e41ea2011-07-27 07:13:06 +00005032 .bustype = BUS_SPI,
mhmd3c80cd2010-09-15 23:31:03 +00005033 .manufacture_id = MACRONIX_ID,
5034 .model_id = MACRONIX_MX25L4005,
hailfinger286829b2009-01-08 03:40:17 +00005035 .total_size = 512,
5036 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08005037 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
5038 .tested = TEST_OK_PREWU,
hailfinger286829b2009-01-08 03:40:17 +00005039 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00005040 .probe_timing = TIMING_ZERO,
hailfinger91cf1032009-10-01 13:15:01 +00005041 .block_erasers =
5042 {
5043 {
5044 .eraseblocks = { {4 * 1024, 128} },
5045 .block_erase = spi_block_erase_20,
5046 }, {
5047 .eraseblocks = { {64 * 1024, 8} },
5048 .block_erase = spi_block_erase_52,
5049 }, {
5050 .eraseblocks = { {64 * 1024, 8} },
5051 .block_erase = spi_block_erase_d8,
5052 }, {
5053 .eraseblocks = { {512 * 1024, 1} },
5054 .block_erase = spi_block_erase_60,
5055 }, {
5056 .eraseblocks = { {512 * 1024, 1} },
5057 .block_erase = spi_block_erase_c7,
5058 },
5059 },
hailfingerb9560ee2010-07-14 20:21:22 +00005060 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00005061 .write = spi_chip_write_256,
Vincent Palatina699d262013-02-28 14:31:12 -08005062 .read = spi_chip_read, /* Fast read (0x0B) supported */
stefanct7e00e222011-06-03 07:26:31 +00005063 .voltage = {2700, 3600},
David Hendricksf8f00c72011-02-01 12:39:46 -08005064 .wp = &wp_w25,
stepanaa1b6a22008-12-08 18:15:10 +00005065 },
5066
hailfinger286829b2009-01-08 03:40:17 +00005067 {
5068 .vendor = "Macronix",
Vincent Palatina699d262013-02-28 14:31:12 -08005069 .name = "MX25L8005/MX25V8005",
hailfingere1e41ea2011-07-27 07:13:06 +00005070 .bustype = BUS_SPI,
mhmd3c80cd2010-09-15 23:31:03 +00005071 .manufacture_id = MACRONIX_ID,
5072 .model_id = MACRONIX_MX25L8005,
hailfinger286829b2009-01-08 03:40:17 +00005073 .total_size = 1024,
5074 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08005075 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
5076 .tested = TEST_OK_PREWU,
hailfinger286829b2009-01-08 03:40:17 +00005077 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00005078 .probe_timing = TIMING_ZERO,
hailfinger91cf1032009-10-01 13:15:01 +00005079 .block_erasers =
5080 {
5081 {
5082 .eraseblocks = { {4 * 1024, 256} },
5083 .block_erase = spi_block_erase_20,
5084 }, {
5085 .eraseblocks = { {64 * 1024, 16} },
5086 .block_erase = spi_block_erase_52,
5087 }, {
5088 .eraseblocks = { {64 * 1024, 16} },
5089 .block_erase = spi_block_erase_d8,
5090 }, {
5091 .eraseblocks = { {1024 * 1024, 1} },
5092 .block_erase = spi_block_erase_60,
5093 }, {
5094 .eraseblocks = { {1024 * 1024, 1} },
5095 .block_erase = spi_block_erase_c7,
5096 },
5097 },
hailfingerb9560ee2010-07-14 20:21:22 +00005098 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00005099 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00005100 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00005101 .voltage = {2700, 3600},
David Hendricksf8f00c72011-02-01 12:39:46 -08005102 .wp = &wp_w25,
stepanaa1b6a22008-12-08 18:15:10 +00005103 },
5104
hailfinger286829b2009-01-08 03:40:17 +00005105 {
5106 .vendor = "Macronix",
5107 .name = "MX25L1605",
hailfingere1e41ea2011-07-27 07:13:06 +00005108 .bustype = BUS_SPI,
mhmd3c80cd2010-09-15 23:31:03 +00005109 .manufacture_id = MACRONIX_ID,
5110 .model_id = MACRONIX_MX25L1605,
hailfinger286829b2009-01-08 03:40:17 +00005111 .total_size = 2048,
5112 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08005113 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
5114 .tested = TEST_OK_PREWU,
hailfinger286829b2009-01-08 03:40:17 +00005115 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00005116 .probe_timing = TIMING_ZERO,
hailfinger91cf1032009-10-01 13:15:01 +00005117 .block_erasers =
5118 {
5119 {
5120 .eraseblocks = { {4 * 1024, 512} },
5121 .block_erase = spi_block_erase_20, /* This erase function has 64k blocksize for eLiteFlash */
5122 }, {
5123 .eraseblocks = { {64 * 1024, 32} }, /* Not supported in MX25L1605 (eLiteFlash) and MX25L1605D */
5124 .block_erase = spi_block_erase_52,
5125 }, {
5126 .eraseblocks = { {64 * 1024, 32} },
5127 .block_erase = spi_block_erase_d8,
5128 }, {
5129 .eraseblocks = { {2 * 1024 * 1024, 1} },
5130 .block_erase = spi_block_erase_60,
5131 }, {
5132 .eraseblocks = { {2 * 1024 * 1024, 1} },
5133 .block_erase = spi_block_erase_c7,
5134 },
5135 },
hailfingerb9560ee2010-07-14 20:21:22 +00005136 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00005137 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00005138 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00005139 .voltage = {2700, 3600},
David Hendricksf8f00c72011-02-01 12:39:46 -08005140 .wp = &wp_w25,
stepanaa1b6a22008-12-08 18:15:10 +00005141 },
5142
hailfinger286829b2009-01-08 03:40:17 +00005143 {
5144 .vendor = "Macronix",
hailfinger0a2fef02009-04-19 23:04:00 +00005145 .name = "MX25L1635D",
hailfingere1e41ea2011-07-27 07:13:06 +00005146 .bustype = BUS_SPI,
mhmd3c80cd2010-09-15 23:31:03 +00005147 .manufacture_id = MACRONIX_ID,
5148 .model_id = MACRONIX_MX25L1635D,
hailfinger0a2fef02009-04-19 23:04:00 +00005149 .total_size = 2048,
5150 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08005151 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
hailfinger0a2fef02009-04-19 23:04:00 +00005152 .tested = TEST_UNTESTED,
5153 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00005154 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00005155 .block_erasers =
5156 {
5157 {
5158 .eraseblocks = { {4 * 1024, 512} },
5159 .block_erase = spi_block_erase_20,
5160 }, {
5161 .eraseblocks = { {64 * 1024, 32} },
5162 .block_erase = spi_block_erase_d8,
5163 }, {
5164 .eraseblocks = { {2 * 1024 * 1024, 1} },
5165 .block_erase = spi_block_erase_60,
5166 }, {
5167 .eraseblocks = { {2 * 1024 * 1024, 1} },
5168 .block_erase = spi_block_erase_c7,
5169 }
5170 },
hailfingerb9560ee2010-07-14 20:21:22 +00005171 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00005172 .write = spi_chip_write_256,
hailfinger0a2fef02009-04-19 23:04:00 +00005173 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00005174 .voltage = {2700, 3600},
hailfinger0a2fef02009-04-19 23:04:00 +00005175 },
hailfingerf1255892009-04-20 22:54:13 +00005176
hailfinger0a2fef02009-04-19 23:04:00 +00005177 {
5178 .vendor = "Macronix",
uwef926ca22010-09-13 19:59:28 +00005179 .name = "MX25L1635E",
hailfingere1e41ea2011-07-27 07:13:06 +00005180 .bustype = BUS_SPI,
mhmd3c80cd2010-09-15 23:31:03 +00005181 .manufacture_id = MACRONIX_ID,
5182 .model_id = MACRONIX_MX25L1635E,
uwef926ca22010-09-13 19:59:28 +00005183 .total_size = 2048,
5184 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08005185 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
uwef926ca22010-09-13 19:59:28 +00005186 .tested = TEST_UNTESTED,
5187 .probe = probe_spi_rdid,
5188 .probe_timing = TIMING_ZERO,
5189 .block_erasers =
5190 {
5191 {
5192 .eraseblocks = { {4 * 1024, 512} },
5193 .block_erase = spi_block_erase_20,
5194 }, {
5195 .eraseblocks = { {64 * 1024, 32} },
5196 .block_erase = spi_block_erase_d8,
5197 }, {
5198 .eraseblocks = { {2 * 1024 * 1024, 1} },
5199 .block_erase = spi_block_erase_60,
5200 }, {
5201 .eraseblocks = { {2 * 1024 * 1024, 1} },
5202 .block_erase = spi_block_erase_c7,
5203 }
5204 },
5205 .unlock = spi_disable_blockprotect,
5206 .write = spi_chip_write_256,
5207 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +00005208 .voltage = {2700, 3600},
uwef926ca22010-09-13 19:59:28 +00005209 },
5210
5211 {
5212 .vendor = "Macronix",
hailfinger286829b2009-01-08 03:40:17 +00005213 .name = "MX25L3205",
hailfingere1e41ea2011-07-27 07:13:06 +00005214 .bustype = BUS_SPI,
mhmd3c80cd2010-09-15 23:31:03 +00005215 .manufacture_id = MACRONIX_ID,
5216 .model_id = MACRONIX_MX25L3205,
hailfinger286829b2009-01-08 03:40:17 +00005217 .total_size = 4096,
5218 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08005219 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
5220 .tested = TEST_OK_PREWU,
hailfinger286829b2009-01-08 03:40:17 +00005221 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00005222 .probe_timing = TIMING_ZERO,
snelson1c03aa12009-12-23 17:05:59 +00005223 .block_erasers =
5224 {
5225 {
5226 .eraseblocks = { {4 * 1024, 1024} },
5227 .block_erase = spi_block_erase_20,
5228 }, {
5229 .eraseblocks = { {4 * 1024, 1024} },
5230 .block_erase = spi_block_erase_d8,
5231 }, {
5232 .eraseblocks = { {4 * 1024 * 1024, 1} },
5233 .block_erase = spi_block_erase_60,
5234 }, {
5235 .eraseblocks = { {4 * 1024 * 1024, 1} },
5236 .block_erase = spi_block_erase_c7,
5237 },
5238 },
hailfingerb9560ee2010-07-14 20:21:22 +00005239 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00005240 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00005241 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00005242 .voltage = {2700, 3600},
David Hendricksf8f00c72011-02-01 12:39:46 -08005243 .wp = &wp_w25,
stepanaa1b6a22008-12-08 18:15:10 +00005244 },
5245
hailfinger286829b2009-01-08 03:40:17 +00005246 {
5247 .vendor = "Macronix",
stuge38d77d22009-04-23 22:51:56 +00005248 .name = "MX25L3235D",
hailfingere1e41ea2011-07-27 07:13:06 +00005249 .bustype = BUS_SPI,
mhmd3c80cd2010-09-15 23:31:03 +00005250 .manufacture_id = MACRONIX_ID,
5251 .model_id = MACRONIX_MX25L3235D,
stuge38d77d22009-04-23 22:51:56 +00005252 .total_size = 4096,
5253 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08005254 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
stuge38d77d22009-04-23 22:51:56 +00005255 .tested = TEST_UNTESTED,
5256 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00005257 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00005258 .block_erasers =
5259 {
5260 {
5261 .eraseblocks = { {4 * 1024, 1024} },
5262 .block_erase = spi_block_erase_20,
5263 }, {
5264 .eraseblocks = { {64 * 1024, 64} },
5265 .block_erase = spi_block_erase_d8,
5266 }, {
5267 .eraseblocks = { {4 * 1024 * 1024, 1} },
5268 .block_erase = spi_block_erase_60,
5269 }, {
5270 .eraseblocks = { {4 * 1024 * 1024, 1} },
5271 .block_erase = spi_block_erase_c7,
5272 }
5273 },
hailfingerb9560ee2010-07-14 20:21:22 +00005274 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00005275 .write = spi_chip_write_256,
stuge38d77d22009-04-23 22:51:56 +00005276 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00005277 .voltage = {2700, 3600},
stuge38d77d22009-04-23 22:51:56 +00005278 },
5279
Vincent Palatin87e092a2013-02-28 15:46:14 -08005280 {
5281 .vendor = "Macronix",
5282 .name = "MX25U3235E/F",
5283 .bustype = BUS_SPI,
5284 .manufacture_id = MACRONIX_ID,
5285 .model_id = MACRONIX_MX25U3235E,
5286 .total_size = 4096,
5287 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08005288 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
Vincent Palatin87e092a2013-02-28 15:46:14 -08005289 .tested = TEST_UNTESTED,
5290 .probe = probe_spi_rdid,
5291 .probe_timing = TIMING_ZERO,
5292 .block_erasers =
5293 {
5294 {
5295 .eraseblocks = { {4 * 1024, 1024} },
5296 .block_erase = spi_block_erase_20,
5297 }, {
5298 .eraseblocks = { {32 * 1024, 128} },
5299 .block_erase = spi_block_erase_52,
5300 }, {
5301 .eraseblocks = { {64 * 1024, 64} },
5302 .block_erase = spi_block_erase_d8,
5303 }, {
5304 .eraseblocks = { {4 * 1024 * 1024, 1} },
5305 .block_erase = spi_block_erase_60,
5306 }, {
5307 .eraseblocks = { {4 * 1024 * 1024, 1} },
5308 .block_erase = spi_block_erase_c7,
5309 }
5310 },
5311 .unlock = spi_disable_blockprotect,
5312 .write = spi_chip_write_256,
5313 .read = spi_chip_read, /* Fast read (0x0B) supported */
5314 .voltage = {1650, 2000},
5315 .wp = &wp_w25,
5316 },
5317
David Hendricks1c9bc9c2011-07-20 15:25:44 -07005318#if 0
stuge38d77d22009-04-23 22:51:56 +00005319 {
5320 .vendor = "Macronix",
hailfinger286829b2009-01-08 03:40:17 +00005321 .name = "MX25L6405",
hailfingere1e41ea2011-07-27 07:13:06 +00005322 .bustype = BUS_SPI,
mhmd3c80cd2010-09-15 23:31:03 +00005323 .manufacture_id = MACRONIX_ID,
5324 .model_id = MACRONIX_MX25L6405,
hailfinger286829b2009-01-08 03:40:17 +00005325 .total_size = 8192,
5326 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08005327 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
Stefan Tauner718d1eb2016-08-18 18:00:53 -07005328 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00005329 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00005330 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00005331 .block_erasers =
5332 {
5333 {
5334 .eraseblocks = { {64 * 1024, 128} },
5335 .block_erase = spi_block_erase_20,
5336 }, {
5337 .eraseblocks = { {64 * 1024, 128} },
5338 .block_erase = spi_block_erase_d8,
5339 }, {
5340 .eraseblocks = { {8 * 1024 * 1024, 1} },
5341 .block_erase = spi_block_erase_60,
5342 }, {
5343 .eraseblocks = { {8 * 1024 * 1024, 1} },
5344 .block_erase = spi_block_erase_c7,
5345 }
5346 },
hailfingerb9560ee2010-07-14 20:21:22 +00005347 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00005348 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00005349 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00005350 .voltage = {2700, 3600},
David Hendricksf8f00c72011-02-01 12:39:46 -08005351 .wp = &wp_w25,
stepanaa1b6a22008-12-08 18:15:10 +00005352 },
David Hendricks1c9bc9c2011-07-20 15:25:44 -07005353#endif
5354
5355 {
5356 /* FIXME: This is an evil twin of the MX25L6405, with the same
5357 * ID bytes but different block erase capabilities */
5358 .vendor = "Macronix",
5359 .name = "MX25L6406E",
hailfingere1e41ea2011-07-27 07:13:06 +00005360 .bustype = BUS_SPI,
David Hendricks1c9bc9c2011-07-20 15:25:44 -07005361 .manufacture_id = MACRONIX_ID,
5362 .model_id = MACRONIX_MX25L6405,
5363 .total_size = 8192,
5364 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08005365 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
5366 .tested = TEST_OK_PREWU,
David Hendricks1c9bc9c2011-07-20 15:25:44 -07005367 .probe = probe_spi_rdid,
5368 .probe_timing = TIMING_ZERO,
5369 .block_erasers =
5370 {
5371 {
5372 .eraseblocks = { {4 * 1024, 2048} },
5373 .block_erase = spi_block_erase_20,
5374 }, {
5375 .eraseblocks = { {64 * 1024, 128} },
5376 .block_erase = spi_block_erase_d8,
5377 }, {
5378 .eraseblocks = { {64 * 1024, 128} },
5379 .block_erase = spi_block_erase_52,
5380 }, {
5381 .eraseblocks = { {8 * 1024 * 1024, 1} },
5382 .block_erase = spi_block_erase_60,
5383 }, {
5384 .eraseblocks = { {8 * 1024 * 1024, 1} },
5385 .block_erase = spi_block_erase_c7,
5386 }
5387 },
5388 .unlock = spi_disable_blockprotect,
5389 .write = spi_chip_write_256,
Vincent Palatina699d262013-02-28 14:31:12 -08005390 .read = spi_chip_read, /* Fast read (0x0B) supported */
5391 .voltage = {2700, 3600}, /* 2.35-3.6V for MX25V8005 */
David Hendricks83541d32014-07-15 20:58:21 -07005392 .wp = &wp_generic,
David Hendricks1c9bc9c2011-07-20 15:25:44 -07005393 },
stepanaa1b6a22008-12-08 18:15:10 +00005394
hailfinger286829b2009-01-08 03:40:17 +00005395 {
5396 .vendor = "Macronix",
David Hendricksc3496092014-11-13 17:20:55 -08005397 .name = "MX25L6495F",
5398 .bustype = BUS_SPI,
5399 .manufacture_id = MACRONIX_ID,
5400 .model_id = MACRONIX_MX25L6495F,
5401 .total_size = 8192,
5402 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08005403 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
5404 .tested = TEST_OK_PREWU,
David Hendricksc3496092014-11-13 17:20:55 -08005405 .probe = probe_spi_rdid,
5406 .probe_timing = TIMING_ZERO,
5407 .block_erasers =
5408 {
5409 {
5410 .eraseblocks = { {4 * 1024, 2048} },
5411 .block_erase = spi_block_erase_20,
5412 }, {
5413 .eraseblocks = { {64 * 1024, 128} },
5414 .block_erase = spi_block_erase_d8,
5415 }, {
5416 .eraseblocks = { {32 * 1024, 256} },
5417 .block_erase = spi_block_erase_52,
5418 }, {
5419 .eraseblocks = { {8 * 1024 * 1024, 1} },
5420 .block_erase = spi_block_erase_60,
5421 }, {
5422 .eraseblocks = { {8 * 1024 * 1024, 1} },
5423 .block_erase = spi_block_erase_c7,
5424 }
5425 },
5426 .unlock = spi_disable_blockprotect,
5427 .write = spi_chip_write_256,
5428 .read = spi_chip_read, /* Fast read (0x0B) supported */
5429 .voltage = {2700, 3600},
5430 .wp = &wp_generic,
5431 },
5432
5433 {
5434 .vendor = "Macronix",
Jongpil66a96492014-08-14 17:59:06 +09005435 .name = "MX25U6435E/F",
5436 .bustype = BUS_SPI,
5437 .manufacture_id = MACRONIX_ID,
5438 .model_id = MACRONIX_MX25U6435E,
5439 .total_size = 8192,
5440 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08005441 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
5442 .tested = TEST_OK_PREWU,
Jongpil66a96492014-08-14 17:59:06 +09005443 .probe = probe_spi_rdid,
5444 .probe_timing = TIMING_ZERO,
5445 .block_erasers =
5446 {
5447 {
5448 .eraseblocks = { {4 * 1024, 2048} },
5449 .block_erase = spi_block_erase_20,
5450 }, {
5451 .eraseblocks = { {32 * 1024, 256} },
5452 .block_erase = spi_block_erase_52,
5453 }, {
5454 .eraseblocks = { {64 * 1024, 128} },
5455 .block_erase = spi_block_erase_d8,
5456 }, {
5457 .eraseblocks = { {8 * 1024 * 1024, 1} },
5458 .block_erase = spi_block_erase_60,
5459 }, {
5460 .eraseblocks = { {8 * 1024 * 1024, 1} },
5461 .block_erase = spi_block_erase_c7,
5462 }
5463 },
5464 .unlock = spi_disable_blockprotect,
5465 .write = spi_chip_write_256,
5466 .read = spi_chip_read, /* Fast read (0x0B) supported */
5467 .voltage = {1650, 2000},
5468 .wp = &wp_w25,
5469 },
5470
Alex Lu831c6092017-11-02 23:19:34 -07005471
5472 {
5473 .vendor = "Macronix",
5474 .name = "MX25U12835F",
5475 .bustype = BUS_SPI,
5476 .manufacture_id = MACRONIX_ID,
5477 .model_id = MACRONIX_MX25U12835F,
5478 .total_size = 16384,
5479 .page_size = 256,
5480 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
5481 .tested = TEST_OK_PREWU,
5482 .probe = probe_spi_rdid,
5483 .probe_timing = TIMING_ZERO,
5484 .block_erasers =
5485 {
5486 {
5487 .eraseblocks = { {4 * 1024, 4096} },
5488 .block_erase = spi_block_erase_20,
5489 }, {
5490 .eraseblocks = { {32 * 1024, 512} },
5491 .block_erase = spi_block_erase_52,
5492 }, {
5493 .eraseblocks = { {64 * 1024, 256} },
5494 .block_erase = spi_block_erase_d8,
5495 }, {
5496 .eraseblocks = { {8 * 1024 * 2048, 1} },
5497 .block_erase = spi_block_erase_60,
5498 }, {
5499 .eraseblocks = { {8 * 1024 * 2048, 1} },
5500 .block_erase = spi_block_erase_c7,
5501 }
5502 },
5503 .unlock = spi_disable_blockprotect,
5504 .write = spi_chip_write_256,
5505 .read = spi_chip_read, /* Fast read (0x0B) supported */
5506 .voltage = {1650, 2000},
Paul Fagerburg50a120d2019-05-17 09:47:36 -06005507 .wp = &wp_w25q_large,
Alex Lu831c6092017-11-02 23:19:34 -07005508 },
5509
Jongpil66a96492014-08-14 17:59:06 +09005510 {
5511 .vendor = "Macronix",
David Hendricks419e32a2015-04-07 17:25:14 -07005512 .name = "MX25U25635F",
5513 .bustype = BUS_SPI,
5514 .manufacture_id = MACRONIX_ID,
5515 .model_id = MACRONIX_MX25U25635F,
5516 /* FIXME(dhendrix): support 32-bit addressing */
5517 .total_size = 32768/2,
5518 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08005519 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
5520 .tested = TEST_OK_PREWU,
David Hendricks419e32a2015-04-07 17:25:14 -07005521 .probe = probe_spi_rdid,
5522 .probe_timing = TIMING_ZERO,
5523 .block_erasers =
5524 {
5525 /* FIXME(dhendrix): support 32-bit addressing */
5526 {
5527 .eraseblocks = { {4 * 1024, 8192/2} },
5528 .block_erase = spi_block_erase_20,
5529 }, {
5530 .eraseblocks = { {32 * 1024, 1024/2} },
5531 .block_erase = spi_block_erase_52,
5532 }, {
5533 .eraseblocks = { {64 * 1024, 512/2} },
5534 .block_erase = spi_block_erase_d8,
5535 }, {
5536 .eraseblocks = { {32/2 * 1024 * 1024, 1} },
5537 .block_erase = spi_block_erase_60,
5538 }, {
5539 .eraseblocks = { {32/2 * 1024 * 1024, 1} },
5540 .block_erase = spi_block_erase_c7,
5541 }
5542 },
5543 .unlock = spi_disable_blockprotect,
5544 .write = spi_chip_write_256,
5545 .read = spi_chip_read, /* Fast read (0x0B) supported */
5546 .voltage = {1650, 2000},
5547 /* FIXME(dhendrix): write-protect support */
5548// .wp = &wp_generic,
5549 },
5550
5551 {
5552 .vendor = "Macronix",
stuged8f34912009-04-21 01:47:16 +00005553 .name = "MX25L12805",
hailfingere1e41ea2011-07-27 07:13:06 +00005554 .bustype = BUS_SPI,
mhmd3c80cd2010-09-15 23:31:03 +00005555 .manufacture_id = MACRONIX_ID,
5556 .model_id = MACRONIX_MX25L12805,
stuged8f34912009-04-21 01:47:16 +00005557 .total_size = 16384,
5558 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08005559 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
stuged8f34912009-04-21 01:47:16 +00005560 .tested = TEST_UNTESTED,
5561 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00005562 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00005563 .block_erasers =
5564 {
5565 {
5566 .eraseblocks = { {4 * 1024, 4096} },
5567 .block_erase = spi_block_erase_20,
5568 }, {
5569 .eraseblocks = { {64 * 1024, 256} },
5570 .block_erase = spi_block_erase_d8,
5571 }, {
5572 .eraseblocks = { {16 * 1024 * 1024, 1} },
5573 .block_erase = spi_block_erase_60,
5574 }, {
5575 .eraseblocks = { {16 * 1024 * 1024, 1} },
5576 .block_erase = spi_block_erase_c7,
5577 }
5578 },
hailfingerb9560ee2010-07-14 20:21:22 +00005579 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00005580 .write = spi_chip_write_256,
stuged8f34912009-04-21 01:47:16 +00005581 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00005582 .voltage = {2700, 3600},
stuged8f34912009-04-21 01:47:16 +00005583 },
5584
5585 {
5586 .vendor = "Macronix",
hailfinger377ee962009-08-24 01:42:24 +00005587 .name = "MX29F001B",
hailfingere1e41ea2011-07-27 07:13:06 +00005588 .bustype = BUS_PARALLEL,
mhmd3c80cd2010-09-15 23:31:03 +00005589 .manufacture_id = MACRONIX_ID,
5590 .model_id = MACRONIX_MX29F001B,
hailfinger377ee962009-08-24 01:42:24 +00005591 .total_size = 128,
5592 .page_size = 32 * 1024,
snelsonc6855342010-01-28 23:55:12 +00005593 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5594 .tested = TEST_UNTESTED,
5595 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +00005596 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00005597 .block_erasers =
5598 {
5599 {
Simon Glass8dc82732013-07-16 10:13:51 -06005600 .eraseblocks = {
snelson2d471072010-01-09 05:30:14 +00005601 {8 * 1024, 1},
5602 {4 * 1024, 2},
5603 {8 * 1024, 2},
5604 {32 * 1024, 1},
5605 {64 * 1024, 1},
5606 },
snelsonc6855342010-01-28 23:55:12 +00005607 .block_erase = erase_sector_jedec,
snelson2d471072010-01-09 05:30:14 +00005608 }, {
5609 .eraseblocks = { {128 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +00005610 .block_erase = erase_chip_block_jedec,
snelson2d471072010-01-09 05:30:14 +00005611 }
5612 },
hailfingerfff99532009-11-27 17:49:42 +00005613 .write = write_jedec_1,
hailfinger377ee962009-08-24 01:42:24 +00005614 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00005615 .voltage = {4500, 5500},
hailfinger377ee962009-08-24 01:42:24 +00005616 },
5617
5618 {
5619 .vendor = "Macronix",
5620 .name = "MX29F001T",
hailfingere1e41ea2011-07-27 07:13:06 +00005621 .bustype = BUS_PARALLEL,
mhmd3c80cd2010-09-15 23:31:03 +00005622 .manufacture_id = MACRONIX_ID,
5623 .model_id = MACRONIX_MX29F001T,
hailfinger377ee962009-08-24 01:42:24 +00005624 .total_size = 128,
5625 .page_size = 32 * 1024,
snelsonc6855342010-01-28 23:55:12 +00005626 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
stefanct4cc44652011-05-18 01:31:46 +00005627 .tested = TEST_OK_PREW,
snelsonc6855342010-01-28 23:55:12 +00005628 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +00005629 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00005630 .block_erasers =
5631 {
5632 {
Simon Glass8dc82732013-07-16 10:13:51 -06005633 .eraseblocks = {
snelson2d471072010-01-09 05:30:14 +00005634 {64 * 1024, 1},
5635 {32 * 1024, 1},
5636 {8 * 1024, 2},
5637 {4 * 1024, 2},
5638 {8 * 1024, 1},
5639 },
snelsonc6855342010-01-28 23:55:12 +00005640 .block_erase = erase_sector_jedec,
snelson2d471072010-01-09 05:30:14 +00005641 }, {
5642 .eraseblocks = { {128 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +00005643 .block_erase = erase_chip_block_jedec,
snelson2d471072010-01-09 05:30:14 +00005644 }
5645 },
hailfingerfff99532009-11-27 17:49:42 +00005646 .write = write_jedec_1,
hailfinger377ee962009-08-24 01:42:24 +00005647 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00005648 .voltage = {4500, 5500},
hailfinger377ee962009-08-24 01:42:24 +00005649 },
5650
5651 {
5652 .vendor = "Macronix",
stefanctd6efe1a2011-09-03 11:22:27 +00005653 .name = "MX29F002(N)B",
hailfingere1e41ea2011-07-27 07:13:06 +00005654 .bustype = BUS_PARALLEL,
mhmd3c80cd2010-09-15 23:31:03 +00005655 .manufacture_id = MACRONIX_ID,
5656 .model_id = MACRONIX_MX29F002B,
hailfinger286829b2009-01-08 03:40:17 +00005657 .total_size = 256,
5658 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00005659 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
hailfinger286829b2009-01-08 03:40:17 +00005660 .tested = TEST_UNTESTED,
snelsonc6855342010-01-28 23:55:12 +00005661 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +00005662 .probe_timing = TIMING_ZERO,
snelson1c03aa12009-12-23 17:05:59 +00005663 .block_erasers =
5664 {
5665 {
5666 .eraseblocks = {
5667 {16 * 1024, 1},
5668 {8 * 1024, 2},
5669 {32 * 1024, 1},
5670 {64 * 1024, 3},
5671 },
snelsonc6855342010-01-28 23:55:12 +00005672 .block_erase = erase_sector_jedec,
snelson1c03aa12009-12-23 17:05:59 +00005673 }, {
5674 .eraseblocks = { {256 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +00005675 .block_erase = erase_chip_block_jedec,
snelson1c03aa12009-12-23 17:05:59 +00005676 },
5677 },
hailfingerfff99532009-11-27 17:49:42 +00005678 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00005679 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00005680 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00005681 },
5682
hailfinger286829b2009-01-08 03:40:17 +00005683 {
5684 .vendor = "Macronix",
stefanctd6efe1a2011-09-03 11:22:27 +00005685 .name = "MX29F002(N)T",
hailfingere1e41ea2011-07-27 07:13:06 +00005686 .bustype = BUS_PARALLEL,
mhmd3c80cd2010-09-15 23:31:03 +00005687 .manufacture_id = MACRONIX_ID,
5688 .model_id = MACRONIX_MX29F002T,
hailfinger286829b2009-01-08 03:40:17 +00005689 .total_size = 256,
5690 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00005691 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
stefanct98d917c2011-10-21 12:33:07 +00005692 .tested = TEST_OK_PREW,
snelsonc6855342010-01-28 23:55:12 +00005693 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +00005694 .probe_timing = TIMING_ZERO,
snelson1c03aa12009-12-23 17:05:59 +00005695 .block_erasers =
5696 {
5697 {
5698 .eraseblocks = {
5699 {64 * 1024, 3},
5700 {32 * 1024, 1},
5701 {8 * 1024, 2},
5702 {16 * 1024, 1},
5703 },
snelsonc6855342010-01-28 23:55:12 +00005704 .block_erase = erase_sector_jedec,
snelson1c03aa12009-12-23 17:05:59 +00005705 }, {
5706 .eraseblocks = { {256 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +00005707 .block_erase = erase_chip_block_jedec,
snelson1c03aa12009-12-23 17:05:59 +00005708 },
5709 },
hailfingerfff99532009-11-27 17:49:42 +00005710 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00005711 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00005712 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00005713 },
5714
hailfinger286829b2009-01-08 03:40:17 +00005715 {
5716 .vendor = "Macronix",
mhme8e87912010-09-16 00:51:51 +00005717 .name = "MX29F040",
hailfingere1e41ea2011-07-27 07:13:06 +00005718 .bustype = BUS_PARALLEL,
mhme8e87912010-09-16 00:51:51 +00005719 .manufacture_id = MACRONIX_ID,
5720 .model_id = MACRONIX_MX29F040,
5721 .total_size = 512,
5722 .page_size = 64 * 1024,
5723 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5724 .tested = TEST_UNTESTED,
5725 .probe = probe_jedec,
5726 .probe_timing = TIMING_ZERO,
5727 .block_erasers =
5728 {
5729 {
5730 .eraseblocks = { {64 * 1024, 8} },
5731 .block_erase = erase_sector_jedec,
5732 }, {
5733 .eraseblocks = { {512 * 1024, 1} },
5734 .block_erase = erase_chip_block_jedec,
5735 },
5736 },
5737 .write = write_jedec_1,
5738 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +00005739 .voltage = {4500, 5500},
mhme8e87912010-09-16 00:51:51 +00005740 },
5741
5742 {
5743 .vendor = "Macronix",
David Hendricksc801adb2010-12-09 16:58:56 -08005744 .name = "MX29F040",
hailfingere1e41ea2011-07-27 07:13:06 +00005745 .bustype = BUS_PARALLEL,
David Hendricksc801adb2010-12-09 16:58:56 -08005746 .manufacture_id = MACRONIX_ID,
5747 .model_id = MACRONIX_MX29F040,
5748 .total_size = 512,
5749 .page_size = 64 * 1024,
5750 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5751 .tested = TEST_UNTESTED,
5752 .probe = probe_jedec,
5753 .probe_timing = TIMING_ZERO,
5754 .block_erasers =
5755 {
5756 {
5757 .eraseblocks = { {64 * 1024, 8} },
5758 .block_erase = erase_sector_jedec,
5759 }, {
5760 .eraseblocks = { {512 * 1024, 1} },
5761 .block_erase = erase_chip_block_jedec,
5762 },
5763 },
5764 .write = write_jedec_1,
5765 .read = read_memmapped,
5766 },
5767
5768 {
5769 .vendor = "Macronix",
hailfinger94c758e2009-07-24 13:59:27 +00005770 .name = "MX29LV040",
hailfingere1e41ea2011-07-27 07:13:06 +00005771 .bustype = BUS_PARALLEL,
mhmd3c80cd2010-09-15 23:31:03 +00005772 .manufacture_id = MACRONIX_ID,
5773 .model_id = MACRONIX_MX29LV040,
hailfinger286829b2009-01-08 03:40:17 +00005774 .total_size = 512,
5775 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00005776 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5777 .tested = TEST_UNTESTED,
5778 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +00005779 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00005780 .block_erasers =
5781 {
5782 {
5783 .eraseblocks = { {64 * 1024, 8}, },
snelsonc6855342010-01-28 23:55:12 +00005784 .block_erase = erase_sector_jedec,
snelson2d471072010-01-09 05:30:14 +00005785 }, {
5786 .eraseblocks = { {512 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +00005787 .block_erase = erase_chip_block_jedec,
snelson2d471072010-01-09 05:30:14 +00005788 },
5789 },
hailfingerfff99532009-11-27 17:49:42 +00005790 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00005791 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00005792 .voltage = {2700, 3600},
hailfinger033cdf02008-12-10 10:32:05 +00005793 },
5794
hailfinger286829b2009-01-08 03:40:17 +00005795 {
hailfinger0ae231d2010-07-29 20:01:13 +00005796 .vendor = "MoselVitelic",
5797 .name = "V29C51000B",
hailfingere1e41ea2011-07-27 07:13:06 +00005798 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +00005799 .manufacture_id = SYNCMOS_MVC_ID,
5800 .model_id = MVC_V29C51000B,
5801 .total_size = 64,
5802 .page_size = 512,
5803 .feature_bits = FEATURE_EITHER_RESET,
5804 .tested = TEST_UNTESTED,
5805 .probe = probe_jedec,
5806 .probe_timing = TIMING_ZERO,
5807 .block_erasers =
5808 {
5809 {
5810 .eraseblocks = { {512, 128} },
5811 .block_erase = erase_sector_jedec,
5812 }, {
5813 .eraseblocks = { {64 * 1024, 1} },
5814 .block_erase = erase_chip_block_jedec,
5815 },
5816 },
5817 .write = write_jedec_1,
5818 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00005819 .voltage = {4500, 5500},
hailfinger0ae231d2010-07-29 20:01:13 +00005820 },
5821
5822 {
5823 .vendor = "MoselVitelic",
5824 .name = "V29C51000T",
hailfingere1e41ea2011-07-27 07:13:06 +00005825 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +00005826 .manufacture_id = SYNCMOS_MVC_ID,
5827 .model_id = MVC_V29C51000T,
5828 .total_size = 64,
5829 .page_size = 512,
5830 .feature_bits = FEATURE_EITHER_RESET,
5831 .tested = TEST_UNTESTED,
5832 .probe = probe_jedec,
5833 .probe_timing = TIMING_ZERO,
5834 .block_erasers =
5835 {
5836 {
5837 .eraseblocks = { {512, 128} },
5838 .block_erase = erase_sector_jedec,
5839 }, {
5840 .eraseblocks = { {64 * 1024, 1} },
5841 .block_erase = erase_chip_block_jedec,
5842 },
5843 },
5844 .write = write_jedec_1,
5845 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00005846 .voltage = {4500, 5500},
hailfinger0ae231d2010-07-29 20:01:13 +00005847 },
5848
5849 {
5850 .vendor = "MoselVitelic",
5851 .name = "V29C51400B",
hailfingere1e41ea2011-07-27 07:13:06 +00005852 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +00005853 .manufacture_id = SYNCMOS_MVC_ID,
5854 .model_id = MVC_V29C51400B,
5855 .total_size = 512,
5856 .page_size = 1024,
5857 .feature_bits = FEATURE_EITHER_RESET,
5858 .tested = TEST_UNTESTED,
5859 .probe = probe_jedec,
5860 .probe_timing = TIMING_ZERO,
5861 .block_erasers =
5862 {
5863 {
5864 .eraseblocks = { {1024, 512} },
5865 .block_erase = erase_sector_jedec,
5866 }, {
5867 .eraseblocks = { {512 * 1024, 1} },
5868 .block_erase = erase_chip_block_jedec,
5869 },
5870 },
5871 .write = write_jedec_1,
5872 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00005873 .voltage = {4500, 5500},
hailfinger0ae231d2010-07-29 20:01:13 +00005874 },
5875
5876 {
5877 .vendor = "MoselVitelic",
5878 .name = "V29C51400T",
hailfingere1e41ea2011-07-27 07:13:06 +00005879 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +00005880 .manufacture_id = SYNCMOS_MVC_ID,
5881 .model_id = MVC_V29C51400T,
5882 .total_size = 512,
5883 .page_size = 1024,
5884 .feature_bits = FEATURE_EITHER_RESET,
5885 .tested = TEST_UNTESTED,
5886 .probe = probe_jedec,
5887 .probe_timing = TIMING_ZERO,
5888 .block_erasers =
5889 {
5890 {
5891 .eraseblocks = { {1024, 512} },
5892 .block_erase = erase_sector_jedec,
5893 }, {
5894 .eraseblocks = { {512 * 1024, 1} },
5895 .block_erase = erase_chip_block_jedec,
5896 },
5897 },
5898 .write = write_jedec_1,
5899 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00005900 .voltage = {4500, 5500},
hailfinger0ae231d2010-07-29 20:01:13 +00005901 },
5902
5903 {
5904 .vendor = "MoselVitelic",
5905 .name = "V29LC51000",
hailfingere1e41ea2011-07-27 07:13:06 +00005906 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +00005907 .manufacture_id = SYNCMOS_MVC_ID,
5908 .model_id = MVC_V29LC51000,
5909 .total_size = 64,
5910 .page_size = 512,
5911 .feature_bits = FEATURE_EITHER_RESET,
5912 .tested = TEST_UNTESTED,
5913 .probe = probe_jedec,
5914 .probe_timing = TIMING_ZERO,
5915 .block_erasers =
5916 {
5917 {
5918 .eraseblocks = { {512, 128} },
5919 .block_erase = erase_sector_jedec,
5920 }, {
5921 .eraseblocks = { {64 * 1024, 1} },
5922 .block_erase = erase_chip_block_jedec,
5923 },
5924 },
5925 .write = write_jedec_1,
5926 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00005927 .voltage = {4500, 5500},
hailfinger0ae231d2010-07-29 20:01:13 +00005928 },
5929
5930 {
5931 .vendor = "MoselVitelic",
5932 .name = "V29LC51001",
hailfingere1e41ea2011-07-27 07:13:06 +00005933 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +00005934 .manufacture_id = SYNCMOS_MVC_ID,
5935 .model_id = MVC_V29LC51001,
5936 .total_size = 128,
5937 .page_size = 512,
5938 .feature_bits = FEATURE_EITHER_RESET,
5939 .tested = TEST_UNTESTED,
5940 .probe = probe_jedec,
5941 .probe_timing = TIMING_ZERO,
5942 .block_erasers =
5943 {
5944 {
5945 .eraseblocks = { {512, 256} },
5946 .block_erase = erase_sector_jedec,
5947 }, {
5948 .eraseblocks = { {128 * 1024, 1} },
5949 .block_erase = erase_chip_block_jedec,
5950 },
5951 },
5952 .write = write_jedec_1,
5953 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00005954 .voltage = {4500, 5500},
hailfinger0ae231d2010-07-29 20:01:13 +00005955 },
5956
5957 {
5958 .vendor = "MoselVitelic",
5959 .name = "V29LC51002",
hailfingere1e41ea2011-07-27 07:13:06 +00005960 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +00005961 .manufacture_id = SYNCMOS_MVC_ID,
5962 .model_id = MVC_V29LC51002,
5963 .total_size = 256,
5964 .page_size = 512,
5965 .feature_bits = FEATURE_EITHER_RESET,
5966 .tested = TEST_UNTESTED,
5967 .probe = probe_jedec,
5968 .probe_timing = TIMING_ZERO,
5969 .block_erasers =
5970 {
5971 {
5972 .eraseblocks = { {512, 512} },
5973 .block_erase = erase_sector_jedec,
5974 }, {
5975 .eraseblocks = { {256 * 1024, 1} },
5976 .block_erase = erase_chip_block_jedec,
5977 },
5978 },
5979 .write = write_jedec_1,
5980 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00005981 .voltage = {4500, 5500},
hailfinger0ae231d2010-07-29 20:01:13 +00005982 },
5983
5984 {
hailfinger286829b2009-01-08 03:40:17 +00005985 .vendor = "Numonyx",
5986 .name = "M25PE10",
hailfingere1e41ea2011-07-27 07:13:06 +00005987 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00005988 .manufacture_id = ST_ID,
hailfingerc391ccb2009-06-12 11:45:10 +00005989 .model_id = ST_M25PE10,
hailfinger286829b2009-01-08 03:40:17 +00005990 .total_size = 128,
5991 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08005992 .feature_bits = FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00005993 .tested = TEST_UNTESTED,
5994 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00005995 .probe_timing = TIMING_ZERO,
snelson4d31f0d2010-01-19 03:23:07 +00005996 .block_erasers =
5997 {
5998 {
5999 .eraseblocks = { {4 * 1024, 32} },
6000 .block_erase = spi_block_erase_20,
6001 }, {
6002 .eraseblocks = { {64 * 1024, 2} },
6003 .block_erase = spi_block_erase_d8,
6004 }, {
6005 .eraseblocks = { {128 * 1024, 1} },
6006 .block_erase = spi_block_erase_c7,
6007 }
6008 },
hailfingerb9560ee2010-07-14 20:21:22 +00006009 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00006010 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00006011 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00006012 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00006013 },
6014
hailfinger286829b2009-01-08 03:40:17 +00006015 {
6016 .vendor = "Numonyx",
6017 .name = "M25PE20",
hailfingere1e41ea2011-07-27 07:13:06 +00006018 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00006019 .manufacture_id = ST_ID,
hailfingerc391ccb2009-06-12 11:45:10 +00006020 .model_id = ST_M25PE20,
hailfinger286829b2009-01-08 03:40:17 +00006021 .total_size = 256,
6022 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08006023 .feature_bits = FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00006024 .tested = TEST_UNTESTED,
6025 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00006026 .probe_timing = TIMING_ZERO,
snelson4d31f0d2010-01-19 03:23:07 +00006027 .block_erasers =
6028 {
6029 {
6030 .eraseblocks = { {4 * 1024, 64} },
6031 .block_erase = spi_block_erase_20,
6032 }, {
6033 .eraseblocks = { {64 * 1024, 4} },
6034 .block_erase = spi_block_erase_d8,
6035 }, {
6036 .eraseblocks = { {256 * 1024, 1} },
6037 .block_erase = spi_block_erase_c7,
6038 }
6039 },
hailfingerb9560ee2010-07-14 20:21:22 +00006040 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00006041 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00006042 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00006043 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00006044 },
6045
hailfinger286829b2009-01-08 03:40:17 +00006046 {
6047 .vendor = "Numonyx",
6048 .name = "M25PE40",
hailfingere1e41ea2011-07-27 07:13:06 +00006049 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00006050 .manufacture_id = ST_ID,
hailfingerc391ccb2009-06-12 11:45:10 +00006051 .model_id = ST_M25PE40,
snelson4d31f0d2010-01-19 03:23:07 +00006052 .total_size = 512,
hailfinger286829b2009-01-08 03:40:17 +00006053 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08006054 .feature_bits = FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00006055 .tested = TEST_UNTESTED,
6056 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00006057 .probe_timing = TIMING_ZERO,
snelson4d31f0d2010-01-19 03:23:07 +00006058 .block_erasers =
6059 {
6060 {
6061 .eraseblocks = { {4 * 1024, 128} },
6062 .block_erase = spi_block_erase_20,
6063 }, {
6064 .eraseblocks = { {64 * 1024, 8} },
6065 .block_erase = spi_block_erase_d8,
6066 }, {
6067 .eraseblocks = { {512 * 1024, 1} },
6068 .block_erase = spi_block_erase_c7,
6069 }
6070 },
hailfingerb9560ee2010-07-14 20:21:22 +00006071 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00006072 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00006073 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00006074 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00006075 },
6076
hailfinger286829b2009-01-08 03:40:17 +00006077 {
6078 .vendor = "Numonyx",
6079 .name = "M25PE80",
hailfingere1e41ea2011-07-27 07:13:06 +00006080 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00006081 .manufacture_id = ST_ID,
hailfingerc391ccb2009-06-12 11:45:10 +00006082 .model_id = ST_M25PE80,
hailfinger286829b2009-01-08 03:40:17 +00006083 .total_size = 1024,
6084 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08006085 .feature_bits = FEATURE_UNBOUND_READ,
Stefan Tauner718d1eb2016-08-18 18:00:53 -07006086 .tested = TEST_OK_PREWU,
hailfinger286829b2009-01-08 03:40:17 +00006087 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00006088 .probe_timing = TIMING_ZERO,
snelson4d31f0d2010-01-19 03:23:07 +00006089 .block_erasers =
6090 {
6091 {
6092 .eraseblocks = { {4 * 1024, 256} },
6093 .block_erase = spi_block_erase_20,
6094 }, {
6095 .eraseblocks = { {64 * 1024, 16} },
6096 .block_erase = spi_block_erase_d8,
6097 }, {
6098 .eraseblocks = { {1024 * 1024, 1} },
6099 .block_erase = spi_block_erase_c7,
6100 }
6101 },
hailfingerb9560ee2010-07-14 20:21:22 +00006102 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00006103 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00006104 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00006105 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00006106 },
6107
hailfinger286829b2009-01-08 03:40:17 +00006108 {
6109 .vendor = "Numonyx",
6110 .name = "M25PE16",
hailfingere1e41ea2011-07-27 07:13:06 +00006111 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00006112 .manufacture_id = ST_ID,
hailfingerc391ccb2009-06-12 11:45:10 +00006113 .model_id = ST_M25PE16,
hailfinger286829b2009-01-08 03:40:17 +00006114 .total_size = 2048,
6115 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08006116 .feature_bits = FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00006117 .tested = TEST_UNTESTED,
6118 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00006119 .probe_timing = TIMING_ZERO,
snelson4d31f0d2010-01-19 03:23:07 +00006120 .block_erasers =
6121 {
6122 {
6123 .eraseblocks = { {4 * 1024, 512} },
6124 .block_erase = spi_block_erase_20,
6125 }, {
6126 .eraseblocks = { {64 * 1024, 32} },
6127 .block_erase = spi_block_erase_d8,
6128 }, {
6129 .eraseblocks = { {2 * 1024 * 1024, 1} },
6130 .block_erase = spi_block_erase_c7,
6131 }
6132 },
hailfingerb9560ee2010-07-14 20:21:22 +00006133 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00006134 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00006135 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00006136 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00006137 },
6138
hailfinger286829b2009-01-08 03:40:17 +00006139 {
David Hendricksbfa624b2012-07-24 12:47:59 -07006140 .vendor = "Numonyx",
6141 /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */
6142 .name = "N25Q064..1E",
6143 .bustype = BUS_SPI,
6144 .manufacture_id = ST_ID,
6145 .model_id = ST_N25Q064__1E,
6146 .total_size = 8192,
6147 .page_size = 256,
6148 /* supports SFDP */
6149 /* OTP: 64B total; read 0x4B, write 0x42 */
Stefan Tauner9816fc82016-08-12 15:47:49 -07006150 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
David Hendricks488cf072015-11-23 16:45:07 -08006151 .tested = TEST_OK_PREWU,
David Hendricksbfa624b2012-07-24 12:47:59 -07006152 .probe = probe_spi_rdid,
6153 .probe_timing = TIMING_ZERO,
6154 .block_erasers =
6155 {
6156 {
6157 .eraseblocks = { {4 * 1024, 2048 } },
6158 .block_erase = spi_block_erase_20,
6159 }, {
6160 .eraseblocks = { {64 * 1024, 128} },
6161 .block_erase = spi_block_erase_d8,
6162 }, {
6163 .eraseblocks = { {8 * 1024 * 1024, 1} },
6164 .block_erase = spi_block_erase_c7,
6165 }
6166 },
6167 .unlock = spi_disable_blockprotect,
6168 .write = spi_chip_write_256,
6169 .read = spi_chip_read,
6170 .voltage = {1700, 2000},
6171 .wp = &wp_w25,
6172 },
6173
6174 {
6175 .vendor = "Numonyx",
6176 /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */
6177 .name = "N25Q064..3E",
6178 .bustype = BUS_SPI,
6179 .manufacture_id = ST_ID,
6180 .model_id = ST_N25Q064__3E,
6181 .total_size = 8192,
6182 .page_size = 256,
6183 /* supports SFDP */
6184 /* OTP: 64B total; read 0x4B, write 0x42 */
Stefan Tauner9816fc82016-08-12 15:47:49 -07006185 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
David Hendricks488cf072015-11-23 16:45:07 -08006186 .tested = TEST_OK_PREWU,
David Hendricksbfa624b2012-07-24 12:47:59 -07006187 .probe = probe_spi_rdid,
6188 .probe_timing = TIMING_ZERO,
6189 .block_erasers =
6190 {
6191 {
6192 .eraseblocks = { {4 * 1024, 2048 } },
6193 .block_erase = spi_block_erase_20,
6194 }, {
6195 .eraseblocks = { {64 * 1024, 128} },
6196 .block_erase = spi_block_erase_d8,
6197 }, {
6198 .eraseblocks = { {8 * 1024 * 1024, 1} },
6199 .block_erase = spi_block_erase_c7,
6200 }
6201 },
6202 .unlock = spi_disable_blockprotect,
6203 .write = spi_chip_write_256,
6204 .read = spi_chip_read,
6205 .voltage = {2700, 3600},
6206 .wp = &wp_w25,
6207 },
6208
6209 {
David Hendricks828a9b12015-03-20 11:24:28 -07006210 .vendor = "Numonyx",
Ed Swierkc3290082017-07-03 13:33:44 -07006211 .name = "N25Q256..3E/MT25QL256", /* ..3E/L = 3V, uniform 64KB/4KB blocks/sectors */
David Hendricks828a9b12015-03-20 11:24:28 -07006212 .bustype = BUS_SPI,
Ed Swierkc3290082017-07-03 13:33:44 -07006213 .manufacture_id = ST_ID,
David Hendricks828a9b12015-03-20 11:24:28 -07006214 .model_id = ST_N25Q256__3E,
Ed Swierkc3290082017-07-03 13:33:44 -07006215 .total_size = 32768,
David Hendricks828a9b12015-03-20 11:24:28 -07006216 .page_size = 256,
6217 /* supports SFDP */
6218 /* OTP: 64B total; read 0x4B, write 0x42 */
Ed Swierkc3290082017-07-03 13:33:44 -07006219 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP | FEATURE_4BA_SUPPORT,
6220 .four_bytes_addr_funcs =
6221 {
6222 .read_nbyte = spi_nbyte_read_4ba_direct,
6223 .program_byte = spi_byte_program_4ba_direct,
6224 .program_nbyte = spi_nbyte_program_4ba_direct
6225 },
David Hendricks488cf072015-11-23 16:45:07 -08006226 .tested = TEST_OK_PREWU,
David Hendricks828a9b12015-03-20 11:24:28 -07006227 .probe = probe_spi_rdid,
6228 .probe_timing = TIMING_ZERO,
Ed Swierkc3290082017-07-03 13:33:44 -07006229 .block_erasers = {
David Hendricks828a9b12015-03-20 11:24:28 -07006230 {
Ed Swierkc3290082017-07-03 13:33:44 -07006231 .eraseblocks = { {4 * 1024, 8192} },
6232 .block_erase = spi_block_erase_21_4ba_direct,
David Hendricks828a9b12015-03-20 11:24:28 -07006233 }, {
6234 .eraseblocks = { {64 * 1024, 512} },
Ed Swierkc3290082017-07-03 13:33:44 -07006235 .block_erase = spi_block_erase_dc_4ba_direct,
David Hendricks828a9b12015-03-20 11:24:28 -07006236 }, {
Ed Swierkc3290082017-07-03 13:33:44 -07006237 .eraseblocks = { {32768 * 1024, 1} },
David Hendricks828a9b12015-03-20 11:24:28 -07006238 .block_erase = spi_block_erase_c7,
6239 }
6240 },
Ed Swierkc3290082017-07-03 13:33:44 -07006241 .unlock = spi_disable_blockprotect, /* TODO: per 64kB sector lock registers */
6242 .write = spi_chip_write_256, /* Multi I/O supported */
6243 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
David Hendricks828a9b12015-03-20 11:24:28 -07006244 .voltage = {2700, 3600},
Ed Swierkc3290082017-07-03 13:33:44 -07006245 },
6246
6247 {
6248 .vendor = "Micron",
6249 .name = "N25Q512..3E/MT25QL512", /* ..3E/L = 3V, uniform 64KB/4KB blocks/sectors */
6250 .bustype = BUS_SPI,
6251 .manufacture_id = ST_ID,
6252 .model_id = ST_N25Q512__3E,
6253 .total_size = 65536,
6254 .page_size = 256,
6255 /* supports SFDP */
6256 /* OTP: 64B total; read 0x4B, write 0x42 */
6257 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_SUPPORT,
6258 .four_bytes_addr_funcs =
6259 {
6260 .read_nbyte = spi_nbyte_read_4ba_direct,
6261 .program_byte = spi_byte_program_4ba_direct,
6262 .program_nbyte = spi_nbyte_program_4ba_direct
6263 },
6264 .tested = TEST_OK_PREW,
6265 .probe = probe_spi_rdid,
6266 .probe_timing = TIMING_ZERO,
6267 .block_erasers = {
6268 {
6269 .eraseblocks = { {4 * 1024, 16384} },
6270 .block_erase = spi_block_erase_21_4ba_direct,
6271 }, {
6272 .eraseblocks = { {64 * 1024, 1024} },
6273 .block_erase = spi_block_erase_dc_4ba_direct,
6274 }, {
6275 .eraseblocks = { {65536 * 1024, 1} },
6276 .block_erase = spi_block_erase_c7,
6277 }
6278 },
6279 .unlock = spi_disable_blockprotect, /* TODO: per 64kB sector lock registers */
6280 .write = spi_chip_write_256, /* Multi I/O supported */
6281 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6282 .voltage = {2700, 3600},
David Hendricks828a9b12015-03-20 11:24:28 -07006283 },
6284
6285 {
hailfinger286829b2009-01-08 03:40:17 +00006286 .vendor = "PMC",
6287 .name = "Pm25LV010",
hailfingere1e41ea2011-07-27 07:13:06 +00006288 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00006289 .manufacture_id = PMC_ID,
mhmd3c80cd2010-09-15 23:31:03 +00006290 .model_id = PMC_PM25LV010,
hailfinger286829b2009-01-08 03:40:17 +00006291 .total_size = 128,
6292 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08006293 .feature_bits = FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00006294 .tested = TEST_UNTESTED,
6295 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00006296 .probe_timing = TIMING_ZERO,
snelson4d31f0d2010-01-19 03:23:07 +00006297 .block_erasers =
6298 {
6299 {
6300 .eraseblocks = { {4 * 1024, 32} },
6301 .block_erase = spi_block_erase_d7,
6302 }, {
6303 .eraseblocks = { {32 * 1024, 4} },
6304 .block_erase = spi_block_erase_d8,
6305 }, {
6306 .eraseblocks = { {128 * 1024, 1} },
6307 .block_erase = spi_block_erase_c7,
6308 }
6309 },
hailfingerb9560ee2010-07-14 20:21:22 +00006310 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00006311 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00006312 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00006313 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00006314 },
6315
hailfinger286829b2009-01-08 03:40:17 +00006316 {
6317 .vendor = "PMC",
6318 .name = "Pm25LV016B",
hailfingere1e41ea2011-07-27 07:13:06 +00006319 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00006320 .manufacture_id = PMC_ID,
mhmd3c80cd2010-09-15 23:31:03 +00006321 .model_id = PMC_PM25LV016B,
hailfinger286829b2009-01-08 03:40:17 +00006322 .total_size = 2048,
6323 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08006324 .feature_bits = FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00006325 .tested = TEST_UNTESTED,
6326 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00006327 .probe_timing = TIMING_ZERO,
snelson4d31f0d2010-01-19 03:23:07 +00006328 .block_erasers =
6329 {
6330 {
6331 .eraseblocks = { {4 * 1024, 512} },
6332 .block_erase = spi_block_erase_d7,
6333 }, {
6334 .eraseblocks = { {4 * 1024, 512} },
6335 .block_erase = spi_block_erase_20,
6336 }, {
6337 .eraseblocks = { {64 * 1024, 32} },
6338 .block_erase = spi_block_erase_d8,
6339 }, {
6340 .eraseblocks = { {2 * 1024 * 1024, 1} },
6341 .block_erase = spi_block_erase_60,
6342 }, {
6343 .eraseblocks = { {2 * 1024 * 1024, 1} },
6344 .block_erase = spi_block_erase_c7,
6345 }
6346 },
hailfingerb9560ee2010-07-14 20:21:22 +00006347 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00006348 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00006349 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +00006350 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00006351 },
6352
hailfinger286829b2009-01-08 03:40:17 +00006353 {
6354 .vendor = "PMC",
6355 .name = "Pm25LV020",
hailfingere1e41ea2011-07-27 07:13:06 +00006356 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00006357 .manufacture_id = PMC_ID,
mhmd3c80cd2010-09-15 23:31:03 +00006358 .model_id = PMC_PM25LV020,
hailfinger286829b2009-01-08 03:40:17 +00006359 .total_size = 256,
6360 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08006361 .feature_bits = FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00006362 .tested = TEST_UNTESTED,
6363 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00006364 .probe_timing = TIMING_ZERO,
snelson4d31f0d2010-01-19 03:23:07 +00006365 .block_erasers =
6366 {
6367 {
6368 .eraseblocks = { {4 * 1024, 64} },
6369 .block_erase = spi_block_erase_d7,
6370 }, {
6371 .eraseblocks = { {64 * 1024, 4} },
6372 .block_erase = spi_block_erase_d8,
6373 }, {
6374 .eraseblocks = { {256 * 1024, 1} },
6375 .block_erase = spi_block_erase_c7,
6376 }
6377 },
hailfingerb9560ee2010-07-14 20:21:22 +00006378 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00006379 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00006380 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00006381 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00006382 },
6383
hailfinger286829b2009-01-08 03:40:17 +00006384 {
6385 .vendor = "PMC",
6386 .name = "Pm25LV040",
hailfingere1e41ea2011-07-27 07:13:06 +00006387 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00006388 .manufacture_id = PMC_ID,
mhmd3c80cd2010-09-15 23:31:03 +00006389 .model_id = PMC_PM25LV040,
hailfinger286829b2009-01-08 03:40:17 +00006390 .total_size = 512,
6391 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08006392 .feature_bits = FEATURE_UNBOUND_READ,
6393 .tested = TEST_OK_PREWU,
hailfinger286829b2009-01-08 03:40:17 +00006394 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00006395 .probe_timing = TIMING_ZERO,
snelson4d31f0d2010-01-19 03:23:07 +00006396 .block_erasers =
6397 {
6398 {
6399 .eraseblocks = { {4 * 1024, 128} },
6400 .block_erase = spi_block_erase_d7,
6401 }, {
6402 .eraseblocks = { {64 * 1024, 8} },
6403 .block_erase = spi_block_erase_d8,
6404 }, {
6405 .eraseblocks = { {512 * 1024, 1} },
6406 .block_erase = spi_block_erase_c7,
6407 }
6408 },
hailfingerb9560ee2010-07-14 20:21:22 +00006409 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00006410 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00006411 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00006412 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00006413 },
6414
hailfinger286829b2009-01-08 03:40:17 +00006415 {
6416 .vendor = "PMC",
6417 .name = "Pm25LV080B",
hailfingere1e41ea2011-07-27 07:13:06 +00006418 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00006419 .manufacture_id = PMC_ID,
mhmd3c80cd2010-09-15 23:31:03 +00006420 .model_id = PMC_PM25LV080B,
hailfinger286829b2009-01-08 03:40:17 +00006421 .total_size = 1024,
6422 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08006423 .feature_bits = FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00006424 .tested = TEST_UNTESTED,
6425 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00006426 .probe_timing = TIMING_ZERO,
snelson4d31f0d2010-01-19 03:23:07 +00006427 .block_erasers =
6428 {
6429 {
6430 .eraseblocks = { {4 * 1024, 256} },
6431 .block_erase = spi_block_erase_d7,
6432 }, {
6433 .eraseblocks = { {4 * 1024, 256} },
6434 .block_erase = spi_block_erase_20,
6435 }, {
6436 .eraseblocks = { {64 * 1024, 16} },
6437 .block_erase = spi_block_erase_d8,
6438 }, {
6439 .eraseblocks = { {1024 * 1024, 1} },
6440 .block_erase = spi_block_erase_60,
6441 }, {
6442 .eraseblocks = { {1024 * 1024, 1} },
6443 .block_erase = spi_block_erase_c7,
6444 }
6445 },
hailfingerb9560ee2010-07-14 20:21:22 +00006446 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00006447 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00006448 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00006449 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00006450 },
6451
hailfinger286829b2009-01-08 03:40:17 +00006452 {
6453 .vendor = "PMC",
6454 .name = "Pm25LV512",
hailfingere1e41ea2011-07-27 07:13:06 +00006455 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00006456 .manufacture_id = PMC_ID,
mhmd3c80cd2010-09-15 23:31:03 +00006457 .model_id = PMC_PM25LV512,
hailfinger286829b2009-01-08 03:40:17 +00006458 .total_size = 64,
6459 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08006460 .feature_bits = FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00006461 .tested = TEST_UNTESTED,
6462 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00006463 .probe_timing = TIMING_ZERO,
snelson4d31f0d2010-01-19 03:23:07 +00006464 .block_erasers =
6465 {
6466 {
6467 .eraseblocks = { {4 * 1024, 16} },
6468 .block_erase = spi_block_erase_d7,
6469 }, {
6470 .eraseblocks = { {32 * 1024, 2} },
6471 .block_erase = spi_block_erase_d8,
6472 }, {
6473 .eraseblocks = { {64 * 1024, 1} },
6474 .block_erase = spi_block_erase_c7,
6475 }
6476 },
hailfingerb9560ee2010-07-14 20:21:22 +00006477 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00006478 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00006479 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +00006480 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00006481 },
6482
hailfinger286829b2009-01-08 03:40:17 +00006483 {
6484 .vendor = "PMC",
hailfingerc43afc92009-12-22 22:15:33 +00006485 .name = "Pm29F002T",
hailfingere1e41ea2011-07-27 07:13:06 +00006486 .bustype = BUS_PARALLEL,
uwe7a083f82009-06-14 21:53:26 +00006487 .manufacture_id = PMC_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00006488 .model_id = PMC_PM29F002T,
uwe7a083f82009-06-14 21:53:26 +00006489 .total_size = 256,
hailfingerc43afc92009-12-22 22:15:33 +00006490 .page_size = 8 * 1024,
snelsonc6855342010-01-28 23:55:12 +00006491 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Souvik Ghoshd64964a2016-06-13 17:51:25 -07006492 .tested = TEST_OK_PREW,
snelsonc6855342010-01-28 23:55:12 +00006493 .probe = probe_jedec,
Simon Glass8dc82732013-07-16 10:13:51 -06006494 .probe_timing = TIMING_FIXME,
hailfingerc43afc92009-12-22 22:15:33 +00006495 .block_erasers =
6496 {
6497 {
6498 .eraseblocks = {
6499 {128 * 1024, 1},
6500 {96 * 1024, 1},
6501 {8 * 1024, 2},
6502 {16 * 1024, 1},
6503 },
snelsonc6855342010-01-28 23:55:12 +00006504 .block_erase = erase_sector_jedec,
hailfingerc43afc92009-12-22 22:15:33 +00006505 }, {
6506 .eraseblocks = { {256 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +00006507 .block_erase = erase_chip_block_jedec,
hailfingerc43afc92009-12-22 22:15:33 +00006508 },
6509 },
snelsonc6855342010-01-28 23:55:12 +00006510 .write = write_jedec_1,
uwe7a083f82009-06-14 21:53:26 +00006511 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00006512 .voltage = {4500, 5500},
uwe7a083f82009-06-14 21:53:26 +00006513 },
6514
6515 {
6516 .vendor = "PMC",
hailfingerc43afc92009-12-22 22:15:33 +00006517 .name = "Pm29F002B",
hailfingere1e41ea2011-07-27 07:13:06 +00006518 .bustype = BUS_PARALLEL,
uwe7a083f82009-06-14 21:53:26 +00006519 .manufacture_id = PMC_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00006520 .model_id = PMC_PM29F002B,
uwe7a083f82009-06-14 21:53:26 +00006521 .total_size = 256,
hailfingerc43afc92009-12-22 22:15:33 +00006522 .page_size = 8 * 1024,
snelsonc6855342010-01-28 23:55:12 +00006523 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
uwe7a083f82009-06-14 21:53:26 +00006524 .tested = TEST_UNTESTED,
snelsonc6855342010-01-28 23:55:12 +00006525 .probe = probe_jedec,
Simon Glass8dc82732013-07-16 10:13:51 -06006526 .probe_timing = TIMING_FIXME,
hailfingerc43afc92009-12-22 22:15:33 +00006527 .block_erasers =
6528 {
6529 {
6530 .eraseblocks = {
6531 {16 * 1024, 1},
6532 {8 * 1024, 2},
6533 {96 * 1024, 1},
6534 {128 * 1024, 1},
6535 },
snelsonc6855342010-01-28 23:55:12 +00006536 .block_erase = erase_sector_jedec,
hailfingerc43afc92009-12-22 22:15:33 +00006537 }, {
6538 .eraseblocks = { {256 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +00006539 .block_erase = erase_chip_block_jedec,
hailfingerc43afc92009-12-22 22:15:33 +00006540 },
6541 },
snelsonc6855342010-01-28 23:55:12 +00006542 .write = write_jedec_1,
uwe7a083f82009-06-14 21:53:26 +00006543 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00006544 .voltage = {4500, 5500},
uwe7a083f82009-06-14 21:53:26 +00006545 },
6546
6547 {
6548 .vendor = "PMC",
ruika316f402009-05-17 17:02:07 +00006549 .name = "Pm39LV010",
hailfingere1e41ea2011-07-27 07:13:06 +00006550 .bustype = BUS_PARALLEL,
ruika316f402009-05-17 17:02:07 +00006551 .manufacture_id = PMC_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00006552 .model_id = PMC_PM39F010, /* Pm39LV010 and Pm39F010 have identical IDs but different voltage */
ruika316f402009-05-17 17:02:07 +00006553 .total_size = 128,
6554 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +00006555 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
stefanct98d917c2011-10-21 12:33:07 +00006556 .tested = TEST_OK_PREW,
ruika316f402009-05-17 17:02:07 +00006557 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00006558 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelson4d31f0d2010-01-19 03:23:07 +00006559 .block_erasers =
6560 {
6561 {
6562 .eraseblocks = { {4 * 1024, 32} },
6563 .block_erase = erase_sector_jedec,
6564 }, {
6565 .eraseblocks = { {64 * 1024, 2} },
6566 .block_erase = erase_block_jedec,
6567 }, {
6568 .eraseblocks = { {128 * 1024, 1} },
6569 .block_erase = erase_chip_block_jedec,
6570 }
6571 },
snelsonc6855342010-01-28 23:55:12 +00006572 .write = write_jedec_1,
ruika316f402009-05-17 17:02:07 +00006573 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00006574 .voltage = {2700, 3600},
ruika316f402009-05-17 17:02:07 +00006575 },
6576
6577 {
6578 .vendor = "PMC",
hailfingerd444cc72010-03-27 23:25:14 +00006579 .name = "Pm39LV020",
hailfingere1e41ea2011-07-27 07:13:06 +00006580 .bustype = BUS_PARALLEL,
hailfingerd444cc72010-03-27 23:25:14 +00006581 .manufacture_id = PMC_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00006582 .model_id = PMC_PM39LV020,
hailfingerd444cc72010-03-27 23:25:14 +00006583 .total_size = 256,
6584 .page_size = 4096,
6585 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
6586 .tested = TEST_UNTESTED,
6587 .probe = probe_jedec,
6588 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
6589 .block_erasers =
6590 {
6591 {
6592 .eraseblocks = { {4 * 1024, 64} },
6593 .block_erase = erase_sector_jedec,
6594 }, {
6595 .eraseblocks = { {64 * 1024, 4} },
6596 .block_erase = erase_block_jedec,
6597 }, {
6598 .eraseblocks = { {256 * 1024, 1} },
6599 .block_erase = erase_chip_block_jedec,
6600 }
6601 },
6602 .write = write_jedec_1,
6603 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00006604 .voltage = {2700, 3600},
hailfingerd444cc72010-03-27 23:25:14 +00006605 },
6606
6607 {
6608 .vendor = "PMC",
6609 .name = "Pm39LV040",
hailfingere1e41ea2011-07-27 07:13:06 +00006610 .bustype = BUS_PARALLEL,
hailfingerd444cc72010-03-27 23:25:14 +00006611 .manufacture_id = PMC_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00006612 .model_id = PMC_PM39LV040,
hailfingerd444cc72010-03-27 23:25:14 +00006613 .total_size = 512,
6614 .page_size = 4096,
6615 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
stefanct98d917c2011-10-21 12:33:07 +00006616 .tested = TEST_OK_PR,
hailfingerd444cc72010-03-27 23:25:14 +00006617 .probe = probe_jedec,
6618 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
6619 .block_erasers =
6620 {
6621 {
6622 .eraseblocks = { {4 * 1024, 128} },
6623 .block_erase = erase_sector_jedec,
6624 }, {
6625 .eraseblocks = { {64 * 1024, 8} },
6626 .block_erase = erase_block_jedec,
6627 }, {
6628 .eraseblocks = { {512 * 1024, 1} },
6629 .block_erase = erase_chip_block_jedec,
6630 }
6631 },
6632 .write = write_jedec_1,
6633 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00006634 .voltage = {2700, 3600},
hailfingerd444cc72010-03-27 23:25:14 +00006635 },
Simon Glass8dc82732013-07-16 10:13:51 -06006636
hailfingerd444cc72010-03-27 23:25:14 +00006637 {
6638 .vendor = "PMC",
hailfinger286829b2009-01-08 03:40:17 +00006639 .name = "Pm49FL002",
hailfingere1e41ea2011-07-27 07:13:06 +00006640 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00006641 .manufacture_id = PMC_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00006642 .model_id = PMC_PM49FL002,
hailfinger286829b2009-01-08 03:40:17 +00006643 .total_size = 256,
6644 .page_size = 16 * 1024,
snelsonc6855342010-01-28 23:55:12 +00006645 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
David Hendricksc801adb2010-12-09 16:58:56 -08006646 .tested = TEST_OK_PRE,
hailfingerafac00e2010-01-09 02:24:17 +00006647 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00006648 .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
snelson4d31f0d2010-01-19 03:23:07 +00006649 .block_erasers =
6650 {
6651 {
6652 .eraseblocks = { {4 * 1024, 64} },
6653 .block_erase = erase_sector_jedec,
6654 }, {
6655 .eraseblocks = { {16 * 1024, 16} },
6656 .block_erase = erase_block_jedec,
6657 }, {
6658 .eraseblocks = { {256 * 1024, 1} },
6659 .block_erase = erase_chip_block_jedec,
6660 }
6661 },
snelson1ee293c2010-02-19 00:52:10 +00006662 .unlock = unlock_49fl00x,
snelson59c83d22010-02-27 18:01:15 +00006663 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00006664 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00006665 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00006666 },
6667
hailfinger286829b2009-01-08 03:40:17 +00006668 {
6669 .vendor = "PMC",
6670 .name = "Pm49FL004",
hailfingere1e41ea2011-07-27 07:13:06 +00006671 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00006672 .manufacture_id = PMC_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00006673 .model_id = PMC_PM49FL004,
hailfinger286829b2009-01-08 03:40:17 +00006674 .total_size = 512,
6675 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00006676 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
David Hendricksc801adb2010-12-09 16:58:56 -08006677 .tested = TEST_OK_PRE,
hailfingerafac00e2010-01-09 02:24:17 +00006678 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00006679 .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
snelson4d31f0d2010-01-19 03:23:07 +00006680 .block_erasers =
6681 {
6682 {
6683 .eraseblocks = { {4 * 1024, 128} },
6684 .block_erase = erase_sector_jedec,
6685 }, {
6686 .eraseblocks = { {64 * 1024, 8} },
6687 .block_erase = erase_block_jedec,
6688 }, {
6689 .eraseblocks = { {512 * 1024, 1} },
6690 .block_erase = erase_chip_block_jedec,
6691 }
6692 },
snelson1ee293c2010-02-19 00:52:10 +00006693 .unlock = unlock_49fl00x,
snelson59c83d22010-02-27 18:01:15 +00006694 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00006695 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00006696 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00006697 },
6698
hailfinger286829b2009-01-08 03:40:17 +00006699 {
hailfingerf6aa9cc2009-11-24 02:11:08 +00006700 .vendor = "Sanyo",
6701 .name = "LF25FW203A",
hailfingere1e41ea2011-07-27 07:13:06 +00006702 .bustype = BUS_SPI,
hailfingerf6aa9cc2009-11-24 02:11:08 +00006703 .manufacture_id = SANYO_ID,
6704 .model_id = SANYO_LE25FW203A,
6705 .total_size = 2048,
6706 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08006707 .feature_bits = FEATURE_UNBOUND_READ,
hailfingerf6aa9cc2009-11-24 02:11:08 +00006708 .tested = TEST_UNTESTED,
6709 .probe = probe_spi_rdid,
6710 .probe_timing = TIMING_ZERO,
snelson4d31f0d2010-01-19 03:23:07 +00006711 .block_erasers =
6712 {
6713 {
6714 .eraseblocks = { {64 * 1024, 32} },
6715 .block_erase = spi_block_erase_d8,
6716 }, {
6717 .eraseblocks = { {2 * 1024 * 1024, 1} },
6718 .block_erase = spi_block_erase_c7,
6719 }
6720 },
hailfingerb9560ee2010-07-14 20:21:22 +00006721 .unlock = spi_disable_blockprotect,
hailfingerf6aa9cc2009-11-24 02:11:08 +00006722 .write = spi_chip_write_256,
6723 .read = spi_chip_read,
6724 },
6725
6726 {
hailfinger286829b2009-01-08 03:40:17 +00006727 .vendor = "Sharp",
uwe8e0cff52011-08-25 22:44:11 +00006728 .name = "LH28F008BJT-BTLZ1",
6729 .bustype = BUS_PARALLEL,
6730 .manufacture_id = SHARP_ID,
Patrick Georgi07e1ed92017-02-06 11:37:23 +01006731 .model_id = SHARP_LH28F008BJ__PB,
uwe8e0cff52011-08-25 22:44:11 +00006732 .total_size = 1024,
6733 .page_size = 64 * 1024,
6734 .tested = TEST_OK_PREW,
6735 .probe = probe_82802ab,
6736 .probe_timing = TIMING_ZERO,
6737 .block_erasers =
6738 {
6739 {
6740 .eraseblocks = {
6741 {8 * 1024, 8},
6742 {64 * 1024, 15}
6743 },
6744 .block_erase = erase_block_82802ab,
6745 }, {
6746 .eraseblocks = { {1024 * 1024, 1} },
6747 .block_erase = erase_sector_49lfxxxc,
6748 }
6749 },
6750 .unlock = unlock_lh28f008bjt,
6751 .write = write_82802ab,
6752 .read = read_memmapped,
6753 .voltage = {2700, 3600},
6754 },
6755
6756 {
6757 .vendor = "Sharp",
hailfinger286829b2009-01-08 03:40:17 +00006758 .name = "LHF00L04",
hailfingere1e41ea2011-07-27 07:13:06 +00006759 .bustype = BUS_FWH, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00006760 .manufacture_id = SHARP_ID,
6761 .model_id = SHARP_LHF00L04,
6762 .total_size = 1024,
6763 .page_size = 64 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00006764 .feature_bits = FEATURE_EITHER_RESET | FEATURE_REGISTERMAP,
hailfinger286829b2009-01-08 03:40:17 +00006765 .tested = TEST_UNTESTED,
hailfingerb8e4e212010-03-15 03:48:42 +00006766 .probe = probe_82802ab,
hailfinger4481d9d2010-01-07 21:23:45 +00006767 .probe_timing = TIMING_ZERO,
hailfinger4481d9d2010-01-07 21:23:45 +00006768 .block_erasers =
6769 {
6770 {
6771 .eraseblocks = {
6772 {64 * 1024, 15},
6773 {8 * 1024, 8}
6774 },
snelsonc0acbeb2010-03-19 18:47:06 +00006775 .block_erase = erase_block_82802ab,
hailfinger4481d9d2010-01-07 21:23:45 +00006776 }, {
6777 .eraseblocks = {
6778 {1024 * 1024, 1}
6779 },
snelson264e57c2010-01-20 20:55:53 +00006780 .block_erase = NULL, /* 30 D0, only in A/A mux mode */
hailfinger4481d9d2010-01-07 21:23:45 +00006781 },
6782 },
snelsonc0acbeb2010-03-19 18:47:06 +00006783 .unlock = unlock_82802ab,
6784 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00006785 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00006786 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00006787 },
6788
hailfinger286829b2009-01-08 03:40:17 +00006789 {
6790 .vendor = "Spansion",
hailfinger5fece212010-11-29 00:37:49 +00006791 .name = "S25FL004A",
hailfingere1e41ea2011-07-27 07:13:06 +00006792 .bustype = BUS_SPI,
hailfinger5fece212010-11-29 00:37:49 +00006793 .manufacture_id = SPANSION_ID,
6794 .model_id = SPANSION_S25FL004A,
6795 .total_size = 512,
6796 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08006797 .feature_bits = FEATURE_UNBOUND_READ,
hailfinger5fece212010-11-29 00:37:49 +00006798 .tested = TEST_UNTESTED,
6799 .probe = probe_spi_rdid,
6800 .probe_timing = TIMING_ZERO,
6801 .block_erasers =
6802 {
6803 {
6804 .eraseblocks = { {64 * 1024, 8} },
6805 .block_erase = spi_block_erase_d8,
6806 }, {
6807 .eraseblocks = { {512 * 1024, 1} },
6808 .block_erase = spi_block_erase_c7,
6809 }
6810 },
6811 .unlock = spi_disable_blockprotect,
6812 .write = spi_chip_write_256,
6813 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +00006814 .voltage = {2700, 3600},
hailfinger5fece212010-11-29 00:37:49 +00006815 },
6816
6817 {
6818 .vendor = "Spansion",
David Hendricks668f29d2011-01-27 18:51:45 -08006819 .name = "S25FL004A",
hailfingere1e41ea2011-07-27 07:13:06 +00006820 .bustype = BUS_SPI,
David Hendricks668f29d2011-01-27 18:51:45 -08006821 .manufacture_id = SPANSION_ID,
6822 .model_id = SPANSION_S25FL004A,
6823 .total_size = 512,
6824 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08006825 .feature_bits = FEATURE_UNBOUND_READ,
David Hendricks668f29d2011-01-27 18:51:45 -08006826 .tested = TEST_UNTESTED,
6827 .probe = probe_spi_rdid,
6828 .probe_timing = TIMING_ZERO,
6829 .block_erasers =
6830 {
6831 {
6832 .eraseblocks = { {64 * 1024, 8} },
6833 .block_erase = spi_block_erase_d8,
6834 }, {
6835 .eraseblocks = { {512 * 1024, 1} },
6836 .block_erase = spi_block_erase_c7,
6837 }
6838 },
6839 .unlock = spi_disable_blockprotect,
6840 .write = spi_chip_write_256,
6841 .read = spi_chip_read,
6842 },
6843
6844 {
6845 .vendor = "Spansion",
mkarcher7b3a9152010-01-12 23:29:30 +00006846 .name = "S25FL008A",
hailfingere1e41ea2011-07-27 07:13:06 +00006847 .bustype = BUS_SPI,
mkarcher7b3a9152010-01-12 23:29:30 +00006848 .manufacture_id = SPANSION_ID,
6849 .model_id = SPANSION_S25FL008A,
6850 .total_size = 1024,
6851 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08006852 .feature_bits = FEATURE_UNBOUND_READ,
6853 .tested = TEST_OK_PREU,
mkarcher7b3a9152010-01-12 23:29:30 +00006854 .probe = probe_spi_rdid,
6855 .probe_timing = TIMING_ZERO,
mkarcher7b3a9152010-01-12 23:29:30 +00006856 .block_erasers =
6857 {
6858 {
6859 .eraseblocks = { {64 * 1024, 16} },
6860 .block_erase = spi_block_erase_d8,
6861 }, {
6862 .eraseblocks = { {1024 * 1024, 1} },
6863 .block_erase = spi_block_erase_c7,
6864 }
6865 },
hailfingerb9560ee2010-07-14 20:21:22 +00006866 .unlock = spi_disable_blockprotect,
mkarcher7b3a9152010-01-12 23:29:30 +00006867 .write = spi_chip_write_256,
6868 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00006869 .voltage = {2700, 3600},
mkarcher7b3a9152010-01-12 23:29:30 +00006870 },
6871
6872 {
6873 .vendor = "Spansion",
hailfinger286829b2009-01-08 03:40:17 +00006874 .name = "S25FL016A",
hailfingere1e41ea2011-07-27 07:13:06 +00006875 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00006876 .manufacture_id = SPANSION_ID,
6877 .model_id = SPANSION_S25FL016A,
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_PRU,
hailfinger286829b2009-01-08 03:40:17 +00006882 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00006883 .probe_timing = TIMING_ZERO,
snelson4d31f0d2010-01-19 03:23:07 +00006884 .block_erasers =
6885 {
6886 {
6887 .eraseblocks = { {64 * 1024, 32} },
6888 .block_erase = spi_block_erase_d8,
6889 }, {
6890 .eraseblocks = { {2 * 1024 * 1024, 1} },
6891 .block_erase = spi_block_erase_c7,
6892 }
6893 },
hailfingerb9560ee2010-07-14 20:21:22 +00006894 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00006895 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00006896 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00006897 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00006898 },
6899
hailfinger286829b2009-01-08 03:40:17 +00006900 {
hailfinger5fece212010-11-29 00:37:49 +00006901 .vendor = "Spansion",
6902 .name = "S25FL032A",
hailfingere1e41ea2011-07-27 07:13:06 +00006903 .bustype = BUS_SPI,
hailfinger5fece212010-11-29 00:37:49 +00006904 .manufacture_id = SPANSION_ID,
6905 .model_id = SPANSION_S25FL032A,
6906 .total_size = 4096,
6907 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08006908 .feature_bits = FEATURE_UNBOUND_READ,
hailfinger5fece212010-11-29 00:37:49 +00006909 .tested = TEST_UNTESTED,
6910 .probe = probe_spi_rdid,
6911 .probe_timing = TIMING_ZERO,
6912 .block_erasers =
6913 {
6914 {
6915 .eraseblocks = { {64 * 1024, 64} },
6916 .block_erase = spi_block_erase_d8,
6917 }, {
6918 .eraseblocks = { {4 * 1024 * 1024, 1} },
6919 .block_erase = spi_block_erase_c7,
6920 }
6921 },
6922 .unlock = spi_disable_blockprotect,
6923 .write = spi_chip_write_256,
6924 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +00006925 .voltage = {2700, 3600},
hailfinger5fece212010-11-29 00:37:49 +00006926 },
6927
6928 {
6929 .vendor = "Spansion",
6930 .name = "S25FL064A",
hailfingere1e41ea2011-07-27 07:13:06 +00006931 .bustype = BUS_SPI,
hailfinger5fece212010-11-29 00:37:49 +00006932 .manufacture_id = SPANSION_ID,
6933 .model_id = SPANSION_S25FL064A,
6934 .total_size = 8192,
6935 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08006936 .feature_bits = FEATURE_UNBOUND_READ,
6937 .tested = TEST_OK_PREWU,
hailfinger5fece212010-11-29 00:37:49 +00006938 .probe = probe_spi_rdid,
6939 .probe_timing = TIMING_ZERO,
6940 .block_erasers =
6941 {
6942 {
6943 .eraseblocks = { {64 * 1024, 128} },
6944 .block_erase = spi_block_erase_d8,
6945 }, {
6946 .eraseblocks = { {8 * 1024 * 1024, 1} },
6947 .block_erase = spi_block_erase_c7,
6948 }
6949 },
6950 .unlock = spi_disable_blockprotect,
6951 .write = spi_chip_write_256,
6952 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +00006953 .voltage = {2700, 3600},
hailfinger5fece212010-11-29 00:37:49 +00006954 },
6955
6956 {
David Hendrickse0a15c42014-06-20 18:21:25 -07006957 .vendor = "Spansion",
David Hendricks8401b922014-11-21 16:45:08 -08006958 .name = "S25FL116K",
6959 .bustype = BUS_SPI,
6960 .manufacture_id = SPANSION_ID,
6961 .model_id = SPANSION_S25FL116K,
6962 .total_size = 2048,
6963 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08006964 .feature_bits = FEATURE_UNBOUND_READ,
6965 .tested = TEST_OK_PREWU,
David Hendricks8401b922014-11-21 16:45:08 -08006966 .probe = probe_spi_rdid,
6967 .probe_timing = TIMING_ZERO,
6968 .block_erasers =
6969 {
6970 {
6971 .eraseblocks = { {4 * 1024, 512} },
6972 .block_erase = spi_block_erase_20,
6973 }, {
6974 .eraseblocks = { {64 * 1024, 32} },
6975 .block_erase = spi_block_erase_d8,
6976 }, {
6977 .eraseblocks = { {2 * 1024 * 1024, 1} },
6978 .block_erase = spi_block_erase_c7,
6979 }
6980 },
6981 .unlock = spi_disable_blockprotect,
6982 .write = spi_chip_write_256,
6983 .read = spi_chip_read,
6984 .voltage = {2700, 3600},
6985 /* TODO: write-protection */
6986 },
6987
6988 {
6989 .vendor = "Spansion",
Vadim Bendebury3a501162014-10-21 20:38:13 -07006990 .name = "S25FS128S Large Sectors",
David Hendrickse0a15c42014-06-20 18:21:25 -07006991 .bustype = BUS_SPI,
6992 .manufacture_id = SPANSION_ID,
Vadim Bendebury3a501162014-10-21 20:38:13 -07006993 .model_id = SPANSION_S25FS128S_L,
David Hendrickse0a15c42014-06-20 18:21:25 -07006994 .total_size = 16384,
6995 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08006996 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
Vadim Bendebury3a501162014-10-21 20:38:13 -07006997 .tested = TEST_UNTESTED,
6998 .probe = probe_spi_big_spansion,
David Hendrickse0a15c42014-06-20 18:21:25 -07006999 .probe_timing = TIMING_ZERO,
7000 .block_erasers =
7001 {
7002 {
7003 .eraseblocks = { {64 * 1024, 256} },
David Hendricks398714f2014-07-03 17:49:41 -07007004 .block_erase = s25fs_block_erase_d8,
David Hendrickse0a15c42014-06-20 18:21:25 -07007005 }, {
7006 .eraseblocks = { {16 * 1024 * 1024, 1} },
7007 .block_erase = spi_block_erase_60,
7008 }, {
7009 .eraseblocks = { {16 * 1024 * 1024, 1} },
7010 .block_erase = spi_block_erase_c7,
7011 },
7012 },
7013 .unlock = spi_disable_blockprotect,
7014 .write = spi_chip_write_256,
7015 .read = spi_chip_read,
7016 .voltage = {1700, 2000},
David Hendricksa9884852014-12-11 15:31:12 -08007017 .wp = &wp_generic,
David Hendrickse0a15c42014-06-20 18:21:25 -07007018 },
7019
7020 {
Vadim Bendebury3a501162014-10-21 20:38:13 -07007021 .vendor = "Spansion",
7022 .name = "S25FS128S Small Sectors",
7023 .bustype = BUS_SPI,
7024 .manufacture_id = SPANSION_ID,
7025 .model_id = SPANSION_S25FS128S_S,
7026 .total_size = 16384,
7027 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08007028 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
7029 .tested = TEST_OK_PREWU,
Vadim Bendebury3a501162014-10-21 20:38:13 -07007030 .probe = probe_spi_big_spansion,
7031 .probe_timing = TIMING_ZERO,
7032 .block_erasers =
7033 {
7034 {
7035 .eraseblocks = { {64 * 1024, 256} },
7036 .block_erase = s25fs_block_erase_d8,
7037 }, {
7038 .eraseblocks = { {16 * 1024 * 1024, 1} },
7039 .block_erase = spi_block_erase_60,
7040 }, {
7041 .eraseblocks = { {16 * 1024 * 1024, 1} },
7042 .block_erase = spi_block_erase_c7,
7043 },
7044 },
7045 .unlock = spi_disable_blockprotect,
7046 .write = spi_chip_write_256,
7047 .read = spi_chip_read,
7048 .voltage = {1700, 2000},
David Hendricksa9884852014-12-11 15:31:12 -08007049 .wp = &wp_generic,
Vadim Bendebury3a501162014-10-21 20:38:13 -07007050 },
7051
7052 {
7053 .vendor = "Spansion",
7054 .name = "S25FL256S Large Sectors",
7055 .bustype = BUS_SPI,
7056 .manufacture_id = SPANSION_ID,
Shelley Chen93a1c802014-12-30 17:09:48 -08007057 .model_id = SPANSION_S25FL256S_UL,
Vadim Bendebury3a501162014-10-21 20:38:13 -07007058 .total_size = 16384, /* This is just half the size.... */
7059 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08007060 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
Vadim Bendebury3a501162014-10-21 20:38:13 -07007061 .tested = TEST_UNTESTED,
7062 .probe = probe_spi_big_spansion,
7063 .probe_timing = TIMING_ZERO,
7064 .block_erasers =
7065 {
7066 {
7067 .eraseblocks = { {256 * 1024, 64} },
7068 .block_erase = s25fl_block_erase,
7069 }, {
7070 .eraseblocks = { {16 * 1024 * 1024, 1} },
7071 .block_erase = spi_block_erase_60,
7072 },
7073 },
7074 .unlock = spi_disable_blockprotect,
7075 .write = spi_chip_write_256,
7076 .read = spi_chip_read,
7077 .voltage = {1700, 2000},
David Hendricksc694bb82015-02-25 14:52:17 -08007078 .wp = &wp_generic,
Vadim Bendebury3a501162014-10-21 20:38:13 -07007079 },
7080
7081 {
7082 .vendor = "Spansion",
7083 .name = "S25FL256S Small Sectors",
7084 .bustype = BUS_SPI,
7085 .manufacture_id = SPANSION_ID,
Shelley Chen93a1c802014-12-30 17:09:48 -08007086 .model_id = SPANSION_S25FL256S_US,
Vadim Bendebury3a501162014-10-21 20:38:13 -07007087 .total_size = 16384, /* This is just half the size.... */
7088 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08007089 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
7090 .tested = TEST_OK_PREWU,
Vadim Bendebury3a501162014-10-21 20:38:13 -07007091 .probe = probe_spi_big_spansion,
7092 .probe_timing = TIMING_ZERO,
7093 .block_erasers =
7094 {
7095 {
7096 .eraseblocks = { {64 * 1024, 256} },
7097 .block_erase = s25fl_block_erase,
7098 }, {
7099 .eraseblocks = { {16 * 1024 * 1024, 1} },
7100 .block_erase = spi_block_erase_60,
7101 },
7102 },
7103 .unlock = spi_disable_blockprotect,
7104 .write = spi_chip_write_256,
7105 .read = spi_chip_read,
7106 .voltage = {1700, 2000},
David Hendricksc694bb82015-02-25 14:52:17 -08007107 .wp = &wp_generic,
Vadim Bendebury3a501162014-10-21 20:38:13 -07007108 },
7109
7110 {
Shelley Chen93a1c802014-12-30 17:09:48 -08007111 .vendor = "Spansion",
7112 .name = "S25FL128S_UL Uniform 128 kB Sectors",
7113 .bustype = BUS_SPI,
7114 .manufacture_id = SPANSION_ID,
7115 .model_id = SPANSION_S25FL128S_UL,
7116 .total_size = 16384,
7117 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08007118 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
Shelley Chen93a1c802014-12-30 17:09:48 -08007119 .tested = TEST_UNTESTED,
7120 .probe = probe_spi_big_spansion,
7121 .probe_timing = TIMING_ZERO,
7122 .block_erasers =
7123 {
7124 {
7125 .eraseblocks = { {128 * 1024, 128} },
7126 .block_erase = spi_block_erase_d8,
7127 }, {
7128 .eraseblocks = { {16 * 1024 * 1024, 1} },
7129 .block_erase = spi_block_erase_60,
7130 }, {
7131 .eraseblocks = { {16 * 1024 * 1024, 1} },
7132 .block_erase = spi_block_erase_c7,
7133 },
7134 },
7135 .unlock = spi_disable_blockprotect,
7136 .write = spi_chip_write_256,
7137 .read = spi_chip_read,
7138 .voltage = {1700, 2000},
7139 .wp = &wp_generic,
7140 },
7141
7142 {
7143 .vendor = "Spansion",
7144 .name = "S25FL128S_US Uniform 64 kB Sectors",
7145 .bustype = BUS_SPI,
7146 .manufacture_id = SPANSION_ID,
7147 .model_id = SPANSION_S25FL128S_US,
7148 .total_size = 16384,
7149 .page_size = 256,
7150 .feature_bits = FEATURE_WRSR_WREN,
7151 .tested = TEST_UNTESTED,
7152 .probe = probe_spi_big_spansion,
7153 .probe_timing = TIMING_ZERO,
7154 .block_erasers =
7155 {
7156 {
7157 .eraseblocks = { {64 * 1024, 256} },
7158 .block_erase = spi_block_erase_d8,
7159 }, {
7160 .eraseblocks = { {16 * 1024 * 1024, 1} },
7161 .block_erase = spi_block_erase_60,
7162 }, {
7163 .eraseblocks = { {16 * 1024 * 1024, 1} },
7164 .block_erase = spi_block_erase_c7,
7165 },
7166 },
7167 .unlock = spi_disable_blockprotect,
7168 .write = spi_chip_write_256,
7169 .read = spi_chip_read,
7170 .voltage = {1700, 2000},
7171 .wp = &wp_generic,
7172 },
7173
7174 {
hailfinger286829b2009-01-08 03:40:17 +00007175 .vendor = "SST",
stefanct753c1a52011-08-17 09:50:11 +00007176 .name = "SST25LF040A",
7177 .bustype = BUS_SPI,
7178 .manufacture_id = SST_ID,
7179 .model_id = SST_SST25VF040_REMS,
7180 .total_size = 512,
7181 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08007182 .feature_bits = FEATURE_UNBOUND_READ,
7183 .tested = TEST_OK_PREWU,
stefanct753c1a52011-08-17 09:50:11 +00007184 .probe = probe_spi_res2,
7185 .probe_timing = TIMING_ZERO,
7186 .block_erasers =
7187 {
7188 {
7189 .eraseblocks = { {4 * 1024, 128} },
7190 .block_erase = spi_block_erase_20,
7191 }, {
7192 .eraseblocks = { {32 * 1024, 16} },
7193 .block_erase = spi_block_erase_52,
7194 }, {
7195 .eraseblocks = { {512 * 1024, 1} },
7196 .block_erase = spi_block_erase_60,
7197 },
7198 },
7199 .unlock = spi_disable_blockprotect,
7200 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
7201 .read = spi_chip_read,
7202 .voltage = {3000, 3600},
7203 },
7204
7205 {
7206 .vendor = "SST",
7207 .name = "SST25LF080A",
7208 .bustype = BUS_SPI,
7209 .manufacture_id = SST_ID,
7210 .model_id = SST_SST25VF080_REMS,
7211 .total_size = 1024,
7212 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08007213 .feature_bits = FEATURE_UNBOUND_READ,
stefanct753c1a52011-08-17 09:50:11 +00007214 .tested = TEST_UNTESTED,
7215 .probe = probe_spi_res2,
7216 .probe_timing = TIMING_ZERO,
7217 .block_erasers =
7218 {
7219 {
7220 .eraseblocks = { {4 * 1024, 256} },
7221 .block_erase = spi_block_erase_20,
7222 }, {
7223 .eraseblocks = { {32 * 1024, 32} },
7224 .block_erase = spi_block_erase_52,
7225 }, {
7226 .eraseblocks = { {1024 * 1024, 1} },
7227 .block_erase = spi_block_erase_60,
7228 },
7229 },
7230 .unlock = spi_disable_blockprotect,
7231 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
7232 .read = spi_chip_read,
7233 .voltage = {3000, 3600},
7234 },
7235
7236 {
7237 .vendor = "SST",
stefanctd6efe1a2011-09-03 11:22:27 +00007238 .name = "SST25VF010",
hailfingere1e41ea2011-07-27 07:13:06 +00007239 .bustype = BUS_SPI,
hailfingerfb1f31f2010-12-03 14:48:11 +00007240 .manufacture_id = SST_ID,
7241 .model_id = SST_SST25VF010_REMS,
7242 .total_size = 128,
7243 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08007244 .feature_bits = FEATURE_UNBOUND_READ,
7245 .tested = TEST_OK_PREWU,
hailfingerfb1f31f2010-12-03 14:48:11 +00007246 .probe = probe_spi_rems,
7247 .probe_timing = TIMING_ZERO,
7248 .block_erasers =
7249 {
7250 {
7251 .eraseblocks = { {4 * 1024, 32} },
7252 .block_erase = spi_block_erase_20,
7253 }, {
7254 .eraseblocks = { {32 * 1024, 4} },
7255 .block_erase = spi_block_erase_52,
7256 }, {
7257 .eraseblocks = { {128 * 1024, 1} },
7258 .block_erase = spi_block_erase_60,
7259 },
7260 },
7261 .unlock = spi_disable_blockprotect,
stefanct449d0342011-08-01 18:39:28 +00007262 .write = spi_aai_write,
hailfingerfb1f31f2010-12-03 14:48:11 +00007263 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +00007264 .voltage = {2700, 3600},
hailfingerfb1f31f2010-12-03 14:48:11 +00007265 },
7266
7267 {
David Hendricks668f29d2011-01-27 18:51:45 -08007268 .vendor = "Spansion",
7269 .name = "S25FL032A",
hailfingere1e41ea2011-07-27 07:13:06 +00007270 .bustype = BUS_SPI,
David Hendricks668f29d2011-01-27 18:51:45 -08007271 .manufacture_id = SPANSION_ID,
7272 .model_id = SPANSION_S25FL032A,
7273 .total_size = 4096,
7274 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08007275 .feature_bits = FEATURE_UNBOUND_READ,
David Hendricks668f29d2011-01-27 18:51:45 -08007276 .tested = TEST_UNTESTED,
7277 .probe = probe_spi_rdid,
7278 .probe_timing = TIMING_ZERO,
7279 .block_erasers =
7280 {
7281 {
7282 .eraseblocks = { {64 * 1024, 64} },
7283 .block_erase = spi_block_erase_d8,
7284 }, {
7285 .eraseblocks = { {4 * 1024 * 1024, 1} },
7286 .block_erase = spi_block_erase_c7,
7287 }
7288 },
7289 .unlock = spi_disable_blockprotect,
7290 .write = spi_chip_write_256,
7291 .read = spi_chip_read,
7292 },
7293
7294 {
7295 .vendor = "Spansion",
7296 .name = "S25FL064A",
hailfingere1e41ea2011-07-27 07:13:06 +00007297 .bustype = BUS_SPI,
David Hendricks668f29d2011-01-27 18:51:45 -08007298 .manufacture_id = SPANSION_ID,
7299 .model_id = SPANSION_S25FL064A,
7300 .total_size = 8192,
7301 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08007302 .feature_bits = FEATURE_UNBOUND_READ,
7303 .tested = TEST_OK_PREWU,
David Hendricks668f29d2011-01-27 18:51:45 -08007304 .probe = probe_spi_rdid,
7305 .probe_timing = TIMING_ZERO,
7306 .block_erasers =
7307 {
7308 {
7309 .eraseblocks = { {64 * 1024, 128} },
7310 .block_erase = spi_block_erase_d8,
7311 }, {
7312 .eraseblocks = { {8 * 1024 * 1024, 1} },
7313 .block_erase = spi_block_erase_c7,
7314 }
7315 },
7316 .unlock = spi_disable_blockprotect,
7317 .write = spi_chip_write_256,
7318 .read = spi_chip_read,
7319 },
7320
7321 {
7322 .vendor = "SST",
7323 .name = "SST25VF010.REMS",
hailfingere1e41ea2011-07-27 07:13:06 +00007324 .bustype = BUS_SPI,
David Hendricks668f29d2011-01-27 18:51:45 -08007325 .manufacture_id = SST_ID,
7326 .model_id = SST_SST25VF010_REMS,
7327 .total_size = 128,
7328 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08007329 .feature_bits = FEATURE_UNBOUND_READ,
7330 .tested = TEST_OK_PREWU,
David Hendricks668f29d2011-01-27 18:51:45 -08007331 .probe = probe_spi_rems,
7332 .probe_timing = TIMING_ZERO,
7333 .block_erasers =
7334 {
7335 {
7336 .eraseblocks = { {4 * 1024, 32} },
7337 .block_erase = spi_block_erase_20,
7338 }, {
7339 .eraseblocks = { {32 * 1024, 4} },
7340 .block_erase = spi_block_erase_52,
7341 }, {
7342 .eraseblocks = { {128 * 1024, 1} },
7343 .block_erase = spi_block_erase_60,
7344 },
7345 },
7346 .unlock = spi_disable_blockprotect,
7347 .write = spi_chip_write_1,
7348 .read = spi_chip_read,
7349 },
7350
7351 {
hailfingerfb1f31f2010-12-03 14:48:11 +00007352 .vendor = "SST",
hailfinger286829b2009-01-08 03:40:17 +00007353 .name = "SST25VF016B",
hailfingere1e41ea2011-07-27 07:13:06 +00007354 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00007355 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007356 .model_id = SST_SST25VF016B,
hailfinger286829b2009-01-08 03:40:17 +00007357 .total_size = 2048,
7358 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08007359 .feature_bits = FEATURE_UNBOUND_READ,
7360 .tested = TEST_OK_PREWU,
hailfinger286829b2009-01-08 03:40:17 +00007361 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00007362 .probe_timing = TIMING_ZERO,
hailfinger3aa0df12009-12-23 12:16:47 +00007363 .block_erasers =
7364 {
7365 {
7366 .eraseblocks = { {4 * 1024, 512} },
7367 .block_erase = spi_block_erase_20,
7368 }, {
7369 .eraseblocks = { {32 * 1024, 64} },
7370 .block_erase = spi_block_erase_52,
7371 }, {
7372 .eraseblocks = { {64 * 1024, 32} },
7373 .block_erase = spi_block_erase_d8,
7374 }, {
7375 .eraseblocks = { {2 * 1024 * 1024, 1} },
7376 .block_erase = spi_block_erase_60,
7377 }, {
7378 .eraseblocks = { {2 * 1024 * 1024, 1} },
7379 .block_erase = spi_block_erase_c7,
7380 },
7381 },
hailfingerb9560ee2010-07-14 20:21:22 +00007382 .unlock = spi_disable_blockprotect,
stefanct449d0342011-08-01 18:39:28 +00007383 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
hailfinger286829b2009-01-08 03:40:17 +00007384 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00007385 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00007386 },
7387
hailfinger286829b2009-01-08 03:40:17 +00007388 {
7389 .vendor = "SST",
7390 .name = "SST25VF032B",
hailfingere1e41ea2011-07-27 07:13:06 +00007391 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00007392 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007393 .model_id = SST_SST25VF032B,
hailfinger286829b2009-01-08 03:40:17 +00007394 .total_size = 4096,
7395 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08007396 .feature_bits = FEATURE_UNBOUND_READ,
7397 .tested = TEST_OK_PREWU,
hailfinger286829b2009-01-08 03:40:17 +00007398 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00007399 .probe_timing = TIMING_ZERO,
hailfinger3aa0df12009-12-23 12:16:47 +00007400 .block_erasers =
7401 {
7402 {
7403 .eraseblocks = { {4 * 1024, 1024} },
7404 .block_erase = spi_block_erase_20,
7405 }, {
7406 .eraseblocks = { {32 * 1024, 128} },
7407 .block_erase = spi_block_erase_52,
7408 }, {
7409 .eraseblocks = { {64 * 1024, 64} },
7410 .block_erase = spi_block_erase_d8,
7411 }, {
7412 .eraseblocks = { {4 * 1024 * 1024, 1} },
7413 .block_erase = spi_block_erase_60,
7414 }, {
7415 .eraseblocks = { {4 * 1024 * 1024, 1} },
7416 .block_erase = spi_block_erase_c7,
7417 },
7418 },
hailfingerb9560ee2010-07-14 20:21:22 +00007419 .unlock = spi_disable_blockprotect,
hailfinger081e3512010-10-05 22:29:08 +00007420 .write = spi_aai_write,
hailfinger3aa0df12009-12-23 12:16:47 +00007421 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00007422 .voltage = {2700, 3600},
hailfinger3aa0df12009-12-23 12:16:47 +00007423 },
7424
7425 {
7426 .vendor = "SST",
hailfingerea6fc922010-07-21 15:02:22 +00007427 .name = "SST25VF064C",
hailfingere1e41ea2011-07-27 07:13:06 +00007428 .bustype = BUS_SPI,
hailfingerea6fc922010-07-21 15:02:22 +00007429 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007430 .model_id = SST_SST25VF064C,
hailfingerea6fc922010-07-21 15:02:22 +00007431 .total_size = 8192,
7432 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08007433 .feature_bits = FEATURE_UNBOUND_READ,
7434 .tested = TEST_OK_PREU,
hailfingerea6fc922010-07-21 15:02:22 +00007435 .probe = probe_spi_rdid,
7436 .probe_timing = TIMING_ZERO,
7437 .block_erasers =
7438 {
7439 {
7440 .eraseblocks = { {4 * 1024, 2048} },
7441 .block_erase = spi_block_erase_20,
7442 }, {
7443 .eraseblocks = { {32 * 1024, 256} },
7444 .block_erase = spi_block_erase_52,
7445 }, {
7446 .eraseblocks = { {64 * 1024, 128} },
7447 .block_erase = spi_block_erase_d8,
7448 }, {
7449 .eraseblocks = { {8 * 1024 * 1024, 1} },
7450 .block_erase = spi_block_erase_60,
7451 }, {
7452 .eraseblocks = { {8 * 1024 * 1024, 1} },
7453 .block_erase = spi_block_erase_c7,
7454 },
7455 },
7456 .unlock = spi_disable_blockprotect,
hailfinger081e3512010-10-05 22:29:08 +00007457 .write = spi_chip_write_256,
hailfingerea6fc922010-07-21 15:02:22 +00007458 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00007459 .voltage = {2700, 3600},
hailfingerea6fc922010-07-21 15:02:22 +00007460 },
7461
7462 {
7463 .vendor = "SST",
stefanctd6efe1a2011-09-03 11:22:27 +00007464 .name = "SST25VF040",
hailfingere1e41ea2011-07-27 07:13:06 +00007465 .bustype = BUS_SPI,
hailfinger3aa0df12009-12-23 12:16:47 +00007466 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007467 .model_id = SST_SST25VF040_REMS,
hailfinger3aa0df12009-12-23 12:16:47 +00007468 .total_size = 512,
7469 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08007470 .feature_bits = FEATURE_UNBOUND_READ,
7471 .tested = TEST_OK_PRU,
hailfinger3aa0df12009-12-23 12:16:47 +00007472 .probe = probe_spi_rems,
7473 .probe_timing = TIMING_ZERO,
hailfinger3aa0df12009-12-23 12:16:47 +00007474 .block_erasers =
7475 {
7476 {
7477 .eraseblocks = { {4 * 1024, 128} },
7478 .block_erase = spi_block_erase_20,
7479 }, {
7480 .eraseblocks = { {32 * 1024, 16} },
7481 .block_erase = spi_block_erase_52,
7482 }, {
7483 .eraseblocks = { {512 * 1024, 1} },
7484 .block_erase = spi_block_erase_60,
7485 },
7486 },
hailfingerb9560ee2010-07-14 20:21:22 +00007487 .unlock = spi_disable_blockprotect,
stefanct449d0342011-08-01 18:39:28 +00007488 .write = spi_aai_write,
hailfinger286829b2009-01-08 03:40:17 +00007489 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +00007490 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00007491 },
7492
hailfinger286829b2009-01-08 03:40:17 +00007493 {
7494 .vendor = "SST",
7495 .name = "SST25VF040B",
hailfingere1e41ea2011-07-27 07:13:06 +00007496 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00007497 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007498 .model_id = SST_SST25VF040B,
hailfinger286829b2009-01-08 03:40:17 +00007499 .total_size = 512,
7500 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08007501 .feature_bits = FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00007502 .tested = TEST_UNTESTED,
7503 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00007504 .probe_timing = TIMING_ZERO,
hailfinger3aa0df12009-12-23 12:16:47 +00007505 .block_erasers =
7506 {
7507 {
7508 .eraseblocks = { {4 * 1024, 128} },
7509 .block_erase = spi_block_erase_20,
7510 }, {
7511 .eraseblocks = { {32 * 1024, 16} },
7512 .block_erase = spi_block_erase_52,
7513 }, {
7514 .eraseblocks = { {64 * 1024, 8} },
7515 .block_erase = spi_block_erase_d8,
7516 }, {
7517 .eraseblocks = { {512 * 1024, 1} },
7518 .block_erase = spi_block_erase_60,
7519 }, {
7520 .eraseblocks = { {512 * 1024, 1} },
7521 .block_erase = spi_block_erase_c7,
7522 },
7523 },
hailfingerb9560ee2010-07-14 20:21:22 +00007524 .unlock = spi_disable_blockprotect,
stefanct449d0342011-08-01 18:39:28 +00007525 .write = spi_aai_write,
stuge48dda5c2009-02-25 08:07:33 +00007526 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00007527 .voltage = {2700, 3600},
stuge48dda5c2009-02-25 08:07:33 +00007528 },
7529
7530 {
7531 .vendor = "SST",
stuge712ce862009-01-26 03:37:40 +00007532 .name = "SST25VF040B.REMS",
hailfingere1e41ea2011-07-27 07:13:06 +00007533 .bustype = BUS_SPI,
hailfingerc391ccb2009-06-12 11:45:10 +00007534 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007535 .model_id = SST_SST25VF040B_REMS,
stuge712ce862009-01-26 03:37:40 +00007536 .total_size = 512,
hailfinger3aa0df12009-12-23 12:16:47 +00007537 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08007538 .feature_bits = FEATURE_UNBOUND_READ,
7539 .tested = TEST_OK_PRU,
stuge712ce862009-01-26 03:37:40 +00007540 .probe = probe_spi_rems,
hailfingere3095d92009-06-05 13:46:17 +00007541 .probe_timing = TIMING_ZERO,
hailfinger3aa0df12009-12-23 12:16:47 +00007542 .block_erasers =
7543 {
7544 {
7545 .eraseblocks = { {4 * 1024, 128} },
7546 .block_erase = spi_block_erase_20,
7547 }, {
7548 .eraseblocks = { {32 * 1024, 16} },
7549 .block_erase = spi_block_erase_52,
7550 }, {
7551 .eraseblocks = { {64 * 1024, 8} },
7552 .block_erase = spi_block_erase_d8,
7553 }, {
7554 .eraseblocks = { {512 * 1024, 1} },
7555 .block_erase = spi_block_erase_60,
7556 }, {
7557 .eraseblocks = { {512 * 1024, 1} },
7558 .block_erase = spi_block_erase_c7,
7559 },
7560 },
hailfingerb9560ee2010-07-14 20:21:22 +00007561 .unlock = spi_disable_blockprotect,
stefanct449d0342011-08-01 18:39:28 +00007562 .write = spi_aai_write,
stuge712ce862009-01-26 03:37:40 +00007563 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +00007564 .voltage = {2700, 3600},
stuge712ce862009-01-26 03:37:40 +00007565 },
7566
7567 {
7568 .vendor = "SST",
hailfinger286829b2009-01-08 03:40:17 +00007569 .name = "SST25VF080B",
hailfingere1e41ea2011-07-27 07:13:06 +00007570 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00007571 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007572 .model_id = SST_SST25VF080B,
hailfinger286829b2009-01-08 03:40:17 +00007573 .total_size = 1024,
7574 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08007575 .feature_bits = FEATURE_UNBOUND_READ,
7576 .tested = TEST_OK_PREU,
hailfinger286829b2009-01-08 03:40:17 +00007577 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00007578 .probe_timing = TIMING_ZERO,
hailfinger3aa0df12009-12-23 12:16:47 +00007579 .block_erasers =
7580 {
7581 {
7582 .eraseblocks = { {4 * 1024, 256} },
7583 .block_erase = spi_block_erase_20,
7584 }, {
7585 .eraseblocks = { {32 * 1024, 32} },
7586 .block_erase = spi_block_erase_52,
7587 }, {
7588 .eraseblocks = { {64 * 1024, 16} },
7589 .block_erase = spi_block_erase_d8,
7590 }, {
7591 .eraseblocks = { {1024 * 1024, 1} },
7592 .block_erase = spi_block_erase_60,
7593 }, {
7594 .eraseblocks = { {1024 * 1024, 1} },
7595 .block_erase = spi_block_erase_c7,
7596 },
7597 },
hailfingerb9560ee2010-07-14 20:21:22 +00007598 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00007599 .write = spi_chip_write_1,
hailfinger286829b2009-01-08 03:40:17 +00007600 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00007601 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00007602 },
7603
hailfinger286829b2009-01-08 03:40:17 +00007604 {
7605 .vendor = "SST",
7606 .name = "SST28SF040A",
hailfingere1e41ea2011-07-27 07:13:06 +00007607 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00007608 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007609 .model_id = SST_SST28SF040,
hailfinger286829b2009-01-08 03:40:17 +00007610 .total_size = 512,
7611 .page_size = 256,
snelsonc6855342010-01-28 23:55:12 +00007612 .feature_bits = 0,
hailfinger286829b2009-01-08 03:40:17 +00007613 .tested = TEST_UNTESTED,
hailfingerb8e4e212010-03-15 03:48:42 +00007614 .probe = probe_82802ab,
uwe37f43422011-06-19 17:23:55 +00007615 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst28sf040.c) */
snelson264e57c2010-01-20 20:55:53 +00007616 .block_erasers =
7617 {
7618 {
7619 .eraseblocks = { {128, 4096} },
7620 .block_erase = erase_sector_28sf040,
7621 }, {
7622 .eraseblocks = { {512 * 1024, 1} },
7623 .block_erase = erase_chip_28sf040,
7624 }
7625 },
hailfinger86bf3b52010-10-13 21:49:30 +00007626 .unlock = unprotect_28sf040,
hailfinger286829b2009-01-08 03:40:17 +00007627 .write = write_28sf040,
hailfinger23060112009-05-08 12:49:03 +00007628 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007629 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00007630 },
7631
hailfinger286829b2009-01-08 03:40:17 +00007632 {
7633 .vendor = "SST",
7634 .name = "SST29EE010",
hailfingere1e41ea2011-07-27 07:13:06 +00007635 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00007636 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007637 .model_id = SST_SST29EE010,
hailfinger286829b2009-01-08 03:40:17 +00007638 .total_size = 128,
7639 .page_size = 128,
snelsonc6855342010-01-28 23:55:12 +00007640 .feature_bits = FEATURE_LONG_RESET,
hailfingerd217d122010-10-08 18:52:29 +00007641 .tested = TEST_OK_PR,
hailfinger286829b2009-01-08 03:40:17 +00007642 .probe = probe_jedec,
Simon Glass8dc82732013-07-16 10:13:51 -06007643 .probe_timing = 10,
snelson264e57c2010-01-20 20:55:53 +00007644 .block_erasers =
7645 {
7646 {
7647 .eraseblocks = { {128 * 1024, 1} },
7648 .block_erase = erase_chip_block_jedec,
7649 }
7650 },
hailfinger286829b2009-01-08 03:40:17 +00007651 .write = write_jedec,
hailfinger23060112009-05-08 12:49:03 +00007652 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007653 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00007654 },
7655
hailfinger286829b2009-01-08 03:40:17 +00007656 {
7657 .vendor = "SST",
7658 .name = "SST29LE010",
hailfingere1e41ea2011-07-27 07:13:06 +00007659 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00007660 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007661 .model_id = SST_SST29LE010,
hailfinger286829b2009-01-08 03:40:17 +00007662 .total_size = 128,
7663 .page_size = 128,
snelsonc6855342010-01-28 23:55:12 +00007664 .feature_bits = FEATURE_LONG_RESET,
hailfinger286829b2009-01-08 03:40:17 +00007665 .tested = TEST_UNTESTED,
7666 .probe = probe_jedec,
Simon Glass8dc82732013-07-16 10:13:51 -06007667 .probe_timing = 10,
snelson264e57c2010-01-20 20:55:53 +00007668 .block_erasers =
7669 {
7670 {
7671 .eraseblocks = { {128 * 1024, 1} },
7672 .block_erase = erase_chip_block_jedec,
7673 }
7674 },
hailfinger286829b2009-01-08 03:40:17 +00007675 .write = write_jedec,
hailfinger23060112009-05-08 12:49:03 +00007676 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007677 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00007678 },
7679
hailfinger286829b2009-01-08 03:40:17 +00007680 {
7681 .vendor = "SST",
7682 .name = "SST29EE020A",
hailfingere1e41ea2011-07-27 07:13:06 +00007683 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00007684 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007685 .model_id = SST_SST29EE020A,
hailfinger286829b2009-01-08 03:40:17 +00007686 .total_size = 256,
7687 .page_size = 128,
snelsonc6855342010-01-28 23:55:12 +00007688 .feature_bits = FEATURE_LONG_RESET,
hailfingerd217d122010-10-08 18:52:29 +00007689 .tested = TEST_OK_PRE,
hailfinger286829b2009-01-08 03:40:17 +00007690 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00007691 .probe_timing = 10,
snelson264e57c2010-01-20 20:55:53 +00007692 .block_erasers =
7693 {
7694 {
7695 .eraseblocks = { {256 * 1024, 1} },
7696 .block_erase = erase_chip_block_jedec,
7697 }
7698 },
hailfinger286829b2009-01-08 03:40:17 +00007699 .write = write_jedec,
hailfinger23060112009-05-08 12:49:03 +00007700 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007701 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00007702 },
7703
hailfinger286829b2009-01-08 03:40:17 +00007704 {
7705 .vendor = "SST",
7706 .name = "SST29LE020",
hailfingere1e41ea2011-07-27 07:13:06 +00007707 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00007708 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007709 .model_id = SST_SST29LE020,
hailfinger286829b2009-01-08 03:40:17 +00007710 .total_size = 256,
7711 .page_size = 128,
snelsonc6855342010-01-28 23:55:12 +00007712 .feature_bits = FEATURE_LONG_RESET,
hailfingerd217d122010-10-08 18:52:29 +00007713 .tested = TEST_OK_PRE,
hailfinger286829b2009-01-08 03:40:17 +00007714 .probe = probe_jedec,
Simon Glass8dc82732013-07-16 10:13:51 -06007715 .probe_timing = 10,
snelson264e57c2010-01-20 20:55:53 +00007716 .block_erasers =
7717 {
7718 {
7719 .eraseblocks = { {256 * 1024, 1} },
7720 .block_erase = erase_chip_block_jedec,
7721 }
7722 },
hailfinger286829b2009-01-08 03:40:17 +00007723 .write = write_jedec,
hailfinger23060112009-05-08 12:49:03 +00007724 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007725 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00007726 },
7727
hailfinger286829b2009-01-08 03:40:17 +00007728 {
7729 .vendor = "SST",
uwe2c909142010-01-23 15:15:19 +00007730 .name = "SST39SF512",
hailfingere1e41ea2011-07-27 07:13:06 +00007731 .bustype = BUS_PARALLEL,
uwe2c909142010-01-23 15:15:19 +00007732 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007733 .model_id = SST_SST39SF512,
uwe2c909142010-01-23 15:15:19 +00007734 .total_size = 64,
7735 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +00007736 .feature_bits = FEATURE_EITHER_RESET,
hailfingerf35c3932011-03-07 15:32:58 +00007737 .tested = TEST_OK_PREW,
uwe2c909142010-01-23 15:15:19 +00007738 .probe = probe_jedec,
7739 .probe_timing = 1, /* 150 ns */
uwe2c909142010-01-23 15:15:19 +00007740 .block_erasers =
7741 {
7742 {
7743 .eraseblocks = { {4 * 1024, 16} },
7744 .block_erase = erase_sector_jedec,
7745 }, {
7746 .eraseblocks = { {64 * 1024, 1} },
7747 .block_erase = erase_chip_block_jedec,
7748 }
7749 },
snelsonc6855342010-01-28 23:55:12 +00007750 .write = write_jedec_1,
uwe2c909142010-01-23 15:15:19 +00007751 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007752 .voltage = {4500, 5500},
uwe2c909142010-01-23 15:15:19 +00007753 },
7754
7755 {
7756 .vendor = "SST",
hailfinger286829b2009-01-08 03:40:17 +00007757 .name = "SST39SF010A",
hailfingere1e41ea2011-07-27 07:13:06 +00007758 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00007759 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007760 .model_id = SST_SST39SF010,
hailfinger286829b2009-01-08 03:40:17 +00007761 .total_size = 128,
7762 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +00007763 .feature_bits = FEATURE_EITHER_RESET,
stefanct371e7e82011-07-07 19:56:58 +00007764 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00007765 .probe = probe_jedec,
hailfingerc391ccb2009-06-12 11:45:10 +00007766 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +00007767 .block_erasers =
7768 {
7769 {
7770 .eraseblocks = { {4 * 1024, 32} },
7771 .block_erase = erase_sector_jedec,
7772 }, {
7773 .eraseblocks = { {128 * 1024, 1} },
7774 .block_erase = erase_chip_block_jedec,
7775 }
7776 },
snelsonc6855342010-01-28 23:55:12 +00007777 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00007778 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007779 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00007780 },
7781
hailfinger286829b2009-01-08 03:40:17 +00007782 {
7783 .vendor = "SST",
7784 .name = "SST39SF020A",
hailfingere1e41ea2011-07-27 07:13:06 +00007785 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00007786 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007787 .model_id = SST_SST39SF020,
hailfinger286829b2009-01-08 03:40:17 +00007788 .total_size = 256,
7789 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +00007790 .feature_bits = FEATURE_EITHER_RESET,
David Hendricksc801adb2010-12-09 16:58:56 -08007791 .tested = TEST_OK_PRE,
hailfinger286829b2009-01-08 03:40:17 +00007792 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +00007793 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +00007794 .block_erasers =
7795 {
7796 {
7797 .eraseblocks = { {4 * 1024, 64} },
7798 .block_erase = erase_sector_jedec,
7799 }, {
7800 .eraseblocks = { {256 * 1024, 1} },
7801 .block_erase = erase_chip_block_jedec,
7802 }
7803 },
snelsonc6855342010-01-28 23:55:12 +00007804 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00007805 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007806 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00007807 },
7808
hailfinger286829b2009-01-08 03:40:17 +00007809 {
7810 .vendor = "SST",
7811 .name = "SST39SF040",
hailfingere1e41ea2011-07-27 07:13:06 +00007812 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00007813 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007814 .model_id = SST_SST39SF040,
hailfinger286829b2009-01-08 03:40:17 +00007815 .total_size = 512,
7816 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +00007817 .feature_bits = FEATURE_EITHER_RESET,
stefanctd6efe1a2011-09-03 11:22:27 +00007818 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00007819 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +00007820 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +00007821 .block_erasers =
7822 {
7823 {
7824 .eraseblocks = { {4 * 1024, 128} },
7825 .block_erase = erase_sector_jedec,
7826 }, {
7827 .eraseblocks = { {512 * 1024, 1} },
7828 .block_erase = erase_chip_block_jedec,
7829 }
7830 },
snelsonc6855342010-01-28 23:55:12 +00007831 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00007832 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007833 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00007834 },
7835
hailfinger286829b2009-01-08 03:40:17 +00007836 {
7837 .vendor = "SST",
7838 .name = "SST39VF512",
hailfingere1e41ea2011-07-27 07:13:06 +00007839 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00007840 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007841 .model_id = SST_SST39VF512,
hailfinger286829b2009-01-08 03:40:17 +00007842 .total_size = 64,
7843 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +00007844 .feature_bits = FEATURE_EITHER_RESET,
hailfingerd217d122010-10-08 18:52:29 +00007845 .tested = TEST_OK_PRE,
hailfinger286829b2009-01-08 03:40:17 +00007846 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +00007847 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +00007848 .block_erasers =
7849 {
7850 {
7851 .eraseblocks = { {4 * 1024, 16} },
7852 .block_erase = erase_sector_jedec,
7853 }, {
7854 .eraseblocks = { {64 * 1024, 1} },
7855 .block_erase = erase_chip_block_jedec,
7856 }
7857 },
snelsonc6855342010-01-28 23:55:12 +00007858 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00007859 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007860 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00007861 },
7862
hailfinger286829b2009-01-08 03:40:17 +00007863 {
7864 .vendor = "SST",
7865 .name = "SST39VF010",
hailfingere1e41ea2011-07-27 07:13:06 +00007866 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00007867 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007868 .model_id = SST_SST39VF010,
hailfinger286829b2009-01-08 03:40:17 +00007869 .total_size = 128,
7870 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +00007871 .feature_bits = FEATURE_EITHER_RESET,
hailfingerd217d122010-10-08 18:52:29 +00007872 .tested = TEST_OK_PRE,
hailfinger286829b2009-01-08 03:40:17 +00007873 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +00007874 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +00007875 .block_erasers =
7876 {
7877 {
7878 .eraseblocks = { {4 * 1024, 32} },
7879 .block_erase = erase_sector_jedec,
7880 }, {
7881 .eraseblocks = { {128 * 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},
stepanaa1b6a22008-12-08 18:15:10 +00007888 },
7889
hailfinger286829b2009-01-08 03:40:17 +00007890 {
7891 .vendor = "SST",
7892 .name = "SST39VF020",
hailfingere1e41ea2011-07-27 07:13:06 +00007893 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00007894 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007895 .model_id = SST_SST39VF020,
hailfinger286829b2009-01-08 03:40:17 +00007896 .total_size = 256,
7897 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +00007898 .feature_bits = FEATURE_EITHER_RESET,
7899 .tested = TEST_UNTESTED,
hailfinger286829b2009-01-08 03:40:17 +00007900 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +00007901 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +00007902 .block_erasers =
7903 {
7904 {
7905 .eraseblocks = { {4 * 1024, 64} },
7906 .block_erase = erase_sector_jedec,
7907 }, {
7908 .eraseblocks = { {256 * 1024, 1} },
7909 .block_erase = erase_chip_block_jedec,
7910 }
7911 },
snelsonc6855342010-01-28 23:55:12 +00007912 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00007913 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007914 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00007915 },
7916
hailfinger286829b2009-01-08 03:40:17 +00007917 {
7918 .vendor = "SST",
7919 .name = "SST39VF040",
hailfingere1e41ea2011-07-27 07:13:06 +00007920 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00007921 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007922 .model_id = SST_SST39VF040,
hailfinger286829b2009-01-08 03:40:17 +00007923 .total_size = 512,
7924 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +00007925 .feature_bits = FEATURE_EITHER_RESET,
7926 .tested = TEST_UNTESTED,
hailfinger286829b2009-01-08 03:40:17 +00007927 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +00007928 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +00007929 .block_erasers =
7930 {
7931 {
7932 .eraseblocks = { {4 * 1024, 128} },
7933 .block_erase = erase_sector_jedec,
7934 }, {
7935 .eraseblocks = { {512 * 1024, 1} },
7936 .block_erase = erase_chip_block_jedec,
7937 }
7938 },
snelsonc6855342010-01-28 23:55:12 +00007939 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00007940 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007941 .voltage = {2700, 3600},
hailfingerdfa338f2008-12-08 23:51:45 +00007942 },
stepanaa1b6a22008-12-08 18:15:10 +00007943
hailfinger286829b2009-01-08 03:40:17 +00007944 {
7945 .vendor = "SST",
stuged9f66152009-01-25 23:55:12 +00007946 .name = "SST39VF080",
hailfingere1e41ea2011-07-27 07:13:06 +00007947 .bustype = BUS_PARALLEL,
hailfingerc391ccb2009-06-12 11:45:10 +00007948 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007949 .model_id = SST_SST39VF080,
stuged9f66152009-01-25 23:55:12 +00007950 .total_size = 1024,
7951 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +00007952 .feature_bits = FEATURE_EITHER_RESET,
stuged9f66152009-01-25 23:55:12 +00007953 .tested = TEST_UNTESTED,
7954 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +00007955 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +00007956 .block_erasers =
7957 {
7958 {
7959 .eraseblocks = { {4 * 1024, 256} },
7960 .block_erase = erase_sector_jedec,
7961 }, {
7962 .eraseblocks = { {64 * 1024, 16} },
7963 .block_erase = erase_block_jedec,
7964 }, {
7965 .eraseblocks = { {1024 * 1024, 1} },
7966 .block_erase = erase_chip_block_jedec,
7967 }
7968 },
snelsonc6855342010-01-28 23:55:12 +00007969 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00007970 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007971 .voltage = {2700, 3600},
stuged9f66152009-01-25 23:55:12 +00007972 },
7973
7974 {
7975 .vendor = "SST",
hailfinger286829b2009-01-08 03:40:17 +00007976 .name = "SST49LF002A/B",
hailfingere1e41ea2011-07-27 07:13:06 +00007977 .bustype = BUS_FWH, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00007978 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007979 .model_id = SST_SST49LF002A,
hailfinger286829b2009-01-08 03:40:17 +00007980 .total_size = 256,
7981 .page_size = 16 * 1024,
snelsonc6855342010-01-28 23:55:12 +00007982 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
David Hendricksc801adb2010-12-09 16:58:56 -08007983 .tested = TEST_OK_PRE,
hailfingerb8e4e212010-03-15 03:48:42 +00007984 .probe = probe_jedec,
7985 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +00007986 .block_erasers =
7987 {
7988 {
7989 .eraseblocks = { {4 * 1024, 64} },
snelson712e72d2010-03-16 03:09:10 +00007990 .block_erase = erase_sector_jedec,
snelson264e57c2010-01-20 20:55:53 +00007991 }, {
7992 .eraseblocks = { {16 * 1024, 16} },
snelson712e72d2010-03-16 03:09:10 +00007993 .block_erase = erase_block_jedec,
snelson264e57c2010-01-20 20:55:53 +00007994 }, {
7995 .eraseblocks = { {256 * 1024, 1} },
7996 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
7997 }
7998 },
hailfingerb8e4e212010-03-15 03:48:42 +00007999 .printlock = printlock_sst_fwhub,
snelson712e72d2010-03-16 03:09:10 +00008000 .unlock = unlock_sst_fwhub,
8001 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00008002 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008003 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00008004 },
8005
hailfinger286829b2009-01-08 03:40:17 +00008006 {
8007 .vendor = "SST",
8008 .name = "SST49LF003A/B",
hailfingere1e41ea2011-07-27 07:13:06 +00008009 .bustype = BUS_FWH, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00008010 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00008011 .model_id = SST_SST49LF003A,
hailfinger286829b2009-01-08 03:40:17 +00008012 .total_size = 384,
8013 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00008014 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
uwe63555e62009-09-25 01:09:18 +00008015 .tested = TEST_OK_PR,
hailfingerb8e4e212010-03-15 03:48:42 +00008016 .probe = probe_jedec,
8017 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +00008018 .block_erasers =
8019 {
8020 {
8021 .eraseblocks = { {4 * 1024, 96} },
snelson712e72d2010-03-16 03:09:10 +00008022 .block_erase = erase_sector_jedec,
snelson264e57c2010-01-20 20:55:53 +00008023 }, {
8024 .eraseblocks = { {64 * 1024, 6} },
snelson712e72d2010-03-16 03:09:10 +00008025 .block_erase = erase_block_jedec,
snelson264e57c2010-01-20 20:55:53 +00008026 }, {
8027 .eraseblocks = { {384 * 1024, 1} },
8028 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
8029 }
8030 },
hailfingerb8e4e212010-03-15 03:48:42 +00008031 .printlock = printlock_sst_fwhub,
snelson712e72d2010-03-16 03:09:10 +00008032 .unlock = unlock_sst_fwhub,
8033 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00008034 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008035 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00008036 },
8037
hailfinger286829b2009-01-08 03:40:17 +00008038 {
hailfinger80f48682009-09-23 22:01:33 +00008039 /* Contrary to the data sheet, TBL# on the SST49LF004B affects the top 128kB (instead of 64kB)
8040 * and is only honored for 64k block erase, but not 4k sector erase.
8041 */
hailfinger286829b2009-01-08 03:40:17 +00008042 .vendor = "SST",
8043 .name = "SST49LF004A/B",
hailfingere1e41ea2011-07-27 07:13:06 +00008044 .bustype = BUS_FWH, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00008045 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00008046 .model_id = SST_SST49LF004A,
hailfinger286829b2009-01-08 03:40:17 +00008047 .total_size = 512,
8048 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00008049 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
David Hendricksc801adb2010-12-09 16:58:56 -08008050 .tested = TEST_OK_PRE,
hailfingerb8e4e212010-03-15 03:48:42 +00008051 .probe = probe_jedec,
8052 .probe_timing = 1, /* 150 ns */
hailfinger80f48682009-09-23 22:01:33 +00008053 .block_erasers =
8054 {
8055 {
8056 .eraseblocks = { {4 * 1024, 128} },
snelson712e72d2010-03-16 03:09:10 +00008057 .block_erase = erase_sector_jedec,
hailfinger80f48682009-09-23 22:01:33 +00008058 }, {
8059 .eraseblocks = { {64 * 1024, 8} },
snelson712e72d2010-03-16 03:09:10 +00008060 .block_erase = erase_block_jedec,
hailfinger80f48682009-09-23 22:01:33 +00008061 }, {
8062 .eraseblocks = { {512 * 1024, 1} },
snelson264e57c2010-01-20 20:55:53 +00008063 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
hailfinger80f48682009-09-23 22:01:33 +00008064 },
8065 },
hailfingerb8e4e212010-03-15 03:48:42 +00008066 .printlock = printlock_sst_fwhub,
snelson712e72d2010-03-16 03:09:10 +00008067 .unlock = unlock_sst_fwhub,
8068 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00008069 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008070 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00008071 },
8072
hailfinger286829b2009-01-08 03:40:17 +00008073 {
8074 .vendor = "SST",
8075 .name = "SST49LF004C",
hailfingere1e41ea2011-07-27 07:13:06 +00008076 .bustype = BUS_FWH,
hailfinger286829b2009-01-08 03:40:17 +00008077 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00008078 .model_id = SST_SST49LF004C,
hailfinger286829b2009-01-08 03:40:17 +00008079 .total_size = 512,
8080 .page_size = 4 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00008081 .feature_bits = FEATURE_REGISTERMAP,
hailfinger286829b2009-01-08 03:40:17 +00008082 .tested = TEST_UNTESTED,
hailfingerb8e4e212010-03-15 03:48:42 +00008083 .probe = probe_82802ab,
uwe37f43422011-06-19 17:23:55 +00008084 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
snelson264e57c2010-01-20 20:55:53 +00008085 .block_erasers =
8086 {
8087 {
8088 .eraseblocks = { {4 * 1024, 128} },
8089 .block_erase = erase_sector_49lfxxxc,
8090 }, {
Simon Glass8dc82732013-07-16 10:13:51 -06008091 .eraseblocks = {
snelson264e57c2010-01-20 20:55:53 +00008092 {64 * 1024, 7},
8093 {32 * 1024, 1},
8094 {8 * 1024, 2},
8095 {16 * 1024, 1},
8096 },
snelson3a69e422010-03-23 17:10:28 +00008097 .block_erase = erase_block_82802ab,
snelson264e57c2010-01-20 20:55:53 +00008098 }
8099 },
snelson3a69e422010-03-23 17:10:28 +00008100 .unlock = unlock_49lfxxxc,
hailfinger86bf3b52010-10-13 21:49:30 +00008101 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00008102 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008103 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00008104 },
8105
hailfinger286829b2009-01-08 03:40:17 +00008106 {
8107 .vendor = "SST",
8108 .name = "SST49LF008A",
hailfingere1e41ea2011-07-27 07:13:06 +00008109 .bustype = BUS_FWH, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00008110 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00008111 .model_id = SST_SST49LF008A,
hailfinger286829b2009-01-08 03:40:17 +00008112 .total_size = 1024,
8113 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00008114 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
stefanct98d917c2011-10-21 12:33:07 +00008115 .tested = TEST_OK_PREW,
hailfingerb8e4e212010-03-15 03:48:42 +00008116 .probe = probe_jedec,
8117 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +00008118 .block_erasers =
8119 {
8120 {
8121 .eraseblocks = { {4 * 1024, 256} },
snelson712e72d2010-03-16 03:09:10 +00008122 .block_erase = erase_sector_jedec,
snelson264e57c2010-01-20 20:55:53 +00008123 }, {
8124 .eraseblocks = { {64 * 1024, 16} },
snelson712e72d2010-03-16 03:09:10 +00008125 .block_erase = erase_block_jedec,
snelson264e57c2010-01-20 20:55:53 +00008126 }, {
8127 .eraseblocks = { {1024 * 1024, 1} },
8128 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
8129 }
8130 },
hailfingerb8e4e212010-03-15 03:48:42 +00008131 .printlock = printlock_sst_fwhub,
snelson712e72d2010-03-16 03:09:10 +00008132 .unlock = unlock_sst_fwhub,
8133 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00008134 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008135 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00008136 },
8137
hailfinger286829b2009-01-08 03:40:17 +00008138 {
8139 .vendor = "SST",
8140 .name = "SST49LF008C",
hailfingere1e41ea2011-07-27 07:13:06 +00008141 .bustype = BUS_FWH,
hailfinger286829b2009-01-08 03:40:17 +00008142 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00008143 .model_id = SST_SST49LF008C,
hailfinger286829b2009-01-08 03:40:17 +00008144 .total_size = 1024,
8145 .page_size = 4 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00008146 .feature_bits = FEATURE_REGISTERMAP,
hailfinger286829b2009-01-08 03:40:17 +00008147 .tested = TEST_UNTESTED,
hailfingerb8e4e212010-03-15 03:48:42 +00008148 .probe = probe_82802ab,
uwe37f43422011-06-19 17:23:55 +00008149 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
snelson264e57c2010-01-20 20:55:53 +00008150 .block_erasers =
8151 {
8152 {
8153 .eraseblocks = { {4 * 1024, 256} },
8154 .block_erase = erase_sector_49lfxxxc,
8155 }, {
Simon Glass8dc82732013-07-16 10:13:51 -06008156 .eraseblocks = {
snelson264e57c2010-01-20 20:55:53 +00008157 {64 * 1024, 15},
8158 {32 * 1024, 1},
8159 {8 * 1024, 2},
8160 {16 * 1024, 1},
8161 },
snelson3a69e422010-03-23 17:10:28 +00008162 .block_erase = erase_block_82802ab,
snelson264e57c2010-01-20 20:55:53 +00008163 }
8164 },
snelson3a69e422010-03-23 17:10:28 +00008165 .unlock = unlock_49lfxxxc,
hailfinger86bf3b52010-10-13 21:49:30 +00008166 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00008167 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008168 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00008169 },
8170
hailfinger286829b2009-01-08 03:40:17 +00008171 {
8172 .vendor = "SST",
8173 .name = "SST49LF016C",
hailfingere1e41ea2011-07-27 07:13:06 +00008174 .bustype = BUS_FWH,
hailfinger286829b2009-01-08 03:40:17 +00008175 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00008176 .model_id = SST_SST49LF016C,
hailfinger286829b2009-01-08 03:40:17 +00008177 .total_size = 2048,
8178 .page_size = 4 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00008179 .feature_bits = FEATURE_REGISTERMAP,
hailfingerd217d122010-10-08 18:52:29 +00008180 .tested = TEST_OK_PR,
hailfingerb8e4e212010-03-15 03:48:42 +00008181 .probe = probe_82802ab,
uwe37f43422011-06-19 17:23:55 +00008182 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
snelson264e57c2010-01-20 20:55:53 +00008183 .block_erasers =
8184 {
8185 {
8186 .eraseblocks = { {4 * 1024, 512} },
8187 .block_erase = erase_sector_49lfxxxc,
8188 }, {
Simon Glass8dc82732013-07-16 10:13:51 -06008189 .eraseblocks = {
snelson264e57c2010-01-20 20:55:53 +00008190 {64 * 1024, 31},
8191 {32 * 1024, 1},
8192 {8 * 1024, 2},
8193 {16 * 1024, 1},
8194 },
snelson3a69e422010-03-23 17:10:28 +00008195 .block_erase = erase_block_82802ab,
snelson264e57c2010-01-20 20:55:53 +00008196 }
8197 },
snelson3a69e422010-03-23 17:10:28 +00008198 .unlock = unlock_49lfxxxc,
hailfinger86bf3b52010-10-13 21:49:30 +00008199 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00008200 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008201 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00008202 },
8203
hailfinger286829b2009-01-08 03:40:17 +00008204 {
8205 .vendor = "SST",
8206 .name = "SST49LF020",
hailfingere1e41ea2011-07-27 07:13:06 +00008207 .bustype = BUS_LPC,
hailfinger286829b2009-01-08 03:40:17 +00008208 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00008209 .model_id = SST_SST49LF020,
hailfinger286829b2009-01-08 03:40:17 +00008210 .total_size = 256,
8211 .page_size = 16 * 1024,
snelsonc6855342010-01-28 23:55:12 +00008212 .feature_bits = FEATURE_EITHER_RESET,
David Hendricksc801adb2010-12-09 16:58:56 -08008213 .tested = TEST_OK_PRE,
hailfinger286829b2009-01-08 03:40:17 +00008214 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +00008215 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +00008216 .block_erasers =
8217 {
8218 {
8219 .eraseblocks = { {4 * 1024, 64} },
8220 .block_erase = erase_sector_jedec,
8221 }, {
8222 .eraseblocks = { {16 * 1024, 16} },
8223 .block_erase = erase_block_jedec,
8224 }, {
8225 .eraseblocks = { {256 * 1024, 1} },
8226 .block_erase = NULL,
8227 }
8228 },
snelsonc6855342010-01-28 23:55:12 +00008229 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00008230 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008231 .voltage = {3000, 3600},
uwebf4a9a92009-01-07 12:35:09 +00008232 },
8233
hailfinger286829b2009-01-08 03:40:17 +00008234 {
8235 .vendor = "SST",
8236 .name = "SST49LF020A",
hailfingere1e41ea2011-07-27 07:13:06 +00008237 .bustype = BUS_LPC,
hailfinger286829b2009-01-08 03:40:17 +00008238 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00008239 .model_id = SST_SST49LF020A,
hailfinger286829b2009-01-08 03:40:17 +00008240 .total_size = 256,
hailfinger73134c42009-07-23 01:44:38 +00008241 .page_size = 4 * 1024,
snelsonc6855342010-01-28 23:55:12 +00008242 .feature_bits = FEATURE_EITHER_RESET,
hailfingerd217d122010-10-08 18:52:29 +00008243 .tested = TEST_OK_PRE,
hailfinger286829b2009-01-08 03:40:17 +00008244 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +00008245 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +00008246 .block_erasers =
8247 {
8248 {
8249 .eraseblocks = { {4 * 1024, 64} },
8250 .block_erase = erase_sector_jedec,
8251 }, {
8252 .eraseblocks = { {16 * 1024, 16} },
8253 .block_erase = erase_block_jedec,
8254 }, {
8255 .eraseblocks = { {256 * 1024, 1} },
8256 .block_erase = NULL,
8257 }
8258 },
snelsonc6855342010-01-28 23:55:12 +00008259 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00008260 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008261 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00008262 },
8263
hailfinger286829b2009-01-08 03:40:17 +00008264 {
8265 .vendor = "SST",
8266 .name = "SST49LF040",
hailfingere1e41ea2011-07-27 07:13:06 +00008267 .bustype = BUS_LPC,
hailfinger286829b2009-01-08 03:40:17 +00008268 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00008269 .model_id = SST_SST49LF040,
hailfinger286829b2009-01-08 03:40:17 +00008270 .total_size = 512,
8271 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +00008272 .feature_bits = FEATURE_EITHER_RESET,
hailfingerd217d122010-10-08 18:52:29 +00008273 .tested = TEST_OK_PRE,
hailfinger286829b2009-01-08 03:40:17 +00008274 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +00008275 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +00008276 .block_erasers =
8277 {
8278 {
8279 .eraseblocks = { {4 * 1024, 128} },
8280 .block_erase = erase_sector_jedec,
8281 }, {
8282 .eraseblocks = { {64 * 1024, 8} },
8283 .block_erase = erase_block_jedec,
8284 }, {
8285 .eraseblocks = { {512 * 1024, 1} },
8286 .block_erase = NULL,
8287 }
8288 },
snelsonc6855342010-01-28 23:55:12 +00008289 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00008290 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008291 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00008292 },
8293
hailfinger286829b2009-01-08 03:40:17 +00008294 {
8295 .vendor = "SST",
8296 .name = "SST49LF040B",
hailfingere1e41ea2011-07-27 07:13:06 +00008297 .bustype = BUS_LPC, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00008298 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00008299 .model_id = SST_SST49LF040B,
hailfinger286829b2009-01-08 03:40:17 +00008300 .total_size = 512,
8301 .page_size = 64 * 1024,
mkarcher83414fc2010-08-16 22:12:39 +00008302 .feature_bits = FEATURE_EITHER_RESET | FEATURE_REGISTERMAP,
stefanctd6efe1a2011-09-03 11:22:27 +00008303 .tested = TEST_OK_PREW,
snelson264e57c2010-01-20 20:55:53 +00008304 .probe = probe_jedec,
hailfingerb8e4e212010-03-15 03:48:42 +00008305 .probe_timing = 1, /* 150ns */
snelson264e57c2010-01-20 20:55:53 +00008306 .block_erasers =
8307 {
8308 {
8309 .eraseblocks = { {4 * 1024, 128} },
8310 .block_erase = erase_sector_jedec,
8311 }, {
8312 .eraseblocks = { {64 * 1024, 8} },
8313 .block_erase = erase_block_jedec,
8314 }, {
8315 .eraseblocks = { {512 * 1024, 1} },
8316 .block_erase = NULL,
8317 }
8318 },
mkarcher83414fc2010-08-16 22:12:39 +00008319 .unlock = unlock_82802ab,
snelsonc6855342010-01-28 23:55:12 +00008320 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00008321 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008322 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00008323 },
8324
hailfinger286829b2009-01-08 03:40:17 +00008325 {
8326 .vendor = "SST",
8327 .name = "SST49LF080A",
hailfingere1e41ea2011-07-27 07:13:06 +00008328 .bustype = BUS_LPC, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00008329 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00008330 .model_id = SST_SST49LF080A,
hailfinger286829b2009-01-08 03:40:17 +00008331 .total_size = 1024,
8332 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +00008333 .feature_bits = FEATURE_EITHER_RESET,
David Hendricksc801adb2010-12-09 16:58:56 -08008334 .tested = TEST_OK_PRE,
hailfinger286829b2009-01-08 03:40:17 +00008335 .probe = probe_jedec,
Simon Glass8dc82732013-07-16 10:13:51 -06008336 .probe_timing = TIMING_FIXME,
snelson264e57c2010-01-20 20:55:53 +00008337 .block_erasers =
8338 {
8339 {
8340 .eraseblocks = { {4 * 1024, 256} },
8341 .block_erase = erase_sector_jedec,
8342 }, {
8343 .eraseblocks = { {64 * 1024, 16} },
8344 .block_erase = erase_block_jedec,
8345 }, {
8346 .eraseblocks = { {1024 * 1024, 1} },
8347 .block_erase = NULL,
8348 }
8349 },
snelsonc6855342010-01-28 23:55:12 +00008350 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00008351 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008352 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00008353 },
8354
hailfinger286829b2009-01-08 03:40:17 +00008355 {
8356 .vendor = "SST",
8357 .name = "SST49LF160C",
hailfingere1e41ea2011-07-27 07:13:06 +00008358 .bustype = BUS_LPC,
hailfinger286829b2009-01-08 03:40:17 +00008359 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00008360 .model_id = SST_SST49LF160C,
hailfinger286829b2009-01-08 03:40:17 +00008361 .total_size = 2048,
8362 .page_size = 4 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00008363 .feature_bits = FEATURE_REGISTERMAP,
hailfingerd217d122010-10-08 18:52:29 +00008364 .tested = TEST_OK_PRE,
hailfingerb8e4e212010-03-15 03:48:42 +00008365 .probe = probe_82802ab,
uwe37f43422011-06-19 17:23:55 +00008366 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
snelson264e57c2010-01-20 20:55:53 +00008367 .block_erasers =
8368 {
8369 {
8370 .eraseblocks = { {4 * 1024, 512} },
8371 .block_erase = erase_sector_49lfxxxc,
8372 }, {
Simon Glass8dc82732013-07-16 10:13:51 -06008373 .eraseblocks = {
snelson264e57c2010-01-20 20:55:53 +00008374 {64 * 1024, 31},
8375 {32 * 1024, 1},
8376 {8 * 1024, 2},
8377 {16 * 1024, 1},
8378 },
snelson3a69e422010-03-23 17:10:28 +00008379 .block_erase = erase_block_82802ab,
snelson264e57c2010-01-20 20:55:53 +00008380 }
8381 },
snelson1ee293c2010-02-19 00:52:10 +00008382 .unlock = unlock_49lfxxxc,
hailfinger86bf3b52010-10-13 21:49:30 +00008383 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00008384 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008385 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00008386 },
8387
hailfinger286829b2009-01-08 03:40:17 +00008388 {
8389 .vendor = "ST",
8390 .name = "M25P05-A",
hailfingere1e41ea2011-07-27 07:13:06 +00008391 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00008392 .manufacture_id = ST_ID,
8393 .model_id = ST_M25P05A,
8394 .total_size = 64,
8395 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08008396 .feature_bits = FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00008397 .tested = TEST_UNTESTED,
8398 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00008399 .probe_timing = TIMING_ZERO,
snelsone0c56352010-01-19 16:08:51 +00008400 .block_erasers =
8401 {
8402 {
8403 .eraseblocks = { {32 * 1024, 2} },
8404 .block_erase = spi_block_erase_d8,
8405 }, {
8406 .eraseblocks = { {64 * 1024, 1} },
8407 .block_erase = spi_block_erase_c7,
8408 }
8409 },
hailfingerb9560ee2010-07-14 20:21:22 +00008410 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00008411 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00008412 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00008413 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00008414 },
8415
hailfingerfb513de2009-07-23 01:40:20 +00008416 /* The ST M25P05 is a bit of a problem. It has the same ID as the
8417 * ST M25P05-A in RES mode, but supports only 128 byte writes instead
hailfinger59a83572010-05-28 17:07:57 +00008418 * of 256 byte writes. We rely heavily on the fact that probe_spi_res1
hailfingerfb513de2009-07-23 01:40:20 +00008419 * only is successful if RDID does not work.
8420 */
8421 {
8422 .vendor = "ST",
stefanctd6efe1a2011-09-03 11:22:27 +00008423 .name = "M25P05",
hailfingere1e41ea2011-07-27 07:13:06 +00008424 .bustype = BUS_SPI,
hailfinger59a83572010-05-28 17:07:57 +00008425 .manufacture_id = 0, /* Not used. */
hailfingerfb513de2009-07-23 01:40:20 +00008426 .model_id = ST_M25P05_RES,
8427 .total_size = 64,
8428 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08008429 .feature_bits = FEATURE_UNBOUND_READ,
hailfingerfb513de2009-07-23 01:40:20 +00008430 .tested = TEST_UNTESTED,
hailfinger59a83572010-05-28 17:07:57 +00008431 .probe = probe_spi_res1,
hailfingerfb513de2009-07-23 01:40:20 +00008432 .probe_timing = TIMING_ZERO,
snelsone0c56352010-01-19 16:08:51 +00008433 .block_erasers =
8434 {
8435 {
8436 .eraseblocks = { {32 * 1024, 2} },
8437 .block_erase = spi_block_erase_d8,
8438 }, {
8439 .eraseblocks = { {64 * 1024, 1} },
8440 .block_erase = spi_block_erase_c7,
8441 }
8442 },
hailfingerb9560ee2010-07-14 20:21:22 +00008443 .unlock = spi_disable_blockprotect,
hailfingerfb513de2009-07-23 01:40:20 +00008444 .write = spi_chip_write_1, /* 128 */
8445 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00008446 .voltage = {2700, 3600},
hailfingerfb513de2009-07-23 01:40:20 +00008447 },
8448
hailfinger286829b2009-01-08 03:40:17 +00008449 {
8450 .vendor = "ST",
8451 .name = "M25P10-A",
hailfingere1e41ea2011-07-27 07:13:06 +00008452 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00008453 .manufacture_id = ST_ID,
8454 .model_id = ST_M25P10A,
8455 .total_size = 128,
8456 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08008457 .feature_bits = FEATURE_UNBOUND_READ,
8458 .tested = TEST_OK_PREU,
hailfinger286829b2009-01-08 03:40:17 +00008459 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00008460 .probe_timing = TIMING_ZERO,
snelsone0c56352010-01-19 16:08:51 +00008461 .block_erasers =
8462 {
8463 {
8464 .eraseblocks = { {32 * 1024, 4} },
8465 .block_erase = spi_block_erase_d8,
8466 }, {
8467 .eraseblocks = { {128 * 1024, 1} },
8468 .block_erase = spi_block_erase_c7,
8469 }
8470 },
hailfingerb9560ee2010-07-14 20:21:22 +00008471 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00008472 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00008473 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00008474 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00008475 },
8476
hailfingerfb513de2009-07-23 01:40:20 +00008477 /* The ST M25P10 has the same problem as the M25P05. */
8478 {
8479 .vendor = "ST",
stefanctd6efe1a2011-09-03 11:22:27 +00008480 .name = "M25P10",
hailfingere1e41ea2011-07-27 07:13:06 +00008481 .bustype = BUS_SPI,
hailfinger59a83572010-05-28 17:07:57 +00008482 .manufacture_id = 0, /* Not used. */
hailfingerfb513de2009-07-23 01:40:20 +00008483 .model_id = ST_M25P10_RES,
8484 .total_size = 128,
8485 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08008486 .feature_bits = FEATURE_UNBOUND_READ,
hailfingerfb513de2009-07-23 01:40:20 +00008487 .tested = TEST_UNTESTED,
hailfinger59a83572010-05-28 17:07:57 +00008488 .probe = probe_spi_res1,
hailfingerfb513de2009-07-23 01:40:20 +00008489 .probe_timing = TIMING_ZERO,
snelsone0c56352010-01-19 16:08:51 +00008490 .block_erasers =
8491 {
8492 {
8493 .eraseblocks = { {32 * 1024, 4} },
8494 .block_erase = spi_block_erase_d8,
8495 }, {
8496 .eraseblocks = { {128 * 1024, 1} },
8497 .block_erase = spi_block_erase_c7,
8498 }
8499 },
hailfingerb9560ee2010-07-14 20:21:22 +00008500 .unlock = spi_disable_blockprotect,
hailfingerfb513de2009-07-23 01:40:20 +00008501 .write = spi_chip_write_1, /* 128 */
8502 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00008503 .voltage = {2700, 3600},
hailfingerfb513de2009-07-23 01:40:20 +00008504 },
8505
hailfinger286829b2009-01-08 03:40:17 +00008506 {
8507 .vendor = "ST",
8508 .name = "M25P20",
hailfingere1e41ea2011-07-27 07:13:06 +00008509 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00008510 .manufacture_id = ST_ID,
8511 .model_id = ST_M25P20,
8512 .total_size = 256,
8513 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08008514 .feature_bits = FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00008515 .tested = TEST_UNTESTED,
8516 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00008517 .probe_timing = TIMING_ZERO,
snelsone0c56352010-01-19 16:08:51 +00008518 .block_erasers =
8519 {
8520 {
8521 .eraseblocks = { {64 * 1024, 4} },
8522 .block_erase = spi_block_erase_d8,
8523 }, {
8524 .eraseblocks = { {256 * 1024, 1} },
8525 .block_erase = spi_block_erase_c7,
8526 }
8527 },
hailfingerb9560ee2010-07-14 20:21:22 +00008528 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00008529 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00008530 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00008531 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00008532 },
8533
hailfinger286829b2009-01-08 03:40:17 +00008534 {
stefanctd6efe1a2011-09-03 11:22:27 +00008535 .vendor = "ST", /* Numonyx */
hailfinger286829b2009-01-08 03:40:17 +00008536 .name = "M25P40",
hailfingere1e41ea2011-07-27 07:13:06 +00008537 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00008538 .manufacture_id = ST_ID,
8539 .model_id = ST_M25P40,
8540 .total_size = 512,
8541 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08008542 .feature_bits = FEATURE_UNBOUND_READ,
Stefan Tauner718d1eb2016-08-18 18:00:53 -07008543 .tested = TEST_OK_PREWU,
hailfinger286829b2009-01-08 03:40:17 +00008544 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00008545 .probe_timing = TIMING_ZERO,
snelsone0c56352010-01-19 16:08:51 +00008546 .block_erasers =
8547 {
8548 {
8549 .eraseblocks = { {64 * 1024, 8} },
8550 .block_erase = spi_block_erase_d8,
8551 }, {
8552 .eraseblocks = { {512 * 1024, 1} },
8553 .block_erase = spi_block_erase_c7,
8554 }
8555 },
hailfingerb9560ee2010-07-14 20:21:22 +00008556 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00008557 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00008558 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00008559 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00008560 },
8561
hailfinger286829b2009-01-08 03:40:17 +00008562 {
8563 .vendor = "ST",
8564 .name = "M25P40-old",
hailfingere1e41ea2011-07-27 07:13:06 +00008565 .bustype = BUS_SPI,
hailfinger59a83572010-05-28 17:07:57 +00008566 .manufacture_id = 0, /* Not used. */
hailfinger286829b2009-01-08 03:40:17 +00008567 .model_id = ST_M25P40_RES,
8568 .total_size = 512,
8569 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08008570 .feature_bits = FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00008571 .tested = TEST_UNTESTED,
hailfinger59a83572010-05-28 17:07:57 +00008572 .probe = probe_spi_res1,
hailfingere3095d92009-06-05 13:46:17 +00008573 .probe_timing = TIMING_ZERO,
snelsone0c56352010-01-19 16:08:51 +00008574 .block_erasers =
8575 {
8576 {
8577 .eraseblocks = { {64 * 1024, 8} },
8578 .block_erase = spi_block_erase_d8,
8579 }, {
8580 .eraseblocks = { {512 * 1024, 1} },
8581 .block_erase = spi_block_erase_c7,
8582 }
8583 },
hailfingerb9560ee2010-07-14 20:21:22 +00008584 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00008585 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00008586 .read = spi_chip_read,
stepanaa1b6a22008-12-08 18:15:10 +00008587 },
8588
hailfinger286829b2009-01-08 03:40:17 +00008589 {
8590 .vendor = "ST",
8591 .name = "M25P80",
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_M25P80,
8595 .total_size = 1024,
8596 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08008597 .feature_bits = FEATURE_UNBOUND_READ,
8598 .tested = TEST_OK_PREWU,
hailfinger286829b2009-01-08 03:40:17 +00008599 .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, 16} },
8605 .block_erase = spi_block_erase_d8,
8606 }, {
8607 .eraseblocks = { {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 = "M25P16",
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_M25P16,
8623 .total_size = 2048,
8624 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08008625 .feature_bits = FEATURE_UNBOUND_READ,
8626 .tested = TEST_OK_PRU,
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 = { {64 * 1024, 32} },
8633 .block_erase = spi_block_erase_d8,
8634 }, {
8635 .eraseblocks = { {2 * 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",
8647 .name = "M25P32",
hailfingere1e41ea2011-07-27 07:13:06 +00008648 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00008649 .manufacture_id = ST_ID,
8650 .model_id = ST_M25P32,
8651 .total_size = 4096,
8652 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08008653 .feature_bits = FEATURE_UNBOUND_READ,
8654 .tested = TEST_OK_PREWU,
hailfinger286829b2009-01-08 03:40:17 +00008655 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00008656 .probe_timing = TIMING_ZERO,
snelsone0c56352010-01-19 16:08:51 +00008657 .block_erasers =
8658 {
8659 {
8660 .eraseblocks = { {64 * 1024, 64} },
8661 .block_erase = spi_block_erase_d8,
8662 }, {
8663 .eraseblocks = { {4 * 1024 * 1024, 1} },
8664 .block_erase = spi_block_erase_c7,
8665 }
8666 },
hailfingerb9560ee2010-07-14 20:21:22 +00008667 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00008668 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00008669 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00008670 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00008671 },
8672
hailfinger286829b2009-01-08 03:40:17 +00008673 {
8674 .vendor = "ST",
8675 .name = "M25P64",
hailfingere1e41ea2011-07-27 07:13:06 +00008676 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00008677 .manufacture_id = ST_ID,
8678 .model_id = ST_M25P64,
8679 .total_size = 8192,
8680 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08008681 .feature_bits = FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00008682 .tested = TEST_UNTESTED,
8683 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00008684 .probe_timing = TIMING_ZERO,
snelsone0c56352010-01-19 16:08:51 +00008685 .block_erasers =
8686 {
8687 {
8688 .eraseblocks = { {64 * 1024, 128} },
8689 .block_erase = spi_block_erase_d8,
8690 }, {
8691 .eraseblocks = { {8 * 1024 * 1024, 1} },
8692 .block_erase = spi_block_erase_c7,
8693 }
8694 },
hailfingerb9560ee2010-07-14 20:21:22 +00008695 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00008696 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00008697 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00008698 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00008699 },
8700
hailfinger286829b2009-01-08 03:40:17 +00008701 {
8702 .vendor = "ST",
8703 .name = "M25P128",
hailfingere1e41ea2011-07-27 07:13:06 +00008704 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00008705 .manufacture_id = ST_ID,
8706 .model_id = ST_M25P128,
8707 .total_size = 16384,
8708 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08008709 .feature_bits = FEATURE_UNBOUND_READ,
8710 .tested = TEST_OK_PREWU,
hailfinger286829b2009-01-08 03:40:17 +00008711 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00008712 .probe_timing = TIMING_ZERO,
snelsone0c56352010-01-19 16:08:51 +00008713 .block_erasers =
8714 {
8715 {
8716 .eraseblocks = { {256 * 1024, 64} },
8717 .block_erase = spi_block_erase_d8,
8718 }, {
8719 .eraseblocks = { {16 * 1024 * 1024, 1} },
8720 .block_erase = spi_block_erase_c7,
8721 }
8722 },
hailfingerb9560ee2010-07-14 20:21:22 +00008723 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00008724 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00008725 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00008726 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00008727 },
8728
hailfinger286829b2009-01-08 03:40:17 +00008729 {
8730 .vendor = "ST",
hailfinger38fd4992011-03-06 18:45:40 +00008731 .name = "M25PX16",
hailfingere1e41ea2011-07-27 07:13:06 +00008732 .bustype = BUS_SPI,
hailfinger38fd4992011-03-06 18:45:40 +00008733 .manufacture_id = ST_ID,
8734 .model_id = ST_M25PX16,
8735 .total_size = 2048,
8736 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07008737 /* OTP: 64B total; read 0x4B; write 0x42 */
8738 .feature_bits = FEATURE_UNBOUND_READ | FEATURE_OTP,
David Hendricks488cf072015-11-23 16:45:07 -08008739 .tested = TEST_OK_PREWU,
hailfinger38fd4992011-03-06 18:45:40 +00008740 .probe = probe_spi_rdid,
8741 .probe_timing = TIMING_ZERO,
8742 .block_erasers =
8743 {
8744 {
8745 .eraseblocks = { { 4 * 1024, 512 } },
8746 .block_erase = spi_block_erase_20,
8747 }, {
8748 .eraseblocks = { {64 * 1024, 32} },
8749 .block_erase = spi_block_erase_d8,
8750 }, {
8751 .eraseblocks = { {2 * 1024 * 1024, 1} },
8752 .block_erase = spi_block_erase_c7,
8753 }
8754 },
8755 .unlock = spi_disable_blockprotect,
8756 .write = spi_chip_write_256,
8757 .read = spi_chip_read,
8758 },
8759
8760 {
8761 .vendor = "ST",
uwe8b50b592010-09-14 13:16:01 +00008762 .name = "M25PX32",
hailfingere1e41ea2011-07-27 07:13:06 +00008763 .bustype = BUS_SPI,
uwe8b50b592010-09-14 13:16:01 +00008764 .manufacture_id = ST_ID,
8765 .model_id = ST_M25PX32,
8766 .total_size = 4096,
8767 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08008768 .feature_bits = FEATURE_UNBOUND_READ,
8769 .tested = TEST_OK_PREU,
uwe8b50b592010-09-14 13:16:01 +00008770 .probe = probe_spi_rdid,
8771 .probe_timing = TIMING_ZERO,
8772 .block_erasers =
8773 {
8774 {
8775 .eraseblocks = { { 4 * 1024, 1024 } },
8776 .block_erase = spi_block_erase_20,
8777 }, {
8778 .eraseblocks = { {64 * 1024, 64} },
8779 .block_erase = spi_block_erase_d8,
8780 }, {
8781 .eraseblocks = { {4 * 1024 * 1024, 1} },
8782 .block_erase = spi_block_erase_c7,
8783 }
8784 },
8785 .unlock = spi_disable_blockprotect,
8786 .write = spi_chip_write_256,
8787 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +00008788 .voltage = {2700, 3600},
uwe8b50b592010-09-14 13:16:01 +00008789 },
8790
8791 {
8792 .vendor = "ST",
8793 .name = "M25PX64",
hailfingere1e41ea2011-07-27 07:13:06 +00008794 .bustype = BUS_SPI,
uwe8b50b592010-09-14 13:16:01 +00008795 .manufacture_id = ST_ID,
8796 .model_id = ST_M25PX64,
8797 .total_size = 8192,
8798 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08008799 .feature_bits = FEATURE_UNBOUND_READ,
8800 .tested = TEST_OK_PREU,
uwe8b50b592010-09-14 13:16:01 +00008801 .probe = probe_spi_rdid,
8802 .probe_timing = TIMING_ZERO,
8803 .block_erasers =
8804 {
8805 {
8806 .eraseblocks = { { 4 * 1024, 2048 } },
8807 .block_erase = spi_block_erase_20,
8808 }, {
8809 .eraseblocks = { {64 * 1024, 128} },
8810 .block_erase = spi_block_erase_d8,
8811 }, {
8812 .eraseblocks = { {8 * 1024 * 1024, 1} },
8813 .block_erase = spi_block_erase_c7,
8814 }
8815 },
8816 .unlock = spi_disable_blockprotect,
8817 .write = spi_chip_write_256,
8818 .read = spi_chip_read,
8819 },
8820
8821 {
8822 .vendor = "ST",
David Hendricksc801adb2010-12-09 16:58:56 -08008823 .name = "M25PX32",
hailfingere1e41ea2011-07-27 07:13:06 +00008824 .bustype = BUS_SPI,
David Hendricksc801adb2010-12-09 16:58:56 -08008825 .manufacture_id = ST_ID,
8826 .model_id = ST_M25PX32,
8827 .total_size = 4096,
8828 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08008829 .feature_bits = FEATURE_UNBOUND_READ,
8830 .tested = TEST_OK_PREU,
David Hendricksc801adb2010-12-09 16:58:56 -08008831 .probe = probe_spi_rdid,
8832 .probe_timing = TIMING_ZERO,
8833 .block_erasers =
8834 {
8835 {
8836 .eraseblocks = { { 4 * 1024, 1024 } },
8837 .block_erase = spi_block_erase_20,
8838 }, {
8839 .eraseblocks = { {64 * 1024, 64} },
8840 .block_erase = spi_block_erase_d8,
8841 }, {
8842 .eraseblocks = { {4 * 1024 * 1024, 1} },
8843 .block_erase = spi_block_erase_c7,
8844 }
8845 },
8846 .unlock = spi_disable_blockprotect,
8847 .write = spi_chip_write_256,
8848 .read = spi_chip_read,
8849 },
8850
8851 {
8852 .vendor = "ST",
8853 .name = "M25PX64",
hailfingere1e41ea2011-07-27 07:13:06 +00008854 .bustype = BUS_SPI,
David Hendricksc801adb2010-12-09 16:58:56 -08008855 .manufacture_id = ST_ID,
8856 .model_id = ST_M25PX64,
8857 .total_size = 8192,
8858 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08008859 .feature_bits = FEATURE_UNBOUND_READ,
8860 .tested = TEST_OK_PREU,
David Hendricksc801adb2010-12-09 16:58:56 -08008861 .probe = probe_spi_rdid,
8862 .probe_timing = TIMING_ZERO,
8863 .block_erasers =
8864 {
8865 {
8866 .eraseblocks = { { 4 * 1024, 2048 } },
8867 .block_erase = spi_block_erase_20,
8868 }, {
8869 .eraseblocks = { {64 * 1024, 128} },
8870 .block_erase = spi_block_erase_d8,
8871 }, {
8872 .eraseblocks = { {8 * 1024 * 1024, 1} },
8873 .block_erase = spi_block_erase_c7,
8874 }
8875 },
8876 .unlock = spi_disable_blockprotect,
8877 .write = spi_chip_write_256,
8878 .read = spi_chip_read,
8879 },
8880
8881 {
8882 .vendor = "ST",
hailfinger286829b2009-01-08 03:40:17 +00008883 .name = "M29F002B",
hailfingere1e41ea2011-07-27 07:13:06 +00008884 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00008885 .manufacture_id = ST_ID,
8886 .model_id = ST_M29F002B,
8887 .total_size = 256,
8888 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00008889 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
hailfinger286829b2009-01-08 03:40:17 +00008890 .tested = TEST_UNTESTED,
8891 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00008892 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelsone0c56352010-01-19 16:08:51 +00008893 .block_erasers =
8894 {
8895 {
8896 .eraseblocks = {
8897 {16 * 1024, 1},
8898 {8 * 1024, 2},
8899 {32 * 1024, 1},
8900 {64 * 1024, 3},
8901 },
8902 .block_erase = erase_sector_jedec,
8903 }, {
8904 .eraseblocks = { {256 * 1024, 1} },
8905 .block_erase = erase_chip_block_jedec,
8906 }
8907 },
snelsonc6855342010-01-28 23:55:12 +00008908 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00008909 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +00008910 .voltage = {4750, 5250}, /* 4.75-5.25V for type -X, others 4.5-5.5V */
stepanaa1b6a22008-12-08 18:15:10 +00008911 },
8912
hailfinger286829b2009-01-08 03:40:17 +00008913 {
8914 .vendor = "ST",
8915 .name = "M29F002T/NT",
hailfingere1e41ea2011-07-27 07:13:06 +00008916 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00008917 .manufacture_id = ST_ID,
8918 .model_id = ST_M29F002T,
8919 .total_size = 256,
8920 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00008921 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
8922 .tested = TEST_UNTESTED,
hailfinger286829b2009-01-08 03:40:17 +00008923 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00008924 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelsone0c56352010-01-19 16:08:51 +00008925 .block_erasers =
8926 {
8927 {
8928 .eraseblocks = {
8929 {64 * 1024, 3},
8930 {32 * 1024, 1},
8931 {8 * 1024, 2},
8932 {16 * 1024, 1},
8933 },
8934 .block_erase = erase_sector_jedec,
8935 }, {
8936 .eraseblocks = { {256 * 1024, 1} },
8937 .block_erase = erase_chip_block_jedec,
8938 }
8939 },
snelsonc6855342010-01-28 23:55:12 +00008940 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00008941 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +00008942 .voltage = {4750, 5250}, /* 4.75-5.25V for type -X, others 4.5-5.5V */
stepanaa1b6a22008-12-08 18:15:10 +00008943 },
8944
hailfinger286829b2009-01-08 03:40:17 +00008945 {
8946 .vendor = "ST",
8947 .name = "M29F040B",
hailfingere1e41ea2011-07-27 07:13:06 +00008948 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00008949 .manufacture_id = ST_ID,
8950 .model_id = ST_M29F040B,
8951 .total_size = 512,
8952 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00008953 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
8954 .tested = TEST_UNTESTED,
8955 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +00008956 .probe_timing = TIMING_ZERO, /* datasheet specifies no timing */
snelsone0c56352010-01-19 16:08:51 +00008957 .block_erasers =
8958 {
8959 {
8960 .eraseblocks = { {64 * 1024, 8}, },
snelsonc6855342010-01-28 23:55:12 +00008961 .block_erase = erase_sector_jedec,
snelsone0c56352010-01-19 16:08:51 +00008962 }, {
8963 .eraseblocks = { {512 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +00008964 .block_erase = erase_chip_block_jedec,
snelsone0c56352010-01-19 16:08:51 +00008965 }
8966 },
snelsonc6855342010-01-28 23:55:12 +00008967 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00008968 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008969 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00008970 },
8971
hailfinger286829b2009-01-08 03:40:17 +00008972 {
snelsonc6855342010-01-28 23:55:12 +00008973 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
hailfinger286829b2009-01-08 03:40:17 +00008974 .vendor = "ST",
hailfingerfa513302010-07-16 22:07:20 +00008975 .name = "M29F400BB",
hailfingere1e41ea2011-07-27 07:13:06 +00008976 .bustype = BUS_PARALLEL,
hailfingerfa513302010-07-16 22:07:20 +00008977 .manufacture_id = ST_ID,
8978 .model_id = ST_M29F400BB,
8979 .total_size = 512,
8980 .page_size = 64 * 1024,
8981 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
hailfinger86bf3b52010-10-13 21:49:30 +00008982 .tested = TEST_UNTESTED,
hailfingerfa513302010-07-16 22:07:20 +00008983 .probe = probe_m29f400bt,
8984 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
8985 .block_erasers =
8986 {
8987 {
8988 .eraseblocks = {
8989 {16 * 1024, 1},
8990 {8 * 1024, 2},
8991 {32 * 1024, 1},
8992 {64 * 1024, 7},
8993 },
8994 .block_erase = block_erase_m29f400bt,
8995 }, {
8996 .eraseblocks = { {512 * 1024, 1} },
8997 .block_erase = block_erase_chip_m29f400bt,
8998 }
8999 },
hailfinger86bf3b52010-10-13 21:49:30 +00009000 .write = write_m29f400bt,
hailfingerfa513302010-07-16 22:07:20 +00009001 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009002 .voltage = {4500, 5500},
hailfingerfa513302010-07-16 22:07:20 +00009003 },
9004 {
9005 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
9006 .vendor = "ST",
hailfinger286829b2009-01-08 03:40:17 +00009007 .name = "M29F400BT",
hailfingere1e41ea2011-07-27 07:13:06 +00009008 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00009009 .manufacture_id = ST_ID,
9010 .model_id = ST_M29F400BT,
9011 .total_size = 512,
9012 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00009013 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
hailfinger286829b2009-01-08 03:40:17 +00009014 .tested = TEST_UNTESTED,
9015 .probe = probe_m29f400bt,
uwe37f43422011-06-19 17:23:55 +00009016 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
snelsone0c56352010-01-19 16:08:51 +00009017 .block_erasers =
9018 {
9019 {
9020 .eraseblocks = {
9021 {64 * 1024, 7},
9022 {32 * 1024, 1},
9023 {8 * 1024, 2},
9024 {16 * 1024, 1},
9025 },
9026 .block_erase = block_erase_m29f400bt,
9027 }, {
9028 .eraseblocks = { {512 * 1024, 1} },
9029 .block_erase = block_erase_chip_m29f400bt,
9030 }
9031 },
hailfingerfa513302010-07-16 22:07:20 +00009032 .write = write_m29f400bt,
hailfinger23060112009-05-08 12:49:03 +00009033 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009034 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00009035 },
9036
hailfinger286829b2009-01-08 03:40:17 +00009037 {
9038 .vendor = "ST",
9039 .name = "M29W010B",
hailfingere1e41ea2011-07-27 07:13:06 +00009040 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00009041 .manufacture_id = ST_ID,
9042 .model_id = ST_M29W010B,
9043 .total_size = 128,
9044 .page_size = 16 * 1024,
snelsonc6855342010-01-28 23:55:12 +00009045 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
hailfinger286829b2009-01-08 03:40:17 +00009046 .tested = TEST_UNTESTED,
9047 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00009048 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelsone0c56352010-01-19 16:08:51 +00009049 .block_erasers =
9050 {
9051 {
9052 .eraseblocks = { {16 * 1024, 8}, },
9053 .block_erase = erase_sector_jedec,
9054 }, {
9055 .eraseblocks = { {128 * 1024, 1} },
9056 .block_erase = erase_chip_block_jedec,
9057 }
9058 },
snelsonc6855342010-01-28 23:55:12 +00009059 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00009060 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009061 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00009062 },
9063
hailfinger286829b2009-01-08 03:40:17 +00009064 {
9065 .vendor = "ST",
9066 .name = "M29W040B",
hailfingere1e41ea2011-07-27 07:13:06 +00009067 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00009068 .manufacture_id = ST_ID,
9069 .model_id = ST_M29W040B,
9070 .total_size = 512,
9071 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00009072 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
hailfinger286829b2009-01-08 03:40:17 +00009073 .tested = TEST_UNTESTED,
9074 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00009075 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelsone0c56352010-01-19 16:08:51 +00009076 .block_erasers =
9077 {
9078 {
9079 .eraseblocks = { {64 * 1024, 8}, },
9080 .block_erase = erase_sector_jedec,
9081 }, {
9082 .eraseblocks = { {512 * 1024, 1} },
9083 .block_erase = erase_chip_block_jedec,
9084 }
9085 },
snelsonc6855342010-01-28 23:55:12 +00009086 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00009087 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009088 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00009089 },
9090
snelson91cd0662010-02-01 05:49:46 +00009091 {
9092 .vendor = "ST",
9093 .name = "M29W512B",
hailfingere1e41ea2011-07-27 07:13:06 +00009094 .bustype = BUS_PARALLEL,
snelson91cd0662010-02-01 05:49:46 +00009095 .manufacture_id = ST_ID,
9096 .model_id = ST_M29W512B,
9097 .total_size = 64,
9098 .page_size = 64 * 1024,
9099 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
hailfingerd217d122010-10-08 18:52:29 +00009100 .tested = TEST_OK_PRE,
snelson91cd0662010-02-01 05:49:46 +00009101 .probe = probe_jedec,
9102 .probe_timing = TIMING_ZERO,
snelson91cd0662010-02-01 05:49:46 +00009103 .block_erasers =
9104 {
9105 {
9106 .eraseblocks = { {64 * 1024, 1} },
9107 .block_erase = erase_chip_block_jedec,
9108 }
9109 },
9110 .write = write_jedec_1,
9111 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009112 .voltage = {2700, 3600},
snelson91cd0662010-02-01 05:49:46 +00009113 },
9114
hailfinger286829b2009-01-08 03:40:17 +00009115 {
9116 .vendor = "ST",
9117 .name = "M50FLW040A",
hailfingere1e41ea2011-07-27 07:13:06 +00009118 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00009119 .manufacture_id = ST_ID,
9120 .model_id = ST_M50FLW040A,
9121 .total_size = 512,
9122 .page_size = 64 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00009123 .feature_bits = FEATURE_REGISTERMAP,
hailfinger286829b2009-01-08 03:40:17 +00009124 .tested = TEST_UNTESTED,
snelsonc6855342010-01-28 23:55:12 +00009125 .probe = probe_82802ab,
hailfinger4d547032010-01-10 01:34:00 +00009126 .probe_timing = TIMING_FIXME,
snelsone0c56352010-01-19 16:08:51 +00009127 .block_erasers =
9128 {
9129 {
snelsonf88616b2010-01-19 16:39:19 +00009130 .eraseblocks = {
uwe81d75ab2010-09-05 12:41:25 +00009131 {4 * 1024, 16}, /* sector */
snelsonf88616b2010-01-19 16:39:19 +00009132 {64 * 1024, 5}, /* block */
9133 {4 * 1024, 16}, /* sector */
9134 {4 * 1024, 16}, /* sector */
9135 },
9136 .block_erase = NULL,
9137 }, {
snelsone0c56352010-01-19 16:08:51 +00009138 .eraseblocks = { {64 * 1024, 8}, },
snelsonc0acbeb2010-03-19 18:47:06 +00009139 .block_erase = erase_block_82802ab,
snelsone0c56352010-01-19 16:08:51 +00009140 }
9141 },
snelsonc0acbeb2010-03-19 18:47:06 +00009142 .unlock = unlock_stm50flw0x0x,
9143 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00009144 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009145 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
stepanaa1b6a22008-12-08 18:15:10 +00009146 },
9147
hailfinger286829b2009-01-08 03:40:17 +00009148 {
9149 .vendor = "ST",
9150 .name = "M50FLW040B",
hailfingere1e41ea2011-07-27 07:13:06 +00009151 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00009152 .manufacture_id = ST_ID,
9153 .model_id = ST_M50FLW040B,
9154 .total_size = 512,
9155 .page_size = 64 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00009156 .feature_bits = FEATURE_REGISTERMAP,
hailfinger286829b2009-01-08 03:40:17 +00009157 .tested = TEST_UNTESTED,
snelsonc6855342010-01-28 23:55:12 +00009158 .probe = probe_82802ab,
hailfinger4d547032010-01-10 01:34:00 +00009159 .probe_timing = TIMING_FIXME,
snelsone0c56352010-01-19 16:08:51 +00009160 .block_erasers =
9161 {
9162 {
snelsonf88616b2010-01-19 16:39:19 +00009163 .eraseblocks = {
uwe81d75ab2010-09-05 12:41:25 +00009164 {4 * 1024, 16}, /* sector */
snelsonf88616b2010-01-19 16:39:19 +00009165 {4 * 1024, 16}, /* sector */
9166 {64 * 1024, 5}, /* block */
9167 {4 * 1024, 16}, /* sector */
9168 },
9169 .block_erase = NULL,
9170 }, {
snelsone0c56352010-01-19 16:08:51 +00009171 .eraseblocks = { {64 * 1024, 8}, },
snelsonc0acbeb2010-03-19 18:47:06 +00009172 .block_erase = erase_block_82802ab,
snelsone0c56352010-01-19 16:08:51 +00009173 }
9174 },
snelsonc0acbeb2010-03-19 18:47:06 +00009175 .unlock = unlock_stm50flw0x0x,
9176 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00009177 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009178 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
stepanaa1b6a22008-12-08 18:15:10 +00009179 },
9180
hailfinger286829b2009-01-08 03:40:17 +00009181 {
9182 .vendor = "ST",
9183 .name = "M50FLW080A",
hailfingere1e41ea2011-07-27 07:13:06 +00009184 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00009185 .manufacture_id = ST_ID,
9186 .model_id = ST_M50FLW080A,
9187 .total_size = 1024,
9188 .page_size = 64 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00009189 .feature_bits = FEATURE_REGISTERMAP,
hailfingerd217d122010-10-08 18:52:29 +00009190 .tested = TEST_OK_PRE,
snelsonc6855342010-01-28 23:55:12 +00009191 .probe = probe_82802ab,
hailfinger4d547032010-01-10 01:34:00 +00009192 .probe_timing = TIMING_FIXME,
snelsone0c56352010-01-19 16:08:51 +00009193 .block_erasers =
9194 {
9195 {
snelsonf88616b2010-01-19 16:39:19 +00009196 .eraseblocks = {
uwe81d75ab2010-09-05 12:41:25 +00009197 {4 * 1024, 16}, /* sector */
snelsonf88616b2010-01-19 16:39:19 +00009198 {64 * 1024, 13}, /* block */
9199 {4 * 1024, 16}, /* sector */
9200 {4 * 1024, 16}, /* sector */
9201 },
9202 .block_erase = NULL,
9203 }, {
snelsone0c56352010-01-19 16:08:51 +00009204 .eraseblocks = { {64 * 1024, 16}, },
snelsonc0acbeb2010-03-19 18:47:06 +00009205 .block_erase = erase_block_82802ab,
snelsone0c56352010-01-19 16:08:51 +00009206 }
9207 },
snelsonc0acbeb2010-03-19 18:47:06 +00009208 .unlock = unlock_stm50flw0x0x,
9209 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00009210 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009211 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
stepanaa1b6a22008-12-08 18:15:10 +00009212 },
9213
hailfinger286829b2009-01-08 03:40:17 +00009214 {
9215 .vendor = "ST",
9216 .name = "M50FLW080B",
hailfingere1e41ea2011-07-27 07:13:06 +00009217 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00009218 .manufacture_id = ST_ID,
9219 .model_id = ST_M50FLW080B,
9220 .total_size = 1024,
9221 .page_size = 64 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00009222 .feature_bits = FEATURE_REGISTERMAP,
hailfinger286829b2009-01-08 03:40:17 +00009223 .tested = TEST_UNTESTED,
snelsonc6855342010-01-28 23:55:12 +00009224 .probe = probe_82802ab,
hailfinger4d547032010-01-10 01:34:00 +00009225 .probe_timing = TIMING_FIXME,
snelsone0c56352010-01-19 16:08:51 +00009226 .block_erasers =
9227 {
9228 {
snelsonf88616b2010-01-19 16:39:19 +00009229 .eraseblocks = {
uwe81d75ab2010-09-05 12:41:25 +00009230 {4 * 1024, 16}, /* sector */
snelsonf88616b2010-01-19 16:39:19 +00009231 {4 * 1024, 16}, /* sector */
9232 {64 * 1024, 13}, /* block */
9233 {4 * 1024, 16}, /* sector */
9234 },
9235 .block_erase = NULL,
9236 }, {
snelsone0c56352010-01-19 16:08:51 +00009237 .eraseblocks = { {64 * 1024, 16}, },
snelsonc0acbeb2010-03-19 18:47:06 +00009238 .block_erase = erase_block_82802ab,
snelsone0c56352010-01-19 16:08:51 +00009239 }
9240 },
snelsonc0acbeb2010-03-19 18:47:06 +00009241 .unlock = unlock_stm50flw0x0x,
9242 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00009243 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009244 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
stepanaa1b6a22008-12-08 18:15:10 +00009245 },
9246
hailfinger286829b2009-01-08 03:40:17 +00009247 {
9248 .vendor = "ST",
9249 .name = "M50FW002",
hailfingere1e41ea2011-07-27 07:13:06 +00009250 .bustype = BUS_FWH, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00009251 .manufacture_id = ST_ID,
9252 .model_id = ST_M50FW002,
9253 .total_size = 256,
9254 .page_size = 64 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00009255 .feature_bits = FEATURE_REGISTERMAP,
hailfinger286829b2009-01-08 03:40:17 +00009256 .tested = TEST_UNTESTED,
snelsonc6855342010-01-28 23:55:12 +00009257 .probe = probe_82802ab,
uwe37f43422011-06-19 17:23:55 +00009258 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
snelsone0c56352010-01-19 16:08:51 +00009259 .block_erasers =
9260 {
9261 {
9262 .eraseblocks = {
9263 {64 * 1024, 3},
9264 {32 * 1024, 1},
9265 {8 * 1024, 2},
9266 {16 * 1024, 1},
9267 },
snelsonc0acbeb2010-03-19 18:47:06 +00009268 .block_erase = erase_block_82802ab,
snelsone0c56352010-01-19 16:08:51 +00009269 }
9270 },
snelsonc0acbeb2010-03-19 18:47:06 +00009271 .unlock = unlock_stm50flw0x0x,
9272 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00009273 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009274 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
stepanaa1b6a22008-12-08 18:15:10 +00009275 },
9276
hailfinger286829b2009-01-08 03:40:17 +00009277 {
9278 .vendor = "ST",
9279 .name = "M50FW016",
hailfingere1e41ea2011-07-27 07:13:06 +00009280 .bustype = BUS_FWH, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00009281 .manufacture_id = ST_ID,
9282 .model_id = ST_M50FW016,
9283 .total_size = 2048,
9284 .page_size = 64 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00009285 .feature_bits = FEATURE_REGISTERMAP,
hailfinger286829b2009-01-08 03:40:17 +00009286 .tested = TEST_UNTESTED,
9287 .probe = probe_82802ab,
uwe37f43422011-06-19 17:23:55 +00009288 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
snelsone0c56352010-01-19 16:08:51 +00009289 .block_erasers =
9290 {
9291 {
9292 .eraseblocks = { {64 * 1024, 32}, },
snelsonc0acbeb2010-03-19 18:47:06 +00009293 .block_erase = erase_block_82802ab,
snelsone0c56352010-01-19 16:08:51 +00009294 }
9295 },
snelsonc0acbeb2010-03-19 18:47:06 +00009296 .unlock = unlock_stm50flw0x0x,
9297 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00009298 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009299 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
stepanaa1b6a22008-12-08 18:15:10 +00009300 },
9301
hailfinger286829b2009-01-08 03:40:17 +00009302 {
9303 .vendor = "ST",
9304 .name = "M50FW040",
hailfingere1e41ea2011-07-27 07:13:06 +00009305 .bustype = BUS_FWH, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00009306 .manufacture_id = ST_ID,
9307 .model_id = ST_M50FW040,
9308 .total_size = 512,
9309 .page_size = 64 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00009310 .feature_bits = FEATURE_REGISTERMAP,
snelsonc0acbeb2010-03-19 18:47:06 +00009311 .tested = TEST_OK_PR,
hailfinger286829b2009-01-08 03:40:17 +00009312 .probe = probe_82802ab,
uwe37f43422011-06-19 17:23:55 +00009313 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
snelsone0c56352010-01-19 16:08:51 +00009314 .block_erasers =
9315 {
9316 {
9317 .eraseblocks = { {64 * 1024, 8}, },
snelsonc0acbeb2010-03-19 18:47:06 +00009318 .block_erase = erase_block_82802ab,
snelsone0c56352010-01-19 16:08:51 +00009319 }
9320 },
snelsonc0acbeb2010-03-19 18:47:06 +00009321 .unlock = unlock_stm50flw0x0x,
9322 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00009323 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009324 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
stepanaa1b6a22008-12-08 18:15:10 +00009325 },
9326
hailfinger286829b2009-01-08 03:40:17 +00009327 {
9328 .vendor = "ST",
9329 .name = "M50FW080",
hailfingere1e41ea2011-07-27 07:13:06 +00009330 .bustype = BUS_FWH, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00009331 .manufacture_id = ST_ID,
9332 .model_id = ST_M50FW080,
9333 .total_size = 1024,
9334 .page_size = 64 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00009335 .feature_bits = FEATURE_REGISTERMAP,
stefancte0e52902011-05-26 14:28:51 +00009336 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00009337 .probe = probe_82802ab,
uwe37f43422011-06-19 17:23:55 +00009338 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
snelsone0c56352010-01-19 16:08:51 +00009339 .block_erasers =
9340 {
9341 {
9342 .eraseblocks = { {64 * 1024, 16}, },
snelsonc0acbeb2010-03-19 18:47:06 +00009343 .block_erase = erase_block_82802ab,
snelsone0c56352010-01-19 16:08:51 +00009344 }
9345 },
snelsonc0acbeb2010-03-19 18:47:06 +00009346 .unlock = unlock_stm50flw0x0x,
9347 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00009348 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009349 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
stepanaa1b6a22008-12-08 18:15:10 +00009350 },
9351
hailfinger286829b2009-01-08 03:40:17 +00009352 {
9353 .vendor = "ST",
9354 .name = "M50LPW116",
hailfingere1e41ea2011-07-27 07:13:06 +00009355 .bustype = BUS_LPC, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00009356 .manufacture_id = ST_ID,
9357 .model_id = ST_M50LPW116,
9358 .total_size = 2048,
9359 .page_size = 64 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00009360 .feature_bits = FEATURE_REGISTERMAP,
hailfinger286829b2009-01-08 03:40:17 +00009361 .tested = TEST_UNTESTED,
snelsonc6855342010-01-28 23:55:12 +00009362 .probe = probe_82802ab,
hailfinger94466802009-09-05 01:31:32 +00009363 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelsone0c56352010-01-19 16:08:51 +00009364 .block_erasers =
9365 {
9366 {
9367 .eraseblocks = {
9368 {4 * 1024, 16},
9369 {64 * 1024, 30},
9370 {32 * 1024, 1},
9371 {8 * 1024, 2},
9372 {16 * 1024, 1},
9373 },
snelsonc0acbeb2010-03-19 18:47:06 +00009374 .block_erase = erase_block_82802ab,
snelsone0c56352010-01-19 16:08:51 +00009375 }
9376 },
snelsonc0acbeb2010-03-19 18:47:06 +00009377 .unlock = unlock_stm50flw0x0x,
9378 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00009379 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009380 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
stepanaa1b6a22008-12-08 18:15:10 +00009381 },
9382
hailfinger286829b2009-01-08 03:40:17 +00009383 {
hailfinger0ae231d2010-07-29 20:01:13 +00009384 .vendor = "SyncMOS/MoselVitelic",
9385 .name = "{F,S,V}29C51001B",
hailfingere1e41ea2011-07-27 07:13:06 +00009386 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +00009387 .manufacture_id = SYNCMOS_MVC_ID,
9388 .model_id = SM_MVC_29C51001B,
hailfinger286829b2009-01-08 03:40:17 +00009389 .total_size = 128,
hailfinger0ae231d2010-07-29 20:01:13 +00009390 .page_size = 512,
snelsonc6855342010-01-28 23:55:12 +00009391 .feature_bits = FEATURE_EITHER_RESET,
hailfinger286829b2009-01-08 03:40:17 +00009392 .tested = TEST_UNTESTED,
9393 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00009394 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelsone0c56352010-01-19 16:08:51 +00009395 .block_erasers =
9396 {
9397 {
9398 .eraseblocks = { {512, 256} },
9399 .block_erase = erase_sector_jedec,
9400 }, {
9401 .eraseblocks = { {128 * 1024, 1} },
9402 .block_erase = erase_chip_block_jedec,
9403 },
9404 },
snelsonc6855342010-01-28 23:55:12 +00009405 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00009406 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009407 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00009408 },
9409
hailfinger286829b2009-01-08 03:40:17 +00009410 {
hailfinger0ae231d2010-07-29 20:01:13 +00009411 .vendor = "SyncMOS/MoselVitelic",
9412 .name = "{F,S,V}29C51001T",
hailfingere1e41ea2011-07-27 07:13:06 +00009413 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +00009414 .manufacture_id = SYNCMOS_MVC_ID,
9415 .model_id = SM_MVC_29C51001T,
9416 .total_size = 128,
9417 .page_size = 512,
snelsonc6855342010-01-28 23:55:12 +00009418 .feature_bits = FEATURE_EITHER_RESET,
hailfinger0ae231d2010-07-29 20:01:13 +00009419 .tested = TEST_UNTESTED,
9420 .probe = probe_jedec,
9421 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
9422 .block_erasers =
9423 {
9424 {
9425 .eraseblocks = { {512, 256} },
9426 .block_erase = erase_sector_jedec,
9427 }, {
9428 .eraseblocks = { {128 * 1024, 1} },
9429 .block_erase = erase_chip_block_jedec,
9430 },
9431 },
9432 .write = write_jedec_1,
9433 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009434 .voltage = {4500, 5500},
hailfinger0ae231d2010-07-29 20:01:13 +00009435 },
9436
9437 {
9438 .vendor = "SyncMOS/MoselVitelic",
9439 .name = "{F,S,V}29C51002B",
hailfingere1e41ea2011-07-27 07:13:06 +00009440 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +00009441 .manufacture_id = SYNCMOS_MVC_ID,
9442 .model_id = SM_MVC_29C51002B,
9443 .total_size = 256,
9444 .page_size = 512,
9445 .feature_bits = FEATURE_EITHER_RESET,
9446 .tested = TEST_UNTESTED,
hailfinger286829b2009-01-08 03:40:17 +00009447 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00009448 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelsone0c56352010-01-19 16:08:51 +00009449 .block_erasers =
9450 {
9451 {
9452 .eraseblocks = { {512, 512} },
9453 .block_erase = erase_sector_jedec,
9454 }, {
9455 .eraseblocks = { {256 * 1024, 1} },
9456 .block_erase = erase_chip_block_jedec,
9457 },
9458 },
snelsonc6855342010-01-28 23:55:12 +00009459 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00009460 .read = read_memmapped,
stepanaa1b6a22008-12-08 18:15:10 +00009461 },
9462
hailfinger286829b2009-01-08 03:40:17 +00009463 {
hailfinger0ae231d2010-07-29 20:01:13 +00009464 .vendor = "SyncMOS/MoselVitelic",
9465 .name = "{F,S,V}29C51002T",
hailfingere1e41ea2011-07-27 07:13:06 +00009466 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +00009467 .manufacture_id = SYNCMOS_MVC_ID,
9468 .model_id = SM_MVC_29C51002T,
9469 .total_size = 256,
9470 .page_size = 512,
9471 .feature_bits = FEATURE_EITHER_RESET,
stefanct98d917c2011-10-21 12:33:07 +00009472 .tested = TEST_OK_PREW,
hailfinger0ae231d2010-07-29 20:01:13 +00009473 .probe = probe_jedec,
9474 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
9475 .block_erasers =
9476 {
9477 {
9478 .eraseblocks = { {512, 512} },
9479 .block_erase = erase_sector_jedec,
9480 }, {
9481 .eraseblocks = { {256 * 1024, 1} },
9482 .block_erase = erase_chip_block_jedec,
9483 },
9484 },
9485 .write = write_jedec_1,
9486 .read = read_memmapped,
9487 },
9488
9489 {
9490 .vendor = "SyncMOS/MoselVitelic",
9491 .name = "{F,S,V}29C51004B",
hailfingere1e41ea2011-07-27 07:13:06 +00009492 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +00009493 .manufacture_id = SYNCMOS_MVC_ID,
9494 .model_id = SM_MVC_29C51004B,
hailfinger286829b2009-01-08 03:40:17 +00009495 .total_size = 512,
hailfinger0ae231d2010-07-29 20:01:13 +00009496 .page_size = 1024,
snelsonc6855342010-01-28 23:55:12 +00009497 .feature_bits = FEATURE_EITHER_RESET,
hailfinger286829b2009-01-08 03:40:17 +00009498 .tested = TEST_UNTESTED,
9499 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00009500 .probe_timing = TIMING_ZERO,
snelsone0c56352010-01-19 16:08:51 +00009501 .block_erasers =
9502 {
9503 {
hailfinger0ae231d2010-07-29 20:01:13 +00009504 .eraseblocks = { {1024, 512} },
9505 .block_erase = erase_sector_jedec,
9506 }, {
9507 .eraseblocks = { {512 * 1024, 1} },
9508 .block_erase = erase_chip_block_jedec,
9509 },
9510 },
9511 .write = write_jedec_1,
9512 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009513 .voltage = {4500, 5500},
hailfinger0ae231d2010-07-29 20:01:13 +00009514 },
9515
9516 {
9517 .vendor = "SyncMOS/MoselVitelic",
9518 .name = "{F,S,V}29C51004T",
hailfingere1e41ea2011-07-27 07:13:06 +00009519 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +00009520 .manufacture_id = SYNCMOS_MVC_ID,
9521 .model_id = SM_MVC_29C51004T,
9522 .total_size = 512,
9523 .page_size = 1024,
9524 .feature_bits = FEATURE_EITHER_RESET,
9525 .tested = TEST_UNTESTED,
9526 .probe = probe_jedec,
9527 .probe_timing = TIMING_ZERO,
9528 .block_erasers =
9529 {
9530 {
9531 .eraseblocks = { {1024, 512} },
9532 .block_erase = erase_sector_jedec,
9533 }, {
9534 .eraseblocks = { {512 * 1024, 1} },
9535 .block_erase = erase_chip_block_jedec,
9536 },
9537 },
9538 .write = write_jedec_1,
9539 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009540 .voltage = {4500, 5500},
hailfinger0ae231d2010-07-29 20:01:13 +00009541 },
9542
9543 {
9544 .vendor = "SyncMOS/MoselVitelic",
9545 .name = "{S,V}29C31004B",
hailfingere1e41ea2011-07-27 07:13:06 +00009546 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +00009547 .manufacture_id = SYNCMOS_MVC_ID,
9548 .model_id = SM_MVC_29C31004B,
9549 .total_size = 512,
9550 .page_size = 1024,
9551 .feature_bits = FEATURE_EITHER_RESET,
9552 .tested = TEST_UNTESTED,
9553 .probe = probe_jedec,
9554 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
9555 .block_erasers =
9556 {
9557 {
9558 .eraseblocks = { {1024, 512} },
9559 .block_erase = erase_sector_jedec,
9560 }, {
9561 .eraseblocks = { {512 * 1024, 1} },
9562 .block_erase = erase_chip_block_jedec,
9563 },
9564 },
9565 .write = write_jedec_1,
9566 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009567 .voltage = {3000, 3600},
hailfinger0ae231d2010-07-29 20:01:13 +00009568 },
9569
9570 {
9571 .vendor = "SyncMOS/MoselVitelic",
9572 .name = "{S,V}29C31004T",
hailfingere1e41ea2011-07-27 07:13:06 +00009573 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +00009574 .manufacture_id = SYNCMOS_MVC_ID,
9575 .model_id = SM_MVC_29C31004T,
9576 .total_size = 512,
9577 .page_size = 1024,
9578 .feature_bits = FEATURE_EITHER_RESET,
9579 .tested = TEST_UNTESTED,
9580 .probe = probe_jedec,
9581 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
9582 .block_erasers =
9583 {
9584 {
9585 .eraseblocks = { {1024, 512} },
snelsone0c56352010-01-19 16:08:51 +00009586 .block_erase = erase_sector_jedec,
9587 }, {
9588 .eraseblocks = { {512 * 1024, 1} },
9589 .block_erase = erase_chip_block_jedec,
9590 },
9591 },
snelsonc6855342010-01-28 23:55:12 +00009592 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00009593 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009594 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00009595 },
9596
hailfinger286829b2009-01-08 03:40:17 +00009597 {
uwe77048c72009-05-27 23:17:40 +00009598 .vendor = "TI",
hailfingerf66fa232009-05-26 21:26:23 +00009599 .name = "TMS29F002RB",
hailfingere1e41ea2011-07-27 07:13:06 +00009600 .bustype = BUS_PARALLEL,
hailfingerf66fa232009-05-26 21:26:23 +00009601 .manufacture_id = TI_OLD_ID,
9602 .model_id = TI_TMS29F002RB,
9603 .total_size = 256,
9604 .page_size = 16384, /* Non-uniform sectors */
snelsonc6855342010-01-28 23:55:12 +00009605 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
hailfingerf66fa232009-05-26 21:26:23 +00009606 .tested = TEST_UNTESTED,
9607 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00009608 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelsone0c56352010-01-19 16:08:51 +00009609 .block_erasers =
9610 {
9611 {
9612 .eraseblocks = {
9613 {16 * 1024, 1},
9614 {8 * 1024, 2},
9615 {32 * 1024, 1},
9616 {64 * 1024, 3},
9617 },
9618 .block_erase = erase_sector_jedec,
9619 }, {
9620 .eraseblocks = { {256 * 1024, 1} },
9621 .block_erase = erase_chip_block_jedec,
9622 },
9623 },
snelsonc6855342010-01-28 23:55:12 +00009624 .write = write_jedec_1,
hailfingerf66fa232009-05-26 21:26:23 +00009625 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009626 .voltage = {4500, 5500},
hailfingerf66fa232009-05-26 21:26:23 +00009627 },
9628
9629 {
uwe77048c72009-05-27 23:17:40 +00009630 .vendor = "TI",
hailfingerf66fa232009-05-26 21:26:23 +00009631 .name = "TMS29F002RT",
hailfingere1e41ea2011-07-27 07:13:06 +00009632 .bustype = BUS_PARALLEL,
hailfingerf66fa232009-05-26 21:26:23 +00009633 .manufacture_id = TI_OLD_ID,
9634 .model_id = TI_TMS29F002RT,
9635 .total_size = 256,
9636 .page_size = 16384, /* Non-uniform sectors */
snelsonc6855342010-01-28 23:55:12 +00009637 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
hailfingerf66fa232009-05-26 21:26:23 +00009638 .tested = TEST_UNTESTED,
9639 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00009640 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelsone0c56352010-01-19 16:08:51 +00009641 .block_erasers =
9642 {
9643 {
9644 .eraseblocks = {
9645 {64 * 1024, 3},
9646 {32 * 1024, 1},
9647 {8 * 1024, 2},
9648 {16 * 1024, 1},
9649 },
9650 .block_erase = erase_sector_jedec,
9651 }, {
9652 .eraseblocks = { {256 * 1024, 1} },
9653 .block_erase = erase_chip_block_jedec,
9654 },
9655 },
snelsonc6855342010-01-28 23:55:12 +00009656 .write = write_jedec_1,
hailfingerf66fa232009-05-26 21:26:23 +00009657 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009658 .voltage = {4500, 5500},
hailfingerf66fa232009-05-26 21:26:23 +00009659 },
9660
9661 {
hailfinger286829b2009-01-08 03:40:17 +00009662 .vendor = "Winbond",
Boris Baykov5edaccd2016-06-11 18:29:01 +02009663 .name = "W25Q256.V",
9664 .bustype = BUS_SPI,
9665 .manufacture_id = WINBOND_NEX_ID,
9666 .model_id = WINBOND_NEX_W25Q256_V,
9667 .total_size = 32768,
9668 .page_size = 256,
9669 /* supports SFDP */
9670 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
9671 /* FOUR_BYTE_ADDR: supports 4-bytes addressing mode */
Duncan Laurie118ff9f2018-10-05 10:53:59 -07009672 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP | FEATURE_4BA_SUPPORT,
Boris Baykov5edaccd2016-06-11 18:29:01 +02009673 .four_bytes_addr_funcs =
9674 {
Ed Swierk28cf7992017-07-03 13:17:18 -07009675 .set_4ba = spi_enter_4ba_b7_we, /* enter 4-bytes addressing mode by CMD B7 + WREN */
Boris Baykov6323c242016-06-11 18:29:03 +02009676 .read_nbyte = spi_nbyte_read_4ba_direct, /* read directly from any mode, no need to enter 4ba */
Boris Baykov5edaccd2016-06-11 18:29:01 +02009677 .program_byte = spi_byte_program_4ba, /* write from 4-bytes addressing mode */
9678 .program_nbyte = spi_nbyte_program_4ba /* write from 4-bytes addressing mode */
9679 },
Duncan Laurie118ff9f2018-10-05 10:53:59 -07009680 .tested = TEST_OK_PREWU,
Boris Baykov5edaccd2016-06-11 18:29:01 +02009681 .probe = probe_spi_rdid,
9682 .probe_timing = TIMING_ZERO,
9683 .block_erasers =
9684 {
9685 {
9686 .eraseblocks = { {4 * 1024, 8192} },
9687 .block_erase = spi_block_erase_20_4ba, /* erases 4k from 4-bytes addressing mode */
9688 }, {
9689 .eraseblocks = { {32 * 1024, 1024} },
9690 .block_erase = spi_block_erase_52_4ba, /* erases 32k from 4-bytes addressing mode */
9691 }, {
9692 .eraseblocks = { {64 * 1024, 512} },
9693 .block_erase = spi_block_erase_d8_4ba, /* erases 64k from 4-bytes addressing mode */
9694 }, {
9695 .eraseblocks = { {32 * 1024 * 1024, 1} },
9696 .block_erase = spi_block_erase_60,
9697 }, {
9698 .eraseblocks = { {32 * 1024 * 1024, 1} },
9699 .block_erase = spi_block_erase_c7,
9700 }
9701 },
9702 .unlock = spi_disable_blockprotect,
9703 .write = spi_chip_write_256,
9704 .read = spi_chip_read,
9705 .voltage = {2700, 3600},
9706 },
9707
9708 {
9709 .vendor = "Winbond",
David Hendricks3c06e312016-05-05 20:27:18 -07009710 .name = "W25Q40EW",
9711 .bustype = BUS_SPI,
9712 .manufacture_id = WINBOND_NEX_ID,
9713 .model_id = WINBOND_NEX_W25Q40EW,
9714 .total_size = 512,
9715 .page_size = 256,
9716 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
9717 .tested = TEST_OK_PREWU,
9718 .probe = probe_spi_rdid,
9719 .probe_timing = TIMING_ZERO,
9720 .block_erasers =
9721 {
9722 {
9723 .eraseblocks = { {4 * 1024, 128} },
9724 .block_erase = spi_block_erase_20,
9725 }, {
9726 .eraseblocks = { {32 * 1024, 16} },
9727 .block_erase = spi_block_erase_52,
9728 }, {
9729 .eraseblocks = { {64 * 1024, 8} },
9730 .block_erase = spi_block_erase_d8,
9731 }, {
9732 .eraseblocks = { {1024 * 512, 1} },
9733 .block_erase = spi_block_erase_60,
9734 }, {
9735 .eraseblocks = { {1024 * 512, 1} },
9736 .block_erase = spi_block_erase_c7,
9737 }
9738 },
9739 .unlock = spi_disable_blockprotect,
9740 .write = spi_chip_write_256,
9741 .read = spi_chip_read,
9742 .voltage = {1650, 1950},
9743 /* FIXME(dhendrix): Add write-protection support */
9744 },
9745
9746 {
9747 .vendor = "Winbond",
ruikfbf40532010-04-20 19:34:31 +00009748 .name = "W25Q80",
hailfingere1e41ea2011-07-27 07:13:06 +00009749 .bustype = BUS_SPI,
ruikfbf40532010-04-20 19:34:31 +00009750 .manufacture_id = WINBOND_NEX_ID,
Patrick Georgicc04a452017-02-06 12:14:43 +01009751 .model_id = WINBOND_NEX_W25Q80_V,
ruikfbf40532010-04-20 19:34:31 +00009752 .total_size = 1024,
9753 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07009754 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
9755 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
David Hendricks488cf072015-11-23 16:45:07 -08009756 .tested = TEST_OK_PREWU,
ruikfbf40532010-04-20 19:34:31 +00009757 .probe = probe_spi_rdid,
9758 .probe_timing = TIMING_ZERO,
9759 .block_erasers =
9760 {
9761 {
9762 .eraseblocks = { {4 * 1024, 256} },
9763 .block_erase = spi_block_erase_20,
9764 }, {
9765 .eraseblocks = { {32 * 1024, 32} },
9766 .block_erase = spi_block_erase_52,
9767 }, {
9768 .eraseblocks = { {64 * 1024, 16} },
9769 .block_erase = spi_block_erase_d8,
9770 }, {
9771 .eraseblocks = { {1024 * 1024, 1} },
9772 .block_erase = spi_block_erase_60,
9773 }, {
9774 .eraseblocks = { {1024 * 1024, 1} },
9775 .block_erase = spi_block_erase_c7,
9776 }
9777 },
hailfingerb9560ee2010-07-14 20:21:22 +00009778 .unlock = spi_disable_blockprotect,
ruikfbf40532010-04-20 19:34:31 +00009779 .write = spi_chip_write_256,
9780 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00009781 .voltage = {2700, 3600},
David Hendricks1c09f802012-10-03 11:03:48 -07009782 .wp = &wp_w25q,
ruikfbf40532010-04-20 19:34:31 +00009783 },
9784
9785 {
9786 .vendor = "Winbond",
9787 .name = "W25Q16",
hailfingere1e41ea2011-07-27 07:13:06 +00009788 .bustype = BUS_SPI,
ruikfbf40532010-04-20 19:34:31 +00009789 .manufacture_id = WINBOND_NEX_ID,
Patrick Georgicc04a452017-02-06 12:14:43 +01009790 .model_id = WINBOND_NEX_W25Q16_V,
ruikfbf40532010-04-20 19:34:31 +00009791 .total_size = 2048,
9792 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07009793 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
9794 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
David Hendricks488cf072015-11-23 16:45:07 -08009795 .tested = TEST_OK_PREWU,
ruikfbf40532010-04-20 19:34:31 +00009796 .probe = probe_spi_rdid,
9797 .probe_timing = TIMING_ZERO,
9798 .block_erasers =
9799 {
9800 {
9801 .eraseblocks = { {4 * 1024, 512} },
9802 .block_erase = spi_block_erase_20,
9803 }, {
9804 .eraseblocks = { {32 * 1024, 64} },
9805 .block_erase = spi_block_erase_52,
9806 }, {
9807 .eraseblocks = { {64 * 1024, 32} },
9808 .block_erase = spi_block_erase_d8,
9809 }, {
9810 .eraseblocks = { {2 * 1024 * 1024, 1} },
9811 .block_erase = spi_block_erase_60,
9812 }, {
9813 .eraseblocks = { {2 * 1024 * 1024, 1} },
9814 .block_erase = spi_block_erase_c7,
9815 }
9816 },
hailfingerb9560ee2010-07-14 20:21:22 +00009817 .unlock = spi_disable_blockprotect,
ruikfbf40532010-04-20 19:34:31 +00009818 .write = spi_chip_write_256,
9819 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00009820 .voltage = {2700, 3600},
David Hendricks1c09f802012-10-03 11:03:48 -07009821 .wp = &wp_w25q,
ruikfbf40532010-04-20 19:34:31 +00009822 },
9823
9824 {
9825 .vendor = "Winbond",
9826 .name = "W25Q32",
hailfingere1e41ea2011-07-27 07:13:06 +00009827 .bustype = BUS_SPI,
ruikfbf40532010-04-20 19:34:31 +00009828 .manufacture_id = WINBOND_NEX_ID,
Patrick Georgicc04a452017-02-06 12:14:43 +01009829 .model_id = WINBOND_NEX_W25Q32_V,
ruikfbf40532010-04-20 19:34:31 +00009830 .total_size = 4096,
9831 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07009832 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
9833 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
David Hendricks488cf072015-11-23 16:45:07 -08009834 .tested = TEST_OK_PREWU,
ruikfbf40532010-04-20 19:34:31 +00009835 .probe = probe_spi_rdid,
9836 .probe_timing = TIMING_ZERO,
9837 .block_erasers =
9838 {
9839 {
9840 .eraseblocks = { {4 * 1024, 1024} },
9841 .block_erase = spi_block_erase_20,
9842 }, {
9843 .eraseblocks = { {32 * 1024, 128} },
9844 .block_erase = spi_block_erase_52,
9845 }, {
9846 .eraseblocks = { {64 * 1024, 64} },
9847 .block_erase = spi_block_erase_d8,
9848 }, {
9849 .eraseblocks = { {4 * 1024 * 1024, 1} },
9850 .block_erase = spi_block_erase_60,
9851 }, {
9852 .eraseblocks = { {4 * 1024 * 1024, 1} },
9853 .block_erase = spi_block_erase_c7,
9854 }
9855 },
hailfingerb9560ee2010-07-14 20:21:22 +00009856 .unlock = spi_disable_blockprotect,
ruikfbf40532010-04-20 19:34:31 +00009857 .write = spi_chip_write_256,
9858 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00009859 .voltage = {2700, 3600},
David Hendricks1c09f802012-10-03 11:03:48 -07009860 .wp = &wp_w25q,
ruikfbf40532010-04-20 19:34:31 +00009861 },
9862
9863 {
9864 .vendor = "Winbond",
Louis Yung-Chieh Lo469707f2012-05-18 16:38:37 +08009865 .name = "W25Q32DW",
9866 .bustype = BUS_SPI,
9867 .manufacture_id = WINBOND_NEX_ID,
Patrick Georgicc04a452017-02-06 12:14:43 +01009868 .model_id = WINBOND_NEX_W25Q32_W,
Louis Yung-Chieh Lo469707f2012-05-18 16:38:37 +08009869 .total_size = 4096,
9870 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08009871 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
9872 .tested = TEST_OK_PREWU,
Louis Yung-Chieh Lo469707f2012-05-18 16:38:37 +08009873 .probe = probe_spi_rdid,
9874 .probe_timing = TIMING_ZERO,
9875 .block_erasers =
9876 {
9877 {
9878 .eraseblocks = { {4 * 1024, 1024} },
9879 .block_erase = spi_block_erase_20,
9880 }, {
9881 .eraseblocks = { {32 * 1024, 128} },
9882 .block_erase = spi_block_erase_52,
9883 }, {
9884 .eraseblocks = { {64 * 1024, 64} },
9885 .block_erase = spi_block_erase_d8,
9886 }, {
9887 .eraseblocks = { {4 * 1024 * 1024, 1} },
9888 .block_erase = spi_block_erase_60,
9889 }, {
9890 .eraseblocks = { {4 * 1024 * 1024, 1} },
9891 .block_erase = spi_block_erase_c7,
9892 }
9893 },
9894 .unlock = spi_disable_blockprotect,
9895 .write = spi_chip_write_256,
9896 .read = spi_chip_read,
9897 .voltage = {1700, 1950},
David Hendricks1c09f802012-10-03 11:03:48 -07009898 .wp = &wp_w25q,
Louis Yung-Chieh Lo469707f2012-05-18 16:38:37 +08009899 },
9900
9901 {
9902 .vendor = "Winbond",
hailfingerceb59bb2010-06-24 11:39:57 +00009903 .name = "W25Q64",
hailfingere1e41ea2011-07-27 07:13:06 +00009904 .bustype = BUS_SPI,
hailfingerceb59bb2010-06-24 11:39:57 +00009905 .manufacture_id = WINBOND_NEX_ID,
Patrick Georgicc04a452017-02-06 12:14:43 +01009906 .model_id = WINBOND_NEX_W25Q64_V,
hailfingerceb59bb2010-06-24 11:39:57 +00009907 .total_size = 8192,
9908 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07009909 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
9910 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
David Hendricks488cf072015-11-23 16:45:07 -08009911 .tested = TEST_OK_PREWU,
hailfingerceb59bb2010-06-24 11:39:57 +00009912 .probe = probe_spi_rdid,
9913 .probe_timing = TIMING_ZERO,
9914 .block_erasers =
9915 {
9916 {
9917 .eraseblocks = { {4 * 1024, 2048} },
9918 .block_erase = spi_block_erase_20,
9919 }, {
9920 .eraseblocks = { {32 * 1024, 256} },
9921 .block_erase = spi_block_erase_52,
9922 }, {
9923 .eraseblocks = { {64 * 1024, 128} },
9924 .block_erase = spi_block_erase_d8,
9925 }, {
9926 .eraseblocks = { {8 * 1024 * 1024, 1} },
9927 .block_erase = spi_block_erase_60,
9928 }, {
9929 .eraseblocks = { {8 * 1024 * 1024, 1} },
9930 .block_erase = spi_block_erase_c7,
9931 }
9932 },
hailfingerb9560ee2010-07-14 20:21:22 +00009933 .unlock = spi_disable_blockprotect,
hailfingerceb59bb2010-06-24 11:39:57 +00009934 .write = spi_chip_write_256,
9935 .read = spi_chip_read,
David Hendricks8322c982015-11-20 13:42:53 -08009936 .voltage = {2700, 3600},
David Hendricks1c09f802012-10-03 11:03:48 -07009937 .wp = &wp_w25q,
hailfingerceb59bb2010-06-24 11:39:57 +00009938 },
9939
9940 {
9941 .vendor = "Winbond",
Nick Sanders08d08222013-06-10 22:15:30 -07009942 .name = "W25Q64DW",
9943 .bustype = BUS_SPI,
9944 .manufacture_id = WINBOND_NEX_ID,
Patrick Georgicc04a452017-02-06 12:14:43 +01009945 .model_id = WINBOND_NEX_W25Q64_W,
Nick Sanders08d08222013-06-10 22:15:30 -07009946 .total_size = 8192,
9947 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08009948 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
9949 .tested = TEST_OK_PREWU,
Nick Sanders08d08222013-06-10 22:15:30 -07009950 .probe = probe_spi_rdid,
9951 .probe_timing = TIMING_ZERO,
9952 .block_erasers =
9953 {
9954 {
9955 .eraseblocks = { {4 * 1024, 2048} },
9956 .block_erase = spi_block_erase_20,
9957 }, {
9958 .eraseblocks = { {32 * 1024, 256} },
9959 .block_erase = spi_block_erase_52,
9960 }, {
9961 .eraseblocks = { {64 * 1024, 128} },
9962 .block_erase = spi_block_erase_d8,
9963 }, {
9964 .eraseblocks = { {8 * 1024 * 1024, 1} },
9965 .block_erase = spi_block_erase_60,
9966 }, {
9967 .eraseblocks = { {8 * 1024 * 1024, 1} },
9968 .block_erase = spi_block_erase_c7,
9969 }
9970 },
9971 .unlock = spi_disable_blockprotect,
9972 .write = spi_chip_write_256,
9973 .read = spi_chip_read,
David Hendricks8322c982015-11-20 13:42:53 -08009974 .voltage = {1700, 1950},
Nick Sanders08d08222013-06-10 22:15:30 -07009975 .wp = &wp_w25q,
9976 },
9977
9978 {
9979 .vendor = "Winbond",
David Hendricks07153282016-12-22 16:07:00 -08009980 .name = "W25Q128.V",
hailfingere1e41ea2011-07-27 07:13:06 +00009981 .bustype = BUS_SPI,
stefancte0e52902011-05-26 14:28:51 +00009982 .manufacture_id = WINBOND_NEX_ID,
Patrick Georgicc04a452017-02-06 12:14:43 +01009983 .model_id = WINBOND_NEX_W25Q128_V,
David Hendricks9356d162015-03-06 14:07:25 -08009984 .total_size = 16384,
stefancte0e52902011-05-26 14:28:51 +00009985 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07009986 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
9987 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
Duncan Laurie96c67aa2015-10-26 13:21:46 -07009988 .tested = TEST_OK_PREWU,
stefancte0e52902011-05-26 14:28:51 +00009989 .probe = probe_spi_rdid,
9990 .probe_timing = TIMING_ZERO,
9991 .block_erasers =
9992 {
9993 {
David Hendricks9356d162015-03-06 14:07:25 -08009994 .eraseblocks = { {4 * 1024, 4096} },
stefancte0e52902011-05-26 14:28:51 +00009995 .block_erase = spi_block_erase_20,
9996 }, {
David Hendricks9356d162015-03-06 14:07:25 -08009997 .eraseblocks = { {32 * 1024, 512} },
stefancte0e52902011-05-26 14:28:51 +00009998 .block_erase = spi_block_erase_52,
9999 }, {
David Hendricks9356d162015-03-06 14:07:25 -080010000 .eraseblocks = { {64 * 1024, 256} },
stefancte0e52902011-05-26 14:28:51 +000010001 .block_erase = spi_block_erase_d8,
10002 }, {
David Hendricks9356d162015-03-06 14:07:25 -080010003 .eraseblocks = { {16 * 1024 * 1024, 1} },
stefancte0e52902011-05-26 14:28:51 +000010004 .block_erase = spi_block_erase_60,
10005 }, {
David Hendricks9356d162015-03-06 14:07:25 -080010006 .eraseblocks = { {16 * 1024 * 1024, 1} },
stefancte0e52902011-05-26 14:28:51 +000010007 .block_erase = spi_block_erase_c7,
10008 }
10009 },
10010 .unlock = spi_disable_blockprotect,
10011 .write = spi_chip_write_256,
10012 .read = spi_chip_read,
Duncan Laurieed32d7b2015-05-27 11:28:18 -070010013 .wp = &wp_w25q,
stefancte0e52902011-05-26 14:28:51 +000010014 },
10015
10016 {
10017 .vendor = "Winbond",
Stephen Barber6e15a532015-05-22 16:23:39 -070010018 .name = "W25Q128FW",
10019 .bustype = BUS_SPI,
10020 .manufacture_id = WINBOND_NEX_ID,
Patrick Georgicc04a452017-02-06 12:14:43 +010010021 .model_id = WINBOND_NEX_W25Q128_W,
Stephen Barber6e15a532015-05-22 16:23:39 -070010022 .total_size = 16384,
10023 .page_size = 256,
David Hendricks07153282016-12-22 16:07:00 -080010024 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
David Hendricksb8696182016-05-20 16:38:35 -070010025 .tested = TEST_OK_PREWU,
Stephen Barber6e15a532015-05-22 16:23:39 -070010026 .probe = probe_spi_rdid,
10027 .probe_timing = TIMING_ZERO,
10028 .block_erasers =
10029 {
10030 {
10031 .eraseblocks = { {4 * 1024, 4096} },
10032 .block_erase = spi_block_erase_20,
10033 }, {
10034 .eraseblocks = { {32 * 1024, 512} },
10035 .block_erase = spi_block_erase_52,
10036 }, {
10037 .eraseblocks = { {64 * 1024, 256} },
10038 .block_erase = spi_block_erase_d8,
10039 }, {
10040 .eraseblocks = { {16 * 1024 * 1024, 1} },
10041 .block_erase = spi_block_erase_60,
10042 }, {
10043 .eraseblocks = { {16 * 1024 * 1024, 1} },
10044 .block_erase = spi_block_erase_c7,
10045 }
10046 },
10047 .unlock = spi_disable_blockprotect,
10048 .write = spi_chip_write_256,
10049 .read = spi_chip_read,
David Hendricks07153282016-12-22 16:07:00 -080010050 /*
10051 * W25Q128FW is a 1.8V chip, however 3.3V variants with the same
10052 * model ID exist. We'll err on the side of caution here. A user
10053 * with a 3.3V chip sharing the model ID will need to either
10054 * specify voltage on the command line or duplicate this struct
10055 * with a different name/voltage and specify it with "-c".
10056 */
10057 .voltage = {1650, 1950},
Duncan Laurieed32d7b2015-05-27 11:28:18 -070010058 .wp = &wp_w25q,
Stephen Barber6e15a532015-05-22 16:23:39 -070010059 },
10060
10061 {
10062 .vendor = "Winbond",
Martin Rothee8dcf92017-05-10 19:16:19 -060010063 .name = "W25Q128J",
10064 .bustype = BUS_SPI,
10065 .manufacture_id = WINBOND_NEX_ID,
10066 .model_id = WINBOND_NEX_W25Q128J,
10067 .total_size = 16384,
10068 .page_size = 256,
10069 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
10070 .tested = TEST_OK_PREWU,
10071 .probe = probe_spi_rdid,
10072 .probe_timing = TIMING_ZERO,
10073 .block_erasers =
10074 {
10075 {
10076 .eraseblocks = { {4 * 1024, 4096} },
10077 .block_erase = spi_block_erase_20,
10078 }, {
10079 .eraseblocks = { {32 * 1024, 512} },
10080 .block_erase = spi_block_erase_52,
10081 }, {
10082 .eraseblocks = { {64 * 1024, 256} },
10083 .block_erase = spi_block_erase_d8,
10084 }, {
10085 .eraseblocks = { {16 * 1024 * 1024, 1} },
10086 .block_erase = spi_block_erase_60,
10087 }, {
10088 .eraseblocks = { {16 * 1024 * 1024, 1} },
10089 .block_erase = spi_block_erase_c7,
10090 }
10091 },
10092 .unlock = spi_disable_blockprotect,
10093 .write = spi_chip_write_256,
10094 .read = spi_chip_read,
10095 .voltage = {2700, 3600},
10096 .wp = &wp_w25,
10097 },
10098 {
10099 .vendor = "Winbond",
Shelley Chenfc338ee2018-07-20 16:27:15 -070010100 .name = "W25Q256JV",
10101 .bustype = BUS_SPI,
10102 .manufacture_id = WINBOND_NEX_ID,
10103 .model_id = WINBOND_NEX_W25Q256JV,
10104 .total_size = 32768,
10105 .page_size = 256,
Duncan Laurie118ff9f2018-10-05 10:53:59 -070010106 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP | FEATURE_4BA_SUPPORT,
Shelley Chen91f320e2018-07-24 16:47:06 -070010107 .four_bytes_addr_funcs =
10108 {
10109 .set_4ba = spi_enter_4ba_b7_we, /* enter 4-bytes addressing mode by CMD B7 + WREN */
10110 .read_nbyte = spi_nbyte_read_4ba_direct, /* read directly from any mode, no need to enter 4ba */
10111 .program_byte = spi_byte_program_4ba, /* write from 4-bytes addressing mode */
10112 .program_nbyte = spi_nbyte_program_4ba /* write from 4-bytes addressing mode */
10113 },
Shelley Chenfc338ee2018-07-20 16:27:15 -070010114 .tested = TEST_OK_PREWU,
10115 .probe = probe_spi_rdid,
10116 .probe_timing = TIMING_ZERO,
10117 .block_erasers =
10118 {
10119 {
10120 .eraseblocks = { {4 * 1024, 8192} },
Shelley Chen91f320e2018-07-24 16:47:06 -070010121 .block_erase = spi_block_erase_20_4ba, /* erases 4k from 4-bytes addressing mode */
Shelley Chenfc338ee2018-07-20 16:27:15 -070010122 }, {
10123 .eraseblocks = { {32 * 1024, 1024} },
Shelley Chen91f320e2018-07-24 16:47:06 -070010124 .block_erase = spi_block_erase_52_4ba, /* erases 32k from 4-bytes addressing mode */
Shelley Chenfc338ee2018-07-20 16:27:15 -070010125 }, {
10126 .eraseblocks = { {64 * 1024, 512} },
Shelley Chen91f320e2018-07-24 16:47:06 -070010127 .block_erase = spi_block_erase_d8_4ba, /* erases 64k from 4-bytes addressing mode */
Shelley Chenfc338ee2018-07-20 16:27:15 -070010128 }, {
10129 .eraseblocks = { {32 * 1024 * 1024, 1} },
10130 .block_erase = spi_block_erase_60,
10131 }, {
10132 .eraseblocks = { {32 * 1024 * 1024, 1} },
10133 .block_erase = spi_block_erase_c7,
10134 }
10135 },
10136 .unlock = spi_disable_blockprotect,
10137 .write = spi_chip_write_256,
10138 .read = spi_chip_read,
10139 .voltage = {2700, 3600},
Duncan Laurie1801f7c2019-01-09 18:02:51 -080010140 .wp = &wp_w25q_large,
Shelley Chenfc338ee2018-07-20 16:27:15 -070010141 },
10142 {
10143 .vendor = "Winbond",
Edward O'Callaghand80cf712019-05-24 22:06:36 +100010144 .name = "W25Q32JW",
10145 .bustype = BUS_SPI,
10146 .manufacture_id = WINBOND_NEX_ID,
10147 .model_id = WINBOND_NEX_W25Q32JW,
10148 .total_size = 4096,
10149 .page_size = 256,
10150 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
10151 .tested = TEST_OK_PREWU,
10152 .probe = probe_spi_rdid,
10153 .probe_timing = TIMING_ZERO,
10154 .block_erasers =
10155 {
10156 {
10157 .eraseblocks = { {4 * 1024, 1024} },
10158 .block_erase = spi_block_erase_20,
10159 }, {
10160 .eraseblocks = { {32 * 1024, 128} },
10161 .block_erase = spi_block_erase_52,
10162 }, {
10163 .eraseblocks = { {64 * 1024, 64} },
10164 .block_erase = spi_block_erase_d8,
10165 }, {
10166 .eraseblocks = { {4 * 1024 * 1024, 1} },
10167 .block_erase = spi_block_erase_60,
10168 }, {
10169 .eraseblocks = { {4 * 1024 * 1024, 1} },
10170 .block_erase = spi_block_erase_c7,
10171 }
10172 },
10173 .unlock = spi_disable_blockprotect,
10174 .write = spi_chip_write_256,
10175 .read = spi_chip_read,
10176 .voltage = {1700, 1950},
10177 .wp = &wp_w25q,
10178 },
10179 {
10180 .vendor = "Winbond",
stefanct371e7e82011-07-07 19:56:58 +000010181 .name = "W25X10",
hailfingere1e41ea2011-07-27 07:13:06 +000010182 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +000010183 .manufacture_id = WINBOND_NEX_ID,
mhm38e577e2010-09-14 23:56:56 +000010184 .model_id = WINBOND_NEX_W25X10,
hailfinger286829b2009-01-08 03:40:17 +000010185 .total_size = 128,
10186 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -080010187 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
10188 .tested = TEST_OK_PREWU,
hailfinger286829b2009-01-08 03:40:17 +000010189 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000010190 .probe_timing = TIMING_ZERO,
snelson376060c2010-01-19 03:24:55 +000010191 .block_erasers =
10192 {
10193 {
10194 .eraseblocks = { {4 * 1024, 32} },
10195 .block_erase = spi_block_erase_20,
10196 }, {
snelson376060c2010-01-19 03:24:55 +000010197 .eraseblocks = { {64 * 1024, 2} },
10198 .block_erase = spi_block_erase_d8,
10199 }, {
10200 .eraseblocks = { {128 * 1024, 1} },
snelson376060c2010-01-19 03:24:55 +000010201 .block_erase = spi_block_erase_c7,
10202 }
10203 },
hailfingerb9560ee2010-07-14 20:21:22 +000010204 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +000010205 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +000010206 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +000010207 .voltage = {2700, 3600},
Louis Yung-Chieh Lo232951f2010-09-16 11:30:00 +080010208 .wp = &wp_w25,
stepanaa1b6a22008-12-08 18:15:10 +000010209 },
10210
hailfinger286829b2009-01-08 03:40:17 +000010211 {
10212 .vendor = "Winbond",
stefanct371e7e82011-07-07 19:56:58 +000010213 .name = "W25X20",
hailfingere1e41ea2011-07-27 07:13:06 +000010214 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +000010215 .manufacture_id = WINBOND_NEX_ID,
mhm38e577e2010-09-14 23:56:56 +000010216 .model_id = WINBOND_NEX_W25X20,
hailfinger286829b2009-01-08 03:40:17 +000010217 .total_size = 256,
10218 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -080010219 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +000010220 .tested = TEST_UNTESTED,
10221 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000010222 .probe_timing = TIMING_ZERO,
snelson376060c2010-01-19 03:24:55 +000010223 .block_erasers =
10224 {
10225 {
10226 .eraseblocks = { {4 * 1024, 64} },
10227 .block_erase = spi_block_erase_20,
10228 }, {
snelson376060c2010-01-19 03:24:55 +000010229 .eraseblocks = { {64 * 1024, 4} },
10230 .block_erase = spi_block_erase_d8,
10231 }, {
10232 .eraseblocks = { {256 * 1024, 1} },
snelson376060c2010-01-19 03:24:55 +000010233 .block_erase = spi_block_erase_c7,
10234 }
10235 },
hailfingerb9560ee2010-07-14 20:21:22 +000010236 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +000010237 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +000010238 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +000010239 .voltage = {2700, 3600},
Louis Yung-Chieh Lo232951f2010-09-16 11:30:00 +080010240 .wp = &wp_w25,
stepanaa1b6a22008-12-08 18:15:10 +000010241 },
10242
hailfinger286829b2009-01-08 03:40:17 +000010243 {
10244 .vendor = "Winbond",
stefanct371e7e82011-07-07 19:56:58 +000010245 .name = "W25X40",
hailfingere1e41ea2011-07-27 07:13:06 +000010246 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +000010247 .manufacture_id = WINBOND_NEX_ID,
mhm38e577e2010-09-14 23:56:56 +000010248 .model_id = WINBOND_NEX_W25X40,
hailfinger286829b2009-01-08 03:40:17 +000010249 .total_size = 512,
10250 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -080010251 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
10252 .tested = TEST_OK_PREWU,
hailfinger286829b2009-01-08 03:40:17 +000010253 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000010254 .probe_timing = TIMING_ZERO,
snelson376060c2010-01-19 03:24:55 +000010255 .block_erasers =
10256 {
10257 {
10258 .eraseblocks = { {4 * 1024, 128} },
10259 .block_erase = spi_block_erase_20,
10260 }, {
snelson376060c2010-01-19 03:24:55 +000010261 .eraseblocks = { {64 * 1024, 8} },
10262 .block_erase = spi_block_erase_d8,
10263 }, {
10264 .eraseblocks = { {512 * 1024, 1} },
snelson376060c2010-01-19 03:24:55 +000010265 .block_erase = spi_block_erase_c7,
10266 }
10267 },
hailfingerb9560ee2010-07-14 20:21:22 +000010268 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +000010269 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +000010270 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +000010271 .voltage = {2700, 3600},
Louis Yung-Chieh Lo232951f2010-09-16 11:30:00 +080010272 .wp = &wp_w25,
stepanaa1b6a22008-12-08 18:15:10 +000010273 },
10274
hailfinger286829b2009-01-08 03:40:17 +000010275 {
10276 .vendor = "Winbond",
stefanct371e7e82011-07-07 19:56:58 +000010277 .name = "W25X80",
hailfingere1e41ea2011-07-27 07:13:06 +000010278 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +000010279 .manufacture_id = WINBOND_NEX_ID,
mhm38e577e2010-09-14 23:56:56 +000010280 .model_id = WINBOND_NEX_W25X80,
hailfinger286829b2009-01-08 03:40:17 +000010281 .total_size = 1024,
10282 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -080010283 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
10284 .tested = TEST_OK_PREWU,
hailfinger286829b2009-01-08 03:40:17 +000010285 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000010286 .probe_timing = TIMING_ZERO,
snelson376060c2010-01-19 03:24:55 +000010287 .block_erasers =
10288 {
10289 {
10290 .eraseblocks = { {4 * 1024, 256} },
10291 .block_erase = spi_block_erase_20,
10292 }, {
snelson376060c2010-01-19 03:24:55 +000010293 .eraseblocks = { {64 * 1024, 16} },
10294 .block_erase = spi_block_erase_d8,
10295 }, {
10296 .eraseblocks = { {1024 * 1024, 1} },
snelson376060c2010-01-19 03:24:55 +000010297 .block_erase = spi_block_erase_c7,
10298 }
10299 },
hailfingerb9560ee2010-07-14 20:21:22 +000010300 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +000010301 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +000010302 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +000010303 .voltage = {2700, 3600},
Louis Yung-Chieh Lo232951f2010-09-16 11:30:00 +080010304 .wp = &wp_w25,
stepanaa1b6a22008-12-08 18:15:10 +000010305 },
10306
hailfinger286829b2009-01-08 03:40:17 +000010307 {
10308 .vendor = "Winbond",
stefanct371e7e82011-07-07 19:56:58 +000010309 .name = "W25X16",
hailfingere1e41ea2011-07-27 07:13:06 +000010310 .bustype = BUS_SPI,
hailfingerea04a9e2009-07-11 19:39:11 +000010311 .manufacture_id = WINBOND_NEX_ID,
mhm38e577e2010-09-14 23:56:56 +000010312 .model_id = WINBOND_NEX_W25X16,
hailfingerea04a9e2009-07-11 19:39:11 +000010313 .total_size = 2048,
10314 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -080010315 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
10316 .tested = TEST_OK_PREWU,
hailfingerea04a9e2009-07-11 19:39:11 +000010317 .probe = probe_spi_rdid,
10318 .probe_timing = TIMING_ZERO,
snelson376060c2010-01-19 03:24:55 +000010319 .block_erasers =
10320 {
10321 {
10322 .eraseblocks = { {4 * 1024, 512} },
10323 .block_erase = spi_block_erase_20,
10324 }, {
10325 .eraseblocks = { {32 * 1024, 64} },
10326 .block_erase = spi_block_erase_52,
10327 }, {
10328 .eraseblocks = { {64 * 1024, 32} },
10329 .block_erase = spi_block_erase_d8,
10330 }, {
10331 .eraseblocks = { {2 * 1024 * 1024, 1} },
10332 .block_erase = spi_block_erase_60,
10333 }, {
10334 .eraseblocks = { {2 * 1024 * 1024, 1} },
10335 .block_erase = spi_block_erase_c7,
10336 }
10337 },
hailfingerb9560ee2010-07-14 20:21:22 +000010338 .unlock = spi_disable_blockprotect,
hailfingerea04a9e2009-07-11 19:39:11 +000010339 .write = spi_chip_write_256,
10340 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +000010341 .voltage = {2700, 3600},
hailfingerea04a9e2009-07-11 19:39:11 +000010342 },
10343
10344 {
10345 .vendor = "Winbond",
stefanct371e7e82011-07-07 19:56:58 +000010346 .name = "W25X32",
hailfingere1e41ea2011-07-27 07:13:06 +000010347 .bustype = BUS_SPI,
hailfingerd5431fb2009-11-26 11:05:01 +000010348 .manufacture_id = WINBOND_NEX_ID,
mhm38e577e2010-09-14 23:56:56 +000010349 .model_id = WINBOND_NEX_W25X32,
hailfingerd5431fb2009-11-26 11:05:01 +000010350 .total_size = 4096,
10351 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -080010352 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
hailfingerd5431fb2009-11-26 11:05:01 +000010353 .tested = TEST_OK_PROBE,
10354 .probe = probe_spi_rdid,
10355 .probe_timing = TIMING_ZERO,
snelson376060c2010-01-19 03:24:55 +000010356 .block_erasers =
10357 {
10358 {
10359 .eraseblocks = { {4 * 1024, 1024} },
10360 .block_erase = spi_block_erase_20,
10361 }, {
10362 .eraseblocks = { {32 * 1024, 128} },
10363 .block_erase = spi_block_erase_52,
10364 }, {
10365 .eraseblocks = { {64 * 1024, 64} },
10366 .block_erase = spi_block_erase_d8,
10367 }, {
10368 .eraseblocks = { {4 * 1024 * 1024, 1} },
10369 .block_erase = spi_block_erase_60,
10370 }, {
10371 .eraseblocks = { {4 * 1024 * 1024, 1} },
10372 .block_erase = spi_block_erase_c7,
10373 }
10374 },
hailfingerb9560ee2010-07-14 20:21:22 +000010375 .unlock = spi_disable_blockprotect,
hailfingerd5431fb2009-11-26 11:05:01 +000010376 .write = spi_chip_write_256,
10377 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +000010378 .voltage = {2700, 3600},
hailfingerd5431fb2009-11-26 11:05:01 +000010379 },
10380
10381 {
10382 .vendor = "Winbond",
stefanct371e7e82011-07-07 19:56:58 +000010383 .name = "W25X64",
hailfingere1e41ea2011-07-27 07:13:06 +000010384 .bustype = BUS_SPI,
hailfingerd5431fb2009-11-26 11:05:01 +000010385 .manufacture_id = WINBOND_NEX_ID,
mhm38e577e2010-09-14 23:56:56 +000010386 .model_id = WINBOND_NEX_W25X64,
hailfingerd5431fb2009-11-26 11:05:01 +000010387 .total_size = 8192,
10388 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -080010389 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
stefancte0e52902011-05-26 14:28:51 +000010390 .tested = TEST_OK_PROBE,
hailfingerd5431fb2009-11-26 11:05:01 +000010391 .probe = probe_spi_rdid,
10392 .probe_timing = TIMING_ZERO,
snelson376060c2010-01-19 03:24:55 +000010393 .block_erasers =
10394 {
10395 {
10396 .eraseblocks = { {4 * 1024, 2048} },
10397 .block_erase = spi_block_erase_20,
10398 }, {
10399 .eraseblocks = { {32 * 1024, 256} },
10400 .block_erase = spi_block_erase_52,
10401 }, {
10402 .eraseblocks = { {64 * 1024, 128} },
10403 .block_erase = spi_block_erase_d8,
10404 }, {
10405 .eraseblocks = { {8 * 1024 * 1024, 1} },
10406 .block_erase = spi_block_erase_60,
10407 }, {
10408 .eraseblocks = { {8 * 1024 * 1024, 1} },
10409 .block_erase = spi_block_erase_c7,
10410 }
10411 },
hailfingerb9560ee2010-07-14 20:21:22 +000010412 .unlock = spi_disable_blockprotect,
hailfingerd5431fb2009-11-26 11:05:01 +000010413 .write = spi_chip_write_256,
10414 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +000010415 .voltage = {2700, 3600},
hailfingerd5431fb2009-11-26 11:05:01 +000010416 },
10417
10418 {
10419 .vendor = "Winbond",
hailfingere51a2012011-07-26 14:18:52 +000010420 .name = "W29C010(M)/W29C011A/W29EE011/W29EE012-old",
hailfingere1e41ea2011-07-27 07:13:06 +000010421 .bustype = BUS_PARALLEL,
hailfingere51a2012011-07-26 14:18:52 +000010422 .manufacture_id = WINBOND_ID,
10423 .model_id = WINBOND_W29C010,
10424 .total_size = 128,
10425 .page_size = 128,
10426 .feature_bits = FEATURE_LONG_RESET,
10427 .tested = TEST_OK_PRE,
10428 .probe = probe_w29ee011,
10429 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (w29ee011.c) */
10430 .block_erasers =
10431 {
10432 {
10433 .eraseblocks = { {128 * 1024, 1} },
10434 .block_erase = erase_chip_block_jedec,
10435 }
10436 },
10437 .write = write_jedec,
10438 .read = read_memmapped,
10439 },
10440
10441 {/* W29EE011, W29EE012, W29C010M, W29C011A do not support probe_jedec according to the datasheet, but it works for newer(?) steppings. */
10442 .vendor = "Winbond",
mhm38e577e2010-09-14 23:56:56 +000010443 .name = "W29C010(M)/W29C011A/W29EE011/W29EE012",
hailfingere1e41ea2011-07-27 07:13:06 +000010444 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000010445 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000010446 .model_id = WINBOND_W29C010,
hailfinger286829b2009-01-08 03:40:17 +000010447 .total_size = 128,
10448 .page_size = 128,
snelsonc6855342010-01-28 23:55:12 +000010449 .feature_bits = FEATURE_LONG_RESET,
stefanctf4eea092011-05-18 01:31:03 +000010450 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000010451 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +000010452 .probe_timing = 10, /* used datasheet for the W29C011A */
snelson376060c2010-01-19 03:24:55 +000010453 .block_erasers =
10454 {
10455 {
10456 .eraseblocks = { {128 * 1024, 1} },
10457 .block_erase = erase_chip_block_jedec,
10458 }
10459 },
hailfinger286829b2009-01-08 03:40:17 +000010460 .write = write_jedec,
hailfinger23060112009-05-08 12:49:03 +000010461 .read = read_memmapped,
stepanaa1b6a22008-12-08 18:15:10 +000010462 },
10463
hailfinger286829b2009-01-08 03:40:17 +000010464 {
10465 .vendor = "Winbond",
mhm38e577e2010-09-14 23:56:56 +000010466 .name = "W29C020(C)/W29C022",
hailfingere1e41ea2011-07-27 07:13:06 +000010467 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000010468 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000010469 .model_id = WINBOND_W29C020,
hailfinger286829b2009-01-08 03:40:17 +000010470 .total_size = 256,
10471 .page_size = 128,
snelsonc6855342010-01-28 23:55:12 +000010472 .feature_bits = FEATURE_LONG_RESET,
David Hendricksc801adb2010-12-09 16:58:56 -080010473 .tested = TEST_OK_PRE,
hailfinger286829b2009-01-08 03:40:17 +000010474 .probe = probe_jedec,
stefanct371e7e82011-07-07 19:56:58 +000010475 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000010476 .block_erasers =
10477 {
10478 {
10479 .eraseblocks = { {256 * 1024, 1} },
10480 .block_erase = erase_chip_block_jedec,
10481 }
10482 },
hailfinger286829b2009-01-08 03:40:17 +000010483 .write = write_jedec,
hailfinger23060112009-05-08 12:49:03 +000010484 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000010485 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +000010486 },
10487
hailfinger286829b2009-01-08 03:40:17 +000010488 {
10489 .vendor = "Winbond",
mhm38e577e2010-09-14 23:56:56 +000010490 .name = "W29C040/P",
hailfingere1e41ea2011-07-27 07:13:06 +000010491 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000010492 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000010493 .model_id = WINBOND_W29C040,
hailfinger286829b2009-01-08 03:40:17 +000010494 .total_size = 512,
10495 .page_size = 256,
snelsonc6855342010-01-28 23:55:12 +000010496 .feature_bits = FEATURE_LONG_RESET,
10497 .tested = TEST_UNTESTED,
hailfinger286829b2009-01-08 03:40:17 +000010498 .probe = probe_jedec,
Simon Glass8dc82732013-07-16 10:13:51 -060010499 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000010500 .block_erasers =
10501 {
10502 {
10503 .eraseblocks = { {512 * 1024, 1} },
10504 .block_erase = erase_chip_block_jedec,
10505 }
10506 },
hailfinger286829b2009-01-08 03:40:17 +000010507 .write = write_jedec,
hailfinger23060112009-05-08 12:49:03 +000010508 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000010509 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +000010510 },
10511
hailfinger286829b2009-01-08 03:40:17 +000010512 {
10513 .vendor = "Winbond",
mkarcherb8f55a62011-03-06 17:58:05 +000010514 .name = "W39L040",
hailfingere1e41ea2011-07-27 07:13:06 +000010515 .bustype = BUS_PARALLEL,
mkarcherb8f55a62011-03-06 17:58:05 +000010516 .manufacture_id = WINBOND_ID,
10517 .model_id = WINBOND_W39L040,
10518 .total_size = 512,
10519 .page_size = 64 * 1024,
10520 .feature_bits = FEATURE_EITHER_RESET,
10521 .tested = TEST_OK_PR,
10522 .probe = probe_jedec,
10523 .probe_timing = 10,
10524 .block_erasers =
10525 {
10526 {
10527 .eraseblocks = { {4 * 1024, 128} },
10528 .block_erase = erase_block_jedec,
10529 }, {
10530 .eraseblocks = { {64 * 1024, 8} },
10531 .block_erase = erase_sector_jedec,
10532 }, {
10533 .eraseblocks = { {512 * 1024, 1} },
10534 .block_erase = erase_chip_block_jedec,
10535 }
10536 },
10537 .printlock = printlock_w39l040,
10538 .write = write_jedec_1,
10539 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +000010540 .voltage = {3000, 3600},
mkarcherb8f55a62011-03-06 17:58:05 +000010541 },
10542
10543 {
10544 .vendor = "Winbond",
hailfinger286829b2009-01-08 03:40:17 +000010545 .name = "W39V040A",
hailfingere1e41ea2011-07-27 07:13:06 +000010546 .bustype = BUS_LPC,
hailfinger286829b2009-01-08 03:40:17 +000010547 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000010548 .model_id = WINBOND_W39V040A,
hailfinger286829b2009-01-08 03:40:17 +000010549 .total_size = 512,
hailfingerc43afc92009-12-22 22:15:33 +000010550 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +000010551 .feature_bits = FEATURE_EITHER_RESET,
stefanctdfd58832011-07-25 20:38:52 +000010552 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000010553 .probe = probe_jedec,
stefanctdfd58832011-07-25 20:38:52 +000010554 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000010555 .block_erasers =
10556 {
10557 {
10558 .eraseblocks = { {64 * 1024, 8} },
10559 .block_erase = erase_sector_jedec,
10560 }, {
10561 .eraseblocks = { {512 * 1024, 1} },
10562 .block_erase = erase_chip_block_jedec,
10563 }
10564 },
hailfingerf8993012010-12-05 16:33:59 +000010565 .printlock = printlock_w39v040a,
snelsonc6855342010-01-28 23:55:12 +000010566 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000010567 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000010568 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000010569 },
10570
hailfinger286829b2009-01-08 03:40:17 +000010571 {
10572 .vendor = "Winbond",
hailfingerf8993012010-12-05 16:33:59 +000010573 .name = "W39V040B",
hailfingere1e41ea2011-07-27 07:13:06 +000010574 .bustype = BUS_LPC,
hailfinger286829b2009-01-08 03:40:17 +000010575 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000010576 .model_id = WINBOND_W39V040B,
hailfinger286829b2009-01-08 03:40:17 +000010577 .total_size = 512,
hailfingerc43afc92009-12-22 22:15:33 +000010578 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +000010579 .feature_bits = FEATURE_EITHER_RESET,
stefanct98d917c2011-10-21 12:33:07 +000010580 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000010581 .probe = probe_jedec,
stefanct98d917c2011-10-21 12:33:07 +000010582 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000010583 .block_erasers =
10584 {
10585 {
10586 .eraseblocks = { {64 * 1024, 8} },
10587 .block_erase = erase_sector_jedec,
10588 }, {
10589 .eraseblocks = { {512 * 1024, 1} },
10590 .block_erase = erase_chip_block_jedec,
10591 }
10592 },
hailfingerf8993012010-12-05 16:33:59 +000010593 .printlock = printlock_w39v040b,
snelsonc6855342010-01-28 23:55:12 +000010594 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000010595 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000010596 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000010597 },
10598
hailfinger286829b2009-01-08 03:40:17 +000010599 {
10600 .vendor = "Winbond",
hailfingerf8993012010-12-05 16:33:59 +000010601 .name = "W39V040C",
hailfingere1e41ea2011-07-27 07:13:06 +000010602 .bustype = BUS_LPC,
hailfinger286829b2009-01-08 03:40:17 +000010603 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000010604 .model_id = WINBOND_W39V040C,
hailfinger286829b2009-01-08 03:40:17 +000010605 .total_size = 512,
hailfingerc43afc92009-12-22 22:15:33 +000010606 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +000010607 .feature_bits = FEATURE_EITHER_RESET,
stefanct98d917c2011-10-21 12:33:07 +000010608 .tested = TEST_OK_PREW,
snelsonc6855342010-01-28 23:55:12 +000010609 .probe = probe_jedec,
hailfingerf8993012010-12-05 16:33:59 +000010610 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000010611 .block_erasers =
10612 {
10613 {
10614 .eraseblocks = { {64 * 1024, 8} },
10615 .block_erase = erase_sector_jedec,
10616 }, {
10617 .eraseblocks = { {512 * 1024, 1} },
10618 .block_erase = erase_chip_block_jedec,
10619 }
10620 },
snelson1ee293c2010-02-19 00:52:10 +000010621 .printlock = printlock_w39v040c,
snelsonc6855342010-01-28 23:55:12 +000010622 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000010623 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000010624 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000010625 },
10626
hailfinger286829b2009-01-08 03:40:17 +000010627 {
10628 .vendor = "Winbond",
10629 .name = "W39V040FA",
hailfingere1e41ea2011-07-27 07:13:06 +000010630 .bustype = BUS_FWH,
hailfinger286829b2009-01-08 03:40:17 +000010631 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000010632 .model_id = WINBOND_W39V040FA,
hailfinger286829b2009-01-08 03:40:17 +000010633 .total_size = 512,
hailfingerc43afc92009-12-22 22:15:33 +000010634 .page_size = 64 * 1024,
mkarcher74173032010-05-30 16:55:18 +000010635 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
David Hendricksc801adb2010-12-09 16:58:56 -080010636 .tested = TEST_OK_PRE,
hailfinger286829b2009-01-08 03:40:17 +000010637 .probe = probe_jedec,
stefancte0e52902011-05-26 14:28:51 +000010638 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000010639 .block_erasers =
10640 {
10641 {
10642 .eraseblocks = { {4 * 1024, 128} },
10643 .block_erase = erase_block_jedec,
10644 }, {
10645 .eraseblocks = { {64 * 1024, 8} },
10646 .block_erase = erase_sector_jedec,
10647 }, {
10648 .eraseblocks = { {512 * 1024, 1} },
10649 .block_erase = erase_chip_block_jedec,
10650 }
10651 },
hailfingerf8993012010-12-05 16:33:59 +000010652 .printlock = printlock_w39v040fa,
mkarcher74173032010-05-30 16:55:18 +000010653 .unlock = unlock_sst_fwhub,
snelsonc6855342010-01-28 23:55:12 +000010654 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000010655 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000010656 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000010657 },
10658
hailfinger286829b2009-01-08 03:40:17 +000010659 {
10660 .vendor = "Winbond",
hailfingerf8993012010-12-05 16:33:59 +000010661 .name = "W39V040FB",
hailfingere1e41ea2011-07-27 07:13:06 +000010662 .bustype = BUS_FWH,
hailfingerf8993012010-12-05 16:33:59 +000010663 .manufacture_id = WINBOND_ID,
10664 .model_id = WINBOND_W39V040B,
10665 .total_size = 512,
10666 .page_size = 64 * 1024,
10667 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
hailfingere29b25b2011-03-06 22:26:23 +000010668 .tested = TEST_OK_PREW,
hailfingerf8993012010-12-05 16:33:59 +000010669 .probe = probe_jedec,
Simon Glass8dc82732013-07-16 10:13:51 -060010670 .probe_timing = 10,
hailfingerf8993012010-12-05 16:33:59 +000010671 .block_erasers =
10672 {
10673 {
10674 .eraseblocks = { {64 * 1024, 8} },
10675 .block_erase = erase_sector_jedec,
10676 }, {
10677 .eraseblocks = { {512 * 1024, 1} },
10678 .block_erase = erase_chip_block_jedec,
10679 }
10680 },
10681 .printlock = printlock_w39v040fb,
mkarcher64dbd922010-12-26 23:55:12 +000010682 .unlock = unlock_w39v040fb,
hailfingerf8993012010-12-05 16:33:59 +000010683 .write = write_jedec_1,
10684 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +000010685 .voltage = {3000, 3600}, /* Also has 12V fast program */
hailfingerf8993012010-12-05 16:33:59 +000010686 },
10687
10688 {
10689 .vendor = "Winbond",
10690 .name = "W39V040FC",
hailfingere1e41ea2011-07-27 07:13:06 +000010691 .bustype = BUS_FWH,
hailfingerf8993012010-12-05 16:33:59 +000010692 .manufacture_id = WINBOND_ID,
10693 .model_id = WINBOND_W39V040C,
10694 .total_size = 512,
10695 .page_size = 64 * 1024,
10696 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Souvik Ghoshd64964a2016-06-13 17:51:25 -070010697 .tested = TEST_OK_PREW,
hailfingerf8993012010-12-05 16:33:59 +000010698 .probe = probe_jedec,
10699 .probe_timing = 10,
10700 .block_erasers =
10701 {
10702 {
10703 .eraseblocks = { {64 * 1024, 8} },
10704 .block_erase = erase_sector_jedec,
10705 }, {
10706 .eraseblocks = { {512 * 1024, 1} },
10707 .block_erase = erase_chip_block_jedec,
10708 }
10709 },
10710 .printlock = printlock_w39v040fc,
10711 .write = write_jedec_1,
10712 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +000010713 .voltage = {3000, 3600}, /* Also has 12V fast program */
hailfingerf8993012010-12-05 16:33:59 +000010714 },
10715
10716 {
10717 .vendor = "Winbond",
David Hendricks668f29d2011-01-27 18:51:45 -080010718 .name = "W39V040FB",
hailfingere1e41ea2011-07-27 07:13:06 +000010719 .bustype = BUS_FWH,
David Hendricks668f29d2011-01-27 18:51:45 -080010720 .manufacture_id = WINBOND_ID,
10721 .model_id = WINBOND_W39V040B,
10722 .total_size = 512,
10723 .page_size = 64 * 1024,
10724 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
10725 .tested = TEST_OK_PRE,
10726 .probe = probe_jedec,
Simon Glass8dc82732013-07-16 10:13:51 -060010727 .probe_timing = 10,
David Hendricks668f29d2011-01-27 18:51:45 -080010728 .block_erasers =
10729 {
10730 {
10731 .eraseblocks = { {64 * 1024, 8} },
10732 .block_erase = erase_sector_jedec,
10733 }, {
10734 .eraseblocks = { {512 * 1024, 1} },
10735 .block_erase = erase_chip_block_jedec,
10736 }
10737 },
10738 .printlock = printlock_w39v040fb,
10739 .unlock = unlock_w39v040fb,
10740 .write = write_jedec_1,
10741 .read = read_memmapped,
10742 },
10743
10744 {
10745 .vendor = "Winbond",
10746 .name = "W39V040FC",
hailfingere1e41ea2011-07-27 07:13:06 +000010747 .bustype = BUS_FWH,
David Hendricks668f29d2011-01-27 18:51:45 -080010748 .manufacture_id = WINBOND_ID,
10749 .model_id = WINBOND_W39V040C,
10750 .total_size = 512,
10751 .page_size = 64 * 1024,
10752 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
10753 .tested = TEST_UNTESTED,
10754 .probe = probe_jedec,
10755 .probe_timing = 10,
10756 .block_erasers =
10757 {
10758 {
10759 .eraseblocks = { {64 * 1024, 8} },
10760 .block_erase = erase_sector_jedec,
10761 }, {
10762 .eraseblocks = { {512 * 1024, 1} },
10763 .block_erase = erase_chip_block_jedec,
10764 }
10765 },
10766 .printlock = printlock_w39v040fc,
10767 .write = write_jedec_1,
10768 .read = read_memmapped,
10769 },
10770
10771 {
10772 .vendor = "Winbond",
hailfinger286829b2009-01-08 03:40:17 +000010773 .name = "W39V080A",
hailfingere1e41ea2011-07-27 07:13:06 +000010774 .bustype = BUS_LPC,
hailfinger286829b2009-01-08 03:40:17 +000010775 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000010776 .model_id = WINBOND_W39V080A,
hailfinger286829b2009-01-08 03:40:17 +000010777 .total_size = 1024,
hailfingerc43afc92009-12-22 22:15:33 +000010778 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +000010779 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner718d1eb2016-08-18 18:00:53 -070010780 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000010781 .probe = probe_jedec,
Simon Glass8dc82732013-07-16 10:13:51 -060010782 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000010783 .block_erasers =
10784 {
10785 {
10786 .eraseblocks = { {64 * 1024, 16} },
10787 .block_erase = erase_sector_jedec,
10788 }, {
10789 .eraseblocks = { {1024 * 1024, 1} },
10790 .block_erase = erase_chip_block_jedec,
10791 }
10792 },
hailfingerf8993012010-12-05 16:33:59 +000010793 .printlock = printlock_w39v080a,
snelsonc6855342010-01-28 23:55:12 +000010794 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000010795 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000010796 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000010797 },
10798
hailfinger286829b2009-01-08 03:40:17 +000010799 {
10800 .vendor = "Winbond",
mhm38e577e2010-09-14 23:56:56 +000010801 .name = "W49F002U/N",
hailfingere1e41ea2011-07-27 07:13:06 +000010802 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000010803 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000010804 .model_id = WINBOND_W49F002U,
hailfinger286829b2009-01-08 03:40:17 +000010805 .total_size = 256,
10806 .page_size = 128,
snelsonc6855342010-01-28 23:55:12 +000010807 .feature_bits = FEATURE_EITHER_RESET,
stefanctdfd58832011-07-25 20:38:52 +000010808 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000010809 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +000010810 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000010811 .block_erasers =
10812 {
10813 {
10814 .eraseblocks = {
10815 {128 * 1024, 1},
10816 {96 * 1024, 1},
10817 {8 * 1024, 2},
10818 {16 * 1024, 1},
10819 },
10820 .block_erase = erase_sector_jedec,
10821 }, {
10822 .eraseblocks = { {256 * 1024, 1} },
10823 .block_erase = erase_chip_block_jedec,
10824 }
10825 },
snelsonc6855342010-01-28 23:55:12 +000010826 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000010827 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000010828 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +000010829 },
10830
hailfinger286829b2009-01-08 03:40:17 +000010831 {
10832 .vendor = "Winbond",
hailfinger808e6aa2010-07-17 13:45:42 +000010833 .name = "W49F020",
hailfingere1e41ea2011-07-27 07:13:06 +000010834 .bustype = BUS_PARALLEL,
hailfinger808e6aa2010-07-17 13:45:42 +000010835 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000010836 .model_id = WINBOND_W49F020,
hailfinger808e6aa2010-07-17 13:45:42 +000010837 .total_size = 256,
10838 .page_size = 128,
10839 .feature_bits = FEATURE_EITHER_RESET,
10840 .tested = TEST_OK_PROBE,
10841 .probe = probe_jedec,
10842 .probe_timing = 10,
10843 .block_erasers =
10844 {
10845 {
10846 .eraseblocks = { {256 * 1024, 1} },
10847 .block_erase = erase_chip_block_jedec,
10848 }
10849 },
10850 .write = write_jedec_1,
10851 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000010852 .voltage = {4500, 5500},
hailfinger808e6aa2010-07-17 13:45:42 +000010853 },
10854
10855 {
10856 .vendor = "Winbond",
hailfinger286829b2009-01-08 03:40:17 +000010857 .name = "W49V002A",
hailfingere1e41ea2011-07-27 07:13:06 +000010858 .bustype = BUS_LPC,
hailfinger286829b2009-01-08 03:40:17 +000010859 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000010860 .model_id = WINBOND_W49V002A,
hailfinger286829b2009-01-08 03:40:17 +000010861 .total_size = 256,
10862 .page_size = 128,
snelsonc6855342010-01-28 23:55:12 +000010863 .feature_bits = FEATURE_EITHER_RESET,
David Hendricksc801adb2010-12-09 16:58:56 -080010864 .tested = TEST_OK_PRE,
hailfinger286829b2009-01-08 03:40:17 +000010865 .probe = probe_jedec,
stefanct371e7e82011-07-07 19:56:58 +000010866 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000010867 .block_erasers =
10868 {
10869 {
10870 .eraseblocks = {
10871 {64 * 1024, 3},
10872 {32 * 1024, 1},
10873 {8 * 1024, 2},
10874 {16 * 1024, 1},
10875 },
10876 .block_erase = erase_sector_jedec,
10877 }, {
10878 .eraseblocks = { {256 * 1024, 1} },
10879 .block_erase = erase_chip_block_jedec,
10880 }
10881 },
snelsonc6855342010-01-28 23:55:12 +000010882 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000010883 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000010884 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000010885 },
10886
hailfinger286829b2009-01-08 03:40:17 +000010887 {
10888 .vendor = "Winbond",
10889 .name = "W49V002FA",
hailfingere1e41ea2011-07-27 07:13:06 +000010890 .bustype = BUS_FWH,
hailfinger286829b2009-01-08 03:40:17 +000010891 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000010892 .model_id = WINBOND_W49V002FA,
hailfinger286829b2009-01-08 03:40:17 +000010893 .total_size = 256,
10894 .page_size = 128,
snelsonc6855342010-01-28 23:55:12 +000010895 .feature_bits = FEATURE_EITHER_RESET,
hailfingerd217d122010-10-08 18:52:29 +000010896 .tested = TEST_OK_PR,
hailfinger286829b2009-01-08 03:40:17 +000010897 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +000010898 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000010899 .block_erasers =
10900 {
10901 {
10902 .eraseblocks = {
10903 {64 * 1024, 3},
10904 {32 * 1024, 1},
10905 {8 * 1024, 2},
10906 {16 * 1024, 1},
10907 },
10908 .block_erase = erase_sector_jedec,
10909 }, {
10910 .eraseblocks = { {256 * 1024, 1} },
10911 .block_erase = erase_chip_block_jedec,
10912 }
10913 },
snelsonc6855342010-01-28 23:55:12 +000010914 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000010915 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000010916 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000010917 },
10918
hailfinger286829b2009-01-08 03:40:17 +000010919 {
10920 .vendor = "Winbond",
10921 .name = "W39V080FA",
hailfingere1e41ea2011-07-27 07:13:06 +000010922 .bustype = BUS_FWH,
hailfinger286829b2009-01-08 03:40:17 +000010923 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000010924 .model_id = WINBOND_W39V080FA,
hailfinger286829b2009-01-08 03:40:17 +000010925 .total_size = 1024,
hailfingerc43afc92009-12-22 22:15:33 +000010926 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +000010927 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
stefanctdfd58832011-07-25 20:38:52 +000010928 .tested = TEST_OK_PREW,
hailfingerafac00e2010-01-09 02:24:17 +000010929 .probe = probe_jedec,
hailfingerf8993012010-12-05 16:33:59 +000010930 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000010931 .block_erasers =
10932 {
10933 {
10934 .eraseblocks = { {64 * 1024, 16}, },
10935 .block_erase = erase_sector_jedec,
10936 }, {
10937 .eraseblocks = { {1024 * 1024, 1} },
10938 .block_erase = erase_chip_block_jedec,
10939 }
10940 },
hailfingerf8993012010-12-05 16:33:59 +000010941 .printlock = printlock_w39v080fa,
10942 .unlock = unlock_w39v080fa,
snelsonc6855342010-01-28 23:55:12 +000010943 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000010944 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +000010945 .voltage = {3000, 3600}, /* Also has 12V fast program */
stepanaa1b6a22008-12-08 18:15:10 +000010946 },
10947
hailfinger286829b2009-01-08 03:40:17 +000010948 {
10949 .vendor = "Winbond",
10950 .name = "W39V080FA (dual mode)",
hailfingere1e41ea2011-07-27 07:13:06 +000010951 .bustype = BUS_FWH,
hailfinger286829b2009-01-08 03:40:17 +000010952 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000010953 .model_id = WINBOND_W39V080FA_DM,
hailfinger286829b2009-01-08 03:40:17 +000010954 .total_size = 512,
hailfingerc43afc92009-12-22 22:15:33 +000010955 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +000010956 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
hailfinger286829b2009-01-08 03:40:17 +000010957 .tested = TEST_UNTESTED,
hailfingerafac00e2010-01-09 02:24:17 +000010958 .probe = probe_jedec,
hailfingerf8993012010-12-05 16:33:59 +000010959 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000010960 .block_erasers =
10961 {
10962 {
10963 .eraseblocks = { {64 * 1024, 8}, },
10964 .block_erase = erase_sector_jedec,
10965 }, {
10966 .eraseblocks = { {512 * 1024, 1} },
10967 .block_erase = erase_chip_block_jedec,
10968 }
10969 },
hailfingerf8993012010-12-05 16:33:59 +000010970 .printlock = printlock_w39v080fa_dual,
snelsonc6855342010-01-28 23:55:12 +000010971 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000010972 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +000010973 .voltage = {3000, 3600}, /* Also has 12V fast program */
stepanaa1b6a22008-12-08 18:15:10 +000010974 },
David Hendricks89a45e52011-11-22 16:56:22 -080010975
hailfinger286829b2009-01-08 03:40:17 +000010976 {
Duncan Laurie89ee23d2015-05-08 20:27:50 +000010977 .vendor = "Programmer",
10978 .name = "Opaque flash chip",
10979 .bustype = BUS_PROG,
10980 .manufacture_id = PROGMANUF_ID,
10981 .model_id = PROGDEV_ID,
10982 .total_size = 0,
10983 .page_size = 256,
10984 /* probe is assumed to work, rest will be filled in by probe */
10985 .tested = TEST_OK_PROBE,
10986 .probe = probe_opaque,
10987 /* eraseblock sizes will be set by the probing function */
10988 .block_erasers =
10989 {
10990 {
10991 .block_erase = erase_opaque,
10992 }
10993 },
10994 .write = write_opaque,
10995 .read = read_opaque,
10996 },
10997
10998 {
hailfinger867df6b2010-07-22 11:44:38 +000010999 .vendor = "AMIC",
11000 .name = "unknown AMIC SPI chip",
hailfingere1e41ea2011-07-27 07:13:06 +000011001 .bustype = BUS_SPI,
hailfinger867df6b2010-07-22 11:44:38 +000011002 .manufacture_id = AMIC_ID,
11003 .model_id = GENERIC_DEVICE_ID,
11004 .total_size = 0,
11005 .page_size = 256,
11006 .tested = TEST_BAD_PREW,
11007 .probe = probe_spi_rdid4,
11008 .probe_timing = TIMING_ZERO,
11009 .write = NULL,
11010 .read = NULL,
11011 },
11012
11013 {
hailfinger286829b2009-01-08 03:40:17 +000011014 .vendor = "Atmel",
11015 .name = "unknown Atmel SPI chip",
hailfingere1e41ea2011-07-27 07:13:06 +000011016 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +000011017 .manufacture_id = ATMEL_ID,
11018 .model_id = GENERIC_DEVICE_ID,
11019 .total_size = 0,
11020 .page_size = 256,
hailfinger97ab2632009-04-22 13:33:43 +000011021 .tested = TEST_BAD_PREW,
hailfinger286829b2009-01-08 03:40:17 +000011022 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000011023 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +000011024 .write = NULL,
hailfinger23060112009-05-08 12:49:03 +000011025 .read = NULL,
stepanaa1b6a22008-12-08 18:15:10 +000011026 },
11027
hailfinger286829b2009-01-08 03:40:17 +000011028 {
hailfinger61958912010-07-28 22:20:20 +000011029 .vendor = "Eon",
11030 .name = "unknown Eon SPI chip",
hailfingere1e41ea2011-07-27 07:13:06 +000011031 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +000011032 .manufacture_id = EON_ID_NOPREFIX,
11033 .model_id = GENERIC_DEVICE_ID,
11034 .total_size = 0,
11035 .page_size = 256,
hailfinger97ab2632009-04-22 13:33:43 +000011036 .tested = TEST_BAD_PREW,
hailfinger286829b2009-01-08 03:40:17 +000011037 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000011038 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +000011039 .write = NULL,
hailfinger23060112009-05-08 12:49:03 +000011040 .read = NULL,
stepanaa1b6a22008-12-08 18:15:10 +000011041 },
11042
hailfinger286829b2009-01-08 03:40:17 +000011043 {
11044 .vendor = "Macronix",
11045 .name = "unknown Macronix SPI chip",
hailfingere1e41ea2011-07-27 07:13:06 +000011046 .bustype = BUS_SPI,
mhmd3c80cd2010-09-15 23:31:03 +000011047 .manufacture_id = MACRONIX_ID,
hailfinger286829b2009-01-08 03:40:17 +000011048 .model_id = GENERIC_DEVICE_ID,
11049 .total_size = 0,
11050 .page_size = 256,
hailfinger97ab2632009-04-22 13:33:43 +000011051 .tested = TEST_BAD_PREW,
hailfinger286829b2009-01-08 03:40:17 +000011052 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000011053 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +000011054 .write = NULL,
hailfinger23060112009-05-08 12:49:03 +000011055 .read = NULL,
stepanaa1b6a22008-12-08 18:15:10 +000011056 },
11057
hailfinger286829b2009-01-08 03:40:17 +000011058 {
11059 .vendor = "PMC",
11060 .name = "unknown PMC SPI chip",
hailfingere1e41ea2011-07-27 07:13:06 +000011061 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +000011062 .manufacture_id = PMC_ID,
11063 .model_id = GENERIC_DEVICE_ID,
11064 .total_size = 0,
11065 .page_size = 256,
hailfinger97ab2632009-04-22 13:33:43 +000011066 .tested = TEST_BAD_PREW,
hailfinger286829b2009-01-08 03:40:17 +000011067 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000011068 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +000011069 .write = NULL,
hailfinger23060112009-05-08 12:49:03 +000011070 .read = NULL,
stepanaa1b6a22008-12-08 18:15:10 +000011071 },
11072
hailfinger286829b2009-01-08 03:40:17 +000011073 {
11074 .vendor = "SST",
11075 .name = "unknown SST SPI chip",
hailfingere1e41ea2011-07-27 07:13:06 +000011076 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +000011077 .manufacture_id = SST_ID,
11078 .model_id = GENERIC_DEVICE_ID,
11079 .total_size = 0,
11080 .page_size = 256,
hailfinger97ab2632009-04-22 13:33:43 +000011081 .tested = TEST_BAD_PREW,
hailfinger286829b2009-01-08 03:40:17 +000011082 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000011083 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +000011084 .write = NULL,
hailfinger23060112009-05-08 12:49:03 +000011085 .read = NULL,
stepanaa1b6a22008-12-08 18:15:10 +000011086 },
11087
hailfinger286829b2009-01-08 03:40:17 +000011088 {
11089 .vendor = "ST",
11090 .name = "unknown ST SPI chip",
hailfingere1e41ea2011-07-27 07:13:06 +000011091 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +000011092 .manufacture_id = ST_ID,
11093 .model_id = GENERIC_DEVICE_ID,
11094 .total_size = 0,
11095 .page_size = 256,
hailfinger97ab2632009-04-22 13:33:43 +000011096 .tested = TEST_BAD_PREW,
hailfinger286829b2009-01-08 03:40:17 +000011097 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000011098 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +000011099 .write = NULL,
hailfinger23060112009-05-08 12:49:03 +000011100 .read = NULL,
stepanaa1b6a22008-12-08 18:15:10 +000011101 },
uwec93fbdb2008-03-16 02:06:25 +000011102
hailfinger63165602009-11-20 01:12:45 +000011103 {
hailfinger201f62f2009-11-24 02:08:11 +000011104 .vendor = "Sanyo",
11105 .name = "unknown Sanyo SPI chip",
hailfingere1e41ea2011-07-27 07:13:06 +000011106 .bustype = BUS_SPI,
hailfinger201f62f2009-11-24 02:08:11 +000011107 .manufacture_id = SANYO_ID,
11108 .model_id = GENERIC_DEVICE_ID,
11109 .total_size = 0,
11110 .page_size = 256,
11111 .tested = TEST_BAD_PREW,
11112 .probe = probe_spi_rdid,
11113 .probe_timing = TIMING_ZERO,
hailfinger201f62f2009-11-24 02:08:11 +000011114 .write = NULL,
11115 .read = NULL,
11116 },
11117
11118 {
hailfinger63165602009-11-20 01:12:45 +000011119 .vendor = "Generic",
Louis Yung-Chieh Loe53fa0f2011-04-11 17:18:41 +080011120 .name = "Variable Size SPI chip",
hailfingere1e41ea2011-07-27 07:13:06 +000011121 .bustype = BUS_SPI,
Louis Yung-Chieh Loe53fa0f2011-04-11 17:18:41 +080011122 .manufacture_id = VARIABLE_SIZE_MANUF_ID,
11123 .model_id = VARIABLE_SIZE_DEVICE_ID,
11124 .total_size = 64, /* This size is set temporarily */
11125 .page_size = 256,
11126 .tested = TEST_OK_PREW,
11127 .probe = probe_variable_size,
11128 .block_erasers =
11129 {
11130 {
11131 .eraseblocks = { {4 * 1024, 16} },
11132 .block_erase = spi_block_erase_20,
11133 }, {
11134 .eraseblocks = { {64 * 1024, 1} },
11135 .block_erase = spi_block_erase_d8,
11136 }
11137 },
11138 .write = spi_chip_write_256,
11139 .read = spi_chip_read,
11140 },
11141
11142 {
11143 .vendor = "Generic",
hailfinger63165602009-11-20 01:12:45 +000011144 .name = "unknown SPI chip (RDID)",
hailfingere1e41ea2011-07-27 07:13:06 +000011145 .bustype = BUS_SPI,
hailfinger63165602009-11-20 01:12:45 +000011146 .manufacture_id = GENERIC_MANUF_ID,
11147 .model_id = GENERIC_DEVICE_ID,
11148 .total_size = 0,
11149 .page_size = 256,
11150 .tested = TEST_BAD_PREW,
11151 .probe = probe_spi_rdid,
hailfinger63165602009-11-20 01:12:45 +000011152 .write = NULL,
11153 },
David Hendricks07af3a42011-07-11 22:13:02 -070011154
hailfinger63165602009-11-20 01:12:45 +000011155 {
11156 .vendor = "Generic",
11157 .name = "unknown SPI chip (REMS)",
hailfingere1e41ea2011-07-27 07:13:06 +000011158 .bustype = BUS_SPI,
hailfinger63165602009-11-20 01:12:45 +000011159 .manufacture_id = GENERIC_MANUF_ID,
11160 .model_id = GENERIC_DEVICE_ID,
11161 .total_size = 0,
11162 .page_size = 256,
11163 .tested = TEST_BAD_PREW,
11164 .probe = probe_spi_rems,
hailfinger63165602009-11-20 01:12:45 +000011165 .write = NULL,
11166 },
11167
hailfinger286829b2009-01-08 03:40:17 +000011168 { NULL }
stuge7be5d032009-04-21 01:46:07 +000011169};
Simon Glass4c214132013-07-16 10:09:28 -060011170
David Hendricks07153282016-12-22 16:07:00 -080011171/* Generic flashchip struct for platforms that use Intel hardware sequencing. */
Ramya Vijaykumare6a7ca82015-05-12 14:27:29 +053011172const struct flashchip flashchips_hwseq[] = {
11173 {
David Hendricks07153282016-12-22 16:07:00 -080011174 .vendor = "Generic",
11175 .name = "HWSEQ chip",
Ramya Vijaykumare6a7ca82015-05-12 14:27:29 +053011176 .bustype = BUS_PROG,
Ramya Vijaykumare6a7ca82015-05-12 14:27:29 +053011177 /* probe is assumed to work, rest will be filled in by probe */
David Hendricksb8696182016-05-20 16:38:35 -070011178 .tested = TEST_OK_PREWU,
Ramya Vijaykumare6a7ca82015-05-12 14:27:29 +053011179 .probe = probe_opaque,
11180 /* eraseblock sizes will be set by the probing function */
11181 .block_erasers =
11182 {
11183 {
11184 .block_erase = erase_opaque,
11185 }
11186 },
11187 .write = write_opaque,
11188 .read = read_opaque,
Ramya Vijaykumar4af3f822016-01-27 11:51:27 +053011189 .read_status = read_status_opaque,
11190 .write_status = write_status_opaque,
Duncan Laurie25a4ca22019-04-25 12:08:52 -070011191 .check_access = check_access_opaque,
Ramya Vijaykumar4af3f822016-01-27 11:51:27 +053011192 .wp = &wp_w25,
Furquan Shaikhc5bc5cd2019-01-07 04:25:59 -080011193 .unlock = &spi_disable_blockprotect,
Ramya Vijaykumare6a7ca82015-05-12 14:27:29 +053011194 },
11195
11196 {NULL}
11197};
11198
Souvik Ghoshd75cd672016-06-17 14:21:39 -070011199int flash_erase_value(struct flashctx *flash)
Simon Glass4c214132013-07-16 10:09:28 -060011200{
Patrick Georgif3fa2992017-02-02 16:24:44 +010011201 return flash->chip->feature_bits & FEATURE_ERASE_TO_ZERO ? 0 : 0xff;
Simon Glass4c214132013-07-16 10:09:28 -060011202}
11203
Souvik Ghoshd75cd672016-06-17 14:21:39 -070011204int flash_unerased_value(struct flashctx *flash)
Simon Glass4c214132013-07-16 10:09:28 -060011205{
Patrick Georgif3fa2992017-02-02 16:24:44 +010011206 return flash->chip->feature_bits & FEATURE_ERASE_TO_ZERO ? 0xff : 0;
Simon Glass4c214132013-07-16 10:09:28 -060011207}
David Hendricks8c084212015-11-17 22:29:36 -080011208
David Hendricks40df5b52016-12-22 15:36:28 -080011209const struct flashchip *flash_id_to_entry(uint32_t mfg_id, uint32_t model_id)
11210{
11211 const struct flashchip *chip;
11212
11213 for (chip = &flashchips[0]; chip->vendor; chip++) {
11214 if ((chip->manufacture_id == mfg_id) &&
11215 (chip->model_id == model_id))
11216 return chip;
11217 }
11218
11219 return NULL;
11220}
11221
David Hendricks8c084212015-11-17 22:29:36 -080011222struct voltage_range voltage_ranges[NUM_VOLTAGE_RANGES];
11223
11224static int compar(const void *_x, const void *_y)
11225{
11226 const struct voltage_range *x = _x;
11227 const struct voltage_range *y = _y;
11228
11229 /*
11230 * qsort() places entries in ascending order. We will sort by minimum
11231 * voltage primarily and max voltage secondarily, and move empty sets
11232 * to the end of array.
11233 */
11234 if (x->min == 0)
11235 return 1;
11236 if (y->min == 0)
11237 return -1;
11238
11239 if (x->min < y->min)
11240 return -1;
11241 if (x->min > y->min)
11242 return 1;
11243
11244 if (x->min == y->min) {
11245 if (x->max < y->max)
11246 return -1;
11247 if (x->max > y->max)
11248 return 1;
11249 }
11250
11251 return 0;
11252}
11253
11254int flash_supported_voltage_ranges(enum chipbustype bus)
11255{
11256 int i;
11257 int unique_ranges = 0;
11258
11259 /* clear array in case user calls this function multiple times */
11260 memset(voltage_ranges, 0, sizeof(voltage_ranges));
11261
11262 for (i = 0; i < ARRAY_SIZE(flashchips); i++) {
11263 int j;
11264 int match_found = 0;
11265
11266 if (unique_ranges >= NUM_VOLTAGE_RANGES) {
11267 msg_cerr("Increase NUM_VOLTAGE_RANGES.\n");
11268 return -1;
11269 }
11270
11271 if (!(flashchips[i].bustype & bus))
11272 continue;
11273
11274 for (j = 0; j < NUM_VOLTAGE_RANGES; j++) {
11275 if ((flashchips[i].voltage.min == voltage_ranges[j].min) &&
11276 (flashchips[i].voltage.max == voltage_ranges[j].max))
11277 match_found |= 1;
11278
11279 if (!voltage_ranges[j].min && !voltage_ranges[j].max)
11280 break;
11281 }
11282
11283 if (!match_found) {
11284 voltage_ranges[j] = flashchips[i].voltage;
11285 unique_ranges++;
11286 }
11287 }
11288
11289 qsort(&voltage_ranges[0], NUM_VOLTAGE_RANGES,
11290 sizeof(voltage_ranges[0]), compar);
11291
11292 for (i = 0; i < NUM_VOLTAGE_RANGES; i++) {
11293 msg_cspew("%s: voltage_range[%d]: { %u, %u }\n",
11294 __func__, i, voltage_ranges[i].min, voltage_ranges[i].max);
11295 }
11296
11297 return unique_ranges;
11298}