The xfer waiting time is the result of xfer->len / xfer->speed_hz, but when the following patch is merged, commit 9326e4f1e5dd ("spi: Limit the spi device max speed to controller's max speed") the xfer->speed_hz may always be clamped to 0 if the controller doesn't provide its max_speed_hz. There may be no hardware indication of the max_speed_hz so the controller driver leaves it, but exception happens when it tries to do irq mode transfer. This patch makes the assumption of 1khz xfer speed if the xfer->speed_hz is not assigned. This avoids the divide by 0 issue and ensures a reasonable tolerant waiting time. Signed-off-by: Xu Yilun <yilun.xu@xxxxxxxxx> --- drivers/spi/spi.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c index 51d7c00..2f3c2c9 100644 --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c @@ -1109,6 +1109,7 @@ static int spi_transfer_wait(struct spi_controller *ctlr, struct spi_statistics *statm = &ctlr->statistics; struct spi_statistics *stats = &msg->spi->statistics; unsigned long long ms; + u32 speed_hz; if (spi_controller_is_slave(ctlr)) { if (wait_for_completion_interruptible(&ctlr->xfer_completion)) { @@ -1116,8 +1117,9 @@ static int spi_transfer_wait(struct spi_controller *ctlr, return -EINTR; } } else { + speed_hz = xfer->speed_hz ? : 1000; ms = 8LL * 1000LL * xfer->len; - do_div(ms, xfer->speed_hz); + do_div(ms, speed_hz); ms += ms + 200; /* some tolerance */ if (ms > UINT_MAX) -- 2.7.4