|
|
@@ -112,6 +112,9 @@ static void sdhci_set_card_detection(struct sdhci_host *host, bool enable)
|
|
|
{
|
|
|
u32 irqs = SDHCI_INT_CARD_REMOVE | SDHCI_INT_CARD_INSERT;
|
|
|
|
|
|
+ if (host->quirks & SDHCI_QUIRK_BROKEN_CARD_DETECTION)
|
|
|
+ return;
|
|
|
+
|
|
|
if (enable)
|
|
|
sdhci_unmask_irqs(host, irqs);
|
|
|
else
|
|
|
@@ -1041,6 +1044,7 @@ out:
|
|
|
static void sdhci_request(struct mmc_host *mmc, struct mmc_request *mrq)
|
|
|
{
|
|
|
struct sdhci_host *host;
|
|
|
+ bool present;
|
|
|
unsigned long flags;
|
|
|
|
|
|
host = mmc_priv(mmc);
|
|
|
@@ -1055,8 +1059,14 @@ static void sdhci_request(struct mmc_host *mmc, struct mmc_request *mrq)
|
|
|
|
|
|
host->mrq = mrq;
|
|
|
|
|
|
- if (!(sdhci_readl(host, SDHCI_PRESENT_STATE) & SDHCI_CARD_PRESENT)
|
|
|
- || (host->flags & SDHCI_DEVICE_DEAD)) {
|
|
|
+ /* If polling, assume that the card is always present. */
|
|
|
+ if (host->quirks & SDHCI_QUIRK_BROKEN_CARD_DETECTION)
|
|
|
+ present = true;
|
|
|
+ else
|
|
|
+ present = sdhci_readl(host, SDHCI_PRESENT_STATE) &
|
|
|
+ SDHCI_CARD_PRESENT;
|
|
|
+
|
|
|
+ if (!present || host->flags & SDHCI_DEVICE_DEAD) {
|
|
|
host->mrq->cmd->error = -ENOMEDIUM;
|
|
|
tasklet_schedule(&host->finish_tasklet);
|
|
|
} else
|
|
|
@@ -1690,6 +1700,9 @@ int sdhci_add_host(struct sdhci_host *host)
|
|
|
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;
|
|
|
+
|
|
|
mmc->ocr_avail = 0;
|
|
|
if (caps & SDHCI_CAN_VDD_330)
|
|
|
mmc->ocr_avail |= MMC_VDD_32_33|MMC_VDD_33_34;
|