aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Brown <broonie@linaro.org>2013-07-10 09:57:26 -0400
committerMark Brown <broonie@linaro.org>2013-07-15 06:34:51 -0400
commita2fd4f9fa3b9f051550b36c4dfa74bc32bda24ee (patch)
treeb317a65457403d0e3175cd3fa36a66b6b2627527
parentad81f0545ef01ea651886dddac4bef6cec930092 (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.c7
-rw-r--r--include/linux/spi/spi.h6
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 */