|
@@ -410,6 +410,52 @@ retry:
|
|
|
return rc;
|
|
|
}
|
|
|
|
|
|
+static void sdhci_msm_set_uhs_signaling(struct sdhci_host *host,
|
|
|
+ unsigned int uhs)
|
|
|
+{
|
|
|
+ struct mmc_host *mmc = host->mmc;
|
|
|
+ u16 ctrl_2;
|
|
|
+
|
|
|
+ ctrl_2 = sdhci_readw(host, SDHCI_HOST_CONTROL2);
|
|
|
+ /* Select Bus Speed Mode for host */
|
|
|
+ ctrl_2 &= ~SDHCI_CTRL_UHS_MASK;
|
|
|
+ switch (uhs) {
|
|
|
+ case MMC_TIMING_UHS_SDR12:
|
|
|
+ ctrl_2 |= SDHCI_CTRL_UHS_SDR12;
|
|
|
+ break;
|
|
|
+ case MMC_TIMING_UHS_SDR25:
|
|
|
+ ctrl_2 |= SDHCI_CTRL_UHS_SDR25;
|
|
|
+ break;
|
|
|
+ case MMC_TIMING_UHS_SDR50:
|
|
|
+ ctrl_2 |= SDHCI_CTRL_UHS_SDR50;
|
|
|
+ break;
|
|
|
+ case MMC_TIMING_MMC_HS200:
|
|
|
+ case MMC_TIMING_UHS_SDR104:
|
|
|
+ ctrl_2 |= SDHCI_CTRL_UHS_SDR104;
|
|
|
+ break;
|
|
|
+ case MMC_TIMING_UHS_DDR50:
|
|
|
+ case MMC_TIMING_MMC_DDR52:
|
|
|
+ ctrl_2 |= SDHCI_CTRL_UHS_DDR50;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ /*
|
|
|
+ * When clock frequency is less than 100MHz, the feedback clock must be
|
|
|
+ * provided and DLL must not be used so that tuning can be skipped. To
|
|
|
+ * provide feedback clock, the mode selection can be any value less
|
|
|
+ * than 3'b011 in bits [2:0] of HOST CONTROL2 register.
|
|
|
+ */
|
|
|
+ if (host->clock <= 100000000 &&
|
|
|
+ (uhs == MMC_TIMING_MMC_HS400 ||
|
|
|
+ uhs == MMC_TIMING_MMC_HS200 ||
|
|
|
+ uhs == MMC_TIMING_UHS_SDR104))
|
|
|
+ ctrl_2 &= ~SDHCI_CTRL_UHS_MASK;
|
|
|
+
|
|
|
+ dev_dbg(mmc_dev(mmc), "%s: clock=%u uhs=%u ctrl_2=0x%x\n",
|
|
|
+ mmc_hostname(host->mmc), host->clock, uhs, ctrl_2);
|
|
|
+ sdhci_writew(host, ctrl_2, SDHCI_HOST_CONTROL2);
|
|
|
+}
|
|
|
+
|
|
|
static const struct of_device_id sdhci_msm_dt_match[] = {
|
|
|
{ .compatible = "qcom,sdhci-msm-v4" },
|
|
|
{},
|
|
@@ -422,7 +468,7 @@ static const struct sdhci_ops sdhci_msm_ops = {
|
|
|
.reset = sdhci_reset,
|
|
|
.set_clock = sdhci_set_clock,
|
|
|
.set_bus_width = sdhci_set_bus_width,
|
|
|
- .set_uhs_signaling = sdhci_set_uhs_signaling,
|
|
|
+ .set_uhs_signaling = sdhci_msm_set_uhs_signaling,
|
|
|
};
|
|
|
|
|
|
static const struct sdhci_pltfm_data sdhci_msm_pdata = {
|