spi: Save current RX and TX DMA devices
authorVincent Whitchurch <vincent.whitchurch@axis.com>
Tue, 27 Sep 2022 11:21:14 +0000 (13:21 +0200)
committerMark Brown <broonie@kernel.org>
Wed, 28 Sep 2022 11:54:04 +0000 (12:54 +0100)
Save the current RX and TX DMA devices to avoid having to duplicate the
logic to pick them, since we'll need access to them in some more
functions to fix a bug in the cache handling.

Signed-off-by: Vincent Whitchurch <vincent.whitchurch@axis.com>
Link: https://lore.kernel.org/r/20220927112117.77599-2-vincent.whitchurch@axis.com
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/spi/spi.c
include/linux/spi/spi.h

index c582ae4..a492a2a 100644 (file)
@@ -1147,6 +1147,8 @@ static int __spi_map_msg(struct spi_controller *ctlr, struct spi_message *msg)
                }
        }
 
+       ctlr->cur_rx_dma_dev = rx_dev;
+       ctlr->cur_tx_dma_dev = tx_dev;
        ctlr->cur_msg_mapped = true;
 
        return 0;
@@ -1154,26 +1156,13 @@ static int __spi_map_msg(struct spi_controller *ctlr, struct spi_message *msg)
 
 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;
index 19acd4c..4b4041e 100644 (file)
@@ -378,6 +378,8 @@ extern struct spi_device *spi_new_ancillary_device(struct spi_device *spi, u8 ch
  * @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
@@ -609,6 +611,8 @@ struct spi_controller {
                                           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