* [PATCH 1/2] regulator: core: Introduce set_load op
@ 2015-02-12 3:39 Bjorn Andersson
2015-02-12 3:39 ` [PATCH 2/2] regulator: qcom-rpm: Implement set_load and enable drms Bjorn Andersson
2015-02-23 14:16 ` [PATCH 1/2] regulator: core: Introduce set_load op Mark Brown
0 siblings, 2 replies; 3+ messages in thread
From: Bjorn Andersson @ 2015-02-12 3:39 UTC (permalink / raw)
To: Liam Girdwood, Mark Brown; +Cc: linux-kernel, linux-arm-msm
Expose the requested load directly to the regulator implementation for
hardware that does not support the normal enum based set_mode().
Signed-off-by: Bjorn Andersson <bjorn.andersson@sonymobile.com>
---
drivers/regulator/core.c | 39 ++++++++++++++++++++++++---------------
include/linux/regulator/driver.h | 3 +++
2 files changed, 27 insertions(+), 15 deletions(-)
diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
index 27fb349..5bf22ee 100644
--- a/drivers/regulator/core.c
+++ b/drivers/regulator/core.c
@@ -672,10 +672,12 @@ static int drms_uA_update(struct regulator_dev *rdev)
if (err < 0)
return 0;
- if (!rdev->desc->ops->get_optimum_mode)
+ if (!rdev->desc->ops->get_optimum_mode &&
+ !rdev->desc->ops->set_load)
return 0;
- if (!rdev->desc->ops->set_mode)
+ if (!rdev->desc->ops->set_mode &&
+ !rdev->desc->ops->set_load)
return -EINVAL;
/* get output voltage */
@@ -700,22 +702,29 @@ static int drms_uA_update(struct regulator_dev *rdev)
list_for_each_entry(sibling, &rdev->consumer_list, list)
current_uA += sibling->uA_load;
- /* now get the optimum mode for our new total regulator load */
- mode = rdev->desc->ops->get_optimum_mode(rdev, input_uV,
- output_uV, current_uA);
+ if (rdev->desc->ops->set_load) {
+ /* set the optimum mode for our new total regulator load */
+ err = rdev->desc->ops->set_load(rdev, current_uA);
+ if (err < 0)
+ rdev_err(rdev, "failed to set load %d\n", current_uA);
+ } else {
+ /* now get the optimum mode for our new total regulator load */
+ mode = rdev->desc->ops->get_optimum_mode(rdev, input_uV,
+ output_uV, current_uA);
+
+ /* check the new mode is allowed */
+ err = regulator_mode_constrain(rdev, &mode);
+ if (err < 0) {
+ rdev_err(rdev, "failed to get optimum mode @ %d uA %d -> %d uV\n",
+ current_uA, input_uV, output_uV);
+ return err;
+ }
- /* check the new mode is allowed */
- err = regulator_mode_constrain(rdev, &mode);
- if (err < 0) {
- rdev_err(rdev, "failed to get optimum mode @ %d uA %d -> %d uV\n",
- current_uA, input_uV, output_uV);
- return err;
+ err = rdev->desc->ops->set_mode(rdev, mode);
+ if (err < 0)
+ rdev_err(rdev, "failed to set optimum mode %x\n", mode);
}
- err = rdev->desc->ops->set_mode(rdev, mode);
- if (err < 0)
- rdev_err(rdev, "failed to set optimum mode %x\n", mode);
-
return err;
}
diff --git a/include/linux/regulator/driver.h b/include/linux/regulator/driver.h
index 5f1e9ca..8a4d2e7 100644
--- a/include/linux/regulator/driver.h
+++ b/include/linux/regulator/driver.h
@@ -97,6 +97,7 @@ struct regulator_linear_range {
* REGULATOR_STATUS value (or negative errno)
* @get_optimum_mode: Get the most efficient operating mode for the regulator
* when running with the specified parameters.
+ * @set_load: Set the load for the regulator.
*
* @set_bypass: Set the regulator in bypass mode.
* @get_bypass: Get the regulator bypass mode state.
@@ -166,6 +167,8 @@ struct regulator_ops {
/* get most efficient regulator operating mode for load */
unsigned int (*get_optimum_mode) (struct regulator_dev *, int input_uV,
int output_uV, int load_uA);
+ /* set the load on the regulator */
+ int (*set_load)(struct regulator_dev *, int load_uA);
/* control and report on bypass mode */
int (*set_bypass)(struct regulator_dev *dev, bool enable);
--
1.8.2.2
^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH 2/2] regulator: qcom-rpm: Implement set_load and enable drms
2015-02-12 3:39 [PATCH 1/2] regulator: core: Introduce set_load op Bjorn Andersson
@ 2015-02-12 3:39 ` Bjorn Andersson
2015-02-23 14:16 ` [PATCH 1/2] regulator: core: Introduce set_load op Mark Brown
1 sibling, 0 replies; 3+ messages in thread
From: Bjorn Andersson @ 2015-02-12 3:39 UTC (permalink / raw)
To: Liam Girdwood, Mark Brown; +Cc: linux-kernel, linux-arm-msm
Pass the requested load directly to the rpm.
Signed-off-by: Bjorn Andersson <bjorn.andersson@sonymobile.com>
---
drivers/regulator/qcom_rpm-regulator.c | 30 ++++++++++++++++++++++++++++++
1 file changed, 30 insertions(+)
diff --git a/drivers/regulator/qcom_rpm-regulator.c b/drivers/regulator/qcom_rpm-regulator.c
index 8364ff3..bab35c6 100644
--- a/drivers/regulator/qcom_rpm-regulator.c
+++ b/drivers/regulator/qcom_rpm-regulator.c
@@ -388,6 +388,28 @@ static int rpm_reg_is_enabled(struct regulator_dev *rdev)
return vreg->is_enabled;
}
+static int rpm_reg_set_load(struct regulator_dev *rdev, int load_uA)
+{
+ struct qcom_rpm_reg *vreg = rdev_get_drvdata(rdev);
+ const struct rpm_reg_parts *parts = vreg->parts;
+ const struct request_member *req = &parts->ia;
+ int load_mA = load_uA / 1000;
+ int max_mA = req->mask >> req->shift;
+ int ret;
+
+ if (req->mask == 0)
+ return -EINVAL;
+
+ if (load_mA > max_mA)
+ load_mA = max_mA;
+
+ mutex_lock(&vreg->lock);
+ ret = rpm_reg_write(vreg, req, load_mA);
+ mutex_unlock(&vreg->lock);
+
+ return ret;
+}
+
static struct regulator_ops uV_ops = {
.list_voltage = regulator_list_voltage_linear_range,
@@ -397,6 +419,8 @@ static struct regulator_ops uV_ops = {
.enable = rpm_reg_uV_enable,
.disable = rpm_reg_uV_disable,
.is_enabled = rpm_reg_is_enabled,
+
+ .set_load = rpm_reg_set_load,
};
static struct regulator_ops mV_ops = {
@@ -408,6 +432,8 @@ static struct regulator_ops mV_ops = {
.enable = rpm_reg_mV_enable,
.disable = rpm_reg_mV_disable,
.is_enabled = rpm_reg_is_enabled,
+
+ .set_load = rpm_reg_set_load,
};
static struct regulator_ops switch_ops = {
@@ -700,6 +726,10 @@ static int rpm_reg_probe(struct platform_device *pdev)
return -EINVAL;
}
+ /* Regulators with ia property suppports drms */
+ if (vreg->parts->ia.mask)
+ initdata->constraints.valid_ops_mask |= REGULATOR_CHANGE_DRMS;
+
key = "bias-pull-down";
if (of_property_read_bool(pdev->dev.of_node, key)) {
ret = rpm_reg_set(vreg, &vreg->parts->pd, 1);
--
1.8.2.2
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH 1/2] regulator: core: Introduce set_load op
2015-02-12 3:39 [PATCH 1/2] regulator: core: Introduce set_load op Bjorn Andersson
2015-02-12 3:39 ` [PATCH 2/2] regulator: qcom-rpm: Implement set_load and enable drms Bjorn Andersson
@ 2015-02-23 14:16 ` Mark Brown
1 sibling, 0 replies; 3+ messages in thread
From: Mark Brown @ 2015-02-23 14:16 UTC (permalink / raw)
To: Bjorn Andersson; +Cc: Liam Girdwood, linux-kernel, linux-arm-msm
[-- Attachment #1: Type: text/plain, Size: 228 bytes --]
On Wed, Feb 11, 2015 at 07:39:12PM -0800, Bjorn Andersson wrote:
> Expose the requested load directly to the regulator implementation for
> hardware that does not support the normal enum based set_mode().
Applied both, thanks!
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 473 bytes --]
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2015-02-23 14:17 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-02-12 3:39 [PATCH 1/2] regulator: core: Introduce set_load op Bjorn Andersson
2015-02-12 3:39 ` [PATCH 2/2] regulator: qcom-rpm: Implement set_load and enable drms Bjorn Andersson
2015-02-23 14:16 ` [PATCH 1/2] regulator: core: Introduce set_load op Mark Brown
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®