From: Leonard Crestez <leonard.crestez@nxp.com>
To: Mark Brown <broonie@kernel.org>,
Liam Girdwood <lgirdwood@gmail.com>,
Viresh Kumar <viresh.kumar@linaro.org>,
"Rafael J. Wysocki" <rjw@rjwysocki.net>,
Shawn Guo <shawnguo@kernel.org>,
Sascha Hauer <kernel@pengutronix.de>
Cc: Mark Rutland <mark.rutland@arm.com>,
devicetree@vger.kernel.org,
Leonard Crestez <leonard.crestez@nxp.com>,
Anson Huang <Anson.Huang@nxp.com>,
Irina Tirdea <irina.tirdea@nxp.com>,
linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org,
Rob Herring <robh+dt@kernel.org>,
Octavian Purdila <octavian.purdila@nxp.com>,
Fabio Estevam <fabio.estevam@nxp.com>,
Robin Gong <yibin.gong@nxp.com>,
linux-arm-kernel@lists.infradead.org
Subject: [RFC 4/8] regulator: core: Check enabling bypass respects constraints
Date: Wed, 22 Mar 2017 18:53:06 +0200 [thread overview]
Message-ID: <1edff9bc610969b0c53fa1080d5db021c8e00b2d.1490199005.git.leonard.crestez@nxp.com> (raw)
In-Reply-To: <cover.1490199005.git.leonard.crestez@nxp.com>
Enabling bypass mode makes a regulator passthrough the supply voltage
directly. It is possible that the supply voltage is set high enough that
it violates machine constraints so let's check for that.
The supply voltage might be higher because of min_dropout_uV or maybe
there is just an unrelated consumer who requested a higher voltage.
Signed-off-by: Leonard Crestez <leonard.crestez@nxp.com>
---
drivers/regulator/core.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 50 insertions(+), 2 deletions(-)
diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
index 53d4fc7..9d893aa 100644
--- a/drivers/regulator/core.c
+++ b/drivers/regulator/core.c
@@ -3453,6 +3453,54 @@ int regulator_set_load(struct regulator *regulator, int uA_load)
}
EXPORT_SYMBOL_GPL(regulator_set_load);
+static int _regulator_set_bypass(struct regulator *regulator, bool bypass)
+{
+ struct regulator_dev *rdev = regulator->rdev;
+ int output_voltage;
+ int supply_voltage;
+
+ if (bypass && !rdev->supply) {
+ rdev_err(rdev, "Refuse to set bypass on regulator with no supply!\n");
+ return -EINVAL;
+ }
+
+ /* Check that enabling bypass won't break constraints */
+ if (bypass && _regulator_is_enabled(rdev)) {
+ output_voltage = _regulator_get_voltage(rdev);
+ if (output_voltage < 0) {
+ rdev_err(rdev, "Failed to get old output voltage before"
+ " enabling bypass: %d\n", output_voltage);
+ return output_voltage;
+ }
+ supply_voltage = _regulator_get_voltage(rdev->supply->rdev);
+ if (supply_voltage < 0) {
+ rdev_err(rdev, "Failed to get supply voltage before"
+ " enabling bypass: %d\n", supply_voltage);
+ return supply_voltage;
+ }
+ if (supply_voltage < rdev->constraints->min_uV ||
+ supply_voltage > rdev->constraints->max_uV) {
+ rdev_err(rdev, "Enabling bypass would change voltage"
+ " from %duV to %duV violating"
+ " constraint range %duV to %duV\n",
+ output_voltage,
+ supply_voltage,
+ rdev->constraints->min_uV,
+ rdev->constraints->max_uV);
+ return -EINVAL;
+ }
+ rdev_dbg(rdev, "Enabling bypass would change voltage"
+ " from %duV to %duV respecting"
+ " constraint range %duV to %duV\n",
+ output_voltage,
+ supply_voltage,
+ rdev->constraints->min_uV,
+ rdev->constraints->max_uV);
+ }
+
+ return rdev->desc->ops->set_bypass(rdev, bypass);
+}
+
/**
* regulator_allow_bypass - allow the regulator to go into bypass mode
*
@@ -3481,7 +3529,7 @@ int regulator_allow_bypass(struct regulator *regulator, bool enable)
rdev->bypass_count++;
if (rdev->bypass_count == rdev->open_count) {
- ret = rdev->desc->ops->set_bypass(rdev, enable);
+ ret = _regulator_set_bypass(regulator, enable);
if (ret != 0)
rdev->bypass_count--;
}
@@ -3490,7 +3538,7 @@ int regulator_allow_bypass(struct regulator *regulator, bool enable)
rdev->bypass_count--;
if (rdev->bypass_count != rdev->open_count) {
- ret = rdev->desc->ops->set_bypass(rdev, enable);
+ ret = _regulator_set_bypass(regulator, enable);
if (ret != 0)
rdev->bypass_count++;
}
--
2.7.4
next prev parent reply other threads:[~2017-03-22 16:53 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-03-22 16:53 [RFC 0/8] ARM: imx: Upstream fsl,ldo-bypass Leonard Crestez
2017-03-22 16:53 ` [RFC 1/8] ARM: imx: gpc: Do not print error message for EPROBE_DEFER Leonard Crestez
2017-03-22 16:53 ` [RFC 2/8] cpufreq: imx6q: Fix handling EPROBE_DEFER from regulator Leonard Crestez
[not found] ` <7f2618363d43b30db29f5f8ae822df413392f99d.1490199005.git.leonard.crestez-3arQi8VN3Tc@public.gmane.org>
2017-03-23 4:33 ` Viresh Kumar
2017-03-22 16:53 ` [RFC 3/8] cpufreq: imx6q: Set max suspend_freq to avoid changes during suspend Leonard Crestez
2017-03-23 4:34 ` Viresh Kumar
2017-03-28 20:03 ` Leonard Crestez
2017-03-28 20:50 ` Rafael J. Wysocki
2017-03-28 22:23 ` Rafael J. Wysocki
2017-03-22 16:53 ` Leonard Crestez [this message]
[not found] ` <1edff9bc610969b0c53fa1080d5db021c8e00b2d.1490199005.git.leonard.crestez-3arQi8VN3Tc@public.gmane.org>
2017-03-24 12:52 ` [RFC 4/8] regulator: core: Check enabling bypass respects constraints Mark Brown
2017-03-28 12:39 ` Leonard Crestez
[not found] ` <1490704781.3546.57.camel-3arQi8VN3Tc@public.gmane.org>
2017-03-28 16:47 ` Mark Brown
2017-03-28 19:49 ` Leonard Crestez
[not found] ` <1490730595.15830.1.camel-3arQi8VN3Tc@public.gmane.org>
2017-04-06 18:52 ` Mark Brown
[not found] ` <20170406185202.uixxcv3dgucrddgc-GFdadSzt00ze9xe1eoZjHA@public.gmane.org>
2017-04-07 10:51 ` Leonard Crestez
2017-04-07 11:22 ` Mark Brown
[not found] ` <20170407112212.gzv3p7ldkh62657m-GFdadSzt00ze9xe1eoZjHA@public.gmane.org>
2017-04-13 20:46 ` Leonard Crestez
2017-03-22 16:53 ` [RFC 5/8] regulator: anatop: fix min dropout for bypass mode Leonard Crestez
2017-03-24 12:54 ` Mark Brown
2017-03-28 11:52 ` Leonard Crestez
2017-03-22 16:53 ` [RFC 6/8] regulator: core: Add regulator_is_bypass function Leonard Crestez
[not found] ` <e74c2f4d2b452cbe01aa2a48edde5c024212ffcb.1490199005.git.leonard.crestez-3arQi8VN3Tc@public.gmane.org>
2017-03-24 12:55 ` Mark Brown
2017-03-28 14:53 ` Leonard Crestez
2017-03-22 16:53 ` [RFC 7/8] cpufreq: imx6q: Initialize LDO bypass Leonard Crestez
2017-03-22 17:09 ` Lucas Stach
[not found] ` <1490202585.29056.5.camel-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
2017-03-22 17:48 ` Leonard Crestez
2017-03-22 18:00 ` Lucas Stach
2017-03-22 16:53 ` [RFC 8/8] ARM: dts: imx6qdl-sabresd: Enable fsl,ldo-bypass Leonard Crestez
2017-03-22 17:13 ` Lucas Stach
[not found] ` <1490202830.29056.8.camel-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
2017-03-29 13:32 ` Leonard Crestez
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1edff9bc610969b0c53fa1080d5db021c8e00b2d.1490199005.git.leonard.crestez@nxp.com \
--to=leonard.crestez@nxp.com \
--cc=Anson.Huang@nxp.com \
--cc=broonie@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=fabio.estevam@nxp.com \
--cc=irina.tirdea@nxp.com \
--cc=kernel@pengutronix.de \
--cc=lgirdwood@gmail.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=octavian.purdila@nxp.com \
--cc=rjw@rjwysocki.net \
--cc=robh+dt@kernel.org \
--cc=shawnguo@kernel.org \
--cc=viresh.kumar@linaro.org \
--cc=yibin.gong@nxp.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).