76a66a3bb7574e0ed84d889ebf4da5a3371ae40a
[openwrt/staging/adrian.git] /
1 From 5090cc6ae2f79ee779e5faf7c8a28edf42b7d738 Mon Sep 17 00:00:00 2001
2 From: Heiner Kallweit <hkallweit1@gmail.com>
3 Date: Wed, 17 Aug 2016 21:08:01 +0200
4 Subject: [PATCH] spi: introduce max_message_size hook in spi_master
5
6 Recently a maximum transfer size was was introduced in struct spi_master.
7 However there are also spi controllers with a maximum message size, e.g.
8 fsl-espi has a max message size of 64KB.
9 Introduce a hook max_message_size to deal with such limitations.
10
11 Also make sure that spi_max_transfer_size doesn't return greater values
12 than spi_max_message_size, even if hook max_transfer_size is not set.
13
14 Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
15 Signed-off-by: Mark Brown <broonie@kernel.org>
16 ---
17 include/linux/spi/spi.h | 25 +++++++++++++++++++++----
18 1 file changed, 21 insertions(+), 4 deletions(-)
19
20 --- a/include/linux/spi/spi.h
21 +++ b/include/linux/spi/spi.h
22 @@ -304,6 +304,8 @@ static inline void spi_unregister_driver
23 * @min_speed_hz: Lowest supported transfer speed
24 * @max_speed_hz: Highest supported transfer speed
25 * @flags: other constraints relevant to this driver
26 + * @max_message_size: function that returns the max message size for
27 + * a &spi_device; may be %NULL, so the default %SIZE_MAX will be used.
28 * @bus_lock_spinlock: spinlock for SPI bus locking
29 * @bus_lock_mutex: mutex for SPI bus locking
30 * @bus_lock_flag: indicates that the SPI bus is locked for exclusive use
31 @@ -429,10 +431,11 @@ struct spi_master {
32 #define SPI_MASTER_MUST_TX BIT(4) /* requires tx */
33
34 /*
35 - * on some hardware transfer size may be constrained
36 + * on some hardware transfer / message size may be constrained
37 * the limit may depend on device transfer settings
38 */
39 size_t (*max_transfer_size)(struct spi_device *spi);
40 + size_t (*max_message_size)(struct spi_device *spi);
41
42 /* lock and mutex for SPI bus locking */
43 spinlock_t bus_lock_spinlock;
44 @@ -844,12 +847,26 @@ extern int spi_async_locked(struct spi_d
45 struct spi_message *message);
46
47 static inline size_t
48 -spi_max_transfer_size(struct spi_device *spi)
49 +spi_max_message_size(struct spi_device *spi)
50 {
51 struct spi_master *master = spi->master;
52 - if (!master->max_transfer_size)
53 + if (!master->max_message_size)
54 return SIZE_MAX;
55 - return master->max_transfer_size(spi);
56 + return master->max_message_size(spi);
57 +}
58 +
59 +static inline size_t
60 +spi_max_transfer_size(struct spi_device *spi)
61 +{
62 + struct spi_master *master = spi->master;
63 + size_t tr_max = SIZE_MAX;
64 + size_t msg_max = spi_max_message_size(spi);
65 +
66 + if (master->max_transfer_size)
67 + tr_max = master->max_transfer_size(spi);
68 +
69 + /* transfer size limit must not be greater than messsage size limit */
70 + return min(tr_max, msg_max);
71 }
72
73 /*---------------------------------------------------------------------------*/