diff options
Diffstat (limited to 'drivers/mtd/spi/atmel.c')
| -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 a9910b11b..10df3879e 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;  }  /* |