|
@@ -2837,6 +2837,13 @@ int sdhci_add_host(struct sdhci_host *host)
|
|
|
SDHCI_RETUNING_MODE_SHIFT;
|
|
|
|
|
|
ocr_avail = 0;
|
|
|
+
|
|
|
+ host->vmmc = regulator_get(mmc_dev(mmc), "vmmc");
|
|
|
+ if (IS_ERR(host->vmmc)) {
|
|
|
+ pr_info("%s: no vmmc regulator found\n", mmc_hostname(mmc));
|
|
|
+ host->vmmc = NULL;
|
|
|
+ }
|
|
|
+
|
|
|
/*
|
|
|
* According to SD Host Controller spec v3.00, if the Host System
|
|
|
* can afford more than 150mA, Host Driver should set XPC to 1. Also
|
|
@@ -2845,6 +2852,21 @@ int sdhci_add_host(struct sdhci_host *host)
|
|
|
* value.
|
|
|
*/
|
|
|
max_current_caps = sdhci_readl(host, SDHCI_MAX_CURRENT);
|
|
|
+ if (!max_current_caps && host->vmmc) {
|
|
|
+ u32 curr = regulator_get_current_limit(host->vmmc);
|
|
|
+ if (curr > 0) {
|
|
|
+
|
|
|
+ /* convert to SDHCI_MAX_CURRENT format */
|
|
|
+ curr = curr/1000; /* convert to mA */
|
|
|
+ curr = curr/SDHCI_MAX_CURRENT_MULTIPLIER;
|
|
|
+
|
|
|
+ curr = min_t(u32, curr, SDHCI_MAX_CURRENT_LIMIT);
|
|
|
+ max_current_caps =
|
|
|
+ (curr << SDHCI_MAX_CURRENT_330_SHIFT) |
|
|
|
+ (curr << SDHCI_MAX_CURRENT_300_SHIFT) |
|
|
|
+ (curr << SDHCI_MAX_CURRENT_180_SHIFT);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
if (caps[0] & SDHCI_CAN_VDD_330) {
|
|
|
int max_current_330;
|
|
@@ -2995,12 +3017,6 @@ int sdhci_add_host(struct sdhci_host *host)
|
|
|
if (ret)
|
|
|
goto untasklet;
|
|
|
|
|
|
- host->vmmc = regulator_get(mmc_dev(mmc), "vmmc");
|
|
|
- if (IS_ERR(host->vmmc)) {
|
|
|
- pr_info("%s: no vmmc regulator found\n", mmc_hostname(mmc));
|
|
|
- host->vmmc = NULL;
|
|
|
- }
|
|
|
-
|
|
|
sdhci_init(host, 0);
|
|
|
|
|
|
#ifdef CONFIG_MMC_DEBUG
|