diff options
Diffstat (limited to 'drivers/spi/spi-bitbang.c')
| -rw-r--r-- | drivers/spi/spi-bitbang.c | 50 | 
1 files changed, 37 insertions, 13 deletions
| diff --git a/drivers/spi/spi-bitbang.c b/drivers/spi/spi-bitbang.c index 3aa9e6e3dac8..f29176000b8d 100644 --- a/drivers/spi/spi-bitbang.c +++ b/drivers/spi/spi-bitbang.c @@ -49,22 +49,26 @@  struct spi_bitbang_cs {  	unsigned	nsecs;	/* (clock cycle time)/2 */  	u32		(*txrx_word)(struct spi_device *spi, unsigned nsecs, -					u32 word, u8 bits); +					u32 word, u8 bits, unsigned flags);  	unsigned	(*txrx_bufs)(struct spi_device *,  					u32 (*txrx_word)(  						struct spi_device *spi,  						unsigned nsecs, -						u32 word, u8 bits), -					unsigned, struct spi_transfer *); +						u32 word, u8 bits, +						unsigned flags), +					unsigned, struct spi_transfer *, +					unsigned);  };  static unsigned bitbang_txrx_8(  	struct spi_device	*spi,  	u32			(*txrx_word)(struct spi_device *spi,  					unsigned nsecs, -					u32 word, u8 bits), +					u32 word, u8 bits, +					unsigned flags),  	unsigned		ns, -	struct spi_transfer	*t +	struct spi_transfer	*t, +	unsigned flags  ) {  	unsigned		bits = t->bits_per_word;  	unsigned		count = t->len; @@ -76,7 +80,7 @@ static unsigned bitbang_txrx_8(  		if (tx)  			word = *tx++; -		word = txrx_word(spi, ns, word, bits); +		word = txrx_word(spi, ns, word, bits, flags);  		if (rx)  			*rx++ = word;  		count -= 1; @@ -88,9 +92,11 @@ static unsigned bitbang_txrx_16(  	struct spi_device	*spi,  	u32			(*txrx_word)(struct spi_device *spi,  					unsigned nsecs, -					u32 word, u8 bits), +					u32 word, u8 bits, +					unsigned flags),  	unsigned		ns, -	struct spi_transfer	*t +	struct spi_transfer	*t, +	unsigned flags  ) {  	unsigned		bits = t->bits_per_word;  	unsigned		count = t->len; @@ -102,7 +108,7 @@ static unsigned bitbang_txrx_16(  		if (tx)  			word = *tx++; -		word = txrx_word(spi, ns, word, bits); +		word = txrx_word(spi, ns, word, bits, flags);  		if (rx)  			*rx++ = word;  		count -= 2; @@ -114,9 +120,11 @@ static unsigned bitbang_txrx_32(  	struct spi_device	*spi,  	u32			(*txrx_word)(struct spi_device *spi,  					unsigned nsecs, -					u32 word, u8 bits), +					u32 word, u8 bits, +					unsigned flags),  	unsigned		ns, -	struct spi_transfer	*t +	struct spi_transfer	*t, +	unsigned flags  ) {  	unsigned		bits = t->bits_per_word;  	unsigned		count = t->len; @@ -128,7 +136,7 @@ static unsigned bitbang_txrx_32(  		if (tx)  			word = *tx++; -		word = txrx_word(spi, ns, word, bits); +		word = txrx_word(spi, ns, word, bits, flags);  		if (rx)  			*rx++ = word;  		count -= 4; @@ -235,8 +243,24 @@ static int spi_bitbang_bufs(struct spi_device *spi, struct spi_transfer *t)  {  	struct spi_bitbang_cs	*cs = spi->controller_state;  	unsigned		nsecs = cs->nsecs; +	struct spi_bitbang	*bitbang; + +	bitbang = spi_master_get_devdata(spi->master); +	if (bitbang->set_line_direction) { +		int err; -	return cs->txrx_bufs(spi, cs->txrx_word, nsecs, t); +		err = bitbang->set_line_direction(spi, !!(t->tx_buf)); +		if (err < 0) +			return err; +	} + +	if (spi->mode & SPI_3WIRE) { +		unsigned flags; + +		flags = t->tx_buf ? SPI_MASTER_NO_RX : SPI_MASTER_NO_TX; +		return cs->txrx_bufs(spi, cs->txrx_word, nsecs, t, flags); +	} +	return cs->txrx_bufs(spi, cs->txrx_word, nsecs, t, 0);  }  /*----------------------------------------------------------------------*/ |