| From 6fcc6d9f216baf519067987fc4e058e29ba2f64c Mon Sep 17 00:00:00 2001 |
| From: Wolfram Sang <wsa+renesas@sang-engineering.com> |
| Date: Mon, 12 Dec 2016 20:51:22 +0100 |
| Subject: [PATCH 147/255] mmc: sh_mobile_sdhi: improve prerequisites for tuning |
| |
| 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> |
| (cherry picked from commit e831ead3b3ddc4227cef10dc63d919fd7242d7b8) |
| Signed-off-by: Simon Horman <horms+renesas@verge.net.au> |
| --- |
| drivers/mmc/host/sh_mobile_sdhi.c | 11 ++++++----- |
| 1 file changed, 6 insertions(+), 5 deletions(-) |
| |
| --- a/drivers/mmc/host/sh_mobile_sdhi.c |
| +++ b/drivers/mmc/host/sh_mobile_sdhi.c |
| @@ -621,11 +621,6 @@ static int sh_mobile_sdhi_probe(struct p |
| 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 p |
| 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 p |
| 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; |