Skip to content

Commit 67b13f3

Browse files
Shaik Sajida Bhanustorulf
authored andcommitted
mmc: sdhci-msm: Update the software timeout value for sdhc
Whenever SDHC run at clock rate 50MHZ or below, the hardware data timeout value will be 21.47secs, which is approx. 22secs and we have a current software timeout value as 10secs. We have to set software timeout value more than the hardware data timeout value to avioid seeing the below register dumps. [ 332.953670] mmc2: Timeout waiting for hardware interrupt. [ 332.959608] mmc2: sdhci: ============ SDHCI REGISTER DUMP =========== [ 332.966450] mmc2: sdhci: Sys addr: 0x00000000 | Version: 0x00007202 [ 332.973256] mmc2: sdhci: Blk size: 0x00000200 | Blk cnt: 0x00000001 [ 332.980054] mmc2: sdhci: Argument: 0x00000000 | Trn mode: 0x00000027 [ 332.986864] mmc2: sdhci: Present: 0x01f801f6 | Host ctl: 0x0000001f [ 332.993671] mmc2: sdhci: Power: 0x00000001 | Blk gap: 0x00000000 [ 333.000583] mmc2: sdhci: Wake-up: 0x00000000 | Clock: 0x00000007 [ 333.007386] mmc2: sdhci: Timeout: 0x0000000e | Int stat: 0x00000000 [ 333.014182] mmc2: sdhci: Int enab: 0x03ff100b | Sig enab: 0x03ff100b [ 333.020976] mmc2: sdhci: ACmd stat: 0x00000000 | Slot int: 0x00000000 [ 333.027771] mmc2: sdhci: Caps: 0x322dc8b2 | Caps_1: 0x0000808f [ 333.034561] mmc2: sdhci: Cmd: 0x0000183a | Max curr: 0x00000000 [ 333.041359] mmc2: sdhci: Resp[0]: 0x00000900 | Resp[1]: 0x00000000 [ 333.048157] mmc2: sdhci: Resp[2]: 0x00000000 | Resp[3]: 0x00000000 [ 333.054945] mmc2: sdhci: Host ctl2: 0x00000000 [ 333.059657] mmc2: sdhci: ADMA Err: 0x00000000 | ADMA Ptr: 0x0000000ffffff218 [ 333.067178] mmc2: sdhci_msm: ----------- VENDOR REGISTER DUMP ----------- [ 333.074343] mmc2: sdhci_msm: DLL sts: 0x00000000 | DLL cfg: 0x6000642c | DLL cfg2: 0x0020a000 [ 333.083417] mmc2: sdhci_msm: DLL cfg3: 0x00000000 | DLL usr ctl: 0x00000000 | DDR cfg: 0x80040873 [ 333.092850] mmc2: sdhci_msm: Vndr func: 0x00008a9c | Vndr func2 : 0xf88218a8 Vndr func3: 0x02626040 [ 333.102371] mmc2: sdhci: ============================================ So, set software timeout value more than hardware timeout value. Signed-off-by: Shaik Sajida Bhanu <[email protected]> Acked-by: Adrian Hunter <[email protected]> Cc: [email protected] Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Ulf Hansson <[email protected]>
1 parent d8e193f commit 67b13f3

File tree

1 file changed

+18
-0
lines changed

1 file changed

+18
-0
lines changed

drivers/mmc/host/sdhci-msm.c

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2089,6 +2089,23 @@ static void sdhci_msm_cqe_disable(struct mmc_host *mmc, bool recovery)
20892089
sdhci_cqe_disable(mmc, recovery);
20902090
}
20912091

2092+
static void sdhci_msm_set_timeout(struct sdhci_host *host, struct mmc_command *cmd)
2093+
{
2094+
u32 count, start = 15;
2095+
2096+
__sdhci_set_timeout(host, cmd);
2097+
count = sdhci_readb(host, SDHCI_TIMEOUT_CONTROL);
2098+
/*
2099+
* Update software timeout value if its value is less than hardware data
2100+
* timeout value. Qcom SoC hardware data timeout value was calculated
2101+
* using 4 * MCLK * 2^(count + 13). where MCLK = 1 / host->clock.
2102+
*/
2103+
if (cmd && cmd->data && host->clock > 400000 &&
2104+
host->clock <= 50000000 &&
2105+
((1 << (count + start)) > (10 * host->clock)))
2106+
host->data_timeout = 22LL * NSEC_PER_SEC;
2107+
}
2108+
20922109
static const struct cqhci_host_ops sdhci_msm_cqhci_ops = {
20932110
.enable = sdhci_msm_cqe_enable,
20942111
.disable = sdhci_msm_cqe_disable,
@@ -2438,6 +2455,7 @@ static const struct sdhci_ops sdhci_msm_ops = {
24382455
.irq = sdhci_msm_cqe_irq,
24392456
.dump_vendor_regs = sdhci_msm_dump_vendor_regs,
24402457
.set_power = sdhci_set_power_noreg,
2458+
.set_timeout = sdhci_msm_set_timeout,
24412459
};
24422460

24432461
static const struct sdhci_pltfm_data sdhci_msm_pdata = {

0 commit comments

Comments
 (0)