Skip to content

Commit 5c27ff5

Browse files
Sergei Shtylyovstorulf
authored andcommitted
mmc: tmio_mmc_core: don't claim spurious interrupts
I have encountered an interrupt storm during the eMMC chip probing (and the chip finally didn't get detected). It turned out that U-Boot left the DMAC interrupts enabled while the Linux driver didn't use those. The SDHI driver's interrupt handler somehow assumes that, even if an SDIO interrupt didn't happen, it should return IRQ_HANDLED. I think that if none of the enabled interrupts happened and got handled, we should return IRQ_NONE -- that way the kernel IRQ code recoginizes a spurious interrupt and masks it off pretty quickly... Fixes: 7729c7a ("mmc: tmio: Provide separate interrupt handlers") Signed-off-by: Sergei Shtylyov <sergei.shtylyov@cogentembedded.com> Reviewed-by: Wolfram Sang <wsa+renesas@sang-engineering.com> Tested-by: Wolfram Sang <wsa+renesas@sang-engineering.com> Reviewed-by: Simon Horman <horms+renesas@verge.net.au> Cc: stable@vger.kernel.org Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
1 parent c9bd505 commit 5c27ff5

File tree

1 file changed

+7
-4
lines changed

1 file changed

+7
-4
lines changed

drivers/mmc/host/tmio_mmc_core.c

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -629,15 +629,15 @@ static bool __tmio_mmc_sdcard_irq(struct tmio_mmc_host *host, int ireg,
629629
return false;
630630
}
631631

632-
static void __tmio_mmc_sdio_irq(struct tmio_mmc_host *host)
632+
static bool __tmio_mmc_sdio_irq(struct tmio_mmc_host *host)
633633
{
634634
struct mmc_host *mmc = host->mmc;
635635
struct tmio_mmc_data *pdata = host->pdata;
636636
unsigned int ireg, status;
637637
unsigned int sdio_status;
638638

639639
if (!(pdata->flags & TMIO_MMC_SDIO_IRQ))
640-
return;
640+
return false;
641641

642642
status = sd_ctrl_read16(host, CTL_SDIO_STATUS);
643643
ireg = status & TMIO_SDIO_MASK_ALL & ~host->sdio_irq_mask;
@@ -650,6 +650,8 @@ static void __tmio_mmc_sdio_irq(struct tmio_mmc_host *host)
650650

651651
if (mmc->caps & MMC_CAP_SDIO_IRQ && ireg & TMIO_SDIO_STAT_IOIRQ)
652652
mmc_signal_sdio_irq(mmc);
653+
654+
return ireg;
653655
}
654656

655657
irqreturn_t tmio_mmc_irq(int irq, void *devid)
@@ -668,9 +670,10 @@ irqreturn_t tmio_mmc_irq(int irq, void *devid)
668670
if (__tmio_mmc_sdcard_irq(host, ireg, status))
669671
return IRQ_HANDLED;
670672

671-
__tmio_mmc_sdio_irq(host);
673+
if (__tmio_mmc_sdio_irq(host))
674+
return IRQ_HANDLED;
672675

673-
return IRQ_HANDLED;
676+
return IRQ_NONE;
674677
}
675678
EXPORT_SYMBOL_GPL(tmio_mmc_irq);
676679

0 commit comments

Comments
 (0)