diff options
Diffstat (limited to 'drivers/spi/spi.c')
| -rw-r--r-- | drivers/spi/spi.c | 16 | 
1 files changed, 13 insertions, 3 deletions
diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c index 1587a4a5ff4..f1217ae59f3 100644 --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c @@ -1204,7 +1204,7 @@ EXPORT_SYMBOL_GPL(spi_busnum_to_master);  int spi_setup(struct spi_device *spi)  {  	unsigned	bad_bits; -	int		status; +	int		status = 0;  	/* help drivers fail *cleanly* when they need options  	 * that aren't supported with their current master @@ -1219,7 +1219,8 @@ int spi_setup(struct spi_device *spi)  	if (!spi->bits_per_word)  		spi->bits_per_word = 8; -	status = spi->master->setup(spi); +	if (spi->master->setup) +		status = spi->master->setup(spi);  	dev_dbg(&spi->dev, "setup mode %d, %s%s%s%s"  				"%u bits/w, %u Hz max --> %d\n", @@ -1238,6 +1239,7 @@ EXPORT_SYMBOL_GPL(spi_setup);  static int __spi_async(struct spi_device *spi, struct spi_message *message)  {  	struct spi_master *master = spi->master; +	struct spi_transfer *xfer;  	/* Half-duplex links include original MicroWire, and ones with  	 * only one data pin like SPI_3WIRE (switches direction) or where @@ -1246,7 +1248,6 @@ static int __spi_async(struct spi_device *spi, struct spi_message *message)  	 */  	if ((master->flags & SPI_MASTER_HALF_DUPLEX)  			|| (spi->mode & SPI_3WIRE)) { -		struct spi_transfer *xfer;  		unsigned flags = master->flags;  		list_for_each_entry(xfer, &message->transfers, transfer_list) { @@ -1259,6 +1260,15 @@ static int __spi_async(struct spi_device *spi, struct spi_message *message)  		}  	} +	/** +	 * Set transfer bits_per_word as spi device default if it is not +	 * set for this transfer. +	 */ +	list_for_each_entry(xfer, &message->transfers, transfer_list) { +		if (!xfer->bits_per_word) +			xfer->bits_per_word = spi->bits_per_word; +	} +  	message->spi = spi;  	message->status = -EINPROGRESS;  	return master->transfer(spi, message);  |