mmc: renesas_sdhi: alway populate SCC pointer
authorWolfram Sang <wsa+renesas@sang-engineering.com>
Sun, 20 Nov 2022 11:34:54 +0000 (12:34 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 31 Dec 2022 12:14:17 +0000 (13:14 +0100)
[ Upstream commit 3d4f9898c1c74323dd61d6a8a0efca9401232ad4 ]

We need the SCC pointer to reset the device, so populate it even when we
don't need it for tuning.

Fixes: 45bffc371fef ("mmc: renesas_sdhi: only reset SCC when its pointer is populated")
Signed-off-by: Takeshi Saito <takeshi.saito.xv@renesas.com>
Signed-off-by: Takeshi Kihara <takeshi.kihara.df@renesas.com>
Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Reviewed-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
Tested-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
Link: https://lore.kernel.org/r/20221120113457.42010-2-wsa+renesas@sang-engineering.com
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/mmc/host/renesas_sdhi_core.c

index 387f2a4..f443deb 100644 (file)
@@ -1037,11 +1037,14 @@ int renesas_sdhi_probe(struct platform_device *pdev,
        if (ver >= SDHI_VER_GEN3_SD)
                host->get_timeout_cycles = renesas_sdhi_gen3_get_cycles;
 
+       /* Check for SCC so we can reset it if needed */
+       if (of_data && of_data->scc_offset && ver >= SDHI_VER_GEN2_SDR104)
+               priv->scc_ctl = host->ctl + of_data->scc_offset;
+
        /* Enable tuning iff we have an SCC and a supported mode */
-       if (of_data && of_data->scc_offset &&
-           (host->mmc->caps & MMC_CAP_UHS_SDR104 ||
-            host->mmc->caps2 & (MMC_CAP2_HS200_1_8V_SDR |
-                                MMC_CAP2_HS400_1_8V))) {
+       if (priv->scc_ctl && (host->mmc->caps & MMC_CAP_UHS_SDR104 ||
+           host->mmc->caps2 & (MMC_CAP2_HS200_1_8V_SDR |
+                               MMC_CAP2_HS400_1_8V))) {
                const struct renesas_sdhi_scc *taps = of_data->taps;
                bool use_4tap = priv->quirks && priv->quirks->hs400_4taps;
                bool hit = false;
@@ -1061,7 +1064,6 @@ int renesas_sdhi_probe(struct platform_device *pdev,
                if (!hit)
                        dev_warn(&host->pdev->dev, "Unknown clock rate for tuning\n");
 
-               priv->scc_ctl = host->ctl + of_data->scc_offset;
                host->check_retune = renesas_sdhi_check_scc_error;
                host->ops.execute_tuning = renesas_sdhi_execute_tuning;
                host->ops.prepare_hs400_tuning = renesas_sdhi_prepare_hs400_tuning;