diff options
Diffstat (limited to 'drivers/spi/spi-davinci.c')
-rw-r--r-- | drivers/spi/spi-davinci.c | 69 |
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 | ||
470 | static 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 | |||
470 | static int davinci_spi_check_error(struct davinci_spi *dspi, int int_status) | 483 | static 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 | ||
744 | err_desc: | 715 | err_desc: |
745 | dma_unmap_single(&spi->dev, t->tx_dma, t->len, DMA_TO_DEVICE); | ||
746 | err_tx_map: | ||
747 | dma_unmap_single(&spi->dev, t->rx_dma, t->len, DMA_FROM_DEVICE); | ||
748 | err_rx_map: | ||
749 | kfree(dummy_buf); | ||
750 | err_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; |