]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
mmc: tmio: use SDIO master interrupt bit only when allowed
authorWolfram Sang <wsa+renesas@sang-engineering.com>
Fri, 9 Dec 2016 16:51:41 +0000 (17:51 +0100)
committerUlf Hansson <ulf.hansson@linaro.org>
Mon, 13 Feb 2017 12:19:48 +0000 (13:19 +0100)
The master bit to enable SDIO interrupts can only be accessed if
SCLKDIVEN bit allows that. However, the core uses the SDIO enable
callback at times when SCLKDIVEN forbids the change. This leads to
"timeout waiting for SD bus idle" messages.

We now activate the master bit in probe once if SDIO is supported. IRQ
en-/disabling will be done now by the individual IRQ enablement bits
only.

Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Reviewed-by: Yasushi SHOJI <yashi@atmark-techno.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
drivers/mmc/host/tmio_mmc_pio.c

index 2064fa1a5bf11f9a5ca994b94087e389703bb550..3ca97f3c30797553f79dae0749167346d4ceaccf 100644 (file)
@@ -140,12 +140,10 @@ static void tmio_mmc_enable_sdio_irq(struct mmc_host *mmc, int enable)
 
                host->sdio_irq_mask = TMIO_SDIO_MASK_ALL &
                                        ~TMIO_SDIO_STAT_IOIRQ;
-               sd_ctrl_write16(host, CTL_TRANSACTION_CTL, 0x0001);
                sd_ctrl_write16(host, CTL_SDIO_IRQ_MASK, host->sdio_irq_mask);
        } else if (!enable && host->sdio_irq_enabled) {
                host->sdio_irq_mask = TMIO_SDIO_MASK_ALL;
                sd_ctrl_write16(host, CTL_SDIO_IRQ_MASK, host->sdio_irq_mask);
-               sd_ctrl_write16(host, CTL_TRANSACTION_CTL, 0x0000);
 
                host->sdio_irq_enabled = false;
                pm_runtime_mark_last_busy(mmc_dev(mmc));
@@ -1232,7 +1230,7 @@ int tmio_mmc_host_probe(struct tmio_mmc_host *_host,
        if (pdata->flags & TMIO_MMC_SDIO_IRQ) {
                _host->sdio_irq_mask = TMIO_SDIO_MASK_ALL;
                sd_ctrl_write16(_host, CTL_SDIO_IRQ_MASK, _host->sdio_irq_mask);
-               sd_ctrl_write16(_host, CTL_TRANSACTION_CTL, 0x0000);
+               sd_ctrl_write16(_host, CTL_TRANSACTION_CTL, 0x0001);
        }
 
        spin_lock_init(&_host->lock);
@@ -1280,6 +1278,9 @@ void tmio_mmc_host_remove(struct tmio_mmc_host *host)
        struct platform_device *pdev = host->pdev;
        struct mmc_host *mmc = host->mmc;
 
+       if (host->pdata->flags & TMIO_MMC_SDIO_IRQ)
+               sd_ctrl_write16(host, CTL_TRANSACTION_CTL, 0x0000);
+
        if (!host->native_hotplug)
                pm_runtime_get_sync(&pdev->dev);