mmc: sdhci-msm: add the ability to fake 3.0v support for SDIO devices
As SDIO spec doesn't allow advertisement of 1.8v support, some SDIO
devices advertise support of only 3.0v even though they support 1.8v
as well.
sdhc3 host controller only supports 1.8v and rejects the initialization
of SDIO devices that advertise 3.0v support.
This change adds fake support for 3.0v to sdhc host controller.
This will allow initialization of SDIO devices that supports 1.8v but
advertise 3.0v support.
Change-Id: I5a98c54ad4998e6439f83081628c9c083e95bbf0
Signed-off-by: Pavan Anamula <pavana@codeaurora.org>
[xiaonian@codeaurora.org: fixed trivial merge conflict]
Signed-off-by: Xiaonian Wang <xiaonian@codeaurora.org>
diff --git a/drivers/mmc/host/sdhci-msm.c b/drivers/mmc/host/sdhci-msm.c
index 3fa3cd3..a155baa 100644
--- a/drivers/mmc/host/sdhci-msm.c
+++ b/drivers/mmc/host/sdhci-msm.c
@@ -1717,6 +1717,9 @@ struct sdhci_msm_pltfm_data *sdhci_msm_populate_pdata(struct device *dev,
sdhci_msm_pm_qos_parse(dev, pdata);
+ if (of_get_property(np, "qcom,core_3_0v_support", NULL))
+ pdata->core_3_0v_support = true;
+
return pdata;
out:
return NULL;
@@ -3643,6 +3646,14 @@ static void sdhci_set_default_hw_caps(struct sdhci_msm_host *msm_host,
(minor == 0x49)))
msm_host->use_14lpp_dll = true;
+ /* Fake 3.0V support for SDIO devices which requires such voltage */
+ if (msm_host->pdata->core_3_0v_support) {
+ caps |= CORE_3_0V_SUPPORT;
+ writel_relaxed(
+ (readl_relaxed(host->ioaddr + SDHCI_CAPABILITIES) |
+ caps), host->ioaddr + CORE_VENDOR_SPEC_CAPABILITIES0);
+ }
+
if ((major == 1) && (minor >= 0x49))
msm_host->rclk_delay_fix = true;
/*