When we disable card detection interrupts, we should disable both the
insert and remove interrupts irrespective of the current state - this
avoids races between the hardware card detect changing state before
we've read that updated state and altered the interrupt mask.

Signed-off-by: Russell King <rmk+ker...@arm.linux.org.uk>
=-DO NOT APPLY-=
 drivers/mmc/host/sdhci.c | 17 +++++++++--------
 1 file changed, 9 insertions(+), 8 deletions(-)

diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
index 84cd0fd820d9..5fe211dfb792 100644
=-DO NOT APPLY-= a/drivers/mmc/host/sdhci.c
=+DO NOT APPLY+= b/drivers/mmc/host/sdhci.c
@@ -133,20 +133,21 @@ static void sdhci_dumpregs(struct sdhci_host *host)
 
 static void sdhci_set_card_detection(struct sdhci_host *host, bool enable)
 {
-       u32 present, irqs;
=+DO NOT APPLY+=        u32 present;
 
        if ((host->quirks & SDHCI_QUIRK_BROKEN_CARD_DETECTION) ||
            (host->mmc->caps & MMC_CAP_NONREMOVABLE))
                return;
 
-       present = sdhci_readl(host, SDHCI_PRESENT_STATE) &
-                             SDHCI_CARD_PRESENT;
-       irqs = present ? SDHCI_INT_CARD_REMOVE : SDHCI_INT_CARD_INSERT;
=+DO NOT APPLY+=        if (enable) {
=+DO NOT APPLY+=                present = sdhci_readl(host, 
SDHCI_PRESENT_STATE) &
=+DO NOT APPLY+=                                      SDHCI_CARD_PRESENT;
 
-       if (enable)
-               host->ier |= irqs;
-       else
-               host->ier &= ~irqs;
=+DO NOT APPLY+=                host->ier |= present ? SDHCI_INT_CARD_REMOVE :
=+DO NOT APPLY+=                                       SDHCI_INT_CARD_INSERT;
=+DO NOT APPLY+=        } else {
=+DO NOT APPLY+=                host->ier &= ~(SDHCI_INT_CARD_REMOVE | 
SDHCI_INT_CARD_INSERT);
=+DO NOT APPLY+=        }
 
        sdhci_writel(host, host->ier, SDHCI_INT_ENABLE);
        sdhci_writel(host, host->ier, SDHCI_SIGNAL_ENABLE);
-- 
1.8.3.1

--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to