@@ -2089,6 +2089,23 @@ static void sdhci_msm_cqe_disable(struct mmc_host *mmc, bool recovery)
2089
2089
sdhci_cqe_disable (mmc , recovery );
2090
2090
}
2091
2091
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
+
2092
2109
static const struct cqhci_host_ops sdhci_msm_cqhci_ops = {
2093
2110
.enable = sdhci_msm_cqe_enable ,
2094
2111
.disable = sdhci_msm_cqe_disable ,
@@ -2438,6 +2455,7 @@ static const struct sdhci_ops sdhci_msm_ops = {
2438
2455
.irq = sdhci_msm_cqe_irq ,
2439
2456
.dump_vendor_regs = sdhci_msm_dump_vendor_regs ,
2440
2457
.set_power = sdhci_set_power_noreg ,
2458
+ .set_timeout = sdhci_msm_set_timeout ,
2441
2459
};
2442
2460
2443
2461
static const struct sdhci_pltfm_data sdhci_msm_pdata = {
0 commit comments