1 // SPDX-License-Identifier: GPL-2.0+
2 // Copyright (c) 2018 MediaTek Inc.
5 #include <linux/device.h>
6 #include <linux/dma-mapping.h>
8 #include <linux/interrupt.h>
9 #include <linux/module.h>
10 #include <linux/platform_device.h>
11 #include <linux/pm_runtime.h>
12 #include <linux/spi/spi.h>
14 #define SPIS_IRQ_EN_REG 0x0
15 #define SPIS_IRQ_CLR_REG 0x4
16 #define SPIS_IRQ_ST_REG 0x8
17 #define SPIS_IRQ_MASK_REG 0xc
18 #define SPIS_CFG_REG 0x10
19 #define SPIS_RX_DATA_REG 0x14
20 #define SPIS_TX_DATA_REG 0x18
21 #define SPIS_RX_DST_REG 0x1c
22 #define SPIS_TX_SRC_REG 0x20
23 #define SPIS_DMA_CFG_REG 0x30
24 #define SPIS_SOFT_RST_REG 0x40
27 #define DMA_DONE_EN BIT(7)
28 #define DATA_DONE_EN BIT(2)
29 #define RSTA_DONE_EN BIT(1)
30 #define CMD_INVALID_EN BIT(0)
33 #define DMA_DONE_ST BIT(7)
34 #define DATA_DONE_ST BIT(2)
35 #define RSTA_DONE_ST BIT(1)
36 #define CMD_INVALID_ST BIT(0)
38 /* SPIS_IRQ_MASK_REG */
39 #define DMA_DONE_MASK BIT(7)
40 #define DATA_DONE_MASK BIT(2)
41 #define RSTA_DONE_MASK BIT(1)
42 #define CMD_INVALID_MASK BIT(0)
45 #define SPIS_TX_ENDIAN BIT(7)
46 #define SPIS_RX_ENDIAN BIT(6)
47 #define SPIS_TXMSBF BIT(5)
48 #define SPIS_RXMSBF BIT(4)
49 #define SPIS_CPHA BIT(3)
50 #define SPIS_CPOL BIT(2)
51 #define SPIS_TX_EN BIT(1)
52 #define SPIS_RX_EN BIT(0)
54 /* SPIS_DMA_CFG_REG */
55 #define TX_DMA_TRIG_EN BIT(31)
56 #define TX_DMA_EN BIT(30)
57 #define RX_DMA_EN BIT(29)
58 #define TX_DMA_LEN 0xfffff
60 /* SPIS_SOFT_RST_REG */
61 #define SPIS_DMA_ADDR_EN BIT(1)
62 #define SPIS_SOFT_RST BIT(0)
64 #define MTK_SPI_SLAVE_MAX_FIFO_SIZE 512U
66 struct mtk_spi_slave
{
70 struct completion xfer_done
;
71 struct spi_transfer
*cur_transfer
;
75 static const struct of_device_id mtk_spi_slave_of_match
[] = {
76 { .compatible
= "mediatek,mt2712-spi-slave", },
79 MODULE_DEVICE_TABLE(of
, mtk_spi_slave_of_match
);
81 static void mtk_spi_slave_disable_dma(struct mtk_spi_slave
*mdata
)
85 reg_val
= readl(mdata
->base
+ SPIS_DMA_CFG_REG
);
86 reg_val
&= ~RX_DMA_EN
;
87 reg_val
&= ~TX_DMA_EN
;
88 writel(reg_val
, mdata
->base
+ SPIS_DMA_CFG_REG
);
91 static void mtk_spi_slave_disable_xfer(struct mtk_spi_slave
*mdata
)
95 reg_val
= readl(mdata
->base
+ SPIS_CFG_REG
);
96 reg_val
&= ~SPIS_TX_EN
;
97 reg_val
&= ~SPIS_RX_EN
;
98 writel(reg_val
, mdata
->base
+ SPIS_CFG_REG
);
101 static int mtk_spi_slave_wait_for_completion(struct mtk_spi_slave
*mdata
)
103 if (wait_for_completion_interruptible(&mdata
->xfer_done
) ||
104 mdata
->slave_aborted
) {
105 dev_err(mdata
->dev
, "interrupted\n");
112 static int mtk_spi_slave_prepare_message(struct spi_controller
*ctlr
,
113 struct spi_message
*msg
)
115 struct mtk_spi_slave
*mdata
= spi_controller_get_devdata(ctlr
);
116 struct spi_device
*spi
= msg
->spi
;
120 cpha
= spi
->mode
& SPI_CPHA
? 1 : 0;
121 cpol
= spi
->mode
& SPI_CPOL
? 1 : 0;
123 reg_val
= readl(mdata
->base
+ SPIS_CFG_REG
);
125 reg_val
|= SPIS_CPHA
;
127 reg_val
&= ~SPIS_CPHA
;
129 reg_val
|= SPIS_CPOL
;
131 reg_val
&= ~SPIS_CPOL
;
133 if (spi
->mode
& SPI_LSB_FIRST
)
134 reg_val
&= ~(SPIS_TXMSBF
| SPIS_RXMSBF
);
136 reg_val
|= SPIS_TXMSBF
| SPIS_RXMSBF
;
138 reg_val
&= ~SPIS_TX_ENDIAN
;
139 reg_val
&= ~SPIS_RX_ENDIAN
;
140 writel(reg_val
, mdata
->base
+ SPIS_CFG_REG
);
145 static int mtk_spi_slave_fifo_transfer(struct spi_controller
*ctlr
,
146 struct spi_device
*spi
,
147 struct spi_transfer
*xfer
)
149 struct mtk_spi_slave
*mdata
= spi_controller_get_devdata(ctlr
);
150 int reg_val
, cnt
, remainder
, ret
;
152 writel(SPIS_SOFT_RST
, mdata
->base
+ SPIS_SOFT_RST_REG
);
154 reg_val
= readl(mdata
->base
+ SPIS_CFG_REG
);
156 reg_val
|= SPIS_RX_EN
;
158 reg_val
|= SPIS_TX_EN
;
159 writel(reg_val
, mdata
->base
+ SPIS_CFG_REG
);
163 iowrite32_rep(mdata
->base
+ SPIS_TX_DATA_REG
,
166 remainder
= xfer
->len
% 4;
167 if (xfer
->tx_buf
&& remainder
> 0) {
169 memcpy(®_val
, xfer
->tx_buf
+ cnt
* 4, remainder
);
170 writel(reg_val
, mdata
->base
+ SPIS_TX_DATA_REG
);
173 ret
= mtk_spi_slave_wait_for_completion(mdata
);
175 mtk_spi_slave_disable_xfer(mdata
);
176 writel(SPIS_SOFT_RST
, mdata
->base
+ SPIS_SOFT_RST_REG
);
182 static int mtk_spi_slave_dma_transfer(struct spi_controller
*ctlr
,
183 struct spi_device
*spi
,
184 struct spi_transfer
*xfer
)
186 struct mtk_spi_slave
*mdata
= spi_controller_get_devdata(ctlr
);
187 struct device
*dev
= mdata
->dev
;
190 writel(SPIS_SOFT_RST
, mdata
->base
+ SPIS_SOFT_RST_REG
);
193 /* tx_buf is a const void* where we need a void * for
196 void *nonconst_tx
= (void *)xfer
->tx_buf
;
198 xfer
->tx_dma
= dma_map_single(dev
, nonconst_tx
,
199 xfer
->len
, DMA_TO_DEVICE
);
200 if (dma_mapping_error(dev
, xfer
->tx_dma
)) {
202 goto disable_transfer
;
207 xfer
->rx_dma
= dma_map_single(dev
, xfer
->rx_buf
,
208 xfer
->len
, DMA_FROM_DEVICE
);
209 if (dma_mapping_error(dev
, xfer
->rx_dma
)) {
215 writel(xfer
->tx_dma
, mdata
->base
+ SPIS_TX_SRC_REG
);
216 writel(xfer
->rx_dma
, mdata
->base
+ SPIS_RX_DST_REG
);
218 writel(SPIS_DMA_ADDR_EN
, mdata
->base
+ SPIS_SOFT_RST_REG
);
220 /* enable config reg tx rx_enable */
221 reg_val
= readl(mdata
->base
+ SPIS_CFG_REG
);
223 reg_val
|= SPIS_TX_EN
;
225 reg_val
|= SPIS_RX_EN
;
226 writel(reg_val
, mdata
->base
+ SPIS_CFG_REG
);
230 reg_val
|= (xfer
->len
- 1) & TX_DMA_LEN
;
231 writel(reg_val
, mdata
->base
+ SPIS_DMA_CFG_REG
);
233 reg_val
= readl(mdata
->base
+ SPIS_DMA_CFG_REG
);
235 reg_val
|= TX_DMA_EN
;
237 reg_val
|= RX_DMA_EN
;
238 reg_val
|= TX_DMA_TRIG_EN
;
239 writel(reg_val
, mdata
->base
+ SPIS_DMA_CFG_REG
);
241 ret
= mtk_spi_slave_wait_for_completion(mdata
);
249 dma_unmap_single(dev
, xfer
->rx_dma
,
250 xfer
->len
, DMA_FROM_DEVICE
);
254 dma_unmap_single(dev
, xfer
->tx_dma
,
255 xfer
->len
, DMA_TO_DEVICE
);
258 mtk_spi_slave_disable_dma(mdata
);
259 mtk_spi_slave_disable_xfer(mdata
);
260 writel(SPIS_SOFT_RST
, mdata
->base
+ SPIS_SOFT_RST_REG
);
265 static int mtk_spi_slave_transfer_one(struct spi_controller
*ctlr
,
266 struct spi_device
*spi
,
267 struct spi_transfer
*xfer
)
269 struct mtk_spi_slave
*mdata
= spi_controller_get_devdata(ctlr
);
271 reinit_completion(&mdata
->xfer_done
);
272 mdata
->slave_aborted
= false;
273 mdata
->cur_transfer
= xfer
;
275 if (xfer
->len
> MTK_SPI_SLAVE_MAX_FIFO_SIZE
)
276 return mtk_spi_slave_dma_transfer(ctlr
, spi
, xfer
);
278 return mtk_spi_slave_fifo_transfer(ctlr
, spi
, xfer
);
281 static int mtk_spi_slave_setup(struct spi_device
*spi
)
283 struct mtk_spi_slave
*mdata
= spi_controller_get_devdata(spi
->master
);
286 reg_val
= DMA_DONE_EN
| DATA_DONE_EN
|
287 RSTA_DONE_EN
| CMD_INVALID_EN
;
288 writel(reg_val
, mdata
->base
+ SPIS_IRQ_EN_REG
);
290 reg_val
= DMA_DONE_MASK
| DATA_DONE_MASK
|
291 RSTA_DONE_MASK
| CMD_INVALID_MASK
;
292 writel(reg_val
, mdata
->base
+ SPIS_IRQ_MASK_REG
);
294 mtk_spi_slave_disable_dma(mdata
);
295 mtk_spi_slave_disable_xfer(mdata
);
300 static int mtk_slave_abort(struct spi_controller
*ctlr
)
302 struct mtk_spi_slave
*mdata
= spi_controller_get_devdata(ctlr
);
304 mdata
->slave_aborted
= true;
305 complete(&mdata
->xfer_done
);
310 static irqreturn_t
mtk_spi_slave_interrupt(int irq
, void *dev_id
)
312 struct spi_controller
*ctlr
= dev_id
;
313 struct mtk_spi_slave
*mdata
= spi_controller_get_devdata(ctlr
);
314 struct spi_transfer
*trans
= mdata
->cur_transfer
;
315 u32 int_status
, reg_val
, cnt
, remainder
;
317 int_status
= readl(mdata
->base
+ SPIS_IRQ_ST_REG
);
318 writel(int_status
, mdata
->base
+ SPIS_IRQ_CLR_REG
);
323 if ((int_status
& DMA_DONE_ST
) &&
324 ((int_status
& DATA_DONE_ST
) ||
325 (int_status
& RSTA_DONE_ST
))) {
326 writel(SPIS_SOFT_RST
, mdata
->base
+ SPIS_SOFT_RST_REG
);
329 dma_unmap_single(mdata
->dev
, trans
->tx_dma
,
330 trans
->len
, DMA_TO_DEVICE
);
332 dma_unmap_single(mdata
->dev
, trans
->rx_dma
,
333 trans
->len
, DMA_FROM_DEVICE
);
335 mtk_spi_slave_disable_dma(mdata
);
336 mtk_spi_slave_disable_xfer(mdata
);
339 if ((!(int_status
& DMA_DONE_ST
)) &&
340 ((int_status
& DATA_DONE_ST
) ||
341 (int_status
& RSTA_DONE_ST
))) {
342 cnt
= trans
->len
/ 4;
344 ioread32_rep(mdata
->base
+ SPIS_RX_DATA_REG
,
346 remainder
= trans
->len
% 4;
347 if (trans
->rx_buf
&& remainder
> 0) {
348 reg_val
= readl(mdata
->base
+ SPIS_RX_DATA_REG
);
349 memcpy(trans
->rx_buf
+ (cnt
* 4),
350 ®_val
, remainder
);
353 mtk_spi_slave_disable_xfer(mdata
);
356 if (int_status
& CMD_INVALID_ST
) {
357 dev_warn(&ctlr
->dev
, "cmd invalid\n");
361 mdata
->cur_transfer
= NULL
;
362 complete(&mdata
->xfer_done
);
367 static int mtk_spi_slave_probe(struct platform_device
*pdev
)
369 struct spi_controller
*ctlr
;
370 struct mtk_spi_slave
*mdata
;
371 struct resource
*res
;
374 ctlr
= spi_alloc_slave(&pdev
->dev
, sizeof(*mdata
));
376 dev_err(&pdev
->dev
, "failed to alloc spi slave\n");
380 ctlr
->auto_runtime_pm
= true;
381 ctlr
->dev
.of_node
= pdev
->dev
.of_node
;
382 ctlr
->mode_bits
= SPI_CPOL
| SPI_CPHA
;
383 ctlr
->mode_bits
|= SPI_LSB_FIRST
;
385 ctlr
->prepare_message
= mtk_spi_slave_prepare_message
;
386 ctlr
->transfer_one
= mtk_spi_slave_transfer_one
;
387 ctlr
->setup
= mtk_spi_slave_setup
;
388 ctlr
->slave_abort
= mtk_slave_abort
;
390 mdata
= spi_controller_get_devdata(ctlr
);
392 platform_set_drvdata(pdev
, ctlr
);
394 init_completion(&mdata
->xfer_done
);
396 res
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
399 dev_err(&pdev
->dev
, "failed to determine base address\n");
403 mdata
->dev
= &pdev
->dev
;
405 mdata
->base
= devm_ioremap_resource(&pdev
->dev
, res
);
406 if (IS_ERR(mdata
->base
)) {
407 ret
= PTR_ERR(mdata
->base
);
411 irq
= platform_get_irq(pdev
, 0);
417 ret
= devm_request_irq(&pdev
->dev
, irq
, mtk_spi_slave_interrupt
,
418 IRQF_TRIGGER_NONE
, dev_name(&pdev
->dev
), ctlr
);
420 dev_err(&pdev
->dev
, "failed to register irq (%d)\n", ret
);
424 mdata
->spi_clk
= devm_clk_get(&pdev
->dev
, "spi");
425 if (IS_ERR(mdata
->spi_clk
)) {
426 ret
= PTR_ERR(mdata
->spi_clk
);
427 dev_err(&pdev
->dev
, "failed to get spi-clk: %d\n", ret
);
431 ret
= clk_prepare_enable(mdata
->spi_clk
);
433 dev_err(&pdev
->dev
, "failed to enable spi_clk (%d)\n", ret
);
437 pm_runtime_enable(&pdev
->dev
);
439 ret
= devm_spi_register_controller(&pdev
->dev
, ctlr
);
442 "failed to register slave controller(%d)\n", ret
);
443 clk_disable_unprepare(mdata
->spi_clk
);
444 goto err_disable_runtime_pm
;
447 clk_disable_unprepare(mdata
->spi_clk
);
451 err_disable_runtime_pm
:
452 pm_runtime_disable(&pdev
->dev
);
454 spi_controller_put(ctlr
);
459 static int mtk_spi_slave_remove(struct platform_device
*pdev
)
461 pm_runtime_disable(&pdev
->dev
);
466 #ifdef CONFIG_PM_SLEEP
467 static int mtk_spi_slave_suspend(struct device
*dev
)
469 struct spi_controller
*ctlr
= dev_get_drvdata(dev
);
470 struct mtk_spi_slave
*mdata
= spi_controller_get_devdata(ctlr
);
473 ret
= spi_controller_suspend(ctlr
);
477 if (!pm_runtime_suspended(dev
))
478 clk_disable_unprepare(mdata
->spi_clk
);
483 static int mtk_spi_slave_resume(struct device
*dev
)
485 struct spi_controller
*ctlr
= dev_get_drvdata(dev
);
486 struct mtk_spi_slave
*mdata
= spi_controller_get_devdata(ctlr
);
489 if (!pm_runtime_suspended(dev
)) {
490 ret
= clk_prepare_enable(mdata
->spi_clk
);
492 dev_err(dev
, "failed to enable spi_clk (%d)\n", ret
);
497 ret
= spi_controller_resume(ctlr
);
499 clk_disable_unprepare(mdata
->spi_clk
);
503 #endif /* CONFIG_PM_SLEEP */
506 static int mtk_spi_slave_runtime_suspend(struct device
*dev
)
508 struct spi_controller
*ctlr
= dev_get_drvdata(dev
);
509 struct mtk_spi_slave
*mdata
= spi_controller_get_devdata(ctlr
);
511 clk_disable_unprepare(mdata
->spi_clk
);
516 static int mtk_spi_slave_runtime_resume(struct device
*dev
)
518 struct spi_controller
*ctlr
= dev_get_drvdata(dev
);
519 struct mtk_spi_slave
*mdata
= spi_controller_get_devdata(ctlr
);
522 ret
= clk_prepare_enable(mdata
->spi_clk
);
524 dev_err(dev
, "failed to enable spi_clk (%d)\n", ret
);
530 #endif /* CONFIG_PM */
532 static const struct dev_pm_ops mtk_spi_slave_pm
= {
533 SET_SYSTEM_SLEEP_PM_OPS(mtk_spi_slave_suspend
, mtk_spi_slave_resume
)
534 SET_RUNTIME_PM_OPS(mtk_spi_slave_runtime_suspend
,
535 mtk_spi_slave_runtime_resume
, NULL
)
538 static struct platform_driver mtk_spi_slave_driver
= {
540 .name
= "mtk-spi-slave",
541 .pm
= &mtk_spi_slave_pm
,
542 .of_match_table
= mtk_spi_slave_of_match
,
544 .probe
= mtk_spi_slave_probe
,
545 .remove
= mtk_spi_slave_remove
,
548 module_platform_driver(mtk_spi_slave_driver
);
550 MODULE_DESCRIPTION("MTK SPI Slave Controller driver");
551 MODULE_AUTHOR("Leilk Liu <leilk.liu@mediatek.com>");
552 MODULE_LICENSE("GPL v2");
553 MODULE_ALIAS("platform:mtk-spi-slave");