Thread (43 messages) 43 messages, 6 authors, 2014-10-01
STALE4293d

[PATCH V2 1/3] mmc: dw_mmc: use mmc_regulator_get_supply to handle regulators

From: Doug Anderson <hidden>
Date: 2014-08-25 15:06:50
Also in: linux-mmc, linux-samsung-soc

Jaehoon,

On Mon, Aug 25, 2014 at 5:32 AM, Jaehoon Chung [off-list ref] wrote:
On 08/22/2014 10:47 PM, Yuvaraj Kumar C D wrote:
quoted
This patch makes use of mmc_regulator_get_supply() to handle
the vmmc and vqmmc regulators.Also it moves the code handling
the these regulators to dw_mci_set_ios().It turned on the vmmc
and vqmmc during MMC_POWER_UP and MMC_POWER_ON,and turned off
during MMC_POWER_OFF.

Signed-off-by: Yuvaraj Kumar C D <redacted>
---
changes from v1:
      1.Used mmc_regulator_set_ocr() instead of regulator_enable() for vmmc.
      2.Turned on vmmc and vqmmc during MMC_POWER_UP.
      3. Removed the flags DW_MMC_CARD_POWERED and DW_MMC_IO_POWERED which
         added during the initial version of this patch.
      4. Added error message, if it failed to turn on regulator's.

 drivers/mmc/host/dw_mmc.c  |   72 +++++++++++++++++++++-----------------------
 include/linux/mmc/dw_mmc.h |    2 +-
 2 files changed, 36 insertions(+), 38 deletions(-)
diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c
index 7f227e9..aadb0d6 100644
--- a/drivers/mmc/host/dw_mmc.c
+++ b/drivers/mmc/host/dw_mmc.c
@@ -936,6 +936,7 @@ static void dw_mci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
      struct dw_mci_slot *slot = mmc_priv(mmc);
      const struct dw_mci_drv_data *drv_data = slot->host->drv_data;
      u32 regs;
+     int ret;

      switch (ios->bus_width) {
      case MMC_BUS_WIDTH_4:
@@ -974,12 +975,38 @@ static void dw_mci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)

      switch (ios->power_mode) {
      case MMC_POWER_UP:
+             if (!IS_ERR(mmc->supply.vmmc)) {
+                     ret = mmc_regulator_set_ocr(mmc, mmc->supply.vmmc,
+                                     ios->vdd);
+                     if (ret) {
+                             dev_err(slot->host->dev,
+                                     "failed to enable vmmc regulator\n");
+                             /*return, if failed turn on vmmc*/
+                             return;
+                     }
+             }
+             if (!IS_ERR(mmc->supply.vqmmc) && !slot->host->vqmmc_enabled) {
Can't use the regulator_is_enabled() instead of "slot->host->vqmmc_enabled"?
I think we mentioned this before, but regulator_is_enabled() won't do
what you want with shared regulators since they are refcounted.  You
need to keep track of whether you've enabled the regulator yourself.

-Doug
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help