[PATCH 3/3] spi: stm32: fix reads for sizes bigger than SZ_64K-1

Ahmad Fatoum ahmad at a3f.at
Thu Jul 7 22:52:50 PDT 2022


stm32_spi_transfer_one() can transfer no more than SPI_CR2_TSIZE (64K - 1),
while e.g. imd tends to read more than  (64K - 1) from SPI flash:

  barebox:/ imd /dev/m25p0
  imd: error 90

Define spi_controller_mem_ops::exec_op for the SPI controller to fix
this.

Signed-off-by: Antony Pavlov <antonynpavlov at gmail.com>
Signed-off-by: Ahmad Fatoum <ahmad at a3f.at>
---
 drivers/spi/stm32_spi.c | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/drivers/spi/stm32_spi.c b/drivers/spi/stm32_spi.c
index 0cb04a968c8a..d38207edac5f 100644
--- a/drivers/spi/stm32_spi.c
+++ b/drivers/spi/stm32_spi.c
@@ -11,6 +11,7 @@
 #include <init.h>
 #include <errno.h>
 #include <linux/reset.h>
+#include <linux/spi/spi-mem.h>
 #include <spi/spi.h>
 #include <linux/bitops.h>
 #include <clock.h>
@@ -474,6 +475,24 @@ out:
 	return ret;
 }
 
+static int stm32_spi_adjust_op_size(struct spi_mem *mem, struct spi_mem_op *op)
+{
+	if (op->data.nbytes > SPI_CR2_TSIZE)
+		op->data.nbytes = SPI_CR2_TSIZE;
+
+	return 0;
+}
+
+static int stm32_spi_exec_op(struct spi_mem *mem, const struct spi_mem_op *op)
+{
+	return -ENOTSUPP;
+}
+
+static const struct spi_controller_mem_ops stm32_spi_mem_ops = {
+	.adjust_op_size = stm32_spi_adjust_op_size,
+	.exec_op = stm32_spi_exec_op,
+};
+
 static int stm32_spi_get_fifo_size(struct stm32_spi_priv *priv)
 {
 	u32 count = 0;
@@ -522,6 +541,7 @@ static int stm32_spi_probe(struct device_d *dev)
 
 	master->setup = stm32_spi_setup;
 	master->transfer = stm32_spi_transfer;
+	master->mem_ops = stm32_spi_mem_ops;
 
 	master->bus_num = -1;
 	stm32_spi_dt_probe(priv);
-- 
2.34.1




More information about the barebox mailing list