Merge tag 'spi-fix-v5.5-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi
[sfrench/cifs-2.6.git] / drivers / spi / spi-cavium.h
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_master *master,
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 */