MMC: davinici_mmc: Enable CD and WP with DM and OF_CONTROL
authorAdam Ford <aford173@gmail.com>
Mon, 3 Sep 2018 08:47:52 +0000 (03:47 -0500)
committerTom Rini <trini@konsulko.com>
Wed, 12 Sep 2018 01:49:02 +0000 (21:49 -0400)
When used with a device tree, this will extract the card detect
and write protect pins from the device tree and configure them
accordingly.  This assumes the GPIO_ACTIVE_LOW/HIGH is supported
by da8xx_gpio.

Signed-off-by: Adam Ford <aford173@gmail.com>
drivers/mmc/davinci_mmc.c

index db950ea5ec551b3ea314163704584948df505b69..0d63279db00afbb31f23149b1ff3285f9211c1cc 100644 (file)
@@ -15,6 +15,7 @@
 #include <malloc.h>
 #include <asm/io.h>
 #include <asm/arch/sdmmc_defs.h>
+#include <asm-generic/gpio.h>
 
 #define DAVINCI_MAX_BLOCKS     (32)
 #define WATCHDOG_COUNT         (100000)
@@ -35,6 +36,8 @@ struct davinci_mmc_priv {
        struct davinci_mmc_regs *reg_base;      /* Register base address */
        uint input_clk;         /* Input clock to MMC controller */
        uint version;           /* MMC Controller version */
+       struct gpio_desc cd_gpio;       /* Card Detect GPIO */
+       struct gpio_desc wp_gpio;       /* Write Protect GPIO */
 };
 
 struct davinci_mmc_plat
@@ -425,9 +428,41 @@ static const struct mmc_ops dmmc_ops = {
        .init           = dmmc_init,
 };
 #else
+
+static int davinci_mmc_getcd(struct udevice *dev)
+{
+       int value = -1;
+#if CONFIG_IS_ENABLED(DM_GPIO)
+       struct davinci_mmc_priv *priv = dev_get_priv(dev);
+       value = dm_gpio_get_value(&priv->cd_gpio);
+#endif
+       /* if no CD return as 1 */
+       if (value < 0)
+               return 1;
+
+       return value;
+}
+
+static int davinci_mmc_getwp(struct udevice *dev)
+{
+       int value = -1;
+#if CONFIG_IS_ENABLED(DM_GPIO)
+       struct davinci_mmc_priv *priv = dev_get_priv(dev);
+
+       value = dm_gpio_get_value(&priv->wp_gpio);
+#endif
+       /* if no WP return as 0 */
+       if (value < 0)
+               return 0;
+
+       return value;
+}
+
 static const struct dm_mmc_ops davinci_mmc_ops = {
        .send_cmd       = davinci_mmc_send_cmd,
        .set_ios        = davinci_mmc_set_ios,
+       .get_cd         = davinci_mmc_getcd,
+       .get_wp         = davinci_mmc_getwp,
 };
 #endif
 
@@ -475,6 +510,12 @@ static int davinci_mmc_probe(struct udevice *dev)
        priv->reg_base = (struct davinci_mmc_regs *)dev_read_addr(dev);
        priv->input_clk = clk_get(DAVINCI_MMCSD_CLKID);
 
+#if CONFIG_IS_ENABLED(DM_GPIO)
+       /* These GPIOs are optional */
+       gpio_request_by_name(dev, "cd-gpios", 0, &priv->cd_gpio, GPIOD_IS_IN);
+       gpio_request_by_name(dev, "wp-gpios", 0, &priv->wp_gpio, GPIOD_IS_IN);
+#endif
+
        upriv->mmc = &plat->mmc;
 
        return davinci_dm_mmc_init(dev);