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