| From ad028d2f04f3d70abe1b63b1f64e3db8ed22a4be Mon Sep 17 00:00:00 2001 |
| From: =?UTF-8?q?Niklas=20S=C3=B6derlund?= |
| <niklas.soderlund+renesas@ragnatech.se> |
| Date: Tue, 24 Jul 2018 16:51:38 +0200 |
| Subject: [PATCH 1807/1808] mmc: renesas_sdhi: Fix sampling clock position |
| selecting |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| When tuning each tap is issued CMD19 twice and the result of both runs |
| recorded in host->taps. If the result is different between the two runs |
| the wrong sampling clock position was selected. Fix this by merging the |
| two runs and only keep the result for each tap if it was good in both |
| sets. |
| |
| Signed-off-by: Niklas Sรถderlund <niklas.soderlund+renesas@ragnatech.se> |
| Reviewed-by: Simon Horman <horms+renesas@verge.net.au> |
| Tested-by: Wolfram Sang <wsa+renesas@sang-engineering.com> |
| Reviewed-by: Wolfram Sang <wsa+renesas@sang-engineering.com> |
| Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org> |
| (cherry picked from commit 5c99826b27d0afd4c05c2013385b17037f579cf9) |
| Signed-off-by: Simon Horman <horms+renesas@verge.net.au> |
| Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be> |
| --- |
| drivers/mmc/host/renesas_sdhi_core.c | 12 ++++++++++++ |
| 1 file changed, 12 insertions(+) |
| |
| diff --git a/drivers/mmc/host/renesas_sdhi_core.c b/drivers/mmc/host/renesas_sdhi_core.c |
| index 45c015da2e75..f087ac728e35 100644 |
| --- a/drivers/mmc/host/renesas_sdhi_core.c |
| +++ b/drivers/mmc/host/renesas_sdhi_core.c |
| @@ -301,6 +301,18 @@ static int renesas_sdhi_select_tuning(struct tmio_mmc_host *host) |
| /* Clear SCC_RVSREQ */ |
| sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_RVSREQ, 0); |
| |
| + /* |
| + * When tuning CMD19 is issued twice for each tap, merge the |
| + * result requiring the tap to be good in both runs before |
| + * considering it for tuning selection. |
| + */ |
| + for (i = 0; i < host->tap_num * 2; i++) { |
| + int offset = host->tap_num * (i < host->tap_num ? 1 : -1); |
| + |
| + if (!test_bit(i, host->taps)) |
| + clear_bit(i + offset, host->taps); |
| + } |
| + |
| /* |
| * Find the longest consecutive run of successful probes. If that |
| * is more than SH_MOBILE_SDHI_MAX_TAP probes long then use the |
| -- |
| 2.17.1 |
| |