spi: tegra: register interrupt as ONESHOT
Laxman Dewangan [Mon, 14 May 2012 08:28:02 +0000 (13:28 +0530)]
The Tegra spi's engine is design as it generates interrupt
when any error occurs and it keep transferring data. It does
not stop the engine once error occurred and interrupt generated.
This may cause reentry of ISR as on error case, isr get called
where it clears interrupt and because it is still in progress,
it again interrupts and schedule the thread.
The second time scheduling of the isr/thread can cause the issue
in queue management and sw state.
So Making the interrupt as ONESHOT so that the interrupt will not
get schedule until the engine is reset in error case.

Change-Id: I96daaf50102aede93164c82b7f6da235d0a7fbfc
Signed-off-by: Laxman Dewangan <ldewangan@nvidia.com>
Reviewed-on: http://git-master/r/101547
Reviewed-by: Automatic_Commit_Validation_User
Reviewed-by: Jui Chang Kuo <jckuo@nvidia.com>
Tested-by: Jui Chang Kuo <jckuo@nvidia.com>

drivers/spi/spi-tegra.c

index 3f91338..cfc6101 100644 (file)
@@ -1265,7 +1265,7 @@ static int __init spi_tegra_probe(struct platform_device *pdev)
 
        sprintf(tspi->port_name, "tegra_spi_%d", pdev->id);
        ret = request_threaded_irq(tspi->irq, spi_tegra_isr,
-                       spi_tegra_isr_thread, IRQF_DISABLED,
+                       spi_tegra_isr_thread, IRQF_ONESHOT,
                        tspi->port_name, tspi);
        if (ret < 0) {
                dev_err(&pdev->dev, "Failed to register ISR for IRQ %d\n",