diff mbox

[RESEND,1/2] regulator: Add support for parsing operation mode

Message ID 1462959090-2877-2-git-send-email-henryc.chen@mediatek.com
State Changes Requested, archived
Headers show

Commit Message

Henry Chen May 11, 2016, 9:31 a.m. UTC
Some regulators support their operating mode to be changed by
consumers for module specific purpose.

This patch adds support to parse those properties and fill the
regulator constraints so the regulator core can call the
regualtor_set_mode to change the modes.

Signed-off-by: Henry Chen <henryc.chen@mediatek.com>
---
 Documentation/devicetree/bindings/regulator/regulator.txt | 10 ++++++++++
 drivers/regulator/of_regulator.c                          | 14 ++++++++++++++
 2 files changed, 24 insertions(+)

Comments

Mark Brown May 11, 2016, 2:46 p.m. UTC | #1
On Wed, May 11, 2016 at 05:31:29PM +0800, Henry Chen wrote:

> +- regulator-allow-change-mode: allow the regulator mode to be configured
> +- regulator-supported-modes: Regulators can run in a variety of different operating
> +  modes depending on output load. This allows further system power savings by
> +  selecting the best (and most efficient) regulator mode for a desired load.
> +  The definition for each of these operation is defined at
> +  include/linux/regulator/consumer.h

It really isn't OK for a DT binding to be documented by referencing
Linux kernel internals.

> +	0: FAST.
> +	1: NORMAL.
> +	2: IDLE.
> +	3: STANDBY.

The problem with these is that they don't really mean anything outside
of a specific regulator.  This makes it very hard to make them at all
interoperable, and is also incompatible with the way we're currently
handling the modes elsewhere in the bindings.  If we're going to make an
ABI of this we need to have something with abstraction in it but it's
hard to see how to abstract modes since they're so implementation
specific, even if the mechanisms are similar the different load ranges
that regulators support mean that what's a very taxing load for one
regulator may be nothing to another.
diff mbox

Patch

diff --git a/Documentation/devicetree/bindings/regulator/regulator.txt b/Documentation/devicetree/bindings/regulator/regulator.txt
index ecfc593..88f98f0 100644
--- a/Documentation/devicetree/bindings/regulator/regulator.txt
+++ b/Documentation/devicetree/bindings/regulator/regulator.txt
@@ -49,6 +49,16 @@  Optional properties:
 	0: Disable active discharge.
 	1: Enable active discharge.
 	Absence of this property will leave configuration to default.
+- regulator-allow-change-mode: allow the regulator mode to be configured
+- regulator-supported-modes: Regulators can run in a variety of different operating
+  modes depending on output load. This allows further system power savings by
+  selecting the best (and most efficient) regulator mode for a desired load.
+  The definition for each of these operation is defined at
+  include/linux/regulator/consumer.h
+	0: FAST.
+	1: NORMAL.
+	2: IDLE.
+	3: STANDBY.
 
 Deprecated properties:
 - regulator-compatible: If a regulator chip contains multiple
diff --git a/drivers/regulator/of_regulator.c b/drivers/regulator/of_regulator.c
index 6b0aa80..12fe8c8 100644
--- a/drivers/regulator/of_regulator.c
+++ b/drivers/regulator/of_regulator.c
@@ -167,6 +167,20 @@  static void of_get_regulation_constraints(struct device_node *np,
 		suspend_state = NULL;
 		suspend_np = NULL;
 	}
+
+	if (of_property_read_bool(np, "regulator-allow-change-mode"))
+		constraints->valid_ops_mask |= REGULATOR_CHANGE_MODE;
+
+	ret = of_property_count_elems_of_size(np,
+					      "regulator-supported-modes",
+					      sizeof(u32));
+	for (i = 0; i < ret; i++) {
+		u32 mode;
+
+		of_property_read_u32_index(np, "regulator-supported-modes",
+					   i, &mode);
+		constraints->valid_modes_mask |= (1 << mode);
+	}
 }
 
 /**