xref: /openbmc/linux/drivers/spi/spi-cavium.h (revision b2441318)
1b2441318SGreg 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