mmc: renesas_sdhi: Add a condition of cmd/data timeout for retune
According to the datasheet, this controller needs retune when cmd or data timeout happens. So, add a condition into .check_retune(). Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com> Reviewed-by: Wolfram Sang <wsa+renesas@sang-engineering.com> Link: https://lore.kernel.org/r/1608708622-29668-3-git-send-email-yoshihiro.shimoda.uh@renesas.com Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
This commit is contained in:
parent
35cdcd1268
commit
ed2fab9a82
@ -768,10 +768,12 @@ static bool renesas_sdhi_auto_correction(struct tmio_mmc_host *host)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool renesas_sdhi_check_scc_error(struct tmio_mmc_host *host)
|
static bool renesas_sdhi_check_scc_error(struct tmio_mmc_host *host,
|
||||||
|
struct mmc_request *mrq)
|
||||||
{
|
{
|
||||||
struct renesas_sdhi *priv = host_to_priv(host);
|
struct renesas_sdhi *priv = host_to_priv(host);
|
||||||
bool use_4tap = priv->quirks && priv->quirks->hs400_4taps;
|
bool use_4tap = priv->quirks && priv->quirks->hs400_4taps;
|
||||||
|
bool ret = false;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Skip checking SCC errors when running on 4 taps in HS400 mode as
|
* Skip checking SCC errors when running on 4 taps in HS400 mode as
|
||||||
@ -785,11 +787,19 @@ static bool renesas_sdhi_check_scc_error(struct tmio_mmc_host *host)
|
|||||||
if (mmc_doing_tune(host->mmc))
|
if (mmc_doing_tune(host->mmc))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
if (((mrq->cmd->error == -ETIMEDOUT) ||
|
||||||
|
(mrq->data && mrq->data->error == -ETIMEDOUT)) &&
|
||||||
|
((host->mmc->caps & MMC_CAP_NONREMOVABLE) ||
|
||||||
|
(host->ops.get_cd && host->ops.get_cd(host->mmc))))
|
||||||
|
ret |= true;
|
||||||
|
|
||||||
if (sd_scc_read32(host, priv, SH_MOBILE_SDHI_SCC_RVSCNTL) &
|
if (sd_scc_read32(host, priv, SH_MOBILE_SDHI_SCC_RVSCNTL) &
|
||||||
SH_MOBILE_SDHI_SCC_RVSCNTL_RVSEN)
|
SH_MOBILE_SDHI_SCC_RVSCNTL_RVSEN)
|
||||||
return renesas_sdhi_auto_correction(host);
|
ret |= renesas_sdhi_auto_correction(host);
|
||||||
|
else
|
||||||
|
ret |= renesas_sdhi_manual_correction(host, use_4tap);
|
||||||
|
|
||||||
return renesas_sdhi_manual_correction(host, use_4tap);
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int renesas_sdhi_wait_idle(struct tmio_mmc_host *host, u32 bit)
|
static int renesas_sdhi_wait_idle(struct tmio_mmc_host *host, u32 bit)
|
||||||
|
@ -181,7 +181,7 @@ struct tmio_mmc_host {
|
|||||||
unsigned int direction, int blk_size);
|
unsigned int direction, int blk_size);
|
||||||
int (*write16_hook)(struct tmio_mmc_host *host, int addr);
|
int (*write16_hook)(struct tmio_mmc_host *host, int addr);
|
||||||
void (*reset)(struct tmio_mmc_host *host);
|
void (*reset)(struct tmio_mmc_host *host);
|
||||||
bool (*check_retune)(struct tmio_mmc_host *host);
|
bool (*check_retune)(struct tmio_mmc_host *host, struct mmc_request *mrq);
|
||||||
void (*fixup_request)(struct tmio_mmc_host *host, struct mmc_request *mrq);
|
void (*fixup_request)(struct tmio_mmc_host *host, struct mmc_request *mrq);
|
||||||
unsigned int (*get_timeout_cycles)(struct tmio_mmc_host *host);
|
unsigned int (*get_timeout_cycles)(struct tmio_mmc_host *host);
|
||||||
|
|
||||||
|
@ -804,7 +804,7 @@ static void tmio_mmc_finish_request(struct tmio_mmc_host *host)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Error means retune, but executed command was still successful */
|
/* Error means retune, but executed command was still successful */
|
||||||
if (host->check_retune && host->check_retune(host))
|
if (host->check_retune && host->check_retune(host, mrq))
|
||||||
mmc_retune_needed(host->mmc);
|
mmc_retune_needed(host->mmc);
|
||||||
|
|
||||||
/* If SET_BLOCK_COUNT, continue with main command */
|
/* If SET_BLOCK_COUNT, continue with main command */
|
||||||
|
Loading…
Reference in New Issue
Block a user