xref: /OK3568_Linux_fs/kernel/drivers/spi/spi-cavium.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun #ifndef __SPI_CAVIUM_H
3*4882a593Smuzhiyun #define __SPI_CAVIUM_H
4*4882a593Smuzhiyun 
5*4882a593Smuzhiyun #include <linux/clk.h>
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun #define OCTEON_SPI_MAX_BYTES 9
8*4882a593Smuzhiyun #define OCTEON_SPI_MAX_CLOCK_HZ 16000000
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun struct octeon_spi_regs {
11*4882a593Smuzhiyun 	int config;
12*4882a593Smuzhiyun 	int status;
13*4882a593Smuzhiyun 	int tx;
14*4882a593Smuzhiyun 	int data;
15*4882a593Smuzhiyun };
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun struct octeon_spi {
18*4882a593Smuzhiyun 	void __iomem *register_base;
19*4882a593Smuzhiyun 	u64 last_cfg;
20*4882a593Smuzhiyun 	u64 cs_enax;
21*4882a593Smuzhiyun 	int sys_freq;
22*4882a593Smuzhiyun 	struct octeon_spi_regs regs;
23*4882a593Smuzhiyun 	struct clk *clk;
24*4882a593Smuzhiyun };
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun #define OCTEON_SPI_CFG(x)	(x->regs.config)
27*4882a593Smuzhiyun #define OCTEON_SPI_STS(x)	(x->regs.status)
28*4882a593Smuzhiyun #define OCTEON_SPI_TX(x)	(x->regs.tx)
29*4882a593Smuzhiyun #define OCTEON_SPI_DAT0(x)	(x->regs.data)
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun int octeon_spi_transfer_one_message(struct spi_master *master,
32*4882a593Smuzhiyun 				    struct spi_message *msg);
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun /* MPI register descriptions */
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun #define CVMX_MPI_CFG (CVMX_ADD_IO_SEG(0x0001070000001000ull))
37*4882a593Smuzhiyun #define CVMX_MPI_DATX(offset) (CVMX_ADD_IO_SEG(0x0001070000001080ull) + ((offset) & 15) * 8)
38*4882a593Smuzhiyun #define CVMX_MPI_STS (CVMX_ADD_IO_SEG(0x0001070000001008ull))
39*4882a593Smuzhiyun #define CVMX_MPI_TX (CVMX_ADD_IO_SEG(0x0001070000001010ull))
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun union cvmx_mpi_cfg {
42*4882a593Smuzhiyun 	uint64_t u64;
43*4882a593Smuzhiyun 	struct cvmx_mpi_cfg_s {
44*4882a593Smuzhiyun #ifdef __BIG_ENDIAN_BITFIELD
45*4882a593Smuzhiyun 		uint64_t reserved_29_63:35;
46*4882a593Smuzhiyun 		uint64_t clkdiv:13;
47*4882a593Smuzhiyun 		uint64_t csena3:1;
48*4882a593Smuzhiyun 		uint64_t csena2:1;
49*4882a593Smuzhiyun 		uint64_t csena1:1;
50*4882a593Smuzhiyun 		uint64_t csena0:1;
51*4882a593Smuzhiyun 		uint64_t cslate:1;
52*4882a593Smuzhiyun 		uint64_t tritx:1;
53*4882a593Smuzhiyun 		uint64_t idleclks:2;
54*4882a593Smuzhiyun 		uint64_t cshi:1;
55*4882a593Smuzhiyun 		uint64_t csena:1;
56*4882a593Smuzhiyun 		uint64_t int_ena:1;
57*4882a593Smuzhiyun 		uint64_t lsbfirst:1;
58*4882a593Smuzhiyun 		uint64_t wireor:1;
59*4882a593Smuzhiyun 		uint64_t clk_cont:1;
60*4882a593Smuzhiyun 		uint64_t idlelo:1;
61*4882a593Smuzhiyun 		uint64_t enable:1;
62*4882a593Smuzhiyun #else
63*4882a593Smuzhiyun 		uint64_t enable:1;
64*4882a593Smuzhiyun 		uint64_t idlelo:1;
65*4882a593Smuzhiyun 		uint64_t clk_cont:1;
66*4882a593Smuzhiyun 		uint64_t wireor:1;
67*4882a593Smuzhiyun 		uint64_t lsbfirst:1;
68*4882a593Smuzhiyun 		uint64_t int_ena:1;
69*4882a593Smuzhiyun 		uint64_t csena:1;
70*4882a593Smuzhiyun 		uint64_t cshi:1;
71*4882a593Smuzhiyun 		uint64_t idleclks:2;
72*4882a593Smuzhiyun 		uint64_t tritx:1;
73*4882a593Smuzhiyun 		uint64_t cslate:1;
74*4882a593Smuzhiyun 		uint64_t csena0:1;
75*4882a593Smuzhiyun 		uint64_t csena1:1;
76*4882a593Smuzhiyun 		uint64_t csena2:1;
77*4882a593Smuzhiyun 		uint64_t csena3:1;
78*4882a593Smuzhiyun 		uint64_t clkdiv:13;
79*4882a593Smuzhiyun 		uint64_t reserved_29_63:35;
80*4882a593Smuzhiyun #endif
81*4882a593Smuzhiyun 	} s;
82*4882a593Smuzhiyun 	struct cvmx_mpi_cfg_cn30xx {
83*4882a593Smuzhiyun #ifdef __BIG_ENDIAN_BITFIELD
84*4882a593Smuzhiyun 		uint64_t reserved_29_63:35;
85*4882a593Smuzhiyun 		uint64_t clkdiv:13;
86*4882a593Smuzhiyun 		uint64_t reserved_12_15:4;
87*4882a593Smuzhiyun 		uint64_t cslate:1;
88*4882a593Smuzhiyun 		uint64_t tritx:1;
89*4882a593Smuzhiyun 		uint64_t idleclks:2;
90*4882a593Smuzhiyun 		uint64_t cshi:1;
91*4882a593Smuzhiyun 		uint64_t csena:1;
92*4882a593Smuzhiyun 		uint64_t int_ena:1;
93*4882a593Smuzhiyun 		uint64_t lsbfirst:1;
94*4882a593Smuzhiyun 		uint64_t wireor:1;
95*4882a593Smuzhiyun 		uint64_t clk_cont:1;
96*4882a593Smuzhiyun 		uint64_t idlelo:1;
97*4882a593Smuzhiyun 		uint64_t enable:1;
98*4882a593Smuzhiyun #else
99*4882a593Smuzhiyun 		uint64_t enable:1;
100*4882a593Smuzhiyun 		uint64_t idlelo:1;
101*4882a593Smuzhiyun 		uint64_t clk_cont:1;
102*4882a593Smuzhiyun 		uint64_t wireor:1;
103*4882a593Smuzhiyun 		uint64_t lsbfirst:1;
104*4882a593Smuzhiyun 		uint64_t int_ena:1;
105*4882a593Smuzhiyun 		uint64_t csena:1;
106*4882a593Smuzhiyun 		uint64_t cshi:1;
107*4882a593Smuzhiyun 		uint64_t idleclks:2;
108*4882a593Smuzhiyun 		uint64_t tritx:1;
109*4882a593Smuzhiyun 		uint64_t cslate:1;
110*4882a593Smuzhiyun 		uint64_t reserved_12_15:4;
111*4882a593Smuzhiyun 		uint64_t clkdiv:13;
112*4882a593Smuzhiyun 		uint64_t reserved_29_63:35;
113*4882a593Smuzhiyun #endif
114*4882a593Smuzhiyun 	} cn30xx;
115*4882a593Smuzhiyun 	struct cvmx_mpi_cfg_cn31xx {
116*4882a593Smuzhiyun #ifdef __BIG_ENDIAN_BITFIELD
117*4882a593Smuzhiyun 		uint64_t reserved_29_63:35;
118*4882a593Smuzhiyun 		uint64_t clkdiv:13;
119*4882a593Smuzhiyun 		uint64_t reserved_11_15:5;
120*4882a593Smuzhiyun 		uint64_t tritx:1;
121*4882a593Smuzhiyun 		uint64_t idleclks:2;
122*4882a593Smuzhiyun 		uint64_t cshi:1;
123*4882a593Smuzhiyun 		uint64_t csena:1;
124*4882a593Smuzhiyun 		uint64_t int_ena:1;
125*4882a593Smuzhiyun 		uint64_t lsbfirst:1;
126*4882a593Smuzhiyun 		uint64_t wireor:1;
127*4882a593Smuzhiyun 		uint64_t clk_cont:1;
128*4882a593Smuzhiyun 		uint64_t idlelo:1;
129*4882a593Smuzhiyun 		uint64_t enable:1;
130*4882a593Smuzhiyun #else
131*4882a593Smuzhiyun 		uint64_t enable:1;
132*4882a593Smuzhiyun 		uint64_t idlelo:1;
133*4882a593Smuzhiyun 		uint64_t clk_cont:1;
134*4882a593Smuzhiyun 		uint64_t wireor:1;
135*4882a593Smuzhiyun 		uint64_t lsbfirst:1;
136*4882a593Smuzhiyun 		uint64_t int_ena:1;
137*4882a593Smuzhiyun 		uint64_t csena:1;
138*4882a593Smuzhiyun 		uint64_t cshi:1;
139*4882a593Smuzhiyun 		uint64_t idleclks:2;
140*4882a593Smuzhiyun 		uint64_t tritx:1;
141*4882a593Smuzhiyun 		uint64_t reserved_11_15:5;
142*4882a593Smuzhiyun 		uint64_t clkdiv:13;
143*4882a593Smuzhiyun 		uint64_t reserved_29_63:35;
144*4882a593Smuzhiyun #endif
145*4882a593Smuzhiyun 	} cn31xx;
146*4882a593Smuzhiyun 	struct cvmx_mpi_cfg_cn30xx cn50xx;
147*4882a593Smuzhiyun 	struct cvmx_mpi_cfg_cn61xx {
148*4882a593Smuzhiyun #ifdef __BIG_ENDIAN_BITFIELD
149*4882a593Smuzhiyun 		uint64_t reserved_29_63:35;
150*4882a593Smuzhiyun 		uint64_t clkdiv:13;
151*4882a593Smuzhiyun 		uint64_t reserved_14_15:2;
152*4882a593Smuzhiyun 		uint64_t csena1:1;
153*4882a593Smuzhiyun 		uint64_t csena0:1;
154*4882a593Smuzhiyun 		uint64_t cslate:1;
155*4882a593Smuzhiyun 		uint64_t tritx:1;
156*4882a593Smuzhiyun 		uint64_t idleclks:2;
157*4882a593Smuzhiyun 		uint64_t cshi:1;
158*4882a593Smuzhiyun 		uint64_t reserved_6_6:1;
159*4882a593Smuzhiyun 		uint64_t int_ena:1;
160*4882a593Smuzhiyun 		uint64_t lsbfirst:1;
161*4882a593Smuzhiyun 		uint64_t wireor:1;
162*4882a593Smuzhiyun 		uint64_t clk_cont:1;
163*4882a593Smuzhiyun 		uint64_t idlelo:1;
164*4882a593Smuzhiyun 		uint64_t enable:1;
165*4882a593Smuzhiyun #else
166*4882a593Smuzhiyun 		uint64_t enable:1;
167*4882a593Smuzhiyun 		uint64_t idlelo:1;
168*4882a593Smuzhiyun 		uint64_t clk_cont:1;
169*4882a593Smuzhiyun 		uint64_t wireor:1;
170*4882a593Smuzhiyun 		uint64_t lsbfirst:1;
171*4882a593Smuzhiyun 		uint64_t int_ena:1;
172*4882a593Smuzhiyun 		uint64_t reserved_6_6:1;
173*4882a593Smuzhiyun 		uint64_t cshi:1;
174*4882a593Smuzhiyun 		uint64_t idleclks:2;
175*4882a593Smuzhiyun 		uint64_t tritx:1;
176*4882a593Smuzhiyun 		uint64_t cslate:1;
177*4882a593Smuzhiyun 		uint64_t csena0:1;
178*4882a593Smuzhiyun 		uint64_t csena1:1;
179*4882a593Smuzhiyun 		uint64_t reserved_14_15:2;
180*4882a593Smuzhiyun 		uint64_t clkdiv:13;
181*4882a593Smuzhiyun 		uint64_t reserved_29_63:35;
182*4882a593Smuzhiyun #endif
183*4882a593Smuzhiyun 	} cn61xx;
184*4882a593Smuzhiyun 	struct cvmx_mpi_cfg_cn66xx {
185*4882a593Smuzhiyun #ifdef __BIG_ENDIAN_BITFIELD
186*4882a593Smuzhiyun 		uint64_t reserved_29_63:35;
187*4882a593Smuzhiyun 		uint64_t clkdiv:13;
188*4882a593Smuzhiyun 		uint64_t csena3:1;
189*4882a593Smuzhiyun 		uint64_t csena2:1;
190*4882a593Smuzhiyun 		uint64_t reserved_12_13:2;
191*4882a593Smuzhiyun 		uint64_t cslate:1;
192*4882a593Smuzhiyun 		uint64_t tritx:1;
193*4882a593Smuzhiyun 		uint64_t idleclks:2;
194*4882a593Smuzhiyun 		uint64_t cshi:1;
195*4882a593Smuzhiyun 		uint64_t reserved_6_6:1;
196*4882a593Smuzhiyun 		uint64_t int_ena:1;
197*4882a593Smuzhiyun 		uint64_t lsbfirst:1;
198*4882a593Smuzhiyun 		uint64_t wireor:1;
199*4882a593Smuzhiyun 		uint64_t clk_cont:1;
200*4882a593Smuzhiyun 		uint64_t idlelo:1;
201*4882a593Smuzhiyun 		uint64_t enable:1;
202*4882a593Smuzhiyun #else
203*4882a593Smuzhiyun 		uint64_t enable:1;
204*4882a593Smuzhiyun 		uint64_t idlelo:1;
205*4882a593Smuzhiyun 		uint64_t clk_cont:1;
206*4882a593Smuzhiyun 		uint64_t wireor:1;
207*4882a593Smuzhiyun 		uint64_t lsbfirst:1;
208*4882a593Smuzhiyun 		uint64_t int_ena:1;
209*4882a593Smuzhiyun 		uint64_t reserved_6_6:1;
210*4882a593Smuzhiyun 		uint64_t cshi:1;
211*4882a593Smuzhiyun 		uint64_t idleclks:2;
212*4882a593Smuzhiyun 		uint64_t tritx:1;
213*4882a593Smuzhiyun 		uint64_t cslate:1;
214*4882a593Smuzhiyun 		uint64_t reserved_12_13:2;
215*4882a593Smuzhiyun 		uint64_t csena2:1;
216*4882a593Smuzhiyun 		uint64_t csena3:1;
217*4882a593Smuzhiyun 		uint64_t clkdiv:13;
218*4882a593Smuzhiyun 		uint64_t reserved_29_63:35;
219*4882a593Smuzhiyun #endif
220*4882a593Smuzhiyun 	} cn66xx;
221*4882a593Smuzhiyun 	struct cvmx_mpi_cfg_cn61xx cnf71xx;
222*4882a593Smuzhiyun };
223*4882a593Smuzhiyun 
224*4882a593Smuzhiyun union cvmx_mpi_datx {
225*4882a593Smuzhiyun 	uint64_t u64;
226*4882a593Smuzhiyun 	struct cvmx_mpi_datx_s {
227*4882a593Smuzhiyun #ifdef __BIG_ENDIAN_BITFIELD
228*4882a593Smuzhiyun 		uint64_t reserved_8_63:56;
229*4882a593Smuzhiyun 		uint64_t data:8;
230*4882a593Smuzhiyun #else
231*4882a593Smuzhiyun 		uint64_t data:8;
232*4882a593Smuzhiyun 		uint64_t reserved_8_63:56;
233*4882a593Smuzhiyun #endif
234*4882a593Smuzhiyun 	} s;
235*4882a593Smuzhiyun 	struct cvmx_mpi_datx_s cn30xx;
236*4882a593Smuzhiyun 	struct cvmx_mpi_datx_s cn31xx;
237*4882a593Smuzhiyun 	struct cvmx_mpi_datx_s cn50xx;
238*4882a593Smuzhiyun 	struct cvmx_mpi_datx_s cn61xx;
239*4882a593Smuzhiyun 	struct cvmx_mpi_datx_s cn66xx;
240*4882a593Smuzhiyun 	struct cvmx_mpi_datx_s cnf71xx;
241*4882a593Smuzhiyun };
242*4882a593Smuzhiyun 
243*4882a593Smuzhiyun union cvmx_mpi_sts {
244*4882a593Smuzhiyun 	uint64_t u64;
245*4882a593Smuzhiyun 	struct cvmx_mpi_sts_s {
246*4882a593Smuzhiyun #ifdef __BIG_ENDIAN_BITFIELD
247*4882a593Smuzhiyun 		uint64_t reserved_13_63:51;
248*4882a593Smuzhiyun 		uint64_t rxnum:5;
249*4882a593Smuzhiyun 		uint64_t reserved_1_7:7;
250*4882a593Smuzhiyun 		uint64_t busy:1;
251*4882a593Smuzhiyun #else
252*4882a593Smuzhiyun 		uint64_t busy:1;
253*4882a593Smuzhiyun 		uint64_t reserved_1_7:7;
254*4882a593Smuzhiyun 		uint64_t rxnum:5;
255*4882a593Smuzhiyun 		uint64_t reserved_13_63:51;
256*4882a593Smuzhiyun #endif
257*4882a593Smuzhiyun 	} s;
258*4882a593Smuzhiyun 	struct cvmx_mpi_sts_s cn30xx;
259*4882a593Smuzhiyun 	struct cvmx_mpi_sts_s cn31xx;
260*4882a593Smuzhiyun 	struct cvmx_mpi_sts_s cn50xx;
261*4882a593Smuzhiyun 	struct cvmx_mpi_sts_s cn61xx;
262*4882a593Smuzhiyun 	struct cvmx_mpi_sts_s cn66xx;
263*4882a593Smuzhiyun 	struct cvmx_mpi_sts_s cnf71xx;
264*4882a593Smuzhiyun };
265*4882a593Smuzhiyun 
266*4882a593Smuzhiyun union cvmx_mpi_tx {
267*4882a593Smuzhiyun 	uint64_t u64;
268*4882a593Smuzhiyun 	struct cvmx_mpi_tx_s {
269*4882a593Smuzhiyun #ifdef __BIG_ENDIAN_BITFIELD
270*4882a593Smuzhiyun 		uint64_t reserved_22_63:42;
271*4882a593Smuzhiyun 		uint64_t csid:2;
272*4882a593Smuzhiyun 		uint64_t reserved_17_19:3;
273*4882a593Smuzhiyun 		uint64_t leavecs:1;
274*4882a593Smuzhiyun 		uint64_t reserved_13_15:3;
275*4882a593Smuzhiyun 		uint64_t txnum:5;
276*4882a593Smuzhiyun 		uint64_t reserved_5_7:3;
277*4882a593Smuzhiyun 		uint64_t totnum:5;
278*4882a593Smuzhiyun #else
279*4882a593Smuzhiyun 		uint64_t totnum:5;
280*4882a593Smuzhiyun 		uint64_t reserved_5_7:3;
281*4882a593Smuzhiyun 		uint64_t txnum:5;
282*4882a593Smuzhiyun 		uint64_t reserved_13_15:3;
283*4882a593Smuzhiyun 		uint64_t leavecs:1;
284*4882a593Smuzhiyun 		uint64_t reserved_17_19:3;
285*4882a593Smuzhiyun 		uint64_t csid:2;
286*4882a593Smuzhiyun 		uint64_t reserved_22_63:42;
287*4882a593Smuzhiyun #endif
288*4882a593Smuzhiyun 	} s;
289*4882a593Smuzhiyun 	struct cvmx_mpi_tx_cn30xx {
290*4882a593Smuzhiyun #ifdef __BIG_ENDIAN_BITFIELD
291*4882a593Smuzhiyun 		uint64_t reserved_17_63:47;
292*4882a593Smuzhiyun 		uint64_t leavecs:1;
293*4882a593Smuzhiyun 		uint64_t reserved_13_15:3;
294*4882a593Smuzhiyun 		uint64_t txnum:5;
295*4882a593Smuzhiyun 		uint64_t reserved_5_7:3;
296*4882a593Smuzhiyun 		uint64_t totnum:5;
297*4882a593Smuzhiyun #else
298*4882a593Smuzhiyun 		uint64_t totnum:5;
299*4882a593Smuzhiyun 		uint64_t reserved_5_7:3;
300*4882a593Smuzhiyun 		uint64_t txnum:5;
301*4882a593Smuzhiyun 		uint64_t reserved_13_15:3;
302*4882a593Smuzhiyun 		uint64_t leavecs:1;
303*4882a593Smuzhiyun 		uint64_t reserved_17_63:47;
304*4882a593Smuzhiyun #endif
305*4882a593Smuzhiyun 	} cn30xx;
306*4882a593Smuzhiyun 	struct cvmx_mpi_tx_cn30xx cn31xx;
307*4882a593Smuzhiyun 	struct cvmx_mpi_tx_cn30xx cn50xx;
308*4882a593Smuzhiyun 	struct cvmx_mpi_tx_cn61xx {
309*4882a593Smuzhiyun #ifdef __BIG_ENDIAN_BITFIELD
310*4882a593Smuzhiyun 		uint64_t reserved_21_63:43;
311*4882a593Smuzhiyun 		uint64_t csid:1;
312*4882a593Smuzhiyun 		uint64_t reserved_17_19:3;
313*4882a593Smuzhiyun 		uint64_t leavecs:1;
314*4882a593Smuzhiyun 		uint64_t reserved_13_15:3;
315*4882a593Smuzhiyun 		uint64_t txnum:5;
316*4882a593Smuzhiyun 		uint64_t reserved_5_7:3;
317*4882a593Smuzhiyun 		uint64_t totnum:5;
318*4882a593Smuzhiyun #else
319*4882a593Smuzhiyun 		uint64_t totnum:5;
320*4882a593Smuzhiyun 		uint64_t reserved_5_7:3;
321*4882a593Smuzhiyun 		uint64_t txnum:5;
322*4882a593Smuzhiyun 		uint64_t reserved_13_15:3;
323*4882a593Smuzhiyun 		uint64_t leavecs:1;
324*4882a593Smuzhiyun 		uint64_t reserved_17_19:3;
325*4882a593Smuzhiyun 		uint64_t csid:1;
326*4882a593Smuzhiyun 		uint64_t reserved_21_63:43;
327*4882a593Smuzhiyun #endif
328*4882a593Smuzhiyun 	} cn61xx;
329*4882a593Smuzhiyun 	struct cvmx_mpi_tx_s cn66xx;
330*4882a593Smuzhiyun 	struct cvmx_mpi_tx_cn61xx cnf71xx;
331*4882a593Smuzhiyun };
332*4882a593Smuzhiyun 
333*4882a593Smuzhiyun #endif /* __SPI_CAVIUM_H */
334