1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * Copyright (C) 2014 Freescale Semiconductor, Inc.
4*4882a593Smuzhiyun * Synced from Linux v4.19
5*4882a593Smuzhiyun */
6*4882a593Smuzhiyun
7*4882a593Smuzhiyun #ifndef __LINUX_MTD_SPI_NOR_H
8*4882a593Smuzhiyun #define __LINUX_MTD_SPI_NOR_H
9*4882a593Smuzhiyun
10*4882a593Smuzhiyun #include <linux/bitops.h>
11*4882a593Smuzhiyun #include <linux/mtd/cfi.h>
12*4882a593Smuzhiyun #include <linux/mtd/mtd.h>
13*4882a593Smuzhiyun
14*4882a593Smuzhiyun /*
15*4882a593Smuzhiyun * Manufacturer IDs
16*4882a593Smuzhiyun *
17*4882a593Smuzhiyun * The first byte returned from the flash after sending opcode SPINOR_OP_RDID.
18*4882a593Smuzhiyun * Sometimes these are the same as CFI IDs, but sometimes they aren't.
19*4882a593Smuzhiyun */
20*4882a593Smuzhiyun #define SNOR_MFR_ATMEL CFI_MFR_ATMEL
21*4882a593Smuzhiyun #define SNOR_MFR_GIGADEVICE 0xc8
22*4882a593Smuzhiyun #define SNOR_MFR_INTEL CFI_MFR_INTEL
23*4882a593Smuzhiyun #define SNOR_MFR_ST CFI_MFR_ST /* ST Micro <--> Micron */
24*4882a593Smuzhiyun #define SNOR_MFR_MICRON CFI_MFR_MICRON /* ST Micro <--> Micron */
25*4882a593Smuzhiyun #define SNOR_MFR_MACRONIX CFI_MFR_MACRONIX
26*4882a593Smuzhiyun #define SNOR_MFR_SPANSION CFI_MFR_AMD
27*4882a593Smuzhiyun #define SNOR_MFR_SST CFI_MFR_SST
28*4882a593Smuzhiyun #define SNOR_MFR_WINBOND 0xef /* Also used by some Spansion */
29*4882a593Smuzhiyun #define SNOR_MFR_NORMEM CFI_MFR_NORMEM
30*4882a593Smuzhiyun
31*4882a593Smuzhiyun /*
32*4882a593Smuzhiyun * Note on opcode nomenclature: some opcodes have a format like
33*4882a593Smuzhiyun * SPINOR_OP_FUNCTION{4,}_x_y_z. The numbers x, y, and z stand for the number
34*4882a593Smuzhiyun * of I/O lines used for the opcode, address, and data (respectively). The
35*4882a593Smuzhiyun * FUNCTION has an optional suffix of '4', to represent an opcode which
36*4882a593Smuzhiyun * requires a 4-byte (32-bit) address.
37*4882a593Smuzhiyun */
38*4882a593Smuzhiyun
39*4882a593Smuzhiyun /* Flash opcodes. */
40*4882a593Smuzhiyun #define SPINOR_OP_WREN 0x06 /* Write enable */
41*4882a593Smuzhiyun #define SPINOR_OP_RDSR 0x05 /* Read status register */
42*4882a593Smuzhiyun #define SPINOR_OP_WRSR 0x01 /* Write status register 1 byte */
43*4882a593Smuzhiyun #define SPINOR_OP_WRCR 0x31 /* Write configure register 1 byte */
44*4882a593Smuzhiyun #define SPINOR_OP_RDSR2 0x3f /* Read status register 2 */
45*4882a593Smuzhiyun #define SPINOR_OP_WRSR2 0x3e /* Write status register 2 */
46*4882a593Smuzhiyun #define SPINOR_OP_READ 0x03 /* Read data bytes (low frequency) */
47*4882a593Smuzhiyun #define SPINOR_OP_READ_FAST 0x0b /* Read data bytes (high frequency) */
48*4882a593Smuzhiyun #define SPINOR_OP_READ_1_1_2 0x3b /* Read data bytes (Dual Output SPI) */
49*4882a593Smuzhiyun #define SPINOR_OP_READ_1_2_2 0xbb /* Read data bytes (Dual I/O SPI) */
50*4882a593Smuzhiyun #define SPINOR_OP_READ_1_1_4 0x6b /* Read data bytes (Quad Output SPI) */
51*4882a593Smuzhiyun #define SPINOR_OP_READ_1_4_4 0xeb /* Read data bytes (Quad I/O SPI) */
52*4882a593Smuzhiyun #define SPINOR_OP_READ_1_1_8 0x8b /* Read data bytes (Octal Output SPI) */
53*4882a593Smuzhiyun #define SPINOR_OP_READ_1_8_8 0xcb /* Read data bytes (Octal I/O SPI) */
54*4882a593Smuzhiyun #define SPINOR_OP_PP 0x02 /* Page program (up to 256 bytes) */
55*4882a593Smuzhiyun #define SPINOR_OP_PP_1_1_4 0x32 /* Quad page program */
56*4882a593Smuzhiyun #define SPINOR_OP_PP_1_4_4 0x38 /* Quad page program */
57*4882a593Smuzhiyun #define SPINOR_OP_PP_1_1_8 0x82 /* Octal page program */
58*4882a593Smuzhiyun #define SPINOR_OP_PP_1_8_8 0xc2 /* Octal page program */
59*4882a593Smuzhiyun #define SPINOR_OP_BE_4K 0x20 /* Erase 4KiB block */
60*4882a593Smuzhiyun #define SPINOR_OP_BE_4K_PMC 0xd7 /* Erase 4KiB block on PMC chips */
61*4882a593Smuzhiyun #define SPINOR_OP_BE_32K 0x52 /* Erase 32KiB block */
62*4882a593Smuzhiyun #define SPINOR_OP_CHIP_ERASE 0xc7 /* Erase whole flash chip */
63*4882a593Smuzhiyun #define SPINOR_OP_SE 0xd8 /* Sector erase (usually 64KiB) */
64*4882a593Smuzhiyun #define SPINOR_OP_RDID 0x9f /* Read JEDEC ID */
65*4882a593Smuzhiyun #define SPINOR_OP_RDSFDP 0x5a /* Read SFDP */
66*4882a593Smuzhiyun #define SPINOR_OP_RDCR 0x35 /* Read configuration register */
67*4882a593Smuzhiyun #define SPINOR_OP_RDFSR 0x70 /* Read flag status register */
68*4882a593Smuzhiyun #define SPINOR_OP_CLFSR 0x50 /* Clear flag status register */
69*4882a593Smuzhiyun #define SPINOR_OP_RDEAR 0xc8 /* Read Extended Address Register */
70*4882a593Smuzhiyun #define SPINOR_OP_WREAR 0xc5 /* Write Extended Address Register */
71*4882a593Smuzhiyun
72*4882a593Smuzhiyun /* 4-byte address opcodes - used on Spansion and some Macronix flashes. */
73*4882a593Smuzhiyun #define SPINOR_OP_READ_4B 0x13 /* Read data bytes (low frequency) */
74*4882a593Smuzhiyun #define SPINOR_OP_READ_FAST_4B 0x0c /* Read data bytes (high frequency) */
75*4882a593Smuzhiyun #define SPINOR_OP_READ_1_1_2_4B 0x3c /* Read data bytes (Dual Output SPI) */
76*4882a593Smuzhiyun #define SPINOR_OP_READ_1_2_2_4B 0xbc /* Read data bytes (Dual I/O SPI) */
77*4882a593Smuzhiyun #define SPINOR_OP_READ_1_1_4_4B 0x6c /* Read data bytes (Quad Output SPI) */
78*4882a593Smuzhiyun #define SPINOR_OP_READ_1_4_4_4B 0xec /* Read data bytes (Quad I/O SPI) */
79*4882a593Smuzhiyun #define SPINOR_OP_READ_1_1_8_4B 0x7c /* Read data bytes (Octal Output SPI) */
80*4882a593Smuzhiyun #define SPINOR_OP_READ_1_8_8_4B 0xcc /* Read data bytes (Octal I/O SPI) */
81*4882a593Smuzhiyun #define SPINOR_OP_PP_4B 0x12 /* Page program (up to 256 bytes) */
82*4882a593Smuzhiyun #define SPINOR_OP_PP_1_1_4_4B 0x34 /* Quad page program */
83*4882a593Smuzhiyun #define SPINOR_OP_PP_1_4_4_4B 0x3e /* Quad page program */
84*4882a593Smuzhiyun #define SPINOR_OP_PP_1_1_8_4B 0x84 /* Octal page program */
85*4882a593Smuzhiyun #define SPINOR_OP_PP_1_8_8_4B 0x8e /* Octal page program */
86*4882a593Smuzhiyun #define SPINOR_OP_BE_4K_4B 0x21 /* Erase 4KiB block */
87*4882a593Smuzhiyun #define SPINOR_OP_BE_32K_4B 0x5c /* Erase 32KiB block */
88*4882a593Smuzhiyun #define SPINOR_OP_SE_4B 0xdc /* Sector erase (usually 64KiB) */
89*4882a593Smuzhiyun
90*4882a593Smuzhiyun /* Double Transfer Rate opcodes - defined in JEDEC JESD216B. */
91*4882a593Smuzhiyun #define SPINOR_OP_READ_1_1_1_DTR 0x0d
92*4882a593Smuzhiyun #define SPINOR_OP_READ_1_2_2_DTR 0xbd
93*4882a593Smuzhiyun #define SPINOR_OP_READ_1_4_4_DTR 0xed
94*4882a593Smuzhiyun
95*4882a593Smuzhiyun #define SPINOR_OP_READ_1_1_1_DTR_4B 0x0e
96*4882a593Smuzhiyun #define SPINOR_OP_READ_1_2_2_DTR_4B 0xbe
97*4882a593Smuzhiyun #define SPINOR_OP_READ_1_4_4_DTR_4B 0xee
98*4882a593Smuzhiyun
99*4882a593Smuzhiyun /* Used for SST flashes only. */
100*4882a593Smuzhiyun #define SPINOR_OP_BP 0x02 /* Byte program */
101*4882a593Smuzhiyun #define SPINOR_OP_WRDI 0x04 /* Write disable */
102*4882a593Smuzhiyun #define SPINOR_OP_AAI_WP 0xad /* Auto address increment word program */
103*4882a593Smuzhiyun
104*4882a593Smuzhiyun /* Used for SST26* flashes only. */
105*4882a593Smuzhiyun #define SPINOR_OP_READ_BPR 0x72 /* Read block protection register */
106*4882a593Smuzhiyun #define SPINOR_OP_WRITE_BPR 0x42 /* Write block protection register */
107*4882a593Smuzhiyun
108*4882a593Smuzhiyun /* Used for S3AN flashes only */
109*4882a593Smuzhiyun #define SPINOR_OP_XSE 0x50 /* Sector erase */
110*4882a593Smuzhiyun #define SPINOR_OP_XPP 0x82 /* Page program */
111*4882a593Smuzhiyun #define SPINOR_OP_XRDSR 0xd7 /* Read status register */
112*4882a593Smuzhiyun
113*4882a593Smuzhiyun #define XSR_PAGESIZE BIT(0) /* Page size in Po2 or Linear */
114*4882a593Smuzhiyun #define XSR_RDY BIT(7) /* Ready */
115*4882a593Smuzhiyun
116*4882a593Smuzhiyun /* Used for Macronix and Winbond flashes. */
117*4882a593Smuzhiyun #define SPINOR_OP_EN4B 0xb7 /* Enter 4-byte mode */
118*4882a593Smuzhiyun #define SPINOR_OP_EX4B 0xe9 /* Exit 4-byte mode */
119*4882a593Smuzhiyun
120*4882a593Smuzhiyun /* Used for Spansion flashes only. */
121*4882a593Smuzhiyun #define SPINOR_OP_BRWR 0x17 /* Bank register write */
122*4882a593Smuzhiyun #define SPINOR_OP_BRRD 0x16 /* Bank register read */
123*4882a593Smuzhiyun #define SPINOR_OP_CLSR 0x30 /* Clear status register 1 */
124*4882a593Smuzhiyun
125*4882a593Smuzhiyun /* Used for Micron flashes only. */
126*4882a593Smuzhiyun #define SPINOR_OP_RD_EVCR 0x65 /* Read EVCR register */
127*4882a593Smuzhiyun #define SPINOR_OP_WD_EVCR 0x61 /* Write EVCR register */
128*4882a593Smuzhiyun
129*4882a593Smuzhiyun /* Status Register bits. */
130*4882a593Smuzhiyun #define SR_WIP BIT(0) /* Write in progress */
131*4882a593Smuzhiyun #define SR_WEL BIT(1) /* Write enable latch */
132*4882a593Smuzhiyun /* meaning of other SR_* bits may differ between vendors */
133*4882a593Smuzhiyun #define SR_BP0 BIT(2) /* Block protect 0 */
134*4882a593Smuzhiyun #define SR_BP1 BIT(3) /* Block protect 1 */
135*4882a593Smuzhiyun #define SR_BP2 BIT(4) /* Block protect 2 */
136*4882a593Smuzhiyun #define SR_TB BIT(5) /* Top/Bottom protect */
137*4882a593Smuzhiyun #define SR_SRWD BIT(7) /* SR write protect */
138*4882a593Smuzhiyun /* Spansion/Cypress specific status bits */
139*4882a593Smuzhiyun #define SR_E_ERR BIT(5)
140*4882a593Smuzhiyun #define SR_P_ERR BIT(6)
141*4882a593Smuzhiyun
142*4882a593Smuzhiyun #define SR_QUAD_EN_MX BIT(6) /* Macronix Quad I/O */
143*4882a593Smuzhiyun
144*4882a593Smuzhiyun /* Enhanced Volatile Configuration Register bits */
145*4882a593Smuzhiyun #define EVCR_QUAD_EN_MICRON BIT(7) /* Micron Quad I/O */
146*4882a593Smuzhiyun
147*4882a593Smuzhiyun #define SR_QUAD_EN_NORMEM BIT(2) /* NORMEM Quad I/O */
148*4882a593Smuzhiyun
149*4882a593Smuzhiyun /* Flag Status Register bits */
150*4882a593Smuzhiyun #define FSR_READY BIT(7) /* Device status, 0 = Busy, 1 = Ready */
151*4882a593Smuzhiyun #define FSR_E_ERR BIT(5) /* Erase operation status */
152*4882a593Smuzhiyun #define FSR_P_ERR BIT(4) /* Program operation status */
153*4882a593Smuzhiyun #define FSR_PT_ERR BIT(1) /* Protection error bit */
154*4882a593Smuzhiyun
155*4882a593Smuzhiyun /* Configuration Register bits. */
156*4882a593Smuzhiyun #define CR_QUAD_EN_SPAN BIT(1) /* Spansion Quad I/O */
157*4882a593Smuzhiyun
158*4882a593Smuzhiyun /* Status Register 2 bits. */
159*4882a593Smuzhiyun #define SR2_QUAD_EN_BIT7 BIT(7)
160*4882a593Smuzhiyun
161*4882a593Smuzhiyun /* Supported SPI protocols */
162*4882a593Smuzhiyun #define SNOR_PROTO_INST_MASK GENMASK(23, 16)
163*4882a593Smuzhiyun #define SNOR_PROTO_INST_SHIFT 16
164*4882a593Smuzhiyun #define SNOR_PROTO_INST(_nbits) \
165*4882a593Smuzhiyun ((((unsigned long)(_nbits)) << SNOR_PROTO_INST_SHIFT) & \
166*4882a593Smuzhiyun SNOR_PROTO_INST_MASK)
167*4882a593Smuzhiyun
168*4882a593Smuzhiyun #define SNOR_PROTO_ADDR_MASK GENMASK(15, 8)
169*4882a593Smuzhiyun #define SNOR_PROTO_ADDR_SHIFT 8
170*4882a593Smuzhiyun #define SNOR_PROTO_ADDR(_nbits) \
171*4882a593Smuzhiyun ((((unsigned long)(_nbits)) << SNOR_PROTO_ADDR_SHIFT) & \
172*4882a593Smuzhiyun SNOR_PROTO_ADDR_MASK)
173*4882a593Smuzhiyun
174*4882a593Smuzhiyun #define SNOR_PROTO_DATA_MASK GENMASK(7, 0)
175*4882a593Smuzhiyun #define SNOR_PROTO_DATA_SHIFT 0
176*4882a593Smuzhiyun #define SNOR_PROTO_DATA(_nbits) \
177*4882a593Smuzhiyun ((((unsigned long)(_nbits)) << SNOR_PROTO_DATA_SHIFT) & \
178*4882a593Smuzhiyun SNOR_PROTO_DATA_MASK)
179*4882a593Smuzhiyun
180*4882a593Smuzhiyun #define SNOR_PROTO_IS_DTR BIT(24) /* Double Transfer Rate */
181*4882a593Smuzhiyun
182*4882a593Smuzhiyun #define SNOR_PROTO_STR(_inst_nbits, _addr_nbits, _data_nbits) \
183*4882a593Smuzhiyun (SNOR_PROTO_INST(_inst_nbits) | \
184*4882a593Smuzhiyun SNOR_PROTO_ADDR(_addr_nbits) | \
185*4882a593Smuzhiyun SNOR_PROTO_DATA(_data_nbits))
186*4882a593Smuzhiyun #define SNOR_PROTO_DTR(_inst_nbits, _addr_nbits, _data_nbits) \
187*4882a593Smuzhiyun (SNOR_PROTO_IS_DTR | \
188*4882a593Smuzhiyun SNOR_PROTO_STR(_inst_nbits, _addr_nbits, _data_nbits))
189*4882a593Smuzhiyun
190*4882a593Smuzhiyun enum spi_nor_protocol {
191*4882a593Smuzhiyun SNOR_PROTO_1_1_1 = SNOR_PROTO_STR(1, 1, 1),
192*4882a593Smuzhiyun SNOR_PROTO_1_1_2 = SNOR_PROTO_STR(1, 1, 2),
193*4882a593Smuzhiyun SNOR_PROTO_1_1_4 = SNOR_PROTO_STR(1, 1, 4),
194*4882a593Smuzhiyun SNOR_PROTO_1_1_8 = SNOR_PROTO_STR(1, 1, 8),
195*4882a593Smuzhiyun SNOR_PROTO_1_2_2 = SNOR_PROTO_STR(1, 2, 2),
196*4882a593Smuzhiyun SNOR_PROTO_1_4_4 = SNOR_PROTO_STR(1, 4, 4),
197*4882a593Smuzhiyun SNOR_PROTO_1_8_8 = SNOR_PROTO_STR(1, 8, 8),
198*4882a593Smuzhiyun SNOR_PROTO_2_2_2 = SNOR_PROTO_STR(2, 2, 2),
199*4882a593Smuzhiyun SNOR_PROTO_4_4_4 = SNOR_PROTO_STR(4, 4, 4),
200*4882a593Smuzhiyun SNOR_PROTO_8_8_8 = SNOR_PROTO_STR(8, 8, 8),
201*4882a593Smuzhiyun
202*4882a593Smuzhiyun SNOR_PROTO_1_1_1_DTR = SNOR_PROTO_DTR(1, 1, 1),
203*4882a593Smuzhiyun SNOR_PROTO_1_2_2_DTR = SNOR_PROTO_DTR(1, 2, 2),
204*4882a593Smuzhiyun SNOR_PROTO_1_4_4_DTR = SNOR_PROTO_DTR(1, 4, 4),
205*4882a593Smuzhiyun SNOR_PROTO_1_8_8_DTR = SNOR_PROTO_DTR(1, 8, 8),
206*4882a593Smuzhiyun };
207*4882a593Smuzhiyun
spi_nor_protocol_is_dtr(enum spi_nor_protocol proto)208*4882a593Smuzhiyun static inline bool spi_nor_protocol_is_dtr(enum spi_nor_protocol proto)
209*4882a593Smuzhiyun {
210*4882a593Smuzhiyun return !!(proto & SNOR_PROTO_IS_DTR);
211*4882a593Smuzhiyun }
212*4882a593Smuzhiyun
spi_nor_get_protocol_inst_nbits(enum spi_nor_protocol proto)213*4882a593Smuzhiyun static inline u8 spi_nor_get_protocol_inst_nbits(enum spi_nor_protocol proto)
214*4882a593Smuzhiyun {
215*4882a593Smuzhiyun return ((unsigned long)(proto & SNOR_PROTO_INST_MASK)) >>
216*4882a593Smuzhiyun SNOR_PROTO_INST_SHIFT;
217*4882a593Smuzhiyun }
218*4882a593Smuzhiyun
spi_nor_get_protocol_addr_nbits(enum spi_nor_protocol proto)219*4882a593Smuzhiyun static inline u8 spi_nor_get_protocol_addr_nbits(enum spi_nor_protocol proto)
220*4882a593Smuzhiyun {
221*4882a593Smuzhiyun return ((unsigned long)(proto & SNOR_PROTO_ADDR_MASK)) >>
222*4882a593Smuzhiyun SNOR_PROTO_ADDR_SHIFT;
223*4882a593Smuzhiyun }
224*4882a593Smuzhiyun
spi_nor_get_protocol_data_nbits(enum spi_nor_protocol proto)225*4882a593Smuzhiyun static inline u8 spi_nor_get_protocol_data_nbits(enum spi_nor_protocol proto)
226*4882a593Smuzhiyun {
227*4882a593Smuzhiyun return ((unsigned long)(proto & SNOR_PROTO_DATA_MASK)) >>
228*4882a593Smuzhiyun SNOR_PROTO_DATA_SHIFT;
229*4882a593Smuzhiyun }
230*4882a593Smuzhiyun
spi_nor_get_protocol_width(enum spi_nor_protocol proto)231*4882a593Smuzhiyun static inline u8 spi_nor_get_protocol_width(enum spi_nor_protocol proto)
232*4882a593Smuzhiyun {
233*4882a593Smuzhiyun return spi_nor_get_protocol_data_nbits(proto);
234*4882a593Smuzhiyun }
235*4882a593Smuzhiyun
236*4882a593Smuzhiyun #define SPI_NOR_MAX_CMD_SIZE 8
237*4882a593Smuzhiyun enum spi_nor_ops {
238*4882a593Smuzhiyun SPI_NOR_OPS_READ = 0,
239*4882a593Smuzhiyun SPI_NOR_OPS_WRITE,
240*4882a593Smuzhiyun SPI_NOR_OPS_ERASE,
241*4882a593Smuzhiyun SPI_NOR_OPS_LOCK,
242*4882a593Smuzhiyun SPI_NOR_OPS_UNLOCK,
243*4882a593Smuzhiyun };
244*4882a593Smuzhiyun
245*4882a593Smuzhiyun enum spi_nor_option_flags {
246*4882a593Smuzhiyun SNOR_F_USE_FSR = BIT(0),
247*4882a593Smuzhiyun SNOR_F_HAS_SR_TB = BIT(1),
248*4882a593Smuzhiyun SNOR_F_NO_OP_CHIP_ERASE = BIT(2),
249*4882a593Smuzhiyun SNOR_F_S3AN_ADDR_DEFAULT = BIT(3),
250*4882a593Smuzhiyun SNOR_F_READY_XSR_RDY = BIT(4),
251*4882a593Smuzhiyun SNOR_F_USE_CLSR = BIT(5),
252*4882a593Smuzhiyun SNOR_F_BROKEN_RESET = BIT(6),
253*4882a593Smuzhiyun };
254*4882a593Smuzhiyun
255*4882a593Smuzhiyun /**
256*4882a593Smuzhiyun * struct flash_info - Forward declaration of a structure used internally by
257*4882a593Smuzhiyun * spi_nor_scan()
258*4882a593Smuzhiyun */
259*4882a593Smuzhiyun struct flash_info;
260*4882a593Smuzhiyun
261*4882a593Smuzhiyun /* TODO: Remove, once all users of spi_flash interface are moved to MTD */
262*4882a593Smuzhiyun #define spi_flash spi_nor
263*4882a593Smuzhiyun
264*4882a593Smuzhiyun /**
265*4882a593Smuzhiyun * struct spi_nor - Structure for defining a the SPI NOR layer
266*4882a593Smuzhiyun * @mtd: point to a mtd_info structure
267*4882a593Smuzhiyun * @lock: the lock for the read/write/erase/lock/unlock operations
268*4882a593Smuzhiyun * @dev: point to a spi device, or a spi nor controller device.
269*4882a593Smuzhiyun * @info: spi-nor part JDEC MFR id and other info
270*4882a593Smuzhiyun * @page_size: the page size of the SPI NOR
271*4882a593Smuzhiyun * @addr_width: number of address bytes
272*4882a593Smuzhiyun * @erase_opcode: the opcode for erasing a sector
273*4882a593Smuzhiyun * @read_opcode: the read opcode
274*4882a593Smuzhiyun * @read_dummy: the dummy needed by the read operation
275*4882a593Smuzhiyun * @program_opcode: the program opcode
276*4882a593Smuzhiyun * @bank_read_cmd: Bank read cmd
277*4882a593Smuzhiyun * @bank_write_cmd: Bank write cmd
278*4882a593Smuzhiyun * @bank_curr: Current flash bank
279*4882a593Smuzhiyun * @sst_write_second: used by the SST write operation
280*4882a593Smuzhiyun * @flags: flag options for the current SPI-NOR (SNOR_F_*)
281*4882a593Smuzhiyun * @read_proto: the SPI protocol for read operations
282*4882a593Smuzhiyun * @write_proto: the SPI protocol for write operations
283*4882a593Smuzhiyun * @reg_proto the SPI protocol for read_reg/write_reg/erase operations
284*4882a593Smuzhiyun * @cmd_buf: used by the write_reg
285*4882a593Smuzhiyun * @prepare: [OPTIONAL] do some preparations for the
286*4882a593Smuzhiyun * read/write/erase/lock/unlock operations
287*4882a593Smuzhiyun * @unprepare: [OPTIONAL] do some post work after the
288*4882a593Smuzhiyun * read/write/erase/lock/unlock operations
289*4882a593Smuzhiyun * @read_reg: [DRIVER-SPECIFIC] read out the register
290*4882a593Smuzhiyun * @write_reg: [DRIVER-SPECIFIC] write data to the register
291*4882a593Smuzhiyun * @read: [DRIVER-SPECIFIC] read data from the SPI NOR
292*4882a593Smuzhiyun * @write: [DRIVER-SPECIFIC] write data to the SPI NOR
293*4882a593Smuzhiyun * @erase: [DRIVER-SPECIFIC] erase a sector of the SPI NOR
294*4882a593Smuzhiyun * at the offset @offs; if not provided by the driver,
295*4882a593Smuzhiyun * spi-nor will send the erase opcode via write_reg()
296*4882a593Smuzhiyun * @flash_lock: [FLASH-SPECIFIC] lock a region of the SPI NOR
297*4882a593Smuzhiyun * @flash_unlock: [FLASH-SPECIFIC] unlock a region of the SPI NOR
298*4882a593Smuzhiyun * @flash_is_locked: [FLASH-SPECIFIC] check if a region of the SPI NOR is
299*4882a593Smuzhiyun * @quad_enable: [FLASH-SPECIFIC] enables SPI NOR quad mode
300*4882a593Smuzhiyun * completely locked
301*4882a593Smuzhiyun * @priv: the private data
302*4882a593Smuzhiyun */
303*4882a593Smuzhiyun struct spi_nor {
304*4882a593Smuzhiyun struct mtd_info mtd;
305*4882a593Smuzhiyun struct udevice *dev;
306*4882a593Smuzhiyun struct spi_slave *spi;
307*4882a593Smuzhiyun const struct flash_info *info;
308*4882a593Smuzhiyun u32 page_size;
309*4882a593Smuzhiyun u8 addr_width;
310*4882a593Smuzhiyun u8 erase_opcode;
311*4882a593Smuzhiyun u8 read_opcode;
312*4882a593Smuzhiyun u8 read_dummy;
313*4882a593Smuzhiyun u8 program_opcode;
314*4882a593Smuzhiyun #ifdef CONFIG_SPI_FLASH_BAR
315*4882a593Smuzhiyun u8 bank_read_cmd;
316*4882a593Smuzhiyun u8 bank_write_cmd;
317*4882a593Smuzhiyun u8 bank_curr;
318*4882a593Smuzhiyun #endif
319*4882a593Smuzhiyun enum spi_nor_protocol read_proto;
320*4882a593Smuzhiyun enum spi_nor_protocol write_proto;
321*4882a593Smuzhiyun enum spi_nor_protocol reg_proto;
322*4882a593Smuzhiyun bool sst_write_second;
323*4882a593Smuzhiyun u32 flags;
324*4882a593Smuzhiyun u8 cmd_buf[SPI_NOR_MAX_CMD_SIZE];
325*4882a593Smuzhiyun
326*4882a593Smuzhiyun int (*prepare)(struct spi_nor *nor, enum spi_nor_ops ops);
327*4882a593Smuzhiyun void (*unprepare)(struct spi_nor *nor, enum spi_nor_ops ops);
328*4882a593Smuzhiyun int (*read_reg)(struct spi_nor *nor, u8 opcode, u8 *buf, int len);
329*4882a593Smuzhiyun int (*write_reg)(struct spi_nor *nor, u8 opcode, u8 *buf, int len);
330*4882a593Smuzhiyun
331*4882a593Smuzhiyun ssize_t (*read)(struct spi_nor *nor, loff_t from,
332*4882a593Smuzhiyun size_t len, u_char *read_buf);
333*4882a593Smuzhiyun ssize_t (*write)(struct spi_nor *nor, loff_t to,
334*4882a593Smuzhiyun size_t len, const u_char *write_buf);
335*4882a593Smuzhiyun int (*erase)(struct spi_nor *nor, loff_t offs);
336*4882a593Smuzhiyun
337*4882a593Smuzhiyun int (*flash_lock)(struct spi_nor *nor, loff_t ofs, uint64_t len);
338*4882a593Smuzhiyun int (*flash_unlock)(struct spi_nor *nor, loff_t ofs, uint64_t len);
339*4882a593Smuzhiyun int (*flash_is_locked)(struct spi_nor *nor, loff_t ofs, uint64_t len);
340*4882a593Smuzhiyun int (*quad_enable)(struct spi_nor *nor);
341*4882a593Smuzhiyun
342*4882a593Smuzhiyun void *priv;
343*4882a593Smuzhiyun /* Compatibility for spi_flash, remove once sf layer is merged with mtd */
344*4882a593Smuzhiyun const char *name;
345*4882a593Smuzhiyun u32 size;
346*4882a593Smuzhiyun u32 sector_size;
347*4882a593Smuzhiyun u32 erase_size;
348*4882a593Smuzhiyun };
349*4882a593Smuzhiyun
spi_nor_set_flash_node(struct spi_nor * nor,const struct device_node * np)350*4882a593Smuzhiyun static inline void spi_nor_set_flash_node(struct spi_nor *nor,
351*4882a593Smuzhiyun const struct device_node *np)
352*4882a593Smuzhiyun {
353*4882a593Smuzhiyun mtd_set_of_node(&nor->mtd, np);
354*4882a593Smuzhiyun }
355*4882a593Smuzhiyun
356*4882a593Smuzhiyun static inline const struct
spi_nor_get_flash_node(struct spi_nor * nor)357*4882a593Smuzhiyun device_node *spi_nor_get_flash_node(struct spi_nor *nor)
358*4882a593Smuzhiyun {
359*4882a593Smuzhiyun return mtd_get_of_node(&nor->mtd);
360*4882a593Smuzhiyun }
361*4882a593Smuzhiyun
362*4882a593Smuzhiyun /**
363*4882a593Smuzhiyun * struct spi_nor_hwcaps - Structure for describing the hardware capabilies
364*4882a593Smuzhiyun * supported by the SPI controller (bus master).
365*4882a593Smuzhiyun * @mask: the bitmask listing all the supported hw capabilies
366*4882a593Smuzhiyun */
367*4882a593Smuzhiyun struct spi_nor_hwcaps {
368*4882a593Smuzhiyun u32 mask;
369*4882a593Smuzhiyun };
370*4882a593Smuzhiyun
371*4882a593Smuzhiyun /*
372*4882a593Smuzhiyun *(Fast) Read capabilities.
373*4882a593Smuzhiyun * MUST be ordered by priority: the higher bit position, the higher priority.
374*4882a593Smuzhiyun * As a matter of performances, it is relevant to use Octo SPI protocols first,
375*4882a593Smuzhiyun * then Quad SPI protocols before Dual SPI protocols, Fast Read and lastly
376*4882a593Smuzhiyun * (Slow) Read.
377*4882a593Smuzhiyun */
378*4882a593Smuzhiyun #define SNOR_HWCAPS_READ_MASK GENMASK(14, 0)
379*4882a593Smuzhiyun #define SNOR_HWCAPS_READ BIT(0)
380*4882a593Smuzhiyun #define SNOR_HWCAPS_READ_FAST BIT(1)
381*4882a593Smuzhiyun #define SNOR_HWCAPS_READ_1_1_1_DTR BIT(2)
382*4882a593Smuzhiyun
383*4882a593Smuzhiyun #define SNOR_HWCAPS_READ_DUAL GENMASK(6, 3)
384*4882a593Smuzhiyun #define SNOR_HWCAPS_READ_1_1_2 BIT(3)
385*4882a593Smuzhiyun #define SNOR_HWCAPS_READ_1_2_2 BIT(4)
386*4882a593Smuzhiyun #define SNOR_HWCAPS_READ_2_2_2 BIT(5)
387*4882a593Smuzhiyun #define SNOR_HWCAPS_READ_1_2_2_DTR BIT(6)
388*4882a593Smuzhiyun
389*4882a593Smuzhiyun #define SNOR_HWCAPS_READ_QUAD GENMASK(10, 7)
390*4882a593Smuzhiyun #define SNOR_HWCAPS_READ_1_1_4 BIT(7)
391*4882a593Smuzhiyun #define SNOR_HWCAPS_READ_1_4_4 BIT(8)
392*4882a593Smuzhiyun #define SNOR_HWCAPS_READ_4_4_4 BIT(9)
393*4882a593Smuzhiyun #define SNOR_HWCAPS_READ_1_4_4_DTR BIT(10)
394*4882a593Smuzhiyun
395*4882a593Smuzhiyun #define SNOR_HWCPAS_READ_OCTO GENMASK(14, 11)
396*4882a593Smuzhiyun #define SNOR_HWCAPS_READ_1_1_8 BIT(11)
397*4882a593Smuzhiyun #define SNOR_HWCAPS_READ_1_8_8 BIT(12)
398*4882a593Smuzhiyun #define SNOR_HWCAPS_READ_8_8_8 BIT(13)
399*4882a593Smuzhiyun #define SNOR_HWCAPS_READ_1_8_8_DTR BIT(14)
400*4882a593Smuzhiyun
401*4882a593Smuzhiyun /*
402*4882a593Smuzhiyun * Page Program capabilities.
403*4882a593Smuzhiyun * MUST be ordered by priority: the higher bit position, the higher priority.
404*4882a593Smuzhiyun * Like (Fast) Read capabilities, Octo/Quad SPI protocols are preferred to the
405*4882a593Smuzhiyun * legacy SPI 1-1-1 protocol.
406*4882a593Smuzhiyun * Note that Dual Page Programs are not supported because there is no existing
407*4882a593Smuzhiyun * JEDEC/SFDP standard to define them. Also at this moment no SPI flash memory
408*4882a593Smuzhiyun * implements such commands.
409*4882a593Smuzhiyun */
410*4882a593Smuzhiyun #define SNOR_HWCAPS_PP_MASK GENMASK(22, 16)
411*4882a593Smuzhiyun #define SNOR_HWCAPS_PP BIT(16)
412*4882a593Smuzhiyun
413*4882a593Smuzhiyun #define SNOR_HWCAPS_PP_QUAD GENMASK(19, 17)
414*4882a593Smuzhiyun #define SNOR_HWCAPS_PP_1_1_4 BIT(17)
415*4882a593Smuzhiyun #define SNOR_HWCAPS_PP_1_4_4 BIT(18)
416*4882a593Smuzhiyun #define SNOR_HWCAPS_PP_4_4_4 BIT(19)
417*4882a593Smuzhiyun
418*4882a593Smuzhiyun #define SNOR_HWCAPS_PP_OCTO GENMASK(22, 20)
419*4882a593Smuzhiyun #define SNOR_HWCAPS_PP_1_1_8 BIT(20)
420*4882a593Smuzhiyun #define SNOR_HWCAPS_PP_1_8_8 BIT(21)
421*4882a593Smuzhiyun #define SNOR_HWCAPS_PP_8_8_8 BIT(22)
422*4882a593Smuzhiyun
423*4882a593Smuzhiyun /**
424*4882a593Smuzhiyun * spi_nor_scan() - scan the SPI NOR
425*4882a593Smuzhiyun * @nor: the spi_nor structure
426*4882a593Smuzhiyun *
427*4882a593Smuzhiyun * The drivers can use this function to scan the SPI NOR.
428*4882a593Smuzhiyun * In the scanning, it will try to get all the necessary information to
429*4882a593Smuzhiyun * fill the mtd_info{} and the spi_nor{}.
430*4882a593Smuzhiyun *
431*4882a593Smuzhiyun * Return: 0 for success, others for failure.
432*4882a593Smuzhiyun */
433*4882a593Smuzhiyun int spi_nor_scan(struct spi_nor *nor);
434*4882a593Smuzhiyun
435*4882a593Smuzhiyun #endif
436