mtd: spi-nor-core: Read status by Read Any Register

The spansion_sr_ready() reads status register 1 by Read Any Register
commnad. This function is called from Flash specific hook with die address
and dummy cycles to support multi-die package parts from Spansion/Cypress.

Signed-off-by: Takahiro Kuwano <Takahiro.Kuwano@infineon.com>
Reviewed-by: Pratyush Yadav <p.yadav@ti.com>
Reviewed-by: Jagan Teki <jagan@amarulasolutions.com>
This commit is contained in:
Takahiro Kuwano 2021-06-29 15:01:01 +09:00 committed by Jagan Teki
parent 24b1e2c690
commit d2d79895da
2 changed files with 30 additions and 0 deletions

View file

@ -669,6 +669,35 @@ static int set_4byte(struct spi_nor *nor, const struct flash_info *info,
}
}
#ifdef CONFIG_SPI_FLASH_SPANSION
/*
* Read status register 1 by using Read Any Register command to support multi
* die package parts.
*/
static int spansion_sr_ready(struct spi_nor *nor, u32 addr_base, u8 dummy)
{
u32 reg_addr = addr_base + SPINOR_REG_ADDR_STR1V;
u8 sr;
int ret;
ret = spansion_read_any_reg(nor, reg_addr, dummy, &sr);
if (ret < 0)
return ret;
if (sr & (SR_E_ERR | SR_P_ERR)) {
if (sr & SR_E_ERR)
dev_dbg(nor->dev, "Erase Error occurred\n");
else
dev_dbg(nor->dev, "Programming Error occurred\n");
nor->write_reg(nor, SPINOR_OP_CLSR, NULL, 0);
return -EIO;
}
return !(sr & SR_WIP);
}
#endif
static int spi_nor_sr_ready(struct spi_nor *nor)
{
int sr = read_sr(nor);

View file

@ -125,6 +125,7 @@
#define SPINOR_OP_CLSR 0x30 /* Clear status register 1 */
#define SPINOR_OP_RDAR 0x65 /* Read any register */
#define SPINOR_OP_WRAR 0x71 /* Write any register */
#define SPINOR_REG_ADDR_STR1V 0x00800000
#define SPINOR_REG_ADDR_CFR1V 0x00800002
/* Used for Micron flashes only. */