Commit 8a34e979 authored by WEN Pingbo's avatar WEN Pingbo Committed by Mark Brown

regulator: refactor valid_ops_mask checking code

To make the code more compat and centralized, this patch add a
unified function - regulator_ops_is_valid. So we can add
some extra checking code easily later.
Signed-off-by: default avatarWEN Pingbo <pingbo.wen@linaro.org>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 45a91e8f
...@@ -132,6 +132,19 @@ static bool have_full_constraints(void) ...@@ -132,6 +132,19 @@ static bool have_full_constraints(void)
return has_full_constraints || of_have_populated_dt(); return has_full_constraints || of_have_populated_dt();
} }
static bool regulator_ops_is_valid(struct regulator_dev *rdev, int ops)
{
if (!rdev->constraints) {
rdev_err(rdev, "no constraints\n");
return false;
}
if (rdev->constraints->valid_ops_mask & ops)
return true;
return false;
}
static inline struct regulator_dev *rdev_get_supply(struct regulator_dev *rdev) static inline struct regulator_dev *rdev_get_supply(struct regulator_dev *rdev)
{ {
if (rdev && rdev->supply) if (rdev && rdev->supply)
...@@ -198,28 +211,13 @@ static struct device_node *of_get_regulator(struct device *dev, const char *supp ...@@ -198,28 +211,13 @@ static struct device_node *of_get_regulator(struct device *dev, const char *supp
return regnode; return regnode;
} }
static int _regulator_can_change_status(struct regulator_dev *rdev)
{
if (!rdev->constraints)
return 0;
if (rdev->constraints->valid_ops_mask & REGULATOR_CHANGE_STATUS)
return 1;
else
return 0;
}
/* Platform voltage constraint check */ /* Platform voltage constraint check */
static int regulator_check_voltage(struct regulator_dev *rdev, static int regulator_check_voltage(struct regulator_dev *rdev,
int *min_uV, int *max_uV) int *min_uV, int *max_uV)
{ {
BUG_ON(*min_uV > *max_uV); BUG_ON(*min_uV > *max_uV);
if (!rdev->constraints) { if (!regulator_ops_is_valid(rdev, REGULATOR_CHANGE_VOLTAGE)) {
rdev_err(rdev, "no constraints\n");
return -ENODEV;
}
if (!(rdev->constraints->valid_ops_mask & REGULATOR_CHANGE_VOLTAGE)) {
rdev_err(rdev, "voltage operation not allowed\n"); rdev_err(rdev, "voltage operation not allowed\n");
return -EPERM; return -EPERM;
} }
...@@ -275,11 +273,7 @@ static int regulator_check_current_limit(struct regulator_dev *rdev, ...@@ -275,11 +273,7 @@ static int regulator_check_current_limit(struct regulator_dev *rdev,
{ {
BUG_ON(*min_uA > *max_uA); BUG_ON(*min_uA > *max_uA);
if (!rdev->constraints) { if (!regulator_ops_is_valid(rdev, REGULATOR_CHANGE_CURRENT)) {
rdev_err(rdev, "no constraints\n");
return -ENODEV;
}
if (!(rdev->constraints->valid_ops_mask & REGULATOR_CHANGE_CURRENT)) {
rdev_err(rdev, "current operation not allowed\n"); rdev_err(rdev, "current operation not allowed\n");
return -EPERM; return -EPERM;
} }
...@@ -312,11 +306,7 @@ static int regulator_mode_constrain(struct regulator_dev *rdev, int *mode) ...@@ -312,11 +306,7 @@ static int regulator_mode_constrain(struct regulator_dev *rdev, int *mode)
return -EINVAL; return -EINVAL;
} }
if (!rdev->constraints) { if (!regulator_ops_is_valid(rdev, REGULATOR_CHANGE_MODE)) {
rdev_err(rdev, "no constraints\n");
return -ENODEV;
}
if (!(rdev->constraints->valid_ops_mask & REGULATOR_CHANGE_MODE)) {
rdev_err(rdev, "mode operation not allowed\n"); rdev_err(rdev, "mode operation not allowed\n");
return -EPERM; return -EPERM;
} }
...@@ -333,20 +323,6 @@ static int regulator_mode_constrain(struct regulator_dev *rdev, int *mode) ...@@ -333,20 +323,6 @@ static int regulator_mode_constrain(struct regulator_dev *rdev, int *mode)
return -EINVAL; return -EINVAL;
} }
/* dynamic regulator mode switching constraint check */
static int regulator_check_drms(struct regulator_dev *rdev)
{
if (!rdev->constraints) {
rdev_err(rdev, "no constraints\n");
return -ENODEV;
}
if (!(rdev->constraints->valid_ops_mask & REGULATOR_CHANGE_DRMS)) {
rdev_dbg(rdev, "drms operation not allowed\n");
return -EPERM;
}
return 0;
}
static ssize_t regulator_uV_show(struct device *dev, static ssize_t regulator_uV_show(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
...@@ -692,8 +668,7 @@ static int drms_uA_update(struct regulator_dev *rdev) ...@@ -692,8 +668,7 @@ static int drms_uA_update(struct regulator_dev *rdev)
* first check to see if we can set modes at all, otherwise just * first check to see if we can set modes at all, otherwise just
* tell the consumer everything is OK. * tell the consumer everything is OK.
*/ */
err = regulator_check_drms(rdev); if (!regulator_ops_is_valid(rdev, REGULATOR_CHANGE_DRMS))
if (err < 0)
return 0; return 0;
if (!rdev->desc->ops->get_optimum_mode && if (!rdev->desc->ops->get_optimum_mode &&
...@@ -893,7 +868,7 @@ static void print_constraints(struct regulator_dev *rdev) ...@@ -893,7 +868,7 @@ static void print_constraints(struct regulator_dev *rdev)
rdev_dbg(rdev, "%s\n", buf); rdev_dbg(rdev, "%s\n", buf);
if ((constraints->min_uV != constraints->max_uV) && if ((constraints->min_uV != constraints->max_uV) &&
!(constraints->valid_ops_mask & REGULATOR_CHANGE_VOLTAGE)) !regulator_ops_is_valid(rdev, REGULATOR_CHANGE_VOLTAGE))
rdev_warn(rdev, rdev_warn(rdev,
"Voltage range but no REGULATOR_CHANGE_VOLTAGE\n"); "Voltage range but no REGULATOR_CHANGE_VOLTAGE\n");
} }
...@@ -1354,7 +1329,7 @@ static struct regulator *create_regulator(struct regulator_dev *rdev, ...@@ -1354,7 +1329,7 @@ static struct regulator *create_regulator(struct regulator_dev *rdev,
* it is then we don't need to do nearly so much work for * it is then we don't need to do nearly so much work for
* enable/disable calls. * enable/disable calls.
*/ */
if (!_regulator_can_change_status(rdev) && if (!regulator_ops_is_valid(rdev, REGULATOR_CHANGE_STATUS) &&
_regulator_is_enabled(rdev)) _regulator_is_enabled(rdev))
regulator->always_on = true; regulator->always_on = true;
...@@ -2131,15 +2106,15 @@ static int _regulator_enable(struct regulator_dev *rdev) ...@@ -2131,15 +2106,15 @@ static int _regulator_enable(struct regulator_dev *rdev)
lockdep_assert_held_once(&rdev->mutex); lockdep_assert_held_once(&rdev->mutex);
/* check voltage and requested load before enabling */ /* check voltage and requested load before enabling */
if (rdev->constraints && if (regulator_ops_is_valid(rdev, REGULATOR_CHANGE_DRMS))
(rdev->constraints->valid_ops_mask & REGULATOR_CHANGE_DRMS))
drms_uA_update(rdev); drms_uA_update(rdev);
if (rdev->use_count == 0) { if (rdev->use_count == 0) {
/* The regulator may on if it's not switchable or left on */ /* The regulator may on if it's not switchable or left on */
ret = _regulator_is_enabled(rdev); ret = _regulator_is_enabled(rdev);
if (ret == -EINVAL || ret == 0) { if (ret == -EINVAL || ret == 0) {
if (!_regulator_can_change_status(rdev)) if (!regulator_ops_is_valid(rdev,
REGULATOR_CHANGE_STATUS))
return -EPERM; return -EPERM;
ret = _regulator_do_enable(rdev); ret = _regulator_do_enable(rdev);
...@@ -2241,7 +2216,7 @@ static int _regulator_disable(struct regulator_dev *rdev) ...@@ -2241,7 +2216,7 @@ static int _regulator_disable(struct regulator_dev *rdev)
(rdev->constraints && !rdev->constraints->always_on)) { (rdev->constraints && !rdev->constraints->always_on)) {
/* we are last user */ /* we are last user */
if (_regulator_can_change_status(rdev)) { if (regulator_ops_is_valid(rdev, REGULATOR_CHANGE_STATUS)) {
ret = _notifier_call_chain(rdev, ret = _notifier_call_chain(rdev,
REGULATOR_EVENT_PRE_DISABLE, REGULATOR_EVENT_PRE_DISABLE,
NULL); NULL);
...@@ -2262,10 +2237,7 @@ static int _regulator_disable(struct regulator_dev *rdev) ...@@ -2262,10 +2237,7 @@ static int _regulator_disable(struct regulator_dev *rdev)
rdev->use_count = 0; rdev->use_count = 0;
} else if (rdev->use_count > 1) { } else if (rdev->use_count > 1) {
if (regulator_ops_is_valid(rdev, REGULATOR_CHANGE_DRMS))
if (rdev->constraints &&
(rdev->constraints->valid_ops_mask &
REGULATOR_CHANGE_DRMS))
drms_uA_update(rdev); drms_uA_update(rdev);
rdev->use_count--; rdev->use_count--;
...@@ -2509,8 +2481,7 @@ int regulator_can_change_voltage(struct regulator *regulator) ...@@ -2509,8 +2481,7 @@ int regulator_can_change_voltage(struct regulator *regulator)
{ {
struct regulator_dev *rdev = regulator->rdev; struct regulator_dev *rdev = regulator->rdev;
if (rdev->constraints && if (regulator_ops_is_valid(rdev, REGULATOR_CHANGE_VOLTAGE)) {
(rdev->constraints->valid_ops_mask & REGULATOR_CHANGE_VOLTAGE)) {
if (rdev->desc->n_voltages - rdev->desc->linear_min_sel > 1) if (rdev->desc->n_voltages - rdev->desc->linear_min_sel > 1)
return 1; return 1;
...@@ -2664,7 +2635,7 @@ int regulator_is_supported_voltage(struct regulator *regulator, ...@@ -2664,7 +2635,7 @@ int regulator_is_supported_voltage(struct regulator *regulator,
int i, voltages, ret; int i, voltages, ret;
/* If we can't change voltage check the current voltage */ /* If we can't change voltage check the current voltage */
if (!(rdev->constraints->valid_ops_mask & REGULATOR_CHANGE_VOLTAGE)) { if (!regulator_ops_is_valid(rdev, REGULATOR_CHANGE_VOLTAGE)) {
ret = regulator_get_voltage(regulator); ret = regulator_get_voltage(regulator);
if (ret >= 0) if (ret >= 0)
return min_uV <= ret && ret <= max_uV; return min_uV <= ret && ret <= max_uV;
...@@ -2870,7 +2841,7 @@ static int regulator_set_voltage_unlocked(struct regulator *regulator, ...@@ -2870,7 +2841,7 @@ static int regulator_set_voltage_unlocked(struct regulator *regulator,
* return successfully even though the regulator does not support * return successfully even though the regulator does not support
* changing the voltage. * changing the voltage.
*/ */
if (!(rdev->constraints->valid_ops_mask & REGULATOR_CHANGE_VOLTAGE)) { if (!regulator_ops_is_valid(rdev, REGULATOR_CHANGE_VOLTAGE)) {
current_uV = _regulator_get_voltage(rdev); current_uV = _regulator_get_voltage(rdev);
if (min_uV <= current_uV && current_uV <= max_uV) { if (min_uV <= current_uV && current_uV <= max_uV) {
regulator->min_uV = min_uV; regulator->min_uV = min_uV;
...@@ -3385,8 +3356,7 @@ int regulator_allow_bypass(struct regulator *regulator, bool enable) ...@@ -3385,8 +3356,7 @@ int regulator_allow_bypass(struct regulator *regulator, bool enable)
if (!rdev->desc->ops->set_bypass) if (!rdev->desc->ops->set_bypass)
return 0; return 0;
if (rdev->constraints && if (!regulator_ops_is_valid(rdev, REGULATOR_CHANGE_BYPASS))
!(rdev->constraints->valid_ops_mask & REGULATOR_CHANGE_BYPASS))
return 0; return 0;
mutex_lock(&rdev->mutex); mutex_lock(&rdev->mutex);
...@@ -4406,7 +4376,7 @@ static int __init regulator_late_cleanup(struct device *dev, void *data) ...@@ -4406,7 +4376,7 @@ static int __init regulator_late_cleanup(struct device *dev, void *data)
if (c && c->always_on) if (c && c->always_on)
return 0; return 0;
if (c && !(c->valid_ops_mask & REGULATOR_CHANGE_STATUS)) if (!regulator_ops_is_valid(rdev, REGULATOR_CHANGE_STATUS))
return 0; return 0;
mutex_lock(&rdev->mutex); mutex_lock(&rdev->mutex);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment