diff --git a/features/valleyisland-io/0017-mmc-sdhci-Force-BYT-SDCARD-host-to-run-with-SDR25-mo.patch b/features/valleyisland-io/0017-mmc-sdhci-Force-BYT-SDCARD-host-to-run-with-SDR25-mo.patch new file mode 100644 index 0000000000000000000000000000000000000000..89a50c517f93a43af98daa3b69210d56c185a169 --- /dev/null +++ b/features/valleyisland-io/0017-mmc-sdhci-Force-BYT-SDCARD-host-to-run-with-SDR25-mo.patch @@ -0,0 +1,78 @@ +From 2a04e9579aaebe6263e9f32bb6b507c9c451cc83 Mon Sep 17 00:00:00 2001 +From: Chew, Kean Ho <kean.ho.chew@intel.com> +Date: Mon, 23 Dec 2013 16:14:27 +0800 +Subject: [PATCH 17/17] mmc: sdhci: Force BYT SDCARD host to run with SDR25 + mode + +SD Card v3.01 in the market is not compatible with BYT SDHC IP in SoC +because this IP only support SD v3.0 only. So, we are forcing DDR50 mode +to always step down to SDR25. + +Signed-off-by: Chew, Kean Ho <kean.ho.chew@intel.com> +Signed-off-by: Chew, Chiau Ee <chiau.ee.chew@intel.com> +--- + drivers/mmc/host/sdhci-acpi.c | 3 ++- + drivers/mmc/host/sdhci-pci.c | 3 ++- + drivers/mmc/host/sdhci.c | 3 ++- + include/linux/mmc/sdhci.h | 3 ++ + 4 files changed, 9 insertions(+), 3 deletions(-) + +diff --git a/drivers/mmc/host/sdhci-acpi.c b/drivers/mmc/host/sdhci-acpi.c +index 119568f..11acee1 100644 +--- a/drivers/mmc/host/sdhci-acpi.c ++++ b/drivers/mmc/host/sdhci-acpi.c +@@ -130,7 +130,8 @@ static const struct sdhci_acpi_slot sdhci_acpi_slot_int_sdio = { + + static const struct sdhci_acpi_slot sdhci_acpi_slot_int_sd = { + .flags = SDHCI_ACPI_SD_CD | SDHCI_ACPI_RUNTIME_PM, +- .quirks2 = SDHCI_QUIRK2_CARD_ON_NEEDS_BUS_ON, ++ .quirks2 = SDHCI_QUIRK2_CARD_ON_NEEDS_BUS_ON | ++ SDHCI_QUIRK2_BROKEN_DDR50, + }; + + struct sdhci_acpi_uid_slot { +diff --git a/drivers/mmc/host/sdhci-pci.c b/drivers/mmc/host/sdhci-pci.c +index 33593e7..8848182 100644 +--- a/drivers/mmc/host/sdhci-pci.c ++++ b/drivers/mmc/host/sdhci-pci.c +@@ -354,7 +354,8 @@ static const struct sdhci_pci_fixes sdhci_intel_byt_sdio = { + }; + + static const struct sdhci_pci_fixes sdhci_intel_byt_sd = { +- .quirks2 = SDHCI_QUIRK2_CARD_ON_NEEDS_BUS_ON, ++ .quirks2 = SDHCI_QUIRK2_CARD_ON_NEEDS_BUS_ON | ++ SDHCI_QUIRK2_BROKEN_DDR50, + .allow_runtime_pm = true, + .own_cd_for_runtime_pm = true, + }; +diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c +index 22d91ec..10bd57d 100644 +--- a/drivers/mmc/host/sdhci.c ++++ b/drivers/mmc/host/sdhci.c +@@ -2972,7 +2972,8 @@ int sdhci_add_host(struct sdhci_host *host) + else if (caps[1] & SDHCI_SUPPORT_SDR50) + mmc->caps |= MMC_CAP_UHS_SDR50; + +- if (caps[1] & SDHCI_SUPPORT_DDR50) ++ if ((caps[1] & SDHCI_SUPPORT_DDR50) && ++ !(host->quirks2 & SDHCI_QUIRK2_BROKEN_DDR50)) + mmc->caps |= MMC_CAP_UHS_DDR50; + + /* Does the host need tuning for SDR50? */ +diff --git a/include/linux/mmc/sdhci.h b/include/linux/mmc/sdhci.h +index ba35bdb..7c9d2d1 100644 +--- a/include/linux/mmc/sdhci.h ++++ b/include/linux/mmc/sdhci.h +@@ -96,6 +96,9 @@ struct sdhci_host { + #define SDHCI_QUIRK2_NO_1_8_V (1<<2) + #define SDHCI_QUIRK2_PRESET_VALUE_BROKEN (1<<3) + #define SDHCI_QUIRK2_CARD_ON_NEEDS_BUS_ON (1<<4) ++/* bit 5 is used by SDHCI_QUIRK2_BROKEN_HOST_CONTROL in upstream */ ++/* Controller has a broken DDR50 Time Spec */ ++#define SDHCI_QUIRK2_BROKEN_DDR50 (1<<6) + + int irq; /* Device IRQ */ + void __iomem *ioaddr; /* Mapped address */ +-- +1.7.4.4 +