* [PATCH v2 00/16] omap_hsmmc: regulator usage cleanup and fixes
@ 2015-08-03 12:26 Kishon Vijay Abraham I
2015-08-03 12:26 ` [PATCH v2 01/16] mmc: host: omap_hsmmc: use devm_regulator_get_optional() for vmmc Kishon Vijay Abraham I
` (17 more replies)
0 siblings, 18 replies; 25+ messages in thread
From: Kishon Vijay Abraham I @ 2015-08-03 12:26 UTC (permalink / raw)
To: ulf.hansson, afenkart, tony, devicetree, linux-kernel, linux-mmc,
linux-omap
Cc: nsekhar, kishon
Changes from v1:
*) return on -EPROBE_DEFER and other fatal errors. (Don't return only
if the return value is -ENODEV)
*) Remove the beagle x15 dts patch. It can be part of a different
series.
*) Avoid using regulator_is_enabled for vqmmc since if the regulator
is shared and the other users are not using regulator_is_enabled
then there can be unbalanced regulator_enable/regulator_disable
This patch series does the following
*) Uses devm_regulator_get_optional() for vmmc and then removes the
CONFIG_REGULATOR check altogether.
*) return on -EPROBE_DEFER and any other fatal errors
*) enable/disable vmmc_aux regulator based on prior state
I've pushed this patch series to
git://git.ti.com/linux-phy/linux-phy.git mmc_regulator_cleanup_fixes_v2
Please note the branch also has the pbias fixes [1] & [2].
[1] -> https://lkml.org/lkml/2015/7/27/358
[2] -> https://lkml.org/lkml/2015/7/27/391
This series is in preparation for implementing the voltage switch
sequence so that UHS cards can be supported.
Did basic read/write test in J6, J6 Eco, Beagle-x15, AM437x EVM,
Beaglebone black, OMAP5 uEVM and OMAP4 PANDA.
Kishon Vijay Abraham I (15):
mmc: host: omap_hsmmc: use devm_regulator_get_optional() for vmmc
mmc: host: omap_hsmmc: return on fatal errors from omap_hsmmc_reg_get
mmc: host: omap_hsmmc: cleanup omap_hsmmc_reg_get()
mmc: host: omap_hsmmc: use the ocrmask provided by the vmmc regulator
mmc: host: omap_hsmmc: use mmc_host's vmmc and vqmmc
mmc: host: omap_hsmmc: remove unnecessary pbias set_voltage
mmc: host: omap_hsmmc: return error if any of the regulator APIs fail
mmc: host: omap_hsmmc: add separate functions for enable/disable
supply
mmc: host: omap_hsmmc: add separate function to set pbias
mmc: host: omap_hsmmc: avoid pbias regulator enable on power off
mmc: host: omap_hsmmc: don't use ->set_power to set initial regulator
state
mmc: host: omap_hsmmc: enable/disable vmmc_aux regulator based on
previous state
mmc: host: omap_hsmmc: use regulator_is_enabled to find pbias status
mmc: host: omap_hsmmc: use ios->vdd for setting vmmc voltage
mmc: host: omap_hsmmc: remove CONFIG_REGULATOR check
Roger Quadros (1):
mmc: host: omap_hsmmc: use "mmc_of_parse_voltage" to get ocr_avail
.../devicetree/bindings/mmc/ti-omap-hsmmc.txt | 2 +
drivers/mmc/host/omap_hsmmc.c | 340 +++++++++++++-------
2 files changed, 224 insertions(+), 118 deletions(-)
--
1.7.9.5
^ permalink raw reply [flat|nested] 25+ messages in thread
* [PATCH v2 01/16] mmc: host: omap_hsmmc: use devm_regulator_get_optional() for vmmc
2015-08-03 12:26 [PATCH v2 00/16] omap_hsmmc: regulator usage cleanup and fixes Kishon Vijay Abraham I
@ 2015-08-03 12:26 ` Kishon Vijay Abraham I
2015-08-03 12:26 ` [PATCH v2 02/16] mmc: host: omap_hsmmc: return on fatal errors from omap_hsmmc_reg_get Kishon Vijay Abraham I
` (16 subsequent siblings)
17 siblings, 0 replies; 25+ messages in thread
From: Kishon Vijay Abraham I @ 2015-08-03 12:26 UTC (permalink / raw)
To: ulf.hansson, afenkart, tony, devicetree, linux-kernel, linux-mmc,
linux-omap
Cc: nsekhar, kishon
Since vmmc can be optional for some platforms, use
devm_regulator_get_optional() for vmmc. Now return error only
if the return value of devm_regulator_get_optional() is not the
same as -ENODEV, since with -EPROBE_DEFER, the regulator can be
obtained later and all other errors are fatal.
Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
---
drivers/mmc/host/omap_hsmmc.c | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
index 4d12032..b4b1bde 100644
--- a/drivers/mmc/host/omap_hsmmc.c
+++ b/drivers/mmc/host/omap_hsmmc.c
@@ -343,12 +343,16 @@ static int omap_hsmmc_reg_get(struct omap_hsmmc_host *host)
{
struct regulator *reg;
int ocr_value = 0;
+ int ret;
- reg = devm_regulator_get(host->dev, "vmmc");
+ reg = devm_regulator_get_optional(host->dev, "vmmc");
if (IS_ERR(reg)) {
- dev_err(host->dev, "unable to get vmmc regulator %ld\n",
+ ret = PTR_ERR(reg);
+ if (ret != -ENODEV)
+ return ret;
+ host->vcc = NULL;
+ dev_dbg(host->dev, "unable to get vmmc regulator %ld\n",
PTR_ERR(reg));
- return PTR_ERR(reg);
} else {
host->vcc = reg;
ocr_value = mmc_regulator_get_ocrmask(reg);
--
1.7.9.5
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH v2 02/16] mmc: host: omap_hsmmc: return on fatal errors from omap_hsmmc_reg_get
2015-08-03 12:26 [PATCH v2 00/16] omap_hsmmc: regulator usage cleanup and fixes Kishon Vijay Abraham I
2015-08-03 12:26 ` [PATCH v2 01/16] mmc: host: omap_hsmmc: use devm_regulator_get_optional() for vmmc Kishon Vijay Abraham I
@ 2015-08-03 12:26 ` Kishon Vijay Abraham I
2015-08-03 12:26 ` [PATCH v2 03/16] mmc: host: omap_hsmmc: cleanup omap_hsmmc_reg_get() Kishon Vijay Abraham I
` (15 subsequent siblings)
17 siblings, 0 replies; 25+ messages in thread
From: Kishon Vijay Abraham I @ 2015-08-03 12:26 UTC (permalink / raw)
To: ulf.hansson, afenkart, tony, devicetree, linux-kernel, linux-mmc,
linux-omap
Cc: nsekhar, kishon
Now return error only if the return value of
devm_regulator_get_optional() is not the same as -ENODEV, since with
-EPROBE_DEFER, the regulator can be obtained later and all other
errors are fatal.
Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
---
drivers/mmc/host/omap_hsmmc.c | 22 ++++++++++++++++++++--
1 file changed, 20 insertions(+), 2 deletions(-)
diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
index b4b1bde..5637793 100644
--- a/drivers/mmc/host/omap_hsmmc.c
+++ b/drivers/mmc/host/omap_hsmmc.c
@@ -371,10 +371,28 @@ static int omap_hsmmc_reg_get(struct omap_hsmmc_host *host)
/* Allow an aux regulator */
reg = devm_regulator_get_optional(host->dev, "vmmc_aux");
- host->vcc_aux = IS_ERR(reg) ? NULL : reg;
+ if (IS_ERR(reg)) {
+ ret = PTR_ERR(reg);
+ if (ret != -ENODEV)
+ return ret;
+ host->vcc_aux = NULL;
+ dev_dbg(host->dev, "unable to get vmmc_aux regulator %ld\n",
+ PTR_ERR(reg));
+ } else {
+ host->vcc_aux = reg;
+ }
reg = devm_regulator_get_optional(host->dev, "pbias");
- host->pbias = IS_ERR(reg) ? NULL : reg;
+ if (IS_ERR(reg)) {
+ ret = PTR_ERR(reg);
+ if (ret != -ENODEV)
+ return ret;
+ host->pbias = NULL;
+ dev_dbg(host->dev, "unable to get pbias regulator %ld\n",
+ PTR_ERR(reg));
+ } else {
+ host->pbias = reg;
+ }
/* For eMMC do not power off when not in sleep state */
if (mmc_pdata(host)->no_regulator_off_init)
--
1.7.9.5
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH v2 03/16] mmc: host: omap_hsmmc: cleanup omap_hsmmc_reg_get()
2015-08-03 12:26 [PATCH v2 00/16] omap_hsmmc: regulator usage cleanup and fixes Kishon Vijay Abraham I
2015-08-03 12:26 ` [PATCH v2 01/16] mmc: host: omap_hsmmc: use devm_regulator_get_optional() for vmmc Kishon Vijay Abraham I
2015-08-03 12:26 ` [PATCH v2 02/16] mmc: host: omap_hsmmc: return on fatal errors from omap_hsmmc_reg_get Kishon Vijay Abraham I
@ 2015-08-03 12:26 ` Kishon Vijay Abraham I
2015-08-03 12:26 ` [PATCH v2 04/16] mmc: host: omap_hsmmc: use the ocrmask provided by the vmmc regulator Kishon Vijay Abraham I
` (14 subsequent siblings)
17 siblings, 0 replies; 25+ messages in thread
From: Kishon Vijay Abraham I @ 2015-08-03 12:26 UTC (permalink / raw)
To: ulf.hansson, afenkart, tony, devicetree, linux-kernel, linux-mmc,
linux-omap
Cc: nsekhar, kishon
No functional change. Instead of using a local regulator variable
in omap_hsmmc_reg_get() for holding the return value of
devm_regulator_get_optional() and then assigning to omap_hsmmc_host
regulator members: vcc, vcc_aux and pbias, directly use the
omap_hsmmc_host regulator members.
Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
Reviewed-by: Roger Quadros <rogerq@ti.com>
---
drivers/mmc/host/omap_hsmmc.c | 38 ++++++++++++++++----------------------
1 file changed, 16 insertions(+), 22 deletions(-)
diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
index 5637793..9d062a1 100644
--- a/drivers/mmc/host/omap_hsmmc.c
+++ b/drivers/mmc/host/omap_hsmmc.c
@@ -341,21 +341,19 @@ error_set_power:
static int omap_hsmmc_reg_get(struct omap_hsmmc_host *host)
{
- struct regulator *reg;
int ocr_value = 0;
int ret;
- reg = devm_regulator_get_optional(host->dev, "vmmc");
- if (IS_ERR(reg)) {
- ret = PTR_ERR(reg);
+ host->vcc = devm_regulator_get_optional(host->dev, "vmmc");
+ if (IS_ERR(host->vcc)) {
+ ret = PTR_ERR(host->vcc);
if (ret != -ENODEV)
return ret;
- host->vcc = NULL;
dev_dbg(host->dev, "unable to get vmmc regulator %ld\n",
- PTR_ERR(reg));
+ PTR_ERR(host->vcc));
+ host->vcc = NULL;
} else {
- host->vcc = reg;
- ocr_value = mmc_regulator_get_ocrmask(reg);
+ ocr_value = mmc_regulator_get_ocrmask(host->vcc);
if (!mmc_pdata(host)->ocr_mask) {
mmc_pdata(host)->ocr_mask = ocr_value;
} else {
@@ -370,28 +368,24 @@ static int omap_hsmmc_reg_get(struct omap_hsmmc_host *host)
mmc_pdata(host)->set_power = omap_hsmmc_set_power;
/* Allow an aux regulator */
- reg = devm_regulator_get_optional(host->dev, "vmmc_aux");
- if (IS_ERR(reg)) {
- ret = PTR_ERR(reg);
+ host->vcc_aux = devm_regulator_get_optional(host->dev, "vmmc_aux");
+ if (IS_ERR(host->vcc_aux)) {
+ ret = PTR_ERR(host->vcc_aux);
if (ret != -ENODEV)
return ret;
- host->vcc_aux = NULL;
dev_dbg(host->dev, "unable to get vmmc_aux regulator %ld\n",
- PTR_ERR(reg));
- } else {
- host->vcc_aux = reg;
+ PTR_ERR(host->vcc_aux));
+ host->vcc_aux = NULL;
}
- reg = devm_regulator_get_optional(host->dev, "pbias");
- if (IS_ERR(reg)) {
- ret = PTR_ERR(reg);
+ host->pbias = devm_regulator_get_optional(host->dev, "pbias");
+ if (IS_ERR(host->pbias)) {
+ ret = PTR_ERR(host->pbias);
if (ret != -ENODEV)
return ret;
- host->pbias = NULL;
dev_dbg(host->dev, "unable to get pbias regulator %ld\n",
- PTR_ERR(reg));
- } else {
- host->pbias = reg;
+ PTR_ERR(host->pbias));
+ host->pbias = NULL;
}
/* For eMMC do not power off when not in sleep state */
--
1.7.9.5
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH v2 04/16] mmc: host: omap_hsmmc: use the ocrmask provided by the vmmc regulator
2015-08-03 12:26 [PATCH v2 00/16] omap_hsmmc: regulator usage cleanup and fixes Kishon Vijay Abraham I
` (2 preceding siblings ...)
2015-08-03 12:26 ` [PATCH v2 03/16] mmc: host: omap_hsmmc: cleanup omap_hsmmc_reg_get() Kishon Vijay Abraham I
@ 2015-08-03 12:26 ` Kishon Vijay Abraham I
2015-08-03 12:26 ` [PATCH v2 05/16] mmc: host: omap_hsmmc: use mmc_host's vmmc and vqmmc Kishon Vijay Abraham I
` (13 subsequent siblings)
17 siblings, 0 replies; 25+ messages in thread
From: Kishon Vijay Abraham I @ 2015-08-03 12:26 UTC (permalink / raw)
To: ulf.hansson, afenkart, tony, devicetree, linux-kernel, linux-mmc,
linux-omap
Cc: nsekhar, kishon
If the vmmc regulator provides a valid ocrmask, use it. By this even if
the pdata has a valid ocrmask, it will be overwritten with the ocrmask
of the vmmc regulator.
Also remove the unnecessary compatibility check between the ocrmask in
the pdata and the ocrmask from the vmmc regulator.
Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
---
drivers/mmc/host/omap_hsmmc.c | 10 +---------
1 file changed, 1 insertion(+), 9 deletions(-)
diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
index 9d062a1..8cf040f 100644
--- a/drivers/mmc/host/omap_hsmmc.c
+++ b/drivers/mmc/host/omap_hsmmc.c
@@ -354,16 +354,8 @@ static int omap_hsmmc_reg_get(struct omap_hsmmc_host *host)
host->vcc = NULL;
} else {
ocr_value = mmc_regulator_get_ocrmask(host->vcc);
- if (!mmc_pdata(host)->ocr_mask) {
+ if (ocr_value > 0)
mmc_pdata(host)->ocr_mask = ocr_value;
- } else {
- if (!(mmc_pdata(host)->ocr_mask & ocr_value)) {
- dev_err(host->dev, "ocrmask %x is not supported\n",
- mmc_pdata(host)->ocr_mask);
- mmc_pdata(host)->ocr_mask = 0;
- return -EINVAL;
- }
- }
}
mmc_pdata(host)->set_power = omap_hsmmc_set_power;
--
1.7.9.5
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH v2 05/16] mmc: host: omap_hsmmc: use mmc_host's vmmc and vqmmc
2015-08-03 12:26 [PATCH v2 00/16] omap_hsmmc: regulator usage cleanup and fixes Kishon Vijay Abraham I
` (3 preceding siblings ...)
2015-08-03 12:26 ` [PATCH v2 04/16] mmc: host: omap_hsmmc: use the ocrmask provided by the vmmc regulator Kishon Vijay Abraham I
@ 2015-08-03 12:26 ` Kishon Vijay Abraham I
2015-08-03 12:26 ` [PATCH v2 06/16] mmc: host: omap_hsmmc: remove unnecessary pbias set_voltage Kishon Vijay Abraham I
` (12 subsequent siblings)
17 siblings, 0 replies; 25+ messages in thread
From: Kishon Vijay Abraham I @ 2015-08-03 12:26 UTC (permalink / raw)
To: ulf.hansson, afenkart, tony, devicetree, linux-kernel, linux-mmc,
linux-omap
Cc: nsekhar, kishon
No functional change. Instead of using omap_hsmmc_host's vcc and vcc_aux
members, use vmmc and vqmmc present in mmc_host which is present
for the same purpose.
Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
Reviewed-by: Roger Quadros <rogerq@ti.com>
---
drivers/mmc/host/omap_hsmmc.c | 63 ++++++++++++++++++-----------------------
1 file changed, 28 insertions(+), 35 deletions(-)
diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
index 8cf040f..f6b056f 100644
--- a/drivers/mmc/host/omap_hsmmc.c
+++ b/drivers/mmc/host/omap_hsmmc.c
@@ -181,15 +181,6 @@ struct omap_hsmmc_host {
struct mmc_data *data;
struct clk *fclk;
struct clk *dbclk;
- /*
- * vcc == configured supply
- * vcc_aux == optional
- * - MMC1, supply for DAT4..DAT7
- * - MMC2/MMC2, external level shifter voltage supply, for
- * chip (SDIO, eMMC, etc) or transceiver (MMC2 only)
- */
- struct regulator *vcc;
- struct regulator *vcc_aux;
struct regulator *pbias;
bool pbias_enabled;
void __iomem *base;
@@ -260,13 +251,14 @@ static int omap_hsmmc_set_power(struct device *dev, int power_on, int vdd)
{
struct omap_hsmmc_host *host =
platform_get_drvdata(to_platform_device(dev));
+ struct mmc_host *mmc = host->mmc;
int ret = 0;
/*
* If we don't see a Vcc regulator, assume it's a fixed
* voltage always-on regulator.
*/
- if (!host->vcc)
+ if (!mmc->supply.vmmc)
return 0;
if (mmc_pdata(host)->before_set_reg)
@@ -295,23 +287,23 @@ static int omap_hsmmc_set_power(struct device *dev, int power_on, int vdd)
* chips/cards need an interface voltage rail too.
*/
if (power_on) {
- if (host->vcc)
- ret = mmc_regulator_set_ocr(host->mmc, host->vcc, vdd);
+ if (mmc->supply.vmmc)
+ ret = mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, vdd);
/* Enable interface voltage rail, if needed */
- if (ret == 0 && host->vcc_aux) {
- ret = regulator_enable(host->vcc_aux);
- if (ret < 0 && host->vcc)
- ret = mmc_regulator_set_ocr(host->mmc,
- host->vcc, 0);
+ if (ret == 0 && mmc->supply.vqmmc) {
+ ret = regulator_enable(mmc->supply.vqmmc);
+ if (ret < 0 && mmc->supply.vmmc)
+ ret = mmc_regulator_set_ocr(mmc,
+ mmc->supply.vmmc,
+ 0);
}
} else {
/* Shut down the rail */
- if (host->vcc_aux)
- ret = regulator_disable(host->vcc_aux);
- if (host->vcc) {
+ if (mmc->supply.vqmmc)
+ ret = regulator_disable(mmc->supply.vqmmc);
+ if (mmc->supply.vmmc) {
/* Then proceed to shut down the local regulator */
- ret = mmc_regulator_set_ocr(host->mmc,
- host->vcc, 0);
+ ret = mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, 0);
}
}
@@ -343,31 +335,32 @@ static int omap_hsmmc_reg_get(struct omap_hsmmc_host *host)
{
int ocr_value = 0;
int ret;
+ struct mmc_host *mmc = host->mmc;
- host->vcc = devm_regulator_get_optional(host->dev, "vmmc");
- if (IS_ERR(host->vcc)) {
- ret = PTR_ERR(host->vcc);
+ mmc->supply.vmmc = devm_regulator_get_optional(host->dev, "vmmc");
+ if (IS_ERR(mmc->supply.vmmc)) {
+ ret = PTR_ERR(mmc->supply.vmmc);
if (ret != -ENODEV)
return ret;
dev_dbg(host->dev, "unable to get vmmc regulator %ld\n",
- PTR_ERR(host->vcc));
- host->vcc = NULL;
+ PTR_ERR(mmc->supply.vmmc));
+ mmc->supply.vmmc = NULL;
} else {
- ocr_value = mmc_regulator_get_ocrmask(host->vcc);
+ ocr_value = mmc_regulator_get_ocrmask(mmc->supply.vmmc);
if (ocr_value > 0)
mmc_pdata(host)->ocr_mask = ocr_value;
}
mmc_pdata(host)->set_power = omap_hsmmc_set_power;
/* Allow an aux regulator */
- host->vcc_aux = devm_regulator_get_optional(host->dev, "vmmc_aux");
- if (IS_ERR(host->vcc_aux)) {
- ret = PTR_ERR(host->vcc_aux);
+ mmc->supply.vqmmc = devm_regulator_get_optional(host->dev, "vmmc_aux");
+ if (IS_ERR(mmc->supply.vqmmc)) {
+ ret = PTR_ERR(mmc->supply.vqmmc);
if (ret != -ENODEV)
return ret;
dev_dbg(host->dev, "unable to get vmmc_aux regulator %ld\n",
- PTR_ERR(host->vcc_aux));
- host->vcc_aux = NULL;
+ PTR_ERR(mmc->supply.vqmmc));
+ mmc->supply.vqmmc = NULL;
}
host->pbias = devm_regulator_get_optional(host->dev, "pbias");
@@ -387,8 +380,8 @@ static int omap_hsmmc_reg_get(struct omap_hsmmc_host *host)
* To disable boot_on regulator, enable regulator
* to increase usecount and then disable it.
*/
- if ((host->vcc && regulator_is_enabled(host->vcc) > 0) ||
- (host->vcc_aux && regulator_is_enabled(host->vcc_aux))) {
+ if ((mmc->supply.vmmc && regulator_is_enabled(mmc->supply.vmmc) > 0) ||
+ (mmc->supply.vqmmc && regulator_is_enabled(mmc->supply.vqmmc))) {
int vdd = ffs(mmc_pdata(host)->ocr_mask) - 1;
mmc_pdata(host)->set_power(host->dev, 1, vdd);
--
1.7.9.5
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH v2 06/16] mmc: host: omap_hsmmc: remove unnecessary pbias set_voltage
2015-08-03 12:26 [PATCH v2 00/16] omap_hsmmc: regulator usage cleanup and fixes Kishon Vijay Abraham I
` (4 preceding siblings ...)
2015-08-03 12:26 ` [PATCH v2 05/16] mmc: host: omap_hsmmc: use mmc_host's vmmc and vqmmc Kishon Vijay Abraham I
@ 2015-08-03 12:26 ` Kishon Vijay Abraham I
2015-08-03 12:26 ` [PATCH v2 07/16] mmc: host: omap_hsmmc: return error if any of the regulator APIs fail Kishon Vijay Abraham I
` (11 subsequent siblings)
17 siblings, 0 replies; 25+ messages in thread
From: Kishon Vijay Abraham I @ 2015-08-03 12:26 UTC (permalink / raw)
To: ulf.hansson, afenkart, tony, devicetree, linux-kernel, linux-mmc,
linux-omap
Cc: nsekhar, kishon
Remove the unnecessary pbias regulator_set_voltage done after
pbias regulator_disable in omap_hsmmc_set_power.
Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
Reviewed-by: Roger Quadros <rogerq@ti.com>
---
drivers/mmc/host/omap_hsmmc.c | 1 -
1 file changed, 1 deletion(-)
diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
index f6b056f..d635a38 100644
--- a/drivers/mmc/host/omap_hsmmc.c
+++ b/drivers/mmc/host/omap_hsmmc.c
@@ -270,7 +270,6 @@ static int omap_hsmmc_set_power(struct device *dev, int power_on, int vdd)
if (!ret)
host->pbias_enabled = 0;
}
- regulator_set_voltage(host->pbias, VDD_3V0, VDD_3V0);
}
/*
--
1.7.9.5
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH v2 07/16] mmc: host: omap_hsmmc: return error if any of the regulator APIs fail
2015-08-03 12:26 [PATCH v2 00/16] omap_hsmmc: regulator usage cleanup and fixes Kishon Vijay Abraham I
` (5 preceding siblings ...)
2015-08-03 12:26 ` [PATCH v2 06/16] mmc: host: omap_hsmmc: remove unnecessary pbias set_voltage Kishon Vijay Abraham I
@ 2015-08-03 12:26 ` Kishon Vijay Abraham I
2015-08-03 12:26 ` [PATCH v2 08/16] mmc: host: omap_hsmmc: add separate functions for enable/disable supply Kishon Vijay Abraham I
` (10 subsequent siblings)
17 siblings, 0 replies; 25+ messages in thread
From: Kishon Vijay Abraham I @ 2015-08-03 12:26 UTC (permalink / raw)
To: ulf.hansson, afenkart, tony, devicetree, linux-kernel, linux-mmc,
linux-omap
Cc: nsekhar, kishon
Return error if any of the regulator APIs (regulator_enable,
regulator_disable, regulator_set_voltage) fails in
omap_hsmmc_set_power to avoid undefined behavior.
Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
---
drivers/mmc/host/omap_hsmmc.c | 52 +++++++++++++++++++++++++++++++----------
1 file changed, 40 insertions(+), 12 deletions(-)
diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
index d635a38..63c9fe7 100644
--- a/drivers/mmc/host/omap_hsmmc.c
+++ b/drivers/mmc/host/omap_hsmmc.c
@@ -267,8 +267,11 @@ static int omap_hsmmc_set_power(struct device *dev, int power_on, int vdd)
if (host->pbias) {
if (host->pbias_enabled == 1) {
ret = regulator_disable(host->pbias);
- if (!ret)
- host->pbias_enabled = 0;
+ if (ret) {
+ dev_err(dev, "pbias reg disable failed\n");
+ return ret;
+ }
+ host->pbias_enabled = 0;
}
}
@@ -286,23 +289,35 @@ static int omap_hsmmc_set_power(struct device *dev, int power_on, int vdd)
* chips/cards need an interface voltage rail too.
*/
if (power_on) {
- if (mmc->supply.vmmc)
+ if (mmc->supply.vmmc) {
ret = mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, vdd);
+ if (ret)
+ return ret;
+ }
+
/* Enable interface voltage rail, if needed */
- if (ret == 0 && mmc->supply.vqmmc) {
+ if (mmc->supply.vqmmc) {
ret = regulator_enable(mmc->supply.vqmmc);
- if (ret < 0 && mmc->supply.vmmc)
- ret = mmc_regulator_set_ocr(mmc,
- mmc->supply.vmmc,
- 0);
+ if (ret) {
+ dev_err(dev, "vmmc_aux reg enable failed\n");
+ goto err_set_vqmmc;
+ }
}
} else {
/* Shut down the rail */
- if (mmc->supply.vqmmc)
+ if (mmc->supply.vqmmc) {
ret = regulator_disable(mmc->supply.vqmmc);
+ if (ret) {
+ dev_err(dev, "vmmc_aux reg disable failed\n");
+ return ret;
+ }
+ }
+
if (mmc->supply.vmmc) {
/* Then proceed to shut down the local regulator */
ret = mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, 0);
+ if (ret)
+ return ret;
}
}
@@ -314,19 +329,32 @@ static int omap_hsmmc_set_power(struct device *dev, int power_on, int vdd)
ret = regulator_set_voltage(host->pbias, VDD_3V0,
VDD_3V0);
if (ret < 0)
- goto error_set_power;
+ goto err_set_voltage;
if (host->pbias_enabled == 0) {
ret = regulator_enable(host->pbias);
- if (!ret)
+ if (ret) {
+ dev_err(dev, "pbias reg enable failed\n");
+ goto err_set_voltage;
+ } else {
host->pbias_enabled = 1;
+ }
}
}
if (mmc_pdata(host)->after_set_reg)
mmc_pdata(host)->after_set_reg(dev, power_on, vdd);
-error_set_power:
+ return 0;
+
+err_set_voltage:
+ if (mmc->supply.vqmmc)
+ regulator_disable(mmc->supply.vqmmc);
+
+err_set_vqmmc:
+ if (mmc->supply.vmmc)
+ mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, 0);
+
return ret;
}
--
1.7.9.5
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH v2 08/16] mmc: host: omap_hsmmc: add separate functions for enable/disable supply
2015-08-03 12:26 [PATCH v2 00/16] omap_hsmmc: regulator usage cleanup and fixes Kishon Vijay Abraham I
` (6 preceding siblings ...)
2015-08-03 12:26 ` [PATCH v2 07/16] mmc: host: omap_hsmmc: return error if any of the regulator APIs fail Kishon Vijay Abraham I
@ 2015-08-03 12:26 ` Kishon Vijay Abraham I
2015-08-03 12:26 ` [PATCH v2 09/16] mmc: host: omap_hsmmc: add separate function to set pbias Kishon Vijay Abraham I
` (9 subsequent siblings)
17 siblings, 0 replies; 25+ messages in thread
From: Kishon Vijay Abraham I @ 2015-08-03 12:26 UTC (permalink / raw)
To: ulf.hansson, afenkart, tony, devicetree, linux-kernel, linux-mmc,
linux-omap
Cc: nsekhar, kishon
No functional change. Cleanup omap_hsmmc_set_power by adding separate
functions for enable/disable supply and invoke it from
omap_hsmmc_set_power.
Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
---
drivers/mmc/host/omap_hsmmc.c | 101 +++++++++++++++++++++++++++--------------
1 file changed, 66 insertions(+), 35 deletions(-)
diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
index 63c9fe7..81bec66 100644
--- a/drivers/mmc/host/omap_hsmmc.c
+++ b/drivers/mmc/host/omap_hsmmc.c
@@ -247,6 +247,65 @@ static int omap_hsmmc_get_cover_state(struct device *dev)
#ifdef CONFIG_REGULATOR
+static int omap_hsmmc_enable_supply(struct mmc_host *mmc, int vdd)
+{
+ int ret;
+
+ if (mmc->supply.vmmc) {
+ ret = mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, vdd);
+ if (ret)
+ return ret;
+ }
+
+ /* Enable interface voltage rail, if needed */
+ if (mmc->supply.vqmmc) {
+ ret = regulator_enable(mmc->supply.vqmmc);
+ if (ret) {
+ dev_err(mmc_dev(mmc), "vmmc_aux reg enable failed\n");
+ goto err_vqmmc;
+ }
+ }
+
+ return 0;
+
+err_vqmmc:
+ if (mmc->supply.vmmc)
+ mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, 0);
+
+ return ret;
+}
+
+static int omap_hsmmc_disable_supply(struct mmc_host *mmc)
+{
+ int ret;
+ int status;
+
+ if (mmc->supply.vqmmc) {
+ ret = regulator_disable(mmc->supply.vqmmc);
+ if (ret) {
+ dev_err(mmc_dev(mmc), "vmmc_aux reg disable failed\n");
+ return ret;
+ }
+ }
+
+ if (mmc->supply.vmmc) {
+ ret = mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, 0);
+ if (ret)
+ goto err_set_ocr;
+ }
+
+ return 0;
+
+err_set_ocr:
+ if (mmc->supply.vqmmc) {
+ status = regulator_enable(mmc->supply.vqmmc);
+ if (status)
+ dev_err(mmc_dev(mmc), "vmmc_aux re-enable failed\n");
+ }
+
+ return ret;
+}
+
static int omap_hsmmc_set_power(struct device *dev, int power_on, int vdd)
{
struct omap_hsmmc_host *host =
@@ -289,36 +348,13 @@ static int omap_hsmmc_set_power(struct device *dev, int power_on, int vdd)
* chips/cards need an interface voltage rail too.
*/
if (power_on) {
- if (mmc->supply.vmmc) {
- ret = mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, vdd);
- if (ret)
- return ret;
- }
-
- /* Enable interface voltage rail, if needed */
- if (mmc->supply.vqmmc) {
- ret = regulator_enable(mmc->supply.vqmmc);
- if (ret) {
- dev_err(dev, "vmmc_aux reg enable failed\n");
- goto err_set_vqmmc;
- }
- }
+ ret = omap_hsmmc_enable_supply(mmc, vdd);
+ if (ret)
+ return ret;
} else {
- /* Shut down the rail */
- if (mmc->supply.vqmmc) {
- ret = regulator_disable(mmc->supply.vqmmc);
- if (ret) {
- dev_err(dev, "vmmc_aux reg disable failed\n");
- return ret;
- }
- }
-
- if (mmc->supply.vmmc) {
- /* Then proceed to shut down the local regulator */
- ret = mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, 0);
- if (ret)
- return ret;
- }
+ ret = omap_hsmmc_disable_supply(mmc);
+ if (ret)
+ return ret;
}
if (host->pbias) {
@@ -348,12 +384,7 @@ static int omap_hsmmc_set_power(struct device *dev, int power_on, int vdd)
return 0;
err_set_voltage:
- if (mmc->supply.vqmmc)
- regulator_disable(mmc->supply.vqmmc);
-
-err_set_vqmmc:
- if (mmc->supply.vmmc)
- mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, 0);
+ omap_hsmmc_disable_supply(mmc);
return ret;
}
--
1.7.9.5
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH v2 09/16] mmc: host: omap_hsmmc: add separate function to set pbias
2015-08-03 12:26 [PATCH v2 00/16] omap_hsmmc: regulator usage cleanup and fixes Kishon Vijay Abraham I
` (7 preceding siblings ...)
2015-08-03 12:26 ` [PATCH v2 08/16] mmc: host: omap_hsmmc: add separate functions for enable/disable supply Kishon Vijay Abraham I
@ 2015-08-03 12:26 ` Kishon Vijay Abraham I
2015-08-03 12:26 ` [PATCH v2 10/16] mmc: host: omap_hsmmc: avoid pbias regulator enable on power off Kishon Vijay Abraham I
` (8 subsequent siblings)
17 siblings, 0 replies; 25+ messages in thread
From: Kishon Vijay Abraham I @ 2015-08-03 12:26 UTC (permalink / raw)
To: ulf.hansson, afenkart, tony, devicetree, linux-kernel, linux-mmc,
linux-omap
Cc: nsekhar, kishon
No functional change. Cleanup omap_hsmmc_set_power by adding separate
functions to set pbias and invoke it from omap_hsmmc_set_power.
Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
---
drivers/mmc/host/omap_hsmmc.c | 78 +++++++++++++++++++++++++----------------
1 file changed, 48 insertions(+), 30 deletions(-)
diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
index 81bec66..194c59f 100644
--- a/drivers/mmc/host/omap_hsmmc.c
+++ b/drivers/mmc/host/omap_hsmmc.c
@@ -306,6 +306,48 @@ err_set_ocr:
return ret;
}
+static int omap_hsmmc_set_pbias(struct omap_hsmmc_host *host, bool power_on,
+ int vdd)
+{
+ int ret;
+
+ if (!host->pbias)
+ return 0;
+
+ if (power_on) {
+ if (vdd <= VDD_165_195)
+ ret = regulator_set_voltage(host->pbias, VDD_1V8,
+ VDD_1V8);
+ else
+ ret = regulator_set_voltage(host->pbias, VDD_3V0,
+ VDD_3V0);
+ if (ret < 0) {
+ dev_err(host->dev, "pbias set voltage fail\n");
+ return ret;
+ }
+
+ if (host->pbias_enabled == 0) {
+ ret = regulator_enable(host->pbias);
+ if (ret) {
+ dev_err(host->dev, "pbias reg enable fail\n");
+ return ret;
+ }
+ host->pbias_enabled = 1;
+ }
+ } else {
+ if (host->pbias_enabled == 1) {
+ ret = regulator_disable(host->pbias);
+ if (ret) {
+ dev_err(host->dev, "pbias reg disable fail\n");
+ return ret;
+ }
+ host->pbias_enabled = 0;
+ }
+ }
+
+ return 0;
+}
+
static int omap_hsmmc_set_power(struct device *dev, int power_on, int vdd)
{
struct omap_hsmmc_host *host =
@@ -323,16 +365,9 @@ static int omap_hsmmc_set_power(struct device *dev, int power_on, int vdd)
if (mmc_pdata(host)->before_set_reg)
mmc_pdata(host)->before_set_reg(dev, power_on, vdd);
- if (host->pbias) {
- if (host->pbias_enabled == 1) {
- ret = regulator_disable(host->pbias);
- if (ret) {
- dev_err(dev, "pbias reg disable failed\n");
- return ret;
- }
- host->pbias_enabled = 0;
- }
- }
+ ret = omap_hsmmc_set_pbias(host, false, 0);
+ if (ret)
+ return ret;
/*
* Assume Vcc regulator is used only to power the card ... OMAP
@@ -357,26 +392,9 @@ static int omap_hsmmc_set_power(struct device *dev, int power_on, int vdd)
return ret;
}
- if (host->pbias) {
- if (vdd <= VDD_165_195)
- ret = regulator_set_voltage(host->pbias, VDD_1V8,
- VDD_1V8);
- else
- ret = regulator_set_voltage(host->pbias, VDD_3V0,
- VDD_3V0);
- if (ret < 0)
- goto err_set_voltage;
-
- if (host->pbias_enabled == 0) {
- ret = regulator_enable(host->pbias);
- if (ret) {
- dev_err(dev, "pbias reg enable failed\n");
- goto err_set_voltage;
- } else {
- host->pbias_enabled = 1;
- }
- }
- }
+ ret = omap_hsmmc_set_pbias(host, true, vdd);
+ if (ret)
+ goto err_set_voltage;
if (mmc_pdata(host)->after_set_reg)
mmc_pdata(host)->after_set_reg(dev, power_on, vdd);
--
1.7.9.5
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH v2 10/16] mmc: host: omap_hsmmc: avoid pbias regulator enable on power off
2015-08-03 12:26 [PATCH v2 00/16] omap_hsmmc: regulator usage cleanup and fixes Kishon Vijay Abraham I
` (8 preceding siblings ...)
2015-08-03 12:26 ` [PATCH v2 09/16] mmc: host: omap_hsmmc: add separate function to set pbias Kishon Vijay Abraham I
@ 2015-08-03 12:26 ` Kishon Vijay Abraham I
2015-08-03 12:26 ` [PATCH v2 11/16] mmc: host: omap_hsmmc: don't use ->set_power to set initial regulator state Kishon Vijay Abraham I
` (7 subsequent siblings)
17 siblings, 0 replies; 25+ messages in thread
From: Kishon Vijay Abraham I @ 2015-08-03 12:26 UTC (permalink / raw)
To: ulf.hansson, afenkart, tony, devicetree, linux-kernel, linux-mmc,
linux-omap
Cc: nsekhar, kishon
Fix omap_hsmmc_set_power so that pbias regulator is not enabled
during power off.
Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
---
drivers/mmc/host/omap_hsmmc.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
index 194c59f..4af902d 100644
--- a/drivers/mmc/host/omap_hsmmc.c
+++ b/drivers/mmc/host/omap_hsmmc.c
@@ -386,16 +386,16 @@ static int omap_hsmmc_set_power(struct device *dev, int power_on, int vdd)
ret = omap_hsmmc_enable_supply(mmc, vdd);
if (ret)
return ret;
+
+ ret = omap_hsmmc_set_pbias(host, true, vdd);
+ if (ret)
+ goto err_set_voltage;
} else {
ret = omap_hsmmc_disable_supply(mmc);
if (ret)
return ret;
}
- ret = omap_hsmmc_set_pbias(host, true, vdd);
- if (ret)
- goto err_set_voltage;
-
if (mmc_pdata(host)->after_set_reg)
mmc_pdata(host)->after_set_reg(dev, power_on, vdd);
--
1.7.9.5
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH v2 11/16] mmc: host: omap_hsmmc: don't use ->set_power to set initial regulator state
2015-08-03 12:26 [PATCH v2 00/16] omap_hsmmc: regulator usage cleanup and fixes Kishon Vijay Abraham I
` (9 preceding siblings ...)
2015-08-03 12:26 ` [PATCH v2 10/16] mmc: host: omap_hsmmc: avoid pbias regulator enable on power off Kishon Vijay Abraham I
@ 2015-08-03 12:26 ` Kishon Vijay Abraham I
2015-08-03 12:26 ` [PATCH v2 12/16] mmc: host: omap_hsmmc: enable/disable vmmc_aux regulator based on previous state Kishon Vijay Abraham I
` (6 subsequent siblings)
17 siblings, 0 replies; 25+ messages in thread
From: Kishon Vijay Abraham I @ 2015-08-03 12:26 UTC (permalink / raw)
To: ulf.hansson, afenkart, tony, devicetree, linux-kernel, linux-mmc,
linux-omap
Cc: nsekhar, kishon
If the regulator is enabled on boot (checked using regulator_is_enabled),
invoke regulator_enable() so that the usecount reflects the correct
state of the regulator and then disable the regulator so that the
initial state of the regulator is disabled. Avoid using ->set_power,
since set_power also takes care of setting the voltages which is not
needed at this point.
Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
---
drivers/mmc/host/omap_hsmmc.c | 66 ++++++++++++++++++++++++++++++++++-------
1 file changed, 56 insertions(+), 10 deletions(-)
diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
index 4af902d..635ac18 100644
--- a/drivers/mmc/host/omap_hsmmc.c
+++ b/drivers/mmc/host/omap_hsmmc.c
@@ -407,6 +407,59 @@ err_set_voltage:
return ret;
}
+static int omap_hsmmc_disable_boot_regulator(struct regulator *reg)
+{
+ int ret;
+
+ if (!reg)
+ return 0;
+
+ if (regulator_is_enabled(reg)) {
+ ret = regulator_enable(reg);
+ if (ret)
+ return ret;
+
+ ret = regulator_disable(reg);
+ if (ret)
+ return ret;
+ }
+
+ return 0;
+}
+
+static int omap_hsmmc_disable_boot_regulators(struct omap_hsmmc_host *host)
+{
+ struct mmc_host *mmc = host->mmc;
+ int ret;
+
+ /*
+ * disable regulators enabled during boot and get the usecount
+ * right so that regulators can be enabled/disabled by checking
+ * the return value of regulator_is_enabled
+ */
+ ret = omap_hsmmc_disable_boot_regulator(mmc->supply.vmmc);
+ if (ret) {
+ dev_err(host->dev, "fail to disable boot enabled vmmc reg\n");
+ return ret;
+ }
+
+ ret = omap_hsmmc_disable_boot_regulator(mmc->supply.vqmmc);
+ if (ret) {
+ dev_err(host->dev,
+ "fail to disable boot enabled vmmc_aux reg\n");
+ return ret;
+ }
+
+ ret = omap_hsmmc_disable_boot_regulator(host->pbias);
+ if (ret) {
+ dev_err(host->dev,
+ "failed to disable boot enabled pbias reg\n");
+ return ret;
+ }
+
+ return 0;
+}
+
static int omap_hsmmc_reg_get(struct omap_hsmmc_host *host)
{
int ocr_value = 0;
@@ -452,17 +505,10 @@ static int omap_hsmmc_reg_get(struct omap_hsmmc_host *host)
/* For eMMC do not power off when not in sleep state */
if (mmc_pdata(host)->no_regulator_off_init)
return 0;
- /*
- * To disable boot_on regulator, enable regulator
- * to increase usecount and then disable it.
- */
- if ((mmc->supply.vmmc && regulator_is_enabled(mmc->supply.vmmc) > 0) ||
- (mmc->supply.vqmmc && regulator_is_enabled(mmc->supply.vqmmc))) {
- int vdd = ffs(mmc_pdata(host)->ocr_mask) - 1;
- mmc_pdata(host)->set_power(host->dev, 1, vdd);
- mmc_pdata(host)->set_power(host->dev, 0, 0);
- }
+ ret = omap_hsmmc_disable_boot_regulators(host);
+ if (ret)
+ return ret;
return 0;
}
--
1.7.9.5
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH v2 12/16] mmc: host: omap_hsmmc: enable/disable vmmc_aux regulator based on previous state
2015-08-03 12:26 [PATCH v2 00/16] omap_hsmmc: regulator usage cleanup and fixes Kishon Vijay Abraham I
` (10 preceding siblings ...)
2015-08-03 12:26 ` [PATCH v2 11/16] mmc: host: omap_hsmmc: don't use ->set_power to set initial regulator state Kishon Vijay Abraham I
@ 2015-08-03 12:26 ` Kishon Vijay Abraham I
2015-08-03 12:26 ` [PATCH v2 13/16] mmc: host: omap_hsmmc: use regulator_is_enabled to find pbias status Kishon Vijay Abraham I
` (5 subsequent siblings)
17 siblings, 0 replies; 25+ messages in thread
From: Kishon Vijay Abraham I @ 2015-08-03 12:26 UTC (permalink / raw)
To: ulf.hansson, afenkart, tony, devicetree, linux-kernel, linux-mmc,
linux-omap
Cc: nsekhar, kishon
enable vmmc_aux regulator only if it is in disabled state and disable
vmmc_aux regulator only if it is in enabled state.
Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
---
drivers/mmc/host/omap_hsmmc.c | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
index 635ac18..98e0289 100644
--- a/drivers/mmc/host/omap_hsmmc.c
+++ b/drivers/mmc/host/omap_hsmmc.c
@@ -184,6 +184,7 @@ struct omap_hsmmc_host {
struct regulator *pbias;
bool pbias_enabled;
void __iomem *base;
+ int vqmmc_enabled;
resource_size_t mapbase;
spinlock_t irq_lock; /* Prevent races with irq handler */
unsigned int dma_len;
@@ -250,6 +251,7 @@ static int omap_hsmmc_get_cover_state(struct device *dev)
static int omap_hsmmc_enable_supply(struct mmc_host *mmc, int vdd)
{
int ret;
+ struct omap_hsmmc_host *host = mmc_priv(mmc);
if (mmc->supply.vmmc) {
ret = mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, vdd);
@@ -258,12 +260,13 @@ static int omap_hsmmc_enable_supply(struct mmc_host *mmc, int vdd)
}
/* Enable interface voltage rail, if needed */
- if (mmc->supply.vqmmc) {
+ if (mmc->supply.vqmmc && !host->vqmmc_enabled) {
ret = regulator_enable(mmc->supply.vqmmc);
if (ret) {
dev_err(mmc_dev(mmc), "vmmc_aux reg enable failed\n");
goto err_vqmmc;
}
+ host->vqmmc_enabled = 1;
}
return 0;
@@ -279,13 +282,15 @@ static int omap_hsmmc_disable_supply(struct mmc_host *mmc)
{
int ret;
int status;
+ struct omap_hsmmc_host *host = mmc_priv(mmc);
- if (mmc->supply.vqmmc) {
+ if (mmc->supply.vqmmc && host->vqmmc_enabled) {
ret = regulator_disable(mmc->supply.vqmmc);
if (ret) {
dev_err(mmc_dev(mmc), "vmmc_aux reg disable failed\n");
return ret;
}
+ host->vqmmc_enabled = 0;
}
if (mmc->supply.vmmc) {
@@ -2077,6 +2082,7 @@ static int omap_hsmmc_probe(struct platform_device *pdev)
host->power_mode = MMC_POWER_OFF;
host->next_data.cookie = 1;
host->pbias_enabled = 0;
+ host->vqmmc_enabled = 0;
ret = omap_hsmmc_gpio_init(mmc, host, pdata);
if (ret)
--
1.7.9.5
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH v2 13/16] mmc: host: omap_hsmmc: use regulator_is_enabled to find pbias status
2015-08-03 12:26 [PATCH v2 00/16] omap_hsmmc: regulator usage cleanup and fixes Kishon Vijay Abraham I
` (11 preceding siblings ...)
2015-08-03 12:26 ` [PATCH v2 12/16] mmc: host: omap_hsmmc: enable/disable vmmc_aux regulator based on previous state Kishon Vijay Abraham I
@ 2015-08-03 12:26 ` Kishon Vijay Abraham I
2015-08-03 12:26 ` [PATCH v2 14/16] mmc: host: omap_hsmmc: use ios->vdd for setting vmmc voltage Kishon Vijay Abraham I
` (4 subsequent siblings)
17 siblings, 0 replies; 25+ messages in thread
From: Kishon Vijay Abraham I @ 2015-08-03 12:26 UTC (permalink / raw)
To: ulf.hansson, afenkart, tony, devicetree, linux-kernel, linux-mmc,
linux-omap
Cc: nsekhar, kishon
Use regulator_is_enabled of pbias regulator to find pbias regulator
status instead of maintaining a custom bookkeeping
pbias_enabled variable.
Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
---
drivers/mmc/host/omap_hsmmc.c | 8 ++------
1 file changed, 2 insertions(+), 6 deletions(-)
diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
index 98e0289..e04060b 100644
--- a/drivers/mmc/host/omap_hsmmc.c
+++ b/drivers/mmc/host/omap_hsmmc.c
@@ -182,7 +182,6 @@ struct omap_hsmmc_host {
struct clk *fclk;
struct clk *dbclk;
struct regulator *pbias;
- bool pbias_enabled;
void __iomem *base;
int vqmmc_enabled;
resource_size_t mapbase;
@@ -331,22 +330,20 @@ static int omap_hsmmc_set_pbias(struct omap_hsmmc_host *host, bool power_on,
return ret;
}
- if (host->pbias_enabled == 0) {
+ if (!regulator_is_enabled(host->pbias)) {
ret = regulator_enable(host->pbias);
if (ret) {
dev_err(host->dev, "pbias reg enable fail\n");
return ret;
}
- host->pbias_enabled = 1;
}
} else {
- if (host->pbias_enabled == 1) {
+ if (regulator_is_enabled(host->pbias)) {
ret = regulator_disable(host->pbias);
if (ret) {
dev_err(host->dev, "pbias reg disable fail\n");
return ret;
}
- host->pbias_enabled = 0;
}
}
@@ -2081,7 +2078,6 @@ static int omap_hsmmc_probe(struct platform_device *pdev)
host->base = base + pdata->reg_offset;
host->power_mode = MMC_POWER_OFF;
host->next_data.cookie = 1;
- host->pbias_enabled = 0;
host->vqmmc_enabled = 0;
ret = omap_hsmmc_gpio_init(mmc, host, pdata);
--
1.7.9.5
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH v2 14/16] mmc: host: omap_hsmmc: use ios->vdd for setting vmmc voltage
2015-08-03 12:26 [PATCH v2 00/16] omap_hsmmc: regulator usage cleanup and fixes Kishon Vijay Abraham I
` (12 preceding siblings ...)
2015-08-03 12:26 ` [PATCH v2 13/16] mmc: host: omap_hsmmc: use regulator_is_enabled to find pbias status Kishon Vijay Abraham I
@ 2015-08-03 12:26 ` Kishon Vijay Abraham I
2015-08-03 12:26 ` [PATCH v2 15/16] mmc: host: omap_hsmmc: remove CONFIG_REGULATOR check Kishon Vijay Abraham I
` (3 subsequent siblings)
17 siblings, 0 replies; 25+ messages in thread
From: Kishon Vijay Abraham I @ 2015-08-03 12:26 UTC (permalink / raw)
To: ulf.hansson, afenkart, tony, devicetree, linux-kernel, linux-mmc,
linux-omap
Cc: nsekhar, kishon
vdd voltage is set in mmc core to ios->vdd and vmmc should actually
be set to this voltage. Modify omap_hsmmc_enable_supply
to not take vdd as argument since now it's directly set to
the voltage in ios->vdd.
Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
---
drivers/mmc/host/omap_hsmmc.c | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
index e04060b..9a28719 100644
--- a/drivers/mmc/host/omap_hsmmc.c
+++ b/drivers/mmc/host/omap_hsmmc.c
@@ -247,13 +247,14 @@ static int omap_hsmmc_get_cover_state(struct device *dev)
#ifdef CONFIG_REGULATOR
-static int omap_hsmmc_enable_supply(struct mmc_host *mmc, int vdd)
+static int omap_hsmmc_enable_supply(struct mmc_host *mmc)
{
int ret;
struct omap_hsmmc_host *host = mmc_priv(mmc);
+ struct mmc_ios *ios = &mmc->ios;
if (mmc->supply.vmmc) {
- ret = mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, vdd);
+ ret = mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, ios->vdd);
if (ret)
return ret;
}
@@ -385,7 +386,7 @@ static int omap_hsmmc_set_power(struct device *dev, int power_on, int vdd)
* chips/cards need an interface voltage rail too.
*/
if (power_on) {
- ret = omap_hsmmc_enable_supply(mmc, vdd);
+ ret = omap_hsmmc_enable_supply(mmc);
if (ret)
return ret;
--
1.7.9.5
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH v2 15/16] mmc: host: omap_hsmmc: remove CONFIG_REGULATOR check
2015-08-03 12:26 [PATCH v2 00/16] omap_hsmmc: regulator usage cleanup and fixes Kishon Vijay Abraham I
` (13 preceding siblings ...)
2015-08-03 12:26 ` [PATCH v2 14/16] mmc: host: omap_hsmmc: use ios->vdd for setting vmmc voltage Kishon Vijay Abraham I
@ 2015-08-03 12:26 ` Kishon Vijay Abraham I
2015-08-03 12:26 ` [PATCH v2 16/16] mmc: host: omap_hsmmc: use "mmc_of_parse_voltage" to get ocr_avail Kishon Vijay Abraham I
` (2 subsequent siblings)
17 siblings, 0 replies; 25+ messages in thread
From: Kishon Vijay Abraham I @ 2015-08-03 12:26 UTC (permalink / raw)
To: ulf.hansson, afenkart, tony, devicetree, linux-kernel, linux-mmc,
linux-omap
Cc: nsekhar, kishon
Now that support for platforms which have optional regulator is added,
remove CONFIG_REGULATOR check in omap_hsmmc.
Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
---
drivers/mmc/host/omap_hsmmc.c | 35 +++--------------------------------
1 file changed, 3 insertions(+), 32 deletions(-)
diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
index 9a28719..15973f1 100644
--- a/drivers/mmc/host/omap_hsmmc.c
+++ b/drivers/mmc/host/omap_hsmmc.c
@@ -204,7 +204,6 @@ struct omap_hsmmc_host {
int context_loss;
int protect_card;
int reqs_blocked;
- int use_reg;
int req_in_progress;
unsigned long clk_rate;
unsigned int flags;
@@ -245,8 +244,6 @@ static int omap_hsmmc_get_cover_state(struct device *dev)
return mmc_gpio_get_cd(host->mmc);
}
-#ifdef CONFIG_REGULATOR
-
static int omap_hsmmc_enable_supply(struct mmc_host *mmc)
{
int ret;
@@ -521,29 +518,6 @@ static void omap_hsmmc_reg_put(struct omap_hsmmc_host *host)
mmc_pdata(host)->set_power = NULL;
}
-static inline int omap_hsmmc_have_reg(void)
-{
- return 1;
-}
-
-#else
-
-static inline int omap_hsmmc_reg_get(struct omap_hsmmc_host *host)
-{
- return -EINVAL;
-}
-
-static inline void omap_hsmmc_reg_put(struct omap_hsmmc_host *host)
-{
-}
-
-static inline int omap_hsmmc_have_reg(void)
-{
- return 0;
-}
-
-#endif
-
static irqreturn_t omap_hsmmc_cover_irq(int irq, void *dev_id);
static int omap_hsmmc_gpio_init(struct mmc_host *mmc,
@@ -2204,11 +2178,10 @@ static int omap_hsmmc_probe(struct platform_device *pdev)
goto err_irq;
}
- if (omap_hsmmc_have_reg() && !mmc_pdata(host)->set_power) {
+ if (!mmc_pdata(host)->set_power) {
ret = omap_hsmmc_reg_get(host);
if (ret)
goto err_irq;
- host->use_reg = 1;
}
mmc->ocr_avail = mmc_pdata(host)->ocr_mask;
@@ -2251,8 +2224,7 @@ static int omap_hsmmc_probe(struct platform_device *pdev)
err_slot_name:
mmc_remove_host(mmc);
- if (host->use_reg)
- omap_hsmmc_reg_put(host);
+ omap_hsmmc_reg_put(host);
err_irq:
device_init_wakeup(&pdev->dev, false);
if (host->tx_chan)
@@ -2276,8 +2248,7 @@ static int omap_hsmmc_remove(struct platform_device *pdev)
pm_runtime_get_sync(host->dev);
mmc_remove_host(host->mmc);
- if (host->use_reg)
- omap_hsmmc_reg_put(host);
+ omap_hsmmc_reg_put(host);
if (host->tx_chan)
dma_release_channel(host->tx_chan);
--
1.7.9.5
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH v2 16/16] mmc: host: omap_hsmmc: use "mmc_of_parse_voltage" to get ocr_avail
2015-08-03 12:26 [PATCH v2 00/16] omap_hsmmc: regulator usage cleanup and fixes Kishon Vijay Abraham I
` (14 preceding siblings ...)
2015-08-03 12:26 ` [PATCH v2 15/16] mmc: host: omap_hsmmc: remove CONFIG_REGULATOR check Kishon Vijay Abraham I
@ 2015-08-03 12:26 ` Kishon Vijay Abraham I
2015-08-25 14:50 ` Ulf Hansson
2015-08-20 12:36 ` [PATCH v2 00/16] omap_hsmmc: regulator usage cleanup and fixes Kishon Vijay Abraham I
2015-08-25 11:50 ` Ulf Hansson
17 siblings, 1 reply; 25+ messages in thread
From: Kishon Vijay Abraham I @ 2015-08-03 12:26 UTC (permalink / raw)
To: ulf.hansson, afenkart, tony, devicetree, linux-kernel, linux-mmc,
linux-omap
Cc: nsekhar, kishon, Roger Quadros, Lokesh Vutla, Murali Karicheri,
Franklin S Cooper Jr
From: Roger Quadros <rogerq@ti.com>
For platforms that doesn't have explicit regulator control in MMC,
populate voltage-ranges in MMC device tree node and use
mmc_of_parse_voltage to get ocr_avail
Signed-off-by: Roger Quadros <rogerq@ti.com>
Signed-off-by: Lokesh Vutla <lokeshvutla@ti.com>
Signed-off-by: Murali Karicheri <m-karicheri2@ti.com>
Signed-off-by: Franklin S Cooper Jr <fcooper@ti.com>
Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
---
.../devicetree/bindings/mmc/ti-omap-hsmmc.txt | 2 ++
drivers/mmc/host/omap_hsmmc.c | 9 ++++++++-
2 files changed, 10 insertions(+), 1 deletion(-)
diff --git a/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt b/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt
index 76bf087..2408e87 100644
--- a/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt
+++ b/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt
@@ -22,6 +22,8 @@ ti,dual-volt: boolean, supports dual voltage cards
ti,non-removable: non-removable slot (like eMMC)
ti,needs-special-reset: Requires a special softreset sequence
ti,needs-special-hs-handling: HSMMC IP needs special setting for handling High Speed
+voltage-ranges: Specify the voltage range supported if regulator framework
+isn't enabled.
dmas: List of DMA specifiers with the controller specific format
as described in the generic DMA client binding. A tx and rx
specifier is required.
diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
index 15973f1..d884d8f 100644
--- a/drivers/mmc/host/omap_hsmmc.c
+++ b/drivers/mmc/host/omap_hsmmc.c
@@ -2184,7 +2184,13 @@ static int omap_hsmmc_probe(struct platform_device *pdev)
goto err_irq;
}
- mmc->ocr_avail = mmc_pdata(host)->ocr_mask;
+ if (!mmc_pdata(host)->ocr_mask) {
+ ret = mmc_of_parse_voltage(pdev->dev.of_node, &mmc->ocr_avail);
+ if (ret)
+ goto err_parse_voltage;
+ } else {
+ mmc->ocr_avail = mmc_pdata(host)->ocr_mask;
+ }
omap_hsmmc_disable_irq(host);
@@ -2224,6 +2230,7 @@ static int omap_hsmmc_probe(struct platform_device *pdev)
err_slot_name:
mmc_remove_host(mmc);
+err_parse_voltage:
omap_hsmmc_reg_put(host);
err_irq:
device_init_wakeup(&pdev->dev, false);
--
1.7.9.5
^ permalink raw reply related [flat|nested] 25+ messages in thread
* Re: [PATCH v2 00/16] omap_hsmmc: regulator usage cleanup and fixes
2015-08-03 12:26 [PATCH v2 00/16] omap_hsmmc: regulator usage cleanup and fixes Kishon Vijay Abraham I
` (15 preceding siblings ...)
2015-08-03 12:26 ` [PATCH v2 16/16] mmc: host: omap_hsmmc: use "mmc_of_parse_voltage" to get ocr_avail Kishon Vijay Abraham I
@ 2015-08-20 12:36 ` Kishon Vijay Abraham I
2015-08-21 7:41 ` Tony Lindgren
2015-08-25 11:50 ` Ulf Hansson
17 siblings, 1 reply; 25+ messages in thread
From: Kishon Vijay Abraham I @ 2015-08-20 12:36 UTC (permalink / raw)
To: ulf.hansson, afenkart, tony, devicetree, linux-kernel, linux-mmc,
linux-omap
Cc: nsekhar
Hi,
On Monday 03 August 2015 05:56 PM, Kishon Vijay Abraham I wrote:
> Changes from v1:
> *) return on -EPROBE_DEFER and other fatal errors. (Don't return only
> if the return value is -ENODEV)
> *) Remove the beagle x15 dts patch. It can be part of a different
> series.
> *) Avoid using regulator_is_enabled for vqmmc since if the regulator
> is shared and the other users are not using regulator_is_enabled
> then there can be unbalanced regulator_enable/regulator_disable
>
> This patch series does the following
> *) Uses devm_regulator_get_optional() for vmmc and then removes the
> CONFIG_REGULATOR check altogether.
> *) return on -EPROBE_DEFER and any other fatal errors
> *) enable/disable vmmc_aux regulator based on prior state
>
> I've pushed this patch series to
> git://git.ti.com/linux-phy/linux-phy.git mmc_regulator_cleanup_fixes_v2
>
> Please note the branch also has the pbias fixes [1] & [2].
> [1] -> https://lkml.org/lkml/2015/7/27/358
> [2] -> https://lkml.org/lkml/2015/7/27/391
>
> This series is in preparation for implementing the voltage switch
> sequence so that UHS cards can be supported.
>
> Did basic read/write test in J6, J6 Eco, Beagle-x15, AM437x EVM,
> Beaglebone black, OMAP5 uEVM and OMAP4 PANDA.
I have now done read/write test in omap3 beagle-xm with this series!
Thanks
Kishon
>
> Kishon Vijay Abraham I (15):
> mmc: host: omap_hsmmc: use devm_regulator_get_optional() for vmmc
> mmc: host: omap_hsmmc: return on fatal errors from omap_hsmmc_reg_get
> mmc: host: omap_hsmmc: cleanup omap_hsmmc_reg_get()
> mmc: host: omap_hsmmc: use the ocrmask provided by the vmmc regulator
> mmc: host: omap_hsmmc: use mmc_host's vmmc and vqmmc
> mmc: host: omap_hsmmc: remove unnecessary pbias set_voltage
> mmc: host: omap_hsmmc: return error if any of the regulator APIs fail
> mmc: host: omap_hsmmc: add separate functions for enable/disable
> supply
> mmc: host: omap_hsmmc: add separate function to set pbias
> mmc: host: omap_hsmmc: avoid pbias regulator enable on power off
> mmc: host: omap_hsmmc: don't use ->set_power to set initial regulator
> state
> mmc: host: omap_hsmmc: enable/disable vmmc_aux regulator based on
> previous state
> mmc: host: omap_hsmmc: use regulator_is_enabled to find pbias status
> mmc: host: omap_hsmmc: use ios->vdd for setting vmmc voltage
> mmc: host: omap_hsmmc: remove CONFIG_REGULATOR check
>
> Roger Quadros (1):
> mmc: host: omap_hsmmc: use "mmc_of_parse_voltage" to get ocr_avail
>
> .../devicetree/bindings/mmc/ti-omap-hsmmc.txt | 2 +
> drivers/mmc/host/omap_hsmmc.c | 340 +++++++++++++-------
> 2 files changed, 224 insertions(+), 118 deletions(-)
>
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [PATCH v2 00/16] omap_hsmmc: regulator usage cleanup and fixes
2015-08-20 12:36 ` [PATCH v2 00/16] omap_hsmmc: regulator usage cleanup and fixes Kishon Vijay Abraham I
@ 2015-08-21 7:41 ` Tony Lindgren
2015-08-21 13:27 ` Kishon Vijay Abraham I
0 siblings, 1 reply; 25+ messages in thread
From: Tony Lindgren @ 2015-08-21 7:41 UTC (permalink / raw)
To: Kishon Vijay Abraham I
Cc: ulf.hansson, afenkart, devicetree, linux-kernel, linux-mmc,
linux-omap, nsekhar
* Kishon Vijay Abraham I <kishon@ti.com> [150820 05:39]:
> Hi,
>
> On Monday 03 August 2015 05:56 PM, Kishon Vijay Abraham I wrote:
> > Changes from v1:
> > *) return on -EPROBE_DEFER and other fatal errors. (Don't return only
> > if the return value is -ENODEV)
> > *) Remove the beagle x15 dts patch. It can be part of a different
> > series.
> > *) Avoid using regulator_is_enabled for vqmmc since if the regulator
> > is shared and the other users are not using regulator_is_enabled
> > then there can be unbalanced regulator_enable/regulator_disable
> >
> > This patch series does the following
> > *) Uses devm_regulator_get_optional() for vmmc and then removes the
> > CONFIG_REGULATOR check altogether.
> > *) return on -EPROBE_DEFER and any other fatal errors
> > *) enable/disable vmmc_aux regulator based on prior state
> >
> > I've pushed this patch series to
> > git://git.ti.com/linux-phy/linux-phy.git mmc_regulator_cleanup_fixes_v2
> >
> > Please note the branch also has the pbias fixes [1] & [2].
> > [1] -> https://lkml.org/lkml/2015/7/27/358
> > [2] -> https://lkml.org/lkml/2015/7/27/391
> >
> > This series is in preparation for implementing the voltage switch
> > sequence so that UHS cards can be supported.
> >
> > Did basic read/write test in J6, J6 Eco, Beagle-x15, AM437x EVM,
> > Beaglebone black, OMAP5 uEVM and OMAP4 PANDA.
>
> I have now done read/write test in omap3 beagle-xm with this series!
Great thanks for doing that. Also gave this series a try here
with my off idle MMC SDIO WLAN card test and things still work
for me. That's not really testing the PBIAS regulator though,
but a good torture test for saving and restoring context. So
FWIW:
Tested-by: Tony Lindgren <tony@atomide.com>
If you need a PM torture test for PBIAS regulator, you could try
to do the following on your beagle xm MMC card with
oamp2plus_defconfig:
1. Make sure EHCI modules are not loaded and OTG USB cable is
not connected
2. Enable UART timeouts and off idle with something like:
!/bin/bash
uarts=$(find /sys/class/tty/tty[SO]*/device/power/ -type d)
for uart in $uarts; do
echo 3000 > $uart/autosuspend_delay_ms 2>&1
done
modprobe leds-gpio
modprobe ledtrig-default-on
uarts=$(find /sys/class/tty/tty[SO]*/power/ -type d 2>/dev/null)
for uart in $uarts; do
echo enabled > $uart/wakeup 2>&1
echo auto > $uart/control 2>&1
done
echo 1 > /sys/kernel/debug/pm_debug/enable_off_mode
3. Make sure you start seeing core_pwrdm OFF count increasing
with cat /sys/kernel/debug/pm_debug/count
MMC should keep on working when hitting idle, if not, something
is not saved or restored properly. And SDIO WLAN cards should
wake up the system and respond to ping if the wakeirq is
configured in the dts file for the MMC controller. At least
mwifiex_sdio cards work for this :)
Regards,
Tony
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [PATCH v2 00/16] omap_hsmmc: regulator usage cleanup and fixes
2015-08-21 7:41 ` Tony Lindgren
@ 2015-08-21 13:27 ` Kishon Vijay Abraham I
0 siblings, 0 replies; 25+ messages in thread
From: Kishon Vijay Abraham I @ 2015-08-21 13:27 UTC (permalink / raw)
To: Tony Lindgren
Cc: ulf.hansson, afenkart, devicetree, linux-kernel, linux-mmc,
linux-omap, nsekhar
Hi Tony,
On Friday 21 August 2015 01:11 PM, Tony Lindgren wrote:
> * Kishon Vijay Abraham I <kishon@ti.com> [150820 05:39]:
>> Hi,
>>
>> On Monday 03 August 2015 05:56 PM, Kishon Vijay Abraham I wrote:
>>> Changes from v1:
>>> *) return on -EPROBE_DEFER and other fatal errors. (Don't return only
>>> if the return value is -ENODEV)
>>> *) Remove the beagle x15 dts patch. It can be part of a different
>>> series.
>>> *) Avoid using regulator_is_enabled for vqmmc since if the regulator
>>> is shared and the other users are not using regulator_is_enabled
>>> then there can be unbalanced regulator_enable/regulator_disable
>>>
>>> This patch series does the following
>>> *) Uses devm_regulator_get_optional() for vmmc and then removes the
>>> CONFIG_REGULATOR check altogether.
>>> *) return on -EPROBE_DEFER and any other fatal errors
>>> *) enable/disable vmmc_aux regulator based on prior state
>>>
>>> I've pushed this patch series to
>>> git://git.ti.com/linux-phy/linux-phy.git mmc_regulator_cleanup_fixes_v2
>>>
>>> Please note the branch also has the pbias fixes [1] & [2].
>>> [1] -> https://lkml.org/lkml/2015/7/27/358
>>> [2] -> https://lkml.org/lkml/2015/7/27/391
>>>
>>> This series is in preparation for implementing the voltage switch
>>> sequence so that UHS cards can be supported.
>>>
>>> Did basic read/write test in J6, J6 Eco, Beagle-x15, AM437x EVM,
>>> Beaglebone black, OMAP5 uEVM and OMAP4 PANDA.
>>
>> I have now done read/write test in omap3 beagle-xm with this series!
>
> Great thanks for doing that. Also gave this series a try here
> with my off idle MMC SDIO WLAN card test and things still work
> for me. That's not really testing the PBIAS regulator though,
> but a good torture test for saving and restoring context. So
> FWIW:
>
> Tested-by: Tony Lindgren <tony@atomide.com>
>
> If you need a PM torture test for PBIAS regulator, you could try
> to do the following on your beagle xm MMC card with
> oamp2plus_defconfig:
>
> 1. Make sure EHCI modules are not loaded and OTG USB cable is
> not connected
>
> 2. Enable UART timeouts and off idle with something like:
>
> !/bin/bash
>
> uarts=$(find /sys/class/tty/tty[SO]*/device/power/ -type d)
> for uart in $uarts; do
> echo 3000 > $uart/autosuspend_delay_ms 2>&1
> done
>
> modprobe leds-gpio
> modprobe ledtrig-default-on
>
> uarts=$(find /sys/class/tty/tty[SO]*/power/ -type d 2>/dev/null)
> for uart in $uarts; do
> echo enabled > $uart/wakeup 2>&1
> echo auto > $uart/control 2>&1
> done
>
> echo 1 > /sys/kernel/debug/pm_debug/enable_off_mode
>
> 3. Make sure you start seeing core_pwrdm OFF count increasing
> with cat /sys/kernel/debug/pm_debug/count
>
> MMC should keep on working when hitting idle, if not, something
> is not saved or restored properly. And SDIO WLAN cards should
> wake up the system and respond to ping if the wakeirq is
> configured in the dts file for the MMC controller. At least
> mwifiex_sdio cards work for this :)
Thanks for the detailed explanation. Sure will add those tests.
Cheers
Kishon
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [PATCH v2 00/16] omap_hsmmc: regulator usage cleanup and fixes
2015-08-03 12:26 [PATCH v2 00/16] omap_hsmmc: regulator usage cleanup and fixes Kishon Vijay Abraham I
` (16 preceding siblings ...)
2015-08-20 12:36 ` [PATCH v2 00/16] omap_hsmmc: regulator usage cleanup and fixes Kishon Vijay Abraham I
@ 2015-08-25 11:50 ` Ulf Hansson
17 siblings, 0 replies; 25+ messages in thread
From: Ulf Hansson @ 2015-08-25 11:50 UTC (permalink / raw)
To: Kishon Vijay Abraham I
Cc: Andreas Fenkart, Tony Lindgren, devicetree@vger.kernel.org,
linux-kernel@vger.kernel.org, linux-mmc, linux-omap, Sekhar Nori
On 3 August 2015 at 14:26, Kishon Vijay Abraham I <kishon@ti.com> wrote:
> Changes from v1:
> *) return on -EPROBE_DEFER and other fatal errors. (Don't return only
> if the return value is -ENODEV)
> *) Remove the beagle x15 dts patch. It can be part of a different
> series.
> *) Avoid using regulator_is_enabled for vqmmc since if the regulator
> is shared and the other users are not using regulator_is_enabled
> then there can be unbalanced regulator_enable/regulator_disable
>
> This patch series does the following
> *) Uses devm_regulator_get_optional() for vmmc and then removes the
> CONFIG_REGULATOR check altogether.
> *) return on -EPROBE_DEFER and any other fatal errors
> *) enable/disable vmmc_aux regulator based on prior state
>
> I've pushed this patch series to
> git://git.ti.com/linux-phy/linux-phy.git mmc_regulator_cleanup_fixes_v2
>
> Please note the branch also has the pbias fixes [1] & [2].
> [1] -> https://lkml.org/lkml/2015/7/27/358
> [2] -> https://lkml.org/lkml/2015/7/27/391
>
> This series is in preparation for implementing the voltage switch
> sequence so that UHS cards can be supported.
>
> Did basic read/write test in J6, J6 Eco, Beagle-x15, AM437x EVM,
> Beaglebone black, OMAP5 uEVM and OMAP4 PANDA.
>
> Kishon Vijay Abraham I (15):
> mmc: host: omap_hsmmc: use devm_regulator_get_optional() for vmmc
> mmc: host: omap_hsmmc: return on fatal errors from omap_hsmmc_reg_get
> mmc: host: omap_hsmmc: cleanup omap_hsmmc_reg_get()
> mmc: host: omap_hsmmc: use the ocrmask provided by the vmmc regulator
> mmc: host: omap_hsmmc: use mmc_host's vmmc and vqmmc
> mmc: host: omap_hsmmc: remove unnecessary pbias set_voltage
> mmc: host: omap_hsmmc: return error if any of the regulator APIs fail
> mmc: host: omap_hsmmc: add separate functions for enable/disable
> supply
> mmc: host: omap_hsmmc: add separate function to set pbias
> mmc: host: omap_hsmmc: avoid pbias regulator enable on power off
> mmc: host: omap_hsmmc: don't use ->set_power to set initial regulator
> state
> mmc: host: omap_hsmmc: enable/disable vmmc_aux regulator based on
> previous state
> mmc: host: omap_hsmmc: use regulator_is_enabled to find pbias status
> mmc: host: omap_hsmmc: use ios->vdd for setting vmmc voltage
> mmc: host: omap_hsmmc: remove CONFIG_REGULATOR check
>
> Roger Quadros (1):
> mmc: host: omap_hsmmc: use "mmc_of_parse_voltage" to get ocr_avail
>
> .../devicetree/bindings/mmc/ti-omap-hsmmc.txt | 2 +
> drivers/mmc/host/omap_hsmmc.c | 340 +++++++++++++-------
> 2 files changed, 224 insertions(+), 118 deletions(-)
>
> --
> 1.7.9.5
>
I tried to apply this on top of my next branch, but it didn't work.
Could you please rebase and send a v3!?
While you do that, please add Tony's tested-by tag as well.
Kind regards
Uffe
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [PATCH v2 16/16] mmc: host: omap_hsmmc: use "mmc_of_parse_voltage" to get ocr_avail
2015-08-03 12:26 ` [PATCH v2 16/16] mmc: host: omap_hsmmc: use "mmc_of_parse_voltage" to get ocr_avail Kishon Vijay Abraham I
@ 2015-08-25 14:50 ` Ulf Hansson
2015-08-26 12:21 ` Kishon Vijay Abraham I
2015-11-11 10:26 ` Roger Quadros
0 siblings, 2 replies; 25+ messages in thread
From: Ulf Hansson @ 2015-08-25 14:50 UTC (permalink / raw)
To: Kishon Vijay Abraham I
Cc: Andreas Fenkart, Tony Lindgren, devicetree@vger.kernel.org,
linux-kernel@vger.kernel.org, linux-mmc, linux-omap, Sekhar Nori,
Roger Quadros, Lokesh Vutla, Murali Karicheri,
Franklin S Cooper Jr
On 3 August 2015 at 14:26, Kishon Vijay Abraham I <kishon@ti.com> wrote:
> From: Roger Quadros <rogerq@ti.com>
>
> For platforms that doesn't have explicit regulator control in MMC,
> populate voltage-ranges in MMC device tree node and use
> mmc_of_parse_voltage to get ocr_avail
I don't like this.
If we are able to fetch the OCR mask via an external regulator, that
shall be done.
I think the mmc_of_parse_voltage() API and the corresponding DT
binding it parses, should be used for those HW when we don't have an
external regulator to use. For example if the MMC controller itself
somehow controls the voltage levels. Is that really the case for you?
Kind regards
Uffe
>
> Signed-off-by: Roger Quadros <rogerq@ti.com>
> Signed-off-by: Lokesh Vutla <lokeshvutla@ti.com>
> Signed-off-by: Murali Karicheri <m-karicheri2@ti.com>
> Signed-off-by: Franklin S Cooper Jr <fcooper@ti.com>
> Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
> ---
> .../devicetree/bindings/mmc/ti-omap-hsmmc.txt | 2 ++
> drivers/mmc/host/omap_hsmmc.c | 9 ++++++++-
> 2 files changed, 10 insertions(+), 1 deletion(-)
>
> diff --git a/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt b/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt
> index 76bf087..2408e87 100644
> --- a/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt
> +++ b/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt
> @@ -22,6 +22,8 @@ ti,dual-volt: boolean, supports dual voltage cards
> ti,non-removable: non-removable slot (like eMMC)
> ti,needs-special-reset: Requires a special softreset sequence
> ti,needs-special-hs-handling: HSMMC IP needs special setting for handling High Speed
> +voltage-ranges: Specify the voltage range supported if regulator framework
> +isn't enabled.
> dmas: List of DMA specifiers with the controller specific format
> as described in the generic DMA client binding. A tx and rx
> specifier is required.
> diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
> index 15973f1..d884d8f 100644
> --- a/drivers/mmc/host/omap_hsmmc.c
> +++ b/drivers/mmc/host/omap_hsmmc.c
> @@ -2184,7 +2184,13 @@ static int omap_hsmmc_probe(struct platform_device *pdev)
> goto err_irq;
> }
>
> - mmc->ocr_avail = mmc_pdata(host)->ocr_mask;
> + if (!mmc_pdata(host)->ocr_mask) {
> + ret = mmc_of_parse_voltage(pdev->dev.of_node, &mmc->ocr_avail);
> + if (ret)
> + goto err_parse_voltage;
> + } else {
> + mmc->ocr_avail = mmc_pdata(host)->ocr_mask;
> + }
>
> omap_hsmmc_disable_irq(host);
>
> @@ -2224,6 +2230,7 @@ static int omap_hsmmc_probe(struct platform_device *pdev)
>
> err_slot_name:
> mmc_remove_host(mmc);
> +err_parse_voltage:
> omap_hsmmc_reg_put(host);
> err_irq:
> device_init_wakeup(&pdev->dev, false);
> --
> 1.7.9.5
>
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [PATCH v2 16/16] mmc: host: omap_hsmmc: use "mmc_of_parse_voltage" to get ocr_avail
2015-08-25 14:50 ` Ulf Hansson
@ 2015-08-26 12:21 ` Kishon Vijay Abraham I
2015-11-11 10:26 ` Roger Quadros
1 sibling, 0 replies; 25+ messages in thread
From: Kishon Vijay Abraham I @ 2015-08-26 12:21 UTC (permalink / raw)
To: Ulf Hansson
Cc: Andreas Fenkart, Tony Lindgren, devicetree@vger.kernel.org,
linux-kernel@vger.kernel.org, linux-mmc, linux-omap, Sekhar Nori,
Roger Quadros, Lokesh Vutla, Murali Karicheri,
Franklin S Cooper Jr
Hi Ulf,
On Tuesday 25 August 2015 08:20 PM, Ulf Hansson wrote:
> On 3 August 2015 at 14:26, Kishon Vijay Abraham I <kishon@ti.com> wrote:
>> From: Roger Quadros <rogerq@ti.com>
>>
>> For platforms that doesn't have explicit regulator control in MMC,
>> populate voltage-ranges in MMC device tree node and use
>> mmc_of_parse_voltage to get ocr_avail
>
> I don't like this.
>
> If we are able to fetch the OCR mask via an external regulator, that
> shall be done.
>
> I think the mmc_of_parse_voltage() API and the corresponding DT
> binding it parses, should be used for those HW when we don't have an
> external regulator to use. For example if the MMC controller itself
> somehow controls the voltage levels. Is that really the case for you?
This was actually added to support Galileo platform which doesn't have
regulators modelled. Indeed it would be better to model external
regulators (even if it is always on) and get OCR from the regulator.
I'll drop this patch and re-send the series re-based to your next branch.
Thanks
Kishon
>
> Kind regards
> Uffe
>
>>
>> Signed-off-by: Roger Quadros <rogerq@ti.com>
>> Signed-off-by: Lokesh Vutla <lokeshvutla@ti.com>
>> Signed-off-by: Murali Karicheri <m-karicheri2@ti.com>
>> Signed-off-by: Franklin S Cooper Jr <fcooper@ti.com>
>> Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
>> ---
>> .../devicetree/bindings/mmc/ti-omap-hsmmc.txt | 2 ++
>> drivers/mmc/host/omap_hsmmc.c | 9 ++++++++-
>> 2 files changed, 10 insertions(+), 1 deletion(-)
>>
>> diff --git a/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt b/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt
>> index 76bf087..2408e87 100644
>> --- a/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt
>> +++ b/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt
>> @@ -22,6 +22,8 @@ ti,dual-volt: boolean, supports dual voltage cards
>> ti,non-removable: non-removable slot (like eMMC)
>> ti,needs-special-reset: Requires a special softreset sequence
>> ti,needs-special-hs-handling: HSMMC IP needs special setting for handling High Speed
>> +voltage-ranges: Specify the voltage range supported if regulator framework
>> +isn't enabled.
>> dmas: List of DMA specifiers with the controller specific format
>> as described in the generic DMA client binding. A tx and rx
>> specifier is required.
>> diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
>> index 15973f1..d884d8f 100644
>> --- a/drivers/mmc/host/omap_hsmmc.c
>> +++ b/drivers/mmc/host/omap_hsmmc.c
>> @@ -2184,7 +2184,13 @@ static int omap_hsmmc_probe(struct platform_device *pdev)
>> goto err_irq;
>> }
>>
>> - mmc->ocr_avail = mmc_pdata(host)->ocr_mask;
>> + if (!mmc_pdata(host)->ocr_mask) {
>> + ret = mmc_of_parse_voltage(pdev->dev.of_node, &mmc->ocr_avail);
>> + if (ret)
>> + goto err_parse_voltage;
>> + } else {
>> + mmc->ocr_avail = mmc_pdata(host)->ocr_mask;
>> + }
>>
>> omap_hsmmc_disable_irq(host);
>>
>> @@ -2224,6 +2230,7 @@ static int omap_hsmmc_probe(struct platform_device *pdev)
>>
>> err_slot_name:
>> mmc_remove_host(mmc);
>> +err_parse_voltage:
>> omap_hsmmc_reg_put(host);
>> err_irq:
>> device_init_wakeup(&pdev->dev, false);
>> --
>> 1.7.9.5
>>
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [PATCH v2 16/16] mmc: host: omap_hsmmc: use "mmc_of_parse_voltage" to get ocr_avail
2015-08-25 14:50 ` Ulf Hansson
2015-08-26 12:21 ` Kishon Vijay Abraham I
@ 2015-11-11 10:26 ` Roger Quadros
2015-11-11 11:40 ` Ulf Hansson
1 sibling, 1 reply; 25+ messages in thread
From: Roger Quadros @ 2015-11-11 10:26 UTC (permalink / raw)
To: Ulf Hansson, Kishon Vijay Abraham I
Cc: Andreas Fenkart, Tony Lindgren, devicetree@vger.kernel.org,
linux-kernel@vger.kernel.org, linux-mmc, linux-omap, Sekhar Nori,
Lokesh Vutla, Murali Karicheri, Franklin S Cooper Jr
Hi,
On 25/08/15 17:50, Ulf Hansson wrote:
> On 3 August 2015 at 14:26, Kishon Vijay Abraham I <kishon@ti.com> wrote:
>> From: Roger Quadros <rogerq@ti.com>
>>
>> For platforms that doesn't have explicit regulator control in MMC,
>> populate voltage-ranges in MMC device tree node and use
>> mmc_of_parse_voltage to get ocr_avail
>
> I don't like this.
>
> If we are able to fetch the OCR mask via an external regulator, that
> shall be done.
Agreed.
>
> I think the mmc_of_parse_voltage() API and the corresponding DT
> binding it parses, should be used for those HW when we don't have an
> external regulator to use. For example if the MMC controller itself
> somehow controls the voltage levels. Is that really the case for you?
What shall be done if there is no software control of the external regulator
and it is fixed at a certain voltage?
cheers,
-roger
>
> Kind regards
> Uffe
>
>>
>> Signed-off-by: Roger Quadros <rogerq@ti.com>
>> Signed-off-by: Lokesh Vutla <lokeshvutla@ti.com>
>> Signed-off-by: Murali Karicheri <m-karicheri2@ti.com>
>> Signed-off-by: Franklin S Cooper Jr <fcooper@ti.com>
>> Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
>> ---
>> .../devicetree/bindings/mmc/ti-omap-hsmmc.txt | 2 ++
>> drivers/mmc/host/omap_hsmmc.c | 9 ++++++++-
>> 2 files changed, 10 insertions(+), 1 deletion(-)
>>
>> diff --git a/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt b/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt
>> index 76bf087..2408e87 100644
>> --- a/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt
>> +++ b/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt
>> @@ -22,6 +22,8 @@ ti,dual-volt: boolean, supports dual voltage cards
>> ti,non-removable: non-removable slot (like eMMC)
>> ti,needs-special-reset: Requires a special softreset sequence
>> ti,needs-special-hs-handling: HSMMC IP needs special setting for handling High Speed
>> +voltage-ranges: Specify the voltage range supported if regulator framework
>> +isn't enabled.
>> dmas: List of DMA specifiers with the controller specific format
>> as described in the generic DMA client binding. A tx and rx
>> specifier is required.
>> diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
>> index 15973f1..d884d8f 100644
>> --- a/drivers/mmc/host/omap_hsmmc.c
>> +++ b/drivers/mmc/host/omap_hsmmc.c
>> @@ -2184,7 +2184,13 @@ static int omap_hsmmc_probe(struct platform_device *pdev)
>> goto err_irq;
>> }
>>
>> - mmc->ocr_avail = mmc_pdata(host)->ocr_mask;
>> + if (!mmc_pdata(host)->ocr_mask) {
>> + ret = mmc_of_parse_voltage(pdev->dev.of_node, &mmc->ocr_avail);
>> + if (ret)
>> + goto err_parse_voltage;
>> + } else {
>> + mmc->ocr_avail = mmc_pdata(host)->ocr_mask;
>> + }
>>
>> omap_hsmmc_disable_irq(host);
>>
>> @@ -2224,6 +2230,7 @@ static int omap_hsmmc_probe(struct platform_device *pdev)
>>
>> err_slot_name:
>> mmc_remove_host(mmc);
>> +err_parse_voltage:
>> omap_hsmmc_reg_put(host);
>> err_irq:
>> device_init_wakeup(&pdev->dev, false);
>> --
>> 1.7.9.5
>>
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [PATCH v2 16/16] mmc: host: omap_hsmmc: use "mmc_of_parse_voltage" to get ocr_avail
2015-11-11 10:26 ` Roger Quadros
@ 2015-11-11 11:40 ` Ulf Hansson
0 siblings, 0 replies; 25+ messages in thread
From: Ulf Hansson @ 2015-11-11 11:40 UTC (permalink / raw)
To: Roger Quadros
Cc: Kishon Vijay Abraham I, Andreas Fenkart, Tony Lindgren,
devicetree@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-mmc, linux-omap, Sekhar Nori, Lokesh Vutla,
Murali Karicheri, Franklin S Cooper Jr
On 11 November 2015 at 11:26, Roger Quadros <rogerq@ti.com> wrote:
> Hi,
>
> On 25/08/15 17:50, Ulf Hansson wrote:
>> On 3 August 2015 at 14:26, Kishon Vijay Abraham I <kishon@ti.com> wrote:
>>> From: Roger Quadros <rogerq@ti.com>
>>>
>>> For platforms that doesn't have explicit regulator control in MMC,
>>> populate voltage-ranges in MMC device tree node and use
>>> mmc_of_parse_voltage to get ocr_avail
>>
>> I don't like this.
>>
>> If we are able to fetch the OCR mask via an external regulator, that
>> shall be done.
>
> Agreed.
>>
>> I think the mmc_of_parse_voltage() API and the corresponding DT
>> binding it parses, should be used for those HW when we don't have an
>> external regulator to use. For example if the MMC controller itself
>> somehow controls the voltage levels. Is that really the case for you?
>
> What shall be done if there is no software control of the external regulator
> and it is fixed at a certain voltage?
I think you can model that as a so called fixed regulator.
Kind regards
Uffe
^ permalink raw reply [flat|nested] 25+ messages in thread
end of thread, other threads:[~2015-11-11 11:40 UTC | newest]
Thread overview: 25+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-08-03 12:26 [PATCH v2 00/16] omap_hsmmc: regulator usage cleanup and fixes Kishon Vijay Abraham I
2015-08-03 12:26 ` [PATCH v2 01/16] mmc: host: omap_hsmmc: use devm_regulator_get_optional() for vmmc Kishon Vijay Abraham I
2015-08-03 12:26 ` [PATCH v2 02/16] mmc: host: omap_hsmmc: return on fatal errors from omap_hsmmc_reg_get Kishon Vijay Abraham I
2015-08-03 12:26 ` [PATCH v2 03/16] mmc: host: omap_hsmmc: cleanup omap_hsmmc_reg_get() Kishon Vijay Abraham I
2015-08-03 12:26 ` [PATCH v2 04/16] mmc: host: omap_hsmmc: use the ocrmask provided by the vmmc regulator Kishon Vijay Abraham I
2015-08-03 12:26 ` [PATCH v2 05/16] mmc: host: omap_hsmmc: use mmc_host's vmmc and vqmmc Kishon Vijay Abraham I
2015-08-03 12:26 ` [PATCH v2 06/16] mmc: host: omap_hsmmc: remove unnecessary pbias set_voltage Kishon Vijay Abraham I
2015-08-03 12:26 ` [PATCH v2 07/16] mmc: host: omap_hsmmc: return error if any of the regulator APIs fail Kishon Vijay Abraham I
2015-08-03 12:26 ` [PATCH v2 08/16] mmc: host: omap_hsmmc: add separate functions for enable/disable supply Kishon Vijay Abraham I
2015-08-03 12:26 ` [PATCH v2 09/16] mmc: host: omap_hsmmc: add separate function to set pbias Kishon Vijay Abraham I
2015-08-03 12:26 ` [PATCH v2 10/16] mmc: host: omap_hsmmc: avoid pbias regulator enable on power off Kishon Vijay Abraham I
2015-08-03 12:26 ` [PATCH v2 11/16] mmc: host: omap_hsmmc: don't use ->set_power to set initial regulator state Kishon Vijay Abraham I
2015-08-03 12:26 ` [PATCH v2 12/16] mmc: host: omap_hsmmc: enable/disable vmmc_aux regulator based on previous state Kishon Vijay Abraham I
2015-08-03 12:26 ` [PATCH v2 13/16] mmc: host: omap_hsmmc: use regulator_is_enabled to find pbias status Kishon Vijay Abraham I
2015-08-03 12:26 ` [PATCH v2 14/16] mmc: host: omap_hsmmc: use ios->vdd for setting vmmc voltage Kishon Vijay Abraham I
2015-08-03 12:26 ` [PATCH v2 15/16] mmc: host: omap_hsmmc: remove CONFIG_REGULATOR check Kishon Vijay Abraham I
2015-08-03 12:26 ` [PATCH v2 16/16] mmc: host: omap_hsmmc: use "mmc_of_parse_voltage" to get ocr_avail Kishon Vijay Abraham I
2015-08-25 14:50 ` Ulf Hansson
2015-08-26 12:21 ` Kishon Vijay Abraham I
2015-11-11 10:26 ` Roger Quadros
2015-11-11 11:40 ` Ulf Hansson
2015-08-20 12:36 ` [PATCH v2 00/16] omap_hsmmc: regulator usage cleanup and fixes Kishon Vijay Abraham I
2015-08-21 7:41 ` Tony Lindgren
2015-08-21 13:27 ` Kishon Vijay Abraham I
2015-08-25 11:50 ` Ulf Hansson
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).