Commit b2dd9a13 authored by Wolfram Sang's avatar Wolfram Sang Committed by Ulf Hansson

mmc: tmio: factor out TAP usage

TAPs are Renesas SDHI specific. Now that we moved all handling to the
SDHI core, we can also move the definitions from the TMIO struct to the
SDHI one.
Signed-off-by: default avatarWolfram Sang <wsa+renesas@sang-engineering.com>
Reviewed-by: default avatarNiklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
Reviewed-by: default avatarYoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
Link: https://lore.kernel.org/r/20200129203709.30493-6-wsa+renesas@sang-engineering.comSigned-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
parent a86bf70b
...@@ -58,6 +58,11 @@ struct renesas_sdhi { ...@@ -58,6 +58,11 @@ struct renesas_sdhi {
u32 scc_tappos; u32 scc_tappos;
u32 scc_tappos_hs400; u32 scc_tappos_hs400;
bool doing_tune; bool doing_tune;
/* Tuning values: 1 for success, 0 for failure */
DECLARE_BITMAP(taps, BITS_PER_BYTE * sizeof(long));
unsigned int tap_num;
unsigned long tap_set;
}; };
#define host_to_priv(host) \ #define host_to_priv(host) \
......
...@@ -354,7 +354,7 @@ static void renesas_sdhi_hs400_complete(struct tmio_mmc_host *host) ...@@ -354,7 +354,7 @@ static void renesas_sdhi_hs400_complete(struct tmio_mmc_host *host)
if (priv->quirks && priv->quirks->hs400_4taps) if (priv->quirks && priv->quirks->hs400_4taps)
sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_TAPSET, sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_TAPSET,
host->tap_set / 2); priv->tap_set / 2);
sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_CKSEL, sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_CKSEL,
SH_MOBILE_SDHI_SCC_CKSEL_DTSEL | SH_MOBILE_SDHI_SCC_CKSEL_DTSEL |
...@@ -438,11 +438,11 @@ static int renesas_sdhi_select_tuning(struct tmio_mmc_host *host) ...@@ -438,11 +438,11 @@ static int renesas_sdhi_select_tuning(struct tmio_mmc_host *host)
* result requiring the tap to be good in both runs before * result requiring the tap to be good in both runs before
* considering it for tuning selection. * considering it for tuning selection.
*/ */
for (i = 0; i < host->tap_num * 2; i++) { for (i = 0; i < priv->tap_num * 2; i++) {
int offset = host->tap_num * (i < host->tap_num ? 1 : -1); int offset = priv->tap_num * (i < priv->tap_num ? 1 : -1);
if (!test_bit(i, host->taps)) if (!test_bit(i, priv->taps))
clear_bit(i + offset, host->taps); clear_bit(i + offset, priv->taps);
} }
/* /*
...@@ -454,8 +454,8 @@ static int renesas_sdhi_select_tuning(struct tmio_mmc_host *host) ...@@ -454,8 +454,8 @@ static int renesas_sdhi_select_tuning(struct tmio_mmc_host *host)
ntap = 0; ntap = 0;
tap_start = 0; tap_start = 0;
tap_end = 0; tap_end = 0;
for (i = 0; i < host->tap_num * 2; i++) { for (i = 0; i < priv->tap_num * 2; i++) {
if (test_bit(i, host->taps)) { if (test_bit(i, priv->taps)) {
ntap++; ntap++;
} else { } else {
if (ntap > tap_cnt) { if (ntap > tap_cnt) {
...@@ -474,12 +474,12 @@ static int renesas_sdhi_select_tuning(struct tmio_mmc_host *host) ...@@ -474,12 +474,12 @@ static int renesas_sdhi_select_tuning(struct tmio_mmc_host *host)
} }
if (tap_cnt >= SH_MOBILE_SDHI_MAX_TAP) if (tap_cnt >= SH_MOBILE_SDHI_MAX_TAP)
host->tap_set = (tap_start + tap_end) / 2 % host->tap_num; priv->tap_set = (tap_start + tap_end) / 2 % priv->tap_num;
else else
return -EIO; return -EIO;
/* Set SCC */ /* Set SCC */
sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_TAPSET, host->tap_set); sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_TAPSET, priv->tap_set);
/* Enable auto re-tuning */ /* Enable auto re-tuning */
sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_RVSCNTL, sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_RVSCNTL,
...@@ -494,27 +494,27 @@ static int renesas_sdhi_execute_tuning(struct tmio_mmc_host *host, u32 opcode) ...@@ -494,27 +494,27 @@ static int renesas_sdhi_execute_tuning(struct tmio_mmc_host *host, u32 opcode)
struct renesas_sdhi *priv = host_to_priv(host); struct renesas_sdhi *priv = host_to_priv(host);
int i, ret; int i, ret;
host->tap_num = renesas_sdhi_init_tuning(host); priv->tap_num = renesas_sdhi_init_tuning(host);
if (!host->tap_num) if (!priv->tap_num)
return 0; /* Tuning is not supported */ return 0; /* Tuning is not supported */
if (host->tap_num * 2 >= sizeof(host->taps) * BITS_PER_BYTE) { if (priv->tap_num * 2 >= sizeof(priv->taps) * BITS_PER_BYTE) {
dev_err(&host->pdev->dev, dev_err(&host->pdev->dev,
"Too many taps, please update 'taps' in tmio_mmc_host!\n"); "Too many taps, please update 'taps' in tmio_mmc_host!\n");
return -EINVAL; return -EINVAL;
} }
priv->doing_tune = true; priv->doing_tune = true;
bitmap_zero(host->taps, host->tap_num * 2); bitmap_zero(priv->taps, priv->tap_num * 2);
/* Issue CMD19 twice for each tap */ /* Issue CMD19 twice for each tap */
for (i = 0; i < 2 * host->tap_num; i++) { for (i = 0; i < 2 * priv->tap_num; i++) {
/* Set sampling clock position */ /* Set sampling clock position */
sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_TAPSET, i % host->tap_num); sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_TAPSET, i % priv->tap_num);
ret = mmc_send_tuning(host->mmc, opcode, NULL); ret = mmc_send_tuning(host->mmc, opcode, NULL);
if (ret == 0) if (ret == 0)
set_bit(i, host->taps); set_bit(i, priv->taps);
} }
return renesas_sdhi_select_tuning(host); return renesas_sdhi_select_tuning(host);
...@@ -523,7 +523,7 @@ static int renesas_sdhi_execute_tuning(struct tmio_mmc_host *host, u32 opcode) ...@@ -523,7 +523,7 @@ static int renesas_sdhi_execute_tuning(struct tmio_mmc_host *host, u32 opcode)
static bool renesas_sdhi_manual_correction(struct tmio_mmc_host *host, bool use_4tap) static bool renesas_sdhi_manual_correction(struct tmio_mmc_host *host, bool use_4tap)
{ {
struct renesas_sdhi *priv = host_to_priv(host); struct renesas_sdhi *priv = host_to_priv(host);
unsigned long new_tap = host->tap_set; unsigned long new_tap = priv->tap_set;
u32 val; u32 val;
val = sd_scc_read32(host, priv, SH_MOBILE_SDHI_SCC_RVSREQ); val = sd_scc_read32(host, priv, SH_MOBILE_SDHI_SCC_RVSREQ);
...@@ -560,9 +560,9 @@ static bool renesas_sdhi_manual_correction(struct tmio_mmc_host *host, bool use_ ...@@ -560,9 +560,9 @@ static bool renesas_sdhi_manual_correction(struct tmio_mmc_host *host, bool use_
return false; return false;
} }
host->tap_set = (new_tap % host->tap_num); priv->tap_set = (new_tap % priv->tap_num);
sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_TAPSET, sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_TAPSET,
host->tap_set / (use_4tap ? 2 : 1)); priv->tap_set / (use_4tap ? 2 : 1));
return false; return false;
} }
......
...@@ -184,11 +184,6 @@ struct tmio_mmc_host { ...@@ -184,11 +184,6 @@ struct tmio_mmc_host {
*/ */
int (*execute_tuning)(struct tmio_mmc_host *host, u32 opcode); int (*execute_tuning)(struct tmio_mmc_host *host, u32 opcode);
/* Tuning values: 1 for success, 0 for failure */
DECLARE_BITMAP(taps, BITS_PER_BYTE * sizeof(long));
unsigned int tap_num;
unsigned long tap_set;
void (*prepare_hs400_tuning)(struct tmio_mmc_host *host); void (*prepare_hs400_tuning)(struct tmio_mmc_host *host);
void (*hs400_downgrade)(struct tmio_mmc_host *host); void (*hs400_downgrade)(struct tmio_mmc_host *host);
void (*hs400_complete)(struct tmio_mmc_host *host); void (*hs400_complete)(struct tmio_mmc_host *host);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment