Browse Source

regulator: Add system_load constraint

Some regulators have a fixed load that isn't captured by
consumers that the kernel knows about. Add a constraint to
support this.

Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
Signed-off-by: Mark Brown <broonie@kernel.org>
Stephen Boyd 10 years ago
parent
commit
22a10bca28

+ 2 - 0
Documentation/devicetree/bindings/regulator/regulator.txt

@@ -37,6 +37,8 @@ Optional properties:
 - regulator-initial-mode: initial operating mode. The set of possible operating
 - regulator-initial-mode: initial operating mode. The set of possible operating
   modes depends on the capabilities of every hardware so each device binding
   modes depends on the capabilities of every hardware so each device binding
   documentation explains which values the regulator supports.
   documentation explains which values the regulator supports.
+- regulator-system-load: Load in uA present on regulator that is not captured by
+  any consumer request.
 
 
 Deprecated properties:
 Deprecated properties:
 - regulator-compatible: If a regulator chip contains multiple
 - regulator-compatible: If a regulator chip contains multiple

+ 2 - 0
drivers/regulator/core.c

@@ -678,6 +678,8 @@ static int drms_uA_update(struct regulator_dev *rdev)
 	list_for_each_entry(sibling, &rdev->consumer_list, list)
 	list_for_each_entry(sibling, &rdev->consumer_list, list)
 		current_uA += sibling->uA_load;
 		current_uA += sibling->uA_load;
 
 
+	current_uA += rdev->constraints->system_load;
+
 	if (rdev->desc->ops->set_load) {
 	if (rdev->desc->ops->set_load) {
 		/* set the optimum mode for our new total regulator load */
 		/* set the optimum mode for our new total regulator load */
 		err = rdev->desc->ops->set_load(rdev, current_uA);
 		err = rdev->desc->ops->set_load(rdev, current_uA);

+ 3 - 0
drivers/regulator/of_regulator.c

@@ -95,6 +95,9 @@ static void of_get_regulation_constraints(struct device_node *np,
 		}
 		}
 	}
 	}
 
 
+	if (!of_property_read_u32(np, "regulator-system-load", &pval))
+		constraints->system_load = pval;
+
 	for (i = 0; i < ARRAY_SIZE(regulator_states); i++) {
 	for (i = 0; i < ARRAY_SIZE(regulator_states); i++) {
 		switch (i) {
 		switch (i) {
 		case PM_SUSPEND_MEM:
 		case PM_SUSPEND_MEM:

+ 3 - 0
include/linux/regulator/machine.h

@@ -75,6 +75,7 @@ struct regulator_state {
  *
  *
  * @min_uA: Smallest current consumers may set.
  * @min_uA: Smallest current consumers may set.
  * @max_uA: Largest current consumers may set.
  * @max_uA: Largest current consumers may set.
+ * @system_load: Load that isn't captured by any consumer requests.
  *
  *
  * @valid_modes_mask: Mask of modes which may be configured by consumers.
  * @valid_modes_mask: Mask of modes which may be configured by consumers.
  * @valid_ops_mask: Operations which may be performed by consumers.
  * @valid_ops_mask: Operations which may be performed by consumers.
@@ -112,6 +113,8 @@ struct regulation_constraints {
 	int min_uA;
 	int min_uA;
 	int max_uA;
 	int max_uA;
 
 
+	int system_load;
+
 	/* valid regulator operating modes for this machine */
 	/* valid regulator operating modes for this machine */
 	unsigned int valid_modes_mask;
 	unsigned int valid_modes_mask;