1
2
3
4
5
6
7#ifndef __LINUX_MTD_SPI_NOR_H
8#define __LINUX_MTD_SPI_NOR_H
9
10#include <linux/bitops.h>
11#include <linux/mtd/cfi.h>
12#include <linux/mtd/mtd.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_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_RDSFDP 0x5a
60#define SPINOR_OP_RDCR 0x35
61#define SPINOR_OP_RDFSR 0x70
62#define SPINOR_OP_CLFSR 0x50
63#define SPINOR_OP_RDEAR 0xc8
64#define SPINOR_OP_WREAR 0xc5
65
66
67#define SPINOR_OP_READ_4B 0x13
68#define SPINOR_OP_READ_FAST_4B 0x0c
69#define SPINOR_OP_READ_1_1_2_4B 0x3c
70#define SPINOR_OP_READ_1_2_2_4B 0xbc
71#define SPINOR_OP_READ_1_1_4_4B 0x6c
72#define SPINOR_OP_READ_1_4_4_4B 0xec
73#define SPINOR_OP_PP_4B 0x12
74#define SPINOR_OP_PP_1_1_4_4B 0x34
75#define SPINOR_OP_PP_1_4_4_4B 0x3e
76#define SPINOR_OP_BE_4K_4B 0x21
77#define SPINOR_OP_BE_32K_4B 0x5c
78#define SPINOR_OP_SE_4B 0xdc
79
80
81#define SPINOR_OP_READ_1_1_1_DTR 0x0d
82#define SPINOR_OP_READ_1_2_2_DTR 0xbd
83#define SPINOR_OP_READ_1_4_4_DTR 0xed
84
85#define SPINOR_OP_READ_1_1_1_DTR_4B 0x0e
86#define SPINOR_OP_READ_1_2_2_DTR_4B 0xbe
87#define SPINOR_OP_READ_1_4_4_DTR_4B 0xee
88
89
90#define SPINOR_OP_BP 0x02
91#define SPINOR_OP_WRDI 0x04
92#define SPINOR_OP_AAI_WP 0xad
93
94
95#define SPINOR_OP_READ_BPR 0x72
96#define SPINOR_OP_WRITE_BPR 0x42
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_TB BIT(5)
127#define SR_SRWD BIT(7)
128
129#define SR_E_ERR BIT(5)
130#define SR_P_ERR BIT(6)
131
132#define SR_QUAD_EN_MX BIT(6)
133
134
135#define EVCR_QUAD_EN_MICRON BIT(7)
136
137
138#define FSR_READY BIT(7)
139#define FSR_E_ERR BIT(5)
140#define FSR_P_ERR BIT(4)
141#define FSR_PT_ERR BIT(1)
142
143
144#define CR_QUAD_EN_SPAN BIT(1)
145
146
147#define SR2_QUAD_EN_BIT7 BIT(7)
148
149
150#define SNOR_PROTO_INST_MASK GENMASK(23, 16)
151#define SNOR_PROTO_INST_SHIFT 16
152#define SNOR_PROTO_INST(_nbits) \
153 ((((unsigned long)(_nbits)) << SNOR_PROTO_INST_SHIFT) & \
154 SNOR_PROTO_INST_MASK)
155
156#define SNOR_PROTO_ADDR_MASK GENMASK(15, 8)
157#define SNOR_PROTO_ADDR_SHIFT 8
158#define SNOR_PROTO_ADDR(_nbits) \
159 ((((unsigned long)(_nbits)) << SNOR_PROTO_ADDR_SHIFT) & \
160 SNOR_PROTO_ADDR_MASK)
161
162#define SNOR_PROTO_DATA_MASK GENMASK(7, 0)
163#define SNOR_PROTO_DATA_SHIFT 0
164#define SNOR_PROTO_DATA(_nbits) \
165 ((((unsigned long)(_nbits)) << SNOR_PROTO_DATA_SHIFT) & \
166 SNOR_PROTO_DATA_MASK)
167
168#define SNOR_PROTO_IS_DTR BIT(24)
169
170#define SNOR_PROTO_STR(_inst_nbits, _addr_nbits, _data_nbits) \
171 (SNOR_PROTO_INST(_inst_nbits) | \
172 SNOR_PROTO_ADDR(_addr_nbits) | \
173 SNOR_PROTO_DATA(_data_nbits))
174#define SNOR_PROTO_DTR(_inst_nbits, _addr_nbits, _data_nbits) \
175 (SNOR_PROTO_IS_DTR | \
176 SNOR_PROTO_STR(_inst_nbits, _addr_nbits, _data_nbits))
177
178enum spi_nor_protocol {
179 SNOR_PROTO_1_1_1 = SNOR_PROTO_STR(1, 1, 1),
180 SNOR_PROTO_1_1_2 = SNOR_PROTO_STR(1, 1, 2),
181 SNOR_PROTO_1_1_4 = SNOR_PROTO_STR(1, 1, 4),
182 SNOR_PROTO_1_1_8 = SNOR_PROTO_STR(1, 1, 8),
183 SNOR_PROTO_1_2_2 = SNOR_PROTO_STR(1, 2, 2),
184 SNOR_PROTO_1_4_4 = SNOR_PROTO_STR(1, 4, 4),
185 SNOR_PROTO_1_8_8 = SNOR_PROTO_STR(1, 8, 8),
186 SNOR_PROTO_2_2_2 = SNOR_PROTO_STR(2, 2, 2),
187 SNOR_PROTO_4_4_4 = SNOR_PROTO_STR(4, 4, 4),
188 SNOR_PROTO_8_8_8 = SNOR_PROTO_STR(8, 8, 8),
189
190 SNOR_PROTO_1_1_1_DTR = SNOR_PROTO_DTR(1, 1, 1),
191 SNOR_PROTO_1_2_2_DTR = SNOR_PROTO_DTR(1, 2, 2),
192 SNOR_PROTO_1_4_4_DTR = SNOR_PROTO_DTR(1, 4, 4),
193 SNOR_PROTO_1_8_8_DTR = SNOR_PROTO_DTR(1, 8, 8),
194};
195
196static inline bool spi_nor_protocol_is_dtr(enum spi_nor_protocol proto)
197{
198 return !!(proto & SNOR_PROTO_IS_DTR);
199}
200
201static inline u8 spi_nor_get_protocol_inst_nbits(enum spi_nor_protocol proto)
202{
203 return ((unsigned long)(proto & SNOR_PROTO_INST_MASK)) >>
204 SNOR_PROTO_INST_SHIFT;
205}
206
207static inline u8 spi_nor_get_protocol_addr_nbits(enum spi_nor_protocol proto)
208{
209 return ((unsigned long)(proto & SNOR_PROTO_ADDR_MASK)) >>
210 SNOR_PROTO_ADDR_SHIFT;
211}
212
213static inline u8 spi_nor_get_protocol_data_nbits(enum spi_nor_protocol proto)
214{
215 return ((unsigned long)(proto & SNOR_PROTO_DATA_MASK)) >>
216 SNOR_PROTO_DATA_SHIFT;
217}
218
219static inline u8 spi_nor_get_protocol_width(enum spi_nor_protocol proto)
220{
221 return spi_nor_get_protocol_data_nbits(proto);
222}
223
224#define SPI_NOR_MAX_CMD_SIZE 8
225enum spi_nor_ops {
226 SPI_NOR_OPS_READ = 0,
227 SPI_NOR_OPS_WRITE,
228 SPI_NOR_OPS_ERASE,
229 SPI_NOR_OPS_LOCK,
230 SPI_NOR_OPS_UNLOCK,
231};
232
233enum spi_nor_option_flags {
234 SNOR_F_USE_FSR = BIT(0),
235 SNOR_F_HAS_SR_TB = BIT(1),
236 SNOR_F_NO_OP_CHIP_ERASE = BIT(2),
237 SNOR_F_S3AN_ADDR_DEFAULT = BIT(3),
238 SNOR_F_READY_XSR_RDY = BIT(4),
239 SNOR_F_USE_CLSR = BIT(5),
240 SNOR_F_BROKEN_RESET = BIT(6),
241};
242
243
244
245
246
247struct flash_info;
248
249
250
251
252
253
254
255
256#define spi_flash spi_nor
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
292
293
294
295
296
297struct spi_nor {
298 struct mtd_info mtd;
299 struct udevice *dev;
300 struct spi_slave *spi;
301 const struct flash_info *info;
302 u32 page_size;
303 u8 addr_width;
304 u8 erase_opcode;
305 u8 read_opcode;
306 u8 read_dummy;
307 u8 program_opcode;
308#ifdef CONFIG_SPI_FLASH_BAR
309 u8 bank_read_cmd;
310 u8 bank_write_cmd;
311 u8 bank_curr;
312#endif
313 enum spi_nor_protocol read_proto;
314 enum spi_nor_protocol write_proto;
315 enum spi_nor_protocol reg_proto;
316 bool sst_write_second;
317 u32 flags;
318 u8 cmd_buf[SPI_NOR_MAX_CMD_SIZE];
319
320 int (*prepare)(struct spi_nor *nor, enum spi_nor_ops ops);
321 void (*unprepare)(struct spi_nor *nor, enum spi_nor_ops ops);
322 int (*read_reg)(struct spi_nor *nor, u8 opcode, u8 *buf, int len);
323 int (*write_reg)(struct spi_nor *nor, u8 opcode, u8 *buf, int len);
324
325 ssize_t (*read)(struct spi_nor *nor, loff_t from,
326 size_t len, u_char *read_buf);
327 ssize_t (*write)(struct spi_nor *nor, loff_t to,
328 size_t len, const u_char *write_buf);
329 int (*erase)(struct spi_nor *nor, loff_t offs);
330
331 int (*flash_lock)(struct spi_nor *nor, loff_t ofs, uint64_t len);
332 int (*flash_unlock)(struct spi_nor *nor, loff_t ofs, uint64_t len);
333 int (*flash_is_locked)(struct spi_nor *nor, loff_t ofs, uint64_t len);
334 int (*quad_enable)(struct spi_nor *nor);
335
336 void *priv;
337
338 const char *name;
339 u32 size;
340 u32 sector_size;
341 u32 erase_size;
342};
343
344static inline void spi_nor_set_flash_node(struct spi_nor *nor,
345 const struct device_node *np)
346{
347 mtd_set_of_node(&nor->mtd, np);
348}
349
350static inline const struct
351device_node *spi_nor_get_flash_node(struct spi_nor *nor)
352{
353 return mtd_get_of_node(&nor->mtd);
354}
355
356
357
358
359
360
361struct spi_nor_hwcaps {
362 u32 mask;
363};
364
365
366
367
368
369
370
371
372#define SNOR_HWCAPS_READ_MASK GENMASK(14, 0)
373#define SNOR_HWCAPS_READ BIT(0)
374#define SNOR_HWCAPS_READ_FAST BIT(1)
375#define SNOR_HWCAPS_READ_1_1_1_DTR BIT(2)
376
377#define SNOR_HWCAPS_READ_DUAL GENMASK(6, 3)
378#define SNOR_HWCAPS_READ_1_1_2 BIT(3)
379#define SNOR_HWCAPS_READ_1_2_2 BIT(4)
380#define SNOR_HWCAPS_READ_2_2_2 BIT(5)
381#define SNOR_HWCAPS_READ_1_2_2_DTR BIT(6)
382
383#define SNOR_HWCAPS_READ_QUAD GENMASK(10, 7)
384#define SNOR_HWCAPS_READ_1_1_4 BIT(7)
385#define SNOR_HWCAPS_READ_1_4_4 BIT(8)
386#define SNOR_HWCAPS_READ_4_4_4 BIT(9)
387#define SNOR_HWCAPS_READ_1_4_4_DTR BIT(10)
388
389#define SNOR_HWCPAS_READ_OCTO GENMASK(14, 11)
390#define SNOR_HWCAPS_READ_1_1_8 BIT(11)
391#define SNOR_HWCAPS_READ_1_8_8 BIT(12)
392#define SNOR_HWCAPS_READ_8_8_8 BIT(13)
393#define SNOR_HWCAPS_READ_1_8_8_DTR BIT(14)
394
395
396
397
398
399
400
401
402
403
404#define SNOR_HWCAPS_PP_MASK GENMASK(22, 16)
405#define SNOR_HWCAPS_PP BIT(16)
406
407#define SNOR_HWCAPS_PP_QUAD GENMASK(19, 17)
408#define SNOR_HWCAPS_PP_1_1_4 BIT(17)
409#define SNOR_HWCAPS_PP_1_4_4 BIT(18)
410#define SNOR_HWCAPS_PP_4_4_4 BIT(19)
411
412#define SNOR_HWCAPS_PP_OCTO GENMASK(22, 20)
413#define SNOR_HWCAPS_PP_1_1_8 BIT(20)
414#define SNOR_HWCAPS_PP_1_8_8 BIT(21)
415#define SNOR_HWCAPS_PP_8_8_8 BIT(22)
416
417
418
419
420
421
422
423
424
425
426
427int spi_nor_scan(struct spi_nor *nor);
428
429#endif
430