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 | |
| 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>
| -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) | 
