summaryrefslogtreecommitdiff
path: root/drivers/spi/dw_spi.c
diff options
context:
space:
mode:
authorFeng Tang <feng.tang@intel.com>2010-12-24 13:59:09 +0800
committerGrant Likely <grant.likely@secretlab.ca>2010-12-24 01:08:42 -0700
commitebf45b7d029eb065819bfede8b30455630d76c68 (patch)
treef42bcb8575af3477b1d9293bed7de3f21734236f /drivers/spi/dw_spi.c
parent5e8b821de333f472d33e3052a8dd1c43bf3ce433 (diff)
downloadlwn-ebf45b7d029eb065819bfede8b30455630d76c68.tar.gz
lwn-ebf45b7d029eb065819bfede8b30455630d76c68.zip
spi/dw_spi: Fix too short timeout in spi polling loop
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>
Diffstat (limited to 'drivers/spi/dw_spi.c')
-rw-r--r--drivers/spi/dw_spi.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/drivers/spi/dw_spi.c b/drivers/spi/dw_spi.c
index 0838c79861e4..25238a82e45e 100644
--- a/drivers/spi/dw_spi.c
+++ b/drivers/spi/dw_spi.c
@@ -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);
}