mmc: sh_mobile_sdhi: improve prerequisites for tuning
authorWolfram Sang <wsa+renesas@sang-engineering.com>
Mon, 12 Dec 2016 19:51:22 +0000 (20:51 +0100)
committerUlf Hansson <ulf.hansson@linaro.org>
Mon, 13 Feb 2017 12:19:49 +0000 (13:19 +0100)
Prerequisites for tuning are the same as for hw_reset. We need an SCC
and a supported mode. Populate the tuning related functions only when
those conditions are met. This also removes a tiny race window.
Previously, the functions were populated when the SCC offset was not
initialized which could have led to an OOPS.

Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
drivers/mmc/host/sh_mobile_sdhi.c

index 0a22b45b1605178d2b7b1859d37e19e9bfd72f17..b30c7f7f988c7ffd0517aea05c5a9438a184cc25 100644 (file)
@@ -621,11 +621,6 @@ static int sh_mobile_sdhi_probe(struct platform_device *pdev)
                host->card_busy = sh_mobile_sdhi_card_busy;
                host->start_signal_voltage_switch =
                        sh_mobile_sdhi_start_signal_voltage_switch;
-               host->init_tuning       = sh_mobile_sdhi_init_tuning;
-               host->prepare_tuning    = sh_mobile_sdhi_prepare_tuning;
-               host->select_tuning     = sh_mobile_sdhi_select_tuning;
-               host->check_scc_error   = sh_mobile_sdhi_check_scc_error;
-               host->hw_reset          = sh_mobile_sdhi_hw_reset;
        }
 
        /* Orginally registers were 16 bit apart, could be 32 or 64 nowadays */
@@ -666,6 +661,7 @@ static int sh_mobile_sdhi_probe(struct platform_device *pdev)
        if (ret < 0)
                goto efree;
 
+       /* 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) {
                const struct sh_mobile_sdhi_scc *taps = of_data->taps;
                bool hit = false;
@@ -685,6 +681,11 @@ static int sh_mobile_sdhi_probe(struct platform_device *pdev)
                        dev_warn(&host->pdev->dev, "Unknown clock rate for SDR104\n");
 
                priv->scc_ctl = host->ctl + of_data->scc_offset;
+               host->init_tuning = sh_mobile_sdhi_init_tuning;
+               host->prepare_tuning = sh_mobile_sdhi_prepare_tuning;
+               host->select_tuning = sh_mobile_sdhi_select_tuning;
+               host->check_scc_error = sh_mobile_sdhi_check_scc_error;
+               host->hw_reset = sh_mobile_sdhi_hw_reset;
        }
 
        i = 0;