diff options
author | Philip Rakity <prakity@marvell.com> | 2012-06-28 00:49:27 -0400 |
---|---|---|
committer | Chris Ball <cjb@laptop.org> | 2012-07-22 15:25:44 -0400 |
commit | bd6a8c30faf19b4e7abace93fb89efd6d72607ec (patch) | |
tree | f527fbf080402c10f09076859156862fd49bf52a | |
parent | 4dc5a79f1350718ac31e4ab87eebce112b117a34 (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.c | 8 | ||||
-rw-r--r-- | include/linux/mmc/sdhci.h | 3 |
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); | |||
2584 | int sdhci_add_host(struct sdhci_host *host) | 2584 | int 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; |