mirror of
https://github.com/torvalds/linux.git
synced 2026-06-01 02:53:36 +02:00
mmc: tmio: fix never-detected card insertion bug
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 card event 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>
Reviewed-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Tested-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
This commit is contained in:
parent
497d1f965c
commit
c7cd630a97
|
|
@ -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 */
|
||||
|
|
@ -1280,11 +1278,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);
|
||||
|
||||
|
|
@ -1382,6 +1382,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))
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user