|
@@ -923,6 +923,36 @@ static int machine_constraints_voltage(struct regulator_dev *rdev,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static int machine_constraints_current(struct regulator_dev *rdev,
|
|
|
+ struct regulation_constraints *constraints)
|
|
|
+{
|
|
|
+ struct regulator_ops *ops = rdev->desc->ops;
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ if (!constraints->min_uA && !constraints->max_uA)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ if (constraints->min_uA > constraints->max_uA) {
|
|
|
+ rdev_err(rdev, "Invalid current constraints\n");
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!ops->set_current_limit || !ops->get_current_limit) {
|
|
|
+ rdev_warn(rdev, "Operation of current configuration missing\n");
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Set regulator current in constraints range */
|
|
|
+ ret = ops->set_current_limit(rdev, constraints->min_uA,
|
|
|
+ constraints->max_uA);
|
|
|
+ if (ret < 0) {
|
|
|
+ rdev_err(rdev, "Failed to set current constraint, %d\n", ret);
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* set_machine_constraints - sets regulator constraints
|
|
|
* @rdev: regulator source
|
|
@@ -953,6 +983,10 @@ static int set_machine_constraints(struct regulator_dev *rdev,
|
|
|
if (ret != 0)
|
|
|
goto out;
|
|
|
|
|
|
+ ret = machine_constraints_current(rdev, rdev->constraints);
|
|
|
+ if (ret != 0)
|
|
|
+ goto out;
|
|
|
+
|
|
|
/* do we need to setup our suspend state */
|
|
|
if (rdev->constraints->initial_state) {
|
|
|
ret = suspend_prepare(rdev, rdev->constraints->initial_state);
|