1efcd8b9dSAlex Elder // SPDX-License-Identifier: GPL-2.0
2efcd8b9dSAlex Elder //
3efcd8b9dSAlex Elder // SpacemiT K1 SPI controller driver
4efcd8b9dSAlex Elder //
5efcd8b9dSAlex Elder // Copyright (C) 2026, RISCstar Solutions Corporation
6efcd8b9dSAlex Elder // Copyright (C) 2023, SpacemiT Corporation
7efcd8b9dSAlex Elder
8efcd8b9dSAlex Elder #include <linux/bitfield.h>
9efcd8b9dSAlex Elder #include <linux/clk.h>
10efcd8b9dSAlex Elder #include <linux/device.h>
11efcd8b9dSAlex Elder #include <linux/dma-mapping.h>
12efcd8b9dSAlex Elder #include <linux/dmaengine.h>
13efcd8b9dSAlex Elder #include <linux/interrupt.h>
14efcd8b9dSAlex Elder #include <linux/kernel.h>
15efcd8b9dSAlex Elder #include <linux/of.h>
16efcd8b9dSAlex Elder #include <linux/platform_device.h>
17efcd8b9dSAlex Elder #include <linux/reset.h>
18efcd8b9dSAlex Elder #include <linux/scatterlist.h>
19efcd8b9dSAlex Elder #include <linux/sizes.h>
20efcd8b9dSAlex Elder #include <linux/spi/spi.h>
21efcd8b9dSAlex Elder #include <linux/units.h>
22efcd8b9dSAlex Elder
23efcd8b9dSAlex Elder #include "internals.h"
24efcd8b9dSAlex Elder
25efcd8b9dSAlex Elder /* This is the range of transfer rates supported by the K1 SoC */
26efcd8b9dSAlex Elder #define K1_SPI_MIN_SPEED_HZ 6250
27efcd8b9dSAlex Elder #define K1_SPI_MAX_SPEED_HZ 51200000
28efcd8b9dSAlex Elder
29efcd8b9dSAlex Elder /* DMA constraints */
30efcd8b9dSAlex Elder #define K1_SPI_DMA_ALIGNMENT 64
31efcd8b9dSAlex Elder #define K1_SPI_MAX_DMA_LEN SZ_512K
32efcd8b9dSAlex Elder
33efcd8b9dSAlex Elder /* SSP Top Control Register */
34efcd8b9dSAlex Elder #define SSP_TOP_CTRL 0x00
35efcd8b9dSAlex Elder #define TOP_SSE BIT(0) /* Enable port */
36efcd8b9dSAlex Elder #define TOP_FRF_MASK GENMASK(2, 1) /* Frame format */
37efcd8b9dSAlex Elder #define TOP_FRF_MOTOROLA 0 /* Motorola SPI */
38efcd8b9dSAlex Elder #define TOP_DSS_MASK GENMASK(9, 5) /* Data size (1-32) */
39efcd8b9dSAlex Elder #define TOP_SPO BIT(10) /* Polarity: 0=low */
40efcd8b9dSAlex Elder #define TOP_SPH BIT(11) /* Half-cycle phase */
41efcd8b9dSAlex Elder #define TOP_LBM BIT(12) /* Loopback mode */
42efcd8b9dSAlex Elder #define TOP_TRAIL BIT(13) /* Trailing bytes */
43efcd8b9dSAlex Elder #define TOP_HOLD_FRAME_LOW BIT(14) /* Chip select */
44efcd8b9dSAlex Elder
45efcd8b9dSAlex Elder /* SSP FIFO Control Register */
46efcd8b9dSAlex Elder #define SSP_FIFO_CTRL 0x04
47efcd8b9dSAlex Elder #define FIFO_TFT_MASK GENMASK(4, 0) /* TX FIFO threshold */
48efcd8b9dSAlex Elder #define FIFO_RFT_MASK GENMASK(9, 5) /* RX FIFO threshold */
49efcd8b9dSAlex Elder #define FIFO_TSRE BIT(10) /* TX service request */
50efcd8b9dSAlex Elder #define FIFO_RSRE BIT(11) /* RX service request */
51efcd8b9dSAlex Elder
52efcd8b9dSAlex Elder /* SSP Interrupt Enable Register */
53efcd8b9dSAlex Elder #define SSP_INT_EN 0x08
54efcd8b9dSAlex Elder #define SSP_INT_EN_TINTE BIT(1) /* RX timeout */
55efcd8b9dSAlex Elder #define SSP_INT_EN_RIE BIT(2) /* RX FIFO */
56efcd8b9dSAlex Elder #define SSP_INT_EN_TIE BIT(3) /* TX FIFO */
57efcd8b9dSAlex Elder #define SSP_INT_EN_RIM BIT(4) /* RX FIFO overrun */
58efcd8b9dSAlex Elder #define SSP_INT_EN_TIM BIT(5) /* TX FIFO underrun */
59efcd8b9dSAlex Elder #define SSP_INT_EN_EBCEI BIT(6) /* Bit count error */
60efcd8b9dSAlex Elder
61efcd8b9dSAlex Elder /* TX interrupts, RX interrupts, and error interrupts */
62efcd8b9dSAlex Elder #define SSP_INT_EN_TX SSP_INT_EN_TIE
63efcd8b9dSAlex Elder #define SSP_INT_EN_RX \
64efcd8b9dSAlex Elder (SSP_INT_EN_TINTE | SSP_INT_EN_RIE)
65efcd8b9dSAlex Elder #define SSP_INT_EN_ERROR \
66efcd8b9dSAlex Elder (SSP_INT_EN_RIM | SSP_INT_EN_TIM | SSP_INT_EN_EBCEI)
67efcd8b9dSAlex Elder
68efcd8b9dSAlex Elder /* SSP Time Out Register */
69efcd8b9dSAlex Elder #define SSP_TIMEOUT 0x0c
70efcd8b9dSAlex Elder #define SSP_TIMEOUT_MASK GENMASK(23, 0)
71efcd8b9dSAlex Elder
72efcd8b9dSAlex Elder /* SSP Data Register */
73efcd8b9dSAlex Elder #define SSP_DATAR 0x10
74efcd8b9dSAlex Elder
75efcd8b9dSAlex Elder /* SSP Status Register */
76efcd8b9dSAlex Elder #define SSP_STATUS 0x14
77efcd8b9dSAlex Elder #define SSP_STATUS_BSY BIT(0) /* SPI/I2S busy */
78efcd8b9dSAlex Elder #define SSP_STATUS_TNF BIT(6) /* TX FIFO not full */
79efcd8b9dSAlex Elder #define SSP_STATUS_TFL GENMASK(11, 7) /* TX FIFO level */
80efcd8b9dSAlex Elder #define SSP_STATUS_TUR BIT(12) /* TX FIFO underrun */
81efcd8b9dSAlex Elder #define SSP_STATUS_RNE BIT(14) /* RX FIFO not empty */
82efcd8b9dSAlex Elder #define SSP_STATUS_RFL GENMASK(19, 15) /* RX FIFO level */
83efcd8b9dSAlex Elder #define SSP_STATUS_ROR BIT(20) /* RX FIFO overrun */
84efcd8b9dSAlex Elder #define SSP_STATUS_BCE BIT(21) /* Bit count error */
85efcd8b9dSAlex Elder
86efcd8b9dSAlex Elder /* Error status mask */
87efcd8b9dSAlex Elder #define SSP_STATUS_ERROR \
88efcd8b9dSAlex Elder (SSP_STATUS_TUR | SSP_STATUS_ROR | SSP_STATUS_BCE)
89efcd8b9dSAlex Elder
90efcd8b9dSAlex Elder /* The FIFO sizes and thresholds are the same for RX and TX */
91efcd8b9dSAlex Elder #define K1_SPI_FIFO_SIZE 32
92efcd8b9dSAlex Elder #define K1_SPI_THRESH (K1_SPI_FIFO_SIZE / 2)
93efcd8b9dSAlex Elder
94efcd8b9dSAlex Elder struct k1_spi_driver_data {
95efcd8b9dSAlex Elder struct spi_controller *host;
96efcd8b9dSAlex Elder void __iomem *base;
97efcd8b9dSAlex Elder phys_addr_t base_addr;
98efcd8b9dSAlex Elder unsigned long bus_rate;
99efcd8b9dSAlex Elder struct clk *clk;
100efcd8b9dSAlex Elder unsigned long rate;
101efcd8b9dSAlex Elder int irq;
102efcd8b9dSAlex Elder
103efcd8b9dSAlex Elder /* Current transfer information; not valid if message is null */
104efcd8b9dSAlex Elder u32 bytes; /* Bytes used for bits_per_word */
105efcd8b9dSAlex Elder unsigned int rx_resid; /* RX bytes left in transfer */
106efcd8b9dSAlex Elder unsigned int tx_resid; /* TX bytes left in transfer */
107efcd8b9dSAlex Elder struct spi_transfer *transfer; /* Current transfer */
108efcd8b9dSAlex Elder
109efcd8b9dSAlex Elder bool dma_enabled;
110efcd8b9dSAlex Elder };
111efcd8b9dSAlex Elder
112efcd8b9dSAlex Elder /* Set our registers to a known initial state */
113efcd8b9dSAlex Elder static void
k1_spi_register_reset(struct k1_spi_driver_data * drv_data,bool initial)114efcd8b9dSAlex Elder k1_spi_register_reset(struct k1_spi_driver_data *drv_data, bool initial)
115efcd8b9dSAlex Elder {
116efcd8b9dSAlex Elder u32 val = 0;
117efcd8b9dSAlex Elder
118efcd8b9dSAlex Elder writel(0, drv_data->base + SSP_TOP_CTRL);
119efcd8b9dSAlex Elder
120efcd8b9dSAlex Elder if (initial) {
121efcd8b9dSAlex Elder /*
122efcd8b9dSAlex Elder * The TX and RX FIFO thresholds are the same no matter
123efcd8b9dSAlex Elder * what the speed or bits per word, so we can just set
124efcd8b9dSAlex Elder * them once. The thresholds are one more than the values
125efcd8b9dSAlex Elder * in the register.
126efcd8b9dSAlex Elder */
127efcd8b9dSAlex Elder val = FIELD_PREP(FIFO_RFT_MASK, K1_SPI_THRESH - 1);
128efcd8b9dSAlex Elder val |= FIELD_PREP(FIFO_TFT_MASK, K1_SPI_THRESH - 1);
129efcd8b9dSAlex Elder }
130efcd8b9dSAlex Elder writel(val, drv_data->base + SSP_FIFO_CTRL);
131efcd8b9dSAlex Elder
132efcd8b9dSAlex Elder writel(0, drv_data->base + SSP_INT_EN);
133efcd8b9dSAlex Elder writel(0, drv_data->base + SSP_TIMEOUT);
134efcd8b9dSAlex Elder
135efcd8b9dSAlex Elder /* Clear any pending interrupt conditions */
136efcd8b9dSAlex Elder writel(~0, drv_data->base + SSP_STATUS);
137efcd8b9dSAlex Elder }
138efcd8b9dSAlex Elder
139efcd8b9dSAlex Elder /*
140efcd8b9dSAlex Elder * The client can call the setup function multiple times, and each call
141efcd8b9dSAlex Elder * can specify a different SPI mode (and transfer speed). Each transfer
142efcd8b9dSAlex Elder * can specify its own speed though, and the core code ensures each
143efcd8b9dSAlex Elder * transfer's speed is set to something nonzero and supported by both
144efcd8b9dSAlex Elder * the controller and the device. We just set the speed for each transfer.
145efcd8b9dSAlex Elder */
k1_spi_setup(struct spi_device * spi)146efcd8b9dSAlex Elder static int k1_spi_setup(struct spi_device *spi)
147efcd8b9dSAlex Elder {
148efcd8b9dSAlex Elder struct k1_spi_driver_data *drv_data;
149efcd8b9dSAlex Elder u32 val;
150efcd8b9dSAlex Elder
151efcd8b9dSAlex Elder drv_data = spi_controller_get_devdata(spi->controller);
152efcd8b9dSAlex Elder
153efcd8b9dSAlex Elder /*
154efcd8b9dSAlex Elder * Configure the message format for this device. We only
155efcd8b9dSAlex Elder * support Motorola SPI format in master mode.
156efcd8b9dSAlex Elder */
157efcd8b9dSAlex Elder val = FIELD_PREP(TOP_FRF_MASK, TOP_FRF_MOTOROLA);
158efcd8b9dSAlex Elder
159efcd8b9dSAlex Elder /* Translate the mode into the value used to program the hardware. */
160efcd8b9dSAlex Elder if (spi->mode & SPI_CPHA)
161efcd8b9dSAlex Elder val |= TOP_SPH; /* 1/2 cycle */
162efcd8b9dSAlex Elder if (spi->mode & SPI_CPOL)
163efcd8b9dSAlex Elder val |= TOP_SPO; /* active low */
164efcd8b9dSAlex Elder if (spi->mode & SPI_LOOP)
165efcd8b9dSAlex Elder val |= TOP_LBM; /* enable loopback */
166efcd8b9dSAlex Elder writel(val, drv_data->base + SSP_TOP_CTRL);
167efcd8b9dSAlex Elder
168efcd8b9dSAlex Elder return 0;
169efcd8b9dSAlex Elder }
170efcd8b9dSAlex Elder
k1_spi_cleanup(struct spi_device * spi)171efcd8b9dSAlex Elder static void k1_spi_cleanup(struct spi_device *spi)
172efcd8b9dSAlex Elder {
173efcd8b9dSAlex Elder struct k1_spi_driver_data *drv_data;
174efcd8b9dSAlex Elder
175efcd8b9dSAlex Elder drv_data = spi_controller_get_devdata(spi->controller);
176efcd8b9dSAlex Elder k1_spi_register_reset(drv_data, false);
177efcd8b9dSAlex Elder }
178efcd8b9dSAlex Elder
k1_spi_can_dma(struct spi_controller * host,struct spi_device * spi,struct spi_transfer * transfer)179efcd8b9dSAlex Elder static bool k1_spi_can_dma(struct spi_controller *host, struct spi_device *spi,
180efcd8b9dSAlex Elder struct spi_transfer *transfer)
181efcd8b9dSAlex Elder {
182efcd8b9dSAlex Elder struct k1_spi_driver_data *drv_data = spi_controller_get_devdata(host);
183efcd8b9dSAlex Elder u32 burst_size;
184efcd8b9dSAlex Elder
185efcd8b9dSAlex Elder if (!drv_data->dma_enabled)
186efcd8b9dSAlex Elder return false;
187efcd8b9dSAlex Elder
188efcd8b9dSAlex Elder if (transfer->len > SZ_2K)
189efcd8b9dSAlex Elder return false;
190efcd8b9dSAlex Elder
191efcd8b9dSAlex Elder /* Don't bother with DMA if we can't do even a single burst */
192efcd8b9dSAlex Elder burst_size = K1_SPI_THRESH * spi_bpw_to_bytes(transfer->bits_per_word);
193efcd8b9dSAlex Elder
194efcd8b9dSAlex Elder return transfer->len >= burst_size;
195efcd8b9dSAlex Elder }
196efcd8b9dSAlex Elder
k1_spi_dma_callback(void * param)197efcd8b9dSAlex Elder static void k1_spi_dma_callback(void *param)
198efcd8b9dSAlex Elder {
199efcd8b9dSAlex Elder struct k1_spi_driver_data *drv_data = param;
200efcd8b9dSAlex Elder u32 val;
201efcd8b9dSAlex Elder
202efcd8b9dSAlex Elder val = readl(drv_data->base + SSP_FIFO_CTRL);
203efcd8b9dSAlex Elder val &= ~(FIFO_TSRE | FIFO_RSRE);
204efcd8b9dSAlex Elder writel(val, drv_data->base + SSP_FIFO_CTRL);
205efcd8b9dSAlex Elder
206efcd8b9dSAlex Elder val = readl(drv_data->base + SSP_TOP_CTRL);
207efcd8b9dSAlex Elder val &= ~TOP_TRAIL;
208efcd8b9dSAlex Elder writel(val, drv_data->base + SSP_TOP_CTRL);
209efcd8b9dSAlex Elder
210efcd8b9dSAlex Elder /* Check for any error conditions */
211efcd8b9dSAlex Elder val = readl(drv_data->base + SSP_STATUS);
212efcd8b9dSAlex Elder if (val & SSP_STATUS_ERROR)
213efcd8b9dSAlex Elder drv_data->transfer->error |= SPI_TRANS_FAIL_IO;
214efcd8b9dSAlex Elder
215efcd8b9dSAlex Elder /* Disable the port */
216efcd8b9dSAlex Elder val = readl(drv_data->base + SSP_TOP_CTRL);
217efcd8b9dSAlex Elder val &= ~TOP_SSE;
218efcd8b9dSAlex Elder writel(val, drv_data->base + SSP_TOP_CTRL);
219efcd8b9dSAlex Elder
220efcd8b9dSAlex Elder drv_data->transfer = NULL;
221efcd8b9dSAlex Elder
222efcd8b9dSAlex Elder spi_finalize_current_transfer(drv_data->host);
223efcd8b9dSAlex Elder }
224efcd8b9dSAlex Elder
225efcd8b9dSAlex Elder /* Prepare a descriptor for TX or RX DMA */
226efcd8b9dSAlex Elder static struct dma_async_tx_descriptor *
k1_spi_dma_prep(struct k1_spi_driver_data * drv_data,struct spi_transfer * transfer,bool tx)227efcd8b9dSAlex Elder k1_spi_dma_prep(struct k1_spi_driver_data *drv_data,
228efcd8b9dSAlex Elder struct spi_transfer *transfer, bool tx)
229efcd8b9dSAlex Elder {
230efcd8b9dSAlex Elder phys_addr_t addr = drv_data->base_addr + SSP_DATAR;
231efcd8b9dSAlex Elder u32 burst_size = K1_SPI_THRESH * drv_data->bytes;
232efcd8b9dSAlex Elder struct dma_slave_config cfg = { };
233efcd8b9dSAlex Elder enum dma_transfer_direction dir;
234efcd8b9dSAlex Elder enum dma_slave_buswidth width;
235efcd8b9dSAlex Elder struct dma_chan *chan;
236efcd8b9dSAlex Elder struct sg_table *sgt;
237efcd8b9dSAlex Elder
238efcd8b9dSAlex Elder switch (drv_data->bytes) {
239efcd8b9dSAlex Elder case 1:
240efcd8b9dSAlex Elder width = DMA_SLAVE_BUSWIDTH_1_BYTE;
241efcd8b9dSAlex Elder break;
242efcd8b9dSAlex Elder case 2:
243efcd8b9dSAlex Elder width = DMA_SLAVE_BUSWIDTH_2_BYTES;
244efcd8b9dSAlex Elder break;
245efcd8b9dSAlex Elder default: /* bytes == 4 */
246efcd8b9dSAlex Elder width = DMA_SLAVE_BUSWIDTH_4_BYTES;
247efcd8b9dSAlex Elder break;
248efcd8b9dSAlex Elder }
249efcd8b9dSAlex Elder
250efcd8b9dSAlex Elder if (tx) {
251efcd8b9dSAlex Elder chan = drv_data->host->dma_tx;
252efcd8b9dSAlex Elder sgt = &transfer->tx_sg;
253efcd8b9dSAlex Elder dir = DMA_MEM_TO_DEV;
254efcd8b9dSAlex Elder
255efcd8b9dSAlex Elder cfg.dst_addr = addr;
256efcd8b9dSAlex Elder cfg.dst_addr_width = width;
257efcd8b9dSAlex Elder cfg.dst_maxburst = burst_size;
258efcd8b9dSAlex Elder } else {
259efcd8b9dSAlex Elder chan = drv_data->host->dma_rx;
260efcd8b9dSAlex Elder sgt = &transfer->rx_sg;
261efcd8b9dSAlex Elder dir = DMA_DEV_TO_MEM;
262efcd8b9dSAlex Elder
263efcd8b9dSAlex Elder cfg.src_addr = addr;
264efcd8b9dSAlex Elder cfg.src_addr_width = width;
265efcd8b9dSAlex Elder cfg.src_maxburst = burst_size;
266efcd8b9dSAlex Elder }
267efcd8b9dSAlex Elder cfg.direction = dir;
268efcd8b9dSAlex Elder
269efcd8b9dSAlex Elder if (dmaengine_slave_config(chan, &cfg))
270efcd8b9dSAlex Elder return NULL;
271efcd8b9dSAlex Elder
272efcd8b9dSAlex Elder return dmaengine_prep_slave_sg(chan, sgt->sgl, sgt->nents, dir,
273efcd8b9dSAlex Elder DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
274efcd8b9dSAlex Elder
275efcd8b9dSAlex Elder }
276efcd8b9dSAlex Elder
k1_spi_dma_one(struct spi_controller * host,struct spi_device * spi,struct spi_transfer * transfer)277efcd8b9dSAlex Elder static int k1_spi_dma_one(struct spi_controller *host, struct spi_device *spi,
278efcd8b9dSAlex Elder struct spi_transfer *transfer)
279efcd8b9dSAlex Elder {
280efcd8b9dSAlex Elder struct k1_spi_driver_data *drv_data = spi_controller_get_devdata(host);
281*d3c87e71SSurendra Singh Chouhan struct dma_async_tx_descriptor *txdesc, *rxdesc;
282efcd8b9dSAlex Elder u32 val;
283efcd8b9dSAlex Elder
284*d3c87e71SSurendra Singh Chouhan /* Prepare the TX descriptor */
285*d3c87e71SSurendra Singh Chouhan txdesc = k1_spi_dma_prep(drv_data, transfer, true);
286*d3c87e71SSurendra Singh Chouhan if (!txdesc)
287efcd8b9dSAlex Elder goto fallback;
288efcd8b9dSAlex Elder
289*d3c87e71SSurendra Singh Chouhan /* Prepare the RX descriptor and submit it */
290*d3c87e71SSurendra Singh Chouhan rxdesc = k1_spi_dma_prep(drv_data, transfer, false);
291*d3c87e71SSurendra Singh Chouhan if (!rxdesc) {
292efcd8b9dSAlex Elder dmaengine_terminate_sync(host->dma_tx);
293efcd8b9dSAlex Elder goto fallback;
294efcd8b9dSAlex Elder }
295*d3c87e71SSurendra Singh Chouhan
296*d3c87e71SSurendra Singh Chouhan /* When RX is complete we also know TX has completed */
297efcd8b9dSAlex Elder rxdesc->callback = k1_spi_dma_callback;
298*d3c87e71SSurendra Singh Chouhan rxdesc->callback_param = drv_data;
299*d3c87e71SSurendra Singh Chouhan
300efcd8b9dSAlex Elder dmaengine_submit(txdesc);
301efcd8b9dSAlex Elder dmaengine_submit(rxdesc);
302efcd8b9dSAlex Elder
303efcd8b9dSAlex Elder val = readl(drv_data->base + SSP_TOP_CTRL);
304efcd8b9dSAlex Elder val |= TOP_TRAIL; /* Trailing bytes handled by DMA */
305efcd8b9dSAlex Elder writel(val, drv_data->base + SSP_TOP_CTRL);
306efcd8b9dSAlex Elder
307efcd8b9dSAlex Elder val = readl(drv_data->base + SSP_FIFO_CTRL);
308efcd8b9dSAlex Elder val |= FIFO_TSRE | FIFO_RSRE;
309efcd8b9dSAlex Elder writel(val, drv_data->base + SSP_FIFO_CTRL);
310efcd8b9dSAlex Elder
311efcd8b9dSAlex Elder /* Start RX first so we're ready the instant we start transmitting */
312efcd8b9dSAlex Elder dma_async_issue_pending(host->dma_rx);
313efcd8b9dSAlex Elder dma_async_issue_pending(host->dma_tx);
314efcd8b9dSAlex Elder
315efcd8b9dSAlex Elder return 1;
316efcd8b9dSAlex Elder fallback:
317efcd8b9dSAlex Elder transfer->error |= SPI_TRANS_FAIL_NO_START;
318efcd8b9dSAlex Elder
319efcd8b9dSAlex Elder return -EAGAIN;
320efcd8b9dSAlex Elder }
321efcd8b9dSAlex Elder
322efcd8b9dSAlex Elder /* Flush the RX FIFO of any leftover data before processing a message */
k1_spi_prepare_message(struct spi_controller * host,struct spi_message * message)323efcd8b9dSAlex Elder static int k1_spi_prepare_message(struct spi_controller *host,
324efcd8b9dSAlex Elder struct spi_message *message)
325efcd8b9dSAlex Elder {
326efcd8b9dSAlex Elder struct k1_spi_driver_data *drv_data = spi_controller_get_devdata(host);
327efcd8b9dSAlex Elder u32 val = readl(drv_data->base + SSP_STATUS);
328efcd8b9dSAlex Elder u32 count;
329efcd8b9dSAlex Elder
330efcd8b9dSAlex Elder /* If there's nothing in the FIFO, we're done */
331efcd8b9dSAlex Elder if (!(val & SSP_STATUS_RNE))
332efcd8b9dSAlex Elder return 0;
333efcd8b9dSAlex Elder
334efcd8b9dSAlex Elder /* Read and discard what's there (one more than what the field says) */
335efcd8b9dSAlex Elder count = FIELD_GET(SSP_STATUS_RFL, val) + 1;
336efcd8b9dSAlex Elder do
337efcd8b9dSAlex Elder (void)readl(drv_data->base + SSP_DATAR);
338efcd8b9dSAlex Elder while (--count);
339efcd8b9dSAlex Elder
340efcd8b9dSAlex Elder return 0;
341efcd8b9dSAlex Elder }
342efcd8b9dSAlex Elder
343efcd8b9dSAlex Elder /* Set logic level of chip select line (high=true means CS deasserted) */
k1_spi_set_cs(struct spi_device * spi,bool high)344efcd8b9dSAlex Elder static void k1_spi_set_cs(struct spi_device *spi, bool high)
345efcd8b9dSAlex Elder {
346efcd8b9dSAlex Elder struct k1_spi_driver_data *drv_data;
347efcd8b9dSAlex Elder u32 val;
348efcd8b9dSAlex Elder
349efcd8b9dSAlex Elder drv_data = spi_controller_get_devdata(spi->controller);
350efcd8b9dSAlex Elder
351efcd8b9dSAlex Elder val = readl(drv_data->base + SSP_TOP_CTRL);
352efcd8b9dSAlex Elder if (high)
353efcd8b9dSAlex Elder val &= ~TOP_HOLD_FRAME_LOW;
354efcd8b9dSAlex Elder else
355efcd8b9dSAlex Elder val |= TOP_HOLD_FRAME_LOW;
356efcd8b9dSAlex Elder writel(val, drv_data->base + SSP_TOP_CTRL);
357efcd8b9dSAlex Elder }
358efcd8b9dSAlex Elder
359efcd8b9dSAlex Elder /* Set the transfer speed; the SPI core code ensures it is supported */
k1_spi_set_speed(struct k1_spi_driver_data * drv_data,struct spi_transfer * transfer)360efcd8b9dSAlex Elder static int k1_spi_set_speed(struct k1_spi_driver_data *drv_data,
361efcd8b9dSAlex Elder struct spi_transfer *transfer)
362efcd8b9dSAlex Elder {
363efcd8b9dSAlex Elder struct clk *clk = drv_data->clk;
364efcd8b9dSAlex Elder u64 nsec_per_word;
365efcd8b9dSAlex Elder u64 bus_ticks;
366efcd8b9dSAlex Elder u32 timeout;
367efcd8b9dSAlex Elder u32 val;
368efcd8b9dSAlex Elder int ret;
369efcd8b9dSAlex Elder
370efcd8b9dSAlex Elder ret = clk_set_rate(clk, transfer->speed_hz);
371efcd8b9dSAlex Elder if (ret)
372efcd8b9dSAlex Elder return ret;
373efcd8b9dSAlex Elder
374efcd8b9dSAlex Elder drv_data->rate = clk_get_rate(clk);
375efcd8b9dSAlex Elder
376efcd8b9dSAlex Elder /* No need for RX FIFO timeout if we're not receiving anything */
377efcd8b9dSAlex Elder if (!transfer->rx_buf)
378efcd8b9dSAlex Elder return 0;
379efcd8b9dSAlex Elder
380efcd8b9dSAlex Elder /*
381efcd8b9dSAlex Elder * Compute the RX FIFO inactivity timeout value that should be used.
382efcd8b9dSAlex Elder * The inactivity timer restarts with each word that lands in the
383efcd8b9dSAlex Elder * FIFO. If several "word transfer times" pass without any new data
384efcd8b9dSAlex Elder * in the RX FIFO, we might as well read what's there.
385efcd8b9dSAlex Elder *
386efcd8b9dSAlex Elder * The rate at which words land in the FIFO is determined by the
387efcd8b9dSAlex Elder * word size and the transfer rate. One bit is transferred per
388efcd8b9dSAlex Elder * clock tick, and 8 (or 16 or 32) bits are transferred per word.
389efcd8b9dSAlex Elder *
390efcd8b9dSAlex Elder * So we can get word transfer time (in nanoseconds) from:
391efcd8b9dSAlex Elder * nsec_per_tick = NSEC_PER_SEC / drv_data->rate;
392efcd8b9dSAlex Elder * ticks_per_word = BITS_PER_BYTE * drv_data->bytes;
39300cef7ebSGuodong Xu * We do the divide last for better accuracy.
394efcd8b9dSAlex Elder */
395efcd8b9dSAlex Elder nsec_per_word = (u64)NSEC_PER_SEC * BITS_PER_BYTE * drv_data->bytes;
396efcd8b9dSAlex Elder nsec_per_word = DIV_ROUND_UP_ULL(nsec_per_word, drv_data->rate);
397efcd8b9dSAlex Elder
398efcd8b9dSAlex Elder /*
399efcd8b9dSAlex Elder * The timeout (which we'll set to three word transfer times) is
400efcd8b9dSAlex Elder * expressed as a number of APB clock ticks.
401efcd8b9dSAlex Elder * bus_ticks = 3 * nsec * (drv_data->bus_rate / NSEC_PER_SEC)
402efcd8b9dSAlex Elder */
403efcd8b9dSAlex Elder bus_ticks = 3 * nsec_per_word * drv_data->bus_rate;
404efcd8b9dSAlex Elder timeout = DIV_ROUND_UP_ULL(bus_ticks, NSEC_PER_SEC);
405efcd8b9dSAlex Elder
406efcd8b9dSAlex Elder /* Set the RX timeout period (required for both DMA and PIO) */
407efcd8b9dSAlex Elder val = FIELD_PREP(SSP_TIMEOUT_MASK, timeout);
408efcd8b9dSAlex Elder writel(val, drv_data->base + SSP_TIMEOUT);
409efcd8b9dSAlex Elder
410efcd8b9dSAlex Elder return 0;
411efcd8b9dSAlex Elder }
412efcd8b9dSAlex Elder
k1_spi_transfer_one(struct spi_controller * host,struct spi_device * spi,struct spi_transfer * transfer)413efcd8b9dSAlex Elder static int k1_spi_transfer_one(struct spi_controller *host,
414efcd8b9dSAlex Elder struct spi_device *spi,
415efcd8b9dSAlex Elder struct spi_transfer *transfer)
416efcd8b9dSAlex Elder {
417efcd8b9dSAlex Elder struct k1_spi_driver_data *drv_data = spi_controller_get_devdata(host);
418efcd8b9dSAlex Elder u32 ctrl;
419efcd8b9dSAlex Elder u32 val;
420efcd8b9dSAlex Elder int ret;
421efcd8b9dSAlex Elder
422efcd8b9dSAlex Elder /* Bits per word can change on a per-transfer basis */
423efcd8b9dSAlex Elder drv_data->bytes = spi_bpw_to_bytes(transfer->bits_per_word);
424efcd8b9dSAlex Elder
425efcd8b9dSAlex Elder /* Each transfer can also specify a different rate */
426efcd8b9dSAlex Elder ret = k1_spi_set_speed(drv_data, transfer);
427efcd8b9dSAlex Elder if (ret) {
428efcd8b9dSAlex Elder dev_err(&host->dev,
429efcd8b9dSAlex Elder "failed to set transfer speed: %d\n", ret);
430efcd8b9dSAlex Elder return ret;
431efcd8b9dSAlex Elder }
432efcd8b9dSAlex Elder
433efcd8b9dSAlex Elder drv_data->rx_resid = transfer->len;
434efcd8b9dSAlex Elder drv_data->tx_resid = transfer->len;
435efcd8b9dSAlex Elder
436efcd8b9dSAlex Elder drv_data->transfer = transfer;
437efcd8b9dSAlex Elder
438efcd8b9dSAlex Elder /* Clear any existing interrupt conditions */
439efcd8b9dSAlex Elder writel(~0, drv_data->base + SSP_STATUS);
440efcd8b9dSAlex Elder
441efcd8b9dSAlex Elder /* Set the data (word) size, and enable the port */
442efcd8b9dSAlex Elder ctrl = readl(drv_data->base + SSP_TOP_CTRL);
443efcd8b9dSAlex Elder ctrl &= ~TOP_DSS_MASK;
444efcd8b9dSAlex Elder ctrl |= FIELD_PREP(TOP_DSS_MASK, transfer->bits_per_word - 1);
445efcd8b9dSAlex Elder ctrl |= TOP_SSE;
446efcd8b9dSAlex Elder writel(ctrl, drv_data->base + SSP_TOP_CTRL);
447efcd8b9dSAlex Elder
448efcd8b9dSAlex Elder if (spi_xfer_is_dma_mapped(host, spi, transfer))
449efcd8b9dSAlex Elder return k1_spi_dma_one(host, spi, transfer);
450efcd8b9dSAlex Elder
451efcd8b9dSAlex Elder /* An interrupt will initiate the transfer */
452efcd8b9dSAlex Elder val = SSP_INT_EN_TX | SSP_INT_EN_RX | SSP_INT_EN_ERROR;
453efcd8b9dSAlex Elder writel(val, drv_data->base + SSP_INT_EN);
454efcd8b9dSAlex Elder
455efcd8b9dSAlex Elder return 1; /* We will call spi_finalize_current_transfer() */
456efcd8b9dSAlex Elder }
457efcd8b9dSAlex Elder
458efcd8b9dSAlex Elder static void
k1_spi_handle_err(struct spi_controller * host,struct spi_message * message)459efcd8b9dSAlex Elder k1_spi_handle_err(struct spi_controller *host, struct spi_message *message)
460efcd8b9dSAlex Elder {
461efcd8b9dSAlex Elder struct k1_spi_driver_data *drv_data = spi_controller_get_devdata(host);
462efcd8b9dSAlex Elder
463efcd8b9dSAlex Elder if (drv_data->dma_enabled) {
464efcd8b9dSAlex Elder dmaengine_terminate_sync(host->dma_rx);
465efcd8b9dSAlex Elder dmaengine_terminate_sync(host->dma_tx);
466efcd8b9dSAlex Elder }
467efcd8b9dSAlex Elder }
468efcd8b9dSAlex Elder
k1_spi_write_word(struct k1_spi_driver_data * drv_data)469efcd8b9dSAlex Elder static void k1_spi_write_word(struct k1_spi_driver_data *drv_data)
470efcd8b9dSAlex Elder {
471efcd8b9dSAlex Elder struct spi_transfer *transfer = drv_data->transfer;
472efcd8b9dSAlex Elder u32 bytes = drv_data->bytes;
473efcd8b9dSAlex Elder u32 val;
474efcd8b9dSAlex Elder
475efcd8b9dSAlex Elder if (transfer->tx_buf) {
476efcd8b9dSAlex Elder const void *buf;
477efcd8b9dSAlex Elder
478efcd8b9dSAlex Elder buf = transfer->tx_buf + (transfer->len - drv_data->tx_resid);
479efcd8b9dSAlex Elder if (bytes == 1)
480efcd8b9dSAlex Elder val = *(u8 *)buf;
481efcd8b9dSAlex Elder else if (bytes == 2)
482efcd8b9dSAlex Elder val = *(u16 *)buf;
483efcd8b9dSAlex Elder else /* bytes == 4 */
484efcd8b9dSAlex Elder val = *(u32 *)buf;
485efcd8b9dSAlex Elder } else {
486efcd8b9dSAlex Elder val = 0; /* Null writer; write 1, 2, or 4 zero bytes */
487efcd8b9dSAlex Elder }
488efcd8b9dSAlex Elder /* Fill the next TX FIFO entry */
489efcd8b9dSAlex Elder writel(val, drv_data->base + SSP_DATAR);
490efcd8b9dSAlex Elder
491efcd8b9dSAlex Elder drv_data->tx_resid -= bytes;
492efcd8b9dSAlex Elder }
493efcd8b9dSAlex Elder
494efcd8b9dSAlex Elder /* The last-read status value is provided; we know SSP_STATUS_TNF is set */
k1_spi_write(struct k1_spi_driver_data * drv_data,u32 val)495efcd8b9dSAlex Elder static bool k1_spi_write(struct k1_spi_driver_data *drv_data, u32 val)
496efcd8b9dSAlex Elder {
497a88df1d9SZhengyu He unsigned int count;
498a88df1d9SZhengyu He
499efcd8b9dSAlex Elder /* Get the number of free slots in the FIFO */
500efcd8b9dSAlex Elder count = K1_SPI_FIFO_SIZE - FIELD_GET(SSP_STATUS_TFL, val);
501efcd8b9dSAlex Elder
502efcd8b9dSAlex Elder /*
503efcd8b9dSAlex Elder * Limit how much we try to send at a time, to reduce the
504efcd8b9dSAlex Elder * chance the other side can overrun our RX FIFO.
505efcd8b9dSAlex Elder */
506efcd8b9dSAlex Elder count = min3(count, K1_SPI_THRESH, drv_data->tx_resid / drv_data->bytes);
507efcd8b9dSAlex Elder do
508efcd8b9dSAlex Elder k1_spi_write_word(drv_data);
509efcd8b9dSAlex Elder while (--count);
510efcd8b9dSAlex Elder
511efcd8b9dSAlex Elder return !drv_data->tx_resid;
512efcd8b9dSAlex Elder }
513efcd8b9dSAlex Elder
k1_spi_read_word(struct k1_spi_driver_data * drv_data)514efcd8b9dSAlex Elder static void k1_spi_read_word(struct k1_spi_driver_data *drv_data)
515efcd8b9dSAlex Elder {
516efcd8b9dSAlex Elder struct spi_transfer *transfer = drv_data->transfer;
517efcd8b9dSAlex Elder u32 bytes = drv_data->bytes;
518efcd8b9dSAlex Elder u32 val;
519efcd8b9dSAlex Elder
520efcd8b9dSAlex Elder /* Consume the next RX FIFO entry */
521efcd8b9dSAlex Elder val = readl(drv_data->base + SSP_DATAR);
522efcd8b9dSAlex Elder if (transfer->rx_buf) {
523efcd8b9dSAlex Elder void *buf;
524efcd8b9dSAlex Elder
525efcd8b9dSAlex Elder buf = transfer->rx_buf + (transfer->len - drv_data->rx_resid);
526efcd8b9dSAlex Elder
527efcd8b9dSAlex Elder if (bytes == 1)
528efcd8b9dSAlex Elder *(u8 *)buf = val;
529efcd8b9dSAlex Elder else if (bytes == 2)
530efcd8b9dSAlex Elder *(u16 *)buf = val;
531efcd8b9dSAlex Elder else /* bytes == 4 */
532efcd8b9dSAlex Elder *(u32 *)buf = val;
533efcd8b9dSAlex Elder } /* Otherwise null reader: discard the data */
534efcd8b9dSAlex Elder
535efcd8b9dSAlex Elder drv_data->rx_resid -= bytes;
536efcd8b9dSAlex Elder }
537efcd8b9dSAlex Elder
538efcd8b9dSAlex Elder /* The last-read status value is provided; we know SSP_STATUS_RNE is set */
k1_spi_read(struct k1_spi_driver_data * drv_data,u32 val)539efcd8b9dSAlex Elder static bool k1_spi_read(struct k1_spi_driver_data *drv_data, u32 val)
540efcd8b9dSAlex Elder {
541efcd8b9dSAlex Elder do {
542efcd8b9dSAlex Elder unsigned int count = FIELD_GET(SSP_STATUS_RFL, val) + 1;
543efcd8b9dSAlex Elder
544efcd8b9dSAlex Elder /* Only read what we need */
545efcd8b9dSAlex Elder count = min(count, drv_data->rx_resid / drv_data->bytes);
546efcd8b9dSAlex Elder do
547efcd8b9dSAlex Elder k1_spi_read_word(drv_data);
548efcd8b9dSAlex Elder while (--count);
549efcd8b9dSAlex Elder
550efcd8b9dSAlex Elder /* If there's no more to read, we're done */
551efcd8b9dSAlex Elder if (!drv_data->rx_resid)
552efcd8b9dSAlex Elder return true;
553efcd8b9dSAlex Elder
554efcd8b9dSAlex Elder /* Check again in case more became available to read */
555efcd8b9dSAlex Elder val = readl(drv_data->base + SSP_STATUS);
556efcd8b9dSAlex Elder if (val & SSP_STATUS_RNE)
557efcd8b9dSAlex Elder writel(SSP_STATUS_RNE, drv_data->base + SSP_STATUS);
558efcd8b9dSAlex Elder else
559efcd8b9dSAlex Elder return false;
560efcd8b9dSAlex Elder } while (true);
561efcd8b9dSAlex Elder }
562efcd8b9dSAlex Elder
k1_spi_ssp_isr(int irq,void * dev_id)563efcd8b9dSAlex Elder static irqreturn_t k1_spi_ssp_isr(int irq, void *dev_id)
564efcd8b9dSAlex Elder {
565efcd8b9dSAlex Elder struct k1_spi_driver_data *drv_data = dev_id;
566efcd8b9dSAlex Elder u32 status;
567efcd8b9dSAlex Elder u32 top_ctrl;
568efcd8b9dSAlex Elder
569efcd8b9dSAlex Elder /* Get status and clear pending interrupts */
570efcd8b9dSAlex Elder status = readl(drv_data->base + SSP_STATUS);
571efcd8b9dSAlex Elder writel(status, drv_data->base + SSP_STATUS);
572efcd8b9dSAlex Elder
573efcd8b9dSAlex Elder /* If no actionable status bits are set, this is not our interrupt */
574efcd8b9dSAlex Elder if (!(status & (SSP_STATUS_ERROR | SSP_STATUS_TNF | SSP_STATUS_RNE)))
575efcd8b9dSAlex Elder return IRQ_NONE;
576efcd8b9dSAlex Elder
577efcd8b9dSAlex Elder /* Check for any error conditions first */
578efcd8b9dSAlex Elder if (status & SSP_STATUS_ERROR) {
579efcd8b9dSAlex Elder if (drv_data->transfer)
580efcd8b9dSAlex Elder drv_data->transfer->error |= SPI_TRANS_FAIL_IO;
581efcd8b9dSAlex Elder goto done;
582efcd8b9dSAlex Elder }
583efcd8b9dSAlex Elder
584efcd8b9dSAlex Elder /*
585efcd8b9dSAlex Elder * For SPI, bytes are transferred in both directions equally, and
586efcd8b9dSAlex Elder * RX always follows TX. Start by writing if there is anything to
587efcd8b9dSAlex Elder * write, then read. Once there's no more to read, we're done.
588efcd8b9dSAlex Elder */
589efcd8b9dSAlex Elder if (drv_data->tx_resid && (status & SSP_STATUS_TNF)) {
590efcd8b9dSAlex Elder /* If we finish writing, disable TX interrupts */
591efcd8b9dSAlex Elder if (k1_spi_write(drv_data, status))
592efcd8b9dSAlex Elder writel(SSP_INT_EN_RX | SSP_INT_EN_ERROR,
593efcd8b9dSAlex Elder drv_data->base + SSP_INT_EN);
594efcd8b9dSAlex Elder }
595efcd8b9dSAlex Elder
596efcd8b9dSAlex Elder /* We're not done unless we've read all that was requested */
597efcd8b9dSAlex Elder if (drv_data->rx_resid) {
598efcd8b9dSAlex Elder /* Read more if the FIFO is not empty */
599efcd8b9dSAlex Elder if (status & SSP_STATUS_RNE)
600efcd8b9dSAlex Elder if (k1_spi_read(drv_data, status))
601efcd8b9dSAlex Elder goto done;
602efcd8b9dSAlex Elder
603efcd8b9dSAlex Elder return IRQ_HANDLED;
604efcd8b9dSAlex Elder }
605efcd8b9dSAlex Elder done:
606efcd8b9dSAlex Elder /* Disable the port */
607efcd8b9dSAlex Elder top_ctrl = readl(drv_data->base + SSP_TOP_CTRL);
608efcd8b9dSAlex Elder top_ctrl &= ~TOP_SSE;
609efcd8b9dSAlex Elder writel(top_ctrl, drv_data->base + SSP_TOP_CTRL);
610efcd8b9dSAlex Elder
611efcd8b9dSAlex Elder /* Disable all interrupts */
612efcd8b9dSAlex Elder writel(0, drv_data->base + SSP_INT_EN);
613efcd8b9dSAlex Elder
614efcd8b9dSAlex Elder if (drv_data->transfer) {
615efcd8b9dSAlex Elder drv_data->transfer = NULL;
616efcd8b9dSAlex Elder spi_finalize_current_transfer(drv_data->host);
617efcd8b9dSAlex Elder }
618efcd8b9dSAlex Elder
619efcd8b9dSAlex Elder return IRQ_HANDLED;
620efcd8b9dSAlex Elder }
621efcd8b9dSAlex Elder
622efcd8b9dSAlex Elder static int
k1_spi_dma_setup(struct k1_spi_driver_data * drv_data,struct device * dev)623efcd8b9dSAlex Elder k1_spi_dma_setup(struct k1_spi_driver_data *drv_data, struct device *dev)
624efcd8b9dSAlex Elder {
625efcd8b9dSAlex Elder struct spi_controller *host = drv_data->host;
626efcd8b9dSAlex Elder struct dma_chan *chan;
627efcd8b9dSAlex Elder
628efcd8b9dSAlex Elder chan = dma_request_chan(dev, "tx");
629efcd8b9dSAlex Elder if (IS_ERR(chan))
630efcd8b9dSAlex Elder return PTR_ERR(chan);
631efcd8b9dSAlex Elder host->dma_tx = chan;
632efcd8b9dSAlex Elder
633efcd8b9dSAlex Elder chan = dma_request_chan(dev, "rx");
634efcd8b9dSAlex Elder if (IS_ERR(chan)) {
635efcd8b9dSAlex Elder dma_release_channel(host->dma_tx);
636efcd8b9dSAlex Elder host->dma_tx = NULL;
637efcd8b9dSAlex Elder return PTR_ERR(chan);
638efcd8b9dSAlex Elder }
639efcd8b9dSAlex Elder host->dma_rx = chan;
640efcd8b9dSAlex Elder
641efcd8b9dSAlex Elder drv_data->dma_enabled = true;
642efcd8b9dSAlex Elder
643efcd8b9dSAlex Elder return 0;
644efcd8b9dSAlex Elder }
645efcd8b9dSAlex Elder
k1_spi_dma_cleanup(struct device * dev,void * res)646efcd8b9dSAlex Elder static void k1_spi_dma_cleanup(struct device *dev, void *res)
647efcd8b9dSAlex Elder {
648efcd8b9dSAlex Elder struct k1_spi_driver_data **ptr = res;
649efcd8b9dSAlex Elder struct k1_spi_driver_data *drv_data = *ptr;
650efcd8b9dSAlex Elder struct spi_controller *host = drv_data->host;
651efcd8b9dSAlex Elder
652efcd8b9dSAlex Elder if (!drv_data->dma_enabled)
653efcd8b9dSAlex Elder return;
654efcd8b9dSAlex Elder
655efcd8b9dSAlex Elder drv_data->dma_enabled = false;
656efcd8b9dSAlex Elder
657efcd8b9dSAlex Elder dma_release_channel(host->dma_rx);
658efcd8b9dSAlex Elder host->dma_rx = NULL;
659efcd8b9dSAlex Elder dma_release_channel(host->dma_tx);
660efcd8b9dSAlex Elder host->dma_tx = NULL;
661efcd8b9dSAlex Elder }
662efcd8b9dSAlex Elder
663efcd8b9dSAlex Elder static int
devm_k1_spi_dma_setup(struct k1_spi_driver_data * drv_data,struct device * dev)664efcd8b9dSAlex Elder devm_k1_spi_dma_setup(struct k1_spi_driver_data *drv_data, struct device *dev)
665efcd8b9dSAlex Elder {
666efcd8b9dSAlex Elder struct k1_spi_driver_data **ptr;
667efcd8b9dSAlex Elder int ret;
668efcd8b9dSAlex Elder
669efcd8b9dSAlex Elder if (!IS_ENABLED(CONFIG_MMP_PDMA)) {
670efcd8b9dSAlex Elder dev_info(dev, "DMA not available; using PIO\n");
671efcd8b9dSAlex Elder return 0;
672efcd8b9dSAlex Elder }
673efcd8b9dSAlex Elder
674efcd8b9dSAlex Elder ptr = devres_alloc(k1_spi_dma_cleanup, sizeof(*ptr), GFP_KERNEL);
675efcd8b9dSAlex Elder if (!ptr)
676efcd8b9dSAlex Elder return -ENOMEM;
677efcd8b9dSAlex Elder
678efcd8b9dSAlex Elder ret = k1_spi_dma_setup(drv_data, dev);
679efcd8b9dSAlex Elder if (ret) {
680efcd8b9dSAlex Elder devres_free(ptr);
681efcd8b9dSAlex Elder return ret;
682efcd8b9dSAlex Elder }
683efcd8b9dSAlex Elder
684efcd8b9dSAlex Elder *ptr = drv_data;
685efcd8b9dSAlex Elder devres_add(dev, ptr);
686efcd8b9dSAlex Elder
687efcd8b9dSAlex Elder return 0;
688efcd8b9dSAlex Elder }
689efcd8b9dSAlex Elder
k1_spi_probe(struct platform_device * pdev)690efcd8b9dSAlex Elder static int k1_spi_probe(struct platform_device *pdev)
691efcd8b9dSAlex Elder {
692efcd8b9dSAlex Elder struct k1_spi_driver_data *drv_data;
693efcd8b9dSAlex Elder struct device *dev = &pdev->dev;
694efcd8b9dSAlex Elder struct reset_control *reset;
695efcd8b9dSAlex Elder struct spi_controller *host;
696efcd8b9dSAlex Elder struct resource *iores;
697efcd8b9dSAlex Elder struct clk *clk_bus;
698efcd8b9dSAlex Elder int ret;
699efcd8b9dSAlex Elder
700efcd8b9dSAlex Elder host = devm_spi_alloc_host(dev, sizeof(*drv_data));
701efcd8b9dSAlex Elder if (!host)
702efcd8b9dSAlex Elder return -ENOMEM;
703efcd8b9dSAlex Elder drv_data = spi_controller_get_devdata(host);
704efcd8b9dSAlex Elder drv_data->host = host;
705efcd8b9dSAlex Elder platform_set_drvdata(pdev, drv_data);
706efcd8b9dSAlex Elder
707efcd8b9dSAlex Elder ret = devm_k1_spi_dma_setup(drv_data, dev);
708efcd8b9dSAlex Elder if (ret == -EPROBE_DEFER)
709efcd8b9dSAlex Elder return ret;
710efcd8b9dSAlex Elder if (ret)
711efcd8b9dSAlex Elder dev_warn(dev, "DMA setup failed (%d), falling back to PIO\n", ret);
712efcd8b9dSAlex Elder
713efcd8b9dSAlex Elder drv_data->base = devm_platform_get_and_ioremap_resource(pdev, 0,
714efcd8b9dSAlex Elder &iores);
715efcd8b9dSAlex Elder if (IS_ERR(drv_data->base))
716efcd8b9dSAlex Elder return dev_err_probe(dev, PTR_ERR(drv_data->base),
717efcd8b9dSAlex Elder "error mapping memory\n");
718efcd8b9dSAlex Elder drv_data->base_addr = iores->start;
719efcd8b9dSAlex Elder
720efcd8b9dSAlex Elder clk_bus = devm_clk_get_enabled(dev, "bus");
721efcd8b9dSAlex Elder if (IS_ERR(clk_bus))
722efcd8b9dSAlex Elder return dev_err_probe(dev, PTR_ERR(clk_bus),
723efcd8b9dSAlex Elder "error getting/enabling bus clock\n");
724efcd8b9dSAlex Elder drv_data->bus_rate = clk_get_rate(clk_bus);
725efcd8b9dSAlex Elder
726efcd8b9dSAlex Elder drv_data->clk = devm_clk_get_enabled(dev, "core");
727efcd8b9dSAlex Elder if (IS_ERR(drv_data->clk))
728efcd8b9dSAlex Elder return dev_err_probe(dev, PTR_ERR(drv_data->clk),
729efcd8b9dSAlex Elder "error getting/enabling core clock\n");
730efcd8b9dSAlex Elder
731efcd8b9dSAlex Elder reset = devm_reset_control_get_exclusive_deasserted(dev, NULL);
732efcd8b9dSAlex Elder if (IS_ERR(reset))
733efcd8b9dSAlex Elder return dev_err_probe(dev, PTR_ERR(reset),
734efcd8b9dSAlex Elder "error getting/deasserting reset\n");
735efcd8b9dSAlex Elder
736efcd8b9dSAlex Elder k1_spi_register_reset(drv_data, true);
737efcd8b9dSAlex Elder
738efcd8b9dSAlex Elder drv_data->irq = platform_get_irq(pdev, 0);
739efcd8b9dSAlex Elder if (drv_data->irq < 0)
740efcd8b9dSAlex Elder return drv_data->irq;
741efcd8b9dSAlex Elder
742efcd8b9dSAlex Elder ret = devm_request_irq(dev, drv_data->irq, k1_spi_ssp_isr,
743efcd8b9dSAlex Elder IRQF_SHARED, dev_name(dev), drv_data);
744efcd8b9dSAlex Elder if (ret < 0)
745efcd8b9dSAlex Elder return ret;
746efcd8b9dSAlex Elder
747efcd8b9dSAlex Elder /* Initialize the host structure, then register it */
748efcd8b9dSAlex Elder host->dev.of_node = dev_of_node(dev);
749efcd8b9dSAlex Elder host->dev.parent = dev;
750efcd8b9dSAlex Elder host->num_chipselect = 1;
751efcd8b9dSAlex Elder if (drv_data->dma_enabled)
752efcd8b9dSAlex Elder host->dma_alignment = K1_SPI_DMA_ALIGNMENT;
753efcd8b9dSAlex Elder host->mode_bits = SPI_CPOL | SPI_CPHA | SPI_LOOP;
754efcd8b9dSAlex Elder host->bits_per_word_mask = SPI_BPW_RANGE_MASK(4, 32);
755efcd8b9dSAlex Elder host->min_speed_hz = K1_SPI_MIN_SPEED_HZ;
756efcd8b9dSAlex Elder host->max_speed_hz = K1_SPI_MAX_SPEED_HZ;
757efcd8b9dSAlex Elder host->flags = SPI_CONTROLLER_MUST_RX | SPI_CONTROLLER_MUST_TX;
758efcd8b9dSAlex Elder host->max_dma_len = K1_SPI_MAX_DMA_LEN;
759efcd8b9dSAlex Elder
760efcd8b9dSAlex Elder host->setup = k1_spi_setup;
761efcd8b9dSAlex Elder host->cleanup = k1_spi_cleanup;
762efcd8b9dSAlex Elder host->can_dma = k1_spi_can_dma;
763efcd8b9dSAlex Elder host->prepare_message = k1_spi_prepare_message;
764efcd8b9dSAlex Elder host->set_cs = k1_spi_set_cs;
765efcd8b9dSAlex Elder host->transfer_one = k1_spi_transfer_one;
766efcd8b9dSAlex Elder host->handle_err = k1_spi_handle_err;
767efcd8b9dSAlex Elder
768efcd8b9dSAlex Elder ret = devm_spi_register_controller(dev, host);
769efcd8b9dSAlex Elder if (ret)
770efcd8b9dSAlex Elder dev_err(dev, "error registering controller\n");
771efcd8b9dSAlex Elder
772efcd8b9dSAlex Elder return ret;
773efcd8b9dSAlex Elder }
774efcd8b9dSAlex Elder
775efcd8b9dSAlex Elder static const struct of_device_id k1_spi_dt_ids[] = {
776efcd8b9dSAlex Elder { .compatible = "spacemit,k1-spi", },
777efcd8b9dSAlex Elder {}
778efcd8b9dSAlex Elder };
779efcd8b9dSAlex Elder MODULE_DEVICE_TABLE(of, k1_spi_dt_ids);
780efcd8b9dSAlex Elder
781efcd8b9dSAlex Elder static struct platform_driver k1_spi_driver = {
782efcd8b9dSAlex Elder .probe = k1_spi_probe,
783efcd8b9dSAlex Elder .driver = {
784efcd8b9dSAlex Elder .name = "k1-spi",
785efcd8b9dSAlex Elder .of_match_table = k1_spi_dt_ids,
786efcd8b9dSAlex Elder },
787efcd8b9dSAlex Elder };
788efcd8b9dSAlex Elder module_platform_driver(k1_spi_driver);
789efcd8b9dSAlex Elder
790 MODULE_DESCRIPTION("SpacemiT K1 SPI controller driver");
791 MODULE_LICENSE("GPL");
792