Message ID | 1516206496-16612-13-git-send-email-yamada.masahiro@socionext.com (mailing list archive) |
---|---|
State | Accepted |
Delegated to: | Geert Uytterhoeven |
Headers | show |
On Thu, Jan 18, 2018 at 01:28:12AM +0900, Masahiro Yamada wrote: > A card detect GPIO is set up only for platforms with "cd-gpios" > DT property or TMIO_MMC_USE_GPIO_CD flag. However, the driver > core always uses mmc_gpio_get_cd, which just fails with -ENOSYS > if ctx->cd_gpio is unset. > > The bit 5 of the status register provides the current signal level > of the CD line. Allow to use it if the GPIO is unused. > > Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com> Reviewed-by: Wolfram Sang <wsa+renesas@sang-engineering.com> > @@ -1095,7 +1103,7 @@ static const struct mmc_host_ops tmio_mmc_ops = { I just wonder why the diff-tool puts 'const' in the definition. There is no const in my version here. And there shouldn't be because we modify the struct in this patch.
2018-02-08 4:34 GMT+09:00 Wolfram Sang <wsa@the-dreams.de>: > On Thu, Jan 18, 2018 at 01:28:12AM +0900, Masahiro Yamada wrote: >> A card detect GPIO is set up only for platforms with "cd-gpios" >> DT property or TMIO_MMC_USE_GPIO_CD flag. However, the driver >> core always uses mmc_gpio_get_cd, which just fails with -ENOSYS >> if ctx->cd_gpio is unset. >> >> The bit 5 of the status register provides the current signal level >> of the CD line. Allow to use it if the GPIO is unused. >> >> Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com> > > Reviewed-by: Wolfram Sang <wsa+renesas@sang-engineering.com> > >> @@ -1095,7 +1103,7 @@ static const struct mmc_host_ops tmio_mmc_ops = { > > I just wonder why the diff-tool puts 'const' in the definition. There is > no const in my version here. And there shouldn't be because we modify > the struct in this patch. > Which kernel version are you seeing? The following patch was applied and it is in Linus'tree. commit c055fc75c1757b220108489038cfe60496b13865 Author: Masahiro Yamada <yamada.masahiro@socionext.com> Date: Sat Nov 25 01:24:41 2017 +0900 mmc: tmio: move mmc_host_ops to struct tmio_mmc_host from static data Currently, tmio_mmc_ops is static data and tmio_mmc_host_probe() updates some hooks in the static data. This is a problem when two or more instances call tmio_mmc_host_probe() and each of them requests to use its own card_busy/start_signal_voltage_switch. We can borrow a solution from sdhci_alloc_host(). Copy the whole ops structure to host->mmc_host_ops, then override the hooks in malloc'ed data. Constify tmio_mmc_ops since it is now a template ops used by default. Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com> Reviewed-by: Wolfram Sang <wsa+renesas@sang-engineering.com> Tested-by: Wolfram Sang <wsa+renesas@sang-engineering.com> Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
diff --git a/drivers/mmc/host/tmio_mmc_core.c b/drivers/mmc/host/tmio_mmc_core.c index f30ac69..b20d5c5 100644 --- a/drivers/mmc/host/tmio_mmc_core.c +++ b/drivers/mmc/host/tmio_mmc_core.c @@ -1080,6 +1080,14 @@ static int tmio_mmc_get_ro(struct mmc_host *mmc) TMIO_STAT_WRPROTECT); } +static int tmio_mmc_get_cd(struct mmc_host *mmc) +{ + struct tmio_mmc_host *host = mmc_priv(mmc); + + return !!(sd_ctrl_read16_and_16_as_32(host, CTL_STATUS) & + TMIO_STAT_SIGSTATE); +} + static int tmio_multi_io_quirk(struct mmc_card *card, unsigned int direction, int blk_size) { @@ -1095,7 +1103,7 @@ static const struct mmc_host_ops tmio_mmc_ops = { .request = tmio_mmc_request, .set_ios = tmio_mmc_set_ios, .get_ro = tmio_mmc_get_ro, - .get_cd = mmc_gpio_get_cd, + .get_cd = tmio_mmc_get_cd, .enable_sdio_irq = tmio_mmc_enable_sdio_irq, .multi_io_quirk = tmio_multi_io_quirk, .hw_reset = tmio_mmc_hw_reset, @@ -1248,6 +1256,9 @@ int tmio_mmc_host_probe(struct tmio_mmc_host *_host) if (mmc_can_gpio_ro(mmc)) _host->ops.get_ro = mmc_gpio_get_ro; + if (mmc_can_gpio_cd(mmc)) + _host->ops.get_ro = mmc_gpio_get_cd; + _host->native_hotplug = !(mmc_can_gpio_cd(mmc) || mmc->caps & MMC_CAP_NEEDS_POLL || !mmc_card_is_removable(mmc));
A card detect GPIO is set up only for platforms with "cd-gpios" DT property or TMIO_MMC_USE_GPIO_CD flag. However, the driver core always uses mmc_gpio_get_cd, which just fails with -ENOSYS if ctx->cd_gpio is unset. The bit 5 of the status register provides the current signal level of the CD line. Allow to use it if the GPIO is unused. Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com> --- Changes in v3: - split out GPIO CD Changes in v2: None drivers/mmc/host/tmio_mmc_core.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-)