aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/regulator/mc13892-regulator.c17
-rw-r--r--drivers/regulator/mc13xxx-regulator-core.c54
-rw-r--r--drivers/regulator/mc13xxx.h2
3 files changed, 9 insertions, 64 deletions
diff --git a/drivers/regulator/mc13892-regulator.c b/drivers/regulator/mc13892-regulator.c
index e8cfc99dd8f..ba586817926 100644
--- a/drivers/regulator/mc13892-regulator.c
+++ b/drivers/regulator/mc13892-regulator.c
@@ -428,24 +428,15 @@ static int mc13892_sw_regulator_get_voltage(struct regulator_dev *rdev)
428 return val; 428 return val;
429} 429}
430 430
431static int mc13892_sw_regulator_set_voltage(struct regulator_dev *rdev, 431static int mc13892_sw_regulator_set_voltage_sel(struct regulator_dev *rdev,
432 int min_uV, int max_uV, unsigned *selector) 432 unsigned selector)
433{ 433{
434 struct mc13xxx_regulator_priv *priv = rdev_get_drvdata(rdev); 434 struct mc13xxx_regulator_priv *priv = rdev_get_drvdata(rdev);
435 int hi, value, mask, id = rdev_get_id(rdev); 435 int hi, value, mask, id = rdev_get_id(rdev);
436 u32 valread; 436 u32 valread;
437 int ret; 437 int ret;
438 438
439 dev_dbg(rdev_get_dev(rdev), "%s id: %d min_uV: %d max_uV: %d\n", 439 value = mc13892_regulators[id].voltages[selector];
440 __func__, id, min_uV, max_uV);
441
442 /* Find the best index */
443 value = mc13xxx_get_best_voltage_index(rdev, min_uV, max_uV);
444 dev_dbg(rdev_get_dev(rdev), "%s best value: %d\n", __func__, value);
445 if (value < 0)
446 return value;
447
448 value = mc13892_regulators[id].voltages[value];
449 440
450 mc13xxx_lock(priv->mc13xxx); 441 mc13xxx_lock(priv->mc13xxx);
451 ret = mc13xxx_reg_read(priv->mc13xxx, 442 ret = mc13xxx_reg_read(priv->mc13xxx,
@@ -480,7 +471,7 @@ err:
480static struct regulator_ops mc13892_sw_regulator_ops = { 471static struct regulator_ops mc13892_sw_regulator_ops = {
481 .is_enabled = mc13xxx_sw_regulator_is_enabled, 472 .is_enabled = mc13xxx_sw_regulator_is_enabled,
482 .list_voltage = mc13xxx_regulator_list_voltage, 473 .list_voltage = mc13xxx_regulator_list_voltage,
483 .set_voltage = mc13892_sw_regulator_set_voltage, 474 .set_voltage_sel = mc13892_sw_regulator_set_voltage_sel,
484 .get_voltage = mc13892_sw_regulator_get_voltage, 475 .get_voltage = mc13892_sw_regulator_get_voltage,
485}; 476};
486 477
diff --git a/drivers/regulator/mc13xxx-regulator-core.c b/drivers/regulator/mc13xxx-regulator-core.c
index 62dcd0a432b..4fa9704739b 100644
--- a/drivers/regulator/mc13xxx-regulator-core.c
+++ b/drivers/regulator/mc13xxx-regulator-core.c
@@ -94,62 +94,18 @@ int mc13xxx_regulator_list_voltage(struct regulator_dev *rdev,
94} 94}
95EXPORT_SYMBOL_GPL(mc13xxx_regulator_list_voltage); 95EXPORT_SYMBOL_GPL(mc13xxx_regulator_list_voltage);
96 96
97int mc13xxx_get_best_voltage_index(struct regulator_dev *rdev, 97static int mc13xxx_regulator_set_voltage_sel(struct regulator_dev *rdev,
98 int min_uV, int max_uV) 98 unsigned selector)
99{ 99{
100 struct mc13xxx_regulator_priv *priv = rdev_get_drvdata(rdev); 100 struct mc13xxx_regulator_priv *priv = rdev_get_drvdata(rdev);
101 struct mc13xxx_regulator *mc13xxx_regulators = priv->mc13xxx_regulators; 101 struct mc13xxx_regulator *mc13xxx_regulators = priv->mc13xxx_regulators;
102 int reg_id = rdev_get_id(rdev); 102 int id = rdev_get_id(rdev);
103 int i;
104 int bestmatch;
105 int bestindex;
106
107 /*
108 * Locate the minimum voltage fitting the criteria on
109 * this regulator. The switchable voltages are not
110 * in strict falling order so we need to check them
111 * all for the best match.
112 */
113 bestmatch = INT_MAX;
114 bestindex = -1;
115 for (i = 0; i < mc13xxx_regulators[reg_id].desc.n_voltages; i++) {
116 if (mc13xxx_regulators[reg_id].voltages[i] >= min_uV &&
117 mc13xxx_regulators[reg_id].voltages[i] < bestmatch) {
118 bestmatch = mc13xxx_regulators[reg_id].voltages[i];
119 bestindex = i;
120 }
121 }
122
123 if (bestindex < 0 || bestmatch > max_uV) {
124 dev_warn(&rdev->dev, "no possible value for %d<=x<=%d uV\n",
125 min_uV, max_uV);
126 return -EINVAL;
127 }
128 return bestindex;
129}
130EXPORT_SYMBOL_GPL(mc13xxx_get_best_voltage_index);
131
132static int mc13xxx_regulator_set_voltage(struct regulator_dev *rdev, int min_uV,
133 int max_uV, unsigned *selector)
134{
135 struct mc13xxx_regulator_priv *priv = rdev_get_drvdata(rdev);
136 struct mc13xxx_regulator *mc13xxx_regulators = priv->mc13xxx_regulators;
137 int value, id = rdev_get_id(rdev);
138 int ret; 103 int ret;
139 104
140 dev_dbg(rdev_get_dev(rdev), "%s id: %d min_uV: %d max_uV: %d\n",
141 __func__, id, min_uV, max_uV);
142
143 /* Find the best index */
144 value = mc13xxx_get_best_voltage_index(rdev, min_uV, max_uV);
145 dev_dbg(rdev_get_dev(rdev), "%s best value: %d\n", __func__, value);
146 if (value < 0)
147 return value;
148
149 mc13xxx_lock(priv->mc13xxx); 105 mc13xxx_lock(priv->mc13xxx);
150 ret = mc13xxx_reg_rmw(priv->mc13xxx, mc13xxx_regulators[id].vsel_reg, 106 ret = mc13xxx_reg_rmw(priv->mc13xxx, mc13xxx_regulators[id].vsel_reg,
151 mc13xxx_regulators[id].vsel_mask, 107 mc13xxx_regulators[id].vsel_mask,
152 value << mc13xxx_regulators[id].vsel_shift); 108 selector << mc13xxx_regulators[id].vsel_shift);
153 mc13xxx_unlock(priv->mc13xxx); 109 mc13xxx_unlock(priv->mc13xxx);
154 110
155 return ret; 111 return ret;
@@ -187,7 +143,7 @@ struct regulator_ops mc13xxx_regulator_ops = {
187 .disable = mc13xxx_regulator_disable, 143 .disable = mc13xxx_regulator_disable,
188 .is_enabled = mc13xxx_regulator_is_enabled, 144 .is_enabled = mc13xxx_regulator_is_enabled,
189 .list_voltage = mc13xxx_regulator_list_voltage, 145 .list_voltage = mc13xxx_regulator_list_voltage,
190 .set_voltage = mc13xxx_regulator_set_voltage, 146 .set_voltage_sel = mc13xxx_regulator_set_voltage_sel,
191 .get_voltage = mc13xxx_regulator_get_voltage, 147 .get_voltage = mc13xxx_regulator_get_voltage,
192}; 148};
193EXPORT_SYMBOL_GPL(mc13xxx_regulator_ops); 149EXPORT_SYMBOL_GPL(mc13xxx_regulator_ops);
diff --git a/drivers/regulator/mc13xxx.h b/drivers/regulator/mc13xxx.h
index b3961c658b0..044aba4d28e 100644
--- a/drivers/regulator/mc13xxx.h
+++ b/drivers/regulator/mc13xxx.h
@@ -35,8 +35,6 @@ struct mc13xxx_regulator_priv {
35 35
36extern int mc13xxx_sw_regulator(struct regulator_dev *rdev); 36extern int mc13xxx_sw_regulator(struct regulator_dev *rdev);
37extern int mc13xxx_sw_regulator_is_enabled(struct regulator_dev *rdev); 37extern int mc13xxx_sw_regulator_is_enabled(struct regulator_dev *rdev);
38extern int mc13xxx_get_best_voltage_index(struct regulator_dev *rdev,
39 int min_uV, int max_uV);
40extern int mc13xxx_regulator_list_voltage(struct regulator_dev *rdev, 38extern int mc13xxx_regulator_list_voltage(struct regulator_dev *rdev,
41 unsigned selector); 39 unsigned selector);
42extern int mc13xxx_fixed_regulator_set_voltage(struct regulator_dev *rdev, 40extern int mc13xxx_fixed_regulator_set_voltage(struct regulator_dev *rdev,