]> git.karo-electronics.de Git - linux-beck.git/commitdiff
spi: expose master transfer size limitation.
authorMichal Suchanek <hramrach@gmail.com>
Wed, 2 Dec 2015 10:38:21 +0000 (10:38 +0000)
committerMark Brown <broonie@kernel.org>
Tue, 5 Jan 2016 16:33:54 +0000 (16:33 +0000)
On some SPI controllers it is not feasible to transfer arbitrary amount
of data at once.

When the limit on transfer size is a few kilobytes at least it makes
sense to use the SPI hardware rather than reverting to gpio driver.

The protocol drivers need a way to check that they do not sent overly
long messages, though.

Signed-off-by: Michal Suchanek <hramrach@gmail.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
include/linux/spi/spi.h

index cce80e6dc7d115960d8e2ac8833c752ce4a4369a..3eebc6c235fb27ea90699568251ba0670dad0d4d 100644 (file)
@@ -425,6 +425,12 @@ struct spi_master {
 #define SPI_MASTER_MUST_RX      BIT(3)         /* requires rx */
 #define SPI_MASTER_MUST_TX      BIT(4)         /* requires tx */
 
+       /*
+        * on some hardware transfer size may be constrained
+        * the limit may depend on device transfer settings
+        */
+       size_t (*max_transfer_size)(struct spi_device *spi);
+
        /* lock and mutex for SPI bus locking */
        spinlock_t              bus_lock_spinlock;
        struct mutex            bus_lock_mutex;
@@ -832,6 +838,15 @@ extern int spi_async(struct spi_device *spi, struct spi_message *message);
 extern int spi_async_locked(struct spi_device *spi,
                            struct spi_message *message);
 
+static inline size_t
+spi_max_transfer_size(struct spi_device *spi)
+{
+       struct spi_master *master = spi->master;
+       if (!master->max_transfer_size)
+               return SIZE_MAX;
+       return master->max_transfer_size(spi);
+}
+
 /*---------------------------------------------------------------------------*/
 
 /* All these synchronous SPI transfer routines are utilities layered