[U-Boot,v8,03/12] drivers: spi: allow limiting reads

Message ID 20180111171133.22779-4-noltari@gmail.com
State Superseded, archived
Delegated to: Daniel Schwierzeck
Headers show
  • mips: bmips: add SPI support
Related show

Commit Message

Álvaro Fernández Rojas Jan. 11, 2018, 5:11 p.m.
For some SPI controllers it's not possible to keep the CS active between
transfers and they are limited to a known number of bytes.
This splits spi_flash reads into different iterations in order to respect
the SPI controller limits.

Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Daniel Schwierzeck <daniel.schwierzeck@gmail.com>
Reviewed-by: Jagan Teki <jagan@openedev.com>
 v8: no changes
 v7: no changes
 v6: no changes
 v5: no changes
 v4: no changes
 v3: no changes
 v2: no changes

 drivers/mtd/spi/spi_flash.c | 3 +++
 include/spi.h               | 3 +++
 2 files changed, 6 insertions(+)


diff --git a/drivers/mtd/spi/spi_flash.c b/drivers/mtd/spi/spi_flash.c
index 51e28bf07b..e40e1c01de 100644
--- a/drivers/mtd/spi/spi_flash.c
+++ b/drivers/mtd/spi/spi_flash.c
@@ -516,6 +516,9 @@  int spi_flash_cmd_read_ops(struct spi_flash *flash, u32 offset,
 			read_len = remain_len;
+		if (spi->max_read_size)
+			read_len = min(read_len, spi->max_read_size);
 		spi_flash_addr(read_addr, cmd);
 		ret = spi_flash_read_common(flash, cmd, cmdsz, data, read_len);
diff --git a/include/spi.h b/include/spi.h
index 08c7480fda..4787454e59 100644
--- a/include/spi.h
+++ b/include/spi.h
@@ -86,6 +86,8 @@  struct dm_spi_slave_platdata {
  * @cs:			ID of the chip select connected to the slave.
  * @mode:		SPI mode to use for this slave (see SPI mode flags)
  * @wordlen:		Size of SPI word in number of bits
+ * @max_read_size:	If non-zero, the maximum number of bytes which can
+ *			be read at once.
  * @max_write_size:	If non-zero, the maximum number of bytes which can
  *			be written at once, excluding command bytes.
  * @memory_map:		Address of read-only SPI flash access.
@@ -102,6 +104,7 @@  struct spi_slave {
 	uint mode;
 	unsigned int wordlen;
+	unsigned int max_read_size;
 	unsigned int max_write_size;
 	void *memory_map;