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