On Mar 1, 2013, at 9:40 AM, Kevin Liu <kliu5@xxxxxxxxxxx> wrote: > in function sdhci_request: > 1. If quirk SDHCI_QUIRK_BROKEN_CARD_DETECTION is selected, there is no > card detection available and polling must be used. Gpio detect must > _not_ be supported under this case. > Change the sequence to check SDHCI_QUIRK_BROKEN_CARD_DETECTION first, > which make code more clear. > 2. nonremovable card should be also assumed always present. > > in function sdhci_enable_irq_wakeups: > 1. nonremovable card should be also assumed no insert/remove wakeup > needed like some sdio cards which is nonremovable and can wakeup host > only by card int. > > Signed-off-by: Kevin Liu <kliu5@xxxxxxxxxxx> > --- > drivers/mmc/host/sdhci.c | 30 ++++++++++++++++-------------- > 1 file changed, 16 insertions(+), 14 deletions(-) > > diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c > index c94fd6c..e4ada0d 100644 > --- a/drivers/mmc/host/sdhci.c > +++ b/drivers/mmc/host/sdhci.c > @@ -1337,19 +1337,20 @@ static void sdhci_request(struct mmc_host *mmc, struct mmc_request *mrq) > > host->mrq = mrq; > > - /* > - * Firstly check card presence from cd-gpio. The return could > - * be one of the following possibilities: > - * negative: cd-gpio is not available > - * zero: cd-gpio is used, and card is removed > - * one: cd-gpio is used, and card is present > - */ > - present = mmc_gpio_get_cd(host->mmc); > - if (present < 0) { > - /* If polling, assume that the card is always present. */ > - if (host->quirks & SDHCI_QUIRK_BROKEN_CARD_DETECTION) > - present = 1; > - else > + /* If polling/nonremovable, assume that the card is always present. */ > + if ((host->quirks & SDHCI_QUIRK_BROKEN_CARD_DETECTION) || > + (host->mmc->caps & MMC_CAP_NONREMOVABLE)) { > + present = 1; > + } else { > + /* > + * Firstly check card presence from cd-gpio. The return could > + * be one of the following possibilities: > + * negative: cd-gpio is not available > + * zero: cd-gpio is used, and card is removed > + * one: cd-gpio is used, and card is present > + */ > + present = mmc_gpio_get_cd(host->mmc); > + if (IS_ERR_VALUE(present)) > present = sdhci_readl(host, SDHCI_PRESENT_STATE) & > SDHCI_CARD_PRESENT; Hi Kevin does it make sense to move this logic to a more generic function (static inline ?) int sdhci_card_present () and encapsulate all the logic there for gpio cd, present state (card is there) etc. Philip > } > @@ -2504,7 +2505,8 @@ void sdhci_enable_irq_wakeups(struct sdhci_host *host) > val = sdhci_readb(host, SDHCI_WAKE_UP_CONTROL); > val |= mask ; > /* Avoid fake wake up */ > - if (host->quirks & SDHCI_QUIRK_BROKEN_CARD_DETECTION) > + if ((host->quirks & SDHCI_QUIRK_BROKEN_CARD_DETECTION) || > + (host->mmc->caps & MMC_CAP_NONREMOVABLE)) > val &= ~(SDHCI_WAKE_ON_INSERT | SDHCI_WAKE_ON_REMOVE); > sdhci_writeb(host, val, SDHCI_WAKE_UP_CONTROL); > } > -- > 1.7.9.5 > -- To unsubscribe from this list: send the line "unsubscribe linux-mmc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html