Message ID | 1510136220-31853-4-git-send-email-yamada.masahiro@socionext.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Wed, Nov 08, 2017 at 07:17:00PM +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. I might be missing something: Why do we need to report something sensible in this case? The card insert/eject interrupts calling mmc_detect_change is not enough?
2017-11-20 4:45 GMT+09:00 Wolfram Sang <wsa@the-dreams.de>: > On Wed, Nov 08, 2017 at 07:17:00PM +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. > > I might be missing something: Why do we need to report something > sensible in this case? The card insert/eject interrupts calling > mmc_detect_change is not enough? > Not enough. mmc_detect_change() just schedules mmc_rescan(). Without correct ->get_cd(), how can mmc_rescan() know whether a card is inserted or not?
diff --git a/drivers/mmc/host/tmio_mmc_core.c b/drivers/mmc/host/tmio_mmc_core.c index 9fd0874..85a2944 100644 --- a/drivers/mmc/host/tmio_mmc_core.c +++ b/drivers/mmc/host/tmio_mmc_core.c @@ -1087,6 +1087,19 @@ static int tmio_mmc_get_ro(struct mmc_host *mmc) return ret; } +static int tmio_mmc_get_cd(struct mmc_host *mmc) +{ + struct tmio_mmc_host *host = mmc_priv(mmc); + int ret; + + ret = mmc_gpio_get_cd(mmc); + if (ret >= 0) + return ret; + + 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) { @@ -1102,7 +1115,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,
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> --- drivers/mmc/host/tmio_mmc_core.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-)