mmc: tmio: bring tuning HW to a sane state with MMC_POWER_OFF
authorWolfram Sang <wsa+renesas@sang-engineering.com>
Fri, 6 Nov 2020 07:25:48 +0000 (08:25 +0100)
committerUlf Hansson <ulf.hansson@linaro.org>
Tue, 10 Nov 2020 12:58:01 +0000 (13:58 +0100)
When powering off a card, we need to disable the tuning HW (like SCC for
the Renesas SDHI) to get to a sane state and allow for re-tuning new
cards. This was hidden before because we wrongly did that in hw_reset()
before which was an unintended use of hw_reset(). Now that we corrected
the use of hw_reset() meanwhile, we revealed this shortcoming and need
to fix it properly by explicitly calling the downgrade callback.

Fixes: 6e7d4de10890 ("mmc: renesas_sdhi: move wrong 'hw_reset' to 'reset'")
Suggested-by: Takeshi Saito <takeshi.saito.xv@renesas.com>
Reviewed-by: Takeshi Saito <takeshi.saito.xv@renesas.com>
Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Tested-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/20201106072549.1495-3-wsa+renesas@sang-engineering.com
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
drivers/mmc/host/tmio_mmc_core.c

index cfb53d7..cb4149f 100644 (file)
@@ -927,6 +927,9 @@ static void tmio_mmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
        switch (ios->power_mode) {
        case MMC_POWER_OFF:
                tmio_mmc_power_off(host);
+               /* Downgrade ensures a sane state for tuning HW (e.g. SCC) */
+               if (host->mmc->ops->hs400_downgrade)
+                       host->mmc->ops->hs400_downgrade(host->mmc);
                host->set_clock(host, 0);
                break;
        case MMC_POWER_UP: