|
@@ -24,6 +24,7 @@
|
|
|
#include <linux/io.h>
|
|
|
#include <linux/gpio.h>
|
|
|
#include <linux/pm_runtime.h>
|
|
|
+#include <linux/mmc/slot-gpio.h>
|
|
|
#include <linux/mmc/sdhci-pci-data.h>
|
|
|
|
|
|
#include "sdhci.h"
|
|
@@ -280,6 +281,14 @@ static int byt_sdio_probe_slot(struct sdhci_pci_slot *slot)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+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;
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
static const struct sdhci_pci_fixes sdhci_intel_byt_emmc = {
|
|
|
.allow_runtime_pm = true,
|
|
|
.probe_slot = byt_emmc_probe_slot,
|
|
@@ -300,6 +309,7 @@ static const struct sdhci_pci_fixes sdhci_intel_byt_sd = {
|
|
|
SDHCI_QUIRK2_STOP_WITH_TC,
|
|
|
.allow_runtime_pm = true,
|
|
|
.own_cd_for_runtime_pm = true,
|
|
|
+ .probe_slot = byt_sd_probe_slot,
|
|
|
};
|
|
|
|
|
|
/* Define Host controllers for Intel Merrifield platform */
|
|
@@ -1354,6 +1364,7 @@ static struct sdhci_pci_slot *sdhci_pci_probe_slot(
|
|
|
slot->pci_bar = bar;
|
|
|
slot->rst_n_gpio = -EINVAL;
|
|
|
slot->cd_gpio = -EINVAL;
|
|
|
+ slot->cd_idx = -1;
|
|
|
|
|
|
/* Retrieve platform data if there is any */
|
|
|
if (*sdhci_pci_get_data)
|
|
@@ -1412,6 +1423,13 @@ static struct sdhci_pci_slot *sdhci_pci_probe_slot(
|
|
|
host->mmc->slotno = slotno;
|
|
|
host->mmc->caps2 |= MMC_CAP2_NO_PRESCAN_POWERUP;
|
|
|
|
|
|
+ if (slot->cd_idx >= 0 &&
|
|
|
+ mmc_gpiod_request_cd(host->mmc, slot->cd_con_id, slot->cd_idx,
|
|
|
+ slot->cd_override_level, 0, NULL)) {
|
|
|
+ dev_warn(&pdev->dev, "failed to setup card detect gpio\n");
|
|
|
+ slot->cd_idx = -1;
|
|
|
+ }
|
|
|
+
|
|
|
ret = sdhci_add_host(host);
|
|
|
if (ret)
|
|
|
goto remove;
|
|
@@ -1424,7 +1442,7 @@ static struct sdhci_pci_slot *sdhci_pci_probe_slot(
|
|
|
* Note sdhci_pci_add_own_cd() sets slot->cd_gpio to -EINVAL on failure.
|
|
|
*/
|
|
|
if (chip->fixes && chip->fixes->own_cd_for_runtime_pm &&
|
|
|
- !gpio_is_valid(slot->cd_gpio))
|
|
|
+ !gpio_is_valid(slot->cd_gpio) && slot->cd_idx < 0)
|
|
|
chip->allow_runtime_pm = false;
|
|
|
|
|
|
return slot;
|