Lines Matching +full:usart +full:- +full:mode
1 // SPDX-License-Identifier: GPL-2.0
3 // Driver for AT91 USART Controllers as SPI
12 #include <linux/dma-direction.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)
109 aus->current_rx_remaining_bytes = 0; in dma_callback()
110 complete(&aus->xfer_completion); in dma_callback()
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(ctlr->dma_tx)) { in at91_usart_spi_configure_dma()
136 err = PTR_ERR(ctlr->dma_tx); in at91_usart_spi_configure_dma()
140 ctlr->dma_rx = dma_request_chan(dev, "rx"); in at91_usart_spi_configure_dma()
141 if (IS_ERR(ctlr->dma_rx)) { in at91_usart_spi_configure_dma()
142 err = PTR_ERR(ctlr->dma_rx); in at91_usart_spi_configure_dma()
155 if (dmaengine_slave_config(ctlr->dma_rx, &slave_config)) { in at91_usart_spi_configure_dma()
156 dev_err(&ctlr->dev, in at91_usart_spi_configure_dma()
158 err = -EINVAL; in at91_usart_spi_configure_dma()
163 if (dmaengine_slave_config(ctlr->dma_tx, &slave_config)) { in at91_usart_spi_configure_dma()
164 dev_err(&ctlr->dev, in at91_usart_spi_configure_dma()
166 err = -EINVAL; in at91_usart_spi_configure_dma()
170 aus->use_dma = true; in at91_usart_spi_configure_dma()
174 if (!IS_ERR_OR_NULL(ctlr->dma_tx)) in at91_usart_spi_configure_dma()
175 dma_release_channel(ctlr->dma_tx); in at91_usart_spi_configure_dma()
176 if (!IS_ERR_OR_NULL(ctlr->dma_rx)) in at91_usart_spi_configure_dma()
177 dma_release_channel(ctlr->dma_rx); in at91_usart_spi_configure_dma()
178 ctlr->dma_tx = NULL; in at91_usart_spi_configure_dma()
179 ctlr->dma_rx = NULL; in at91_usart_spi_configure_dma()
187 if (ctlr->dma_rx) in at91_usart_spi_release_dma()
188 dma_release_channel(ctlr->dma_rx); in at91_usart_spi_release_dma()
189 if (ctlr->dma_tx) in at91_usart_spi_release_dma()
190 dma_release_channel(ctlr->dma_tx); in at91_usart_spi_release_dma()
195 if (ctlr->dma_rx) in at91_usart_spi_stop_dma()
196 dmaengine_terminate_all(ctlr->dma_rx); in at91_usart_spi_stop_dma()
197 if (ctlr->dma_tx) in at91_usart_spi_stop_dma()
198 dmaengine_terminate_all(ctlr->dma_tx); in at91_usart_spi_stop_dma()
205 struct dma_chan *rxchan = ctlr->dma_rx; in at91_usart_spi_dma_transfer()
206 struct dma_chan *txchan = ctlr->dma_tx; in at91_usart_spi_dma_transfer()
215 xfer->rx_sg.sgl, in at91_usart_spi_dma_transfer()
216 xfer->rx_sg.nents, in at91_usart_spi_dma_transfer()
224 xfer->tx_sg.sgl, in at91_usart_spi_dma_transfer()
225 xfer->tx_sg.nents, in at91_usart_spi_dma_transfer()
232 rxdesc->callback = dma_callback; in at91_usart_spi_dma_transfer()
233 rxdesc->callback_param = ctlr; in at91_usart_spi_dma_transfer()
235 cookie = rxdesc->tx_submit(rxdesc); in at91_usart_spi_dma_transfer()
239 cookie = txdesc->tx_submit(txdesc); in at91_usart_spi_dma_transfer()
243 rxchan->device->device_issue_pending(rxchan); in at91_usart_spi_dma_transfer()
244 txchan->device->device_issue_pending(txchan); in at91_usart_spi_dma_transfer()
253 return -ENOMEM; in at91_usart_spi_dma_transfer()
258 return wait_for_completion_timeout(&aus->xfer_completion, in at91_usart_spi_dma_timeout()
264 return aus->status & US_IR_TXRDY; in at91_usart_spi_tx_ready()
269 return aus->status & US_IR_RXRDY; in at91_usart_spi_rx_ready()
274 return aus->status & US_IR_OVRE; in at91_usart_spi_check_overrun()
279 aus->status = at91_usart_spi_readl(aus, CSR); in at91_usart_spi_read_status()
280 return aus->status; in at91_usart_spi_read_status()
285 unsigned int len = aus->current_transfer->len; in at91_usart_spi_tx()
286 unsigned int remaining = aus->current_tx_remaining_bytes; in at91_usart_spi_tx()
287 const u8 *tx_buf = aus->current_transfer->tx_buf; in at91_usart_spi_tx()
293 at91_usart_spi_writeb(aus, THR, tx_buf[len - remaining]); in at91_usart_spi_tx()
294 aus->current_tx_remaining_bytes--; in at91_usart_spi_tx()
300 int len = aus->current_transfer->len; in at91_usart_spi_rx()
301 int remaining = aus->current_rx_remaining_bytes; in at91_usart_spi_rx()
302 u8 *rx_buf = aus->current_transfer->rx_buf; in at91_usart_spi_rx()
307 rx_buf[len - remaining] = at91_usart_spi_readb(aus, RHR); in at91_usart_spi_rx()
308 aus->current_rx_remaining_bytes--; in at91_usart_spi_rx()
316 DIV_ROUND_UP(aus->spi_clk, xfer->speed_hz)); in at91_usart_spi_set_xfer_speed()
324 spin_lock(&aus->lock); in at91_usart_spi_interrupt()
328 aus->xfer_failed = true; in at91_usart_spi_interrupt()
330 spin_unlock(&aus->lock); in at91_usart_spi_interrupt()
336 spin_unlock(&aus->lock); in at91_usart_spi_interrupt()
340 spin_unlock(&aus->lock); in at91_usart_spi_interrupt()
347 struct at91_usart_spi *aus = spi_controller_get_devdata(spi->controller); in at91_usart_spi_setup()
348 u32 *ausd = spi->controller_state; in at91_usart_spi_setup()
351 if (spi->mode & SPI_CPOL) in at91_usart_spi_setup()
356 if (spi->mode & SPI_CPHA) in at91_usart_spi_setup()
361 if (spi->mode & SPI_LOOP) in at91_usart_spi_setup()
369 return -ENOMEM; in at91_usart_spi_setup()
371 spi->controller_state = ausd; in at91_usart_spi_setup()
376 dev_dbg(&spi->dev, in at91_usart_spi_setup()
377 "setup: bpw %u mode 0x%x -> mr %d %08x\n", in at91_usart_spi_setup()
378 spi->bits_per_word, spi->mode, spi_get_chipselect(spi, 0), mr); in at91_usart_spi_setup()
392 aus->xfer_failed = false; in at91_usart_spi_transfer_one()
393 aus->current_transfer = xfer; in at91_usart_spi_transfer_one()
394 aus->current_tx_remaining_bytes = xfer->len; in at91_usart_spi_transfer_one()
395 aus->current_rx_remaining_bytes = xfer->len; in at91_usart_spi_transfer_one()
397 while ((aus->current_tx_remaining_bytes || in at91_usart_spi_transfer_one()
398 aus->current_rx_remaining_bytes) && !aus->xfer_failed) { in at91_usart_spi_transfer_one()
399 reinit_completion(&aus->xfer_completion); in at91_usart_spi_transfer_one()
409 dev_err(&spi->dev, "DMA transfer timeout\n"); in at91_usart_spi_transfer_one()
410 return -EIO; in at91_usart_spi_transfer_one()
412 aus->current_tx_remaining_bytes = 0; in at91_usart_spi_transfer_one()
421 if (aus->xfer_failed) { in at91_usart_spi_transfer_one()
422 dev_err(aus->dev, "Overrun!\n"); in at91_usart_spi_transfer_one()
423 return -EIO; in at91_usart_spi_transfer_one()
433 struct spi_device *spi = message->spi; in at91_usart_spi_prepare_message()
434 u32 *ausd = spi->controller_state; in at91_usart_spi_prepare_message()
456 struct at91_usart_spi_device *ausd = spi->controller_state; in at91_usart_spi_cleanup()
458 spi->controller_state = NULL; in at91_usart_spi_cleanup()
472 cs_gpios = devm_gpiod_get_array_optional(&pdev->dev, "cs", GPIOD_OUT_LOW); in at91_usart_gpio_setup()
486 regs = platform_get_resource(to_platform_device(pdev->dev.parent), in at91_usart_spi_probe()
489 return -EINVAL; in at91_usart_spi_probe()
491 irq = platform_get_irq(to_platform_device(pdev->dev.parent), 0); in at91_usart_spi_probe()
495 clk = devm_clk_get(pdev->dev.parent, "usart"); in at91_usart_spi_probe()
499 ret = -ENOMEM; in at91_usart_spi_probe()
500 controller = spi_alloc_host(&pdev->dev, sizeof(*aus)); in at91_usart_spi_probe()
508 controller->mode_bits = SPI_CPOL | SPI_CPHA | SPI_LOOP | SPI_CS_HIGH; in at91_usart_spi_probe()
509 controller->dev.of_node = pdev->dev.parent->of_node; in at91_usart_spi_probe()
510 controller->bits_per_word_mask = SPI_BPW_MASK(8); in at91_usart_spi_probe()
511 controller->setup = at91_usart_spi_setup; in at91_usart_spi_probe()
512 controller->flags = SPI_CONTROLLER_MUST_RX | SPI_CONTROLLER_MUST_TX; in at91_usart_spi_probe()
513 controller->transfer_one = at91_usart_spi_transfer_one; in at91_usart_spi_probe()
514 controller->prepare_message = at91_usart_spi_prepare_message; in at91_usart_spi_probe()
515 controller->unprepare_message = at91_usart_spi_unprepare_message; in at91_usart_spi_probe()
516 controller->can_dma = at91_usart_spi_can_dma; in at91_usart_spi_probe()
517 controller->cleanup = at91_usart_spi_cleanup; in at91_usart_spi_probe()
518 controller->max_speed_hz = DIV_ROUND_UP(clk_get_rate(clk), in at91_usart_spi_probe()
520 controller->min_speed_hz = DIV_ROUND_UP(clk_get_rate(clk), in at91_usart_spi_probe()
526 aus->dev = &pdev->dev; in at91_usart_spi_probe()
527 aus->regs = devm_ioremap_resource(&pdev->dev, regs); in at91_usart_spi_probe()
528 if (IS_ERR(aus->regs)) { in at91_usart_spi_probe()
529 ret = PTR_ERR(aus->regs); in at91_usart_spi_probe()
533 aus->irq = irq; in at91_usart_spi_probe()
534 aus->clk = clk; in at91_usart_spi_probe()
536 ret = devm_request_irq(&pdev->dev, irq, at91_usart_spi_interrupt, 0, in at91_usart_spi_probe()
537 dev_name(&pdev->dev), controller); in at91_usart_spi_probe()
545 aus->spi_clk = clk_get_rate(clk); in at91_usart_spi_probe()
548 aus->phybase = regs->start; in at91_usart_spi_probe()
550 aus->mpdev = to_platform_device(pdev->dev.parent); in at91_usart_spi_probe()
556 spin_lock_init(&aus->lock); in at91_usart_spi_probe()
557 init_completion(&aus->xfer_completion); in at91_usart_spi_probe()
559 ret = devm_spi_register_controller(&pdev->dev, controller); in at91_usart_spi_probe()
563 dev_info(&pdev->dev, in at91_usart_spi_probe()
564 "AT91 USART SPI Controller version 0x%x at %pa (irq %d)\n", in at91_usart_spi_probe()
566 ®s->start, irq); in at91_usart_spi_probe()
584 clk_disable_unprepare(aus->clk); in at91_usart_spi_runtime_suspend()
597 return clk_prepare_enable(aus->clk); in at91_usart_spi_runtime_resume()
638 clk_disable_unprepare(aus->clk); in at91_usart_spi_remove()
658 MODULE_DESCRIPTION("Microchip AT91 USART SPI Controller driver");