mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-12 08:00:09 +00:00
mmc: sdhci: Introduce max_timeout_count variable in sdhci_host
Introduce max_timeout_count variable in the sdhci_host structure and use in timeout calculation. By default its set to 0xE (max timeout register value as per SDHC spec). But at the same time vendors drivers can update it if they support different max timeout register value than 0xE. Signed-off-by: Sarthak Garg <sartgarg@codeaurora.org> Acked-by: Adrian Hunter <adrian.hunter@intel.com> Link: https://lore.kernel.org/r/1628232901-30897-2-git-send-email-sartgarg@codeaurora.org Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
This commit is contained in:
parent
3ac5e45291
commit
e30314f255
@ -934,21 +934,21 @@ static u8 sdhci_calc_timeout(struct sdhci_host *host, struct mmc_command *cmd,
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* If the host controller provides us with an incorrect timeout
|
* If the host controller provides us with an incorrect timeout
|
||||||
* value, just skip the check and use 0xE. The hardware may take
|
* value, just skip the check and use the maximum. The hardware may take
|
||||||
* longer to time out, but that's much better than having a too-short
|
* longer to time out, but that's much better than having a too-short
|
||||||
* timeout value.
|
* timeout value.
|
||||||
*/
|
*/
|
||||||
if (host->quirks & SDHCI_QUIRK_BROKEN_TIMEOUT_VAL)
|
if (host->quirks & SDHCI_QUIRK_BROKEN_TIMEOUT_VAL)
|
||||||
return 0xE;
|
return host->max_timeout_count;
|
||||||
|
|
||||||
/* Unspecified command, asume max */
|
/* Unspecified command, asume max */
|
||||||
if (cmd == NULL)
|
if (cmd == NULL)
|
||||||
return 0xE;
|
return host->max_timeout_count;
|
||||||
|
|
||||||
data = cmd->data;
|
data = cmd->data;
|
||||||
/* Unspecified timeout, assume max */
|
/* Unspecified timeout, assume max */
|
||||||
if (!data && !cmd->busy_timeout)
|
if (!data && !cmd->busy_timeout)
|
||||||
return 0xE;
|
return host->max_timeout_count;
|
||||||
|
|
||||||
/* timeout in us */
|
/* timeout in us */
|
||||||
target_timeout = sdhci_target_timeout(host, cmd, data);
|
target_timeout = sdhci_target_timeout(host, cmd, data);
|
||||||
@ -968,15 +968,15 @@ static u8 sdhci_calc_timeout(struct sdhci_host *host, struct mmc_command *cmd,
|
|||||||
while (current_timeout < target_timeout) {
|
while (current_timeout < target_timeout) {
|
||||||
count++;
|
count++;
|
||||||
current_timeout <<= 1;
|
current_timeout <<= 1;
|
||||||
if (count >= 0xF)
|
if (count > host->max_timeout_count)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (count >= 0xF) {
|
if (count > host->max_timeout_count) {
|
||||||
if (!(host->quirks2 & SDHCI_QUIRK2_DISABLE_HW_TIMEOUT))
|
if (!(host->quirks2 & SDHCI_QUIRK2_DISABLE_HW_TIMEOUT))
|
||||||
DBG("Too large timeout 0x%x requested for CMD%d!\n",
|
DBG("Too large timeout 0x%x requested for CMD%d!\n",
|
||||||
count, cmd->opcode);
|
count, cmd->opcode);
|
||||||
count = 0xE;
|
count = host->max_timeout_count;
|
||||||
} else {
|
} else {
|
||||||
*too_big = false;
|
*too_big = false;
|
||||||
}
|
}
|
||||||
@ -3940,6 +3940,8 @@ struct sdhci_host *sdhci_alloc_host(struct device *dev,
|
|||||||
*/
|
*/
|
||||||
host->adma_table_cnt = SDHCI_MAX_SEGS * 2 + 1;
|
host->adma_table_cnt = SDHCI_MAX_SEGS * 2 + 1;
|
||||||
|
|
||||||
|
host->max_timeout_count = 0xE;
|
||||||
|
|
||||||
return host;
|
return host;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -517,6 +517,7 @@ struct sdhci_host {
|
|||||||
|
|
||||||
unsigned int max_clk; /* Max possible freq (MHz) */
|
unsigned int max_clk; /* Max possible freq (MHz) */
|
||||||
unsigned int timeout_clk; /* Timeout freq (KHz) */
|
unsigned int timeout_clk; /* Timeout freq (KHz) */
|
||||||
|
u8 max_timeout_count; /* Vendor specific max timeout count */
|
||||||
unsigned int clk_mul; /* Clock Muliplier value */
|
unsigned int clk_mul; /* Clock Muliplier value */
|
||||||
|
|
||||||
unsigned int clock; /* Current clock (MHz) */
|
unsigned int clock; /* Current clock (MHz) */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user