From d9daffaae9e9c9334fdf61a2fa733d579f868b93 Mon Sep 17 00:00:00 2001 From: Sahitya Tummala Date: Thu, 21 Mar 2013 11:13:25 +0530 Subject: mmc: sdhci-msm: Implement uhs_set_signaling to select right mode The MSM SDHCI controller requires SDR104 mode to be set for HS200 cards. To handle this case, implement uhs_set_signaling so that the mode selection for MSM SDHCI doesn't happen in sdhci driver. Change-Id: I901dc82312b4299e86a7812dd74d3682650966a2 Signed-off-by: Sahitya Tummala [venkatg@codeaurora.org: Fix fn signature for set_uhs_signaling that changed as part of 3.14 kernel] Signed-off-by: Venkat Gopalakrishnan --- drivers/mmc/host/sdhci-msm.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/drivers/mmc/host/sdhci-msm.c b/drivers/mmc/host/sdhci-msm.c index 2709904fbcde..217f7c34dfa8 100644 --- a/drivers/mmc/host/sdhci-msm.c +++ b/drivers/mmc/host/sdhci-msm.c @@ -1842,7 +1842,32 @@ out: return; } +static void sdhci_msm_set_uhs_signaling(struct sdhci_host *host, + unsigned int uhs) +{ + u16 ctrl_2; + + ctrl_2 = sdhci_readw(host, SDHCI_HOST_CONTROL2); + /* Select Bus Speed Mode for host */ + ctrl_2 &= ~SDHCI_CTRL_UHS_MASK; + if (uhs == MMC_TIMING_MMC_HS200) + ctrl_2 |= SDHCI_CTRL_UHS_SDR104; + else if (uhs == MMC_TIMING_UHS_SDR12) + ctrl_2 |= SDHCI_CTRL_UHS_SDR12; + else if (uhs == MMC_TIMING_UHS_SDR25) + ctrl_2 |= SDHCI_CTRL_UHS_SDR25; + else if (uhs == MMC_TIMING_UHS_SDR50) + ctrl_2 |= SDHCI_CTRL_UHS_SDR50; + else if (uhs == MMC_TIMING_UHS_SDR104) + ctrl_2 |= SDHCI_CTRL_UHS_SDR104; + else if (uhs == MMC_TIMING_UHS_DDR50) + ctrl_2 |= SDHCI_CTRL_UHS_DDR50; + sdhci_writew(host, ctrl_2, SDHCI_HOST_CONTROL2); + +} + static struct sdhci_ops sdhci_msm_ops = { + .set_uhs_signaling = sdhci_msm_set_uhs_signaling, .check_power_status = sdhci_msm_check_power_status, .platform_execute_tuning = sdhci_msm_execute_tuning, .toggle_cdr = sdhci_msm_toggle_cdr, -- cgit v1.2.3