[PATCH 2/2] mtd: spi-nor-core: Rework spansion_sr_ready() for parallel memories support

tkuw584924 at gmail.com tkuw584924 at gmail.com
Fri Mar 14 06:53:37 CET 2025


From: Takahiro Kuwano <Takahiro.Kuwano at infineon.com>

spansion_sr_ready() needs to support parallel memories configuration,
that reads status register value from each devices and combines the
status bits, likewise read_sr() and read_fsr().

Introduce helper functions that perform RD_ANY_REG op with one-byte or
two-byte data length. And spansion_sr_ready() calls one of them
depending on HAS_PARALLEL flag.

The following commit is related to this patch.
92e0ae42b47 ("mtd: spi-nor: Add parallel memories support for read_sr and read_fsr")

Tested-by: Hiroyuki Saito <Hiroyuki.Saito2 at infineon.com>
Signed-off-by: Takahiro Kuwano <Takahiro.Kuwano at infineon.com>
---
 drivers/mtd/spi/spi-nor-core.c | 37 ++++++++++++++++++++++++++++++++--
 1 file changed, 35 insertions(+), 2 deletions(-)

diff --git a/drivers/mtd/spi/spi-nor-core.c b/drivers/mtd/spi/spi-nor-core.c
index 6f352c5c0e2..c792a00e4bf 100644
--- a/drivers/mtd/spi/spi-nor-core.c
+++ b/drivers/mtd/spi/spi-nor-core.c
@@ -796,13 +796,46 @@ static int set_4byte(struct spi_nor *nor, const struct flash_info *info,
  * Read status register 1 by using Read Any Register command to support multi
  * die package parts.
  */
+static int spansion_read_sr(struct spi_nor *nor, u32 addr_base, u8 dummy,
+			    u8 *sr)
+{
+	return spansion_read_any_reg(nor, addr_base + SPINOR_REG_CYPRESS_STR1V,
+				     dummy, sr);
+}
+
+static int spansion_read_sr_parallel(struct spi_nor *nor, u32 addr_base,
+				     u8 dummy, u8 *sr)
+{
+	struct spi_mem_op op =
+		SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_RD_ANY_REG, 0),
+			   SPI_MEM_OP_ADDR(nor->addr_mode_nbytes, 0, 0),
+			   SPI_MEM_OP_DUMMY(dummy, 0),
+			   SPI_MEM_OP_DATA_IN(2, NULL, 0));
+	u8 buf[2];
+	int ret;
+
+	op.addr.val = addr_base + SPINOR_REG_CYPRESS_STR1V;
+	spi_nor_setup_op(nor, &op, nor->reg_proto);
+
+	ret = spi_nor_read_write_reg(nor, &op, buf);
+	if (ret)
+		return ret;
+
+	*sr = buf[0] | buf[1];
+
+	return 0;
+}
+
 static int spansion_sr_ready(struct spi_nor *nor, u32 addr_base, u8 dummy)
 {
-	u32 reg_addr = addr_base + SPINOR_REG_CYPRESS_STR1V;
 	u8 sr;
 	int ret;
 
-	ret = spansion_read_any_reg(nor, reg_addr, dummy, &sr);
+	if (nor->flags & SNOR_F_HAS_PARALLEL)
+		ret = spansion_read_sr_parallel(nor, addr_base, dummy, &sr);
+	else
+		ret = spansion_read_sr(nor, addr_base, dummy, &sr);
+
 	if (ret < 0)
 		return ret;
 
-- 
2.34.1



More information about the U-Boot mailing list