Message ID | 20090206180650.GD11548@oksana.dev.rtsoft.ru (mailing list archive) |
---|---|
State | Superseded, archived |
Delegated to: | Kumar Gala |
Headers | show |
On Fri, 6 Feb 2009 21:06:50 +0300 Anton Vorontsov <avorontsov@ru.mvista.com> wrote: > This patch adds SDHCI_QUIRK_BROKEN_CARD_DETECTION quirk. When specified, > sdhci driver will set MMC_CAP_NEEDS_POLL MMC host capability, and won't > enable card insert/remove interrupts. > > This is needed for hosts with unreliable card detection, such as FSL > eSDHC. The original eSDHC driver was tring to "debounce" card-detection > IRQs by reading present state and disabling particular interrupts. But > with this debouncing scheme I noticed that sometimes we miss card > insertion/removal events. > > Signed-off-by: Anton Vorontsov <avorontsov@ru.mvista.com> > --- I guess you need to fix the check at the start of the request function as well. > diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c > index b7a79a0..45c5f1f 100644 > --- a/drivers/mmc/host/sdhci.c > +++ b/drivers/mmc/host/sdhci.c > @@ -162,6 +162,9 @@ static void sdhci_init(struct sdhci_host *host) > SDHCI_INT_DMA_END | SDHCI_INT_DATA_END | SDHCI_INT_RESPONSE | > SDHCI_INT_ADMA_ERROR; > > + if (host->quirks & SDHCI_QUIRK_BROKEN_CARD_DETECTION) > + intmask &= ~(SDHCI_INT_CARD_REMOVE | SDHCI_INT_CARD_INSERT); > + A matter of taste perhaps, but I think it would make more sense to not add them in the first place than to add and then remove them. Card detection interrupts should be handled separately anyway as they should not be enabled before mmc_add_host() returns and should be disabled before calling mmc_remove_host(). Patch welcome. ;) Rgds
diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c index b7a79a0..45c5f1f 100644 --- a/drivers/mmc/host/sdhci.c +++ b/drivers/mmc/host/sdhci.c @@ -162,6 +162,9 @@ static void sdhci_init(struct sdhci_host *host) SDHCI_INT_DMA_END | SDHCI_INT_DATA_END | SDHCI_INT_RESPONSE | SDHCI_INT_ADMA_ERROR; + if (host->quirks & SDHCI_QUIRK_BROKEN_CARD_DETECTION) + intmask &= ~(SDHCI_INT_CARD_REMOVE | SDHCI_INT_CARD_INSERT); + sdhci_writel(host, intmask, SDHCI_INT_ENABLE); sdhci_writel(host, intmask, SDHCI_SIGNAL_ENABLE); } @@ -1684,6 +1687,9 @@ int sdhci_add_host(struct sdhci_host *host) mmc->f_max = host->max_clk; mmc->caps = MMC_CAP_4_BIT_DATA | MMC_CAP_SDIO_IRQ; + if (host->quirks & SDHCI_QUIRK_BROKEN_CARD_DETECTION) + mmc->caps |= MMC_CAP_NEEDS_POLL; + if ((caps & SDHCI_CAN_DO_HISPD) || (host->quirks & SDHCI_QUIRK_FORCE_HIGHSPEED)) mmc->caps |= MMC_CAP_SD_HIGHSPEED; diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h index 5a5c119..03f035e 100644 --- a/drivers/mmc/host/sdhci.h +++ b/drivers/mmc/host/sdhci.h @@ -227,6 +227,8 @@ struct sdhci_host { #define SDHCI_QUIRK_FORCE_HIGHSPEED (1<<14) /* Controller does not provide transfer-complete interrupt when not busy */ #define SDHCI_QUIRK_NO_BUSY_IRQ (1<<15) +/* Controller has unreliable card detection */ +#define SDHCI_QUIRK_BROKEN_CARD_DETECTION (1<<16) int irq; /* Device IRQ */ void __iomem * ioaddr; /* Mapped address */
This patch adds SDHCI_QUIRK_BROKEN_CARD_DETECTION quirk. When specified, sdhci driver will set MMC_CAP_NEEDS_POLL MMC host capability, and won't enable card insert/remove interrupts. This is needed for hosts with unreliable card detection, such as FSL eSDHC. The original eSDHC driver was tring to "debounce" card-detection IRQs by reading present state and disabling particular interrupts. But with this debouncing scheme I noticed that sometimes we miss card insertion/removal events. Signed-off-by: Anton Vorontsov <avorontsov@ru.mvista.com> --- drivers/mmc/host/sdhci.c | 6 ++++++ drivers/mmc/host/sdhci.h | 2 ++ 2 files changed, 8 insertions(+), 0 deletions(-)