|
|
@@ -330,6 +330,33 @@ static void spt_read_drive_strength(struct sdhci_host *host)
|
|
|
sdhci_pci_spt_drive_strength = 0x10 | ((val >> 12) & 0xf);
|
|
|
}
|
|
|
|
|
|
+static int bxt_get_cd(struct mmc_host *mmc)
|
|
|
+{
|
|
|
+ int gpio_cd = mmc_gpio_get_cd(mmc);
|
|
|
+ struct sdhci_host *host = mmc_priv(mmc);
|
|
|
+ unsigned long flags;
|
|
|
+ int ret = 0;
|
|
|
+
|
|
|
+ if (!gpio_cd)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ pm_runtime_get_sync(mmc->parent);
|
|
|
+
|
|
|
+ spin_lock_irqsave(&host->lock, flags);
|
|
|
+
|
|
|
+ if (host->flags & SDHCI_DEVICE_DEAD)
|
|
|
+ goto out;
|
|
|
+
|
|
|
+ ret = !!(sdhci_readl(host, SDHCI_PRESENT_STATE) & SDHCI_CARD_PRESENT);
|
|
|
+out:
|
|
|
+ spin_unlock_irqrestore(&host->lock, flags);
|
|
|
+
|
|
|
+ pm_runtime_mark_last_busy(mmc->parent);
|
|
|
+ pm_runtime_put_autosuspend(mmc->parent);
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
static int byt_emmc_probe_slot(struct sdhci_pci_slot *slot)
|
|
|
{
|
|
|
slot->host->mmc->caps |= MMC_CAP_8_BIT_DATA | MMC_CAP_NONREMOVABLE |
|
|
|
@@ -362,6 +389,10 @@ static int byt_sd_probe_slot(struct sdhci_pci_slot *slot)
|
|
|
slot->cd_con_id = NULL;
|
|
|
slot->cd_idx = 0;
|
|
|
slot->cd_override_level = true;
|
|
|
+ if (slot->chip->pdev->device == PCI_DEVICE_ID_INTEL_BXT_SD ||
|
|
|
+ slot->chip->pdev->device == PCI_DEVICE_ID_INTEL_APL_SD)
|
|
|
+ slot->host->mmc_host_ops.get_cd = bxt_get_cd;
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|