diff options
author | Mark Brown <broonie@linaro.org> | 2013-09-01 13:48:48 +0100 |
---|---|---|
committer | Mark Brown <broonie@linaro.org> | 2013-09-01 13:48:48 +0100 |
commit | db04e17055c2d912a847f02a10deee1d82f96300 (patch) | |
tree | 532d5ad54f9bef73689dd481445b377f6a7f6735 /drivers/spi | |
parent | 788a73967658ff9ccbca6fffd51c213702bfc01d (diff) | |
parent | 56ede94a000bb9635b326db38baf66da6dfc174e (diff) | |
download | linux-db04e17055c2d912a847f02a10deee1d82f96300.tar.bz2 |
Merge remote-tracking branch 'spi/topic/checks' into spi-next
Diffstat (limited to 'drivers/spi')
-rw-r--r-- | drivers/spi/spi.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c index 978dda2c5239..2a20c32c8277 100644 --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c @@ -1351,6 +1351,11 @@ static int __spi_async(struct spi_device *spi, struct spi_message *message) struct spi_master *master = spi->master; struct spi_transfer *xfer; + if (list_empty(&message->transfers)) + return -EINVAL; + if (!message->complete) + return -EINVAL; + /* Half-duplex links include original MicroWire, and ones with * only one data pin like SPI_3WIRE (switches direction) or where * either MOSI or MISO is missing. They can also be caused by @@ -1377,8 +1382,13 @@ static int __spi_async(struct spi_device *spi, struct spi_message *message) list_for_each_entry(xfer, &message->transfers, transfer_list) { if (!xfer->bits_per_word) xfer->bits_per_word = spi->bits_per_word; - if (!xfer->speed_hz) + if (!xfer->speed_hz) { xfer->speed_hz = spi->max_speed_hz; + if (master->max_speed_hz && + xfer->speed_hz > master->max_speed_hz) + xfer->speed_hz = master->max_speed_hz; + } + if (master->bits_per_word_mask) { /* Only 32 bits fit in the mask */ if (xfer->bits_per_word > 32) @@ -1387,6 +1397,13 @@ static int __spi_async(struct spi_device *spi, struct spi_message *message) BIT(xfer->bits_per_word - 1))) return -EINVAL; } + + if (xfer->speed_hz && master->min_speed_hz && + xfer->speed_hz < master->min_speed_hz) + return -EINVAL; + if (xfer->speed_hz && master->max_speed_hz && + xfer->speed_hz > master->max_speed_hz) + return -EINVAL; } message->spi = spi; |