Commit ed2fab9a authored by Yoshihiro Shimoda's avatar Yoshihiro Shimoda Committed by Ulf Hansson
Browse files

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: default avatarYoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
Reviewed-by: default avatarWolfram 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: default avatarUlf Hansson <ulf.hansson@linaro.org>
parent 35cdcd12
Loading
Loading
Loading
Loading
+13 −3
Original line number Diff line number Diff line
@@ -768,10 +768,12 @@ static bool renesas_sdhi_auto_correction(struct tmio_mmc_host *host)
	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);
	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
@@ -785,11 +787,19 @@ static bool renesas_sdhi_check_scc_error(struct tmio_mmc_host *host)
	if (mmc_doing_tune(host->mmc))
		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) &
	    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)
+1 −1
Original line number Diff line number Diff line
@@ -181,7 +181,7 @@ struct tmio_mmc_host {
			      unsigned int direction, int blk_size);
	int (*write16_hook)(struct tmio_mmc_host *host, int addr);
	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);
	unsigned int (*get_timeout_cycles)(struct tmio_mmc_host *host);

+1 −1
Original line number Diff line number Diff line
@@ -804,7 +804,7 @@ static void tmio_mmc_finish_request(struct tmio_mmc_host *host)
	}

	/* 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);

	/* If SET_BLOCK_COUNT, continue with main command */