diff mbox

[v2] mmc: core: Allow specifying current consumption

Message ID 1444698032-9051-1-git-send-email-bjorn.andersson@sonymobile.com (mailing list archive)
State New, archived
Headers show

Commit Message

Bjorn Andersson Oct. 13, 2015, 1 a.m. UTC
This allows us to specify expected current consumption of the vmmc and
vqmmc regulators. This is needed to bring the supplying regulators out
of their low-power-mode while accessing the mmc.

Signed-off-by: Bjorn Andersson <bjorn.andersson@sonymobile.com>
---

The sd specification states that if the host can provide more than 150mA this
should be indicated in the "XPC value in the argument of ACMD41" for SDXC
cards. Should this be tied in with the added property as well?

Changes since v1:
- Property name and description updated to clarify intention

 Documentation/devicetree/bindings/mmc/mmc.txt | 2 ++
 drivers/mmc/core/core.c                       | 6 ++++++
 drivers/mmc/core/host.c                       | 4 ++++
 include/linux/mmc/host.h                      | 2 ++
 4 files changed, 14 insertions(+)

Comments

Ulf Hansson Oct. 16, 2015, 12:55 p.m. UTC | #1
On 13 October 2015 at 03:00, Bjorn Andersson
<bjorn.andersson@sonymobile.com> wrote:
> This allows us to specify expected current consumption of the vmmc and
> vqmmc regulators. This is needed to bring the supplying regulators out
> of their low-power-mode while accessing the mmc.

This indeed makes sense, still I need to think a bit more on this.

For example, can we allow these regulators to enter low power again at
some times? If so, when and what should that current value be.

Moreover, wouldn't vmmc|vqmmc-active-current be depending what eMMC/SD
card that is attached?

