diff options
| -rw-r--r-- | drivers/spi/spi.c | 8 | ||||
| -rw-r--r-- | include/linux/spi/spi.h | 8 | 
2 files changed, 16 insertions, 0 deletions
diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c index f996c600eb8..0cabf156055 100644 --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c @@ -1377,6 +1377,14 @@ static int __spi_async(struct spi_device *spi, struct spi_message *message)  			xfer->bits_per_word = spi->bits_per_word;  		if (!xfer->speed_hz)  			xfer->speed_hz = spi->max_speed_hz; +		if (master->bits_per_word_mask) { +			/* Only 32 bits fit in the mask */ +			if (xfer->bits_per_word > 32) +				return -EINVAL; +			if (!(master->bits_per_word_mask & +					BIT(xfer->bits_per_word - 1))) +				return -EINVAL; +		}  	}  	message->spi = spi; diff --git a/include/linux/spi/spi.h b/include/linux/spi/spi.h index 38c2b925923..733eb5ee31c 100644 --- a/include/linux/spi/spi.h +++ b/include/linux/spi/spi.h @@ -228,6 +228,11 @@ static inline void spi_unregister_driver(struct spi_driver *sdrv)   *	every chipselect is connected to a slave.   * @dma_alignment: SPI controller constraint on DMA buffers alignment.   * @mode_bits: flags understood by this controller driver + * @bits_per_word_mask: A mask indicating which values of bits_per_word are + *	supported by the driver. Bit n indicates that a bits_per_word n+1 is + *	suported. If set, the SPI core will reject any transfer with an + *	unsupported bits_per_word. If not set, this value is simply ignored, + *	and it's up to the individual driver to perform any validation.   * @flags: other constraints relevant to this driver   * @bus_lock_spinlock: spinlock for SPI bus locking   * @bus_lock_mutex: mutex for SPI bus locking @@ -301,6 +306,9 @@ struct spi_master {  	/* spi_device.mode flags understood by this controller driver */  	u16			mode_bits; +	/* bitmask of supported bits_per_word for transfers */ +	u32			bits_per_word_mask; +  	/* other constraints relevant to this driver */  	u16			flags;  #define SPI_MASTER_HALF_DUPLEX	BIT(0)		/* can't do full duplex */  |