Message ID | 1511540697-27387-17-git-send-email-yamada.masahiro@socionext.com |
---|---|
State | Accepted |
Commit | c7cd630a9751b9ec8bba37edbba06a29e7d9a14b |
Headers | show |
Series | mmc: tmio: various fixes and cleanups | expand |
2018-01-14 5:59 GMT+09:00 Wolfram Sang <wsa@the-dreams.de>: > >> I am talking about the card detection >> by the IP-builtin circuit. > > Yes, I know. As I wrote in one of the previous patches when reviewing > it, I disabled GPIO CD and used the internal mechanism (for tests where > it is relevant). Like here, too. > >> - GPIO is not set up -> mmc_gpio_get_cd() returns -ENOSYS > > Thanks! That pointed me to the right direction. I missed that patch > 10/22 was still under discussion and not applied to mmc/next, so I had > to pick it manually. > > I can confirm now that there is an issue and your patch fixes it for the > non-GPIO case. For the GPIO case, however, the TMIO_STAT_CARD_REMOVE | > TMIO_STAT_CARD_INSERT interrupts are enabled now, too. It didn't harm > when doing my tests, but we shouldn't do it, to be safe IMO. > Could you explain why? _host->native_hotplug = !(mmc_can_gpio_cd(mmc) || mmc->caps & MMC_CAP_NEEDS_POLL || !mmc_card_is_removable(mmc)); For the GPIO case, mmc_can_gpio_cd(mmc) is 1, so _host_>native_hogplug is 0. Then, my code does nothing, doesn't it? + if (_host->native_hotplug) + tmio_mmc_enable_mmc_irqs(_host, + TMIO_STAT_CARD_REMOVE | TMIO_STAT_CARD_INSERT); -- Best Regards Masahiro Yamada
diff --git a/drivers/mmc/host/tmio_mmc_core.c b/drivers/mmc/host/tmio_mmc_core.c index b51bb06..7d169ed 100644 --- a/drivers/mmc/host/tmio_mmc_core.c +++ b/drivers/mmc/host/tmio_mmc_core.c @@ -350,8 +350,6 @@ static int tmio_mmc_start_command(struct tmio_mmc_host *host, c |= TRANSFER_READ; } - if (!host->native_hotplug) - irq_mask &= ~(TMIO_STAT_CARD_REMOVE | TMIO_STAT_CARD_INSERT); tmio_mmc_enable_mmc_irqs(host, irq_mask); /* Fire off the command */ @@ -1292,11 +1290,13 @@ int tmio_mmc_host_probe(struct tmio_mmc_host *_host, irq_mask |= TMIO_MASK_READOP; if (!_host->chan_tx) irq_mask |= TMIO_MASK_WRITEOP; - if (!_host->native_hotplug) - irq_mask &= ~(TMIO_STAT_CARD_REMOVE | TMIO_STAT_CARD_INSERT); _host->sdcard_irq_mask &= ~irq_mask; + if (_host->native_hotplug) + tmio_mmc_enable_mmc_irqs(_host, + TMIO_STAT_CARD_REMOVE | TMIO_STAT_CARD_INSERT); + spin_lock_init(&_host->lock); mutex_init(&_host->ios_lock); @@ -1383,6 +1383,10 @@ int tmio_mmc_host_runtime_resume(struct device *dev) if (host->clk_cache) tmio_mmc_set_clock(host, host->clk_cache); + if (host->native_hotplug) + tmio_mmc_enable_mmc_irqs(host, + TMIO_STAT_CARD_REMOVE | TMIO_STAT_CARD_INSERT); + tmio_mmc_enable_dma(host, true); if (tmio_mmc_can_retune(host) && host->select_tuning(host))
The TMIO mmc cannot detect the card insertion in native_hotplug mode if the driver is probed without a card inserted. The reason is obvious; all IRQs are disabled by tmio_mmc_host_probe(), as follows: tmio_mmc_disable_mmc_irqs(_host, TMIO_MASK_ALL); The IRQs are first enabled by tmio_mmc_start_command() as follows: if (!host->native_hotplug) irq_mask &= ~(TMIO_STAT_CARD_REMOVE | TMIO_STAT_CARD_INSERT); tmio_mmc_enable_mmc_irqs(host, irq_mask); If the driver is probed without a card, tmio_mmc_start_command() is never called in the first place. So, the card is never detected. The card event IRQs must be enabled in probe/resume functions. Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com> --- Changes in v2: - Newly added drivers/mmc/host/tmio_mmc_core.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) -- 2.7.4