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
10struct octeon_spi_regs {
11	int config;
12	int status;
13	int tx;
14	int data;
15};
16
17struct 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
31int 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
41union 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
224union 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
243union 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
266union 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