>
> Signed-off-by: Bjorn Andersson <bjorn.andersson@sonymobile.com>
> ---
>
> The sd specification states that if the host can provide more than 150mA this
> should be indicated in the "XPC value in the argument of ACMD41" for SDXC
> cards. Should this be tied in with the added property as well?
>
> Changes since v1:
> - Property name and description updated to clarify intention
>
>  Documentation/devicetree/bindings/mmc/mmc.txt | 2 ++
>  drivers/mmc/core/core.c                       | 6 ++++++
>  drivers/mmc/core/host.c                       | 4 ++++
>  include/linux/mmc/host.h                      | 2 ++
>  4 files changed, 14 insertions(+)
>
> diff --git a/Documentation/devicetree/bindings/mmc/mmc.txt b/Documentation/devicetree/bindings/mmc/mmc.txt
> index 0384fc3f64e8..7514083a9f55 100644
> --- a/Documentation/devicetree/bindings/mmc/mmc.txt
> +++ b/Documentation/devicetree/bindings/mmc/mmc.txt
> @@ -47,6 +47,8 @@ Optional properties:
>  - mmc-hs400-1_2v: eMMC HS400 mode(1.2V I/O) is supported
>  - dsr: Value the card's (optional) Driver Stage Register (DSR) should be
>    programmed with. Valid range: [0 .. 0xffff].
> +- vmmc-active-current: current required from the vmmc regulator, in uA
> +- vqmmc-active-current: current required from the vqmmc regulator, in uA
>
>  *NOTE* on CD and WP polarity. To use common for all SD/MMC host controllers line
>  polarity properties, we have to fix the meaning of the "normal" and "inverted"
> diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c
> index 23fa221ce803..603f40136306 100644
> --- a/drivers/mmc/core/core.c
> +++ b/drivers/mmc/core/core.c
> @@ -1469,12 +1469,18 @@ int mmc_regulator_get_supply(struct mmc_host *mmc)
>                         mmc->ocr_avail = ret;
>                 else
>                         dev_warn(dev, "Failed getting OCR mask: %d\n", ret);
> +
> +               if (mmc->supply.vmmc_current)
> +                       regulator_set_load(mmc->supply.vmmc, mmc->supply.vmmc_current);
>         }
>
>         if (IS_ERR(mmc->supply.vqmmc)) {
>                 if (PTR_ERR(mmc->supply.vqmmc) == -EPROBE_DEFER)
>                         return -EPROBE_DEFER;
>                 dev_info(dev, "No vqmmc regulator found\n");
> +       } else {
> +               if (mmc->supply.vqmmc_current)
> +                       regulator_set_load(mmc->supply.vqmmc, mmc->supply.vqmmc_current);
>         }
>
>         return 0;
> diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c
> index 970e6906930b..ede508d63fb5 100644
> --- a/drivers/mmc/core/host.c
> +++ b/drivers/mmc/core/host.c
> @@ -235,6 +235,10 @@ int mmc_of_parse(struct mmc_host *host)
>                         host->caps2 |= MMC_CAP2_CD_ACTIVE_HIGH;
>         }
>
> +       /* Parse regulator load requests */
> +       of_property_read_u32(np, "vmmc-active-current", &host->supply.vmmc_current);
> +       of_property_read_u32(np, "vqmmc-active-current", &host->supply.vqmmc_current);
> +
>         /* Parse Write Protection */
>         ro_cap_invert = of_property_read_bool(np, "wp-inverted");
>
> diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h
> index 8673ffe3d86e..640d8dbb8559 100644
> --- a/include/linux/mmc/host.h
> +++ b/include/linux/mmc/host.h
> @@ -197,6 +197,8 @@ struct mmc_pwrseq;
>  struct mmc_supply {
>         struct regulator *vmmc;         /* Card power supply */
>         struct regulator *vqmmc;        /* Optional Vccq supply */
> +       u32 vmmc_current;               /* Requested current for vmmc */
> +       u32 vqmmc_current;              /* Requested current for vqmmc */
>  };
>
>  struct mmc_host {
> --
> 2.4.2
>

Kind regards
Uffe
--
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
Bjorn Andersson Oct. 17, 2015, 5:09 p.m. UTC | #2
On Fri 16 Oct 05:55 PDT 2015, Ulf Hansson wrote:

> On 13 October 2015 at 03:00, Bjorn Andersson
> <bjorn.andersson@sonymobile.com> wrote:
> > This allows us to specify expected current consumption of the vmmc and
> > vqmmc regulators. This is needed to bring the supplying regulators out
> > of their low-power-mode while accessing the mmc.
> 
> This indeed makes sense, still I need to think a bit more on this.
> 

Thanks.

We can currently work around this by using "regulator-system-load" on
the vmmc regulator, but a proper fix would be nice.

> For example, can we allow these regulators to enter low power again at
> some times? If so, when and what should that current value be.
> 

The regulator framework recalculates the total load on a regulator upon
enable/disable, but currently it doesn't depend on the state of the
regulator.

I talked to Mark about this a while back and he was positive to us
correcting this, so disabled regulators wouldn't count towards the total
load of a regulator. (So that still is on my todo)


The second option would be to do what is done in the Qualcomm codeaurora
kernels, where the regulators are never disabled and there's a smaller
current specified for the suspend case.

This would require bigger changes to the mmc core I presume, but the
naming of the dt properties support such future adaption.

> Moreover, wouldn't vmmc|vqmmc-active-current be depending what eMMC/SD
> card that is attached?
> 

I would say so, I do however not know how to acquire or encode that
information. Any suggestions here are welcome.

Regards,
Bjorn
--
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 mbox

Patch

diff --git a/Documentation/devicetree/bindings/mmc/mmc.txt b/Documentation/devicetree/bindings/mmc/mmc.txt
index 0384fc3f64e8..7514083a9f55 100644
--- a/Documentation/devicetree/bindings/mmc/mmc.txt
+++ b/Documentation/devicetree/bindings/mmc/mmc.txt
@@ -47,6 +47,8 @@  Optional properties:
 - mmc-hs400-1_2v: eMMC HS400 mode(1.2V I/O) is supported
 - dsr: Value the card's (optional) Driver Stage Register (DSR) should be
   programmed with. Valid range: [0 .. 0xffff].
+- vmmc-active-current: current required from the vmmc regulator, in uA
+- vqmmc-active-current: current required from the vqmmc regulator, in uA
 
 *NOTE* on CD and WP polarity. To use common for all SD/MMC host controllers line
 polarity properties, we have to fix the meaning of the "normal" and "inverted"
diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c
index 23fa221ce803..603f40136306 100644
--- a/drivers/mmc/core/core.c
+++ b/drivers/mmc/core/core.c
@@ -1469,12 +1469,18 @@  int mmc_regulator_get_supply(struct mmc_host *mmc)
 			mmc->ocr_avail = ret;
 		else
 			dev_warn(dev, "Failed getting OCR mask: %d\n", ret);
+
+		if (mmc->supply.vmmc_current)
+			regulator_set_load(mmc->supply.vmmc, mmc->supply.vmmc_current);
 	}
 
 	if (IS_ERR(mmc->supply.vqmmc)) {
 		if (PTR_ERR(mmc->supply.vqmmc) == -EPROBE_DEFER)
 			return -EPROBE_DEFER;
 		dev_info(dev, "No vqmmc regulator found\n");
+	} else {
+		if (mmc->supply.vqmmc_current)
+			regulator_set_load(mmc->supply.vqmmc, mmc->supply.vqmmc_current);
 	}
 
 	return 0;
diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c
index 970e6906930b..ede508d63fb5 100644
--- a/drivers/mmc/core/host.c
+++ b/drivers/mmc/core/host.c
@@ -235,6 +235,10 @@  int mmc_of_parse(struct mmc_host *host)
 			host->caps2 |= MMC_CAP2_CD_ACTIVE_HIGH;
 	}
 
+	/* Parse regulator load requests */
+	of_property_read_u32(np, "vmmc-active-current", &host->supply.vmmc_current);
+	of_property_read_u32(np, "vqmmc-active-current", &host->supply.vqmmc_current);
+
 	/* Parse Write Protection */
 	ro_cap_invert = of_property_read_bool(np, "wp-inverted");
 
diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h
index 8673ffe3d86e..640d8dbb8559 100644
--- a/include/linux/mmc/host.h
+++ b/include/linux/mmc/host.h
@@ -197,6 +197,8 @@  struct mmc_pwrseq;
 struct mmc_supply {
 	struct regulator *vmmc;		/* Card power supply */
 	struct regulator *vqmmc;	/* Optional Vccq supply */
+	u32 vmmc_current;		/* Requested current for vmmc */
+	u32 vqmmc_current;		/* Requested current for vqmmc */
 };
 
 struct mmc_host {