Message ID | 1399893256-7071-6-git-send-email-jh80.chung@samsung.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Mon, 2014-05-12 at 20:14 +0900, Jaehoon Chung wrote: > Use the mmc regulator API into core.c instead of enabling locally. > It can use the "vmmc", and optional "vqmmc". > > Signed-off-by: Jaehoon Chung <jh80.chung@samsung.com> > --- > drivers/mmc/host/dw_mmc.c | 61 ++++++++++++++++++--------------------------- > 1 file changed, 24 insertions(+), 37 deletions(-) > > diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c > index e0e933d..3ab7231 100644 > --- a/drivers/mmc/host/dw_mmc.c > +++ b/drivers/mmc/host/dw_mmc.c > @@ -937,6 +937,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: > @@ -975,16 +976,36 @@ 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)) > + mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, ios->vdd); > + > set_bit(DW_MMC_CARD_NEED_INIT, &slot->flags); > regs = mci_readl(slot->host, PWREN); > regs |= (1 << slot->id); > mci_writel(slot->host, PWREN, regs); > + Looks like stray newline here? Dinh -- To unsubscribe from this list: send the line "unsubscribe linux-mmc" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On 05/13/2014 02:41 AM, Dinh Nguyen wrote: > On Mon, 2014-05-12 at 20:14 +0900, Jaehoon Chung wrote: >> Use the mmc regulator API into core.c instead of enabling locally. >> It can use the "vmmc", and optional "vqmmc". >> >> Signed-off-by: Jaehoon Chung <jh80.chung@samsung.com> >> --- >> drivers/mmc/host/dw_mmc.c | 61 ++++++++++++++++++--------------------------- >> 1 file changed, 24 insertions(+), 37 deletions(-) >> >> diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c >> index e0e933d..3ab7231 100644 >> --- a/drivers/mmc/host/dw_mmc.c >> +++ b/drivers/mmc/host/dw_mmc.c >> @@ -937,6 +937,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: >> @@ -975,16 +976,36 @@ 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)) >> + mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, ios->vdd); >> + >> set_bit(DW_MMC_CARD_NEED_INIT, &slot->flags); >> regs = mci_readl(slot->host, PWREN); >> regs |= (1 << slot->id); >> mci_writel(slot->host, PWREN, regs); >> + > > Looks like stray newline here? Will Remove? > > Dinh > > > -- To unsubscribe from this list: send the line "unsubscribe linux-mmc" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Mon, May 12, 2014 at 4:44 PM, Jaehoon Chung <jh80.chung@samsung.com> wrote: > Use the mmc regulator API into core.c instead of enabling locally. > It can use the "vmmc", and optional "vqmmc". > > Signed-off-by: Jaehoon Chung <jh80.chung@samsung.com> > --- > drivers/mmc/host/dw_mmc.c | 61 ++++++++++++++++++--------------------------- > 1 file changed, 24 insertions(+), 37 deletions(-) > > diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c > index e0e933d..3ab7231 100644 > --- a/drivers/mmc/host/dw_mmc.c > +++ b/drivers/mmc/host/dw_mmc.c > @@ -937,6 +937,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: > @@ -975,16 +976,36 @@ 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)) > + mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, ios->vdd); > + > set_bit(DW_MMC_CARD_NEED_INIT, &slot->flags); > regs = mci_readl(slot->host, PWREN); > regs |= (1 << slot->id); > mci_writel(slot->host, PWREN, regs); > + > break; > case MMC_POWER_OFF: > + if (!IS_ERR(mmc->supply.vmmc)) > + mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, 0); > + > + if (!IS_ERR(mmc->supply.vqmmc) && > + regulator_is_enabled(mmc->supply.vqmmc)) > + regulator_disable(mmc->supply.vqmmc); if the built-in card detection is used(CDETECT),turning off the regulator will break the card detection as CD# is also on vqmmc voltage rail.do you consider that case? > + > regs = mci_readl(slot->host, PWREN); > regs &= ~(1 << slot->id); > mci_writel(slot->host, PWREN, regs); > break; > + case MMC_POWER_ON: > + if (!IS_ERR(mmc->supply.vqmmc) && > + !regulator_is_enabled(mmc->supply.vqmmc)) { > + ret = regulator_enable(mmc->supply.vqmmc); Any specific reason why do we turn on vqmmc during MMC_POWER_ON not when MMC_POWER_UP? > + if (ret < 0) > + dev_err(&slot->mmc->class_dev, > + "failed to enable vqmmc\n"); > + } > + break; > default: > break; > } > @@ -2067,7 +2088,9 @@ static int dw_mci_init_slot(struct dw_mci *host, unsigned int id) > mmc->f_max = freq[1]; > } > > - mmc->ocr_avail = MMC_VDD_32_33 | MMC_VDD_33_34; > + mmc_regulator_get_supply(mmc); how about using the deferred regulators case also https://lkml.org/lkml/2014/5/6/700 > + if (!mmc->ocr_avail) > + mmc->ocr_avail = MMC_VDD_32_33 | MMC_VDD_33_34; > > if (host->pdata->caps) > mmc->caps = host->pdata->caps; > @@ -2375,24 +2398,6 @@ int dw_mci_probe(struct dw_mci *host) > } > } > > - host->vmmc = devm_regulator_get_optional(host->dev, "vmmc"); > - if (IS_ERR(host->vmmc)) { > - ret = PTR_ERR(host->vmmc); > - if (ret == -EPROBE_DEFER) > - goto err_clk_ciu; > - > - dev_info(host->dev, "no vmmc regulator found: %d\n", ret); > - host->vmmc = NULL; > - } else { > - ret = regulator_enable(host->vmmc); > - if (ret) { > - if (ret != -EPROBE_DEFER) > - dev_err(host->dev, > - "regulator_enable fail: %d\n", ret); > - goto err_clk_ciu; > - } > - } > - > host->quirks = host->pdata->quirks; > > spin_lock_init(&host->lock); > @@ -2536,9 +2541,6 @@ err_workqueue: > err_dmaunmap: > if (host->use_dma && host->dma_ops->exit) > host->dma_ops->exit(host); > - if (host->vmmc) > - regulator_disable(host->vmmc); > - > err_clk_ciu: > if (!IS_ERR(host->ciu_clk)) > clk_disable_unprepare(host->ciu_clk); > @@ -2573,9 +2575,6 @@ void dw_mci_remove(struct dw_mci *host) > if (host->use_dma && host->dma_ops->exit) > host->dma_ops->exit(host); > > - if (host->vmmc) > - regulator_disable(host->vmmc); > - > if (!IS_ERR(host->ciu_clk)) > clk_disable_unprepare(host->ciu_clk); > > @@ -2592,9 +2591,6 @@ EXPORT_SYMBOL(dw_mci_remove); > */ > int dw_mci_suspend(struct dw_mci *host) > { > - if (host->vmmc) > - regulator_disable(host->vmmc); > - > return 0; > } > EXPORT_SYMBOL(dw_mci_suspend); > @@ -2603,15 +2599,6 @@ int dw_mci_resume(struct dw_mci *host) > { > int i, ret; > > - if (host->vmmc) { > - ret = regulator_enable(host->vmmc); > - if (ret) { > - dev_err(host->dev, > - "failed to enable regulator: %d\n", ret); > - return ret; > - } > - } > - > if (!dw_mci_ctrl_all_reset(host)) { > ret = -ENODEV; > return ret; > -- > 1.7.9.5 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-mmc" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-mmc" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c index e0e933d..3ab7231 100644 --- a/drivers/mmc/host/dw_mmc.c +++ b/drivers/mmc/host/dw_mmc.c @@ -937,6 +937,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: @@ -975,16 +976,36 @@ 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)) + mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, ios->vdd); + set_bit(DW_MMC_CARD_NEED_INIT, &slot->flags); regs = mci_readl(slot->host, PWREN); regs |= (1 << slot->id); mci_writel(slot->host, PWREN, regs); + break; case MMC_POWER_OFF: + if (!IS_ERR(mmc->supply.vmmc)) + mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, 0); + + if (!IS_ERR(mmc->supply.vqmmc) && + regulator_is_enabled(mmc->supply.vqmmc)) + regulator_disable(mmc->supply.vqmmc); + regs = mci_readl(slot->host, PWREN); regs &= ~(1 << slot->id); mci_writel(slot->host, PWREN, regs); break; + case MMC_POWER_ON: + if (!IS_ERR(mmc->supply.vqmmc) && + !regulator_is_enabled(mmc->supply.vqmmc)) { + ret = regulator_enable(mmc->supply.vqmmc); + if (ret < 0) + dev_err(&slot->mmc->class_dev, + "failed to enable vqmmc\n"); + } + break; default: break; } @@ -2067,7 +2088,9 @@ static int dw_mci_init_slot(struct dw_mci *host, unsigned int id) mmc->f_max = freq[1]; } - mmc->ocr_avail = MMC_VDD_32_33 | MMC_VDD_33_34; + mmc_regulator_get_supply(mmc); + if (!mmc->ocr_avail) + mmc->ocr_avail = MMC_VDD_32_33 | MMC_VDD_33_34; if (host->pdata->caps) mmc->caps = host->pdata->caps; @@ -2375,24 +2398,6 @@ int dw_mci_probe(struct dw_mci *host) } } - host->vmmc = devm_regulator_get_optional(host->dev, "vmmc"); - if (IS_ERR(host->vmmc)) { - ret = PTR_ERR(host->vmmc); - if (ret == -EPROBE_DEFER) - goto err_clk_ciu; - - dev_info(host->dev, "no vmmc regulator found: %d\n", ret); - host->vmmc = NULL; - } else { - ret = regulator_enable(host->vmmc); - if (ret) { - if (ret != -EPROBE_DEFER) - dev_err(host->dev, - "regulator_enable fail: %d\n", ret); - goto err_clk_ciu; - } - } - host->quirks = host->pdata->quirks; spin_lock_init(&host->lock); @@ -2536,9 +2541,6 @@ err_workqueue: err_dmaunmap: if (host->use_dma && host->dma_ops->exit) host->dma_ops->exit(host); - if (host->vmmc) - regulator_disable(host->vmmc); - err_clk_ciu: if (!IS_ERR(host->ciu_clk)) clk_disable_unprepare(host->ciu_clk); @@ -2573,9 +2575,6 @@ void dw_mci_remove(struct dw_mci *host) if (host->use_dma && host->dma_ops->exit) host->dma_ops->exit(host); - if (host->vmmc) - regulator_disable(host->vmmc); - if (!IS_ERR(host->ciu_clk)) clk_disable_unprepare(host->ciu_clk); @@ -2592,9 +2591,6 @@ EXPORT_SYMBOL(dw_mci_remove); */ int dw_mci_suspend(struct dw_mci *host) { - if (host->vmmc) - regulator_disable(host->vmmc); - return 0; } EXPORT_SYMBOL(dw_mci_suspend); @@ -2603,15 +2599,6 @@ int dw_mci_resume(struct dw_mci *host) { int i, ret; - if (host->vmmc) { - ret = regulator_enable(host->vmmc); - if (ret) { - dev_err(host->dev, - "failed to enable regulator: %d\n", ret); - return ret; - } - } - if (!dw_mci_ctrl_all_reset(host)) { ret = -ENODEV; return ret;
Use the mmc regulator API into core.c instead of enabling locally. It can use the "vmmc", and optional "vqmmc". Signed-off-by: Jaehoon Chung <jh80.chung@samsung.com> --- drivers/mmc/host/dw_mmc.c | 61 ++++++++++++++++++--------------------------- 1 file changed, 24 insertions(+), 37 deletions(-)