This source file includes following definitions.
- spi_nor_protocol_is_dtr
- spi_nor_get_protocol_inst_nbits
- spi_nor_get_protocol_addr_nbits
- spi_nor_get_protocol_data_nbits
- spi_nor_get_protocol_width
- spi_nor_region_is_last
- spi_nor_region_end
- spi_nor_region_mark_end
- spi_nor_region_mark_overlay
- spi_nor_has_uniform_erase
- spi_nor_set_flash_node
- spi_nor_get_flash_node
1
2
3
4
5
6 #ifndef __LINUX_MTD_SPI_NOR_H
7 #define __LINUX_MTD_SPI_NOR_H
8
9 #include <linux/bitops.h>
10 #include <linux/mtd/cfi.h>
11 #include <linux/mtd/mtd.h>
12 #include <linux/spi/spi-mem.h>
13
14
15
16
17
18
19
20 #define SNOR_MFR_ATMEL CFI_MFR_ATMEL
21 #define SNOR_MFR_GIGADEVICE 0xc8
22 #define SNOR_MFR_INTEL CFI_MFR_INTEL
23 #define SNOR_MFR_ST CFI_MFR_ST
24 #define SNOR_MFR_MICRON CFI_MFR_MICRON
25 #define SNOR_MFR_MACRONIX CFI_MFR_MACRONIX
26 #define SNOR_MFR_SPANSION CFI_MFR_AMD
27 #define SNOR_MFR_SST CFI_MFR_SST
28 #define SNOR_MFR_WINBOND 0xef
29
30
31
32
33
34
35
36
37
38
39 #define SPINOR_OP_WREN 0x06
40 #define SPINOR_OP_RDSR 0x05
41 #define SPINOR_OP_WRSR 0x01
42 #define SPINOR_OP_RDSR2 0x3f
43 #define SPINOR_OP_WRSR2 0x3e
44 #define SPINOR_OP_READ 0x03
45 #define SPINOR_OP_READ_FAST 0x0b
46 #define SPINOR_OP_READ_1_1_2 0x3b
47 #define SPINOR_OP_READ_1_2_2 0xbb
48 #define SPINOR_OP_READ_1_1_4 0x6b
49 #define SPINOR_OP_READ_1_4_4 0xeb
50 #define SPINOR_OP_READ_1_1_8 0x8b
51 #define SPINOR_OP_READ_1_8_8 0xcb
52 #define SPINOR_OP_PP 0x02
53 #define SPINOR_OP_PP_1_1_4 0x32
54 #define SPINOR_OP_PP_1_4_4 0x38
55 #define SPINOR_OP_PP_1_1_8 0x82
56 #define SPINOR_OP_PP_1_8_8 0xc2
57 #define SPINOR_OP_BE_4K 0x20
58 #define SPINOR_OP_BE_4K_PMC 0xd7
59 #define SPINOR_OP_BE_32K 0x52
60 #define SPINOR_OP_CHIP_ERASE 0xc7
61 #define SPINOR_OP_SE 0xd8
62 #define SPINOR_OP_RDID 0x9f
63 #define SPINOR_OP_RDSFDP 0x5a
64 #define SPINOR_OP_RDCR 0x35
65 #define SPINOR_OP_RDFSR 0x70
66 #define SPINOR_OP_CLFSR 0x50
67 #define SPINOR_OP_RDEAR 0xc8
68 #define SPINOR_OP_WREAR 0xc5
69
70
71 #define SPINOR_OP_READ_4B 0x13
72 #define SPINOR_OP_READ_FAST_4B 0x0c
73 #define SPINOR_OP_READ_1_1_2_4B 0x3c
74 #define SPINOR_OP_READ_1_2_2_4B 0xbc
75 #define SPINOR_OP_READ_1_1_4_4B 0x6c
76 #define SPINOR_OP_READ_1_4_4_4B 0xec
77 #define SPINOR_OP_READ_1_1_8_4B 0x7c
78 #define SPINOR_OP_READ_1_8_8_4B 0xcc
79 #define SPINOR_OP_PP_4B 0x12
80 #define SPINOR_OP_PP_1_1_4_4B 0x34
81 #define SPINOR_OP_PP_1_4_4_4B 0x3e
82 #define SPINOR_OP_PP_1_1_8_4B 0x84
83 #define SPINOR_OP_PP_1_8_8_4B 0x8e
84 #define SPINOR_OP_BE_4K_4B 0x21
85 #define SPINOR_OP_BE_32K_4B 0x5c
86 #define SPINOR_OP_SE_4B 0xdc
87
88
89 #define SPINOR_OP_READ_1_1_1_DTR 0x0d
90 #define SPINOR_OP_READ_1_2_2_DTR 0xbd
91 #define SPINOR_OP_READ_1_4_4_DTR 0xed
92
93 #define SPINOR_OP_READ_1_1_1_DTR_4B 0x0e
94 #define SPINOR_OP_READ_1_2_2_DTR_4B 0xbe
95 #define SPINOR_OP_READ_1_4_4_DTR_4B 0xee
96
97
98 #define SPINOR_OP_BP 0x02
99 #define SPINOR_OP_WRDI 0x04
100 #define SPINOR_OP_AAI_WP 0xad
101
102
103 #define SPINOR_OP_XSE 0x50
104 #define SPINOR_OP_XPP 0x82
105 #define SPINOR_OP_XRDSR 0xd7
106
107 #define XSR_PAGESIZE BIT(0)
108 #define XSR_RDY BIT(7)
109
110
111
112 #define SPINOR_OP_EN4B 0xb7
113 #define SPINOR_OP_EX4B 0xe9
114
115
116 #define SPINOR_OP_BRWR 0x17
117 #define SPINOR_OP_CLSR 0x30
118
119
120 #define SPINOR_OP_RD_EVCR 0x65
121 #define SPINOR_OP_WD_EVCR 0x61
122
123
124 #define SR_WIP BIT(0)
125 #define SR_WEL BIT(1)
126
127 #define SR_BP0 BIT(2)
128 #define SR_BP1 BIT(3)
129 #define SR_BP2 BIT(4)
130 #define SR_TB BIT(5)
131 #define SR_SRWD BIT(7)
132
133 #define SR_E_ERR BIT(5)
134 #define SR_P_ERR BIT(6)
135
136 #define SR_QUAD_EN_MX BIT(6)
137
138
139 #define EVCR_QUAD_EN_MICRON BIT(7)
140
141
142 #define FSR_READY BIT(7)
143 #define FSR_E_ERR BIT(5)
144 #define FSR_P_ERR BIT(4)
145 #define FSR_PT_ERR BIT(1)
146
147
148 #define CR_QUAD_EN_SPAN BIT(1)
149
150
151 #define SR2_QUAD_EN_BIT7 BIT(7)
152
153
154 #define SNOR_PROTO_INST_MASK GENMASK(23, 16)
155 #define SNOR_PROTO_INST_SHIFT 16
156 #define SNOR_PROTO_INST(_nbits) \
157 ((((unsigned long)(_nbits)) << SNOR_PROTO_INST_SHIFT) & \
158 SNOR_PROTO_INST_MASK)
159
160 #define SNOR_PROTO_ADDR_MASK GENMASK(15, 8)
161 #define SNOR_PROTO_ADDR_SHIFT 8
162 #define SNOR_PROTO_ADDR(_nbits) \
163 ((((unsigned long)(_nbits)) << SNOR_PROTO_ADDR_SHIFT) & \
164 SNOR_PROTO_ADDR_MASK)
165
166 #define SNOR_PROTO_DATA_MASK GENMASK(7, 0)
167 #define SNOR_PROTO_DATA_SHIFT 0
168 #define SNOR_PROTO_DATA(_nbits) \
169 ((((unsigned long)(_nbits)) << SNOR_PROTO_DATA_SHIFT) & \
170 SNOR_PROTO_DATA_MASK)
171
172 #define SNOR_PROTO_IS_DTR BIT(24)
173
174 #define SNOR_PROTO_STR(_inst_nbits, _addr_nbits, _data_nbits) \
175 (SNOR_PROTO_INST(_inst_nbits) | \
176 SNOR_PROTO_ADDR(_addr_nbits) | \
177 SNOR_PROTO_DATA(_data_nbits))
178 #define SNOR_PROTO_DTR(_inst_nbits, _addr_nbits, _data_nbits) \
179 (SNOR_PROTO_IS_DTR | \
180 SNOR_PROTO_STR(_inst_nbits, _addr_nbits, _data_nbits))
181
182 enum spi_nor_protocol {
183 SNOR_PROTO_1_1_1 = SNOR_PROTO_STR(1, 1, 1),
184 SNOR_PROTO_1_1_2 = SNOR_PROTO_STR(1, 1, 2),
185 SNOR_PROTO_1_1_4 = SNOR_PROTO_STR(1, 1, 4),
186 SNOR_PROTO_1_1_8 = SNOR_PROTO_STR(1, 1, 8),
187 SNOR_PROTO_1_2_2 = SNOR_PROTO_STR(1, 2, 2),
188 SNOR_PROTO_1_4_4 = SNOR_PROTO_STR(1, 4, 4),
189 SNOR_PROTO_1_8_8 = SNOR_PROTO_STR(1, 8, 8),
190 SNOR_PROTO_2_2_2 = SNOR_PROTO_STR(2, 2, 2),
191 SNOR_PROTO_4_4_4 = SNOR_PROTO_STR(4, 4, 4),
192 SNOR_PROTO_8_8_8 = SNOR_PROTO_STR(8, 8, 8),
193
194 SNOR_PROTO_1_1_1_DTR = SNOR_PROTO_DTR(1, 1, 1),
195 SNOR_PROTO_1_2_2_DTR = SNOR_PROTO_DTR(1, 2, 2),
196 SNOR_PROTO_1_4_4_DTR = SNOR_PROTO_DTR(1, 4, 4),
197 SNOR_PROTO_1_8_8_DTR = SNOR_PROTO_DTR(1, 8, 8),
198 };
199
200 static inline bool spi_nor_protocol_is_dtr(enum spi_nor_protocol proto)
201 {
202 return !!(proto & SNOR_PROTO_IS_DTR);
203 }
204
205 static inline u8 spi_nor_get_protocol_inst_nbits(enum spi_nor_protocol proto)
206 {
207 return ((unsigned long)(proto & SNOR_PROTO_INST_MASK)) >>
208 SNOR_PROTO_INST_SHIFT;
209 }
210
211 static inline u8 spi_nor_get_protocol_addr_nbits(enum spi_nor_protocol proto)
212 {
213 return ((unsigned long)(proto & SNOR_PROTO_ADDR_MASK)) >>
214 SNOR_PROTO_ADDR_SHIFT;
215 }
216
217 static inline u8 spi_nor_get_protocol_data_nbits(enum spi_nor_protocol proto)
218 {
219 return ((unsigned long)(proto & SNOR_PROTO_DATA_MASK)) >>
220 SNOR_PROTO_DATA_SHIFT;
221 }
222
223 static inline u8 spi_nor_get_protocol_width(enum spi_nor_protocol proto)
224 {
225 return spi_nor_get_protocol_data_nbits(proto);
226 }
227
228 enum spi_nor_ops {
229 SPI_NOR_OPS_READ = 0,
230 SPI_NOR_OPS_WRITE,
231 SPI_NOR_OPS_ERASE,
232 SPI_NOR_OPS_LOCK,
233 SPI_NOR_OPS_UNLOCK,
234 };
235
236 enum spi_nor_option_flags {
237 SNOR_F_USE_FSR = BIT(0),
238 SNOR_F_HAS_SR_TB = BIT(1),
239 SNOR_F_NO_OP_CHIP_ERASE = BIT(2),
240 SNOR_F_READY_XSR_RDY = BIT(3),
241 SNOR_F_USE_CLSR = BIT(4),
242 SNOR_F_BROKEN_RESET = BIT(5),
243 SNOR_F_4B_OPCODES = BIT(6),
244 SNOR_F_HAS_4BAIT = BIT(7),
245 SNOR_F_HAS_LOCK = BIT(8),
246 };
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261 struct spi_nor_erase_type {
262 u32 size;
263 u32 size_shift;
264 u32 size_mask;
265 u8 opcode;
266 u8 idx;
267 };
268
269
270
271
272
273
274
275
276
277
278
279
280 struct spi_nor_erase_command {
281 struct list_head list;
282 u32 count;
283 u32 size;
284 u8 opcode;
285 };
286
287
288
289
290
291
292
293
294
295
296
297
298 struct spi_nor_erase_region {
299 u64 offset;
300 u64 size;
301 };
302
303 #define SNOR_ERASE_TYPE_MAX 4
304 #define SNOR_ERASE_TYPE_MASK GENMASK_ULL(SNOR_ERASE_TYPE_MAX - 1, 0)
305
306 #define SNOR_LAST_REGION BIT(4)
307 #define SNOR_OVERLAID_REGION BIT(5)
308
309 #define SNOR_ERASE_FLAGS_MAX 6
310 #define SNOR_ERASE_FLAGS_MASK GENMASK_ULL(SNOR_ERASE_FLAGS_MAX - 1, 0)
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329 struct spi_nor_erase_map {
330 struct spi_nor_erase_region *regions;
331 struct spi_nor_erase_region uniform_region;
332 struct spi_nor_erase_type erase_type[SNOR_ERASE_TYPE_MAX];
333 u8 uniform_erase_type;
334 };
335
336
337
338
339
340
341 struct spi_nor_hwcaps {
342 u32 mask;
343 };
344
345
346
347
348
349
350
351
352 #define SNOR_HWCAPS_READ_MASK GENMASK(14, 0)
353 #define SNOR_HWCAPS_READ BIT(0)
354 #define SNOR_HWCAPS_READ_FAST BIT(1)
355 #define SNOR_HWCAPS_READ_1_1_1_DTR BIT(2)
356
357 #define SNOR_HWCAPS_READ_DUAL GENMASK(6, 3)
358 #define SNOR_HWCAPS_READ_1_1_2 BIT(3)
359 #define SNOR_HWCAPS_READ_1_2_2 BIT(4)
360 #define SNOR_HWCAPS_READ_2_2_2 BIT(5)
361 #define SNOR_HWCAPS_READ_1_2_2_DTR BIT(6)
362
363 #define SNOR_HWCAPS_READ_QUAD GENMASK(10, 7)
364 #define SNOR_HWCAPS_READ_1_1_4 BIT(7)
365 #define SNOR_HWCAPS_READ_1_4_4 BIT(8)
366 #define SNOR_HWCAPS_READ_4_4_4 BIT(9)
367 #define SNOR_HWCAPS_READ_1_4_4_DTR BIT(10)
368
369 #define SNOR_HWCAPS_READ_OCTAL GENMASK(14, 11)
370 #define SNOR_HWCAPS_READ_1_1_8 BIT(11)
371 #define SNOR_HWCAPS_READ_1_8_8 BIT(12)
372 #define SNOR_HWCAPS_READ_8_8_8 BIT(13)
373 #define SNOR_HWCAPS_READ_1_8_8_DTR BIT(14)
374
375
376
377
378
379
380
381
382
383
384 #define SNOR_HWCAPS_PP_MASK GENMASK(22, 16)
385 #define SNOR_HWCAPS_PP BIT(16)
386
387 #define SNOR_HWCAPS_PP_QUAD GENMASK(19, 17)
388 #define SNOR_HWCAPS_PP_1_1_4 BIT(17)
389 #define SNOR_HWCAPS_PP_1_4_4 BIT(18)
390 #define SNOR_HWCAPS_PP_4_4_4 BIT(19)
391
392 #define SNOR_HWCAPS_PP_OCTAL GENMASK(22, 20)
393 #define SNOR_HWCAPS_PP_1_1_8 BIT(20)
394 #define SNOR_HWCAPS_PP_1_8_8 BIT(21)
395 #define SNOR_HWCAPS_PP_8_8_8 BIT(22)
396
397 #define SNOR_HWCAPS_X_X_X (SNOR_HWCAPS_READ_2_2_2 | \
398 SNOR_HWCAPS_READ_4_4_4 | \
399 SNOR_HWCAPS_READ_8_8_8 | \
400 SNOR_HWCAPS_PP_4_4_4 | \
401 SNOR_HWCAPS_PP_8_8_8)
402
403 #define SNOR_HWCAPS_DTR (SNOR_HWCAPS_READ_1_1_1_DTR | \
404 SNOR_HWCAPS_READ_1_2_2_DTR | \
405 SNOR_HWCAPS_READ_1_4_4_DTR | \
406 SNOR_HWCAPS_READ_1_8_8_DTR)
407
408 #define SNOR_HWCAPS_ALL (SNOR_HWCAPS_READ_MASK | \
409 SNOR_HWCAPS_PP_MASK)
410
411 struct spi_nor_read_command {
412 u8 num_mode_clocks;
413 u8 num_wait_states;
414 u8 opcode;
415 enum spi_nor_protocol proto;
416 };
417
418 struct spi_nor_pp_command {
419 u8 opcode;
420 enum spi_nor_protocol proto;
421 };
422
423 enum spi_nor_read_command_index {
424 SNOR_CMD_READ,
425 SNOR_CMD_READ_FAST,
426 SNOR_CMD_READ_1_1_1_DTR,
427
428
429 SNOR_CMD_READ_1_1_2,
430 SNOR_CMD_READ_1_2_2,
431 SNOR_CMD_READ_2_2_2,
432 SNOR_CMD_READ_1_2_2_DTR,
433
434
435 SNOR_CMD_READ_1_1_4,
436 SNOR_CMD_READ_1_4_4,
437 SNOR_CMD_READ_4_4_4,
438 SNOR_CMD_READ_1_4_4_DTR,
439
440
441 SNOR_CMD_READ_1_1_8,
442 SNOR_CMD_READ_1_8_8,
443 SNOR_CMD_READ_8_8_8,
444 SNOR_CMD_READ_1_8_8_DTR,
445
446 SNOR_CMD_READ_MAX
447 };
448
449 enum spi_nor_pp_command_index {
450 SNOR_CMD_PP,
451
452
453 SNOR_CMD_PP_1_1_4,
454 SNOR_CMD_PP_1_4_4,
455 SNOR_CMD_PP_4_4_4,
456
457
458 SNOR_CMD_PP_1_1_8,
459 SNOR_CMD_PP_1_8_8,
460 SNOR_CMD_PP_8_8_8,
461
462 SNOR_CMD_PP_MAX
463 };
464
465
466 struct spi_nor;
467
468
469
470
471
472
473
474 struct spi_nor_locking_ops {
475 int (*lock)(struct spi_nor *nor, loff_t ofs, uint64_t len);
476 int (*unlock)(struct spi_nor *nor, loff_t ofs, uint64_t len);
477 int (*is_locked)(struct spi_nor *nor, loff_t ofs, uint64_t len);
478 };
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507 struct spi_nor_flash_parameter {
508 u64 size;
509 u32 page_size;
510
511 struct spi_nor_hwcaps hwcaps;
512 struct spi_nor_read_command reads[SNOR_CMD_READ_MAX];
513 struct spi_nor_pp_command page_programs[SNOR_CMD_PP_MAX];
514
515 struct spi_nor_erase_map erase_map;
516
517 int (*quad_enable)(struct spi_nor *nor);
518 int (*set_4byte)(struct spi_nor *nor, bool enable);
519 u32 (*convert_addr)(struct spi_nor *nor, u32 addr);
520 int (*setup)(struct spi_nor *nor, const struct spi_nor_hwcaps *hwcaps);
521
522 const struct spi_nor_locking_ops *locking_ops;
523 };
524
525
526
527
528
529 struct flash_info;
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571 struct spi_nor {
572 struct mtd_info mtd;
573 struct mutex lock;
574 struct device *dev;
575 struct spi_mem *spimem;
576 u8 *bouncebuf;
577 size_t bouncebuf_size;
578 const struct flash_info *info;
579 u32 page_size;
580 u8 addr_width;
581 u8 erase_opcode;
582 u8 read_opcode;
583 u8 read_dummy;
584 u8 program_opcode;
585 enum spi_nor_protocol read_proto;
586 enum spi_nor_protocol write_proto;
587 enum spi_nor_protocol reg_proto;
588 bool sst_write_second;
589 u32 flags;
590
591 int (*prepare)(struct spi_nor *nor, enum spi_nor_ops ops);
592 void (*unprepare)(struct spi_nor *nor, enum spi_nor_ops ops);
593 int (*read_reg)(struct spi_nor *nor, u8 opcode, u8 *buf, int len);
594 int (*write_reg)(struct spi_nor *nor, u8 opcode, u8 *buf, int len);
595
596 ssize_t (*read)(struct spi_nor *nor, loff_t from,
597 size_t len, u_char *read_buf);
598 ssize_t (*write)(struct spi_nor *nor, loff_t to,
599 size_t len, const u_char *write_buf);
600 int (*erase)(struct spi_nor *nor, loff_t offs);
601
602 int (*clear_sr_bp)(struct spi_nor *nor);
603 struct spi_nor_flash_parameter params;
604
605 void *priv;
606 };
607
608 static u64 __maybe_unused
609 spi_nor_region_is_last(const struct spi_nor_erase_region *region)
610 {
611 return region->offset & SNOR_LAST_REGION;
612 }
613
614 static u64 __maybe_unused
615 spi_nor_region_end(const struct spi_nor_erase_region *region)
616 {
617 return (region->offset & ~SNOR_ERASE_FLAGS_MASK) + region->size;
618 }
619
620 static void __maybe_unused
621 spi_nor_region_mark_end(struct spi_nor_erase_region *region)
622 {
623 region->offset |= SNOR_LAST_REGION;
624 }
625
626 static void __maybe_unused
627 spi_nor_region_mark_overlay(struct spi_nor_erase_region *region)
628 {
629 region->offset |= SNOR_OVERLAID_REGION;
630 }
631
632 static bool __maybe_unused spi_nor_has_uniform_erase(const struct spi_nor *nor)
633 {
634 return !!nor->params.erase_map.uniform_erase_type;
635 }
636
637 static inline void spi_nor_set_flash_node(struct spi_nor *nor,
638 struct device_node *np)
639 {
640 mtd_set_of_node(&nor->mtd, np);
641 }
642
643 static inline struct device_node *spi_nor_get_flash_node(struct spi_nor *nor)
644 {
645 return mtd_get_of_node(&nor->mtd);
646 }
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662 int spi_nor_scan(struct spi_nor *nor, const char *name,
663 const struct spi_nor_hwcaps *hwcaps);
664
665
666
667
668
669 void spi_nor_restore(struct spi_nor *nor);
670
671 #endif