Lines Matching +full:spi +full:- +full:clk

1 // SPDX-License-Identifier: GPL-2.0
3 // Driver for AT91 USART Controllers as SPI
9 #include <linux/clk.h>
12 #include <linux/dma-direction.h>
21 #include <linux/spi/spi.h>
69 readl_relaxed((port)->regs + US_##reg)
71 writel_relaxed((value), (port)->regs + US_##reg)
74 readb_relaxed((port)->regs + US_##reg)
76 writeb_relaxed((value), (port)->regs + US_##reg)
83 struct clk *clk; member
109 aus->current_rx_remaining_bytes = 0; in dma_callback()
110 complete(&aus->xfer_completion); in dma_callback()
114 struct spi_device *spi, in at91_usart_spi_can_dma() argument
119 return aus->use_dma && xfer->len >= US_DMA_MIN_BYTES; in at91_usart_spi_can_dma()
126 struct device *dev = &aus->mpdev->dev; in at91_usart_spi_configure_dma()
127 phys_addr_t phybase = aus->phybase; in at91_usart_spi_configure_dma()
134 ctlr->dma_tx = dma_request_chan(dev, "tx"); in at91_usart_spi_configure_dma()
135 if (IS_ERR_OR_NULL(ctlr->dma_tx)) { in at91_usart_spi_configure_dma()
136 if (IS_ERR(ctlr->dma_tx)) { in at91_usart_spi_configure_dma()
137 err = PTR_ERR(ctlr->dma_tx); in at91_usart_spi_configure_dma()
142 "DMA TX channel not available, SPI unable to use DMA\n"); in at91_usart_spi_configure_dma()
143 err = -EBUSY; in at91_usart_spi_configure_dma()
147 ctlr->dma_rx = dma_request_chan(dev, "rx"); in at91_usart_spi_configure_dma()
148 if (IS_ERR_OR_NULL(ctlr->dma_rx)) { in at91_usart_spi_configure_dma()
149 if (IS_ERR(ctlr->dma_rx)) { in at91_usart_spi_configure_dma()
150 err = PTR_ERR(ctlr->dma_rx); in at91_usart_spi_configure_dma()
155 "DMA RX channel not available, SPI unable to use DMA\n"); in at91_usart_spi_configure_dma()
156 err = -EBUSY; in at91_usart_spi_configure_dma()
169 if (dmaengine_slave_config(ctlr->dma_rx, &slave_config)) { in at91_usart_spi_configure_dma()
170 dev_err(&ctlr->dev, in at91_usart_spi_configure_dma()
172 err = -EINVAL; in at91_usart_spi_configure_dma()
177 if (dmaengine_slave_config(ctlr->dma_tx, &slave_config)) { in at91_usart_spi_configure_dma()
178 dev_err(&ctlr->dev, in at91_usart_spi_configure_dma()
180 err = -EINVAL; in at91_usart_spi_configure_dma()
184 aus->use_dma = true; in at91_usart_spi_configure_dma()
188 if (!IS_ERR_OR_NULL(ctlr->dma_tx)) in at91_usart_spi_configure_dma()
189 dma_release_channel(ctlr->dma_tx); in at91_usart_spi_configure_dma()
190 if (!IS_ERR_OR_NULL(ctlr->dma_rx)) in at91_usart_spi_configure_dma()
191 dma_release_channel(ctlr->dma_rx); in at91_usart_spi_configure_dma()
192 ctlr->dma_tx = NULL; in at91_usart_spi_configure_dma()
193 ctlr->dma_rx = NULL; in at91_usart_spi_configure_dma()
201 if (ctlr->dma_rx) in at91_usart_spi_release_dma()
202 dma_release_channel(ctlr->dma_rx); in at91_usart_spi_release_dma()
203 if (ctlr->dma_tx) in at91_usart_spi_release_dma()
204 dma_release_channel(ctlr->dma_tx); in at91_usart_spi_release_dma()
209 if (ctlr->dma_rx) in at91_usart_spi_stop_dma()
210 dmaengine_terminate_all(ctlr->dma_rx); in at91_usart_spi_stop_dma()
211 if (ctlr->dma_tx) in at91_usart_spi_stop_dma()
212 dmaengine_terminate_all(ctlr->dma_tx); in at91_usart_spi_stop_dma()
219 struct dma_chan *rxchan = ctlr->dma_rx; in at91_usart_spi_dma_transfer()
220 struct dma_chan *txchan = ctlr->dma_tx; in at91_usart_spi_dma_transfer()
229 xfer->rx_sg.sgl, in at91_usart_spi_dma_transfer()
230 xfer->rx_sg.nents, in at91_usart_spi_dma_transfer()
238 xfer->tx_sg.sgl, in at91_usart_spi_dma_transfer()
239 xfer->tx_sg.nents, in at91_usart_spi_dma_transfer()
246 rxdesc->callback = dma_callback; in at91_usart_spi_dma_transfer()
247 rxdesc->callback_param = ctlr; in at91_usart_spi_dma_transfer()
249 cookie = rxdesc->tx_submit(rxdesc); in at91_usart_spi_dma_transfer()
253 cookie = txdesc->tx_submit(txdesc); in at91_usart_spi_dma_transfer()
257 rxchan->device->device_issue_pending(rxchan); in at91_usart_spi_dma_transfer()
258 txchan->device->device_issue_pending(txchan); in at91_usart_spi_dma_transfer()
267 return -ENOMEM; in at91_usart_spi_dma_transfer()
272 return wait_for_completion_timeout(&aus->xfer_completion, in at91_usart_spi_dma_timeout()
278 return aus->status & US_IR_TXRDY; in at91_usart_spi_tx_ready()
283 return aus->status & US_IR_RXRDY; in at91_usart_spi_rx_ready()
288 return aus->status & US_IR_OVRE; in at91_usart_spi_check_overrun()
293 aus->status = at91_usart_spi_readl(aus, CSR); in at91_usart_spi_read_status()
294 return aus->status; in at91_usart_spi_read_status()
299 unsigned int len = aus->current_transfer->len; in at91_usart_spi_tx()
300 unsigned int remaining = aus->current_tx_remaining_bytes; in at91_usart_spi_tx()
301 const u8 *tx_buf = aus->current_transfer->tx_buf; in at91_usart_spi_tx()
307 at91_usart_spi_writeb(aus, THR, tx_buf[len - remaining]); in at91_usart_spi_tx()
308 aus->current_tx_remaining_bytes--; in at91_usart_spi_tx()
314 int len = aus->current_transfer->len; in at91_usart_spi_rx()
315 int remaining = aus->current_rx_remaining_bytes; in at91_usart_spi_rx()
316 u8 *rx_buf = aus->current_transfer->rx_buf; in at91_usart_spi_rx()
321 rx_buf[len - remaining] = at91_usart_spi_readb(aus, RHR); in at91_usart_spi_rx()
322 aus->current_rx_remaining_bytes--; in at91_usart_spi_rx()
330 DIV_ROUND_UP(aus->spi_clk, xfer->speed_hz)); in at91_usart_spi_set_xfer_speed()
338 spin_lock(&aus->lock); in at91_usart_spi_interrupt()
342 aus->xfer_failed = true; in at91_usart_spi_interrupt()
344 spin_unlock(&aus->lock); in at91_usart_spi_interrupt()
350 spin_unlock(&aus->lock); in at91_usart_spi_interrupt()
354 spin_unlock(&aus->lock); in at91_usart_spi_interrupt()
359 static int at91_usart_spi_setup(struct spi_device *spi) in at91_usart_spi_setup() argument
361 struct at91_usart_spi *aus = spi_controller_get_devdata(spi->controller); in at91_usart_spi_setup()
362 u32 *ausd = spi->controller_state; in at91_usart_spi_setup()
365 if (spi->mode & SPI_CPOL) in at91_usart_spi_setup()
370 if (spi->mode & SPI_CPHA) in at91_usart_spi_setup()
375 if (spi->mode & SPI_LOOP) in at91_usart_spi_setup()
383 return -ENOMEM; in at91_usart_spi_setup()
385 spi->controller_state = ausd; in at91_usart_spi_setup()
390 dev_dbg(&spi->dev, in at91_usart_spi_setup()
391 "setup: bpw %u mode 0x%x -> mr %d %08x\n", in at91_usart_spi_setup()
392 spi->bits_per_word, spi->mode, spi_get_chipselect(spi, 0), mr); in at91_usart_spi_setup()
398 struct spi_device *spi, in at91_usart_spi_transfer_one() argument
406 aus->xfer_failed = false; in at91_usart_spi_transfer_one()
407 aus->current_transfer = xfer; in at91_usart_spi_transfer_one()
408 aus->current_tx_remaining_bytes = xfer->len; in at91_usart_spi_transfer_one()
409 aus->current_rx_remaining_bytes = xfer->len; in at91_usart_spi_transfer_one()
411 while ((aus->current_tx_remaining_bytes || in at91_usart_spi_transfer_one()
412 aus->current_rx_remaining_bytes) && !aus->xfer_failed) { in at91_usart_spi_transfer_one()
413 reinit_completion(&aus->xfer_completion); in at91_usart_spi_transfer_one()
414 if (at91_usart_spi_can_dma(ctlr, spi, xfer) && in at91_usart_spi_transfer_one()
423 dev_err(&spi->dev, "DMA transfer timeout\n"); in at91_usart_spi_transfer_one()
424 return -EIO; in at91_usart_spi_transfer_one()
426 aus->current_tx_remaining_bytes = 0; in at91_usart_spi_transfer_one()
435 if (aus->xfer_failed) { in at91_usart_spi_transfer_one()
436 dev_err(aus->dev, "Overrun!\n"); in at91_usart_spi_transfer_one()
437 return -EIO; in at91_usart_spi_transfer_one()
447 struct spi_device *spi = message->spi; in at91_usart_spi_prepare_message() local
448 u32 *ausd = spi->controller_state; in at91_usart_spi_prepare_message()
468 static void at91_usart_spi_cleanup(struct spi_device *spi) in at91_usart_spi_cleanup() argument
470 struct at91_usart_spi_device *ausd = spi->controller_state; in at91_usart_spi_cleanup()
472 spi->controller_state = NULL; in at91_usart_spi_cleanup()
486 cs_gpios = devm_gpiod_get_array_optional(&pdev->dev, "cs", GPIOD_OUT_LOW); in at91_usart_gpio_setup()
496 struct clk *clk; in at91_usart_spi_probe() local
500 regs = platform_get_resource(to_platform_device(pdev->dev.parent), in at91_usart_spi_probe()
503 return -EINVAL; in at91_usart_spi_probe()
505 irq = platform_get_irq(to_platform_device(pdev->dev.parent), 0); in at91_usart_spi_probe()
509 clk = devm_clk_get(pdev->dev.parent, "usart"); in at91_usart_spi_probe()
510 if (IS_ERR(clk)) in at91_usart_spi_probe()
511 return PTR_ERR(clk); in at91_usart_spi_probe()
513 ret = -ENOMEM; in at91_usart_spi_probe()
514 controller = spi_alloc_host(&pdev->dev, sizeof(*aus)); in at91_usart_spi_probe()
522 controller->mode_bits = SPI_CPOL | SPI_CPHA | SPI_LOOP | SPI_CS_HIGH; in at91_usart_spi_probe()
523 controller->dev.of_node = pdev->dev.parent->of_node; in at91_usart_spi_probe()
524 controller->bits_per_word_mask = SPI_BPW_MASK(8); in at91_usart_spi_probe()
525 controller->setup = at91_usart_spi_setup; in at91_usart_spi_probe()
526 controller->flags = SPI_CONTROLLER_MUST_RX | SPI_CONTROLLER_MUST_TX; in at91_usart_spi_probe()
527 controller->transfer_one = at91_usart_spi_transfer_one; in at91_usart_spi_probe()
528 controller->prepare_message = at91_usart_spi_prepare_message; in at91_usart_spi_probe()
529 controller->unprepare_message = at91_usart_spi_unprepare_message; in at91_usart_spi_probe()
530 controller->can_dma = at91_usart_spi_can_dma; in at91_usart_spi_probe()
531 controller->cleanup = at91_usart_spi_cleanup; in at91_usart_spi_probe()
532 controller->max_speed_hz = DIV_ROUND_UP(clk_get_rate(clk), in at91_usart_spi_probe()
534 controller->min_speed_hz = DIV_ROUND_UP(clk_get_rate(clk), in at91_usart_spi_probe()
540 aus->dev = &pdev->dev; in at91_usart_spi_probe()
541 aus->regs = devm_ioremap_resource(&pdev->dev, regs); in at91_usart_spi_probe()
542 if (IS_ERR(aus->regs)) { in at91_usart_spi_probe()
543 ret = PTR_ERR(aus->regs); in at91_usart_spi_probe()
547 aus->irq = irq; in at91_usart_spi_probe()
548 aus->clk = clk; in at91_usart_spi_probe()
550 ret = devm_request_irq(&pdev->dev, irq, at91_usart_spi_interrupt, 0, in at91_usart_spi_probe()
551 dev_name(&pdev->dev), controller); in at91_usart_spi_probe()
555 ret = clk_prepare_enable(clk); in at91_usart_spi_probe()
559 aus->spi_clk = clk_get_rate(clk); in at91_usart_spi_probe()
562 aus->phybase = regs->start; in at91_usart_spi_probe()
564 aus->mpdev = to_platform_device(pdev->dev.parent); in at91_usart_spi_probe()
570 spin_lock_init(&aus->lock); in at91_usart_spi_probe()
571 init_completion(&aus->xfer_completion); in at91_usart_spi_probe()
573 ret = devm_spi_register_controller(&pdev->dev, controller); in at91_usart_spi_probe()
577 dev_info(&pdev->dev, in at91_usart_spi_probe()
578 "AT91 USART SPI Controller version 0x%x at %pa (irq %d)\n", in at91_usart_spi_probe()
580 &regs->start, irq); in at91_usart_spi_probe()
587 clk_disable_unprepare(clk); in at91_usart_spi_probe()
598 clk_disable_unprepare(aus->clk); in at91_usart_spi_runtime_suspend()
611 return clk_prepare_enable(aus->clk); in at91_usart_spi_runtime_resume()
652 clk_disable_unprepare(aus->clk); in at91_usart_spi_remove()
672 MODULE_DESCRIPTION("Microchip AT91 USART SPI Controller driver");