Lines Matching +full:clk +full:- +full:csr
1 // SPDX-License-Identifier: GPL-2.0-only
9 #include <linux/clk.h>
13 #include <linux/dma-mapping.h>
217 (((value) & ((1 << SPI_##name##_SIZE) - 1)) << SPI_##name##_OFFSET)
219 (((value) >> SPI_##name##_OFFSET) & ((1 << SPI_##name##_SIZE) - 1))
221 (((old) & ~(((1 << SPI_##name##_SIZE) - 1) << SPI_##name##_OFFSET)) \
226 readl_relaxed((port)->regs + SPI_##reg)
228 writel_relaxed((value), (port)->regs + SPI_##reg)
230 writew_relaxed((value), (port)->regs + SPI_##reg)
261 struct clk *clk; member
288 /* Controller-specific per-slave state */
290 u32 csr; member
302 * Atmel-11121F-ATARM-SAMA5D3-Series-Datasheet_02-Feb-16, page 1283)
314 * - CR.LASTXFER
315 * - SPI_MR.DIV32 may become FDIV or must-be-zero (here: always zero)
316 * - SPI_SR.TXEMPTY, SPI_SR.NSSR (and corresponding irqs)
317 * - SPI_CSRx.CSAAT
318 * - SPI_CSRx.SBCR allows faster clocking
322 return as->caps.is_spi2; in atmel_spi_is_v2()
334 u32 csr; in atmel_spi_send_dummy() local
341 csr = spi_readl(as, CSR0 + 4 * chip_select); in atmel_spi_send_dummy()
342 csr = SPI_BFINS(SCBR, DUMMY_MSG_FREQUENCY, csr); in atmel_spi_send_dummy()
343 spi_writel(as, CSR0 + 4 * chip_select, csr); in atmel_spi_send_dummy()
357 readl_poll_timeout_atomic(as->regs + SPI_SR, status, in atmel_spi_send_dummy()
370 * it lets us support active-high chipselects despite the controller's
371 * belief that only active-low devices/systems exists.
387 struct atmel_spi_device *asd = spi->controller_state; in cs_activate()
393 chip_select = as->native_cs_for_gpio; in cs_activate()
398 spi_writel(as, CSR0 + 4 * chip_select, asd->csr); in cs_activate()
402 spi_writel(as, CSR0, asd->csr); in cs_activate()
403 if (as->caps.has_wdrbt) { in cs_activate()
424 new_polarity = (asd->csr & SPI_BIT(CPOL)) != 0; in cs_activate()
425 if (new_polarity != as->last_polarity) { in cs_activate()
432 as->last_polarity = new_polarity; in cs_activate()
437 u32 cpol = (spi->mode & SPI_CPOL) ? SPI_BIT(CPOL) : 0; in cs_activate()
439 u32 csr; in cs_activate() local
442 for (i = 0; i < spi->controller->num_chipselect; i++) { in cs_activate()
443 csr = spi_readl(as, CSR0 + 4 * i); in cs_activate()
444 if ((csr ^ cpol) & SPI_BIT(CPOL)) in cs_activate()
446 csr ^ SPI_BIT(CPOL)); in cs_activate()
454 dev_dbg(&spi->dev, "activate NPCS, mr %08x\n", mr); in cs_activate()
463 chip_select = as->native_cs_for_gpio; in cs_deactivate()
476 dev_dbg(&spi->dev, "DEactivate NPCS, mr %08x\n", mr); in cs_deactivate()
482 static void atmel_spi_lock(struct atmel_spi *as) __acquires(&as->lock) in atmel_spi_lock()
484 spin_lock_irqsave(&as->lock, as->flags); in atmel_spi_lock()
487 static void atmel_spi_unlock(struct atmel_spi *as) __releases(&as->lock) in atmel_spi_unlock()
489 spin_unlock_irqrestore(&as->lock, as->flags); in atmel_spi_unlock()
494 return is_vmalloc_addr(xfer->tx_buf) || is_vmalloc_addr(xfer->rx_buf); in atmel_spi_is_vmalloc_xfer()
500 return as->use_dma && xfer->len >= DMA_MIN_BYTES; in atmel_spi_use_dma()
519 struct spi_controller *host = platform_get_drvdata(as->pdev); in atmel_spi_dma_slave_config()
531 slave_config.dst_addr = (dma_addr_t)as->phybase + SPI_TDR; in atmel_spi_dma_slave_config()
532 slave_config.src_addr = (dma_addr_t)as->phybase + SPI_RDR; in atmel_spi_dma_slave_config()
551 if (dmaengine_slave_config(host->dma_tx, &slave_config)) { in atmel_spi_dma_slave_config()
552 dev_err(&as->pdev->dev, in atmel_spi_dma_slave_config()
554 err = -EINVAL; in atmel_spi_dma_slave_config()
565 if (dmaengine_slave_config(host->dma_rx, &slave_config)) { in atmel_spi_dma_slave_config()
566 dev_err(&as->pdev->dev, in atmel_spi_dma_slave_config()
568 err = -EINVAL; in atmel_spi_dma_slave_config()
577 struct device *dev = &as->pdev->dev; in atmel_spi_configure_dma()
580 host->dma_tx = dma_request_chan(dev, "tx"); in atmel_spi_configure_dma()
581 if (IS_ERR(host->dma_tx)) { in atmel_spi_configure_dma()
582 err = PTR_ERR(host->dma_tx); in atmel_spi_configure_dma()
587 host->dma_rx = dma_request_chan(dev, "rx"); in atmel_spi_configure_dma()
588 if (IS_ERR(host->dma_rx)) { in atmel_spi_configure_dma()
589 err = PTR_ERR(host->dma_rx); in atmel_spi_configure_dma()
602 dev_info(&as->pdev->dev, in atmel_spi_configure_dma()
604 dma_chan_name(host->dma_tx), in atmel_spi_configure_dma()
605 dma_chan_name(host->dma_rx)); in atmel_spi_configure_dma()
609 if (!IS_ERR(host->dma_rx)) in atmel_spi_configure_dma()
610 dma_release_channel(host->dma_rx); in atmel_spi_configure_dma()
611 if (!IS_ERR(host->dma_tx)) in atmel_spi_configure_dma()
612 dma_release_channel(host->dma_tx); in atmel_spi_configure_dma()
614 host->dma_tx = host->dma_rx = NULL; in atmel_spi_configure_dma()
620 if (host->dma_rx) in atmel_spi_stop_dma()
621 dmaengine_terminate_all(host->dma_rx); in atmel_spi_stop_dma()
622 if (host->dma_tx) in atmel_spi_stop_dma()
623 dmaengine_terminate_all(host->dma_tx); in atmel_spi_stop_dma()
628 if (host->dma_rx) { in atmel_spi_release_dma()
629 dma_release_channel(host->dma_rx); in atmel_spi_release_dma()
630 host->dma_rx = NULL; in atmel_spi_release_dma()
632 if (host->dma_tx) { in atmel_spi_release_dma()
633 dma_release_channel(host->dma_tx); in atmel_spi_release_dma()
634 host->dma_tx = NULL; in atmel_spi_release_dma()
644 if (is_vmalloc_addr(as->current_transfer->rx_buf) && in dma_callback()
646 memcpy(as->current_transfer->rx_buf, as->addr_rx_bbuf, in dma_callback()
647 as->current_transfer->len); in dma_callback()
649 complete(&as->xfer_completion); in dma_callback()
659 unsigned long xfer_pos = xfer->len - as->current_remaining_bytes; in atmel_spi_next_xfer_single()
661 dev_vdbg(host->dev.parent, "atmel_spi_next_xfer_pio\n"); in atmel_spi_next_xfer_single()
670 if (xfer->bits_per_word > 8) in atmel_spi_next_xfer_single()
671 spi_writel(as, TDR, *(u16 *)(xfer->tx_buf + xfer_pos)); in atmel_spi_next_xfer_single()
673 spi_writel(as, TDR, *(u8 *)(xfer->tx_buf + xfer_pos)); in atmel_spi_next_xfer_single()
675 dev_dbg(host->dev.parent, in atmel_spi_next_xfer_single()
677 xfer, xfer->len, xfer->tx_buf, xfer->rx_buf, in atmel_spi_next_xfer_single()
678 xfer->bits_per_word); in atmel_spi_next_xfer_single()
692 u32 offset = xfer->len - as->current_remaining_bytes; in atmel_spi_next_xfer_fifo()
693 const u16 *words = (const u16 *)((u8 *)xfer->tx_buf + offset); in atmel_spi_next_xfer_fifo()
694 const u8 *bytes = (const u8 *)((u8 *)xfer->tx_buf + offset); in atmel_spi_next_xfer_fifo()
698 dev_vdbg(host->dev.parent, "atmel_spi_next_xfer_fifo\n"); in atmel_spi_next_xfer_fifo()
701 current_remaining_data = ((xfer->bits_per_word > 8) ? in atmel_spi_next_xfer_fifo()
702 ((u32)as->current_remaining_bytes >> 1) : in atmel_spi_next_xfer_fifo()
703 (u32)as->current_remaining_bytes); in atmel_spi_next_xfer_fifo()
704 num_data = min(current_remaining_data, as->fifo_size); in atmel_spi_next_xfer_fifo()
720 if (xfer->bits_per_word > 8) { in atmel_spi_next_xfer_fifo()
729 num_data -= 2; in atmel_spi_next_xfer_fifo()
733 if (xfer->bits_per_word > 8) in atmel_spi_next_xfer_fifo()
739 num_data--; in atmel_spi_next_xfer_fifo()
742 dev_dbg(host->dev.parent, in atmel_spi_next_xfer_fifo()
744 xfer, xfer->len, xfer->tx_buf, xfer->rx_buf, in atmel_spi_next_xfer_fifo()
745 xfer->bits_per_word); in atmel_spi_next_xfer_fifo()
762 if (as->fifo_size) in atmel_spi_next_xfer_pio()
776 struct dma_chan *rxchan = host->dma_rx; in atmel_spi_next_xfer_dma_submit()
777 struct dma_chan *txchan = host->dma_tx; in atmel_spi_next_xfer_dma_submit()
782 dev_vdbg(host->dev.parent, "atmel_spi_next_xfer_dma_submit\n"); in atmel_spi_next_xfer_dma_submit()
786 return -ENODEV; in atmel_spi_next_xfer_dma_submit()
789 *plen = xfer->len; in atmel_spi_next_xfer_dma_submit()
791 if (atmel_spi_dma_slave_config(as, xfer->bits_per_word)) in atmel_spi_next_xfer_dma_submit()
798 as->dma_addr_rx_bbuf, in atmel_spi_next_xfer_dma_submit()
799 xfer->len, in atmel_spi_next_xfer_dma_submit()
805 xfer->rx_sg.sgl, in atmel_spi_next_xfer_dma_submit()
806 xfer->rx_sg.nents, in atmel_spi_next_xfer_dma_submit()
816 memcpy(as->addr_tx_bbuf, xfer->tx_buf, xfer->len); in atmel_spi_next_xfer_dma_submit()
818 as->dma_addr_tx_bbuf, in atmel_spi_next_xfer_dma_submit()
819 xfer->len, DMA_MEM_TO_DEV, in atmel_spi_next_xfer_dma_submit()
824 xfer->tx_sg.sgl, in atmel_spi_next_xfer_dma_submit()
825 xfer->tx_sg.nents, in atmel_spi_next_xfer_dma_submit()
833 dev_dbg(host->dev.parent, in atmel_spi_next_xfer_dma_submit()
835 xfer, xfer->len, xfer->tx_buf, (unsigned long long)xfer->tx_dma, in atmel_spi_next_xfer_dma_submit()
836 xfer->rx_buf, (unsigned long long)xfer->rx_dma); in atmel_spi_next_xfer_dma_submit()
842 rxdesc->callback = dma_callback; in atmel_spi_next_xfer_dma_submit()
843 rxdesc->callback_param = host; in atmel_spi_next_xfer_dma_submit()
846 cookie = rxdesc->tx_submit(rxdesc); in atmel_spi_next_xfer_dma_submit()
849 cookie = txdesc->tx_submit(txdesc); in atmel_spi_next_xfer_dma_submit()
852 rxchan->device->device_issue_pending(rxchan); in atmel_spi_next_xfer_dma_submit()
853 txchan->device->device_issue_pending(txchan); in atmel_spi_next_xfer_dma_submit()
861 return -ENOMEM; in atmel_spi_next_xfer_dma_submit()
870 *rx_dma = xfer->rx_dma + xfer->len - *plen; in atmel_spi_next_xfer_data()
871 *tx_dma = xfer->tx_dma + xfer->len - *plen; in atmel_spi_next_xfer_data()
872 if (*plen > host->max_dma_len) in atmel_spi_next_xfer_data()
873 *plen = host->max_dma_len; in atmel_spi_next_xfer_data()
880 u32 scbr, csr; in atmel_spi_set_xfer_speed() local
885 chip_select = as->native_cs_for_gpio; in atmel_spi_set_xfer_speed()
890 bus_hz = as->spi_clk; in atmel_spi_set_xfer_speed()
898 scbr = DIV_ROUND_UP(bus_hz, xfer->speed_hz); in atmel_spi_set_xfer_speed()
905 dev_err(&spi->dev, in atmel_spi_set_xfer_speed()
907 xfer->speed_hz, scbr, bus_hz/255); in atmel_spi_set_xfer_speed()
908 return -EINVAL; in atmel_spi_set_xfer_speed()
911 dev_err(&spi->dev, in atmel_spi_set_xfer_speed()
913 xfer->speed_hz, scbr, bus_hz); in atmel_spi_set_xfer_speed()
914 return -EINVAL; in atmel_spi_set_xfer_speed()
916 csr = spi_readl(as, CSR0 + 4 * chip_select); in atmel_spi_set_xfer_speed()
917 csr = SPI_BFINS(SCBR, scbr, csr); in atmel_spi_set_xfer_speed()
918 spi_writel(as, CSR0 + 4 * chip_select, csr); in atmel_spi_set_xfer_speed()
919 xfer->effective_speed_hz = bus_hz / scbr; in atmel_spi_set_xfer_speed()
937 len = as->current_remaining_bytes; in atmel_spi_pdc_next_xfer()
939 as->current_remaining_bytes -= len; in atmel_spi_pdc_next_xfer()
944 if (xfer->bits_per_word > 8) in atmel_spi_pdc_next_xfer()
949 dev_dbg(&host->dev, in atmel_spi_pdc_next_xfer()
951 xfer, xfer->len, xfer->tx_buf, in atmel_spi_pdc_next_xfer()
952 (unsigned long long)xfer->tx_dma, xfer->rx_buf, in atmel_spi_pdc_next_xfer()
953 (unsigned long long)xfer->rx_dma); in atmel_spi_pdc_next_xfer()
955 if (as->current_remaining_bytes) { in atmel_spi_pdc_next_xfer()
956 len = as->current_remaining_bytes; in atmel_spi_pdc_next_xfer()
958 as->current_remaining_bytes -= len; in atmel_spi_pdc_next_xfer()
963 if (xfer->bits_per_word > 8) in atmel_spi_pdc_next_xfer()
968 dev_dbg(&host->dev, in atmel_spi_pdc_next_xfer()
970 xfer, xfer->len, xfer->tx_buf, in atmel_spi_pdc_next_xfer()
971 (unsigned long long)xfer->tx_dma, xfer->rx_buf, in atmel_spi_pdc_next_xfer()
972 (unsigned long long)xfer->rx_dma); in atmel_spi_pdc_next_xfer()
991 * - The buffer is either valid for CPU access, else NULL
992 * - If the buffer is valid, so is its DMA address
994 * This driver manages the dma address unless message->is_dma_mapped.
999 struct device *dev = &as->pdev->dev; in atmel_spi_dma_map_xfer()
1001 xfer->tx_dma = xfer->rx_dma = INVALID_DMA_ADDRESS; in atmel_spi_dma_map_xfer()
1002 if (xfer->tx_buf) { in atmel_spi_dma_map_xfer()
1005 void *nonconst_tx = (void *)xfer->tx_buf; in atmel_spi_dma_map_xfer()
1007 xfer->tx_dma = dma_map_single(dev, in atmel_spi_dma_map_xfer()
1008 nonconst_tx, xfer->len, in atmel_spi_dma_map_xfer()
1010 if (dma_mapping_error(dev, xfer->tx_dma)) in atmel_spi_dma_map_xfer()
1011 return -ENOMEM; in atmel_spi_dma_map_xfer()
1013 if (xfer->rx_buf) { in atmel_spi_dma_map_xfer()
1014 xfer->rx_dma = dma_map_single(dev, in atmel_spi_dma_map_xfer()
1015 xfer->rx_buf, xfer->len, in atmel_spi_dma_map_xfer()
1017 if (dma_mapping_error(dev, xfer->rx_dma)) { in atmel_spi_dma_map_xfer()
1018 if (xfer->tx_buf) in atmel_spi_dma_map_xfer()
1020 xfer->tx_dma, xfer->len, in atmel_spi_dma_map_xfer()
1022 return -ENOMEM; in atmel_spi_dma_map_xfer()
1031 if (xfer->tx_dma != INVALID_DMA_ADDRESS) in atmel_spi_dma_unmap_xfer()
1032 dma_unmap_single(host->dev.parent, xfer->tx_dma, in atmel_spi_dma_unmap_xfer()
1033 xfer->len, DMA_TO_DEVICE); in atmel_spi_dma_unmap_xfer()
1034 if (xfer->rx_dma != INVALID_DMA_ADDRESS) in atmel_spi_dma_unmap_xfer()
1035 dma_unmap_single(host->dev.parent, xfer->rx_dma, in atmel_spi_dma_unmap_xfer()
1036 xfer->len, DMA_FROM_DEVICE); in atmel_spi_dma_unmap_xfer()
1049 unsigned long xfer_pos = xfer->len - as->current_remaining_bytes; in atmel_spi_pump_single_data()
1051 if (xfer->bits_per_word > 8) { in atmel_spi_pump_single_data()
1052 rxp16 = (u16 *)(((u8 *)xfer->rx_buf) + xfer_pos); in atmel_spi_pump_single_data()
1055 rxp = ((u8 *)xfer->rx_buf) + xfer_pos; in atmel_spi_pump_single_data()
1058 if (xfer->bits_per_word > 8) { in atmel_spi_pump_single_data()
1059 if (as->current_remaining_bytes > 2) in atmel_spi_pump_single_data()
1060 as->current_remaining_bytes -= 2; in atmel_spi_pump_single_data()
1062 as->current_remaining_bytes = 0; in atmel_spi_pump_single_data()
1064 as->current_remaining_bytes--; in atmel_spi_pump_single_data()
1073 u32 offset = xfer->len - as->current_remaining_bytes; in atmel_spi_pump_fifo_data()
1074 u16 *words = (u16 *)((u8 *)xfer->rx_buf + offset); in atmel_spi_pump_fifo_data()
1075 u8 *bytes = (u8 *)((u8 *)xfer->rx_buf + offset); in atmel_spi_pump_fifo_data()
1079 num_bytes = ((xfer->bits_per_word > 8) ? in atmel_spi_pump_fifo_data()
1083 if (as->current_remaining_bytes > num_bytes) in atmel_spi_pump_fifo_data()
1084 as->current_remaining_bytes -= num_bytes; in atmel_spi_pump_fifo_data()
1086 as->current_remaining_bytes = 0; in atmel_spi_pump_fifo_data()
1089 if (xfer->bits_per_word > 8) in atmel_spi_pump_fifo_data()
1090 as->current_remaining_bytes &= ~0x1; in atmel_spi_pump_fifo_data()
1095 if (xfer->bits_per_word > 8) in atmel_spi_pump_fifo_data()
1099 num_data--; in atmel_spi_pump_fifo_data()
1111 if (as->fifo_size) in atmel_spi_pump_pio_data()
1136 dev_warn(host->dev.parent, "overrun\n"); in atmel_spi_pio_interrupt()
1141 * bounce buffer and msg->actual_len will not be in atmel_spi_pio_interrupt()
1147 as->done_status = -EIO; in atmel_spi_pio_interrupt()
1153 complete(&as->xfer_completion); in atmel_spi_pio_interrupt()
1158 if (as->current_remaining_bytes) { in atmel_spi_pio_interrupt()
1160 xfer = as->current_transfer; in atmel_spi_pio_interrupt()
1162 if (!as->current_remaining_bytes) in atmel_spi_pio_interrupt()
1165 complete(&as->xfer_completion); in atmel_spi_pio_interrupt()
1200 as->done_status = -EIO; in atmel_spi_pdc_interrupt()
1202 complete(&as->xfer_completion); in atmel_spi_pdc_interrupt()
1209 complete(&as->xfer_completion); in atmel_spi_pdc_interrupt()
1217 struct spi_delay *delay = &spi->word_delay; in atmel_word_delay_csr()
1218 u32 value = delay->value; in atmel_word_delay_csr()
1220 switch (delay->unit) { in atmel_word_delay_csr()
1227 return -EINVAL; in atmel_word_delay_csr()
1230 return (as->spi_clk / 1000000 * value) >> 5; in atmel_word_delay_csr()
1236 struct spi_controller *host = platform_get_drvdata(as->pdev); in initialize_native_cs_for_gpio()
1238 if (!as->native_cs_free) in initialize_native_cs_for_gpio()
1241 if (!host->cs_gpiods) in initialize_native_cs_for_gpio()
1254 if (host->cs_gpiods[i]) in initialize_native_cs_for_gpio()
1255 as->native_cs_free |= BIT(i); in initialize_native_cs_for_gpio()
1257 if (as->native_cs_free) in initialize_native_cs_for_gpio()
1258 as->native_cs_for_gpio = ffs(as->native_cs_free); in initialize_native_cs_for_gpio()
1265 u32 csr; in atmel_spi_setup() local
1266 unsigned int bits = spi->bits_per_word; in atmel_spi_setup()
1270 as = spi_controller_get_devdata(spi->controller); in atmel_spi_setup()
1273 if (!spi_get_csgpiod(spi, 0) && (spi->mode & SPI_CS_HIGH)) { in atmel_spi_setup()
1274 dev_warn(&spi->dev, "setup: non GPIO CS can't be active-high\n"); in atmel_spi_setup()
1275 return -EINVAL; in atmel_spi_setup()
1285 if (spi_get_csgpiod(spi, 0) && as->native_cs_free) { in atmel_spi_setup()
1286 dev_err(&spi->dev, in atmel_spi_setup()
1288 return -EBUSY; in atmel_spi_setup()
1292 chip_select = as->native_cs_for_gpio; in atmel_spi_setup()
1296 csr = SPI_BF(BITS, bits - 8); in atmel_spi_setup()
1297 if (spi->mode & SPI_CPOL) in atmel_spi_setup()
1298 csr |= SPI_BIT(CPOL); in atmel_spi_setup()
1299 if (!(spi->mode & SPI_CPHA)) in atmel_spi_setup()
1300 csr |= SPI_BIT(NCPHA); in atmel_spi_setup()
1303 csr |= SPI_BIT(CSAAT); in atmel_spi_setup()
1304 csr |= SPI_BF(DLYBS, 0); in atmel_spi_setup()
1313 csr |= SPI_BF(DLYBCT, word_delay_csr); in atmel_spi_setup()
1315 asd = spi->controller_state; in atmel_spi_setup()
1319 return -ENOMEM; in atmel_spi_setup()
1321 spi->controller_state = asd; in atmel_spi_setup()
1324 asd->csr = csr; in atmel_spi_setup()
1326 dev_dbg(&spi->dev, in atmel_spi_setup()
1327 "setup: bpw %u mode 0x%x -> csr%d %08x\n", in atmel_spi_setup()
1328 bits, spi->mode, spi_get_chipselect(spi, 0), csr); in atmel_spi_setup()
1331 spi_writel(as, CSR0 + 4 * chip_select, csr); in atmel_spi_setup()
1338 struct atmel_spi *as = spi_controller_get_devdata(spi->controller); in atmel_spi_set_cs()
1343 enable = (!!(spi->mode & SPI_CS_HIGH) == enable); in atmel_spi_set_cs()
1368 asd = spi->controller_state; in atmel_spi_one_transfer()
1369 bits = (asd->csr >> 4) & 0xf; in atmel_spi_one_transfer()
1370 if (bits != xfer->bits_per_word - 8) { in atmel_spi_one_transfer()
1371 dev_dbg(&spi->dev, in atmel_spi_one_transfer()
1373 return -ENOPROTOOPT; in atmel_spi_one_transfer()
1380 if ((!host->cur_msg->is_dma_mapped) in atmel_spi_one_transfer()
1381 && as->use_pdc) { in atmel_spi_one_transfer()
1383 return -ENOMEM; in atmel_spi_one_transfer()
1388 as->done_status = 0; in atmel_spi_one_transfer()
1389 as->current_transfer = xfer; in atmel_spi_one_transfer()
1390 as->current_remaining_bytes = xfer->len; in atmel_spi_one_transfer()
1391 while (as->current_remaining_bytes) { in atmel_spi_one_transfer()
1392 reinit_completion(&as->xfer_completion); in atmel_spi_one_transfer()
1394 if (as->use_pdc) { in atmel_spi_one_transfer()
1399 len = as->current_remaining_bytes; in atmel_spi_one_transfer()
1403 dev_err(&spi->dev, in atmel_spi_one_transfer()
1405 as->done_status = ret; in atmel_spi_one_transfer()
1408 as->current_remaining_bytes -= len; in atmel_spi_one_transfer()
1409 if (as->current_remaining_bytes < 0) in atmel_spi_one_transfer()
1410 as->current_remaining_bytes = 0; in atmel_spi_one_transfer()
1419 ret_timeout = wait_for_completion_timeout(&as->xfer_completion, dma_timeout); in atmel_spi_one_transfer()
1421 dev_err(&spi->dev, "spi transfer timeout\n"); in atmel_spi_one_transfer()
1422 as->done_status = -EIO; in atmel_spi_one_transfer()
1425 if (as->done_status) in atmel_spi_one_transfer()
1429 if (as->done_status) { in atmel_spi_one_transfer()
1430 if (as->use_pdc) { in atmel_spi_one_transfer()
1431 dev_warn(host->dev.parent, in atmel_spi_one_transfer()
1443 for (timeout = 1000; timeout; timeout--) in atmel_spi_one_transfer()
1447 dev_warn(host->dev.parent, in atmel_spi_one_transfer()
1460 if (!host->cur_msg->is_dma_mapped in atmel_spi_one_transfer()
1461 && as->use_pdc) in atmel_spi_one_transfer()
1464 if (as->use_pdc) in atmel_spi_one_transfer()
1467 return as->done_status; in atmel_spi_one_transfer()
1472 struct atmel_spi_device *asd = spi->controller_state; in atmel_spi_cleanup()
1477 spi->controller_state = NULL; in atmel_spi_cleanup()
1492 as->caps.is_spi2 = version > 0x121; in atmel_get_caps()
1493 as->caps.has_wdrbt = version >= 0x210; in atmel_get_caps()
1494 as->caps.has_dma_support = version >= 0x212; in atmel_get_caps()
1495 as->caps.has_pdc_support = version < 0x212; in atmel_get_caps()
1504 if (as->fifo_size) in atmel_spi_init()
1507 if (as->caps.has_wdrbt) { in atmel_spi_init()
1514 if (as->use_pdc) in atmel_spi_init()
1523 struct clk *clk; in atmel_spi_probe() local
1529 pinctrl_pm_select_default_state(&pdev->dev); in atmel_spi_probe()
1535 clk = devm_clk_get(&pdev->dev, "spi_clk"); in atmel_spi_probe()
1536 if (IS_ERR(clk)) in atmel_spi_probe()
1537 return PTR_ERR(clk); in atmel_spi_probe()
1539 /* setup spi core then atmel-specific driver state */ in atmel_spi_probe()
1540 host = spi_alloc_host(&pdev->dev, sizeof(*as)); in atmel_spi_probe()
1542 return -ENOMEM; in atmel_spi_probe()
1544 /* the spi->mode bits understood by this driver: */ in atmel_spi_probe()
1545 host->use_gpio_descriptors = true; in atmel_spi_probe()
1546 host->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH; in atmel_spi_probe()
1547 host->bits_per_word_mask = SPI_BPW_RANGE_MASK(8, 16); in atmel_spi_probe()
1548 host->dev.of_node = pdev->dev.of_node; in atmel_spi_probe()
1549 host->bus_num = pdev->id; in atmel_spi_probe()
1550 host->num_chipselect = 4; in atmel_spi_probe()
1551 host->setup = atmel_spi_setup; in atmel_spi_probe()
1552 host->flags = (SPI_CONTROLLER_MUST_RX | SPI_CONTROLLER_MUST_TX | in atmel_spi_probe()
1554 host->transfer_one = atmel_spi_one_transfer; in atmel_spi_probe()
1555 host->set_cs = atmel_spi_set_cs; in atmel_spi_probe()
1556 host->cleanup = atmel_spi_cleanup; in atmel_spi_probe()
1557 host->auto_runtime_pm = true; in atmel_spi_probe()
1558 host->max_dma_len = SPI_MAX_DMA_XFER; in atmel_spi_probe()
1559 host->can_dma = atmel_spi_can_dma; in atmel_spi_probe()
1564 spin_lock_init(&as->lock); in atmel_spi_probe()
1566 as->pdev = pdev; in atmel_spi_probe()
1567 as->regs = devm_platform_get_and_ioremap_resource(pdev, 0, ®s); in atmel_spi_probe()
1568 if (IS_ERR(as->regs)) { in atmel_spi_probe()
1569 ret = PTR_ERR(as->regs); in atmel_spi_probe()
1572 as->phybase = regs->start; in atmel_spi_probe()
1573 as->irq = irq; in atmel_spi_probe()
1574 as->clk = clk; in atmel_spi_probe()
1576 init_completion(&as->xfer_completion); in atmel_spi_probe()
1580 as->use_dma = false; in atmel_spi_probe()
1581 as->use_pdc = false; in atmel_spi_probe()
1582 if (as->caps.has_dma_support) { in atmel_spi_probe()
1585 as->use_dma = true; in atmel_spi_probe()
1586 } else if (ret == -EPROBE_DEFER) { in atmel_spi_probe()
1589 } else if (as->caps.has_pdc_support) { in atmel_spi_probe()
1590 as->use_pdc = true; in atmel_spi_probe()
1594 as->addr_rx_bbuf = dma_alloc_coherent(&pdev->dev, in atmel_spi_probe()
1596 &as->dma_addr_rx_bbuf, in atmel_spi_probe()
1598 if (!as->addr_rx_bbuf) { in atmel_spi_probe()
1599 as->use_dma = false; in atmel_spi_probe()
1601 as->addr_tx_bbuf = dma_alloc_coherent(&pdev->dev, in atmel_spi_probe()
1603 &as->dma_addr_tx_bbuf, in atmel_spi_probe()
1605 if (!as->addr_tx_bbuf) { in atmel_spi_probe()
1606 as->use_dma = false; in atmel_spi_probe()
1607 dma_free_coherent(&pdev->dev, SPI_MAX_DMA_XFER, in atmel_spi_probe()
1608 as->addr_rx_bbuf, in atmel_spi_probe()
1609 as->dma_addr_rx_bbuf); in atmel_spi_probe()
1612 if (!as->use_dma) in atmel_spi_probe()
1613 dev_info(host->dev.parent, in atmel_spi_probe()
1617 if (as->caps.has_dma_support && !as->use_dma) in atmel_spi_probe()
1618 dev_info(&pdev->dev, "Atmel SPI Controller using PIO only\n"); in atmel_spi_probe()
1620 if (as->use_pdc) { in atmel_spi_probe()
1621 ret = devm_request_irq(&pdev->dev, irq, atmel_spi_pdc_interrupt, in atmel_spi_probe()
1622 0, dev_name(&pdev->dev), host); in atmel_spi_probe()
1624 ret = devm_request_irq(&pdev->dev, irq, atmel_spi_pio_interrupt, in atmel_spi_probe()
1625 0, dev_name(&pdev->dev), host); in atmel_spi_probe()
1631 ret = clk_prepare_enable(clk); in atmel_spi_probe()
1635 as->spi_clk = clk_get_rate(clk); in atmel_spi_probe()
1637 as->fifo_size = 0; in atmel_spi_probe()
1638 if (!of_property_read_u32(pdev->dev.of_node, "atmel,fifo-size", in atmel_spi_probe()
1639 &as->fifo_size)) { in atmel_spi_probe()
1640 dev_info(&pdev->dev, "Using FIFO (%u data)\n", as->fifo_size); in atmel_spi_probe()
1645 pm_runtime_set_autosuspend_delay(&pdev->dev, AUTOSUSPEND_TIMEOUT); in atmel_spi_probe()
1646 pm_runtime_use_autosuspend(&pdev->dev); in atmel_spi_probe()
1647 pm_runtime_set_active(&pdev->dev); in atmel_spi_probe()
1648 pm_runtime_enable(&pdev->dev); in atmel_spi_probe()
1650 ret = devm_spi_register_controller(&pdev->dev, host); in atmel_spi_probe()
1655 dev_info(&pdev->dev, "Atmel SPI Controller version 0x%x at 0x%08lx (irq %d)\n", in atmel_spi_probe()
1656 atmel_get_version(as), (unsigned long)regs->start, in atmel_spi_probe()
1662 pm_runtime_disable(&pdev->dev); in atmel_spi_probe()
1663 pm_runtime_set_suspended(&pdev->dev); in atmel_spi_probe()
1665 if (as->use_dma) in atmel_spi_probe()
1670 clk_disable_unprepare(clk); in atmel_spi_probe()
1682 pm_runtime_get_sync(&pdev->dev); in atmel_spi_remove()
1685 if (as->use_dma) { in atmel_spi_remove()
1689 dma_free_coherent(&pdev->dev, SPI_MAX_DMA_XFER, in atmel_spi_remove()
1690 as->addr_tx_bbuf, in atmel_spi_remove()
1691 as->dma_addr_tx_bbuf); in atmel_spi_remove()
1692 dma_free_coherent(&pdev->dev, SPI_MAX_DMA_XFER, in atmel_spi_remove()
1693 as->addr_rx_bbuf, in atmel_spi_remove()
1694 as->dma_addr_rx_bbuf); in atmel_spi_remove()
1698 spin_lock_irq(&as->lock); in atmel_spi_remove()
1702 spin_unlock_irq(&as->lock); in atmel_spi_remove()
1704 clk_disable_unprepare(as->clk); in atmel_spi_remove()
1706 pm_runtime_put_noidle(&pdev->dev); in atmel_spi_remove()
1707 pm_runtime_disable(&pdev->dev); in atmel_spi_remove()
1715 clk_disable_unprepare(as->clk); in atmel_spi_runtime_suspend()
1728 return clk_prepare_enable(as->clk); in atmel_spi_runtime_resume()
1753 ret = clk_prepare_enable(as->clk); in atmel_spi_resume()
1759 clk_disable_unprepare(as->clk); in atmel_spi_resume()
1778 { .compatible = "atmel,at91rm9200-spi" },