[coreboot-gerrit] New patch to review for coreboot: 55ab10c drivers/spi: Reduce the per loop delay of spi_flash_cmd_poll_bit()

David Hendricks (dhendrix@chromium.org) gerrit at coreboot.org
Fri Jun 27 05:37:05 CEST 2014


David Hendricks (dhendrix at chromium.org) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/6137

-gerrit

commit 55ab10c6819f879a76952c32a017e689355daa82
Author: Dave Frodin <dave.frodin at se-eng.com>
Date:   Wed Jun 11 12:53:47 2014 -0600

    drivers/spi: Reduce the per loop delay of spi_flash_cmd_poll_bit()
    
    At the end of some SPI operations the SPI device needs to be polled
    to determine if it is done with the operation. For SPI data writes
    the predicted time of that operation could be less than 10us.
    The current per loop delay of 500us is adding too much delay.
    This change replaces the delay(x) in the do-while loop with a
    timer so that the actual timeout value won't be lengthened by the
    delay of reading the SPI device.
    
    Change-Id: Idf5a70182d66fc6a4b760ddae5f15a9fb654c9ff
    Signed-off-by: Dave Frodin <dave.frodin at se-eng.com>
---
 src/drivers/spi/spi_flash.c | 22 ++++++++++------------
 1 file changed, 10 insertions(+), 12 deletions(-)

diff --git a/src/drivers/spi/spi_flash.c b/src/drivers/spi/spi_flash.c
index 33588d5..6d92836 100644
--- a/src/drivers/spi/spi_flash.c
+++ b/src/drivers/spi/spi_flash.c
@@ -16,6 +16,7 @@
 #include <cpu/x86/smm.h>
 #endif
 #include "spi_flash_internal.h"
+#include <timer.h>
 
 static void spi_flash_addr(u32 addr, u8 *cmd)
 {
@@ -106,27 +107,24 @@ int spi_flash_cmd_poll_bit(struct spi_flash *flash, unsigned long timeout,
 			   u8 cmd, u8 poll_bit)
 {
 	struct spi_slave *spi = flash->spi;
-	unsigned long timebase;
 	int ret;
 	u8 status;
+	struct mono_time current, end;
+
+	timer_monotonic_get(&current);
+	end = current;
+	mono_time_add_msecs(&end, timeout);
 
-	timebase = timeout;
 	do {
 		ret = spi_flash_cmd_read(spi, &cmd, 1, &status, 1);
 		if (ret)
 			return -1;
-
 		if ((status & poll_bit) == 0)
-			break;
-
-		udelay(500);
-	} while (timebase--);
-
-	if ((status & poll_bit) == 0)
-		return 0;
+			return 0;
+		timer_monotonic_get(&current);
+	} while (!mono_time_after(&current, &end));
 
-	/* Timed out */
-	printk(BIOS_DEBUG, "SF: time out!\n");
+	printk(BIOS_DEBUG, "SF: timeout at %ld msec\n",timeout);
 	return -1;
 }
 



More information about the coreboot-gerrit mailing list