1
2
3
4
5
6
7
8
9
10#ifndef __LINUX_MTD_SPI_NOR_H
11#define __LINUX_MTD_SPI_NOR_H
12
13#include <linux/bitops.h>
14#include <linux/mtd/cfi.h>
15#include <linux/mtd/mtd.h>
16
17
18
19
20
21
22
23#define SNOR_MFR_ATMEL CFI_MFR_ATMEL
24#define SNOR_MFR_GIGADEVICE 0xc8
25#define SNOR_MFR_INTEL CFI_MFR_INTEL
26#define SNOR_MFR_MICRON CFI_MFR_ST
27#define SNOR_MFR_MACRONIX CFI_MFR_MACRONIX
28#define SNOR_MFR_SPANSION CFI_MFR_AMD
29#define SNOR_MFR_SST CFI_MFR_SST
30#define SNOR_MFR_WINBOND 0xef
31#define SNOR_MFR_ISSI CFI_MFR_ISSI
32
33
34
35
36
37
38
39
40
41
42#define SPINOR_OP_WREN 0x06
43#define SPINOR_OP_RDSR 0x05
44#define SPINOR_OP_WRSR 0x01
45#define SPINOR_OP_RDSR2 0x3f
46#define SPINOR_OP_WRSR2 0x3e
47#define SPINOR_OP_READ 0x03
48#define SPINOR_OP_READ_FAST 0x0b
49#define SPINOR_OP_READ_1_1_2 0x3b
50#define SPINOR_OP_READ_1_2_2 0xbb
51#define SPINOR_OP_READ_1_1_4 0x6b
52#define SPINOR_OP_READ_1_4_4 0xeb
53#define SPINOR_OP_PP 0x02
54#define SPINOR_OP_PP_1_1_4 0x32
55#define SPINOR_OP_PP_1_4_4 0x38
56#define SPINOR_OP_BE_4K 0x20
57#define SPINOR_OP_BE_4K_PMC 0xd7
58#define SPINOR_OP_BE_32K 0x52
59#define SPINOR_OP_CHIP_ERASE 0xc7
60#define SPINOR_OP_SE 0xd8
61#define SPINOR_OP_RDID 0x9f
62#define SPINOR_OP_RDSFDP 0x5a
63#define SPINOR_OP_RDCR 0x35
64#define SPINOR_OP_RDFSR 0x70
65#define SPINOR_OP_WREAR 0xc5
66#define SPINOR_OP_RDEAR 0xc8
67
68
69#define SPINOR_OP_READ_4B 0x13
70#define SPINOR_OP_READ_FAST_4B 0x0c
71#define SPINOR_OP_READ_1_1_2_4B 0x3c
72#define SPINOR_OP_READ_1_2_2_4B 0xbc
73#define SPINOR_OP_READ_1_1_4_4B 0x6c
74#define SPINOR_OP_READ_1_4_4_4B 0xec
75#define SPINOR_OP_PP_4B 0x12
76#define SPINOR_OP_PP_1_1_4_4B 0x34
77#define SPINOR_OP_PP_1_4_4_4B 0x3e
78#define SPINOR_OP_BE_4K_4B 0x21
79#define SPINOR_OP_BE_32K_4B 0x5c
80#define SPINOR_OP_SE_4B 0xdc
81
82
83#define SPINOR_OP_READ_1_1_1_DTR 0x0d
84#define SPINOR_OP_READ_1_2_2_DTR 0xbd
85#define SPINOR_OP_READ_1_4_4_DTR 0xed
86
87#define SPINOR_OP_READ_1_1_1_DTR_4B 0x0e
88#define SPINOR_OP_READ_1_2_2_DTR_4B 0xbe
89#define SPINOR_OP_READ_1_4_4_DTR_4B 0xee
90
91
92#define SPINOR_OP_BP 0x02
93#define SPINOR_OP_WRDI 0x04
94#define SPINOR_OP_AAI_WP 0xad
95
96#define GLOBAL_BLKPROT_UNLK 0x98
97
98
99#define SPINOR_OP_XSE 0x50
100#define SPINOR_OP_XPP 0x82
101#define SPINOR_OP_XRDSR 0xd7
102
103#define XSR_PAGESIZE BIT(0)
104#define XSR_RDY BIT(7)
105
106
107#define SPINOR_OP_EN4B 0xb7
108#define SPINOR_OP_EX4B 0xe9
109
110
111#define SPINOR_OP_BRWR 0x17
112#define SPINOR_OP_BRRD 0x16
113#define SPINOR_OP_CLSR 0x30
114
115
116#define SPINOR_OP_RD_EVCR 0x65
117#define SPINOR_OP_WD_EVCR 0x61
118
119
120#define SR_WIP BIT(0)
121#define SR_WEL BIT(1)
122
123#define SR_BP0 BIT(2)
124#define SR_BP1 BIT(3)
125#define SR_BP2 BIT(4)
126#define SR_BP_BIT_OFFSET 2
127#define SR_BP_BIT_MASK (SR_BP2 | SR_BP1 | SR_BP0)
128
129#define SR_TB BIT(5)
130#define SR_SRWD BIT(7)
131#define SR_BP3 0x40
132
133#define SR_BP_TB 0x20
134#define BP_BITS_FROM_SR(sr) (((sr) & SR_BP_BIT_MASK) >> SR_BP_BIT_OFFSET)
135#define M25P_MAX_LOCKABLE_SECTORS 64
136
137
138#define SR_E_ERR BIT(5)
139#define SR_P_ERR BIT(6)
140
141#define SR_QUAD_EN_MX BIT(6)
142
143
144#define EVCR_QUAD_EN_MICRON BIT(7)
145
146
147#define FSR_READY BIT(7)
148
149
150#define CR_QUAD_EN_SPAN BIT(1)
151
152
153#define EAR_SEGMENT_MASK 0x7
154
155enum read_mode {
156 SPI_NOR_NORMAL = 0,
157 SPI_NOR_FAST,
158 SPI_NOR_DUAL,
159 SPI_NOR_QUAD,
160};
161
162
163#define SR2_QUAD_EN_BIT7 BIT(7)
164
165
166#define SNOR_PROTO_INST_MASK GENMASK(23, 16)
167#define SNOR_PROTO_INST_SHIFT 16
168#define SNOR_PROTO_INST(_nbits) \
169 ((((unsigned long)(_nbits)) << SNOR_PROTO_INST_SHIFT) & \
170 SNOR_PROTO_INST_MASK)
171
172#define SNOR_PROTO_ADDR_MASK GENMASK(15, 8)
173#define SNOR_PROTO_ADDR_SHIFT 8
174#define SNOR_PROTO_ADDR(_nbits) \
175 ((((unsigned long)(_nbits)) << SNOR_PROTO_ADDR_SHIFT) & \
176 SNOR_PROTO_ADDR_MASK)
177
178#define SNOR_PROTO_DATA_MASK GENMASK(7, 0)
179#define SNOR_PROTO_DATA_SHIFT 0
180#define SNOR_PROTO_DATA(_nbits) \
181 ((((unsigned long)(_nbits)) << SNOR_PROTO_DATA_SHIFT) & \
182 SNOR_PROTO_DATA_MASK)
183
184#define SNOR_PROTO_IS_DTR BIT(24)
185
186#define SNOR_PROTO_STR(_inst_nbits, _addr_nbits, _data_nbits) \
187 (SNOR_PROTO_INST(_inst_nbits) | \
188 SNOR_PROTO_ADDR(_addr_nbits) | \
189 SNOR_PROTO_DATA(_data_nbits))
190#define SNOR_PROTO_DTR(_inst_nbits, _addr_nbits, _data_nbits) \
191 (SNOR_PROTO_IS_DTR | \
192 SNOR_PROTO_STR(_inst_nbits, _addr_nbits, _data_nbits))
193
194enum spi_nor_protocol {
195 SNOR_PROTO_1_1_1 = SNOR_PROTO_STR(1, 1, 1),
196 SNOR_PROTO_1_1_2 = SNOR_PROTO_STR(1, 1, 2),
197 SNOR_PROTO_1_1_4 = SNOR_PROTO_STR(1, 1, 4),
198 SNOR_PROTO_1_1_8 = SNOR_PROTO_STR(1, 1, 8),
199 SNOR_PROTO_1_2_2 = SNOR_PROTO_STR(1, 2, 2),
200 SNOR_PROTO_1_4_4 = SNOR_PROTO_STR(1, 4, 4),
201 SNOR_PROTO_1_8_8 = SNOR_PROTO_STR(1, 8, 8),
202 SNOR_PROTO_2_2_2 = SNOR_PROTO_STR(2, 2, 2),
203 SNOR_PROTO_4_4_4 = SNOR_PROTO_STR(4, 4, 4),
204 SNOR_PROTO_8_8_8 = SNOR_PROTO_STR(8, 8, 8),
205
206 SNOR_PROTO_1_1_1_DTR = SNOR_PROTO_DTR(1, 1, 1),
207 SNOR_PROTO_1_2_2_DTR = SNOR_PROTO_DTR(1, 2, 2),
208 SNOR_PROTO_1_4_4_DTR = SNOR_PROTO_DTR(1, 4, 4),
209 SNOR_PROTO_1_8_8_DTR = SNOR_PROTO_DTR(1, 8, 8),
210};
211
212static inline bool spi_nor_protocol_is_dtr(enum spi_nor_protocol proto)
213{
214 return !!(proto & SNOR_PROTO_IS_DTR);
215}
216
217static inline u8 spi_nor_get_protocol_inst_nbits(enum spi_nor_protocol proto)
218{
219 return ((unsigned long)(proto & SNOR_PROTO_INST_MASK)) >>
220 SNOR_PROTO_INST_SHIFT;
221}
222
223static inline u8 spi_nor_get_protocol_addr_nbits(enum spi_nor_protocol proto)
224{
225 return ((unsigned long)(proto & SNOR_PROTO_ADDR_MASK)) >>
226 SNOR_PROTO_ADDR_SHIFT;
227}
228
229static inline u8 spi_nor_get_protocol_data_nbits(enum spi_nor_protocol proto)
230{
231 return ((unsigned long)(proto & SNOR_PROTO_DATA_MASK)) >>
232 SNOR_PROTO_DATA_SHIFT;
233}
234
235static inline u8 spi_nor_get_protocol_width(enum spi_nor_protocol proto)
236{
237 return spi_nor_get_protocol_data_nbits(proto);
238}
239
240#define SPI_NOR_MAX_CMD_SIZE 8
241enum spi_nor_ops {
242 SPI_NOR_OPS_READ = 0,
243 SPI_NOR_OPS_WRITE,
244 SPI_NOR_OPS_ERASE,
245 SPI_NOR_OPS_LOCK,
246 SPI_NOR_OPS_UNLOCK,
247};
248
249enum spi_nor_option_flags {
250 SNOR_F_USE_FSR = BIT(0),
251 SNOR_F_HAS_SR_TB = BIT(1),
252 SNOR_F_NO_OP_CHIP_ERASE = BIT(2),
253 SNOR_F_S3AN_ADDR_DEFAULT = BIT(3),
254 SNOR_F_READY_XSR_RDY = BIT(4),
255 SNOR_F_USE_CLSR = BIT(5),
256};
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292struct spi_nor {
293 struct mtd_info mtd;
294 struct mutex lock;
295 struct device *dev;
296 struct spi_device *spi;
297 u32 page_size;
298 u8 addr_width;
299 u8 erase_opcode;
300 u8 read_opcode;
301 u8 read_dummy;
302 u8 program_opcode;
303 enum read_mode flash_read;
304 u32 jedec_id;
305 u16 curbank;
306 u16 n_sectors;
307 u32 sector_size;
308 enum spi_nor_protocol read_proto;
309 enum spi_nor_protocol write_proto;
310 enum spi_nor_protocol reg_proto;
311 bool sst_write_second;
312 bool shift;
313 bool isparallel;
314 bool isstacked;
315 u32 flags;
316 u8 cmd_buf[SPI_NOR_MAX_CMD_SIZE];
317 bool is_lock;
318
319 int (*prepare)(struct spi_nor *nor, enum spi_nor_ops ops);
320 void (*unprepare)(struct spi_nor *nor, enum spi_nor_ops ops);
321 int (*read_reg)(struct spi_nor *nor, u8 opcode, u8 *buf, int len);
322 int (*write_reg)(struct spi_nor *nor, u8 opcode, u8 *buf, int len);
323
324 ssize_t (*read)(struct spi_nor *nor, loff_t from,
325 size_t len, u_char *read_buf);
326 ssize_t (*write)(struct spi_nor *nor, loff_t to,
327 size_t len, const u_char *write_buf);
328 int (*erase)(struct spi_nor *nor, loff_t offs);
329
330 int (*flash_lock)(struct spi_nor *nor, loff_t ofs, uint64_t len);
331 int (*flash_unlock)(struct spi_nor *nor, loff_t ofs, uint64_t len);
332 int (*flash_is_locked)(struct spi_nor *nor, loff_t ofs, uint64_t len);
333
334 void *priv;
335};
336
337static inline void spi_nor_set_flash_node(struct spi_nor *nor,
338 struct device_node *np)
339{
340 mtd_set_of_node(&nor->mtd, np);
341}
342
343static inline struct device_node *spi_nor_get_flash_node(struct spi_nor *nor)
344{
345 return mtd_get_of_node(&nor->mtd);
346}
347
348
349
350
351
352
353struct spi_nor_hwcaps {
354 u32 mask;
355};
356
357
358
359
360
361
362
363
364#define SNOR_HWCAPS_READ_MASK GENMASK(14, 0)
365#define SNOR_HWCAPS_READ BIT(0)
366#define SNOR_HWCAPS_READ_FAST BIT(1)
367#define SNOR_HWCAPS_READ_1_1_1_DTR BIT(2)
368
369#define SNOR_HWCAPS_READ_DUAL GENMASK(6, 3)
370#define SNOR_HWCAPS_READ_1_1_2 BIT(3)
371#define SNOR_HWCAPS_READ_1_2_2 BIT(4)
372#define SNOR_HWCAPS_READ_2_2_2 BIT(5)
373#define SNOR_HWCAPS_READ_1_2_2_DTR BIT(6)
374
375#define SNOR_HWCAPS_READ_QUAD GENMASK(10, 7)
376#define SNOR_HWCAPS_READ_1_1_4 BIT(7)
377#define SNOR_HWCAPS_READ_1_4_4 BIT(8)
378#define SNOR_HWCAPS_READ_4_4_4 BIT(9)
379#define SNOR_HWCAPS_READ_1_4_4_DTR BIT(10)
380
381#define SNOR_HWCPAS_READ_OCTO GENMASK(14, 11)
382#define SNOR_HWCAPS_READ_1_1_8 BIT(11)
383#define SNOR_HWCAPS_READ_1_8_8 BIT(12)
384#define SNOR_HWCAPS_READ_8_8_8 BIT(13)
385#define SNOR_HWCAPS_READ_1_8_8_DTR BIT(14)
386
387
388
389
390
391
392
393
394
395
396#define SNOR_HWCAPS_PP_MASK GENMASK(22, 16)
397#define SNOR_HWCAPS_PP BIT(16)
398
399#define SNOR_HWCAPS_PP_QUAD GENMASK(19, 17)
400#define SNOR_HWCAPS_PP_1_1_4 BIT(17)
401#define SNOR_HWCAPS_PP_1_4_4 BIT(18)
402#define SNOR_HWCAPS_PP_4_4_4 BIT(19)
403
404#define SNOR_HWCAPS_PP_OCTO GENMASK(22, 20)
405#define SNOR_HWCAPS_PP_1_1_8 BIT(20)
406#define SNOR_HWCAPS_PP_1_8_8 BIT(21)
407#define SNOR_HWCAPS_PP_8_8_8 BIT(22)
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423int spi_nor_scan(struct spi_nor *nor, const char *name,
424 const struct spi_nor_hwcaps *hwcaps);
425
426
427
428
429
430
431
432
433void spi_nor_shutdown(struct spi_nor *nor);
434
435#endif
436