diff options
Diffstat (limited to 'target/linux/brcm63xx/patches-4.4/000-4.9-01-spi-introduce-max_message_size-hook-in-spi_master.patch')
-rw-r--r-- | target/linux/brcm63xx/patches-4.4/000-4.9-01-spi-introduce-max_message_size-hook-in-spi_master.patch | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/target/linux/brcm63xx/patches-4.4/000-4.9-01-spi-introduce-max_message_size-hook-in-spi_master.patch b/target/linux/brcm63xx/patches-4.4/000-4.9-01-spi-introduce-max_message_size-hook-in-spi_master.patch new file mode 100644 index 0000000000..76a66a3bb7 --- /dev/null +++ b/target/linux/brcm63xx/patches-4.4/000-4.9-01-spi-introduce-max_message_size-hook-in-spi_master.patch @@ -0,0 +1,73 @@ +From 5090cc6ae2f79ee779e5faf7c8a28edf42b7d738 Mon Sep 17 00:00:00 2001 +From: Heiner Kallweit <hkallweit1@gmail.com> +Date: Wed, 17 Aug 2016 21:08:01 +0200 +Subject: [PATCH] spi: introduce max_message_size hook in spi_master + +Recently a maximum transfer size was was introduced in struct spi_master. +However there are also spi controllers with a maximum message size, e.g. +fsl-espi has a max message size of 64KB. +Introduce a hook max_message_size to deal with such limitations. + +Also make sure that spi_max_transfer_size doesn't return greater values +than spi_max_message_size, even if hook max_transfer_size is not set. + +Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com> +Signed-off-by: Mark Brown <broonie@kernel.org> +--- + include/linux/spi/spi.h | 25 +++++++++++++++++++++---- + 1 file changed, 21 insertions(+), 4 deletions(-) + +--- a/include/linux/spi/spi.h ++++ b/include/linux/spi/spi.h +@@ -304,6 +304,8 @@ static inline void spi_unregister_driver + * @min_speed_hz: Lowest supported transfer speed + * @max_speed_hz: Highest supported transfer speed + * @flags: other constraints relevant to this driver ++ * @max_message_size: function that returns the max message size for ++ * a &spi_device; may be %NULL, so the default %SIZE_MAX will be used. + * @bus_lock_spinlock: spinlock for SPI bus locking + * @bus_lock_mutex: mutex for SPI bus locking + * @bus_lock_flag: indicates that the SPI bus is locked for exclusive use +@@ -429,10 +431,11 @@ struct spi_master { + #define SPI_MASTER_MUST_TX BIT(4) /* requires tx */ + + /* +- * on some hardware transfer size may be constrained ++ * on some hardware transfer / message size may be constrained + * the limit may depend on device transfer settings + */ + size_t (*max_transfer_size)(struct spi_device *spi); ++ size_t (*max_message_size)(struct spi_device *spi); + + /* lock and mutex for SPI bus locking */ + spinlock_t bus_lock_spinlock; +@@ -844,12 +847,26 @@ extern int spi_async_locked(struct spi_d + struct spi_message *message); + + static inline size_t +-spi_max_transfer_size(struct spi_device *spi) ++spi_max_message_size(struct spi_device *spi) + { + struct spi_master *master = spi->master; +- if (!master->max_transfer_size) ++ if (!master->max_message_size) + return SIZE_MAX; +- return master->max_transfer_size(spi); ++ return master->max_message_size(spi); ++} ++ ++static inline size_t ++spi_max_transfer_size(struct spi_device *spi) ++{ ++ struct spi_master *master = spi->master; ++ size_t tr_max = SIZE_MAX; ++ size_t msg_max = spi_max_message_size(spi); ++ ++ if (master->max_transfer_size) ++ tr_max = master->max_transfer_size(spi); ++ ++ /* transfer size limit must not be greater than messsage size limit */ ++ return min(tr_max, msg_max); + } + + /*---------------------------------------------------------------------------*/ |