>From 44aad50011575e720633ad1d733fd053e4a862b4 Mon Sep 17 00:00:00 2001 From: James Clark Date: Fri, 27 Jun 2025 23:53:55 +0300 Subject: [PATCH 1/3] spi: fsl-dspi: avoid using -EINPROGRESS error code THIS IS BUGGY because it changes the logic. More info in the next patch, together with which it should be squashed. Refactor dspi_rxtx() and dspi_poll() to not return -EINPROGRESS because this isn't actually a status that was ever returned to the core layer but some internal state. Wherever that was used we can look at dspi->len instead. No functional changes intended. Signed-off-by: James Clark Signed-off-by: Vladimir Oltean --- drivers/spi/spi-fsl-dspi.c | 38 ++++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/drivers/spi/spi-fsl-dspi.c b/drivers/spi/spi-fsl-dspi.c index 4bd4377551b5..c0a6c6c6459e 100644 --- a/drivers/spi/spi-fsl-dspi.c +++ b/drivers/spi/spi-fsl-dspi.c @@ -986,36 +986,38 @@ static void dspi_fifo_write(struct fsl_dspi *dspi) dspi->progress, !dspi->irq); } -static int dspi_rxtx(struct fsl_dspi *dspi) +static void dspi_rxtx(struct fsl_dspi *dspi) { dspi_fifo_read(dspi); if (!dspi->len) /* Success! */ - return 0; + return; dspi_fifo_write(dspi); - - return -EINPROGRESS; } static int dspi_poll(struct fsl_dspi *dspi) { int tries = 1000; + 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) + while (dspi->len) { + 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; + } + dspi_rxtx(dspi); + } - return dspi_rxtx(dspi); + return err; } static irqreturn_t dspi_interrupt(int irq, void *dev_id) @@ -1029,7 +1031,9 @@ static irqreturn_t dspi_interrupt(int irq, void *dev_id) if (!(spi_sr & SPI_SR_CMDTCF)) return IRQ_NONE; - if (dspi_rxtx(dspi) == 0) + dspi_rxtx(dspi); + + if (!dspi->len) complete(&dspi->xfer_done); return IRQ_HANDLED; @@ -1137,9 +1141,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) -- 2.34.1