Browse Source

Merge remote-tracking branch 'regulator/topic/constraints' into regulator-next

Mark Brown 11 years ago
parent
commit
dc49f3d5eb
1 changed files with 23 additions and 10 deletions
  1. 23 10
      drivers/regulator/core.c

+ 23 - 10
drivers/regulator/core.c

@@ -844,13 +844,22 @@ static int machine_constraints_voltage(struct regulator_dev *rdev,
 	/* do we need to apply the constraint voltage */
 	/* do we need to apply the constraint voltage */
 	if (rdev->constraints->apply_uV &&
 	if (rdev->constraints->apply_uV &&
 	    rdev->constraints->min_uV == rdev->constraints->max_uV) {
 	    rdev->constraints->min_uV == rdev->constraints->max_uV) {
-		ret = _regulator_do_set_voltage(rdev,
-						rdev->constraints->min_uV,
-						rdev->constraints->max_uV);
-		if (ret < 0) {
-			rdev_err(rdev, "failed to apply %duV constraint\n",
-				 rdev->constraints->min_uV);
-			return ret;
+		int current_uV = _regulator_get_voltage(rdev);
+		if (current_uV < 0) {
+			rdev_err(rdev, "failed to get the current voltage\n");
+			return current_uV;
+		}
+		if (current_uV < rdev->constraints->min_uV ||
+		    current_uV > rdev->constraints->max_uV) {
+			ret = _regulator_do_set_voltage(
+				rdev, rdev->constraints->min_uV,
+				rdev->constraints->max_uV);
+			if (ret < 0) {
+				rdev_err(rdev,
+					"failed to apply %duV constraint\n",
+					rdev->constraints->min_uV);
+				return ret;
+			}
 		}
 		}
 	}
 	}
 
 
@@ -3819,8 +3828,9 @@ static int __init regulator_init_complete(void)
 	mutex_lock(&regulator_list_mutex);
 	mutex_lock(&regulator_list_mutex);
 
 
 	/* If we have a full configuration then disable any regulators
 	/* If we have a full configuration then disable any regulators
-	 * which are not in use or always_on.  This will become the
-	 * default behaviour in the future.
+	 * we have permission to change the status for and which are
+	 * not in use or always_on.  This is effectively the default
+	 * for DT and ACPI as they have full constraints.
 	 */
 	 */
 	list_for_each_entry(rdev, &regulator_list, list) {
 	list_for_each_entry(rdev, &regulator_list, list) {
 		ops = rdev->desc->ops;
 		ops = rdev->desc->ops;
@@ -3829,6 +3839,9 @@ static int __init regulator_init_complete(void)
 		if (c && c->always_on)
 		if (c && c->always_on)
 			continue;
 			continue;
 
 
+		if (c && !(c->valid_ops_mask & REGULATOR_CHANGE_STATUS))
+			continue;
+
 		mutex_lock(&rdev->mutex);
 		mutex_lock(&rdev->mutex);
 
 
 		if (rdev->use_count)
 		if (rdev->use_count)
@@ -3867,4 +3880,4 @@ unlock:
 
 
 	return 0;
 	return 0;
 }
 }
-late_initcall(regulator_init_complete);
+late_initcall_sync(regulator_init_complete);