[PATCH 3/8] spi: mtk_snor: conditionally copy tx/rx data

David Lechner dlechner at baylibre.com
Mon Apr 6 22:13:29 CEST 2026


From: "Noah.Shen" <noah.shen at mediatek.com>

Only write out data for OUT command and read in data for IN commands.

Signed-off-by: Noah.Shen <noah.shen at mediatek.com>
Signed-off-by: David Lechner <dlechner at baylibre.com>
---
 drivers/spi/mtk_snor.c | 24 ++++++++++++++----------
 1 file changed, 14 insertions(+), 10 deletions(-)

diff --git a/drivers/spi/mtk_snor.c b/drivers/spi/mtk_snor.c
index 0ff4a8b23d5..674e723db01 100644
--- a/drivers/spi/mtk_snor.c
+++ b/drivers/spi/mtk_snor.c
@@ -415,14 +415,16 @@ static int mtk_snor_cmd_program(struct mtk_snor_priv *priv,
 		writeb(val, reg);
 	}
 
-	for (i = 0; i < op->dummy.nbytes; i++, reg_offset--) {
-		reg = priv->base + MTK_NOR_REG_PRGDATA(reg_offset);
-		writeb(0, reg);
-	}
+	if (op->data.dir == SPI_MEM_DATA_OUT) {
+		for (i = 0; i < op->dummy.nbytes; i++, reg_offset--) {
+			reg = priv->base + MTK_NOR_REG_PRGDATA(reg_offset);
+			writeb(0, reg);
+		}
 
-	for (i = 0; i < op->data.nbytes; i++, reg_offset--) {
-		reg = priv->base + MTK_NOR_REG_PRGDATA(reg_offset);
-		writeb(((const u8 *)(op->data.buf.out))[i], reg);
+		for (i = 0; i < op->data.nbytes; i++, reg_offset--) {
+			reg = priv->base + MTK_NOR_REG_PRGDATA(reg_offset);
+			writeb(((const u8 *)(op->data.buf.out))[i], reg);
+		}
 	}
 
 	for (; reg_offset >= 0; reg_offset--) {
@@ -437,9 +439,11 @@ static int mtk_snor_cmd_program(struct mtk_snor_priv *priv,
 
 	/* fetch read data */
 	reg_offset = 0;
-	for (i = op->data.nbytes - 1; i >= 0; i--, reg_offset++) {
-		reg = priv->base + MTK_NOR_REG_SHIFT(reg_offset);
-		((u8 *)(op->data.buf.in))[i] = readb(reg);
+	if (op->data.dir == SPI_MEM_DATA_IN) {
+		for (i = op->data.nbytes - 1; i >= 0; i--, reg_offset++) {
+			reg = priv->base + MTK_NOR_REG_SHIFT(reg_offset);
+			((u8 *)(op->data.buf.in))[i] = readb(reg);
+		}
 	}
 
 	return 0;

-- 
2.43.0



More information about the U-Boot mailing list