]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
spi: fsl-dspi: Store status directly in cur_msg->status
authorJames Clark <james.clark@linaro.org>
Tue, 2 Sep 2025 12:44:54 +0000 (13:44 +0100)
committerMark Brown <broonie@kernel.org>
Wed, 3 Sep 2025 13:30:29 +0000 (14:30 +0100)
This will allow us to return a status from the interrupt handler in a
later commit and avoids copying it at the end of
dspi_transfer_one_message(). For consistency make polling and DMA modes
use the same mechanism.

No functional changes intended.

Signed-off-by: James Clark <james.clark@linaro.org>
Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Reviewed-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Message-ID: <20250902-james-nxp-spi-dma-v6-2-f7aa2c5e56e2@linaro.org>
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/spi/spi-fsl-dspi.c

index 654905a358e85d4fff305a81c796cab4871fbc38..48054932d51713e71920a5958b65f6d55f243000 100644 (file)
@@ -591,11 +591,10 @@ static int dspi_next_xfer_dma_submit(struct fsl_dspi *dspi)
 
 static void dspi_setup_accel(struct fsl_dspi *dspi);
 
-static int dspi_dma_xfer(struct fsl_dspi *dspi)
+static void dspi_dma_xfer(struct fsl_dspi *dspi)
 {
        struct spi_message *message = dspi->cur_msg;
        struct device *dev = &dspi->pdev->dev;
-       int ret = 0;
 
        /*
         * dspi->len gets decremented by dspi_pop_tx_pushr in
@@ -612,14 +611,12 @@ static int dspi_dma_xfer(struct fsl_dspi *dspi)
                message->actual_length += dspi->words_in_flight *
                                          dspi->oper_word_size;
 
-               ret = dspi_next_xfer_dma_submit(dspi);
-               if (ret) {
+               message->status = dspi_next_xfer_dma_submit(dspi);
+               if (message->status) {
                        dev_err(dev, "DMA transfer failed\n");
                        break;
                }
        }
-
-       return ret;
 }
 
 static int dspi_request_dma(struct fsl_dspi *dspi, phys_addr_t phy_addr)
@@ -1005,7 +1002,7 @@ static bool dspi_rxtx(struct fsl_dspi *dspi)
        return true;
 }
 
-static int dspi_poll(struct fsl_dspi *dspi)
+static void dspi_poll(struct fsl_dspi *dspi)
 {
        int tries;
        int err = 0;
@@ -1024,7 +1021,7 @@ static int dspi_poll(struct fsl_dspi *dspi)
                }
        } while (dspi_rxtx(dspi));
 
-       return err;
+       dspi->cur_msg->status = err;
 }
 
 static irqreturn_t dspi_interrupt(int irq, void *dev_id)
@@ -1038,8 +1035,11 @@ static irqreturn_t dspi_interrupt(int irq, void *dev_id)
        if (!(spi_sr & SPI_SR_CMDTCF))
                return IRQ_NONE;
 
-       if (dspi_rxtx(dspi) == false)
+       if (dspi_rxtx(dspi) == false) {
+               if (dspi->cur_msg)
+                       WRITE_ONCE(dspi->cur_msg->status, 0);
                complete(&dspi->xfer_done);
+       }
 
        return IRQ_HANDLED;
 }
@@ -1069,7 +1069,6 @@ static int dspi_transfer_one_message(struct spi_controller *ctlr,
        struct spi_device *spi = message->spi;
        struct spi_transfer *transfer;
        bool cs = false;
-       int status = 0;
        u32 val = 0;
        bool cs_change = false;
 
@@ -1129,7 +1128,7 @@ static int dspi_transfer_one_message(struct spi_controller *ctlr,
                                       dspi->progress, !dspi->irq);
 
                if (dspi->devtype_data->trans_mode == DSPI_DMA_MODE) {
-                       status = dspi_dma_xfer(dspi);
+                       dspi_dma_xfer(dspi);
                } else {
                        /*
                         * Reinitialize the completion before transferring data
@@ -1143,13 +1142,12 @@ static int dspi_transfer_one_message(struct spi_controller *ctlr,
 
                        dspi_fifo_write(dspi);
 
-                       if (dspi->irq) {
+                       if (dspi->irq)
                                wait_for_completion(&dspi->xfer_done);
-                       } else {
-                               status = dspi_poll(dspi);
-                       }
+                       else
+                               dspi_poll(dspi);
                }
-               if (status)
+               if (READ_ONCE(message->status))
                        break;
 
                spi_transfer_delay_exec(transfer);
@@ -1158,7 +1156,8 @@ static int dspi_transfer_one_message(struct spi_controller *ctlr,
                        dspi_deassert_cs(spi, &cs);
        }
 
-       if (status || !cs_change) {
+       dspi->cur_msg = NULL;
+       if (message->status || !cs_change) {
                /* Put DSPI in stop mode */
                regmap_update_bits(dspi->regmap, SPI_MCR,
                                   SPI_MCR_HALT, SPI_MCR_HALT);
@@ -1167,10 +1166,9 @@ static int dspi_transfer_one_message(struct spi_controller *ctlr,
                        ;
        }
 
-       message->status = status;
        spi_finalize_current_message(ctlr);
 
-       return status;
+       return message->status;
 }
 
 static int dspi_set_mtf(struct fsl_dspi *dspi)