sf: atmel: undo unification of status polling
authorMike Frysinger <vapier@gentoo.org>
Tue, 12 Apr 2011 03:39:28 +0000 (23:39 -0400)
committerMike Frysinger <vapier@gentoo.org>
Tue, 12 Apr 2011 03:41:09 +0000 (23:41 -0400)
The AT45 flashes are completely different (at the command set and
status register level) from all other SPI flashes, so we can't unify
their logic with common code.

Signed-off-by: Mike Frysinger <vapier@gentoo.org>
drivers/mtd/spi/atmel.c

index a9910b11b80dc3e1cd9a5137b3d5abaf25edb631..10df3879e0ed4ba6c9eaf91cbc9438fcd39f6a58 100644 (file)
@@ -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;
 }
 
 /*