mmc: sdhci: plug hole in disabling card detection interrupts
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+kernel@arm.linux.org.uk> Tested-by: Markus Pargmann <mpa@pengutronix.de> Tested-by: Stephen Warren <swarren@nvidia.com> Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org> Signed-off-by: Chris Ball <chris@printf.net>
This commit is contained in:
parent
b537f94ce1
commit
5b4f1f6c49
1 changed files with 9 additions and 8 deletions
|
@ -133,20 +133,21 @@ static void sdhci_dumpregs(struct sdhci_host *host)
|
||||||
|
|
||||||
static void sdhci_set_card_detection(struct sdhci_host *host, bool enable)
|
static void sdhci_set_card_detection(struct sdhci_host *host, bool enable)
|
||||||
{
|
{
|
||||||
u32 present, irqs;
|
u32 present;
|
||||||
|
|
||||||
if ((host->quirks & SDHCI_QUIRK_BROKEN_CARD_DETECTION) ||
|
if ((host->quirks & SDHCI_QUIRK_BROKEN_CARD_DETECTION) ||
|
||||||
(host->mmc->caps & MMC_CAP_NONREMOVABLE))
|
(host->mmc->caps & MMC_CAP_NONREMOVABLE))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
present = sdhci_readl(host, SDHCI_PRESENT_STATE) &
|
if (enable) {
|
||||||
SDHCI_CARD_PRESENT;
|
present = sdhci_readl(host, SDHCI_PRESENT_STATE) &
|
||||||
irqs = present ? SDHCI_INT_CARD_REMOVE : SDHCI_INT_CARD_INSERT;
|
SDHCI_CARD_PRESENT;
|
||||||
|
|
||||||
if (enable)
|
host->ier |= present ? SDHCI_INT_CARD_REMOVE :
|
||||||
host->ier |= irqs;
|
SDHCI_INT_CARD_INSERT;
|
||||||
else
|
} else {
|
||||||
host->ier &= ~irqs;
|
host->ier &= ~(SDHCI_INT_CARD_REMOVE | SDHCI_INT_CARD_INSERT);
|
||||||
|
}
|
||||||
|
|
||||||
sdhci_writel(host, host->ier, SDHCI_INT_ENABLE);
|
sdhci_writel(host, host->ier, SDHCI_INT_ENABLE);
|
||||||
sdhci_writel(host, host->ier, SDHCI_SIGNAL_ENABLE);
|
sdhci_writel(host, host->ier, SDHCI_SIGNAL_ENABLE);
|
||||||
|
|
Loading…
Add table
Reference in a new issue