Skip to content

Commit

Permalink
spi: core: Validate length of the transfers in message
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Ivan T. Ivanov authored and Mark Brown committed Feb 22, 2014
1 parent aec35f4 commit 4d94bd2
Showing 1 changed file with 17 additions and 0 deletions.
17 changes: 17 additions & 0 deletions drivers/spi/spi.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit 4d94bd2

Please sign in to comment.