]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
spi: fsl-dspi: Avoid using -EINPROGRESS error code
authorJames Clark <james.clark@linaro.org>
Tue, 2 Sep 2025 12:44:53 +0000 (13:44 +0100)
committerMark Brown <broonie@kernel.org>
Wed, 3 Sep 2025 13:30:28 +0000 (14:30 +0100)
Refactor dspi_rxtx() and dspi_poll() to not return -EINPROGRESS because
this isn't actually a status that is ever returned to the core layer but
some internal state. Use true/false return value on dspi_rxtx() for this
instead.

This will help separate internal vs external status for the later change
to store the external status directly in cur_msg->status.

No functional changes intended.

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

index 4bd4377551b5d283f542c735f030a5dc42bb083b..654905a358e85d4fff305a81c796cab4871fbc38 100644 (file)
@@ -986,36 +986,45 @@ static void dspi_fifo_write(struct fsl_dspi *dspi)
                                dspi->progress, !dspi->irq);
 }
 
-static int dspi_rxtx(struct fsl_dspi *dspi)
+/*
+ * Read the previous transfer from the FIFO and transmit the next one.
+ *
+ * Returns false if the buffer to be transmitted is empty, and true if there is
+ * still data to transmit.
+ */
+static bool dspi_rxtx(struct fsl_dspi *dspi)
 {
        dspi_fifo_read(dspi);
 
        if (!dspi->len)
                /* Success! */
-               return 0;
+               return false;
 
        dspi_fifo_write(dspi);
 
-       return -EINPROGRESS;
+       return true;
 }
 
 static int dspi_poll(struct fsl_dspi *dspi)
 {
-       int tries = 1000;
+       int tries;
+       int err = 0;
        u32 spi_sr;
 
        do {
-               regmap_read(dspi->regmap, SPI_SR, &spi_sr);
-               regmap_write(dspi->regmap, SPI_SR, spi_sr);
-
-               if (spi_sr & SPI_SR_CMDTCF)
+               for (tries = 1000; tries > 0; --tries) {
+                       regmap_read(dspi->regmap, SPI_SR, &spi_sr);
+                       regmap_write(dspi->regmap, SPI_SR, spi_sr);
+                       if (spi_sr & SPI_SR_CMDTCF)
+                               break;
+               }
+               if (!tries) {
+                       err = -ETIMEDOUT;
                        break;
-       } while (--tries);
-
-       if (!tries)
-               return -ETIMEDOUT;
+               }
+       } while (dspi_rxtx(dspi));
 
-       return dspi_rxtx(dspi);
+       return err;
 }
 
 static irqreturn_t dspi_interrupt(int irq, void *dev_id)
@@ -1029,7 +1038,7 @@ static irqreturn_t dspi_interrupt(int irq, void *dev_id)
        if (!(spi_sr & SPI_SR_CMDTCF))
                return IRQ_NONE;
 
-       if (dspi_rxtx(dspi) == 0)
+       if (dspi_rxtx(dspi) == false)
                complete(&dspi->xfer_done);
 
        return IRQ_HANDLED;
@@ -1137,9 +1146,7 @@ static int dspi_transfer_one_message(struct spi_controller *ctlr,
                        if (dspi->irq) {
                                wait_for_completion(&dspi->xfer_done);
                        } else {
-                               do {
-                                       status = dspi_poll(dspi);
-                               } while (status == -EINPROGRESS);
+                               status = dspi_poll(dspi);
                        }
                }
                if (status)