[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