]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
spi/dw_spi: Fix too short timeout in spi polling loop
authorFeng Tang <feng.tang@intel.com>
Fri, 24 Dec 2010 05:59:09 +0000 (13:59 +0800)
committerGrant Likely <grant.likely@secretlab.ca>
Fri, 24 Dec 2010 08:08:42 +0000 (01:08 -0700)
The SPI polling loop timeout only works with HZ=100 as the loop was
actually too short.

Also add appropriate cpu_relax() in the busy wait loops...

Signed-off-by: Arjan van de Ven <arjan@linux.intel.com>
Signed-off-by: Alan Cox <alan@linux.intel.com>
Signed-off-by: Feng Tang <feng.tang@intel.com>
Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
drivers/spi/dw_spi.c

index 0838c79861e49f9a0c97189af9ab25d3c0269b76..25238a82e45e58c6d71e2d8602a6e377352a5a11 100644 (file)
@@ -164,20 +164,23 @@ static inline void mrst_spi_debugfs_remove(struct dw_spi *dws)
 
 static void wait_till_not_busy(struct dw_spi *dws)
 {
-       unsigned long end = jiffies + 1 + usecs_to_jiffies(1000);
+       unsigned long end = jiffies + 1 + usecs_to_jiffies(5000);
 
        while (time_before(jiffies, end)) {
                if (!(dw_readw(dws, sr) & SR_BUSY))
                        return;
+               cpu_relax();
        }
        dev_err(&dws->master->dev,
-               "DW SPI: Status keeps busy for 1000us after a read/write!\n");
+               "DW SPI: Status keeps busy for 5000us after a read/write!\n");
 }
 
 static void flush(struct dw_spi *dws)
 {
-       while (dw_readw(dws, sr) & SR_RF_NOT_EMPT)
+       while (dw_readw(dws, sr) & SR_RF_NOT_EMPT) {
                dw_readw(dws, dr);
+               cpu_relax();
+       }
 
        wait_till_not_busy(dws);
 }