diff options
Diffstat (limited to 'drivers/spi/spi-fsl-dspi.c')
| -rw-r--r-- | drivers/spi/spi-fsl-dspi.c | 36 | 
1 files changed, 16 insertions, 20 deletions
diff --git a/drivers/spi/spi-fsl-dspi.c b/drivers/spi/spi-fsl-dspi.c index 442cff71a0d2..6ec2dcb8c57a 100644 --- a/drivers/spi/spi-fsl-dspi.c +++ b/drivers/spi/spi-fsl-dspi.c @@ -185,6 +185,7 @@ struct fsl_dspi {  	struct spi_transfer			*cur_transfer;  	struct spi_message			*cur_msg;  	struct chip_data			*cur_chip; +	size_t					progress;  	size_t					len;  	const void				*tx;  	void					*rx; @@ -395,17 +396,17 @@ static int dspi_request_dma(struct fsl_dspi *dspi, phys_addr_t phy_addr)  	if (!dma)  		return -ENOMEM; -	dma->chan_rx = dma_request_slave_channel(dev, "rx"); -	if (!dma->chan_rx) { +	dma->chan_rx = dma_request_chan(dev, "rx"); +	if (IS_ERR(dma->chan_rx)) {  		dev_err(dev, "rx dma channel not available\n"); -		ret = -ENODEV; +		ret = PTR_ERR(dma->chan_rx);  		return ret;  	} -	dma->chan_tx = dma_request_slave_channel(dev, "tx"); -	if (!dma->chan_tx) { +	dma->chan_tx = dma_request_chan(dev, "tx"); +	if (IS_ERR(dma->chan_tx)) {  		dev_err(dev, "tx dma channel not available\n"); -		ret = -ENODEV; +		ret = PTR_ERR(dma->chan_tx);  		goto err_tx_channel;  	} @@ -586,21 +587,14 @@ static void dspi_tcfq_write(struct fsl_dspi *dspi)  	dspi->tx_cmd |= SPI_PUSHR_CMD_CTCNT;  	if (dspi->devtype_data->xspi_mode && dspi->bits_per_word > 16) { -		/* Write two TX FIFO entries first, and then the corresponding -		 * CMD FIFO entry. +		/* Write the CMD FIFO entry first, and then the two +		 * corresponding TX FIFO entries.  		 */  		u32 data = dspi_pop_tx(dspi); -		if (dspi->cur_chip->ctar_val & SPI_CTAR_LSBFE) { -			/* LSB */ -			tx_fifo_write(dspi, data & 0xFFFF); -			tx_fifo_write(dspi, data >> 16); -		} else { -			/* MSB */ -			tx_fifo_write(dspi, data >> 16); -			tx_fifo_write(dspi, data & 0xFFFF); -		}  		cmd_fifo_write(dspi); +		tx_fifo_write(dspi, data & 0xFFFF); +		tx_fifo_write(dspi, data >> 16);  	} else {  		/* Write one entry to both TX FIFO and CMD FIFO  		 * simultaneously. @@ -658,7 +652,7 @@ static int dspi_rxtx(struct fsl_dspi *dspi)  	u32 spi_tcr;  	spi_take_timestamp_post(dspi->ctlr, dspi->cur_transfer, -				dspi->tx - dspi->bytes_per_word, !dspi->irq); +				dspi->progress, !dspi->irq);  	/* Get transfer counter (in number of SPI transfers). It was  	 * reset to 0 when transfer(s) were started. @@ -667,6 +661,7 @@ static int dspi_rxtx(struct fsl_dspi *dspi)  	spi_tcnt = SPI_TCR_GET_TCNT(spi_tcr);  	/* Update total number of bytes that were transferred */  	msg->actual_length += spi_tcnt * dspi->bytes_per_word; +	dspi->progress += spi_tcnt;  	trans_mode = dspi->devtype_data->trans_mode;  	if (trans_mode == DSPI_EOQ_MODE) @@ -679,7 +674,7 @@ static int dspi_rxtx(struct fsl_dspi *dspi)  		return 0;  	spi_take_timestamp_pre(dspi->ctlr, dspi->cur_transfer, -			       dspi->tx, !dspi->irq); +			       dspi->progress, !dspi->irq);  	if (trans_mode == DSPI_EOQ_MODE)  		dspi_eoq_write(dspi); @@ -768,6 +763,7 @@ static int dspi_transfer_one_message(struct spi_controller *ctlr,  		dspi->rx = transfer->rx_buf;  		dspi->rx_end = dspi->rx + transfer->len;  		dspi->len = transfer->len; +		dspi->progress = 0;  		/* Validated transfer specific frame size (defaults applied) */  		dspi->bits_per_word = transfer->bits_per_word;  		if (transfer->bits_per_word <= 8) @@ -789,7 +785,7 @@ static int dspi_transfer_one_message(struct spi_controller *ctlr,  				     SPI_CTARE_DTCP(1));  		spi_take_timestamp_pre(dspi->ctlr, dspi->cur_transfer, -				       dspi->tx, !dspi->irq); +				       dspi->progress, !dspi->irq);  		trans_mode = dspi->devtype_data->trans_mode;  		switch (trans_mode) {  | 

