summaryrefslogtreecommitdiffstats
path: root/drivers/spi/spi-davinci.c
diff options
context:
space:
mode:
authorFabien Parent <fparent@baylibre.com>2017-02-23 13:01:56 -0500
committerMark Brown <broonie@kernel.org>2017-03-07 09:10:25 -0500
commit8aedbf580d21121d2a032e4c8ea12d8d2d85e275 (patch)
tree5fd78767ff1e173ddcec72d1673366204031838f /drivers/spi/spi-davinci.c
parentc1ae3cfa0e89fa1a7ecc4c99031f5e9ae99d9201 (diff)
spi: davinci: Use SPI framework to handle DMA mapping
Uppers layers like MTD can pass vmalloc'd buffers to the SPI driver, and the current implementation will fail to map these kind of buffers. The SPI framework is able to detect the best way to handle and map buffers. This commit updates the davinci SPI driver in order to use the SPI framework to handle the DMA mapping of buffers coming from an upper layer. Signed-off-by: Fabien Parent <fparent@baylibre.com> Signed-off-by: Frode Isaksen <fisaksen@baylibre.com> Signed-off-by: Mark Brown <broonie@kernel.org>
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;