On 4/7/2014 8:18 AM, rebecca.swee.fun.ch...@intel.com wrote:
From: "Chew, Kean Ho" <kean.ho.c...@intel.com>

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.
The "appears" word is very feeble for pushing such commit upstream. Instead
you can rewrite the commit as:

When the SDCARD host is running in DDR50 mode, instabilities have been observed
in the clock, resulting in CRC issues.
Introduce a new quirk to avoid the issue by disabling the DDR550 mode
on the broken hosts. It will use the SDR25 mode instead.

Nitin

Signed-off-by: Chew, Kean Ho <kean.ho.c...@intel.com>
Signed-off-by: Chew, Chiau Ee <chiau.ee.c...@intel.com>
Signed-off-by: Maurice Petallo <mauricex.r.peta...@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     |    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 */

--
_______________________________________________
linux-yocto mailing list
linux-yocto@yoctoproject.org
https://lists.yoctoproject.org/listinfo/linux-yocto

Reply via email to