Commit faed9303 authored by Linus Walleij's avatar Linus Walleij Committed by Ulf Hansson

mmc: host: tmio: Use GPIO descriptors

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: default avatarLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Acked-by: default avatarKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
parent 5716fb9b
...@@ -696,13 +696,20 @@ static struct gpiod_lookup_table sdhi0_power_gpiod_table = { ...@@ -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 = { static struct tmio_mmc_data sdhi0_info = {
.chan_priv_tx = (void *)SHDMA_SLAVE_SDHI0_TX, .chan_priv_tx = (void *)SHDMA_SLAVE_SDHI0_TX,
.chan_priv_rx = (void *)SHDMA_SLAVE_SDHI0_RX, .chan_priv_rx = (void *)SHDMA_SLAVE_SDHI0_RX,
.capabilities = MMC_CAP_SDIO_IRQ | MMC_CAP_POWER_OFF_CARD | .capabilities = MMC_CAP_SDIO_IRQ | MMC_CAP_POWER_OFF_CARD |
MMC_CAP_NEEDS_POLL, MMC_CAP_NEEDS_POLL,
.flags = TMIO_MMC_USE_GPIO_CD,
.cd_gpio = GPIO_PTY7,
}; };
static struct resource sdhi0_resources[] = { static struct resource sdhi0_resources[] = {
...@@ -735,8 +742,15 @@ static struct tmio_mmc_data sdhi1_info = { ...@@ -735,8 +742,15 @@ static struct tmio_mmc_data sdhi1_info = {
.chan_priv_rx = (void *)SHDMA_SLAVE_SDHI1_RX, .chan_priv_rx = (void *)SHDMA_SLAVE_SDHI1_RX,
.capabilities = MMC_CAP_SDIO_IRQ | MMC_CAP_POWER_OFF_CARD | .capabilities = MMC_CAP_SDIO_IRQ | MMC_CAP_POWER_OFF_CARD |
MMC_CAP_NEEDS_POLL, 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[] = { static struct resource sdhi1_resources[] = {
...@@ -1445,6 +1459,10 @@ static int __init arch_setup(void) ...@@ -1445,6 +1459,10 @@ static int __init arch_setup(void)
gpiod_add_lookup_table(&cn12_power_gpiod_table); gpiod_add_lookup_table(&cn12_power_gpiod_table);
#if defined(CONFIG_MMC_SDHI) || defined(CONFIG_MMC_SDHI_MODULE) #if defined(CONFIG_MMC_SDHI) || defined(CONFIG_MMC_SDHI_MODULE)
gpiod_add_lookup_table(&sdhi0_power_gpiod_table); 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 #endif
return platform_add_devices(ecovec_devices, return platform_add_devices(ecovec_devices,
......
...@@ -1168,11 +1168,13 @@ int tmio_mmc_host_probe(struct tmio_mmc_host *_host) ...@@ -1168,11 +1168,13 @@ int tmio_mmc_host_probe(struct tmio_mmc_host *_host)
if (ret < 0) if (ret < 0)
return ret; return ret;
if (pdata->flags & TMIO_MMC_USE_GPIO_CD) { /*
ret = mmc_gpio_request_cd(mmc, pdata->cd_gpio, 0); * Look for a card detect GPIO, if it fails with anything
if (ret) * 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; return ret;
}
mmc->caps |= MMC_CAP_4_BIT_DATA | pdata->capabilities; mmc->caps |= MMC_CAP_4_BIT_DATA | pdata->capabilities;
mmc->caps2 |= pdata->capabilities2; mmc->caps2 |= pdata->capabilities2;
......
...@@ -54,12 +54,8 @@ ...@@ -54,12 +54,8 @@
* idle before writing to some registers. * idle before writing to some registers.
*/ */
#define TMIO_MMC_HAS_IDLE_WAIT BIT(4) #define TMIO_MMC_HAS_IDLE_WAIT BIT(4)
/*
* A GPIO is used for card hotplug detection. We need an extra flag for this, /* BIT(5) is unused */
* 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)
/* /*
* Some controllers have CMD12 automatically * Some controllers have CMD12 automatically
...@@ -104,7 +100,6 @@ struct tmio_mmc_data { ...@@ -104,7 +100,6 @@ struct tmio_mmc_data {
unsigned long capabilities2; unsigned long capabilities2;
unsigned long flags; unsigned long flags;
u32 ocr_mask; /* available voltages */ u32 ocr_mask; /* available voltages */
unsigned int cd_gpio;
int alignment_shift; int alignment_shift;
dma_addr_t dma_rx_offset; dma_addr_t dma_rx_offset;
unsigned int max_blk_count; unsigned int max_blk_count;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment