diff options
author | James Clark <james.clark@linaro.org> | 2025-09-02 13:44:53 +0100 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2025-09-03 14:30:28 +0100 |
commit | bfddd34d67a0402c0476b36fc1b1f373cd5b0054 (patch) | |
tree | fb3cfb353355a6330d5ebc7e9a24076dda010150 /drivers/spi/spi-fsl-dspi.c | |
parent | 431f6c88cb5d2d62d579d4d78f5c1a2583465ffb (diff) |
spi: fsl-dspi: Avoid using -EINPROGRESS error code
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>
Diffstat (limited to 'drivers/spi/spi-fsl-dspi.c')
-rw-r--r-- | drivers/spi/spi-fsl-dspi.c | 41 |
1 files changed, 24 insertions, 17 deletions
diff --git a/drivers/spi/spi-fsl-dspi.c b/drivers/spi/spi-fsl-dspi.c index 4bd4377551b5..654905a358e8 100644 --- a/drivers/spi/spi-fsl-dspi.c +++ b/drivers/spi/spi-fsl-dspi.c @@ -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) |