blob: 6521b5e9d5041f885f67f94def25c2eb8fe71494 [file] [log] [blame]
b.liue9582032025-04-17 19:18:16 +08001// SPDX-License-Identifier: GPL-2.0
2/*
3 * Support for asr spi controller
4 *
5 * Copyright (C) 2019 ASR Micro Limited
6 *
7 * Tim Wang <timwang@asrmicro.com>
8 */
9
10#ifndef _SPI_ASR_H
11#define _SPI_ASR_H
12
13#include <linux/atomic.h>
14#include <linux/dmaengine.h>
15#include <linux/errno.h>
16#include <linux/io.h>
17#include <linux/interrupt.h>
18#include <linux/platform_device.h>
19#include <linux/scatterlist.h>
20#include <linux/sizes.h>
21#include <linux/spi/spi.h>
22#include <linux/pm_qos.h>
23#include <linux/list.h>
24#include <linux/io.h>
25#include <linux/of.h>
26#include <linux/spi/spi-mem.h>
27
28/* ASR 180x/190x SPI Registers */
29#define TOP_CTRL 0x00 /* SSP Top Control Register */
30#define FIFO_CTRL 0x04 /* SSP FIFO Control Register */
31#define INT_EN 0x08 /* SSP Interrupt Enable Register */
32#define TO 0x0C /* SSP Time Out Register */
33#define DATAR 0x10 /* SSP Data Register */
34#define STATUS 0x14 /* SSP Stauts Register */
35#define PSP_CTRL 0x18 /* SSP Programmable Serial Protocal Control Register */
36#define NET_WORK_CTRL 0x1C /* SSP NET Work Control Register */
37#define NET_WORK_STATUS 0x20 /* SSP Net Work Status Register */
38#define RWOT_CTRL 0x24 /* SSP RWOT Control Register */
39#define RWOT_CCM 0x28 /* SSP RWOT Counter Cycles Match Register */
40#define RWOT_CVWRn 0x2C /* SSP RWOT Counter Value Write for Read Request Register */
41#define MISC_CTRL 0x30
42
43/* 0x00 TOP_CTRL */
44#define TOP_TTELP (1 << 18)
45#define TOP_TTE (1 << 17)
46#define TOP_SCFR (1 << 16)
47#define TOP_IFS (1 << 15)
48#define TOP_HOLD_FRAME_LOW (1 << 14)
49#define TOP_TRAIL (1 << 13)
50#define TOP_LBM (1 << 12)
51#define TOP_SPH (1 << 11)
52#define TOP_SPO (1 << 10)
53#define TOP_DSS(x) ((x - 1) << 5)
54#define TOP_DSS_MASK (0x1F << 5)
55#define TOP_SFRMDIR (1 << 4)
56#define TOP_SCLKDIR (1 << 3)
57#define TOP_FRF_MASK (0x3 << 1)
58#define TOP_FRF_Motorola (0x0 << 1) /* Motorola's Serial Peripheral Interface (SPI) */
59#define TOP_FRF_TI (0x1 << 1) /* Texas Instruments' Synchronous Serial Protocol (SSP) */
60#define TOP_FRF_National (0x2 << 1) /* National Microwire */
61#define TOP_FRF_PSP (0x3 << 1) /* Programmable Serial Protocol(PSP) */
62#define TOP_SSE (1 << 0)
63
64/* 0x04 FIFO_CTRL */
65#define FIFO_STRF (1 << 19)
66#define FIFO_EFWR (1 << 18)
67#define FIFO_RXFIFO_AUTO_FULL_CTRL (1 << 17)
68#define FIFO_FPCKE (1 << 16)
69#define FIFO_TXFIFO_WR_ENDIAN_MASK (0x3 << 14)
70#define FIFO_RXFIFO_RD_ENDIAN_MASK (0x3 << 12)
71#define FIFO_WR_ENDIAN_16BITS (1 << 14) /* Swap first 16 bits and last 16 bits */
72#define FIFO_WR_ENDIAN_8BITS (2 << 14) /* Swap all 4 bytes */
73#define FIFO_RD_ENDIAN_16BITS (1 << 12) /* Swap first 16 bits and last 16 bits */
74#define FIFO_RD_ENDIAN_8BITS (2 << 12) /* Swap all 4 bytes */
75#define FIFO_RSRE (1 << 11)
76#define FIFO_TSRE (1 << 10)
77
78/* 0x08 INT_EN */
79#define INT_EN_EBCEI (1 << 6)
80#define INT_EN_TIM (1 << 5)
81#define INT_EN_RIM (1 << 4)
82#define INT_EN_TIE (1 << 3)
83#define INT_EN_RIE (1 << 2)
84#define INT_EN_TINTE (1 << 1)
85#define INT_EN_PINTE (1 << 0)
86
87/* 0x0C TO */
88#define TIMEOUT(x) ((x) << 0)
89
90/* 0x10 DATAR */
91#define DATA(x) ((x) << 0)
92
93/* 0x14 STATUS */
94#define STATUS_OSS (1 << 23)
95#define STATUS_TX_OSS (1 << 22)
96#define STATUS_BCE (1 << 21)
97#define STATUS_ROR (1 << 20)
98#define STATUS_RNE (1 << 14)
99#define STATUS_RFS (1 << 13)
100#define STATUS_TUR (1 << 12)
101#define STATUS_TNF (1 << 6)
102#define STATUS_TFS (1 << 5)
103#define STATUS_EOC (1 << 4)
104#define STATUS_TINT (1 << 3)
105#define STATUS_PINT (1 << 2)
106#define STATUS_CSS (1 << 1)
107#define STATUS_BSY (1 << 0)
108
109/* 0x18 PSP_CTRL */
110#define PSP_EDMYSTOP(x) ((x) << 27)
111#define PSP_EMYSTOP(x) ((x) << 25)
112#define PSP_EDMYSTRT(x) ((x) << 23)
113#define PSP_DMYSTRT(x) ((x) << 21)
114#define PSP_STRTDLY(x) ((x) << 18)
115#define PSP_SFRMWDTH(x) ((x) << 12)
116#define PSP_SFRMDLY(x) ((x) << 5)
117#define PSP_SFRMP (1 << 4)
118#define PSP_FSRT (1 << 3)
119#define PSP_ETDS (1 << 2)
120#define PSP_SCMODE(x) ((x) << 0)
121
122/* 0x1C NET_WORK_CTRL */
123#define RTSA(x) ((x) << 12)
124#define RTSA_MASK (0xFF << 12)
125#define TTSA(x) ((x) << 4)
126#define TTSA_MASK (0xFF << 4)
127#define NET_FRDC(x) ((x) << 1)
128#define NET_WORK_MODE (1 << 0)
129
130/* 0x20 NET_WORK_STATUS */
131#define NET_SATUS_NMBSY (1 << 3)
132#define NET_STATUS_TSS(x) ((x) << 0)
133
134/* 0x24 RWOT_CTRL */
135#define RWOT_MASK_RWOT_LAST_SAMPLE (1 << 4)
136#define RWOT_CLR_RWOT_CYCLE (1 << 3)
137#define RWOT_SET_RWOT_CYCLE (1 << 2)
138#define RWOT_CYCLE_RWOT_EN (1 << 1)
139#define RWOT_RWOT (1 << 0)
140
141#define PIO_FIFO_ENTRY_NUM (32)
142
143enum asr_ssp_type {
144 SSP_UNDEFINED = 0,
145 ASR_SSP,
146};
147
148struct spi_driver_data {
149 /* Driver model hookup */
150 struct platform_device *pdev;
151
152 /* SSP Info */
153 struct ssp_device *ssp;
154
155 /* SPI framework hookup */
156 enum asr_ssp_type ssp_type;
157 struct spi_master *master;
158
159 /* ASR hookup */
160 struct asr_spi_master *master_info;
161
162 /* SSP register addresses */
163 void __iomem *ioaddr;
164 u32 ssdr_physical;
165
166 /* SSP masks*/
167 u32 dma_fifo_ctrl;
168 u32 dma_top_ctrl;
169 u32 int_cr;
170 u32 dma_cr;
171 u32 clear_sr;
172 u32 mask_sr;
173
174 /* SPI feature control */
175 u8 pio_cs_auto_deasert;
176 u8 pio_interval_us;
177 u8 one_cycle_delay;
178 u8 cs_comb_ctrl;
179 u32 hold_frame_low;
180 u32 master_rxfifo_timeout;
181 u32 slave_rxfifo_timeout;
182 u32 slave_rxtimer_to_ms;
183
184 /* Message Transfer pump */
185 struct tasklet_struct pump_transfers;
186
187 /* DMA engine support */
188 struct dma_chan *rx_chan;
189 struct dma_chan *tx_chan;
190 struct sg_table rx_sgt;
191 struct sg_table tx_sgt;
192 int rx_nents;
193 int tx_nents;
194 void *dummy;
195 atomic_t dma_running;
196
197 /* Current message transfer state info */
198 struct spi_message *cur_msg;
199 struct spi_transfer *cur_transfer;
200 struct chip_data *cur_chip;
201 size_t len;
202 void *tx;
203 void *tx_end;
204 void *rx;
205 void *rx_end;
206 int dma_mapped;
207 dma_addr_t rx_dma;
208 dma_addr_t tx_dma;
209 size_t rx_map_len;
210 size_t tx_map_len;
211 u8 n_bytes;
212 int (*write)(struct spi_driver_data *drv_data);
213 int (*read)(struct spi_driver_data *drv_data);
214 irqreturn_t (*transfer_handler)(struct spi_driver_data *drv_data);
215 void (*cs_control)(u32 command);
216 struct pm_qos_request qos_idle;
217 int qos_idle_value;
218 struct clk *clk;
219 int irq;
220 u8 unqueued_transfer;
221 u8 no_tasklet;
222 u8 xfer_way;
223 u8 cs_assert;
224 struct completion dma_completion;
225 /* Support RX FIFO auto full control and endian swap */
226 unsigned int ssp_enhancement;
227 unsigned char slave_mode;
228 struct timer_list slave_rx_timer;
229};
230
231enum {
232 XFER_NONE = 0,
233 XFER_PUMP = 1,
234 XFER_UNQUEUE = 2,
235 XFER_SPIMEM = 3,
236};
237
238struct chip_data {
239 u32 top_ctrl;
240 u32 fifo_ctrl;
241 u32 timeout;
242 u8 n_bytes;
243 u32 dma_burst_size;
244 u32 threshold;
245 u32 dma_threshold;
246 u8 enable_dma;
247 union {
248 int gpio_cs;
249 unsigned int frm;
250 };
251 int gpio_cs_inverted;
252 int (*write)(struct spi_driver_data *drv_data);
253 int (*read)(struct spi_driver_data *drv_data);
254 void (*cs_control)(u32 command);
255};
256
257static inline u32 asr_spi_read(const struct spi_driver_data *drv_data,
258 unsigned reg)
259{
260 return __raw_readl(drv_data->ioaddr + reg);
261}
262
263static inline void asr_spi_write(const struct spi_driver_data *drv_data,
264 unsigned reg, u32 val)
265{
266 __raw_writel(val, drv_data->ioaddr + reg);
267}
268
269#define START_STATE ((void *)0)
270#define RUNNING_STATE ((void *)1)
271#define DONE_STATE ((void *)2)
272#define ERROR_STATE ((void *)-1)
273
274#define IS_DMA_ALIGNED(x) IS_ALIGNED((unsigned long)(x), DMA_ALIGNMENT)
275#define DMA_ALIGNMENT 64
276
277extern int asr_spi_flush(struct spi_driver_data *drv_data);
278extern void *asr_spi_next_transfer(struct spi_driver_data *drv_data);
279extern void asr_spi_pump_transfers(struct spi_driver_data *drv_data);
280
281/*
282 * Select the right DMA implementation.
283 */
284#define MAX_DMA_LEN SZ_512K
285#define DEFAULT_DMA_FIFO_CTRL (FIFO_TSRE | FIFO_RSRE)
286#define DEFAULT_DMA_TOP_CTRL (TOP_TRAIL)
287
288extern bool asr_spi_dma_is_possible(size_t len);
289extern int asr_spi_map_dma_buffers(struct spi_driver_data *drv_data);
290extern irqreturn_t asr_spi_dma_transfer(struct spi_driver_data *drv_data);
291extern void asr_spi_slave_sw_timeout_callback(struct spi_driver_data *drv_data);
292extern int asr_spi_dma_prepare(struct spi_driver_data *drv_data, u32 dma_burst);
293extern void asr_spi_dma_start(struct spi_driver_data *drv_data);
294extern int asr_spi_dma_setup(struct spi_driver_data *drv_data);
295extern void asr_spi_dma_release(struct spi_driver_data *drv_data);
296extern int asr_spi_set_dma_burst_and_threshold(struct chip_data *chip,
297 struct spi_device *spi,
298 u8 bits_per_word,
299 u32 *burst_code,
300 u32 *threshold);
301
302#define RX_THRESH_DFLT 8
303#define TX_THRESH_DFLT 8
304/* 0x14 */
305#define STATUS_TFL_MASK (0x1f << 7) /* Transmit FIFO Level mask */
306#define STATUS_TFL_BASE (7)
307#define STATUS_RFL_MASK (0x1f << 15) /* Receive FIFO Level mask */
308#define STATUS_RFL_BASE (15)
309/* 0x4 */
310#define FIFO_TFT (0x0000001F) /* Transmit FIFO Threshold (mask) */
311#define FIFO_TxTresh(x) (((x) - 1) << 0) /* level [1..32] */
312#define FIFO_RFT (0x000003E0) /* Receive FIFO Threshold (mask) */
313#define FIFO_RxTresh(x) (((x) - 1) << 5) /* level [1..32] */
314
315struct ssp_device {
316 struct platform_device *pdev;
317 struct list_head node;
318
319 struct clk *clk;
320 void __iomem *mmio_base;
321 unsigned long phys_base;
322
323 const char *label;
324 int port_id;
325 int type;
326 int use_count;
327 int irq;
328 int drcmr_rx;
329 int drcmr_tx;
330
331 struct device_node *of_node;
332};
333
334/**
335 * asr_ssp_write_reg - Write to a SSP register
336 *
337 * @dev: SSP device to access
338 * @reg: Register to write to
339 * @val: Value to be written.
340 */
341static inline void asr_ssp_write_reg(struct ssp_device *dev, u32 reg, u32 val)
342{
343 __raw_writel(val, dev->mmio_base + reg);
344}
345
346/**
347 * asr_ssp_read_reg - Read from a SSP register
348 *
349 * @dev: SSP device to access
350 * @reg: Register to read from
351 */
352static inline u32 asr_ssp_read_reg(struct ssp_device *dev, u32 reg)
353{
354 return __raw_readl(dev->mmio_base + reg);
355}
356
357static inline void asr_ssp_free(struct ssp_device *ssp) {}
358#define ASR_CS_ASSERT (0x01)
359#define ASR_CS_DEASSERT (0x02)
360
361struct dma_chan;
362
363/* device.platform_data for SSP controller devices */
364struct asr_spi_master {
365 u16 num_chipselect;
366 u8 enable_dma;
367
368 /* DMA engine specific config */
369 bool (*dma_filter)(struct dma_chan *chan, void *param);
370 void *tx_param;
371 void *rx_param;
372
373 /* For sound ssp controller */
374 struct ssp_device ssp;
375};
376
377/* spi_board_info.controller_data for SPI slave devices,
378 * copied to spi_device.platform_data ... mostly for dma tuning
379 */
380struct asr_spi_chip {
381 u8 tx_threshold;
382 u8 tx_hi_threshold;
383 u8 rx_threshold;
384 u8 dma_burst_size;
385 u32 timeout;
386 u8 enable_loopback;
387 int gpio_cs;
388 int using_gpio_cs;
389 void (*cs_control)(u32 command);
390};
391#endif /* _SPI_ASR_H */