mmc: sdhci-msm: Introduce timeout freq divider in sdhci host

Some SD host controllers multiplies the timeout-clk internally while
deriving the timeout value. So allow vendor driver to update the
timeout-clock to get the correct data timeout counter value.

Change-Id: Iacbd98f5251d5312c999478b0d0aac3abc339323
Suggested-by: Veerabhadrarao Badiganti <vbadigan@codeaurora.org>
Signed-off-by: Sarthak Garg <sartgarg@codeaurora.org>
This commit is contained in:
Sarthak Garg 2020-06-21 11:26:35 +05:30
commit 6ab3e82f81
2 changed files with 18 additions and 0 deletions

View file

@ -2040,6 +2040,10 @@ void sdhci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
host->timeout_clk = host->mmc->actual_clock ?
host->mmc->actual_clock / 1000 :
host->clock / 1000;
#if defined(CONFIG_SDC_QTI)
host->timeout_clk /= host->timeout_clk_div;
#endif
host->mmc->max_busy_timeout =
host->ops->get_max_timeout_count ?
host->ops->get_max_timeout_count(host) :
@ -3891,6 +3895,11 @@ int sdhci_setup_host(struct sdhci_host *host)
override_timeout_clk = host->timeout_clk;
#if defined(CONFIG_SDC_QTI)
if (!host->timeout_clk_div)
host->timeout_clk_div = 1;
#endif
if (host->version > SDHCI_SPEC_420) {
pr_err("%s: Unknown controller version (%d). You may experience problems.\n",
mmc_hostname(mmc), host->version);
@ -4088,6 +4097,10 @@ int sdhci_setup_host(struct sdhci_host *host)
if (override_timeout_clk)
host->timeout_clk = override_timeout_clk;
#if defined(CONFIG_SDC_QTI)
host->timeout_clk /= host->timeout_clk_div;
#endif
mmc->max_busy_timeout = host->ops->get_max_timeout_count ?
host->ops->get_max_timeout_count(host) : 1 << 27;
mmc->max_busy_timeout /= host->timeout_clk;

View file

@ -524,6 +524,11 @@ struct sdhci_host {
unsigned int max_clk; /* Max possible freq (MHz) */
unsigned int timeout_clk; /* Timeout freq (KHz) */
#if defined(CONFIG_SDC_QTI)
u8 timeout_clk_div; /* Timeout freq (KHz) divider */
#endif
unsigned int clk_mul; /* Clock Muliplier value */
unsigned int clock; /* Current clock (MHz) */