• Home
  • Raw
  • Download

Lines Matching +full:spi +full:- +full:base

1 // SPDX-License-Identifier: GPL-2.0+
6 #include <linux/dma-mapping.h>
12 #include <linux/spi/spi.h>
68 void __iomem *base; member
76 { .compatible = "mediatek,mt2712-spi-slave", },
85 reg_val = readl(mdata->base + SPIS_DMA_CFG_REG); in mtk_spi_slave_disable_dma()
88 writel(reg_val, mdata->base + SPIS_DMA_CFG_REG); in mtk_spi_slave_disable_dma()
95 reg_val = readl(mdata->base + SPIS_CFG_REG); in mtk_spi_slave_disable_xfer()
98 writel(reg_val, mdata->base + SPIS_CFG_REG); in mtk_spi_slave_disable_xfer()
103 if (wait_for_completion_interruptible(&mdata->xfer_done) || in mtk_spi_slave_wait_for_completion()
104 mdata->slave_aborted) { in mtk_spi_slave_wait_for_completion()
105 dev_err(mdata->dev, "interrupted\n"); in mtk_spi_slave_wait_for_completion()
106 return -EINTR; in mtk_spi_slave_wait_for_completion()
116 struct spi_device *spi = msg->spi; in mtk_spi_slave_prepare_message() local
120 cpha = spi->mode & SPI_CPHA ? 1 : 0; in mtk_spi_slave_prepare_message()
121 cpol = spi->mode & SPI_CPOL ? 1 : 0; in mtk_spi_slave_prepare_message()
123 reg_val = readl(mdata->base + SPIS_CFG_REG); in mtk_spi_slave_prepare_message()
133 if (spi->mode & SPI_LSB_FIRST) in mtk_spi_slave_prepare_message()
140 writel(reg_val, mdata->base + SPIS_CFG_REG); in mtk_spi_slave_prepare_message()
146 struct spi_device *spi, in mtk_spi_slave_fifo_transfer() argument
152 writel(SPIS_SOFT_RST, mdata->base + SPIS_SOFT_RST_REG); in mtk_spi_slave_fifo_transfer()
154 reg_val = readl(mdata->base + SPIS_CFG_REG); in mtk_spi_slave_fifo_transfer()
155 if (xfer->rx_buf) in mtk_spi_slave_fifo_transfer()
157 if (xfer->tx_buf) in mtk_spi_slave_fifo_transfer()
159 writel(reg_val, mdata->base + SPIS_CFG_REG); in mtk_spi_slave_fifo_transfer()
161 cnt = xfer->len / 4; in mtk_spi_slave_fifo_transfer()
162 if (xfer->tx_buf) in mtk_spi_slave_fifo_transfer()
163 iowrite32_rep(mdata->base + SPIS_TX_DATA_REG, in mtk_spi_slave_fifo_transfer()
164 xfer->tx_buf, cnt); in mtk_spi_slave_fifo_transfer()
166 remainder = xfer->len % 4; in mtk_spi_slave_fifo_transfer()
167 if (xfer->tx_buf && remainder > 0) { in mtk_spi_slave_fifo_transfer()
169 memcpy(&reg_val, xfer->tx_buf + cnt * 4, remainder); in mtk_spi_slave_fifo_transfer()
170 writel(reg_val, mdata->base + SPIS_TX_DATA_REG); in mtk_spi_slave_fifo_transfer()
176 writel(SPIS_SOFT_RST, mdata->base + SPIS_SOFT_RST_REG); in mtk_spi_slave_fifo_transfer()
183 struct spi_device *spi, in mtk_spi_slave_dma_transfer() argument
187 struct device *dev = mdata->dev; in mtk_spi_slave_dma_transfer()
190 writel(SPIS_SOFT_RST, mdata->base + SPIS_SOFT_RST_REG); in mtk_spi_slave_dma_transfer()
192 if (xfer->tx_buf) { in mtk_spi_slave_dma_transfer()
196 void *nonconst_tx = (void *)xfer->tx_buf; in mtk_spi_slave_dma_transfer()
198 xfer->tx_dma = dma_map_single(dev, nonconst_tx, in mtk_spi_slave_dma_transfer()
199 xfer->len, DMA_TO_DEVICE); in mtk_spi_slave_dma_transfer()
200 if (dma_mapping_error(dev, xfer->tx_dma)) { in mtk_spi_slave_dma_transfer()
201 ret = -ENOMEM; in mtk_spi_slave_dma_transfer()
206 if (xfer->rx_buf) { in mtk_spi_slave_dma_transfer()
207 xfer->rx_dma = dma_map_single(dev, xfer->rx_buf, in mtk_spi_slave_dma_transfer()
208 xfer->len, DMA_FROM_DEVICE); in mtk_spi_slave_dma_transfer()
209 if (dma_mapping_error(dev, xfer->rx_dma)) { in mtk_spi_slave_dma_transfer()
210 ret = -ENOMEM; in mtk_spi_slave_dma_transfer()
215 writel(xfer->tx_dma, mdata->base + SPIS_TX_SRC_REG); in mtk_spi_slave_dma_transfer()
216 writel(xfer->rx_dma, mdata->base + SPIS_RX_DST_REG); in mtk_spi_slave_dma_transfer()
218 writel(SPIS_DMA_ADDR_EN, mdata->base + SPIS_SOFT_RST_REG); in mtk_spi_slave_dma_transfer()
221 reg_val = readl(mdata->base + SPIS_CFG_REG); in mtk_spi_slave_dma_transfer()
222 if (xfer->tx_buf) in mtk_spi_slave_dma_transfer()
224 if (xfer->rx_buf) in mtk_spi_slave_dma_transfer()
226 writel(reg_val, mdata->base + SPIS_CFG_REG); in mtk_spi_slave_dma_transfer()
230 reg_val |= (xfer->len - 1) & TX_DMA_LEN; in mtk_spi_slave_dma_transfer()
231 writel(reg_val, mdata->base + SPIS_DMA_CFG_REG); in mtk_spi_slave_dma_transfer()
233 reg_val = readl(mdata->base + SPIS_DMA_CFG_REG); in mtk_spi_slave_dma_transfer()
234 if (xfer->tx_buf) in mtk_spi_slave_dma_transfer()
236 if (xfer->rx_buf) in mtk_spi_slave_dma_transfer()
239 writel(reg_val, mdata->base + SPIS_DMA_CFG_REG); in mtk_spi_slave_dma_transfer()
248 if (xfer->rx_buf) in mtk_spi_slave_dma_transfer()
249 dma_unmap_single(dev, xfer->rx_dma, in mtk_spi_slave_dma_transfer()
250 xfer->len, DMA_FROM_DEVICE); in mtk_spi_slave_dma_transfer()
253 if (xfer->tx_buf) in mtk_spi_slave_dma_transfer()
254 dma_unmap_single(dev, xfer->tx_dma, in mtk_spi_slave_dma_transfer()
255 xfer->len, DMA_TO_DEVICE); in mtk_spi_slave_dma_transfer()
260 writel(SPIS_SOFT_RST, mdata->base + SPIS_SOFT_RST_REG); in mtk_spi_slave_dma_transfer()
266 struct spi_device *spi, in mtk_spi_slave_transfer_one() argument
271 reinit_completion(&mdata->xfer_done); in mtk_spi_slave_transfer_one()
272 mdata->slave_aborted = false; in mtk_spi_slave_transfer_one()
273 mdata->cur_transfer = xfer; in mtk_spi_slave_transfer_one()
275 if (xfer->len > MTK_SPI_SLAVE_MAX_FIFO_SIZE) in mtk_spi_slave_transfer_one()
276 return mtk_spi_slave_dma_transfer(ctlr, spi, xfer); in mtk_spi_slave_transfer_one()
278 return mtk_spi_slave_fifo_transfer(ctlr, spi, xfer); in mtk_spi_slave_transfer_one()
281 static int mtk_spi_slave_setup(struct spi_device *spi) in mtk_spi_slave_setup() argument
283 struct mtk_spi_slave *mdata = spi_controller_get_devdata(spi->master); in mtk_spi_slave_setup()
288 writel(reg_val, mdata->base + SPIS_IRQ_EN_REG); in mtk_spi_slave_setup()
292 writel(reg_val, mdata->base + SPIS_IRQ_MASK_REG); in mtk_spi_slave_setup()
304 mdata->slave_aborted = true; in mtk_slave_abort()
305 complete(&mdata->xfer_done); in mtk_slave_abort()
314 struct spi_transfer *trans = mdata->cur_transfer; in mtk_spi_slave_interrupt()
317 int_status = readl(mdata->base + SPIS_IRQ_ST_REG); in mtk_spi_slave_interrupt()
318 writel(int_status, mdata->base + SPIS_IRQ_CLR_REG); in mtk_spi_slave_interrupt()
326 writel(SPIS_SOFT_RST, mdata->base + SPIS_SOFT_RST_REG); in mtk_spi_slave_interrupt()
328 if (trans->tx_buf) in mtk_spi_slave_interrupt()
329 dma_unmap_single(mdata->dev, trans->tx_dma, in mtk_spi_slave_interrupt()
330 trans->len, DMA_TO_DEVICE); in mtk_spi_slave_interrupt()
331 if (trans->rx_buf) in mtk_spi_slave_interrupt()
332 dma_unmap_single(mdata->dev, trans->rx_dma, in mtk_spi_slave_interrupt()
333 trans->len, DMA_FROM_DEVICE); in mtk_spi_slave_interrupt()
342 cnt = trans->len / 4; in mtk_spi_slave_interrupt()
343 if (trans->rx_buf) in mtk_spi_slave_interrupt()
344 ioread32_rep(mdata->base + SPIS_RX_DATA_REG, in mtk_spi_slave_interrupt()
345 trans->rx_buf, cnt); in mtk_spi_slave_interrupt()
346 remainder = trans->len % 4; in mtk_spi_slave_interrupt()
347 if (trans->rx_buf && remainder > 0) { in mtk_spi_slave_interrupt()
348 reg_val = readl(mdata->base + SPIS_RX_DATA_REG); in mtk_spi_slave_interrupt()
349 memcpy(trans->rx_buf + (cnt * 4), in mtk_spi_slave_interrupt()
357 dev_warn(&ctlr->dev, "cmd invalid\n"); in mtk_spi_slave_interrupt()
361 mdata->cur_transfer = NULL; in mtk_spi_slave_interrupt()
362 complete(&mdata->xfer_done); in mtk_spi_slave_interrupt()
373 ctlr = spi_alloc_slave(&pdev->dev, sizeof(*mdata)); in mtk_spi_slave_probe()
375 dev_err(&pdev->dev, "failed to alloc spi slave\n"); in mtk_spi_slave_probe()
376 return -ENOMEM; in mtk_spi_slave_probe()
379 ctlr->auto_runtime_pm = true; in mtk_spi_slave_probe()
380 ctlr->dev.of_node = pdev->dev.of_node; in mtk_spi_slave_probe()
381 ctlr->mode_bits = SPI_CPOL | SPI_CPHA; in mtk_spi_slave_probe()
382 ctlr->mode_bits |= SPI_LSB_FIRST; in mtk_spi_slave_probe()
384 ctlr->prepare_message = mtk_spi_slave_prepare_message; in mtk_spi_slave_probe()
385 ctlr->transfer_one = mtk_spi_slave_transfer_one; in mtk_spi_slave_probe()
386 ctlr->setup = mtk_spi_slave_setup; in mtk_spi_slave_probe()
387 ctlr->slave_abort = mtk_slave_abort; in mtk_spi_slave_probe()
393 init_completion(&mdata->xfer_done); in mtk_spi_slave_probe()
394 mdata->dev = &pdev->dev; in mtk_spi_slave_probe()
395 mdata->base = devm_platform_ioremap_resource(pdev, 0); in mtk_spi_slave_probe()
396 if (IS_ERR(mdata->base)) { in mtk_spi_slave_probe()
397 ret = PTR_ERR(mdata->base); in mtk_spi_slave_probe()
407 ret = devm_request_irq(&pdev->dev, irq, mtk_spi_slave_interrupt, in mtk_spi_slave_probe()
408 IRQF_TRIGGER_NONE, dev_name(&pdev->dev), ctlr); in mtk_spi_slave_probe()
410 dev_err(&pdev->dev, "failed to register irq (%d)\n", ret); in mtk_spi_slave_probe()
414 mdata->spi_clk = devm_clk_get(&pdev->dev, "spi"); in mtk_spi_slave_probe()
415 if (IS_ERR(mdata->spi_clk)) { in mtk_spi_slave_probe()
416 ret = PTR_ERR(mdata->spi_clk); in mtk_spi_slave_probe()
417 dev_err(&pdev->dev, "failed to get spi-clk: %d\n", ret); in mtk_spi_slave_probe()
421 ret = clk_prepare_enable(mdata->spi_clk); in mtk_spi_slave_probe()
423 dev_err(&pdev->dev, "failed to enable spi_clk (%d)\n", ret); in mtk_spi_slave_probe()
427 pm_runtime_enable(&pdev->dev); in mtk_spi_slave_probe()
429 ret = devm_spi_register_controller(&pdev->dev, ctlr); in mtk_spi_slave_probe()
431 dev_err(&pdev->dev, in mtk_spi_slave_probe()
433 clk_disable_unprepare(mdata->spi_clk); in mtk_spi_slave_probe()
437 clk_disable_unprepare(mdata->spi_clk); in mtk_spi_slave_probe()
442 pm_runtime_disable(&pdev->dev); in mtk_spi_slave_probe()
451 pm_runtime_disable(&pdev->dev); in mtk_spi_slave_remove()
468 clk_disable_unprepare(mdata->spi_clk); in mtk_spi_slave_suspend()
480 ret = clk_prepare_enable(mdata->spi_clk); in mtk_spi_slave_resume()
489 clk_disable_unprepare(mdata->spi_clk); in mtk_spi_slave_resume()
501 clk_disable_unprepare(mdata->spi_clk); in mtk_spi_slave_runtime_suspend()
512 ret = clk_prepare_enable(mdata->spi_clk); in mtk_spi_slave_runtime_resume()
530 .name = "mtk-spi-slave",
540 MODULE_DESCRIPTION("MTK SPI Slave Controller driver");
543 MODULE_ALIAS("platform:mtk-spi-slave");