diff options
author | Mark Brown <broonie@linaro.org> | 2013-07-10 09:57:26 -0400 |
---|---|---|
committer | Mark Brown <broonie@linaro.org> | 2013-07-15 06:34:51 -0400 |
commit | a2fd4f9fa3b9f051550b36c4dfa74bc32bda24ee (patch) | |
tree | b317a65457403d0e3175cd3fa36a66b6b2627527 | |
parent | ad81f0545ef01ea651886dddac4bef6cec930092 (diff) |
spi: Support transfer speed checking in the core
Allow drivers to avoid implementing their own checks for simple rates by
specifying the limits in the master structure.
Signed-off-by: Mark Brown <broonie@linaro.org>
-rw-r--r-- | drivers/spi/spi.c | 7 | ||||
-rw-r--r-- | include/linux/spi/spi.h | 6 |
2 files changed, 13 insertions, 0 deletions
diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c index 978dda2c5239..a52f16685d6a 100644 --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c | |||
@@ -1387,6 +1387,13 @@ static int __spi_async(struct spi_device *spi, struct spi_message *message) | |||
1387 | BIT(xfer->bits_per_word - 1))) | 1387 | BIT(xfer->bits_per_word - 1))) |
1388 | return -EINVAL; | 1388 | return -EINVAL; |
1389 | } | 1389 | } |
1390 | |||
1391 | if (xfer->speed_hz && master->min_speed_hz && | ||
1392 | xfer->speed_hz < master->min_speed_hz) | ||
1393 | return -EINVAL; | ||
1394 | if (xfer->speed_hz && master->max_speed_hz && | ||
1395 | xfer->speed_hz > master->max_speed_hz) | ||
1396 | return -EINVAL; | ||
1390 | } | 1397 | } |
1391 | 1398 | ||
1392 | message->spi = spi; | 1399 | message->spi = spi; |
diff --git a/include/linux/spi/spi.h b/include/linux/spi/spi.h index 28e440be1c07..cdf668156154 100644 --- a/include/linux/spi/spi.h +++ b/include/linux/spi/spi.h | |||
@@ -233,6 +233,8 @@ static inline void spi_unregister_driver(struct spi_driver *sdrv) | |||
233 | * suported. If set, the SPI core will reject any transfer with an | 233 | * suported. If set, the SPI core will reject any transfer with an |
234 | * unsupported bits_per_word. If not set, this value is simply ignored, | 234 | * unsupported bits_per_word. If not set, this value is simply ignored, |
235 | * and it's up to the individual driver to perform any validation. | 235 | * and it's up to the individual driver to perform any validation. |
236 | * @min_speed_hz: Lowest supported transfer speed | ||
237 | * @max_speed_hz: Highest supported transfer speed | ||
236 | * @flags: other constraints relevant to this driver | 238 | * @flags: other constraints relevant to this driver |
237 | * @bus_lock_spinlock: spinlock for SPI bus locking | 239 | * @bus_lock_spinlock: spinlock for SPI bus locking |
238 | * @bus_lock_mutex: mutex for SPI bus locking | 240 | * @bus_lock_mutex: mutex for SPI bus locking |
@@ -312,6 +314,10 @@ struct spi_master { | |||
312 | #define SPI_BIT_MASK(bits) (((bits) == 32) ? ~0UL : (BIT(bits) - 1)) | 314 | #define SPI_BIT_MASK(bits) (((bits) == 32) ? ~0UL : (BIT(bits) - 1)) |
313 | #define SPI_BPW_RANGE_MASK(min, max) (SPI_BIT_MASK(max) - SPI_BIT_MASK(min - 1)) | 315 | #define SPI_BPW_RANGE_MASK(min, max) (SPI_BIT_MASK(max) - SPI_BIT_MASK(min - 1)) |
314 | 316 | ||
317 | /* limits on transfer speed */ | ||
318 | u32 min_speed_hz; | ||
319 | u32 max_speed_hz; | ||
320 | |||
315 | /* other constraints relevant to this driver */ | 321 | /* other constraints relevant to this driver */ |
316 | u16 flags; | 322 | u16 flags; |
317 | #define SPI_MASTER_HALF_DUPLEX BIT(0) /* can't do full duplex */ | 323 | #define SPI_MASTER_HALF_DUPLEX BIT(0) /* can't do full duplex */ |