summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChin Liang See <clsee@altera.com>2014-03-06 11:21:11 -0800
committerChin Liang See <clsee@altera.com>2014-03-06 11:21:11 -0800
commit09353b4af6d6c72b03a437db4a94680674877d45 (patch)
treec0e4681b2a24845c866e85961cc3394a5510d11d
parente0d19aa80086b99a1dacb320eb12cb20e577aebc (diff)
downloadu-boot-socfpga-09353b4af6d6c72b03a437db4a94680674877d45.tar.gz
FogBugz #188704: Fix QSPI read flag status sequence
Fixed the QSPI read status and read flag status register sequence. To ensure reliable flash programming and erase, we would need to read status register then follow by read flag status register. While its not documented, its advised by Micron technical support. Signed-off-by: Chin Liang See <clsee@altera.com>
-rw-r--r--drivers/mtd/spi/spi_flash.c17
1 files changed, 9 insertions, 8 deletions
diff --git a/drivers/mtd/spi/spi_flash.c b/drivers/mtd/spi/spi_flash.c
index 2d73d00943..a6736db6cf 100644
--- a/drivers/mtd/spi/spi_flash.c
+++ b/drivers/mtd/spi/spi_flash.c
@@ -123,16 +123,16 @@ int spi_flash_cmd_write_multi(struct spi_flash *flash, u32 offset,
break;
}
+ ret = spi_flash_cmd_wait_ready(flash, SPI_FLASH_PROG_TIMEOUT);
+ if (ret)
+ break;
+
if (flash->poll_read_status) {
ret = flash->poll_read_status(flash);
if (ret)
break;
}
- ret = spi_flash_cmd_wait_ready(flash, SPI_FLASH_PROG_TIMEOUT);
- if (ret)
- break;
-
page_addr++;
byte_addr = 0;
}
@@ -264,15 +264,16 @@ int spi_flash_cmd_erase(struct spi_flash *flash, u32 offset, size_t len)
if (ret)
goto out;
+ ret = spi_flash_cmd_wait_ready(flash,
+ SPI_FLASH_PAGE_ERASE_TIMEOUT);
+ if (ret)
+ goto out;
+
if (flash->poll_read_status) {
ret = flash->poll_read_status(flash);
if (ret)
goto out;
}
-
- ret = spi_flash_cmd_wait_ready(flash, SPI_FLASH_PAGE_ERASE_TIMEOUT);
- if (ret)
- goto out;
}
debug("SF: Successfully erased %zu bytes @ %#x\n", len, start);