xref: /linux/drivers/spi/spi-spacemit-k1.c (revision fab183d632628381b466a41479489541ac0e29a0)
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