From: "Chew, Kean Ho" <[email protected]>

The clock appears to be unstable when SDCARD host running with
DDR50 mode, thus causing CRC issue. This is to introduce a new
quirk to force host with broken DDR50 mode to run with SDR25
mode.

Signed-off-by: Chew, Kean Ho <[email protected]>
Signed-off-by: Chew, Chiau Ee <[email protected]>
Signed-off-by: Maurice Petallo <[email protected]>
---
 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     |    2 ++
 4 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/drivers/mmc/host/sdhci-acpi.c b/drivers/mmc/host/sdhci-acpi.c
index cdd4ce0..c108d38 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 c81c2a2..4e36df8 100644
--- a/drivers/mmc/host/sdhci.c
+++ b/drivers/mmc/host/sdhci.c
@@ -3000,7 +3000,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,8 @@ 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)
+/* 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.10.4

-- 
_______________________________________________
linux-yocto mailing list
[email protected]
https://lists.yoctoproject.org/listinfo/linux-yocto

Reply via email to