]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
mmc: sdhci-pci: Add Bay Trail and Braswell SD card detect
authorAdrian Hunter <adrian.hunter@intel.com>
Wed, 24 Sep 2014 07:27:31 +0000 (10:27 +0300)
committerUlf Hansson <ulf.hansson@linaro.org>
Fri, 3 Oct 2014 12:24:52 +0000 (14:24 +0200)
Add support for card detect for Bay Trail
and Braswell SD Card host controllers in PCI
mode.

This uses the gpio descriptor API which can find
gpio descriptors, for example, on an ACPI comapnion
device.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
drivers/mmc/host/sdhci-pci.c
drivers/mmc/host/sdhci-pci.h

index 31181d8dc5616a9c82a7e94610604438b79c1f7b..4ca6ae6a175d5c2c4749b03ef45f2bbc363a6214 100644 (file)
@@ -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;
index 9c1909b2a3ad27daf75c3e23fc9de4f1e43134b4..d57c3d169914e94e716b64b90e8b8da2b86afa87 100644 (file)
@@ -64,6 +64,10 @@ struct sdhci_pci_slot {
        int                     cd_gpio;
        int                     cd_irq;
 
+       char                    *cd_con_id;
+       int                     cd_idx;
+       bool                    cd_override_level;
+
        void (*hw_reset)(struct sdhci_host *host);
 };