mmc: host: tmio: Use GPIO descriptors
authorLinus Walleij <linus.walleij@linaro.org>
Sun, 2 Dec 2018 08:43:19 +0000 (09:43 +0100)
committerUlf Hansson <ulf.hansson@linaro.org>
Mon, 17 Dec 2018 07:26:24 +0000 (08:26 +0100)
The TMIO MMC driver was passing global GPIO numbers around for
card detect. It turns out only one single board in the kernel
was actually making use of this feature so it is pretty easy
to convert the driver to use only GPIO descriptors.

The lines are flagged as GPIO_ACTIVE_[LOW|HIGH] as that is
what they are, and since we can now rely on the descriptors
to have the right polarity, we set the
"override_active_level" to false in mmc_gpiod_request_cd()
and mmc_gpiod_request_ro().

Reviewed-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Acked-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
arch/sh/boards/mach-ecovec24/setup.c
drivers/mmc/host/tmio_mmc_core.c
include/linux/mfd/tmio.h

index 3097307b7cb7fba1a40aa36304ccda12530191b6..af2c28946319ca578e42de35ae7b34e3807c5c2a 100644 (file)
@@ -696,13 +696,20 @@ static struct gpiod_lookup_table sdhi0_power_gpiod_table = {
        },
 };
 
+static struct gpiod_lookup_table sdhi0_gpio_table = {
+       .dev_id = "sh_mobile_sdhi.0",
+       .table = {
+               /* Card detect */
+               GPIO_LOOKUP("sh7724_pfc", GPIO_PTY7, "cd", GPIO_ACTIVE_LOW),
+               { },
+       },
+};
+
 static struct tmio_mmc_data sdhi0_info = {
        .chan_priv_tx   = (void *)SHDMA_SLAVE_SDHI0_TX,
        .chan_priv_rx   = (void *)SHDMA_SLAVE_SDHI0_RX,
        .capabilities   = MMC_CAP_SDIO_IRQ | MMC_CAP_POWER_OFF_CARD |
                          MMC_CAP_NEEDS_POLL,
-       .flags          = TMIO_MMC_USE_GPIO_CD,
-       .cd_gpio        = GPIO_PTY7,
 };
 
 static struct resource sdhi0_resources[] = {
@@ -735,8 +742,15 @@ static struct tmio_mmc_data sdhi1_info = {
        .chan_priv_rx   = (void *)SHDMA_SLAVE_SDHI1_RX,
        .capabilities   = MMC_CAP_SDIO_IRQ | MMC_CAP_POWER_OFF_CARD |
                          MMC_CAP_NEEDS_POLL,
-       .flags          = TMIO_MMC_USE_GPIO_CD,
-       .cd_gpio        = GPIO_PTW7,
+};
+
+static struct gpiod_lookup_table sdhi1_gpio_table = {
+       .dev_id = "sh_mobile_sdhi.1",
+       .table = {
+               /* Card detect */
+               GPIO_LOOKUP("sh7724_pfc", GPIO_PTW7, "cd", GPIO_ACTIVE_LOW),
+               { },
+       },
 };
 
 static struct resource sdhi1_resources[] = {
@@ -1445,6 +1459,10 @@ static int __init arch_setup(void)
        gpiod_add_lookup_table(&cn12_power_gpiod_table);
 #if defined(CONFIG_MMC_SDHI) || defined(CONFIG_MMC_SDHI_MODULE)
        gpiod_add_lookup_table(&sdhi0_power_gpiod_table);
+       gpiod_add_lookup_table(&sdhi0_gpio_table);
+#endif
+#if !defined(CONFIG_MMC_SH_MMCIF) && !defined(CONFIG_MMC_SH_MMCIF_MODULE)
+       gpiod_add_lookup_table(&sdhi1_gpio_table);
 #endif
 
        return platform_add_devices(ecovec_devices,
index d396c5156053e410f5263a48af8ed8b229aebb41..085a0fab769c02a64f6570a73bdc2363b9fac99a 100644 (file)
@@ -1168,11 +1168,13 @@ int tmio_mmc_host_probe(struct tmio_mmc_host *_host)
        if (ret < 0)
                return ret;
 
-       if (pdata->flags & TMIO_MMC_USE_GPIO_CD) {
-               ret = mmc_gpio_request_cd(mmc, pdata->cd_gpio, 0);
-               if (ret)
-                       return ret;
-       }
+       /*
+        * Look for a card detect GPIO, if it fails with anything
+        * else than a probe deferral, just live without it.
+        */
+       ret = mmc_gpiod_request_cd(mmc, "cd", 0, false, 0, NULL);
+       if (ret == -EPROBE_DEFER)
+               return ret;
 
        mmc->caps |= MMC_CAP_4_BIT_DATA | pdata->capabilities;
        mmc->caps2 |= pdata->capabilities2;
index 1e70060c92ce0a1137fc2877d75576910e8eb142..e2687a30e5a190edeff1e4e72cdcf9c68576cb84 100644 (file)
  * idle before writing to some registers.
  */
 #define TMIO_MMC_HAS_IDLE_WAIT         BIT(4)
-/*
- * A GPIO is used for card hotplug detection. We need an extra flag for this,
- * because 0 is a valid GPIO number too, and requiring users to specify
- * cd_gpio < 0 to disable GPIO hotplug would break backwards compatibility.
- */
-#define TMIO_MMC_USE_GPIO_CD           BIT(5)
+
+/* BIT(5) is unused */
 
 /*
  * Some controllers have CMD12 automatically
@@ -104,7 +100,6 @@ struct tmio_mmc_data {
        unsigned long                   capabilities2;
        unsigned long                   flags;
        u32                             ocr_mask;       /* available voltages */
-       unsigned int                    cd_gpio;
        int                             alignment_shift;
        dma_addr_t                      dma_rx_offset;
        unsigned int                    max_blk_count;