summaryrefslogtreecommitdiffstats
path: root/drivers/spi
diff options
context:
space:
mode:
authorMark Brown <broonie@linaro.org>2014-01-30 23:16:41 +0100
committerMark Brown <broonie@linaro.org>2014-02-03 14:04:45 +0100
commit16a0ce4e10edfe376b3071f161c71c4160c89d6b (patch)
tree081e182b8820c09f279a8bb0002e1d9b1aa627fb /drivers/spi
parentLinus 3.14-rc1 (diff)
downloadlinux-16a0ce4e10edfe376b3071f161c71c4160c89d6b.tar.xz
linux-16a0ce4e10edfe376b3071f161c71c4160c89d6b.zip
spi: Add a timeout when waiting for transfers
Don't wait indefinitely for transfers to complete but time out after 10ms more than we expect the transfer to take on the wire. Signed-off-by: Mark Brown <broonie@linaro.org>
Diffstat (limited to 'drivers/spi')
-rw-r--r--drivers/spi/spi.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c
index 23756b0f9036..516643d243c6 100644
--- a/drivers/spi/spi.c
+++ b/drivers/spi/spi.c
@@ -594,6 +594,7 @@ static int spi_transfer_one_message(struct spi_master *master,
bool cur_cs = true;
bool keep_cs = false;
int ret = 0;
+ int ms = 1;
spi_set_cs(msg->spi, true);
@@ -611,7 +612,16 @@ static int spi_transfer_one_message(struct spi_master *master,
if (ret > 0) {
ret = 0;
- wait_for_completion(&master->xfer_completion);
+ ms = xfer->len * 8 * 1000 / xfer->speed_hz;
+ ms += 10; /* some tolerance */
+
+ ms = wait_for_completion_timeout(&master->xfer_completion,
+ msecs_to_jiffies(ms));
+ }
+
+ if (ms == 0) {
+ dev_err(&msg->spi->dev, "SPI transfer timed out\n");
+ msg->status = -ETIMEDOUT;
}
trace_spi_transfer_stop(msg, xfer);