[PATCH v3 1/4] mmc: sdhci: fix interrupt storm from card detection
From: Philip Rakity <hidden>
Date: 2011-06-20 15:59:38
Also in:
linux-mmc
On Jun 20, 2011, at 3:38 AM, Shawn Guo wrote:
quoted hunk ↗ jump to hunk
The issue was initially found by Eric Benard as below. http://permalink.gmane.org/gmane.linux.ports.arm.kernel/108031 Not sure about other SDHCI based controller, but on Freescale eSDHC, the SDHCI_INT_CARD_INSERT bits will be immediately set again when it gets cleared, if a card is inserted. The driver need to mask the irq to prevent interrupt storm which will freeze the system. And the SDHCI_INT_CARD_REMOVE gets the same situation. The patch fixes the problem based on the initial idea from Eric Benard. Signed-off-by: Shawn Guo <redacted> Cc: Eric Benard <redacted> --- drivers/mmc/host/sdhci.c | 27 +++++++++++++++++++++++---- 1 files changed, 23 insertions(+), 4 deletions(-)diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c index 91d9892..d94e2b4 100644 --- a/drivers/mmc/host/sdhci.c +++ b/drivers/mmc/host/sdhci.c@@ -127,7 +127,9 @@ static void sdhci_mask_irqs(struct sdhci_host *host, u32 irqs)static void sdhci_set_card_detection(struct sdhci_host *host, bool enable) { - u32 irqs = SDHCI_INT_CARD_REMOVE | SDHCI_INT_CARD_INSERT; + u32 present = sdhci_readl(host, SDHCI_PRESENT_STATE) & + SDHCI_CARD_PRESENT; + u32 irqs = present ? SDHCI_INT_CARD_REMOVE : SDHCI_INT_CARD_INSERT; if (host->quirks & SDHCI_QUIRK_BROKEN_CARD_DETECTION) return;
Accessing off chip registers is slow. It would be better to check for the quirk first and then read the present state register. eg u32 present; u32 irqs;
if (host->quirks & SDHCI_QUIRK_BROKEN_CARD_DETECTION) return;
present = sdhci_readl(host, SDHCI_PRESENT_STATE) & SDHCI_CARD_PRESENT;
irqs = present ? SDHCI_INT_CARD_REMOVE : SDHCI_INT_CARD_INSERT;
Philip