return 0;
 }
 
-static void spi_dma_sync_for_device(struct spi_controller *ctlr,
+static void spi_dma_sync_for_device(struct spi_controller *ctlr, struct spi_message *msg,
                                    struct spi_transfer *xfer)
 {
        struct device *rx_dev = ctlr->cur_rx_dma_dev;
        if (!ctlr->cur_msg_mapped)
                return;
 
+       if (!ctlr->can_dma(ctlr, msg->spi, xfer))
+               return;
+
        dma_sync_sgtable_for_device(tx_dev, &xfer->tx_sg, DMA_TO_DEVICE);
        dma_sync_sgtable_for_device(rx_dev, &xfer->rx_sg, DMA_FROM_DEVICE);
 }
 
-static void spi_dma_sync_for_cpu(struct spi_controller *ctlr,
+static void spi_dma_sync_for_cpu(struct spi_controller *ctlr, struct spi_message *msg,
                                 struct spi_transfer *xfer)
 {
        struct device *rx_dev = ctlr->cur_rx_dma_dev;
        if (!ctlr->cur_msg_mapped)
                return;
 
+       if (!ctlr->can_dma(ctlr, msg->spi, xfer))
+               return;
+
        dma_sync_sgtable_for_cpu(rx_dev, &xfer->rx_sg, DMA_FROM_DEVICE);
        dma_sync_sgtable_for_cpu(tx_dev, &xfer->tx_sg, DMA_TO_DEVICE);
 }
 }
 
 static void spi_dma_sync_for_device(struct spi_controller *ctrl,
+                                   struct spi_message *msg,
                                    struct spi_transfer *xfer)
 {
 }
 
 static void spi_dma_sync_for_cpu(struct spi_controller *ctrl,
+                                struct spi_message *msg,
                                 struct spi_transfer *xfer)
 {
 }
                        reinit_completion(&ctlr->xfer_completion);
 
 fallback_pio:
-                       spi_dma_sync_for_device(ctlr, xfer);
+                       spi_dma_sync_for_device(ctlr, msg, xfer);
                        ret = ctlr->transfer_one(ctlr, msg->spi, xfer);
                        if (ret < 0) {
-                               spi_dma_sync_for_cpu(ctlr, xfer);
+                               spi_dma_sync_for_cpu(ctlr, msg, xfer);
 
                                if (ctlr->cur_msg_mapped &&
                                   (xfer->error & SPI_TRANS_FAIL_NO_START)) {
                                        msg->status = ret;
                        }
 
-                       spi_dma_sync_for_cpu(ctlr, xfer);
+                       spi_dma_sync_for_cpu(ctlr, msg, xfer);
                } else {
                        if (xfer->len)
                                dev_err(&msg->spi->dev,