summaryrefslogtreecommitdiffstats
path: root/drivers/spi/spi-davinci.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/spi/spi-davinci.c')
-rw-r--r--drivers/spi/spi-davinci.c69
1 files changed, 18 insertions, 51 deletions
diff --git a/drivers/spi/spi-davinci.c b/drivers/spi/spi-davinci.c
index 02fb96797ac8..164cc719be54 100644
--- a/drivers/spi/spi-davinci.c
+++ b/drivers/spi/spi-davinci.c
@@ -467,6 +467,19 @@ static void davinci_spi_cleanup(struct spi_device *spi)
467 kfree(spicfg); 467 kfree(spicfg);
468} 468}
469 469
470static bool davinci_spi_can_dma(struct spi_master *master,
471 struct spi_device *spi,
472 struct spi_transfer *xfer)
473{
474 struct davinci_spi_config *spicfg = spi->controller_data;
475 bool can_dma = false;
476
477 if (spicfg)
478 can_dma = spicfg->io_type == SPI_IO_TYPE_DMA;
479
480 return can_dma;
481}
482
470static int davinci_spi_check_error(struct davinci_spi *dspi, int int_status) 483static int davinci_spi_check_error(struct davinci_spi *dspi, int int_status)
471{ 484{
472 struct device *sdev = dspi->bitbang.master->dev.parent; 485 struct device *sdev = dspi->bitbang.master->dev.parent;
@@ -581,8 +594,6 @@ static int davinci_spi_bufs(struct spi_device *spi, struct spi_transfer *t)
581 struct davinci_spi_config *spicfg; 594 struct davinci_spi_config *spicfg;
582 struct davinci_spi_platform_data *pdata; 595 struct davinci_spi_platform_data *pdata;
583 unsigned uninitialized_var(rx_buf_count); 596 unsigned uninitialized_var(rx_buf_count);
584 void *dummy_buf = NULL;
585 struct scatterlist sg_rx, sg_tx;
586 597
587 dspi = spi_master_get_devdata(spi->master); 598 dspi = spi_master_get_devdata(spi->master);
588 pdata = &dspi->pdata; 599 pdata = &dspi->pdata;
@@ -630,51 +641,18 @@ static int davinci_spi_bufs(struct spi_device *spi, struct spi_transfer *t)
630 }; 641 };
631 struct dma_async_tx_descriptor *rxdesc; 642 struct dma_async_tx_descriptor *rxdesc;
632 struct dma_async_tx_descriptor *txdesc; 643 struct dma_async_tx_descriptor *txdesc;
633 void *buf;
634
635 dummy_buf = kzalloc(t->len, GFP_KERNEL);
636 if (!dummy_buf)
637 goto err_alloc_dummy_buf;
638 644
639 dmaengine_slave_config(dspi->dma_rx, &dma_rx_conf); 645 dmaengine_slave_config(dspi->dma_rx, &dma_rx_conf);
640 dmaengine_slave_config(dspi->dma_tx, &dma_tx_conf); 646 dmaengine_slave_config(dspi->dma_tx, &dma_tx_conf);
641 647
642 sg_init_table(&sg_rx, 1);
643 if (!t->rx_buf)
644 buf = dummy_buf;
645 else
646 buf = t->rx_buf;
647 t->rx_dma = dma_map_single(&spi->dev, buf,
648 t->len, DMA_FROM_DEVICE);
649 if (dma_mapping_error(&spi->dev, !t->rx_dma)) {
650 ret = -EFAULT;
651 goto err_rx_map;
652 }
653 sg_dma_address(&sg_rx) = t->rx_dma;
654 sg_dma_len(&sg_rx) = t->len;
655
656 sg_init_table(&sg_tx, 1);
657 if (!t->tx_buf)
658 buf = dummy_buf;
659 else
660 buf = (void *)t->tx_buf;
661 t->tx_dma = dma_map_single(&spi->dev, buf,
662 t->len, DMA_TO_DEVICE);
663 if (dma_mapping_error(&spi->dev, t->tx_dma)) {
664 ret = -EFAULT;
665 goto err_tx_map;
666 }
667 sg_dma_address(&sg_tx) = t->tx_dma;
668 sg_dma_len(&sg_tx) = t->len;
669
670 rxdesc = dmaengine_prep_slave_sg(dspi->dma_rx, 648 rxdesc = dmaengine_prep_slave_sg(dspi->dma_rx,
671 &sg_rx, 1, DMA_DEV_TO_MEM, 649 t->rx_sg.sgl, t->rx_sg.nents, DMA_DEV_TO_MEM,
672 DMA_PREP_INTERRUPT | DMA_CTRL_ACK); 650 DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
673 if (!rxdesc) 651 if (!rxdesc)
674 goto err_desc; 652 goto err_desc;
675 653
676 txdesc = dmaengine_prep_slave_sg(dspi->dma_tx, 654 txdesc = dmaengine_prep_slave_sg(dspi->dma_tx,
677 &sg_tx, 1, DMA_MEM_TO_DEV, 655 t->tx_sg.sgl, t->tx_sg.nents, DMA_MEM_TO_DEV,
678 DMA_PREP_INTERRUPT | DMA_CTRL_ACK); 656 DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
679 if (!txdesc) 657 if (!txdesc)
680 goto err_desc; 658 goto err_desc;
@@ -710,16 +688,9 @@ static int davinci_spi_bufs(struct spi_device *spi, struct spi_transfer *t)
710 } 688 }
711 689
712 clear_io_bits(dspi->base + SPIINT, SPIINT_MASKALL); 690 clear_io_bits(dspi->base + SPIINT, SPIINT_MASKALL);
713 if (spicfg->io_type == SPI_IO_TYPE_DMA) { 691 if (spicfg->io_type == SPI_IO_TYPE_DMA)
714 clear_io_bits(dspi->base + SPIINT, SPIINT_DMA_REQ_EN); 692 clear_io_bits(dspi->base + SPIINT, SPIINT_DMA_REQ_EN);
715 693
716 dma_unmap_single(&spi->dev, t->rx_dma,
717 t->len, DMA_FROM_DEVICE);
718 dma_unmap_single(&spi->dev, t->tx_dma,
719 t->len, DMA_TO_DEVICE);
720 kfree(dummy_buf);
721 }
722
723 clear_io_bits(dspi->base + SPIGCR1, SPIGCR1_SPIENA_MASK); 694 clear_io_bits(dspi->base + SPIGCR1, SPIGCR1_SPIENA_MASK);
724 set_io_bits(dspi->base + SPIGCR1, SPIGCR1_POWERDOWN_MASK); 695 set_io_bits(dspi->base + SPIGCR1, SPIGCR1_POWERDOWN_MASK);
725 696
@@ -742,12 +713,6 @@ static int davinci_spi_bufs(struct spi_device *spi, struct spi_transfer *t)
742 return t->len; 713 return t->len;
743 714
744err_desc: 715err_desc:
745 dma_unmap_single(&spi->dev, t->tx_dma, t->len, DMA_TO_DEVICE);
746err_tx_map:
747 dma_unmap_single(&spi->dev, t->rx_dma, t->len, DMA_FROM_DEVICE);
748err_rx_map:
749 kfree(dummy_buf);
750err_alloc_dummy_buf:
751 return ret; 716 return ret;
752} 717}
753 718
@@ -988,8 +953,10 @@ static int davinci_spi_probe(struct platform_device *pdev)
988 master->bus_num = pdev->id; 953 master->bus_num = pdev->id;
989 master->num_chipselect = pdata->num_chipselect; 954 master->num_chipselect = pdata->num_chipselect;
990 master->bits_per_word_mask = SPI_BPW_RANGE_MASK(2, 16); 955 master->bits_per_word_mask = SPI_BPW_RANGE_MASK(2, 16);
956 master->flags = (SPI_MASTER_MUST_RX | SPI_MASTER_MUST_TX);
991 master->setup = davinci_spi_setup; 957 master->setup = davinci_spi_setup;
992 master->cleanup = davinci_spi_cleanup; 958 master->cleanup = davinci_spi_cleanup;
959 master->can_dma = davinci_spi_can_dma;
993 960
994 dspi->bitbang.chipselect = davinci_spi_chipselect; 961 dspi->bitbang.chipselect = davinci_spi_chipselect;
995 dspi->bitbang.setup_transfer = davinci_spi_setup_transfer; 962 dspi->bitbang.setup_transfer = davinci_spi_setup_transfer;