diff options
author | Ulf Hansson <ulf.hansson@linaro.org> | 2013-01-07 10:22:50 -0500 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2013-01-08 11:32:44 -0500 |
commit | 599c1d5c750ddf528c7c6d3cdc466708f0502e66 (patch) | |
tree | 8fed8710c6b6e9160545ec28f320a3871d1c6f05 | |
parent | 70be208f0bd75eb81264f681e36485d0617d612f (diff) |
ARM: 7620/1: mmc: mmci: Convert to use mmc_regulator_get_supply
By using the mmc_regulator_get_supply API we are able to do some
cleanups of the regulator code. Additionally let the regulator
API handle the error printing.
Cc: Chris Ball <cjb@laptop.org>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
-rw-r--r-- | drivers/mmc/host/mmci.c | 54 | ||||
-rw-r--r-- | drivers/mmc/host/mmci.h | 1 |
2 files changed, 11 insertions, 44 deletions
diff --git a/drivers/mmc/host/mmci.c b/drivers/mmc/host/mmci.c index 442b01129626..3094ea3ed722 100644 --- a/drivers/mmc/host/mmci.c +++ b/drivers/mmc/host/mmci.c | |||
@@ -1093,7 +1093,6 @@ static void mmci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) | |||
1093 | struct variant_data *variant = host->variant; | 1093 | struct variant_data *variant = host->variant; |
1094 | u32 pwr = 0; | 1094 | u32 pwr = 0; |
1095 | unsigned long flags; | 1095 | unsigned long flags; |
1096 | int ret; | ||
1097 | 1096 | ||
1098 | pm_runtime_get_sync(mmc_dev(mmc)); | 1097 | pm_runtime_get_sync(mmc_dev(mmc)); |
1099 | 1098 | ||
@@ -1103,23 +1102,13 @@ static void mmci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) | |||
1103 | 1102 | ||
1104 | switch (ios->power_mode) { | 1103 | switch (ios->power_mode) { |
1105 | case MMC_POWER_OFF: | 1104 | case MMC_POWER_OFF: |
1106 | if (host->vcc) | 1105 | if (!IS_ERR(mmc->supply.vmmc)) |
1107 | ret = mmc_regulator_set_ocr(mmc, host->vcc, 0); | 1106 | mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, 0); |
1108 | break; | 1107 | break; |
1109 | case MMC_POWER_UP: | 1108 | case MMC_POWER_UP: |
1110 | if (host->vcc) { | 1109 | if (!IS_ERR(mmc->supply.vmmc)) |
1111 | ret = mmc_regulator_set_ocr(mmc, host->vcc, ios->vdd); | 1110 | mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, ios->vdd); |
1112 | if (ret) { | 1111 | |
1113 | dev_err(mmc_dev(mmc), "unable to set OCR\n"); | ||
1114 | /* | ||
1115 | * The .set_ios() function in the mmc_host_ops | ||
1116 | * struct return void, and failing to set the | ||
1117 | * power should be rare so we print an error | ||
1118 | * and return here. | ||
1119 | */ | ||
1120 | goto out; | ||
1121 | } | ||
1122 | } | ||
1123 | /* | 1112 | /* |
1124 | * The ST Micro variant doesn't have the PL180s MCI_PWR_UP | 1113 | * The ST Micro variant doesn't have the PL180s MCI_PWR_UP |
1125 | * and instead uses MCI_PWR_ON so apply whatever value is | 1114 | * and instead uses MCI_PWR_ON so apply whatever value is |
@@ -1168,7 +1157,6 @@ static void mmci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) | |||
1168 | 1157 | ||
1169 | spin_unlock_irqrestore(&host->lock, flags); | 1158 | spin_unlock_irqrestore(&host->lock, flags); |
1170 | 1159 | ||
1171 | out: | ||
1172 | pm_runtime_mark_last_busy(mmc_dev(mmc)); | 1160 | pm_runtime_mark_last_busy(mmc_dev(mmc)); |
1173 | pm_runtime_put_autosuspend(mmc_dev(mmc)); | 1161 | pm_runtime_put_autosuspend(mmc_dev(mmc)); |
1174 | } | 1162 | } |
@@ -1391,29 +1379,13 @@ static int mmci_probe(struct amba_device *dev, | |||
1391 | } else | 1379 | } else |
1392 | dev_warn(&dev->dev, "could not get default pinstate\n"); | 1380 | dev_warn(&dev->dev, "could not get default pinstate\n"); |
1393 | 1381 | ||
1394 | #ifdef CONFIG_REGULATOR | 1382 | /* Get regulators and the supported OCR mask */ |
1395 | /* If we're using the regulator framework, try to fetch a regulator */ | 1383 | mmc_regulator_get_supply(mmc); |
1396 | host->vcc = regulator_get(&dev->dev, "vmmc"); | 1384 | if (!mmc->ocr_avail) |
1397 | if (IS_ERR(host->vcc)) | ||
1398 | host->vcc = NULL; | ||
1399 | else { | ||
1400 | int mask = mmc_regulator_get_ocrmask(host->vcc); | ||
1401 | |||
1402 | if (mask < 0) | ||
1403 | dev_err(&dev->dev, "error getting OCR mask (%d)\n", | ||
1404 | mask); | ||
1405 | else { | ||
1406 | host->mmc->ocr_avail = (u32) mask; | ||
1407 | if (plat->ocr_mask) | ||
1408 | dev_warn(&dev->dev, | ||
1409 | "Provided ocr_mask/setpower will not be used " | ||
1410 | "(using regulator instead)\n"); | ||
1411 | } | ||
1412 | } | ||
1413 | #endif | ||
1414 | /* Fall back to platform data if no regulator is found */ | ||
1415 | if (host->vcc == NULL) | ||
1416 | mmc->ocr_avail = plat->ocr_mask; | 1385 | mmc->ocr_avail = plat->ocr_mask; |
1386 | else if (plat->ocr_mask) | ||
1387 | dev_warn(mmc_dev(mmc), "Platform OCR mask is ignored\n"); | ||
1388 | |||
1417 | mmc->caps = plat->capabilities; | 1389 | mmc->caps = plat->capabilities; |
1418 | mmc->caps2 = plat->capabilities2; | 1390 | mmc->caps2 = plat->capabilities2; |
1419 | 1391 | ||
@@ -1595,10 +1567,6 @@ static int mmci_remove(struct amba_device *dev) | |||
1595 | clk_disable_unprepare(host->clk); | 1567 | clk_disable_unprepare(host->clk); |
1596 | clk_put(host->clk); | 1568 | clk_put(host->clk); |
1597 | 1569 | ||
1598 | if (host->vcc) | ||
1599 | mmc_regulator_set_ocr(mmc, host->vcc, 0); | ||
1600 | regulator_put(host->vcc); | ||
1601 | |||
1602 | mmc_free_host(mmc); | 1570 | mmc_free_host(mmc); |
1603 | 1571 | ||
1604 | amba_release_regions(dev); | 1572 | amba_release_regions(dev); |
diff --git a/drivers/mmc/host/mmci.h b/drivers/mmc/host/mmci.h index d34d8c0add8e..a22213eeff88 100644 --- a/drivers/mmc/host/mmci.h +++ b/drivers/mmc/host/mmci.h | |||
@@ -193,7 +193,6 @@ struct mmci_host { | |||
193 | /* pio stuff */ | 193 | /* pio stuff */ |
194 | struct sg_mapping_iter sg_miter; | 194 | struct sg_mapping_iter sg_miter; |
195 | unsigned int size; | 195 | unsigned int size; |
196 | struct regulator *vcc; | ||
197 | 196 | ||
198 | /* pinctrl handles */ | 197 | /* pinctrl handles */ |
199 | struct pinctrl *pinctrl; | 198 | struct pinctrl *pinctrl; |