Lines Matching +full:spi +full:- +full:rx +full:- +full:delay +full:- +full:us

2  * Driver for Atmel AT32 and AT91 SPI Controllers
16 #include <linux/delay.h>
17 #include <linux/dma-mapping.h>
20 #include <linux/spi/spi.h>
28 /* SPI register offsets */
169 (((value) & ((1 << SPI_##name##_SIZE) - 1)) << SPI_##name##_OFFSET)
171 (((value) >> SPI_##name##_OFFSET) & ((1 << SPI_##name##_SIZE) - 1))
173 ( ((old) & ~(((1 << SPI_##name##_SIZE) - 1) << SPI_##name##_OFFSET)) \
178 __raw_readl((port)->regs + SPI_##reg)
180 __raw_writel((value), (port)->regs + SPI_##reg)
184 * The core SPI transfer engine just talks to a register bank to set up
208 /* Controller-specific per-slave state */
218 * Version 2 of the SPI controller has
219 * - CR.LASTXFER
220 * - SPI_MR.DIV32 may become FDIV or must-be-zero (here: always zero)
221 * - SPI_SR.TXEMPTY, SPI_SR.NSSR (and corresponding irqs)
222 * - SPI_CSRx.CSAAT
223 * - SPI_CSRx.SBCR allows faster clocking
235 * Earlier SPI controllers (e.g. on at91rm9200) have a design bug whereby
236 * they assume that spi slave device state will not change on deselect, so
243 * MR.PCS to avoid confusing the controller. Using GPIOs also lets us
244 * support active-high chipselects despite the controller's belief that
245 * only active-low devices/systems exists.
259 static void cs_activate(struct atmel_spi *as, struct spi_device *spi) in cs_activate() argument
261 struct atmel_spi_device *asd = spi->controller_state; in cs_activate()
262 unsigned active = spi->mode & SPI_CS_HIGH; in cs_activate()
271 spi_writel(as, CSR0, asd->csr); in cs_activate()
275 gpio_set_value(asd->npcs_pin, active); in cs_activate()
277 u32 cpol = (spi->mode & SPI_CPOL) ? SPI_BIT(CPOL) : 0; in cs_activate()
282 for (i = 0; i < spi->master->num_chipselect; i++) { in cs_activate()
290 mr = SPI_BFINS(PCS, ~(1 << spi->chip_select), mr); in cs_activate()
291 if (spi->chip_select != 0) in cs_activate()
292 gpio_set_value(asd->npcs_pin, active); in cs_activate()
296 dev_dbg(&spi->dev, "activate %u%s, mr %08x\n", in cs_activate()
297 asd->npcs_pin, active ? " (high)" : "", in cs_activate()
301 static void cs_deactivate(struct atmel_spi *as, struct spi_device *spi) in cs_deactivate() argument
303 struct atmel_spi_device *asd = spi->controller_state; in cs_deactivate()
304 unsigned active = spi->mode & SPI_CS_HIGH; in cs_deactivate()
311 if (~SPI_BFEXT(PCS, mr) & (1 << spi->chip_select)) { in cs_deactivate()
316 dev_dbg(&spi->dev, "DEactivate %u%s, mr %08x\n", in cs_deactivate()
317 asd->npcs_pin, active ? " (low)" : "", in cs_deactivate()
320 if (atmel_spi_is_v2() || spi->chip_select != 0) in cs_deactivate()
321 gpio_set_value(asd->npcs_pin, !active); in cs_deactivate()
327 return msg->transfers.prev == &xfer->transfer_list; in atmel_spi_xfer_is_last()
332 return xfer->delay_usecs == 0 && !xfer->cs_change; in atmel_spi_xfer_can_be_chained()
344 /* use scratch buffer only when rx or tx data is unspecified */ in atmel_spi_next_xfer_data()
345 if (xfer->rx_buf) in atmel_spi_next_xfer_data()
346 *rx_dma = xfer->rx_dma + xfer->len - *plen; in atmel_spi_next_xfer_data()
348 *rx_dma = as->buffer_dma; in atmel_spi_next_xfer_data()
352 if (xfer->tx_buf) in atmel_spi_next_xfer_data()
353 *tx_dma = xfer->tx_dma + xfer->len - *plen; in atmel_spi_next_xfer_data()
355 *tx_dma = as->buffer_dma; in atmel_spi_next_xfer_data()
358 memset(as->buffer, 0, len); in atmel_spi_next_xfer_data()
359 dma_sync_single_for_device(&as->pdev->dev, in atmel_spi_next_xfer_data()
360 as->buffer_dma, len, DMA_TO_DEVICE); in atmel_spi_next_xfer_data()
368 * lock is held, spi irq is blocked
379 if (!as->current_transfer) in atmel_spi_next_xfer()
380 xfer = list_entry(msg->transfers.next, in atmel_spi_next_xfer()
382 else if (!as->next_transfer) in atmel_spi_next_xfer()
383 xfer = list_entry(as->current_transfer->transfer_list.next, in atmel_spi_next_xfer()
391 len = xfer->len; in atmel_spi_next_xfer()
393 remaining = xfer->len - len; in atmel_spi_next_xfer()
398 if (msg->spi->bits_per_word > 8) in atmel_spi_next_xfer()
403 dev_dbg(&msg->spi->dev, in atmel_spi_next_xfer()
404 " start xfer %p: len %u tx %p/%08x rx %p/%08x\n", in atmel_spi_next_xfer()
405 xfer, xfer->len, xfer->tx_buf, xfer->tx_dma, in atmel_spi_next_xfer()
406 xfer->rx_buf, xfer->rx_dma); in atmel_spi_next_xfer()
408 xfer = as->next_transfer; in atmel_spi_next_xfer()
409 remaining = as->next_remaining_bytes; in atmel_spi_next_xfer()
412 as->current_transfer = xfer; in atmel_spi_next_xfer()
413 as->current_remaining_bytes = remaining; in atmel_spi_next_xfer()
419 xfer = list_entry(xfer->transfer_list.next, in atmel_spi_next_xfer()
421 len = xfer->len; in atmel_spi_next_xfer()
425 as->next_transfer = xfer; in atmel_spi_next_xfer()
432 as->next_remaining_bytes = total - len; in atmel_spi_next_xfer()
437 if (msg->spi->bits_per_word > 8) in atmel_spi_next_xfer()
442 dev_dbg(&msg->spi->dev, in atmel_spi_next_xfer()
443 " next xfer %p: len %u tx %p/%08x rx %p/%08x\n", in atmel_spi_next_xfer()
444 xfer, xfer->len, xfer->tx_buf, xfer->tx_dma, in atmel_spi_next_xfer()
445 xfer->rx_buf, xfer->rx_dma); in atmel_spi_next_xfer()
471 struct spi_device *spi; in atmel_spi_next_message() local
473 BUG_ON(as->current_transfer); in atmel_spi_next_message()
475 msg = list_entry(as->queue.next, struct spi_message, queue); in atmel_spi_next_message()
476 spi = msg->spi; in atmel_spi_next_message()
478 dev_dbg(master->dev.parent, "start message %p for %s\n", in atmel_spi_next_message()
479 msg, dev_name(&spi->dev)); in atmel_spi_next_message()
482 if (as->stay) { in atmel_spi_next_message()
483 if (as->stay != spi) { in atmel_spi_next_message()
484 cs_deactivate(as, as->stay); in atmel_spi_next_message()
485 cs_activate(as, spi); in atmel_spi_next_message()
487 as->stay = NULL; in atmel_spi_next_message()
489 cs_activate(as, spi); in atmel_spi_next_message()
496 * - The buffer is either valid for CPU access, else NULL
497 * - If the buffer is valid, so is its DMA address
499 * This driver manages the dma address unless message->is_dma_mapped.
504 struct device *dev = &as->pdev->dev; in atmel_spi_dma_map_xfer()
506 xfer->tx_dma = xfer->rx_dma = INVALID_DMA_ADDRESS; in atmel_spi_dma_map_xfer()
507 if (xfer->tx_buf) { in atmel_spi_dma_map_xfer()
510 void *nonconst_tx = (void *)xfer->tx_buf; in atmel_spi_dma_map_xfer()
512 xfer->tx_dma = dma_map_single(dev, in atmel_spi_dma_map_xfer()
513 nonconst_tx, xfer->len, in atmel_spi_dma_map_xfer()
515 if (dma_mapping_error(dev, xfer->tx_dma)) in atmel_spi_dma_map_xfer()
516 return -ENOMEM; in atmel_spi_dma_map_xfer()
518 if (xfer->rx_buf) { in atmel_spi_dma_map_xfer()
519 xfer->rx_dma = dma_map_single(dev, in atmel_spi_dma_map_xfer()
520 xfer->rx_buf, xfer->len, in atmel_spi_dma_map_xfer()
522 if (dma_mapping_error(dev, xfer->rx_dma)) { in atmel_spi_dma_map_xfer()
523 if (xfer->tx_buf) in atmel_spi_dma_map_xfer()
525 xfer->tx_dma, xfer->len, in atmel_spi_dma_map_xfer()
527 return -ENOMEM; in atmel_spi_dma_map_xfer()
536 if (xfer->tx_dma != INVALID_DMA_ADDRESS) in atmel_spi_dma_unmap_xfer()
537 dma_unmap_single(master->dev.parent, xfer->tx_dma, in atmel_spi_dma_unmap_xfer()
538 xfer->len, DMA_TO_DEVICE); in atmel_spi_dma_unmap_xfer()
539 if (xfer->rx_dma != INVALID_DMA_ADDRESS) in atmel_spi_dma_unmap_xfer()
540 dma_unmap_single(master->dev.parent, xfer->rx_dma, in atmel_spi_dma_unmap_xfer()
541 xfer->len, DMA_FROM_DEVICE); in atmel_spi_dma_unmap_xfer()
549 cs_deactivate(as, msg->spi); in atmel_spi_msg_done()
551 as->stay = msg->spi; in atmel_spi_msg_done()
553 list_del(&msg->queue); in atmel_spi_msg_done()
554 msg->status = status; in atmel_spi_msg_done()
556 dev_dbg(master->dev.parent, in atmel_spi_msg_done()
558 msg->actual_length); in atmel_spi_msg_done()
560 spin_unlock(&as->lock); in atmel_spi_msg_done()
561 msg->complete(msg->context); in atmel_spi_msg_done()
562 spin_lock(&as->lock); in atmel_spi_msg_done()
564 as->current_transfer = NULL; in atmel_spi_msg_done()
565 as->next_transfer = NULL; in atmel_spi_msg_done()
568 if (list_empty(&as->queue) || as->stopping) in atmel_spi_msg_done()
584 spin_lock(&as->lock); in atmel_spi_interrupt()
586 xfer = as->current_transfer; in atmel_spi_interrupt()
587 msg = list_entry(as->queue.next, struct spi_message, queue); in atmel_spi_interrupt()
604 * bounce buffer and msg->actual_len will not be in atmel_spi_interrupt()
613 if (!msg->is_dma_mapped) in atmel_spi_interrupt()
617 if (xfer->delay_usecs) in atmel_spi_interrupt()
618 udelay(xfer->delay_usecs); in atmel_spi_interrupt()
620 dev_warn(master->dev.parent, "overrun (%u/%u remaining)\n", in atmel_spi_interrupt()
631 for (timeout = 1000; timeout; timeout--) in atmel_spi_interrupt()
635 dev_warn(master->dev.parent, in atmel_spi_interrupt()
643 atmel_spi_msg_done(master, as, msg, -EIO, 0); in atmel_spi_interrupt()
649 if (as->current_remaining_bytes == 0) { in atmel_spi_interrupt()
650 msg->actual_length += xfer->len; in atmel_spi_interrupt()
652 if (!msg->is_dma_mapped) in atmel_spi_interrupt()
656 if (xfer->delay_usecs) in atmel_spi_interrupt()
657 udelay(xfer->delay_usecs); in atmel_spi_interrupt()
662 xfer->cs_change); in atmel_spi_interrupt()
664 if (xfer->cs_change) { in atmel_spi_interrupt()
665 cs_deactivate(as, msg->spi); in atmel_spi_interrupt()
667 cs_activate(as, msg->spi); in atmel_spi_interrupt()
686 spin_unlock(&as->lock); in atmel_spi_interrupt()
691 static int atmel_spi_setup(struct spi_device *spi) in atmel_spi_setup() argument
696 unsigned int bits = spi->bits_per_word; in atmel_spi_setup()
701 as = spi_master_get_devdata(spi->master); in atmel_spi_setup()
703 if (as->stopping) in atmel_spi_setup()
704 return -ESHUTDOWN; in atmel_spi_setup()
706 if (spi->chip_select > spi->master->num_chipselect) { in atmel_spi_setup()
707 dev_dbg(&spi->dev, in atmel_spi_setup()
709 spi->chip_select, spi->master->num_chipselect); in atmel_spi_setup()
710 return -EINVAL; in atmel_spi_setup()
714 dev_dbg(&spi->dev, in atmel_spi_setup()
717 return -EINVAL; in atmel_spi_setup()
722 && spi->chip_select == 0 in atmel_spi_setup()
723 && (spi->mode & SPI_CS_HIGH)) { in atmel_spi_setup()
724 dev_dbg(&spi->dev, "setup: can't be active-high\n"); in atmel_spi_setup()
725 return -EINVAL; in atmel_spi_setup()
729 bus_hz = clk_get_rate(as->clk); in atmel_spi_setup()
733 if (spi->max_speed_hz) { in atmel_spi_setup()
738 scbr = DIV_ROUND_UP(bus_hz, spi->max_speed_hz); in atmel_spi_setup()
745 dev_dbg(&spi->dev, in atmel_spi_setup()
747 spi->max_speed_hz, scbr, bus_hz/255); in atmel_spi_setup()
748 return -EINVAL; in atmel_spi_setup()
754 csr = SPI_BF(SCBR, scbr) | SPI_BF(BITS, bits - 8); in atmel_spi_setup()
755 if (spi->mode & SPI_CPOL) in atmel_spi_setup()
757 if (!(spi->mode & SPI_CPHA)) in atmel_spi_setup()
770 npcs_pin = (unsigned int)spi->controller_data; in atmel_spi_setup()
771 asd = spi->controller_state; in atmel_spi_setup()
775 return -ENOMEM; in atmel_spi_setup()
777 ret = gpio_request(npcs_pin, dev_name(&spi->dev)); in atmel_spi_setup()
783 asd->npcs_pin = npcs_pin; in atmel_spi_setup()
784 spi->controller_state = asd; in atmel_spi_setup()
785 gpio_direction_output(npcs_pin, !(spi->mode & SPI_CS_HIGH)); in atmel_spi_setup()
789 spin_lock_irqsave(&as->lock, flags); in atmel_spi_setup()
790 if (as->stay == spi) in atmel_spi_setup()
791 as->stay = NULL; in atmel_spi_setup()
792 cs_deactivate(as, spi); in atmel_spi_setup()
793 spin_unlock_irqrestore(&as->lock, flags); in atmel_spi_setup()
796 asd->csr = csr; in atmel_spi_setup()
798 dev_dbg(&spi->dev, in atmel_spi_setup()
799 "setup: %lu Hz bpw %u mode 0x%x -> csr%d %08x\n", in atmel_spi_setup()
800 bus_hz / scbr, bits, spi->mode, spi->chip_select, csr); in atmel_spi_setup()
803 spi_writel(as, CSR0 + 4 * spi->chip_select, csr); in atmel_spi_setup()
808 static int atmel_spi_transfer(struct spi_device *spi, struct spi_message *msg) in atmel_spi_transfer() argument
813 struct device *controller = spi->master->dev.parent; in atmel_spi_transfer()
817 as = spi_master_get_devdata(spi->master); in atmel_spi_transfer()
820 msg, dev_name(&spi->dev)); in atmel_spi_transfer()
822 if (unlikely(list_empty(&msg->transfers))) in atmel_spi_transfer()
823 return -EINVAL; in atmel_spi_transfer()
825 if (as->stopping) in atmel_spi_transfer()
826 return -ESHUTDOWN; in atmel_spi_transfer()
828 list_for_each_entry(xfer, &msg->transfers, transfer_list) { in atmel_spi_transfer()
829 if (!(xfer->tx_buf || xfer->rx_buf) && xfer->len) { in atmel_spi_transfer()
830 dev_dbg(&spi->dev, "missing rx or tx buf\n"); in atmel_spi_transfer()
831 return -EINVAL; in atmel_spi_transfer()
834 if (xfer->bits_per_word) { in atmel_spi_transfer()
835 asd = spi->controller_state; in atmel_spi_transfer()
836 bits = (asd->csr >> 4) & 0xf; in atmel_spi_transfer()
837 if (bits != xfer->bits_per_word - 8) { in atmel_spi_transfer()
838 dev_dbg(&spi->dev, "you can't yet change " in atmel_spi_transfer()
840 return -ENOPROTOOPT; in atmel_spi_transfer()
845 if (xfer->speed_hz) { in atmel_spi_transfer()
846 dev_dbg(&spi->dev, "no protocol options yet\n"); in atmel_spi_transfer()
847 return -ENOPROTOOPT; in atmel_spi_transfer()
852 * better fault reporting. This is a DMA-only driver. in atmel_spi_transfer()
856 * up mappings for previously-mapped transfers. in atmel_spi_transfer()
858 if (!msg->is_dma_mapped) { in atmel_spi_transfer()
860 return -ENOMEM; in atmel_spi_transfer()
865 list_for_each_entry(xfer, &msg->transfers, transfer_list) { in atmel_spi_transfer()
867 " xfer %p: len %u tx %p/%08x rx %p/%08x\n", in atmel_spi_transfer()
868 xfer, xfer->len, in atmel_spi_transfer()
869 xfer->tx_buf, xfer->tx_dma, in atmel_spi_transfer()
870 xfer->rx_buf, xfer->rx_dma); in atmel_spi_transfer()
874 msg->status = -EINPROGRESS; in atmel_spi_transfer()
875 msg->actual_length = 0; in atmel_spi_transfer()
877 spin_lock_irqsave(&as->lock, flags); in atmel_spi_transfer()
878 list_add_tail(&msg->queue, &as->queue); in atmel_spi_transfer()
879 if (!as->current_transfer) in atmel_spi_transfer()
880 atmel_spi_next_message(spi->master); in atmel_spi_transfer()
881 spin_unlock_irqrestore(&as->lock, flags); in atmel_spi_transfer()
886 static void atmel_spi_cleanup(struct spi_device *spi) in atmel_spi_cleanup() argument
888 struct atmel_spi *as = spi_master_get_devdata(spi->master); in atmel_spi_cleanup()
889 struct atmel_spi_device *asd = spi->controller_state; in atmel_spi_cleanup()
890 unsigned gpio = (unsigned) spi->controller_data; in atmel_spi_cleanup()
896 spin_lock_irqsave(&as->lock, flags); in atmel_spi_cleanup()
897 if (as->stay == spi) { in atmel_spi_cleanup()
898 as->stay = NULL; in atmel_spi_cleanup()
899 cs_deactivate(as, spi); in atmel_spi_cleanup()
901 spin_unlock_irqrestore(&as->lock, flags); in atmel_spi_cleanup()
903 spi->controller_state = NULL; in atmel_spi_cleanup()
908 /*-------------------------------------------------------------------------*/
921 return -ENXIO; in atmel_spi_probe()
927 clk = clk_get(&pdev->dev, "spi_clk"); in atmel_spi_probe()
931 /* setup spi core then atmel-specific driver state */ in atmel_spi_probe()
932 ret = -ENOMEM; in atmel_spi_probe()
933 master = spi_alloc_master(&pdev->dev, sizeof *as); in atmel_spi_probe()
937 /* the spi->mode bits understood by this driver: */ in atmel_spi_probe()
938 master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH; in atmel_spi_probe()
940 master->bus_num = pdev->id; in atmel_spi_probe()
941 master->num_chipselect = 4; in atmel_spi_probe()
942 master->setup = atmel_spi_setup; in atmel_spi_probe()
943 master->transfer = atmel_spi_transfer; in atmel_spi_probe()
944 master->cleanup = atmel_spi_cleanup; in atmel_spi_probe()
950 * Scratch buffer is used for throwaway rx and tx data. in atmel_spi_probe()
953 as->buffer = dma_alloc_coherent(&pdev->dev, BUFFER_SIZE, in atmel_spi_probe()
954 &as->buffer_dma, GFP_KERNEL); in atmel_spi_probe()
955 if (!as->buffer) in atmel_spi_probe()
958 spin_lock_init(&as->lock); in atmel_spi_probe()
959 INIT_LIST_HEAD(&as->queue); in atmel_spi_probe()
960 as->pdev = pdev; in atmel_spi_probe()
961 as->regs = ioremap(regs->start, resource_size(regs)); in atmel_spi_probe()
962 if (!as->regs) in atmel_spi_probe()
964 as->irq = irq; in atmel_spi_probe()
965 as->clk = clk; in atmel_spi_probe()
968 dev_name(&pdev->dev), master); in atmel_spi_probe()
981 dev_info(&pdev->dev, "Atmel SPI Controller at 0x%08lx (irq %d)\n", in atmel_spi_probe()
982 (unsigned long)regs->start, irq); in atmel_spi_probe()
996 iounmap(as->regs); in atmel_spi_probe()
998 dma_free_coherent(&pdev->dev, BUFFER_SIZE, as->buffer, in atmel_spi_probe()
999 as->buffer_dma); in atmel_spi_probe()
1013 spin_lock_irq(&as->lock); in atmel_spi_remove()
1014 as->stopping = 1; in atmel_spi_remove()
1018 spin_unlock_irq(&as->lock); in atmel_spi_remove()
1021 list_for_each_entry(msg, &as->queue, queue) { in atmel_spi_remove()
1025 msg->status = -ESHUTDOWN; in atmel_spi_remove()
1026 msg->complete(msg->context); in atmel_spi_remove()
1029 dma_free_coherent(&pdev->dev, BUFFER_SIZE, as->buffer, in atmel_spi_remove()
1030 as->buffer_dma); in atmel_spi_remove()
1032 clk_disable(as->clk); in atmel_spi_remove()
1033 clk_put(as->clk); in atmel_spi_remove()
1034 free_irq(as->irq, master); in atmel_spi_remove()
1035 iounmap(as->regs); in atmel_spi_remove()
1049 clk_disable(as->clk); in atmel_spi_suspend()
1058 clk_enable(as->clk); in atmel_spi_resume()
1080 MODULE_DESCRIPTION("Atmel AT32/AT91 SPI Controller driver");