aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPhilip Rakity <prakity@marvell.com>2012-06-28 00:49:27 -0400
committerChris Ball <cjb@laptop.org>2012-07-22 15:25:44 -0400
commitbd6a8c30faf19b4e7abace93fb89efd6d72607ec (patch)
treef527fbf080402c10f09076859156862fd49bf52a
parent4dc5a79f1350718ac31e4ab87eebce112b117a34 (diff)
mmc: sdhci: Allow caps[1] to be set via SDHCI_QUIRK_MISSING_CAPS
Currently only the capability_0 register can be set if SDHCI_QUIRK_MISSING_CAPS is defined. This is a problem when the capability_1 register also needs changing. Use the quirk SDHCI_QUIRK_MISSING_CAPS to allow both registers to be set. Redefining caps[1] is useful when the board design does not support 1.8v vccq so UHS modes are not available. The code that calls sdhci_add_host can then detect this condition and adjust the caps so the UHS mode will not be attempted on UHS cards. Signed-off-by: Philip Rakity <prakity@marvell.com> Signed-off-by: Chris Ball <cjb@laptop.org>
-rw-r--r--drivers/mmc/host/sdhci.c8
-rw-r--r--include/linux/mmc/sdhci.h3
2 files changed, 7 insertions, 4 deletions
diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
index f76736b50bc7..206b52fec443 100644
--- a/drivers/mmc/host/sdhci.c
+++ b/drivers/mmc/host/sdhci.c
@@ -2584,7 +2584,7 @@ EXPORT_SYMBOL_GPL(sdhci_alloc_host);
2584int sdhci_add_host(struct sdhci_host *host) 2584int sdhci_add_host(struct sdhci_host *host)
2585{ 2585{
2586 struct mmc_host *mmc; 2586 struct mmc_host *mmc;
2587 u32 caps[2]; 2587 u32 caps[2] = {0, 0};
2588 u32 max_current_caps; 2588 u32 max_current_caps;
2589 unsigned int ocr_avail; 2589 unsigned int ocr_avail;
2590 int ret; 2590 int ret;
@@ -2614,8 +2614,10 @@ int sdhci_add_host(struct sdhci_host *host)
2614 caps[0] = (host->quirks & SDHCI_QUIRK_MISSING_CAPS) ? host->caps : 2614 caps[0] = (host->quirks & SDHCI_QUIRK_MISSING_CAPS) ? host->caps :
2615 sdhci_readl(host, SDHCI_CAPABILITIES); 2615 sdhci_readl(host, SDHCI_CAPABILITIES);
2616 2616
2617 caps[1] = (host->version >= SDHCI_SPEC_300) ? 2617 if (host->version >= SDHCI_SPEC_300)
2618 sdhci_readl(host, SDHCI_CAPABILITIES_1) : 0; 2618 caps[1] = (host->quirks & SDHCI_QUIRK_MISSING_CAPS) ?
2619 host->caps1 :
2620 sdhci_readl(host, SDHCI_CAPABILITIES_1);
2619 2621
2620 if (host->quirks & SDHCI_QUIRK_FORCE_DMA) 2622 if (host->quirks & SDHCI_QUIRK_FORCE_DMA)
2621 host->flags |= SDHCI_USE_SDMA; 2623 host->flags |= SDHCI_USE_SDMA;
diff --git a/include/linux/mmc/sdhci.h b/include/linux/mmc/sdhci.h
index e9051e1cb1ce..d989b511c9ab 100644
--- a/include/linux/mmc/sdhci.h
+++ b/include/linux/mmc/sdhci.h
@@ -155,7 +155,8 @@ struct sdhci_host {
155 155
156 struct timer_list timer; /* Timer for timeouts */ 156 struct timer_list timer; /* Timer for timeouts */
157 157
158 unsigned int caps; /* Alternative capabilities */ 158 unsigned int caps; /* Alternative CAPABILITY_0 */
159 unsigned int caps1; /* Alternative CAPABILITY_1 */
159 160
160 unsigned int ocr_avail_sdio; /* OCR bit masks */ 161 unsigned int ocr_avail_sdio; /* OCR bit masks */
161 unsigned int ocr_avail_sd; 162 unsigned int ocr_avail_sd;