diff options
Diffstat (limited to 'drivers/spi/spi-fsl-dspi.c')
| -rw-r--r-- | drivers/spi/spi-fsl-dspi.c | 36 | 
1 files changed, 17 insertions, 19 deletions
| diff --git a/drivers/spi/spi-fsl-dspi.c b/drivers/spi/spi-fsl-dspi.c index 654905a358e8..48054932d517 100644 --- a/drivers/spi/spi-fsl-dspi.c +++ b/drivers/spi/spi-fsl-dspi.c @@ -591,11 +591,10 @@ static int dspi_next_xfer_dma_submit(struct fsl_dspi *dspi)  static void dspi_setup_accel(struct fsl_dspi *dspi); -static int dspi_dma_xfer(struct fsl_dspi *dspi) +static void dspi_dma_xfer(struct fsl_dspi *dspi)  {  	struct spi_message *message = dspi->cur_msg;  	struct device *dev = &dspi->pdev->dev; -	int ret = 0;  	/*  	 * dspi->len gets decremented by dspi_pop_tx_pushr in @@ -612,14 +611,12 @@ static int dspi_dma_xfer(struct fsl_dspi *dspi)  		message->actual_length += dspi->words_in_flight *  					  dspi->oper_word_size; -		ret = dspi_next_xfer_dma_submit(dspi); -		if (ret) { +		message->status = dspi_next_xfer_dma_submit(dspi); +		if (message->status) {  			dev_err(dev, "DMA transfer failed\n");  			break;  		}  	} - -	return ret;  }  static int dspi_request_dma(struct fsl_dspi *dspi, phys_addr_t phy_addr) @@ -1005,7 +1002,7 @@ static bool dspi_rxtx(struct fsl_dspi *dspi)  	return true;  } -static int dspi_poll(struct fsl_dspi *dspi) +static void dspi_poll(struct fsl_dspi *dspi)  {  	int tries;  	int err = 0; @@ -1024,7 +1021,7 @@ static int dspi_poll(struct fsl_dspi *dspi)  		}  	} while (dspi_rxtx(dspi)); -	return err; +	dspi->cur_msg->status = err;  }  static irqreturn_t dspi_interrupt(int irq, void *dev_id) @@ -1038,8 +1035,11 @@ static irqreturn_t dspi_interrupt(int irq, void *dev_id)  	if (!(spi_sr & SPI_SR_CMDTCF))  		return IRQ_NONE; -	if (dspi_rxtx(dspi) == false) +	if (dspi_rxtx(dspi) == false) { +		if (dspi->cur_msg) +			WRITE_ONCE(dspi->cur_msg->status, 0);  		complete(&dspi->xfer_done); +	}  	return IRQ_HANDLED;  } @@ -1069,7 +1069,6 @@ static int dspi_transfer_one_message(struct spi_controller *ctlr,  	struct spi_device *spi = message->spi;  	struct spi_transfer *transfer;  	bool cs = false; -	int status = 0;  	u32 val = 0;  	bool cs_change = false; @@ -1129,7 +1128,7 @@ static int dspi_transfer_one_message(struct spi_controller *ctlr,  				       dspi->progress, !dspi->irq);  		if (dspi->devtype_data->trans_mode == DSPI_DMA_MODE) { -			status = dspi_dma_xfer(dspi); +			dspi_dma_xfer(dspi);  		} else {  			/*  			 * Reinitialize the completion before transferring data @@ -1143,13 +1142,12 @@ static int dspi_transfer_one_message(struct spi_controller *ctlr,  			dspi_fifo_write(dspi); -			if (dspi->irq) { +			if (dspi->irq)  				wait_for_completion(&dspi->xfer_done); -			} else { -				status = dspi_poll(dspi); -			} +			else +				dspi_poll(dspi);  		} -		if (status) +		if (READ_ONCE(message->status))  			break;  		spi_transfer_delay_exec(transfer); @@ -1158,7 +1156,8 @@ static int dspi_transfer_one_message(struct spi_controller *ctlr,  			dspi_deassert_cs(spi, &cs);  	} -	if (status || !cs_change) { +	dspi->cur_msg = NULL; +	if (message->status || !cs_change) {  		/* Put DSPI in stop mode */  		regmap_update_bits(dspi->regmap, SPI_MCR,  				   SPI_MCR_HALT, SPI_MCR_HALT); @@ -1167,10 +1166,9 @@ static int dspi_transfer_one_message(struct spi_controller *ctlr,  			;  	} -	message->status = status;  	spi_finalize_current_message(ctlr); -	return status; +	return message->status;  }  static int dspi_set_mtf(struct fsl_dspi *dspi) | 
