aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeert Uytterhoeven <geert+renesas@glider.be>2014-07-11 11:56:22 -0400
committerMark Brown <broonie@linaro.org>2014-07-16 18:19:34 -0400
commit5dabcf2f27ded864cf79204c4a3cca1516b66026 (patch)
treefe48cb11b03d59feaf7ca819a4522c044d80b522
parent279d2378c9c4f05bbe41b55625b4003871026266 (diff)
spi: sh-msiof: Use correct device for DMA mapping with IOMMU
To function correctly in the presence of an IOMMU, the DMA buffers must be mapped using the DMA channel's device instead of the MSIOF platform device's device. Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be> Signed-off-by: Mark Brown <broonie@linaro.org>
-rw-r--r--drivers/spi/spi-sh-msiof.c26
1 files changed, 16 insertions, 10 deletions
diff --git a/drivers/spi/spi-sh-msiof.c b/drivers/spi/spi-sh-msiof.c
index 373de70baf08..2a4354dcd661 100644
--- a/drivers/spi/spi-sh-msiof.c
+++ b/drivers/spi/spi-sh-msiof.c
@@ -638,8 +638,8 @@ static int sh_msiof_dma_once(struct sh_msiof_spi_priv *p, const void *tx,
638 638
639 if (tx) { 639 if (tx) {
640 ier_bits |= IER_TDREQE | IER_TDMAE; 640 ier_bits |= IER_TDREQE | IER_TDMAE;
641 dma_sync_single_for_device(&p->pdev->dev, p->tx_dma_addr, len, 641 dma_sync_single_for_device(p->master->dma_tx->device->dev,
642 DMA_TO_DEVICE); 642 p->tx_dma_addr, len, DMA_TO_DEVICE);
643 desc_tx = dmaengine_prep_slave_single(p->master->dma_tx, 643 desc_tx = dmaengine_prep_slave_single(p->master->dma_tx,
644 p->tx_dma_addr, len, DMA_TO_DEVICE, 644 p->tx_dma_addr, len, DMA_TO_DEVICE,
645 DMA_PREP_INTERRUPT | DMA_CTRL_ACK); 645 DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
@@ -717,7 +717,8 @@ static int sh_msiof_dma_once(struct sh_msiof_spi_priv *p, const void *tx,
717 } 717 }
718 718
719 if (rx) 719 if (rx)
720 dma_sync_single_for_cpu(&p->pdev->dev, p->rx_dma_addr, len, 720 dma_sync_single_for_cpu(p->master->dma_rx->device->dev,
721 p->rx_dma_addr, len,
721 DMA_FROM_DEVICE); 722 DMA_FROM_DEVICE);
722 723
723 return 0; 724 return 0;
@@ -1003,6 +1004,7 @@ static int sh_msiof_request_dma(struct sh_msiof_spi_priv *p)
1003 const struct sh_msiof_spi_info *info = dev_get_platdata(dev); 1004 const struct sh_msiof_spi_info *info = dev_get_platdata(dev);
1004 const struct resource *res; 1005 const struct resource *res;
1005 struct spi_master *master; 1006 struct spi_master *master;
1007 struct device *tx_dev, *rx_dev;
1006 1008
1007 if (!info || !info->dma_tx_id || !info->dma_rx_id) 1009 if (!info || !info->dma_tx_id || !info->dma_rx_id)
1008 return 0; /* The driver assumes no error */ 1010 return 0; /* The driver assumes no error */
@@ -1033,21 +1035,23 @@ static int sh_msiof_request_dma(struct sh_msiof_spi_priv *p)
1033 if (!p->rx_dma_page) 1035 if (!p->rx_dma_page)
1034 goto free_tx_page; 1036 goto free_tx_page;
1035 1037
1036 p->tx_dma_addr = dma_map_single(dev, p->tx_dma_page, PAGE_SIZE, 1038 tx_dev = master->dma_tx->device->dev;
1039 p->tx_dma_addr = dma_map_single(tx_dev, p->tx_dma_page, PAGE_SIZE,
1037 DMA_TO_DEVICE); 1040 DMA_TO_DEVICE);
1038 if (dma_mapping_error(dev, p->tx_dma_addr)) 1041 if (dma_mapping_error(tx_dev, p->tx_dma_addr))
1039 goto free_rx_page; 1042 goto free_rx_page;
1040 1043
1041 p->rx_dma_addr = dma_map_single(dev, p->rx_dma_page, PAGE_SIZE, 1044 rx_dev = master->dma_rx->device->dev;
1045 p->rx_dma_addr = dma_map_single(rx_dev, p->rx_dma_page, PAGE_SIZE,
1042 DMA_FROM_DEVICE); 1046 DMA_FROM_DEVICE);
1043 if (dma_mapping_error(dev, p->rx_dma_addr)) 1047 if (dma_mapping_error(rx_dev, p->rx_dma_addr))
1044 goto unmap_tx_page; 1048 goto unmap_tx_page;
1045 1049
1046 dev_info(dev, "DMA available"); 1050 dev_info(dev, "DMA available");
1047 return 0; 1051 return 0;
1048 1052
1049unmap_tx_page: 1053unmap_tx_page:
1050 dma_unmap_single(dev, p->tx_dma_addr, PAGE_SIZE, DMA_TO_DEVICE); 1054 dma_unmap_single(tx_dev, p->tx_dma_addr, PAGE_SIZE, DMA_TO_DEVICE);
1051free_rx_page: 1055free_rx_page:
1052 free_page((unsigned long)p->rx_dma_page); 1056 free_page((unsigned long)p->rx_dma_page);
1053free_tx_page: 1057free_tx_page:
@@ -1069,8 +1073,10 @@ static void sh_msiof_release_dma(struct sh_msiof_spi_priv *p)
1069 return; 1073 return;
1070 1074
1071 dev = &p->pdev->dev; 1075 dev = &p->pdev->dev;
1072 dma_unmap_single(dev, p->rx_dma_addr, PAGE_SIZE, DMA_FROM_DEVICE); 1076 dma_unmap_single(master->dma_rx->device->dev, p->rx_dma_addr,
1073 dma_unmap_single(dev, p->tx_dma_addr, PAGE_SIZE, DMA_TO_DEVICE); 1077 PAGE_SIZE, DMA_FROM_DEVICE);
1078 dma_unmap_single(master->dma_tx->device->dev, p->tx_dma_addr,
1079 PAGE_SIZE, DMA_TO_DEVICE);
1074 free_page((unsigned long)p->rx_dma_page); 1080 free_page((unsigned long)p->rx_dma_page);
1075 free_page((unsigned long)p->tx_dma_page); 1081 free_page((unsigned long)p->tx_dma_page);
1076 dma_release_channel(master->dma_rx); 1082 dma_release_channel(master->dma_rx);