aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorMark Brown <broonie@opensource.wolfsonmicro.com>2013-02-19 07:42:29 -0500
committerMark Brown <broonie@opensource.wolfsonmicro.com>2013-02-19 07:42:29 -0500
commitfc221525bd63887f74c18708ee1d654d019fa8c3 (patch)
treebcb2eb985fcc152ab4441cc82690930c2bce39a3 /drivers
parent0dbf165ec43dd7f61fc0d596083c136fde01530f (diff)
parentc6f0a0efb163b7d2e879f92197ab5e674868358e (diff)
Merge remote-tracking branch 'regulator/topic/apply' into regulator-next
Diffstat (limited to 'drivers')
-rw-r--r--drivers/regulator/88pm8607.c37
-rw-r--r--drivers/regulator/core.c12
-rw-r--r--drivers/regulator/da9052-regulator.c41
-rw-r--r--drivers/regulator/tps6586x-regulator.c54
4 files changed, 33 insertions, 111 deletions
diff --git a/drivers/regulator/88pm8607.c b/drivers/regulator/88pm8607.c
index 2b557119adad..a957e8c53205 100644
--- a/drivers/regulator/88pm8607.c
+++ b/drivers/regulator/88pm8607.c
@@ -30,8 +30,6 @@ struct pm8607_regulator_info {
30 unsigned int *vol_table; 30 unsigned int *vol_table;
31 unsigned int *vol_suspend; 31 unsigned int *vol_suspend;
32 32
33 int update_reg;
34 int update_bit;
35 int slope_double; 33 int slope_double;
36}; 34};
37 35
@@ -222,29 +220,6 @@ static int pm8607_list_voltage(struct regulator_dev *rdev, unsigned index)
222 return ret; 220 return ret;
223} 221}
224 222
225static int pm8607_set_voltage_sel(struct regulator_dev *rdev, unsigned selector)
226{
227 struct pm8607_regulator_info *info = rdev_get_drvdata(rdev);
228 uint8_t val;
229 int ret;
230
231 val = (uint8_t)(selector << (ffs(rdev->desc->vsel_mask) - 1));
232
233 ret = pm860x_set_bits(info->i2c, rdev->desc->vsel_reg,
234 rdev->desc->vsel_mask, val);
235 if (ret)
236 return ret;
237 switch (info->desc.id) {
238 case PM8607_ID_BUCK1:
239 case PM8607_ID_BUCK3:
240 ret = pm860x_set_bits(info->i2c, info->update_reg,
241 1 << info->update_bit,
242 1 << info->update_bit);
243 break;
244 }
245 return ret;
246}
247
248static int pm8606_preg_enable(struct regulator_dev *rdev) 223static int pm8606_preg_enable(struct regulator_dev *rdev)
249{ 224{
250 struct pm8607_regulator_info *info = rdev_get_drvdata(rdev); 225 struct pm8607_regulator_info *info = rdev_get_drvdata(rdev);
@@ -276,7 +251,7 @@ static int pm8606_preg_is_enabled(struct regulator_dev *rdev)
276 251
277static struct regulator_ops pm8607_regulator_ops = { 252static struct regulator_ops pm8607_regulator_ops = {
278 .list_voltage = pm8607_list_voltage, 253 .list_voltage = pm8607_list_voltage,
279 .set_voltage_sel = pm8607_set_voltage_sel, 254 .set_voltage_sel = regulator_set_voltage_sel_regmap,
280 .get_voltage_sel = regulator_get_voltage_sel_regmap, 255 .get_voltage_sel = regulator_get_voltage_sel_regmap,
281 .enable = regulator_enable_regmap, 256 .enable = regulator_enable_regmap,
282 .disable = regulator_disable_regmap, 257 .disable = regulator_disable_regmap,
@@ -313,11 +288,11 @@ static struct regulator_ops pm8606_preg_ops = {
313 .n_voltages = ARRAY_SIZE(vreg##_table), \ 288 .n_voltages = ARRAY_SIZE(vreg##_table), \
314 .vsel_reg = PM8607_##vreg, \ 289 .vsel_reg = PM8607_##vreg, \
315 .vsel_mask = ARRAY_SIZE(vreg##_table) - 1, \ 290 .vsel_mask = ARRAY_SIZE(vreg##_table) - 1, \
291 .apply_reg = PM8607_##ureg, \
292 .apply_bit = (ubit), \
316 .enable_reg = PM8607_##ereg, \ 293 .enable_reg = PM8607_##ereg, \
317 .enable_mask = 1 << (ebit), \ 294 .enable_mask = 1 << (ebit), \
318 }, \ 295 }, \
319 .update_reg = PM8607_##ureg, \
320 .update_bit = (ubit), \
321 .slope_double = (0), \ 296 .slope_double = (0), \
322 .vol_table = (unsigned int *)&vreg##_table, \ 297 .vol_table = (unsigned int *)&vreg##_table, \
323 .vol_suspend = (unsigned int *)&vreg##_suspend_table, \ 298 .vol_suspend = (unsigned int *)&vreg##_suspend_table, \
@@ -343,9 +318,9 @@ static struct regulator_ops pm8606_preg_ops = {
343} 318}
344 319
345static struct pm8607_regulator_info pm8607_regulator_info[] = { 320static struct pm8607_regulator_info pm8607_regulator_info[] = {
346 PM8607_DVC(BUCK1, GO, 0, SUPPLIES_EN11, 0), 321 PM8607_DVC(BUCK1, GO, BIT(0), SUPPLIES_EN11, 0),
347 PM8607_DVC(BUCK2, GO, 1, SUPPLIES_EN11, 1), 322 PM8607_DVC(BUCK2, GO, BIT(1), SUPPLIES_EN11, 1),
348 PM8607_DVC(BUCK3, GO, 2, SUPPLIES_EN11, 2), 323 PM8607_DVC(BUCK3, GO, BIT(2), SUPPLIES_EN11, 2),
349 324
350 PM8607_LDO(1, LDO1, 0, SUPPLIES_EN11, 3), 325 PM8607_LDO(1, LDO1, 0, SUPPLIES_EN11, 3),
351 PM8607_LDO(2, LDO2, 0, SUPPLIES_EN11, 4), 326 PM8607_LDO(2, LDO2, 0, SUPPLIES_EN11, 4),
diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
index 278584302f2d..de47880db203 100644
--- a/drivers/regulator/core.c
+++ b/drivers/regulator/core.c
@@ -2080,10 +2080,20 @@ EXPORT_SYMBOL_GPL(regulator_get_voltage_sel_regmap);
2080 */ 2080 */
2081int regulator_set_voltage_sel_regmap(struct regulator_dev *rdev, unsigned sel) 2081int regulator_set_voltage_sel_regmap(struct regulator_dev *rdev, unsigned sel)
2082{ 2082{
2083 int ret;
2084
2083 sel <<= ffs(rdev->desc->vsel_mask) - 1; 2085 sel <<= ffs(rdev->desc->vsel_mask) - 1;
2084 2086
2085 return regmap_update_bits(rdev->regmap, rdev->desc->vsel_reg, 2087 ret = regmap_update_bits(rdev->regmap, rdev->desc->vsel_reg,
2086 rdev->desc->vsel_mask, sel); 2088 rdev->desc->vsel_mask, sel);
2089 if (ret)
2090 return ret;
2091
2092 if (rdev->desc->apply_bit)
2093 ret = regmap_update_bits(rdev->regmap, rdev->desc->apply_reg,
2094 rdev->desc->apply_bit,
2095 rdev->desc->apply_bit);
2096 return ret;
2087} 2097}
2088EXPORT_SYMBOL_GPL(regulator_set_voltage_sel_regmap); 2098EXPORT_SYMBOL_GPL(regulator_set_voltage_sel_regmap);
2089 2099
diff --git a/drivers/regulator/da9052-regulator.c b/drivers/regulator/da9052-regulator.c
index d0963090442d..c6d8651fd329 100644
--- a/drivers/regulator/da9052-regulator.c
+++ b/drivers/regulator/da9052-regulator.c
@@ -70,7 +70,6 @@ struct da9052_regulator_info {
70 int step_uV; 70 int step_uV;
71 int min_uV; 71 int min_uV;
72 int max_uV; 72 int max_uV;
73 unsigned char activate_bit;
74}; 73};
75 74
76struct da9052_regulator { 75struct da9052_regulator {
@@ -210,36 +209,6 @@ static int da9052_map_voltage(struct regulator_dev *rdev,
210 return sel; 209 return sel;
211} 210}
212 211
213static int da9052_regulator_set_voltage_sel(struct regulator_dev *rdev,
214 unsigned int selector)
215{
216 struct da9052_regulator *regulator = rdev_get_drvdata(rdev);
217 struct da9052_regulator_info *info = regulator->info;
218 int id = rdev_get_id(rdev);
219 int ret;
220
221 ret = da9052_reg_update(regulator->da9052, rdev->desc->vsel_reg,
222 rdev->desc->vsel_mask, selector);
223 if (ret < 0)
224 return ret;
225
226 /* Some LDOs and DCDCs are DVC controlled which requires enabling of
227 * the activate bit to implment the changes on the output.
228 */
229 switch (id) {
230 case DA9052_ID_BUCK1:
231 case DA9052_ID_BUCK2:
232 case DA9052_ID_BUCK3:
233 case DA9052_ID_LDO2:
234 case DA9052_ID_LDO3:
235 ret = da9052_reg_update(regulator->da9052, DA9052_SUPPLY_REG,
236 info->activate_bit, info->activate_bit);
237 break;
238 }
239
240 return ret;
241}
242
243static struct regulator_ops da9052_dcdc_ops = { 212static struct regulator_ops da9052_dcdc_ops = {
244 .get_current_limit = da9052_dcdc_get_current_limit, 213 .get_current_limit = da9052_dcdc_get_current_limit,
245 .set_current_limit = da9052_dcdc_set_current_limit, 214 .set_current_limit = da9052_dcdc_set_current_limit,
@@ -247,7 +216,7 @@ static struct regulator_ops da9052_dcdc_ops = {
247 .list_voltage = da9052_list_voltage, 216 .list_voltage = da9052_list_voltage,
248 .map_voltage = da9052_map_voltage, 217 .map_voltage = da9052_map_voltage,
249 .get_voltage_sel = regulator_get_voltage_sel_regmap, 218 .get_voltage_sel = regulator_get_voltage_sel_regmap,
250 .set_voltage_sel = da9052_regulator_set_voltage_sel, 219 .set_voltage_sel = regulator_set_voltage_sel_regmap,
251 .is_enabled = regulator_is_enabled_regmap, 220 .is_enabled = regulator_is_enabled_regmap,
252 .enable = regulator_enable_regmap, 221 .enable = regulator_enable_regmap,
253 .disable = regulator_disable_regmap, 222 .disable = regulator_disable_regmap,
@@ -257,7 +226,7 @@ static struct regulator_ops da9052_ldo_ops = {
257 .list_voltage = da9052_list_voltage, 226 .list_voltage = da9052_list_voltage,
258 .map_voltage = da9052_map_voltage, 227 .map_voltage = da9052_map_voltage,
259 .get_voltage_sel = regulator_get_voltage_sel_regmap, 228 .get_voltage_sel = regulator_get_voltage_sel_regmap,
260 .set_voltage_sel = da9052_regulator_set_voltage_sel, 229 .set_voltage_sel = regulator_set_voltage_sel_regmap,
261 .is_enabled = regulator_is_enabled_regmap, 230 .is_enabled = regulator_is_enabled_regmap,
262 .enable = regulator_enable_regmap, 231 .enable = regulator_enable_regmap,
263 .disable = regulator_disable_regmap, 232 .disable = regulator_disable_regmap,
@@ -274,13 +243,14 @@ static struct regulator_ops da9052_ldo_ops = {
274 .owner = THIS_MODULE,\ 243 .owner = THIS_MODULE,\
275 .vsel_reg = DA9052_BUCKCORE_REG + DA9052_ID_##_id, \ 244 .vsel_reg = DA9052_BUCKCORE_REG + DA9052_ID_##_id, \
276 .vsel_mask = (1 << (sbits)) - 1,\ 245 .vsel_mask = (1 << (sbits)) - 1,\
246 .apply_reg = DA9052_SUPPLY_REG, \
247 .apply_bit = (abits), \
277 .enable_reg = DA9052_BUCKCORE_REG + DA9052_ID_##_id, \ 248 .enable_reg = DA9052_BUCKCORE_REG + DA9052_ID_##_id, \
278 .enable_mask = 1 << (ebits),\ 249 .enable_mask = 1 << (ebits),\
279 },\ 250 },\
280 .min_uV = (min) * 1000,\ 251 .min_uV = (min) * 1000,\
281 .max_uV = (max) * 1000,\ 252 .max_uV = (max) * 1000,\
282 .step_uV = (step) * 1000,\ 253 .step_uV = (step) * 1000,\
283 .activate_bit = (abits),\
284} 254}
285 255
286#define DA9052_DCDC(_id, step, min, max, sbits, ebits, abits) \ 256#define DA9052_DCDC(_id, step, min, max, sbits, ebits, abits) \
@@ -294,13 +264,14 @@ static struct regulator_ops da9052_ldo_ops = {
294 .owner = THIS_MODULE,\ 264 .owner = THIS_MODULE,\
295 .vsel_reg = DA9052_BUCKCORE_REG + DA9052_ID_##_id, \ 265 .vsel_reg = DA9052_BUCKCORE_REG + DA9052_ID_##_id, \
296 .vsel_mask = (1 << (sbits)) - 1,\ 266 .vsel_mask = (1 << (sbits)) - 1,\
267 .apply_reg = DA9052_SUPPLY_REG, \
268 .apply_bit = (abits), \
297 .enable_reg = DA9052_BUCKCORE_REG + DA9052_ID_##_id, \ 269 .enable_reg = DA9052_BUCKCORE_REG + DA9052_ID_##_id, \
298 .enable_mask = 1 << (ebits),\ 270 .enable_mask = 1 << (ebits),\
299 },\ 271 },\
300 .min_uV = (min) * 1000,\ 272 .min_uV = (min) * 1000,\
301 .max_uV = (max) * 1000,\ 273 .max_uV = (max) * 1000,\
302 .step_uV = (step) * 1000,\ 274 .step_uV = (step) * 1000,\
303 .activate_bit = (abits),\
304} 275}
305 276
306static struct da9052_regulator_info da9052_regulator_info[] = { 277static struct da9052_regulator_info da9052_regulator_info[] = {
diff --git a/drivers/regulator/tps6586x-regulator.c b/drivers/regulator/tps6586x-regulator.c
index f86da672c758..e68382d0e1ea 100644
--- a/drivers/regulator/tps6586x-regulator.c
+++ b/drivers/regulator/tps6586x-regulator.c
@@ -61,10 +61,6 @@ struct tps6586x_regulator {
61 61
62 int enable_bit[2]; 62 int enable_bit[2];
63 int enable_reg[2]; 63 int enable_reg[2];
64
65 /* for DVM regulators */
66 int go_reg;
67 int go_bit;
68}; 64};
69 65
70static inline struct device *to_tps6586x_dev(struct regulator_dev *rdev) 66static inline struct device *to_tps6586x_dev(struct regulator_dev *rdev)
@@ -72,37 +68,10 @@ static inline struct device *to_tps6586x_dev(struct regulator_dev *rdev)
72 return rdev_get_dev(rdev)->parent; 68 return rdev_get_dev(rdev)->parent;
73} 69}
74 70
75static int tps6586x_set_voltage_sel(struct regulator_dev *rdev,
76 unsigned selector)
77{
78 struct tps6586x_regulator *ri = rdev_get_drvdata(rdev);
79 struct device *parent = to_tps6586x_dev(rdev);
80 int ret, val, rid = rdev_get_id(rdev);
81 uint8_t mask;
82
83 val = selector << (ffs(rdev->desc->vsel_mask) - 1);
84 mask = rdev->desc->vsel_mask;
85
86 ret = tps6586x_update(parent, rdev->desc->vsel_reg, val, mask);
87 if (ret)
88 return ret;
89
90 /* Update go bit for DVM regulators */
91 switch (rid) {
92 case TPS6586X_ID_LDO_2:
93 case TPS6586X_ID_LDO_4:
94 case TPS6586X_ID_SM_0:
95 case TPS6586X_ID_SM_1:
96 ret = tps6586x_set_bits(parent, ri->go_reg, 1 << ri->go_bit);
97 break;
98 }
99 return ret;
100}
101
102static struct regulator_ops tps6586x_regulator_ops = { 71static struct regulator_ops tps6586x_regulator_ops = {
103 .list_voltage = regulator_list_voltage_table, 72 .list_voltage = regulator_list_voltage_table,
104 .get_voltage_sel = regulator_get_voltage_sel_regmap, 73 .get_voltage_sel = regulator_get_voltage_sel_regmap,
105 .set_voltage_sel = tps6586x_set_voltage_sel, 74 .set_voltage_sel = regulator_set_voltage_sel_regmap,
106 75
107 .is_enabled = regulator_is_enabled_regmap, 76 .is_enabled = regulator_is_enabled_regmap,
108 .enable = regulator_enable_regmap, 77 .enable = regulator_enable_regmap,
@@ -142,7 +111,7 @@ static const unsigned int tps6586x_dvm_voltages[] = {
142}; 111};
143 112
144#define TPS6586X_REGULATOR(_id, _pin_name, vdata, vreg, shift, nbits, \ 113#define TPS6586X_REGULATOR(_id, _pin_name, vdata, vreg, shift, nbits, \
145 ereg0, ebit0, ereg1, ebit1) \ 114 ereg0, ebit0, ereg1, ebit1, goreg, gobit) \
146 .desc = { \ 115 .desc = { \
147 .supply_name = _pin_name, \ 116 .supply_name = _pin_name, \
148 .name = "REG-" #_id, \ 117 .name = "REG-" #_id, \
@@ -156,29 +125,26 @@ static const unsigned int tps6586x_dvm_voltages[] = {
156 .enable_mask = 1 << (ebit0), \ 125 .enable_mask = 1 << (ebit0), \
157 .vsel_reg = TPS6586X_##vreg, \ 126 .vsel_reg = TPS6586X_##vreg, \
158 .vsel_mask = ((1 << (nbits)) - 1) << (shift), \ 127 .vsel_mask = ((1 << (nbits)) - 1) << (shift), \
128 .apply_reg = (goreg), \
129 .apply_bit = (gobit), \
159 }, \ 130 }, \
160 .enable_reg[0] = TPS6586X_SUPPLY##ereg0, \ 131 .enable_reg[0] = TPS6586X_SUPPLY##ereg0, \
161 .enable_bit[0] = (ebit0), \ 132 .enable_bit[0] = (ebit0), \
162 .enable_reg[1] = TPS6586X_SUPPLY##ereg1, \ 133 .enable_reg[1] = TPS6586X_SUPPLY##ereg1, \
163 .enable_bit[1] = (ebit1), 134 .enable_bit[1] = (ebit1),
164 135
165#define TPS6586X_REGULATOR_DVM_GOREG(goreg, gobit) \
166 .go_reg = TPS6586X_##goreg, \
167 .go_bit = (gobit),
168
169#define TPS6586X_LDO(_id, _pname, vdata, vreg, shift, nbits, \ 136#define TPS6586X_LDO(_id, _pname, vdata, vreg, shift, nbits, \
170 ereg0, ebit0, ereg1, ebit1) \ 137 ereg0, ebit0, ereg1, ebit1) \
171{ \ 138{ \
172 TPS6586X_REGULATOR(_id, _pname, vdata, vreg, shift, nbits, \ 139 TPS6586X_REGULATOR(_id, _pname, vdata, vreg, shift, nbits, \
173 ereg0, ebit0, ereg1, ebit1) \ 140 ereg0, ebit0, ereg1, ebit1, 0, 0) \
174} 141}
175 142
176#define TPS6586X_DVM(_id, _pname, vdata, vreg, shift, nbits, \ 143#define TPS6586X_DVM(_id, _pname, vdata, vreg, shift, nbits, \
177 ereg0, ebit0, ereg1, ebit1, goreg, gobit) \ 144 ereg0, ebit0, ereg1, ebit1, goreg, gobit) \
178{ \ 145{ \
179 TPS6586X_REGULATOR(_id, _pname, vdata, vreg, shift, nbits, \ 146 TPS6586X_REGULATOR(_id, _pname, vdata, vreg, shift, nbits, \
180 ereg0, ebit0, ereg1, ebit1) \ 147 ereg0, ebit0, ereg1, ebit1, goreg, gobit) \
181 TPS6586X_REGULATOR_DVM_GOREG(goreg, gobit) \
182} 148}
183 149
184#define TPS6586X_SYS_REGULATOR() \ 150#define TPS6586X_SYS_REGULATOR() \
@@ -207,13 +173,13 @@ static struct tps6586x_regulator tps6586x_regulator[] = {
207 TPS6586X_LDO(SM_2, "vin-sm2", sm2, SUPPLYV2, 0, 5, ENC, 7, END, 7), 173 TPS6586X_LDO(SM_2, "vin-sm2", sm2, SUPPLYV2, 0, 5, ENC, 7, END, 7),
208 174
209 TPS6586X_DVM(LDO_2, "vinldo23", dvm, LDO2BV1, 0, 5, ENA, 3, 175 TPS6586X_DVM(LDO_2, "vinldo23", dvm, LDO2BV1, 0, 5, ENA, 3,
210 ENB, 3, VCC2, 6), 176 ENB, 3, TPS6586X_VCC2, BIT(6)),
211 TPS6586X_DVM(LDO_4, "vinldo4", ldo4, LDO4V1, 0, 5, ENC, 3, 177 TPS6586X_DVM(LDO_4, "vinldo4", ldo4, LDO4V1, 0, 5, ENC, 3,
212 END, 3, VCC1, 6), 178 END, 3, TPS6586X_VCC1, BIT(6)),
213 TPS6586X_DVM(SM_0, "vin-sm0", dvm, SM0V1, 0, 5, ENA, 1, 179 TPS6586X_DVM(SM_0, "vin-sm0", dvm, SM0V1, 0, 5, ENA, 1,
214 ENB, 1, VCC1, 2), 180 ENB, 1, TPS6586X_VCC1, BIT(2)),
215 TPS6586X_DVM(SM_1, "vin-sm1", dvm, SM1V1, 0, 5, ENA, 0, 181 TPS6586X_DVM(SM_1, "vin-sm1", dvm, SM1V1, 0, 5, ENA, 0,
216 ENB, 0, VCC1, 0), 182 ENB, 0, TPS6586X_VCC1, BIT(0)),
217}; 183};
218 184
219/* 185/*