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