334 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2#ifndef __SPI_CAVIUM_H3#define __SPI_CAVIUM_H4 5#include <linux/clk.h>6 7#define OCTEON_SPI_MAX_BYTES 98#define OCTEON_SPI_MAX_CLOCK_HZ 160000009 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_BITFIELD45 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#else63 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#endif81 } s;82 struct cvmx_mpi_cfg_cn30xx {83#ifdef __BIG_ENDIAN_BITFIELD84 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#else99 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#endif114 } cn30xx;115 struct cvmx_mpi_cfg_cn31xx {116#ifdef __BIG_ENDIAN_BITFIELD117 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#else131 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#endif145 } cn31xx;146 struct cvmx_mpi_cfg_cn30xx cn50xx;147 struct cvmx_mpi_cfg_cn61xx {148#ifdef __BIG_ENDIAN_BITFIELD149 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#else166 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#endif183 } cn61xx;184 struct cvmx_mpi_cfg_cn66xx {185#ifdef __BIG_ENDIAN_BITFIELD186 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#else203 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#endif220 } 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_BITFIELD228 uint64_t reserved_8_63:56;229 uint64_t data:8;230#else231 uint64_t data:8;232 uint64_t reserved_8_63:56;233#endif234 } 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_BITFIELD247 uint64_t reserved_13_63:51;248 uint64_t rxnum:5;249 uint64_t reserved_1_7:7;250 uint64_t busy:1;251#else252 uint64_t busy:1;253 uint64_t reserved_1_7:7;254 uint64_t rxnum:5;255 uint64_t reserved_13_63:51;256#endif257 } 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_BITFIELD270 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#else279 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#endif288 } s;289 struct cvmx_mpi_tx_cn30xx {290#ifdef __BIG_ENDIAN_BITFIELD291 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#else298 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#endif305 } 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_BITFIELD310 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#else319 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#endif328 } cn61xx;329 struct cvmx_mpi_tx_s cn66xx;330 struct cvmx_mpi_tx_cn61xx cnf71xx;331};332 333#endif /* __SPI_CAVIUM_H */334