Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

spi: sc18is602: implement .max_{transfer,message}_size() for the controller

Allow SPI peripherals attached to this controller to know what is the
maximum transfer size and message size, so they can limit their transfer
lengths properly in case they are otherwise capable of larger transfer
sizes. For the sc18is602, this is 200 bytes in both cases, since as far
as I understand, it isn't possible to tell the controller to keep the
chip select asserted after the STOP command is sent.

The controller can support SPI messages larger than 200 bytes if
cs_change is set for individual transfers such that the portions with
chip select asserted are never longer than 200 bytes. What is not
supported is just SPI messages with a continuous chip select larger than
200. I don't think it is possible to express this using the current API,
so drivers which do send SPI messages with cs_change can safely just
look at the max_transfer_size limit.

An example of user for this is sja1105_xfer() in
drivers/net/dsa/sja1105/sja1105_spi.c which sends by default 64 * 4 =
256 byte transfers.

Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Link: https://lore.kernel.org/r/20210520131238.2903024-3-olteanv@gmail.com
Signed-off-by: Mark Brown <broonie@kernel.org>

authored by

Vladimir Oltean and committed by
Mark Brown
b4e46c99 bda7db1d

+7
+7
drivers/spi/spi-sc18is602.c
··· 219 219 return status; 220 220 } 221 221 222 + static size_t sc18is602_max_transfer_size(struct spi_device *spi) 223 + { 224 + return SC18IS602_BUFSIZ; 225 + } 226 + 222 227 static int sc18is602_setup(struct spi_device *spi) 223 228 { 224 229 struct sc18is602 *hw = spi_master_get_devdata(spi->master); ··· 298 293 master->bits_per_word_mask = SPI_BPW_MASK(8); 299 294 master->setup = sc18is602_setup; 300 295 master->transfer_one_message = sc18is602_transfer_one; 296 + master->max_transfer_size = sc18is602_max_transfer_size; 297 + master->max_message_size = sc18is602_max_transfer_size; 301 298 master->dev.of_node = np; 302 299 master->min_speed_hz = hw->freq / 128; 303 300 master->max_speed_hz = hw->freq / 4;