diff options
Diffstat (limited to 'drivers/spi/tegra114_spi.c')
| -rw-r--r-- | drivers/spi/tegra114_spi.c | 21 | 
1 files changed, 8 insertions, 13 deletions
| diff --git a/drivers/spi/tegra114_spi.c b/drivers/spi/tegra114_spi.c index 4d2af483d..810fa4718 100644 --- a/drivers/spi/tegra114_spi.c +++ b/drivers/spi/tegra114_spi.c @@ -289,9 +289,6 @@ int tegra114_spi_xfer(struct spi_slave *slave, unsigned int bitlen,  	reg = readl(®s->fifo_status);  	writel(reg, ®s->fifo_status); -	/* clear ready bit */ -	setbits_le32(®s->xfer_status, SPI_XFER_STS_RDY); -  	clrsetbits_le32(®s->command1, SPI_CMD1_CS_SW_VAL,  			SPI_CMD1_RX_EN | SPI_CMD1_TX_EN | SPI_CMD1_LSBY_FE |  			(slave->cs << SPI_CMD1_CS_SEL_SHIFT)); @@ -305,7 +302,6 @@ int tegra114_spi_xfer(struct spi_slave *slave, unsigned int bitlen,  	/* handle data in 32-bit chunks */  	while (num_bytes > 0) {  		int bytes; -		int is_read = 0;  		int tm, i;  		tmpdout = 0; @@ -319,6 +315,9 @@ int tegra114_spi_xfer(struct spi_slave *slave, unsigned int bitlen,  		num_bytes -= bytes; +		/* clear ready bit */ +		setbits_le32(®s->xfer_status, SPI_XFER_STS_RDY); +  		clrsetbits_le32(®s->command1,  				SPI_CMD1_BIT_LEN_MASK << SPI_CMD1_BIT_LEN_SHIFT,  				(bytes * 8 - 1) << SPI_CMD1_BIT_LEN_SHIFT); @@ -329,20 +328,14 @@ int tegra114_spi_xfer(struct spi_slave *slave, unsigned int bitlen,  		 * Wait for SPI transmit FIFO to empty, or to time out.  		 * The RX FIFO status will be read and cleared last  		 */ -		for (tm = 0, is_read = 0; tm < SPI_TIMEOUT; ++tm) { +		for (tm = 0; tm < SPI_TIMEOUT; ++tm) {  			u32 fifo_status, xfer_status; -			fifo_status = readl(®s->fifo_status); - -			/* We can exit when we've had both RX and TX activity */ -			if (is_read && -			    (fifo_status & SPI_FIFO_STS_TX_FIFO_EMPTY)) -				break; -  			xfer_status = readl(®s->xfer_status);  			if (!(xfer_status & SPI_XFER_STS_RDY))  				continue; +			fifo_status = readl(®s->fifo_status);  			if (fifo_status & SPI_FIFO_STS_ERR) {  				debug("%s: got a fifo error: ", __func__);  				if (fifo_status & SPI_FIFO_STS_TX_FIFO_OVF) @@ -367,7 +360,6 @@ int tegra114_spi_xfer(struct spi_slave *slave, unsigned int bitlen,  			if (!(fifo_status & SPI_FIFO_STS_RX_FIFO_EMPTY)) {  				tmpdin = readl(®s->rx_fifo); -				is_read = 1;  				/* swap bytes read in */  				if (din != NULL) { @@ -377,6 +369,9 @@ int tegra114_spi_xfer(struct spi_slave *slave, unsigned int bitlen,  					}  					din += bytes;  				} + +				/* We can exit when we've had both RX and TX */ +				break;  			}  		} |