spi: core: Validate length of the transfers in message
SPI transfer length should be multiple of SPI word size, where SPI word size should be power-of-two multiple Signed-off-by: Ivan T. Ivanov <iivanov@mm-sol.com> Signed-off-by: Mark Brown <broonie@linaro.org>
This commit is contained in:
parent
aec35f4ee6
commit
4d94bd21b3
|
@ -1617,6 +1617,7 @@ static int __spi_validate(struct spi_device *spi, struct spi_message *message)
|
|||
{
|
||||
struct spi_master *master = spi->master;
|
||||
struct spi_transfer *xfer;
|
||||
int w_size, n_words;
|
||||
|
||||
if (list_empty(&message->transfers))
|
||||
return -EINVAL;
|
||||
|
@ -1668,6 +1669,22 @@ static int __spi_validate(struct spi_device *spi, struct spi_message *message)
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
/*
|
||||
* SPI transfer length should be multiple of SPI word size
|
||||
* where SPI word size should be power-of-two multiple
|
||||
*/
|
||||
if (xfer->bits_per_word <= 8)
|
||||
w_size = 1;
|
||||
else if (xfer->bits_per_word <= 16)
|
||||
w_size = 2;
|
||||
else
|
||||
w_size = 4;
|
||||
|
||||
n_words = xfer->len / w_size;
|
||||
/* No partial transfers accepted */
|
||||
if (!n_words || xfer->len % w_size)
|
||||
return -EINVAL;
|
||||
|
||||
if (xfer->speed_hz && master->min_speed_hz &&
|
||||
xfer->speed_hz < master->min_speed_hz)
|
||||
return -EINVAL;
|
||||
|
|
Loading…
Reference in New Issue