| From bd17c40fa3c9135638f0ee320ad1a98da1a640d4 Mon Sep 17 00:00:00 2001 |
| From: Masahiro Yamada <yamada.masahiro@socionext.com> |
| Date: Thu, 18 Jan 2018 01:28:13 +0900 |
| Subject: [PATCH 0828/1795] 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> |
| (cherry picked from commit c7cd630a9751b9ec8bba37edbba06a29e7d9a14b) |
| Signed-off-by: Simon Horman <horms+renesas@verge.net.au> |
| Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be> |
| --- |
| drivers/mmc/host/tmio_mmc_core.c | 12 ++++++++---- |
| 1 file changed, 8 insertions(+), 4 deletions(-) |
| |
| diff --git a/drivers/mmc/host/tmio_mmc_core.c b/drivers/mmc/host/tmio_mmc_core.c |
| index 1bcd63a0669e..63767fd1da24 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 */ |
| @@ -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)) |
| -- |
| 2.19.0 |
| |