mmc: tmio: always restore irq register
authorWolfram Sang <wsa+renesas@sang-engineering.com>
Tue, 13 Apr 2021 08:31:37 +0000 (10:31 +0200)
committerUlf Hansson <ulf.hansson@linaro.org>
Thu, 15 Apr 2021 11:59:02 +0000 (13:59 +0200)
Currently, only SDHI on R-Car Gen2+ reinitializes the irq register
during reset but it should be done on all instances. We can move it from
the SDHI driver to the TMIO core, because we now have the
'sd_irq_mask_all' variable which carries the proper value to use. That
also means we can remove the initialization from tmio_mmc_probe()
because it calls tmio_mmc_reset(), too. We only move that
tmio_mmc_reset() call there a little to ensure 'sd_irq_mask_all' is
properly set.

Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
Reviewed-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
Tested-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
Link: https://lore.kernel.org/r/20210413083137.11171-1-wsa+renesas@sang-engineering.com
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
drivers/mmc/host/renesas_sdhi_core.c
drivers/mmc/host/tmio_mmc_core.c

index d36181b6f687577dae76143a35c450977bac8b16..635bf31a67359f102194fc83b08badc645dafc39 100644 (file)
@@ -588,8 +588,6 @@ static void renesas_sdhi_reset(struct tmio_mmc_host *host)
                renesas_sdhi_scc_reset(host, priv);
        }
 
-       sd_ctrl_write32_as_16_and_16(host, CTL_IRQ_MASK, TMIO_MASK_ALL_RCAR2);
-
        if (sd_ctrl_read16(host, CTL_VERSION) >= SDHI_VER_GEN3_SD) {
                val = sd_ctrl_read16(host, CTL_SD_MEM_CARD_OPT);
                val |= CARD_OPT_EXTOP;
index 0c474d78b1867eb3c95ce98849527ed86a9f2116..7dfc26f48c18f0c236308bff87705eff0c91c2db 100644 (file)
@@ -192,6 +192,9 @@ static void tmio_mmc_reset(struct tmio_mmc_host *host)
        if (host->reset)
                host->reset(host);
 
+       sd_ctrl_write32_as_16_and_16(host, CTL_IRQ_MASK, host->sdcard_irq_mask_all);
+       host->sdcard_irq_mask = host->sdcard_irq_mask_all;
+
        tmio_mmc_set_bus_width(host, host->mmc->ios.bus_width);
 
        if (host->pdata->flags & TMIO_MMC_SDIO_IRQ) {
@@ -1176,13 +1179,11 @@ 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;
 
-       _host->set_clock(_host, 0);
-       tmio_mmc_reset(_host);
-
-       _host->sdcard_irq_mask = sd_ctrl_read16_and_16_as_32(_host, CTL_IRQ_MASK);
        if (!_host->sdcard_irq_mask_all)
                _host->sdcard_irq_mask_all = TMIO_MASK_ALL;
-       tmio_mmc_disable_mmc_irqs(_host, _host->sdcard_irq_mask_all);
+
+       _host->set_clock(_host, 0);
+       tmio_mmc_reset(_host);
 
        if (_host->native_hotplug)
                tmio_mmc_enable_mmc_irqs(_host,