@@ -1726,6 +1726,7 @@ int sdhci_add_host(struct sdhci_host *host)
{
struct mmc_host *mmc;
unsigned int caps;
+ unsigned int caps1;
int ret;
WARN_ON(host == NULL);
@@ -1813,9 +1814,14 @@ int sdhci_add_host(struct sdhci_host *host)
mmc_dev(host->mmc)->dma_mask = &host->dma_mask;
}
- if (host->version >= SDHCI_SPEC_300)
+ if (host->version >= SDHCI_SPEC_300) {
host->max_clk = (caps & SDHCI_CLOCK_V3_BASE_MASK)
>> SDHCI_CLOCK_BASE_SHIFT;
+ caps1 = sdhci_readl(host, SDHCI_CAPABILITIES_1);
+ if ((caps1 & SDHCI_CAN_DO_DDR50) &&
+ (caps & SDHCI_CAN_VDD_180))
+ host->mmc->caps |= MMC_CAP_1_8V_DDR;
+ }
else
host->max_clk = (caps & SDHCI_CLOCK_BASE_MASK)
>> SDHCI_CLOCK_BASE_SHIFT;
@@ -163,6 +163,19 @@
#define SDHCI_CAN_64BIT 0x10000000
#define SDHCI_CAPABILITIES_1 0x44
+#define SDHCI_CAN_DO_SRD50 0x00000001
+#define SDHCI_CAN_DO_SR104 0x00000002
+#define SDHCI_CAN_DO_DDR50 0x00000004
+#define SDHCI_CAN_DO_DRIVER_A 0x00000010
+#define SDHCI_CAN_DO_DRIVER_C 0x00000020
+#define SDHCI_CAN_DO_DRIVER_D 0x00000040
+#define SDHCI_TIMER_COUNT_MASK 0xF
+#define SDHCI_TIMER_COUNT_SHIFT 8
+#define SDHCI_USE_TIMING_SDR50 0x00002000
+#define SDHCI_RETUNING_MODE_MASK 0x3
+#define SDHCI_RETUNING_MODE_SHIFT 14
+#define SDHCI_CLOCK_MULT_MASK 0xFF
+#define SDHCI_CLOCK_MULT_SHIFT 16
#define SDHCI_MAX_CURRENT 0x48