diff options
Diffstat (limited to 'drivers/spi/spi-bitbang-txrx.h')
| -rw-r--r-- | drivers/spi/spi-bitbang-txrx.h | 18 | 
1 files changed, 14 insertions, 4 deletions
| diff --git a/drivers/spi/spi-bitbang-txrx.h b/drivers/spi/spi-bitbang-txrx.h index c616e41521be..06b34e5bcfa3 100644 --- a/drivers/spi/spi-bitbang-txrx.h +++ b/drivers/spi/spi-bitbang-txrx.h @@ -49,12 +49,17 @@ bitbang_txrx_be_cpha0(struct spi_device *spi,  {  	/* if (cpol == 0) this is SPI_MODE_0; else this is SPI_MODE_2 */ +	bool oldbit = !(word & 1);  	/* clock starts at inactive polarity */  	for (word <<= (32 - bits); likely(bits); bits--) {  		/* setup MSB (to slave) on trailing edge */ -		if ((flags & SPI_MASTER_NO_TX) == 0) -			setmosi(spi, word & (1 << 31)); +		if ((flags & SPI_MASTER_NO_TX) == 0) { +			if ((word & (1 << 31)) != oldbit) { +				setmosi(spi, word & (1 << 31)); +				oldbit = word & (1 << 31); +			} +		}  		spidelay(nsecs);	/* T(setup) */  		setsck(spi, !cpol); @@ -76,13 +81,18 @@ bitbang_txrx_be_cpha1(struct spi_device *spi,  {  	/* if (cpol == 0) this is SPI_MODE_1; else this is SPI_MODE_3 */ +	bool oldbit = !(word & (1 << 31));  	/* clock starts at inactive polarity */  	for (word <<= (32 - bits); likely(bits); bits--) {  		/* setup MSB (to slave) on leading edge */  		setsck(spi, !cpol); -		if ((flags & SPI_MASTER_NO_TX) == 0) -			setmosi(spi, word & (1 << 31)); +		if ((flags & SPI_MASTER_NO_TX) == 0) { +			if ((word & (1 << 31)) != oldbit) { +				setmosi(spi, word & (1 << 31)); +				oldbit = word & (1 << 31); +			} +		}  		spidelay(nsecs); /* T(setup) */  		setsck(spi, cpol); |