aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mmc/host/sdhci.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/mmc/host/sdhci.c')
-rw-r--r--drivers/mmc/host/sdhci.c39
1 files changed, 30 insertions, 9 deletions
diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
index 8670f162dec7..6bd3d1794966 100644
--- a/drivers/mmc/host/sdhci.c
+++ b/drivers/mmc/host/sdhci.c
@@ -1210,10 +1210,24 @@ clock_set:
1210} 1210}
1211EXPORT_SYMBOL_GPL(sdhci_set_clock); 1211EXPORT_SYMBOL_GPL(sdhci_set_clock);
1212 1212
1213static void sdhci_set_power(struct sdhci_host *host, unsigned char mode, 1213static void sdhci_set_power_reg(struct sdhci_host *host, unsigned char mode,
1214 unsigned short vdd) 1214 unsigned short vdd)
1215{ 1215{
1216 struct mmc_host *mmc = host->mmc; 1216 struct mmc_host *mmc = host->mmc;
1217
1218 spin_unlock_irq(&host->lock);
1219 mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, vdd);
1220 spin_lock_irq(&host->lock);
1221
1222 if (mode != MMC_POWER_OFF)
1223 sdhci_writeb(host, SDHCI_POWER_ON, SDHCI_POWER_CONTROL);
1224 else
1225 sdhci_writeb(host, 0, SDHCI_POWER_CONTROL);
1226}
1227
1228void sdhci_set_power(struct sdhci_host *host, unsigned char mode,
1229 unsigned short vdd)
1230{
1217 u8 pwr = 0; 1231 u8 pwr = 0;
1218 1232
1219 if (mode != MMC_POWER_OFF) { 1233 if (mode != MMC_POWER_OFF) {
@@ -1245,7 +1259,6 @@ static void sdhci_set_power(struct sdhci_host *host, unsigned char mode,
1245 sdhci_writeb(host, 0, SDHCI_POWER_CONTROL); 1259 sdhci_writeb(host, 0, SDHCI_POWER_CONTROL);
1246 if (host->quirks2 & SDHCI_QUIRK2_CARD_ON_NEEDS_BUS_ON) 1260 if (host->quirks2 & SDHCI_QUIRK2_CARD_ON_NEEDS_BUS_ON)
1247 sdhci_runtime_pm_bus_off(host); 1261 sdhci_runtime_pm_bus_off(host);
1248 vdd = 0;
1249 } else { 1262 } else {
1250 /* 1263 /*
1251 * Spec says that we should clear the power reg before setting 1264 * Spec says that we should clear the power reg before setting
@@ -1276,12 +1289,20 @@ static void sdhci_set_power(struct sdhci_host *host, unsigned char mode,
1276 if (host->quirks & SDHCI_QUIRK_DELAY_AFTER_POWER) 1289 if (host->quirks & SDHCI_QUIRK_DELAY_AFTER_POWER)
1277 mdelay(10); 1290 mdelay(10);
1278 } 1291 }
1292}
1293EXPORT_SYMBOL_GPL(sdhci_set_power);
1279 1294
1280 if (!IS_ERR(mmc->supply.vmmc)) { 1295static void __sdhci_set_power(struct sdhci_host *host, unsigned char mode,
1281 spin_unlock_irq(&host->lock); 1296 unsigned short vdd)
1282 mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, vdd); 1297{
1283 spin_lock_irq(&host->lock); 1298 struct mmc_host *mmc = host->mmc;
1284 } 1299
1300 if (host->ops->set_power)
1301 host->ops->set_power(host, mode, vdd);
1302 else if (!IS_ERR(mmc->supply.vmmc))
1303 sdhci_set_power_reg(host, mode, vdd);
1304 else
1305 sdhci_set_power(host, mode, vdd);
1285} 1306}
1286 1307
1287/*****************************************************************************\ 1308/*****************************************************************************\
@@ -1431,7 +1452,7 @@ static void sdhci_do_set_ios(struct sdhci_host *host, struct mmc_ios *ios)
1431 } 1452 }
1432 } 1453 }
1433 1454
1434 sdhci_set_power(host, ios->power_mode, ios->vdd); 1455 __sdhci_set_power(host, ios->power_mode, ios->vdd);
1435 1456
1436 if (host->ops->platform_send_init_74_clocks) 1457 if (host->ops->platform_send_init_74_clocks)
1437 host->ops->platform_send_init_74_clocks(host, ios->power_mode); 1458 host->ops->platform_send_init_74_clocks(host, ios->power_mode);