aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/mtd/devices/st_spi_fsm.c136
1 files changed, 136 insertions, 0 deletions
diff --git a/drivers/mtd/devices/st_spi_fsm.c b/drivers/mtd/devices/st_spi_fsm.c
index 1eea9494d6b7..29da52284dfd 100644
--- a/drivers/mtd/devices/st_spi_fsm.c
+++ b/drivers/mtd/devices/st_spi_fsm.c
@@ -221,6 +221,142 @@ struct stfsm_seq {
221 uint32_t seq_cfg; 221 uint32_t seq_cfg;
222} __packed __aligned(4); 222} __packed __aligned(4);
223 223
224/* SPI Flash Device Table */
225struct flash_info {
226 char *name;
227 /*
228 * JEDEC id zero means "no ID" (most older chips); otherwise it has
229 * a high byte of zero plus three data bytes: the manufacturer id,
230 * then a two byte device id.
231 */
232 u32 jedec_id;
233 u16 ext_id;
234 /*
235 * The size listed here is what works with FLASH_CMD_SE, which isn't
236 * necessarily called a "sector" by the vendor.
237 */
238 unsigned sector_size;
239 u16 n_sectors;
240 u32 flags;
241 /*
242 * Note, where FAST_READ is supported, freq_max specifies the
243 * FAST_READ frequency, not the READ frequency.
244 */
245 u32 max_freq;
246 int (*config)(struct stfsm *);
247};
248
249static struct flash_info flash_types[] = {
250 /*
251 * ST Microelectronics/Numonyx --
252 * (newer production versions may have feature updates
253 * (eg faster operating frequency)
254 */
255#define M25P_FLAG (FLASH_FLAG_READ_WRITE | FLASH_FLAG_READ_FAST)
256 { "m25p40", 0x202013, 0, 64 * 1024, 8, M25P_FLAG, 25, NULL },
257 { "m25p80", 0x202014, 0, 64 * 1024, 16, M25P_FLAG, 25, NULL },
258 { "m25p16", 0x202015, 0, 64 * 1024, 32, M25P_FLAG, 25, NULL },
259 { "m25p32", 0x202016, 0, 64 * 1024, 64, M25P_FLAG, 50, NULL },
260 { "m25p64", 0x202017, 0, 64 * 1024, 128, M25P_FLAG, 50, NULL },
261 { "m25p128", 0x202018, 0, 256 * 1024, 64, M25P_FLAG, 50, NULL },
262
263#define M25PX_FLAG (FLASH_FLAG_READ_WRITE | \
264 FLASH_FLAG_READ_FAST | \
265 FLASH_FLAG_READ_1_1_2 | \
266 FLASH_FLAG_WRITE_1_1_2)
267 { "m25px32", 0x207116, 0, 64 * 1024, 64, M25PX_FLAG, 75, NULL },
268 { "m25px64", 0x207117, 0, 64 * 1024, 128, M25PX_FLAG, 75, NULL },
269
270#define MX25_FLAG (FLASH_FLAG_READ_WRITE | \
271 FLASH_FLAG_READ_FAST | \
272 FLASH_FLAG_READ_1_1_2 | \
273 FLASH_FLAG_READ_1_2_2 | \
274 FLASH_FLAG_READ_1_1_4 | \
275 FLASH_FLAG_READ_1_4_4 | \
276 FLASH_FLAG_SE_4K | \
277 FLASH_FLAG_SE_32K)
278 { "mx25l25635e", 0xc22019, 0, 64*1024, 512,
279 (MX25_FLAG | FLASH_FLAG_32BIT_ADDR | FLASH_FLAG_RESET), 70, NULL }
280
281#define N25Q_FLAG (FLASH_FLAG_READ_WRITE | \
282 FLASH_FLAG_READ_FAST | \
283 FLASH_FLAG_READ_1_1_2 | \
284 FLASH_FLAG_READ_1_2_2 | \
285 FLASH_FLAG_READ_1_1_4 | \
286 FLASH_FLAG_READ_1_4_4 | \
287 FLASH_FLAG_WRITE_1_1_2 | \
288 FLASH_FLAG_WRITE_1_2_2 | \
289 FLASH_FLAG_WRITE_1_1_4 | \
290 FLASH_FLAG_WRITE_1_4_4)
291 { "n25q128", 0x20ba18, 0, 64 * 1024, 256, N25Q_FLAG, 108, NULL },
292 { "n25q256", 0x20ba19, 0, 64 * 1024, 512,
293 N25Q_FLAG | FLASH_FLAG_32BIT_ADDR, 108, NULL },
294
295 /*
296 * Spansion S25FLxxxP
297 * - 256KiB and 64KiB sector variants (identified by ext. JEDEC)
298 */
299#define S25FLXXXP_FLAG (FLASH_FLAG_READ_WRITE | \
300 FLASH_FLAG_READ_1_1_2 | \
301 FLASH_FLAG_READ_1_2_2 | \
302 FLASH_FLAG_READ_1_1_4 | \
303 FLASH_FLAG_READ_1_4_4 | \
304 FLASH_FLAG_WRITE_1_1_4 | \
305 FLASH_FLAG_READ_FAST)
306 { "s25fl129p0", 0x012018, 0x4d00, 256 * 1024, 64, S25FLXXXP_FLAG, 80,
307 NULL },
308 { "s25fl129p1", 0x012018, 0x4d01, 64 * 1024, 256, S25FLXXXP_FLAG, 80,
309 NULL },
310
311 /*
312 * Spansion S25FLxxxS
313 * - 256KiB and 64KiB sector variants (identified by ext. JEDEC)
314 * - RESET# signal supported by die but not bristled out on all
315 * package types. The package type is a function of board design,
316 * so this information is captured in the board's flags.
317 * - Supports 'DYB' sector protection. Depending on variant, sectors
318 * may default to locked state on power-on.
319 */
320#define S25FLXXXS_FLAG (S25FLXXXP_FLAG | \
321 FLASH_FLAG_RESET | \
322 FLASH_FLAG_DYB_LOCKING)
323 { "s25fl128s0", 0x012018, 0x0300, 256 * 1024, 64, S25FLXXXS_FLAG, 80,
324 NULL },
325 { "s25fl128s1", 0x012018, 0x0301, 64 * 1024, 256, S25FLXXXS_FLAG, 80,
326 NULL },
327 { "s25fl256s0", 0x010219, 0x4d00, 256 * 1024, 128,
328 S25FLXXXS_FLAG | FLASH_FLAG_32BIT_ADDR, 80, NULL },
329 { "s25fl256s1", 0x010219, 0x4d01, 64 * 1024, 512,
330 S25FLXXXS_FLAG | FLASH_FLAG_32BIT_ADDR, 80, NULL },
331
332 /* Winbond -- w25x "blocks" are 64K, "sectors" are 4KiB */
333#define W25X_FLAG (FLASH_FLAG_READ_WRITE | \
334 FLASH_FLAG_READ_FAST | \
335 FLASH_FLAG_READ_1_1_2 | \
336 FLASH_FLAG_WRITE_1_1_2)
337 { "w25x40", 0xef3013, 0, 64 * 1024, 8, W25X_FLAG, 75, NULL },
338 { "w25x80", 0xef3014, 0, 64 * 1024, 16, W25X_FLAG, 75, NULL },
339 { "w25x16", 0xef3015, 0, 64 * 1024, 32, W25X_FLAG, 75, NULL },
340 { "w25x32", 0xef3016, 0, 64 * 1024, 64, W25X_FLAG, 75, NULL },
341 { "w25x64", 0xef3017, 0, 64 * 1024, 128, W25X_FLAG, 75, NULL },
342
343 /* Winbond -- w25q "blocks" are 64K, "sectors" are 4KiB */
344#define W25Q_FLAG (FLASH_FLAG_READ_WRITE | \
345 FLASH_FLAG_READ_FAST | \
346 FLASH_FLAG_READ_1_1_2 | \
347 FLASH_FLAG_READ_1_2_2 | \
348 FLASH_FLAG_READ_1_1_4 | \
349 FLASH_FLAG_READ_1_4_4 | \
350 FLASH_FLAG_WRITE_1_1_4)
351 { "w25q80", 0xef4014, 0, 64 * 1024, 16, W25Q_FLAG, 80, NULL },
352 { "w25q16", 0xef4015, 0, 64 * 1024, 32, W25Q_FLAG, 80, NULL },
353 { "w25q32", 0xef4016, 0, 64 * 1024, 64, W25Q_FLAG, 80, NULL },
354 { "w25q64", 0xef4017, 0, 64 * 1024, 128, W25Q_FLAG, 80, NULL },
355
356 /* Sentinel */
357 { NULL, 0x000000, 0, 0, 0, 0, 0, NULL },
358};
359
224static struct stfsm_seq stfsm_seq_read_jedec = { 360static struct stfsm_seq stfsm_seq_read_jedec = {
225 .data_size = TRANSFER_SIZE(8), 361 .data_size = TRANSFER_SIZE(8),
226 .seq_opc[0] = (SEQ_OPC_PADS_1 | 362 .seq_opc[0] = (SEQ_OPC_PADS_1 |