mmc: arm_pl180_mmci: add .getcd callback
authorPatrice Chotard <patrice.chotard@st.com>
Mon, 23 Oct 2017 08:57:34 +0000 (10:57 +0200)
committerTom Rini <trini@konsulko.com>
Fri, 17 Nov 2017 12:44:13 +0000 (07:44 -0500)
Add .getcd callback to check is MMC card is present

Signed-off-by: Patrice Chotard <patrice.chotard@st.com>
drivers/mmc/arm_pl180_mmci.c
drivers/mmc/arm_pl180_mmci.h

index 3de6b12b0c52524614b159e159a9eee3c45558a5..89a7c1924244cc738e41ab11b56b487f5114496c 100644 (file)
 #include <malloc.h>
 #include <mmc.h>
 
-#include "arm_pl180_mmci.h"
-
 #include <asm/io.h>
+#include <asm-generic/gpio.h>
+
+#include "arm_pl180_mmci.h"
 
 #ifdef CONFIG_DM_MMC
 #include <dm.h>
@@ -435,6 +436,8 @@ static int arm_pl180_mmc_probe(struct udevice *dev)
                                               MMC_CLOCK_MAX);
        host->version2 = dev_get_driver_data(dev);
 
+       gpio_request_by_name(dev, "cd-gpios", 0, &host->cd_gpio, GPIOD_IS_IN);
+
        bus_width = dev_read_u32_default(dev, "bus-width", 1);
        switch (bus_width) {
        case 8:
@@ -477,9 +480,26 @@ static int dm_host_set_ios(struct udevice *dev)
        return host_set_ios(mmc);
 }
 
+static int dm_mmc_getcd(struct udevice *dev)
+{
+       struct arm_pl180_mmc_plat *pdata = dev_get_platdata(dev);
+       struct mmc *mmc = &pdata->mmc;
+       struct pl180_mmc_host *host = mmc->priv;
+       int value = 1;
+
+       if (dm_gpio_is_valid(&host->cd_gpio)) {
+               value = dm_gpio_get_value(&host->cd_gpio);
+               if (host->cd_inverted)
+                       return !value;
+       }
+
+       return value;
+}
+
 static const struct dm_mmc_ops arm_pl180_dm_mmc_ops = {
        .send_cmd = dm_host_request,
        .set_ios = dm_host_set_ios,
+       .get_cd = dm_mmc_getcd,
 };
 
 static int arm_pl180_mmc_ofdata_to_platdata(struct udevice *dev)
index b93528870458585eaa72a11714d03c34ec8093a7..9df4b75470f8dc7d41b3d29c122e36eedf78db28 100644 (file)
@@ -191,6 +191,10 @@ struct pl180_mmc_host {
        unsigned int pwr_init;
        int version2;
        struct mmc_config cfg;
+#ifdef CONFIG_DM_MMC
+       struct gpio_desc cd_gpio;
+       bool cd_inverted;
+#endif
 };
 
 int arm_pl180_mmci_init(struct pl180_mmc_host *host, struct mmc **mmc);