mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-16 17:23:55 +08:00
spi: check bits_per_word in spi_setup
This allows drivers for devices connected via SPI to check if the controller supports a given bits_per_word value during setup. Currently any BPW value is accepted durings setup, and transfers are rejected later. Signed-off-by: Stefan Brüns <stefan.bruens@rwth-aachen.de> Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
7dc9fbc342
commit
63ab645f4d
@ -1740,6 +1740,20 @@ EXPORT_SYMBOL_GPL(spi_busnum_to_master);
|
|||||||
* other core methods are currently defined as inline functions.
|
* other core methods are currently defined as inline functions.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
static int __spi_validate_bits_per_word(struct spi_master *master, u8 bits_per_word)
|
||||||
|
{
|
||||||
|
if (master->bits_per_word_mask) {
|
||||||
|
/* Only 32 bits fit in the mask */
|
||||||
|
if (bits_per_word > 32)
|
||||||
|
return -EINVAL;
|
||||||
|
if (!(master->bits_per_word_mask &
|
||||||
|
SPI_BPW_MASK(bits_per_word)))
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* spi_setup - setup SPI mode and clock rate
|
* spi_setup - setup SPI mode and clock rate
|
||||||
* @spi: the device whose settings are being modified
|
* @spi: the device whose settings are being modified
|
||||||
@ -1798,6 +1812,9 @@ int spi_setup(struct spi_device *spi)
|
|||||||
if (!spi->bits_per_word)
|
if (!spi->bits_per_word)
|
||||||
spi->bits_per_word = 8;
|
spi->bits_per_word = 8;
|
||||||
|
|
||||||
|
if (__spi_validate_bits_per_word(spi->master, spi->bits_per_word))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
if (!spi->max_speed_hz)
|
if (!spi->max_speed_hz)
|
||||||
spi->max_speed_hz = spi->master->max_speed_hz;
|
spi->max_speed_hz = spi->master->max_speed_hz;
|
||||||
|
|
||||||
@ -1867,14 +1884,8 @@ static int __spi_validate(struct spi_device *spi, struct spi_message *message)
|
|||||||
xfer->speed_hz > master->max_speed_hz)
|
xfer->speed_hz > master->max_speed_hz)
|
||||||
xfer->speed_hz = master->max_speed_hz;
|
xfer->speed_hz = master->max_speed_hz;
|
||||||
|
|
||||||
if (master->bits_per_word_mask) {
|
if (__spi_validate_bits_per_word(master, xfer->bits_per_word))
|
||||||
/* Only 32 bits fit in the mask */
|
return -EINVAL;
|
||||||
if (xfer->bits_per_word > 32)
|
|
||||||
return -EINVAL;
|
|
||||||
if (!(master->bits_per_word_mask &
|
|
||||||
BIT(xfer->bits_per_word - 1)))
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* SPI transfer length should be multiple of SPI word size
|
* SPI transfer length should be multiple of SPI word size
|
||||||
|
Loading…
Reference in New Issue
Block a user