Skip to content

Commit 8304801

Browse files
r-vigneshbroonie
authored andcommitted
spi: spi-cadence-quadspi: Fix mapping of buffers for DMA reads
Buffers need to mapped to DMA channel's device pointer instead of SPI controller's device pointer as its system DMA that actually does data transfer. Data inconsistencies have been reported when reading from flash without this fix. Fixes: ffa639e ("mtd: spi-nor: cadence-quadspi: Add DMA support for direct mode reads") Signed-off-by: Vignesh Raghavendra <vigneshr@ti.com> Tested-by: Jan Kiszka <jan.kiszka@siemens.com> Link: https://lore.kernel.org/r/20200831130720.4524-1-vigneshr@ti.com Signed-off-by: Mark Brown <broonie@kernel.org>
1 parent ea8be08 commit 8304801

File tree

1 file changed

+5
-3
lines changed

1 file changed

+5
-3
lines changed

drivers/spi/spi-cadence-quadspi.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -907,14 +907,16 @@ static int cqspi_direct_read_execute(struct cqspi_flash_pdata *f_pdata,
907907
struct dma_async_tx_descriptor *tx;
908908
dma_cookie_t cookie;
909909
dma_addr_t dma_dst;
910+
struct device *ddev;
910911

911912
if (!cqspi->rx_chan || !virt_addr_valid(buf)) {
912913
memcpy_fromio(buf, cqspi->ahb_base + from, len);
913914
return 0;
914915
}
915916

916-
dma_dst = dma_map_single(dev, buf, len, DMA_FROM_DEVICE);
917-
if (dma_mapping_error(dev, dma_dst)) {
917+
ddev = cqspi->rx_chan->device->dev;
918+
dma_dst = dma_map_single(ddev, buf, len, DMA_FROM_DEVICE);
919+
if (dma_mapping_error(ddev, dma_dst)) {
918920
dev_err(dev, "dma mapping failed\n");
919921
return -ENOMEM;
920922
}
@@ -948,7 +950,7 @@ static int cqspi_direct_read_execute(struct cqspi_flash_pdata *f_pdata,
948950
}
949951

950952
err_unmap:
951-
dma_unmap_single(dev, dma_dst, len, DMA_FROM_DEVICE);
953+
dma_unmap_single(ddev, dma_dst, len, DMA_FROM_DEVICE);
952954

953955
return ret;
954956
}

0 commit comments

Comments
 (0)