diff options
author | Mark Brown <broonie@linaro.org> | 2014-01-30 22:16:41 +0000 |
---|---|---|
committer | Mark Brown <broonie@linaro.org> | 2014-02-03 13:04:45 +0000 |
commit | 16a0ce4e10edfe376b3071f161c71c4160c89d6b (patch) | |
tree | 081e182b8820c09f279a8bb0002e1d9b1aa627fb /drivers/spi/spi.c | |
parent | 38dbfb59d1175ef458d006556061adeaa8751b72 (diff) | |
download | op-kernel-dev-16a0ce4e10edfe376b3071f161c71c4160c89d6b.zip op-kernel-dev-16a0ce4e10edfe376b3071f161c71c4160c89d6b.tar.gz |
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/spi.c')
-rw-r--r-- | drivers/spi/spi.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c index 23756b0..516643d 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); |