diff options
author | Lee Jones <lee.jones@linaro.org> | 2014-03-20 05:20:40 -0400 |
---|---|---|
committer | Brian Norris <computersforpeace@gmail.com> | 2014-03-20 07:17:15 -0400 |
commit | 11d7f826639baa25e7930d2b34c84c2d67f85ddc (patch) | |
tree | 580c5e97433b6e0fc7b599cdb76bb65f138341f6 | |
parent | 5549fbd514b6002073437ee543deb89904045078 (diff) |
mtd: st_spi_fsm: Provide device look-up table
Supply a lookup table of all the devices we intend to support. This table
is used to store device information such as; a human readable device name,
their JEDEC ID (plus the extended version), sector size and amount, a bit
store of a device's capabilities, its maximum running frequency and
possible use of a per-device configuration call-back.
Acked-by Angus Clark <angus.clark@st.com>
Signed-off-by: Lee Jones <lee.jones@linaro.org>
Signed-off-by: Brian Norris <computersforpeace@gmail.com>
-rw-r--r-- | drivers/mtd/devices/st_spi_fsm.c | 136 |
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 */ | ||
225 | struct 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 | |||
249 | static 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 | |||
224 | static struct stfsm_seq stfsm_seq_read_jedec = { | 360 | static 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 | |