}
        }
 
+       ctlr->cur_rx_dma_dev = rx_dev;
+       ctlr->cur_tx_dma_dev = tx_dev;
        ctlr->cur_msg_mapped = true;
 
        return 0;
 
 static int __spi_unmap_msg(struct spi_controller *ctlr, struct spi_message *msg)
 {
+       struct device *rx_dev = ctlr->cur_rx_dma_dev;
+       struct device *tx_dev = ctlr->cur_tx_dma_dev;
        struct spi_transfer *xfer;
-       struct device *tx_dev, *rx_dev;
 
        if (!ctlr->cur_msg_mapped || !ctlr->can_dma)
                return 0;
 
-       if (ctlr->dma_tx)
-               tx_dev = ctlr->dma_tx->device->dev;
-       else if (ctlr->dma_map_dev)
-               tx_dev = ctlr->dma_map_dev;
-       else
-               tx_dev = ctlr->dev.parent;
-
-       if (ctlr->dma_rx)
-               rx_dev = ctlr->dma_rx->device->dev;
-       else if (ctlr->dma_map_dev)
-               rx_dev = ctlr->dma_map_dev;
-       else
-               rx_dev = ctlr->dev.parent;
-
        list_for_each_entry(xfer, &msg->transfers, transfer_list) {
                if (!ctlr->can_dma(ctlr, msg->spi, xfer))
                        continue;
 
  * @cleanup: frees controller-specific state
  * @can_dma: determine whether this controller supports DMA
  * @dma_map_dev: device which can be used for DMA mapping
+ * @cur_rx_dma_dev: device which is currently used for RX DMA mapping
+ * @cur_tx_dma_dev: device which is currently used for TX DMA mapping
  * @queued: whether this controller is providing an internal message queue
  * @kworker: pointer to thread struct for message pump
  * @pump_messages: work struct for scheduling work to the message pump
                                           struct spi_device *spi,
                                           struct spi_transfer *xfer);
        struct device *dma_map_dev;
+       struct device *cur_rx_dma_dev;
+       struct device *cur_tx_dma_dev;
 
        /*
         * These hooks are for drivers that want to use the generic