xref: /linux/drivers/spi/spi-axiado.h (revision c17ee635fd3a482b2ad2bf5e269755c2eae5f25e)
1*e75a6b00SVladimir Moravcevic /* SPDX-License-Identifier: GPL-2.0-or-later */
2*e75a6b00SVladimir Moravcevic /*
3*e75a6b00SVladimir Moravcevic  * Axiado SPI controller driver (Host mode only)
4*e75a6b00SVladimir Moravcevic  *
5*e75a6b00SVladimir Moravcevic  * Copyright (C) 2022-2025 Axiado Corporation (or its affiliates).
6*e75a6b00SVladimir Moravcevic  */
7*e75a6b00SVladimir Moravcevic 
8*e75a6b00SVladimir Moravcevic #ifndef SPI_AXIADO_H
9*e75a6b00SVladimir Moravcevic #define SPI_AXIADO_H
10*e75a6b00SVladimir Moravcevic 
11*e75a6b00SVladimir Moravcevic /* Name of this driver */
12*e75a6b00SVladimir Moravcevic #define AX_SPI_NAME			"axiado-db-spi"
13*e75a6b00SVladimir Moravcevic 
14*e75a6b00SVladimir Moravcevic /* Axiado - SPI Digital Blocks IP design registers */
15*e75a6b00SVladimir Moravcevic #define AX_SPI_TX_FAETR			0x18    // TX-FAETR
16*e75a6b00SVladimir Moravcevic #define ALMOST_EMPTY_TRESHOLD		0x00	// Programmed threshold value
17*e75a6b00SVladimir Moravcevic #define AX_SPI_RX_FAFTR			0x28    // RX-FAETR
18*e75a6b00SVladimir Moravcevic #define ALMOST_FULL_TRESHOLD		0x0c	// Programmed threshold value
19*e75a6b00SVladimir Moravcevic #define FIFO_DEPTH			256	// 256 bytes
20*e75a6b00SVladimir Moravcevic 
21*e75a6b00SVladimir Moravcevic #define AX_SPI_CR1			0x00	// CR1
22*e75a6b00SVladimir Moravcevic #define AX_SPI_CR1_CLR			0x00	// CR1 - Clear
23*e75a6b00SVladimir Moravcevic #define AX_SPI_CR1_SCR			0x01	// CR1 - controller reset
24*e75a6b00SVladimir Moravcevic #define AX_SPI_CR1_SCE			0x02	// CR1 - Controller Enable/Disable
25*e75a6b00SVladimir Moravcevic #define AX_SPI_CR1_CPHA			0x08	// CR1 - CPH
26*e75a6b00SVladimir Moravcevic #define AX_SPI_CR1_CPOL			0x10	// CR1 - CPO
27*e75a6b00SVladimir Moravcevic 
28*e75a6b00SVladimir Moravcevic #define AX_SPI_CR2			0x04	// CR2
29*e75a6b00SVladimir Moravcevic #define AX_SPI_CR2_SWD			0x04	// CR2 - Write Enabel/Disable
30*e75a6b00SVladimir Moravcevic #define AX_SPI_CR2_SRD			0x08	// CR2 - Read Enable/Disable
31*e75a6b00SVladimir Moravcevic #define AX_SPI_CR2_SRI			0x10	// CR2 - Read First Byte Ignore
32*e75a6b00SVladimir Moravcevic #define AX_SPI_CR2_HTE			0x40	// CR2 - Host Transmit Enable
33*e75a6b00SVladimir Moravcevic #define AX_SPI_CR3			0x08	// CR3
34*e75a6b00SVladimir Moravcevic #define AX_SPI_CR3_SDL			0x00	// CR3 - Data lines
35*e75a6b00SVladimir Moravcevic #define AX_SPI_CR3_QUAD			0x02	// CR3 - Data lines
36*e75a6b00SVladimir Moravcevic 
37*e75a6b00SVladimir Moravcevic /* As per Digital Blocks datasheet clock frequency range
38*e75a6b00SVladimir Moravcevic  * Min - 244KHz
39*e75a6b00SVladimir Moravcevic  * Max - 62.5MHz
40*e75a6b00SVladimir Moravcevic  * SCK Clock Divider Register Values
41*e75a6b00SVladimir Moravcevic  */
42*e75a6b00SVladimir Moravcevic #define AX_SPI_RX_FBCAR			0x24	// RX_FBCAR
43*e75a6b00SVladimir Moravcevic #define AX_SPI_TX_FBCAR			0x14	// TX_FBCAR
44*e75a6b00SVladimir Moravcevic #define AX_SPI_SCDR			0x2c	// SCDR
45*e75a6b00SVladimir Moravcevic #define AX_SPI_SCD_MIN			0x1fe	// Valid SCD (SCK Clock Divider Register)
46*e75a6b00SVladimir Moravcevic #define AX_SPI_SCD_DEFAULT		0x06	// Default SCD (SCK Clock Divider Register)
47*e75a6b00SVladimir Moravcevic #define AX_SPI_SCD_MAX			0x00	// Valid SCD (SCK Clock Divider Register)
48*e75a6b00SVladimir Moravcevic #define AX_SPI_SCDR_SCS			0x0200	// SCDR - AMBA Bus Clock source
49*e75a6b00SVladimir Moravcevic 
50*e75a6b00SVladimir Moravcevic #define AX_SPI_IMR			0x34	// IMR
51*e75a6b00SVladimir Moravcevic #define AX_SPI_IMR_CLR			0x00	// IMR - Clear
52*e75a6b00SVladimir Moravcevic #define AX_SPI_IMR_TFOM			0x02	// IMR - TFO
53*e75a6b00SVladimir Moravcevic #define AX_SPI_IMR_MTCM			0x40	// IMR - MTC
54*e75a6b00SVladimir Moravcevic #define AX_SPI_IMR_TFEM			0x10	// IMR - TFE
55*e75a6b00SVladimir Moravcevic #define AX_SPI_IMR_RFFM			0x20	// IMR - RFFM
56*e75a6b00SVladimir Moravcevic 
57*e75a6b00SVladimir Moravcevic #define AX_SPI_ISR			0x30	// ISR
58*e75a6b00SVladimir Moravcevic #define AX_SPI_ISR_CLR			0xff	// ISR - Clear
59*e75a6b00SVladimir Moravcevic #define AX_SPI_ISR_MTC			0x40	// ISR - MTC
60*e75a6b00SVladimir Moravcevic #define AX_SPI_ISR_TFE			0x10	// ISR - TFE
61*e75a6b00SVladimir Moravcevic #define AX_SPI_ISR_RFF			0x20	// ISR - RFF
62*e75a6b00SVladimir Moravcevic 
63*e75a6b00SVladimir Moravcevic #define AX_SPI_IVR			0x38	// IVR
64*e75a6b00SVladimir Moravcevic #define AX_SPI_IVR_TFOV			0x02	// IVR - TFOV
65*e75a6b00SVladimir Moravcevic #define AX_SPI_IVR_MTCV			0x40	// IVR - MTCV
66*e75a6b00SVladimir Moravcevic #define AX_SPI_IVR_TFEV			0x10	// IVR - TFEV
67*e75a6b00SVladimir Moravcevic #define AX_SPI_IVR_RFFV			0x20	// IVR - RFFV
68*e75a6b00SVladimir Moravcevic 
69*e75a6b00SVladimir Moravcevic #define AX_SPI_TXFIFO			0x0c	// TX_FIFO
70*e75a6b00SVladimir Moravcevic #define AX_SPI_TX_RX_FBCR		0x10	// TX_RX_FBCR
71*e75a6b00SVladimir Moravcevic #define AX_SPI_RXFIFO			0x1c	// RX_FIFO
72*e75a6b00SVladimir Moravcevic 
73*e75a6b00SVladimir Moravcevic #define AX_SPI_TS0			0x00	// Target select 0
74*e75a6b00SVladimir Moravcevic #define AX_SPI_TS1			0x01	// Target select 1
75*e75a6b00SVladimir Moravcevic #define AX_SPI_TS2			0x10	// Target select 2
76*e75a6b00SVladimir Moravcevic #define AX_SPI_TS3			0x11	// Target select 3
77*e75a6b00SVladimir Moravcevic 
78*e75a6b00SVladimir Moravcevic #define SPI_AUTOSUSPEND_TIMEOUT		3000
79*e75a6b00SVladimir Moravcevic 
80*e75a6b00SVladimir Moravcevic /* Default number of chip select lines also used as maximum number of chip select lines */
81*e75a6b00SVladimir Moravcevic #define AX_SPI_DEFAULT_NUM_CS		4
82*e75a6b00SVladimir Moravcevic 
83*e75a6b00SVladimir Moravcevic /* Default number of command buffer size */
84*e75a6b00SVladimir Moravcevic #define AX_SPI_COMMAND_BUFFER_SIZE	16	//Command + address bytes
85*e75a6b00SVladimir Moravcevic 
86*e75a6b00SVladimir Moravcevic /* Target select mask
87*e75a6b00SVladimir Moravcevic  * 00 – TS0
88*e75a6b00SVladimir Moravcevic  * 01 – TS1
89*e75a6b00SVladimir Moravcevic  * 10 – TS2
90*e75a6b00SVladimir Moravcevic  * 11 – TS3
91*e75a6b00SVladimir Moravcevic  */
92*e75a6b00SVladimir Moravcevic #define AX_SPI_DEFAULT_TS_MASK		0x03
93*e75a6b00SVladimir Moravcevic 
94*e75a6b00SVladimir Moravcevic #define AX_SPI_RX_FIFO_DRAIN_LIMIT	24
95*e75a6b00SVladimir Moravcevic #define AX_SPI_TRX_FIFO_TIMEOUT		1000
96*e75a6b00SVladimir Moravcevic /**
97*e75a6b00SVladimir Moravcevic  * struct ax_spi - This definition defines spi driver instance
98*e75a6b00SVladimir Moravcevic  * @regs:					Virtual address of the SPI controller registers
99*e75a6b00SVladimir Moravcevic  * @ref_clk:					Pointer to the peripheral clock
100*e75a6b00SVladimir Moravcevic  * @pclk:					Pointer to the APB clock
101*e75a6b00SVladimir Moravcevic  * @speed_hz:					Current SPI bus clock speed in Hz
102*e75a6b00SVladimir Moravcevic  * @txbuf:					Pointer	to the TX buffer
103*e75a6b00SVladimir Moravcevic  * @rxbuf:					Pointer to the RX buffer
104*e75a6b00SVladimir Moravcevic  * @tx_bytes:					Number of bytes left to transfer
105*e75a6b00SVladimir Moravcevic  * @rx_bytes:					Number of bytes requested
106*e75a6b00SVladimir Moravcevic  * @tx_fifo_depth:				Depth of the TX FIFO
107*e75a6b00SVladimir Moravcevic  * @current_rx_fifo_word:			Buffers the 32-bit word read from RXFIFO
108*e75a6b00SVladimir Moravcevic  * @bytes_left_in_current_rx_word:		Bytes to be extracted from current 32-bit word
109*e75a6b00SVladimir Moravcevic  * @current_rx_fifo_word_for_irq:		Buffers the 32-bit word read from RXFIFO for IRQ
110*e75a6b00SVladimir Moravcevic  * @bytes_left_in_current_rx_word_for_irq:	IRQ bytes to be extracted from current 32-bit word
111*e75a6b00SVladimir Moravcevic  * @rx_discard:					Number of bytes to discard
112*e75a6b00SVladimir Moravcevic  * @rx_copy_remaining:				Number of bytes to copy
113*e75a6b00SVladimir Moravcevic  */
114*e75a6b00SVladimir Moravcevic struct ax_spi {
115*e75a6b00SVladimir Moravcevic 	void __iomem *regs;
116*e75a6b00SVladimir Moravcevic 	struct clk *ref_clk;
117*e75a6b00SVladimir Moravcevic 	struct clk *pclk;
118*e75a6b00SVladimir Moravcevic 	unsigned int clk_rate;
119*e75a6b00SVladimir Moravcevic 	u32 speed_hz;
120*e75a6b00SVladimir Moravcevic 	const u8 *tx_buf;
121*e75a6b00SVladimir Moravcevic 	u8 *rx_buf;
122*e75a6b00SVladimir Moravcevic 	int tx_bytes;
123*e75a6b00SVladimir Moravcevic 	int rx_bytes;
124*e75a6b00SVladimir Moravcevic 	unsigned int tx_fifo_depth;
125*e75a6b00SVladimir Moravcevic 	u32 current_rx_fifo_word;
126*e75a6b00SVladimir Moravcevic 	int bytes_left_in_current_rx_word;
127*e75a6b00SVladimir Moravcevic 	u32 current_rx_fifo_word_for_irq;
128*e75a6b00SVladimir Moravcevic 	int bytes_left_in_current_rx_word_for_irq;
129*e75a6b00SVladimir Moravcevic 	int rx_discard;
130*e75a6b00SVladimir Moravcevic 	int rx_copy_remaining;
131*e75a6b00SVladimir Moravcevic };
132*e75a6b00SVladimir Moravcevic 
133*e75a6b00SVladimir Moravcevic #endif /* SPI_AXIADO_H */
134