From: Sascha Hauer <s.hauer@xxxxxxxxxxxxxx> The i.MX SPI driver fills/flushes the FIFOs in interrupt context. With longer SPI messages this introduces big latencies in the system. Using a threaded interrupt avoids this issue. Signed-off-by: Sascha Hauer <s.hauer@xxxxxxxxxxxxxx> Signed-off-by: Lucas Stach <l.stach@xxxxxxxxxxxxxx> --- drivers/spi/spi-imx.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/drivers/spi/spi-imx.c b/drivers/spi/spi-imx.c index 5daff2054ae4..5e40801e1c52 100644 --- a/drivers/spi/spi-imx.c +++ b/drivers/spi/spi-imx.c @@ -672,6 +672,15 @@ static irqreturn_t spi_imx_isr(int irq, void *dev_id) { struct spi_imx_data *spi_imx = dev_id; + spi_imx->devtype_data->intctrl(spi_imx, 0); + + return IRQ_WAKE_THREAD; +} + +static irqreturn_t spi_imx_isr_thread(int irq, void *dev_id) +{ + struct spi_imx_data *spi_imx = dev_id; + while (spi_imx->devtype_data->rx_available(spi_imx)) { spi_imx->rx(spi_imx); spi_imx->txfifo--; @@ -679,6 +688,7 @@ static irqreturn_t spi_imx_isr(int irq, void *dev_id) if (spi_imx->count) { spi_imx_push(spi_imx); + spi_imx->devtype_data->intctrl(spi_imx, MXC_INT_TE); return IRQ_HANDLED; } @@ -691,7 +701,6 @@ static irqreturn_t spi_imx_isr(int irq, void *dev_id) return IRQ_HANDLED; } - spi_imx->devtype_data->intctrl(spi_imx, 0); complete(&spi_imx->xfer_done); return IRQ_HANDLED; @@ -883,8 +892,8 @@ static int spi_imx_probe(struct platform_device *pdev) goto out_master_put; } - ret = devm_request_irq(&pdev->dev, spi_imx->irq, spi_imx_isr, 0, - dev_name(&pdev->dev), spi_imx); + ret = request_threaded_irq(spi_imx->irq, spi_imx_isr, + spi_imx_isr_thread, 0, dev_name(&pdev->dev), spi_imx); if (ret) { dev_err(&pdev->dev, "can't get irq%d: %d\n", spi_imx->irq, ret); goto out_master_put; -- 2.1.0 -- To unsubscribe from this list: send the line "unsubscribe linux-spi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html