1*b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 263d49afeSJan Glauber #ifndef __SPI_CAVIUM_H 363d49afeSJan Glauber #define __SPI_CAVIUM_H 463d49afeSJan Glauber 57347a6c7SJan Glauber #include <linux/clk.h> 67347a6c7SJan Glauber 763d49afeSJan Glauber #define OCTEON_SPI_MAX_BYTES 9 863d49afeSJan Glauber #define OCTEON_SPI_MAX_CLOCK_HZ 16000000 963d49afeSJan Glauber 1063d49afeSJan Glauber struct octeon_spi_regs { 1163d49afeSJan Glauber int config; 1263d49afeSJan Glauber int status; 1363d49afeSJan Glauber int tx; 1463d49afeSJan Glauber int data; 1563d49afeSJan Glauber }; 1663d49afeSJan Glauber 1763d49afeSJan Glauber struct octeon_spi { 1863d49afeSJan Glauber void __iomem *register_base; 1963d49afeSJan Glauber u64 last_cfg; 2063d49afeSJan Glauber u64 cs_enax; 2163d49afeSJan Glauber int sys_freq; 2263d49afeSJan Glauber struct octeon_spi_regs regs; 237347a6c7SJan Glauber struct clk *clk; 2463d49afeSJan Glauber }; 2563d49afeSJan Glauber 2663d49afeSJan Glauber #define OCTEON_SPI_CFG(x) (x->regs.config) 2763d49afeSJan Glauber #define OCTEON_SPI_STS(x) (x->regs.status) 2863d49afeSJan Glauber #define OCTEON_SPI_TX(x) (x->regs.tx) 2963d49afeSJan Glauber #define OCTEON_SPI_DAT0(x) (x->regs.data) 3063d49afeSJan Glauber 3163d49afeSJan Glauber int octeon_spi_transfer_one_message(struct spi_master *master, 3263d49afeSJan Glauber struct spi_message *msg); 3363d49afeSJan Glauber 3422cc1b6bSJan Glauber /* MPI register descriptions */ 3522cc1b6bSJan Glauber 3622cc1b6bSJan Glauber #define CVMX_MPI_CFG (CVMX_ADD_IO_SEG(0x0001070000001000ull)) 3722cc1b6bSJan Glauber #define CVMX_MPI_DATX(offset) (CVMX_ADD_IO_SEG(0x0001070000001080ull) + ((offset) & 15) * 8) 3822cc1b6bSJan Glauber #define CVMX_MPI_STS (CVMX_ADD_IO_SEG(0x0001070000001008ull)) 3922cc1b6bSJan Glauber #define CVMX_MPI_TX (CVMX_ADD_IO_SEG(0x0001070000001010ull)) 4022cc1b6bSJan Glauber 4122cc1b6bSJan Glauber union cvmx_mpi_cfg { 4222cc1b6bSJan Glauber uint64_t u64; 4322cc1b6bSJan Glauber struct cvmx_mpi_cfg_s { 4422cc1b6bSJan Glauber #ifdef __BIG_ENDIAN_BITFIELD 4522cc1b6bSJan Glauber uint64_t reserved_29_63:35; 4622cc1b6bSJan Glauber uint64_t clkdiv:13; 4722cc1b6bSJan Glauber uint64_t csena3:1; 4822cc1b6bSJan Glauber uint64_t csena2:1; 4922cc1b6bSJan Glauber uint64_t csena1:1; 5022cc1b6bSJan Glauber uint64_t csena0:1; 5122cc1b6bSJan Glauber uint64_t cslate:1; 5222cc1b6bSJan Glauber uint64_t tritx:1; 5322cc1b6bSJan Glauber uint64_t idleclks:2; 5422cc1b6bSJan Glauber uint64_t cshi:1; 5522cc1b6bSJan Glauber uint64_t csena:1; 5622cc1b6bSJan Glauber uint64_t int_ena:1; 5722cc1b6bSJan Glauber uint64_t lsbfirst:1; 5822cc1b6bSJan Glauber uint64_t wireor:1; 5922cc1b6bSJan Glauber uint64_t clk_cont:1; 6022cc1b6bSJan Glauber uint64_t idlelo:1; 6122cc1b6bSJan Glauber uint64_t enable:1; 6222cc1b6bSJan Glauber #else 6322cc1b6bSJan Glauber uint64_t enable:1; 6422cc1b6bSJan Glauber uint64_t idlelo:1; 6522cc1b6bSJan Glauber uint64_t clk_cont:1; 6622cc1b6bSJan Glauber uint64_t wireor:1; 6722cc1b6bSJan Glauber uint64_t lsbfirst:1; 6822cc1b6bSJan Glauber uint64_t int_ena:1; 6922cc1b6bSJan Glauber uint64_t csena:1; 7022cc1b6bSJan Glauber uint64_t cshi:1; 7122cc1b6bSJan Glauber uint64_t idleclks:2; 7222cc1b6bSJan Glauber uint64_t tritx:1; 7322cc1b6bSJan Glauber uint64_t cslate:1; 7422cc1b6bSJan Glauber uint64_t csena0:1; 7522cc1b6bSJan Glauber uint64_t csena1:1; 7622cc1b6bSJan Glauber uint64_t csena2:1; 7722cc1b6bSJan Glauber uint64_t csena3:1; 7822cc1b6bSJan Glauber uint64_t clkdiv:13; 7922cc1b6bSJan Glauber uint64_t reserved_29_63:35; 8022cc1b6bSJan Glauber #endif 8122cc1b6bSJan Glauber } s; 8222cc1b6bSJan Glauber struct cvmx_mpi_cfg_cn30xx { 8322cc1b6bSJan Glauber #ifdef __BIG_ENDIAN_BITFIELD 8422cc1b6bSJan Glauber uint64_t reserved_29_63:35; 8522cc1b6bSJan Glauber uint64_t clkdiv:13; 8622cc1b6bSJan Glauber uint64_t reserved_12_15:4; 8722cc1b6bSJan Glauber uint64_t cslate:1; 8822cc1b6bSJan Glauber uint64_t tritx:1; 8922cc1b6bSJan Glauber uint64_t idleclks:2; 9022cc1b6bSJan Glauber uint64_t cshi:1; 9122cc1b6bSJan Glauber uint64_t csena:1; 9222cc1b6bSJan Glauber uint64_t int_ena:1; 9322cc1b6bSJan Glauber uint64_t lsbfirst:1; 9422cc1b6bSJan Glauber uint64_t wireor:1; 9522cc1b6bSJan Glauber uint64_t clk_cont:1; 9622cc1b6bSJan Glauber uint64_t idlelo:1; 9722cc1b6bSJan Glauber uint64_t enable:1; 9822cc1b6bSJan Glauber #else 9922cc1b6bSJan Glauber uint64_t enable:1; 10022cc1b6bSJan Glauber uint64_t idlelo:1; 10122cc1b6bSJan Glauber uint64_t clk_cont:1; 10222cc1b6bSJan Glauber uint64_t wireor:1; 10322cc1b6bSJan Glauber uint64_t lsbfirst:1; 10422cc1b6bSJan Glauber uint64_t int_ena:1; 10522cc1b6bSJan Glauber uint64_t csena:1; 10622cc1b6bSJan Glauber uint64_t cshi:1; 10722cc1b6bSJan Glauber uint64_t idleclks:2; 10822cc1b6bSJan Glauber uint64_t tritx:1; 10922cc1b6bSJan Glauber uint64_t cslate:1; 11022cc1b6bSJan Glauber uint64_t reserved_12_15:4; 11122cc1b6bSJan Glauber uint64_t clkdiv:13; 11222cc1b6bSJan Glauber uint64_t reserved_29_63:35; 11322cc1b6bSJan Glauber #endif 11422cc1b6bSJan Glauber } cn30xx; 11522cc1b6bSJan Glauber struct cvmx_mpi_cfg_cn31xx { 11622cc1b6bSJan Glauber #ifdef __BIG_ENDIAN_BITFIELD 11722cc1b6bSJan Glauber uint64_t reserved_29_63:35; 11822cc1b6bSJan Glauber uint64_t clkdiv:13; 11922cc1b6bSJan Glauber uint64_t reserved_11_15:5; 12022cc1b6bSJan Glauber uint64_t tritx:1; 12122cc1b6bSJan Glauber uint64_t idleclks:2; 12222cc1b6bSJan Glauber uint64_t cshi:1; 12322cc1b6bSJan Glauber uint64_t csena:1; 12422cc1b6bSJan Glauber uint64_t int_ena:1; 12522cc1b6bSJan Glauber uint64_t lsbfirst:1; 12622cc1b6bSJan Glauber uint64_t wireor:1; 12722cc1b6bSJan Glauber uint64_t clk_cont:1; 12822cc1b6bSJan Glauber uint64_t idlelo:1; 12922cc1b6bSJan Glauber uint64_t enable:1; 13022cc1b6bSJan Glauber #else 13122cc1b6bSJan Glauber uint64_t enable:1; 13222cc1b6bSJan Glauber uint64_t idlelo:1; 13322cc1b6bSJan Glauber uint64_t clk_cont:1; 13422cc1b6bSJan Glauber uint64_t wireor:1; 13522cc1b6bSJan Glauber uint64_t lsbfirst:1; 13622cc1b6bSJan Glauber uint64_t int_ena:1; 13722cc1b6bSJan Glauber uint64_t csena:1; 13822cc1b6bSJan Glauber uint64_t cshi:1; 13922cc1b6bSJan Glauber uint64_t idleclks:2; 14022cc1b6bSJan Glauber uint64_t tritx:1; 14122cc1b6bSJan Glauber uint64_t reserved_11_15:5; 14222cc1b6bSJan Glauber uint64_t clkdiv:13; 14322cc1b6bSJan Glauber uint64_t reserved_29_63:35; 14422cc1b6bSJan Glauber #endif 14522cc1b6bSJan Glauber } cn31xx; 14622cc1b6bSJan Glauber struct cvmx_mpi_cfg_cn30xx cn50xx; 14722cc1b6bSJan Glauber struct cvmx_mpi_cfg_cn61xx { 14822cc1b6bSJan Glauber #ifdef __BIG_ENDIAN_BITFIELD 14922cc1b6bSJan Glauber uint64_t reserved_29_63:35; 15022cc1b6bSJan Glauber uint64_t clkdiv:13; 15122cc1b6bSJan Glauber uint64_t reserved_14_15:2; 15222cc1b6bSJan Glauber uint64_t csena1:1; 15322cc1b6bSJan Glauber uint64_t csena0:1; 15422cc1b6bSJan Glauber uint64_t cslate:1; 15522cc1b6bSJan Glauber uint64_t tritx:1; 15622cc1b6bSJan Glauber uint64_t idleclks:2; 15722cc1b6bSJan Glauber uint64_t cshi:1; 15822cc1b6bSJan Glauber uint64_t reserved_6_6:1; 15922cc1b6bSJan Glauber uint64_t int_ena:1; 16022cc1b6bSJan Glauber uint64_t lsbfirst:1; 16122cc1b6bSJan Glauber uint64_t wireor:1; 16222cc1b6bSJan Glauber uint64_t clk_cont:1; 16322cc1b6bSJan Glauber uint64_t idlelo:1; 16422cc1b6bSJan Glauber uint64_t enable:1; 16522cc1b6bSJan Glauber #else 16622cc1b6bSJan Glauber uint64_t enable:1; 16722cc1b6bSJan Glauber uint64_t idlelo:1; 16822cc1b6bSJan Glauber uint64_t clk_cont:1; 16922cc1b6bSJan Glauber uint64_t wireor:1; 17022cc1b6bSJan Glauber uint64_t lsbfirst:1; 17122cc1b6bSJan Glauber uint64_t int_ena:1; 17222cc1b6bSJan Glauber uint64_t reserved_6_6:1; 17322cc1b6bSJan Glauber uint64_t cshi:1; 17422cc1b6bSJan Glauber uint64_t idleclks:2; 17522cc1b6bSJan Glauber uint64_t tritx:1; 17622cc1b6bSJan Glauber uint64_t cslate:1; 17722cc1b6bSJan Glauber uint64_t csena0:1; 17822cc1b6bSJan Glauber uint64_t csena1:1; 17922cc1b6bSJan Glauber uint64_t reserved_14_15:2; 18022cc1b6bSJan Glauber uint64_t clkdiv:13; 18122cc1b6bSJan Glauber uint64_t reserved_29_63:35; 18222cc1b6bSJan Glauber #endif 18322cc1b6bSJan Glauber } cn61xx; 18422cc1b6bSJan Glauber struct cvmx_mpi_cfg_cn66xx { 18522cc1b6bSJan Glauber #ifdef __BIG_ENDIAN_BITFIELD 18622cc1b6bSJan Glauber uint64_t reserved_29_63:35; 18722cc1b6bSJan Glauber uint64_t clkdiv:13; 18822cc1b6bSJan Glauber uint64_t csena3:1; 18922cc1b6bSJan Glauber uint64_t csena2:1; 19022cc1b6bSJan Glauber uint64_t reserved_12_13:2; 19122cc1b6bSJan Glauber uint64_t cslate:1; 19222cc1b6bSJan Glauber uint64_t tritx:1; 19322cc1b6bSJan Glauber uint64_t idleclks:2; 19422cc1b6bSJan Glauber uint64_t cshi:1; 19522cc1b6bSJan Glauber uint64_t reserved_6_6:1; 19622cc1b6bSJan Glauber uint64_t int_ena:1; 19722cc1b6bSJan Glauber uint64_t lsbfirst:1; 19822cc1b6bSJan Glauber uint64_t wireor:1; 19922cc1b6bSJan Glauber uint64_t clk_cont:1; 20022cc1b6bSJan Glauber uint64_t idlelo:1; 20122cc1b6bSJan Glauber uint64_t enable:1; 20222cc1b6bSJan Glauber #else 20322cc1b6bSJan Glauber uint64_t enable:1; 20422cc1b6bSJan Glauber uint64_t idlelo:1; 20522cc1b6bSJan Glauber uint64_t clk_cont:1; 20622cc1b6bSJan Glauber uint64_t wireor:1; 20722cc1b6bSJan Glauber uint64_t lsbfirst:1; 20822cc1b6bSJan Glauber uint64_t int_ena:1; 20922cc1b6bSJan Glauber uint64_t reserved_6_6:1; 21022cc1b6bSJan Glauber uint64_t cshi:1; 21122cc1b6bSJan Glauber uint64_t idleclks:2; 21222cc1b6bSJan Glauber uint64_t tritx:1; 21322cc1b6bSJan Glauber uint64_t cslate:1; 21422cc1b6bSJan Glauber uint64_t reserved_12_13:2; 21522cc1b6bSJan Glauber uint64_t csena2:1; 21622cc1b6bSJan Glauber uint64_t csena3:1; 21722cc1b6bSJan Glauber uint64_t clkdiv:13; 21822cc1b6bSJan Glauber uint64_t reserved_29_63:35; 21922cc1b6bSJan Glauber #endif 22022cc1b6bSJan Glauber } cn66xx; 22122cc1b6bSJan Glauber struct cvmx_mpi_cfg_cn61xx cnf71xx; 22222cc1b6bSJan Glauber }; 22322cc1b6bSJan Glauber 22422cc1b6bSJan Glauber union cvmx_mpi_datx { 22522cc1b6bSJan Glauber uint64_t u64; 22622cc1b6bSJan Glauber struct cvmx_mpi_datx_s { 22722cc1b6bSJan Glauber #ifdef __BIG_ENDIAN_BITFIELD 22822cc1b6bSJan Glauber uint64_t reserved_8_63:56; 22922cc1b6bSJan Glauber uint64_t data:8; 23022cc1b6bSJan Glauber #else 23122cc1b6bSJan Glauber uint64_t data:8; 23222cc1b6bSJan Glauber uint64_t reserved_8_63:56; 23322cc1b6bSJan Glauber #endif 23422cc1b6bSJan Glauber } s; 23522cc1b6bSJan Glauber struct cvmx_mpi_datx_s cn30xx; 23622cc1b6bSJan Glauber struct cvmx_mpi_datx_s cn31xx; 23722cc1b6bSJan Glauber struct cvmx_mpi_datx_s cn50xx; 23822cc1b6bSJan Glauber struct cvmx_mpi_datx_s cn61xx; 23922cc1b6bSJan Glauber struct cvmx_mpi_datx_s cn66xx; 24022cc1b6bSJan Glauber struct cvmx_mpi_datx_s cnf71xx; 24122cc1b6bSJan Glauber }; 24222cc1b6bSJan Glauber 24322cc1b6bSJan Glauber union cvmx_mpi_sts { 24422cc1b6bSJan Glauber uint64_t u64; 24522cc1b6bSJan Glauber struct cvmx_mpi_sts_s { 24622cc1b6bSJan Glauber #ifdef __BIG_ENDIAN_BITFIELD 24722cc1b6bSJan Glauber uint64_t reserved_13_63:51; 24822cc1b6bSJan Glauber uint64_t rxnum:5; 24922cc1b6bSJan Glauber uint64_t reserved_1_7:7; 25022cc1b6bSJan Glauber uint64_t busy:1; 25122cc1b6bSJan Glauber #else 25222cc1b6bSJan Glauber uint64_t busy:1; 25322cc1b6bSJan Glauber uint64_t reserved_1_7:7; 25422cc1b6bSJan Glauber uint64_t rxnum:5; 25522cc1b6bSJan Glauber uint64_t reserved_13_63:51; 25622cc1b6bSJan Glauber #endif 25722cc1b6bSJan Glauber } s; 25822cc1b6bSJan Glauber struct cvmx_mpi_sts_s cn30xx; 25922cc1b6bSJan Glauber struct cvmx_mpi_sts_s cn31xx; 26022cc1b6bSJan Glauber struct cvmx_mpi_sts_s cn50xx; 26122cc1b6bSJan Glauber struct cvmx_mpi_sts_s cn61xx; 26222cc1b6bSJan Glauber struct cvmx_mpi_sts_s cn66xx; 26322cc1b6bSJan Glauber struct cvmx_mpi_sts_s cnf71xx; 26422cc1b6bSJan Glauber }; 26522cc1b6bSJan Glauber 26622cc1b6bSJan Glauber union cvmx_mpi_tx { 26722cc1b6bSJan Glauber uint64_t u64; 26822cc1b6bSJan Glauber struct cvmx_mpi_tx_s { 26922cc1b6bSJan Glauber #ifdef __BIG_ENDIAN_BITFIELD 27022cc1b6bSJan Glauber uint64_t reserved_22_63:42; 27122cc1b6bSJan Glauber uint64_t csid:2; 27222cc1b6bSJan Glauber uint64_t reserved_17_19:3; 27322cc1b6bSJan Glauber uint64_t leavecs:1; 27422cc1b6bSJan Glauber uint64_t reserved_13_15:3; 27522cc1b6bSJan Glauber uint64_t txnum:5; 27622cc1b6bSJan Glauber uint64_t reserved_5_7:3; 27722cc1b6bSJan Glauber uint64_t totnum:5; 27822cc1b6bSJan Glauber #else 27922cc1b6bSJan Glauber uint64_t totnum:5; 28022cc1b6bSJan Glauber uint64_t reserved_5_7:3; 28122cc1b6bSJan Glauber uint64_t txnum:5; 28222cc1b6bSJan Glauber uint64_t reserved_13_15:3; 28322cc1b6bSJan Glauber uint64_t leavecs:1; 28422cc1b6bSJan Glauber uint64_t reserved_17_19:3; 28522cc1b6bSJan Glauber uint64_t csid:2; 28622cc1b6bSJan Glauber uint64_t reserved_22_63:42; 28722cc1b6bSJan Glauber #endif 28822cc1b6bSJan Glauber } s; 28922cc1b6bSJan Glauber struct cvmx_mpi_tx_cn30xx { 29022cc1b6bSJan Glauber #ifdef __BIG_ENDIAN_BITFIELD 29122cc1b6bSJan Glauber uint64_t reserved_17_63:47; 29222cc1b6bSJan Glauber uint64_t leavecs:1; 29322cc1b6bSJan Glauber uint64_t reserved_13_15:3; 29422cc1b6bSJan Glauber uint64_t txnum:5; 29522cc1b6bSJan Glauber uint64_t reserved_5_7:3; 29622cc1b6bSJan Glauber uint64_t totnum:5; 29722cc1b6bSJan Glauber #else 29822cc1b6bSJan Glauber uint64_t totnum:5; 29922cc1b6bSJan Glauber uint64_t reserved_5_7:3; 30022cc1b6bSJan Glauber uint64_t txnum:5; 30122cc1b6bSJan Glauber uint64_t reserved_13_15:3; 30222cc1b6bSJan Glauber uint64_t leavecs:1; 30322cc1b6bSJan Glauber uint64_t reserved_17_63:47; 30422cc1b6bSJan Glauber #endif 30522cc1b6bSJan Glauber } cn30xx; 30622cc1b6bSJan Glauber struct cvmx_mpi_tx_cn30xx cn31xx; 30722cc1b6bSJan Glauber struct cvmx_mpi_tx_cn30xx cn50xx; 30822cc1b6bSJan Glauber struct cvmx_mpi_tx_cn61xx { 30922cc1b6bSJan Glauber #ifdef __BIG_ENDIAN_BITFIELD 31022cc1b6bSJan Glauber uint64_t reserved_21_63:43; 31122cc1b6bSJan Glauber uint64_t csid:1; 31222cc1b6bSJan Glauber uint64_t reserved_17_19:3; 31322cc1b6bSJan Glauber uint64_t leavecs:1; 31422cc1b6bSJan Glauber uint64_t reserved_13_15:3; 31522cc1b6bSJan Glauber uint64_t txnum:5; 31622cc1b6bSJan Glauber uint64_t reserved_5_7:3; 31722cc1b6bSJan Glauber uint64_t totnum:5; 31822cc1b6bSJan Glauber #else 31922cc1b6bSJan Glauber uint64_t totnum:5; 32022cc1b6bSJan Glauber uint64_t reserved_5_7:3; 32122cc1b6bSJan Glauber uint64_t txnum:5; 32222cc1b6bSJan Glauber uint64_t reserved_13_15:3; 32322cc1b6bSJan Glauber uint64_t leavecs:1; 32422cc1b6bSJan Glauber uint64_t reserved_17_19:3; 32522cc1b6bSJan Glauber uint64_t csid:1; 32622cc1b6bSJan Glauber uint64_t reserved_21_63:43; 32722cc1b6bSJan Glauber #endif 32822cc1b6bSJan Glauber } cn61xx; 32922cc1b6bSJan Glauber struct cvmx_mpi_tx_s cn66xx; 33022cc1b6bSJan Glauber struct cvmx_mpi_tx_cn61xx cnf71xx; 33122cc1b6bSJan Glauber }; 33263d49afeSJan Glauber 33363d49afeSJan Glauber #endif /* __SPI_CAVIUM_H */ 334