]> rtime.felk.cvut.cz Git - zynq/linux.git/blobdiff - drivers/spi/spi-zynqmp-gqspi.c
spi: spi-zynqmp-gqspi: use dma mode only if the buffer is not vmalloced
[zynq/linux.git] / drivers / spi / spi-zynqmp-gqspi.c
index 2a82ba184be2b0c61996245a3e8646e81e395018..8902ce7290be9d93122df85d5bf550c316df4dd5 100644 (file)
@@ -833,7 +833,8 @@ static void zynq_qspi_setuprxdma(struct zynqmp_qspi *xqspi)
        u64 dma_align =  (u64)(uintptr_t)xqspi->rxbuf;
 
        if (((xqspi->bytes_to_receive < 8) || (xqspi->io_mode)) ||
-               ((dma_align & GQSPI_DMA_UNALIGN) != 0x0)) {
+               ((dma_align & GQSPI_DMA_UNALIGN) != 0x0) ||
+               is_vmalloc_addr(xqspi->rxbuf)) {
                /* Setting to IO mode */
                config_reg = zynqmp_gqspi_read(xqspi, GQSPI_CONFIG_OFST);
                config_reg &= ~GQSPI_CFG_MODE_EN_MASK;
@@ -848,8 +849,10 @@ static void zynq_qspi_setuprxdma(struct zynqmp_qspi *xqspi)
 
        addr = dma_map_single(xqspi->dev, (void *)xqspi->rxbuf,
                                                rx_bytes, DMA_FROM_DEVICE);
-       if (dma_mapping_error(xqspi->dev, addr))
+       if (dma_mapping_error(xqspi->dev, addr)) {
                dev_err(xqspi->dev, "ERR:rxdma:memory not mapped\n");
+               return;
+       }
 
        xqspi->dma_rx_bytes = rx_bytes;
        xqspi->dma_addr = addr;