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