diff options
-rw-r--r-- | drivers/mtd/spi/atmel.c | 31 |
1 files changed, 29 insertions, 2 deletions
diff --git a/drivers/mtd/spi/atmel.c b/drivers/mtd/spi/atmel.c index a9910b1..10df387 100644 --- a/drivers/mtd/spi/atmel.c +++ b/drivers/mtd/spi/atmel.c @@ -113,8 +113,35 @@ static const struct atmel_spi_flash_params atmel_spi_flash_table[] = { static int at45_wait_ready(struct spi_flash *flash, unsigned long timeout) { - return spi_flash_cmd_poll_bit(flash, timeout, - CMD_AT45_READ_STATUS, AT45_STATUS_READY); + struct spi_slave *spi = flash->spi; + unsigned long timebase; + int ret; + u8 cmd = CMD_AT45_READ_STATUS; + u8 status; + + timebase = get_timer(0); + + ret = spi_xfer(spi, 8, &cmd, NULL, SPI_XFER_BEGIN); + if (ret) + return -1; + + do { + ret = spi_xfer(spi, 8, NULL, &status, 0); + if (ret) + return -1; + + if (status & AT45_STATUS_READY) + break; + } while (get_timer(timebase) < timeout); + + /* Deactivate CS */ + spi_xfer(spi, 0, NULL, NULL, SPI_XFER_END); + + if (status & AT45_STATUS_READY) + return 0; + + /* Timed out */ + return -1; } /* |