The quirk SDHCI_QUIRK_BROKEN_CARD_DETECTION is not quite what may needed for 
embedded systems.

Sometimes the card is hard wired onto the board and is always present -- 
usually the signal into the controller
is not used by the board designed -- saves a pin

Sometimes the card is plugged into a slot and Card Detect REALLY is broken.  In 
this case we need to poll by 
setting MMC_CAP_NEEDS_POLL so mmc_detect_change() will find the card.

        if (host->caps & MMC_CAP_NEEDS_POLL)
                mmc_schedule_delayed_work(&host->detect, HZ);


Since the behavior is a board issue I think it makes more sense to define a new 
struct sdhci_ops {
}

that gets called and the adaption layer can decide to set or not set 
MMC_CAP_NEEDS_POLL.  if this is okay will
generate the patch.

Sample code snippets below

struct sdhci_ops {
        ......
        void    (*card_detect)(struct sdhci_host *host);
}

====
replace 

        if (caps & SDHCI_CAN_DO_HISPD)
                mmc->caps |= MMC_CAP_SD_HIGHSPEED;

        if (host->quirks & SDHCI_QUIRK_BROKEN_CARD_DETECTION)
                mmc->caps |= MMC_CAP_NEEDS_POLL;


with

        if (caps & SDHCI_CAN_DO_HISPD)
                mmc->caps |= MMC_CAP_SD_HIGHSPEED;

        if (host->ops->card_detect)
                host->ops->card_detect(host)
====

platform code 
void card_detect (struct sdhci_host *host)
{
        if (card_hard_wired || sd_slot_has_no_card_detect_signal) {
                host->quirks |= SDHCI_QUIRK_BROKEN_CARD_DETECTION;
                if (sd_slot_has_no_card_detect_signal)
                        host->mmc->caps |= MMC_CAP_NEEDS_POLL
        }
}--
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