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