diff options
author | Axel Lin <axel.lin@gmail.com> | 2012-03-12 18:40:48 -0400 |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2012-03-13 19:19:34 -0400 |
commit | 42b5efe4f9aa40b3b0a20149fd7357d9d6c96959 (patch) | |
tree | 7282449043edf9ef4bd22efdc5068126063d9448 | |
parent | 585993932ccc44ab6a8c6dc590a2f3d6b2facb41 (diff) |
regulator: tps65912: Use simple equations to get register address
The address of ctrl and sel registers can be calculated by simple equations.
This patch simplifies the implementation in tps65912_get_ctrl_register and
implements tps65912_get_sel_register to replace tps65912_get_dcdc_sel_register
and tps65912_get_ldo_sel_register.
Signed-off-by: Axel Lin <axel.lin@gmail.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
-rw-r--r-- | drivers/regulator/tps65912-regulator.c | 162 |
1 files changed, 18 insertions, 144 deletions
diff --git a/drivers/regulator/tps65912-regulator.c b/drivers/regulator/tps65912-regulator.c index 3ab1722c78b7..ede688b1a56f 100644 --- a/drivers/regulator/tps65912-regulator.c +++ b/drivers/regulator/tps65912-regulator.c | |||
@@ -201,146 +201,30 @@ static unsigned long tps65912_vsel_to_uv_ldo(u8 vsel) | |||
201 | 201 | ||
202 | static int tps65912_get_ctrl_register(int id) | 202 | static int tps65912_get_ctrl_register(int id) |
203 | { | 203 | { |
204 | switch (id) { | 204 | if (id >= TPS65912_REG_DCDC1 && id <= TPS65912_REG_LDO4) |
205 | case TPS65912_REG_DCDC1: | 205 | return id * 3 + TPS65912_DCDC1_AVS; |
206 | return TPS65912_DCDC1_AVS; | 206 | else if (id >= TPS65912_REG_LDO5 && id <= TPS65912_REG_LDO10) |
207 | case TPS65912_REG_DCDC2: | 207 | return id - TPS65912_REG_LDO5 + TPS65912_LDO5; |
208 | return TPS65912_DCDC2_AVS; | 208 | else |
209 | case TPS65912_REG_DCDC3: | ||
210 | return TPS65912_DCDC3_AVS; | ||
211 | case TPS65912_REG_DCDC4: | ||
212 | return TPS65912_DCDC4_AVS; | ||
213 | case TPS65912_REG_LDO1: | ||
214 | return TPS65912_LDO1_AVS; | ||
215 | case TPS65912_REG_LDO2: | ||
216 | return TPS65912_LDO2_AVS; | ||
217 | case TPS65912_REG_LDO3: | ||
218 | return TPS65912_LDO3_AVS; | ||
219 | case TPS65912_REG_LDO4: | ||
220 | return TPS65912_LDO4_AVS; | ||
221 | case TPS65912_REG_LDO5: | ||
222 | return TPS65912_LDO5; | ||
223 | case TPS65912_REG_LDO6: | ||
224 | return TPS65912_LDO6; | ||
225 | case TPS65912_REG_LDO7: | ||
226 | return TPS65912_LDO7; | ||
227 | case TPS65912_REG_LDO8: | ||
228 | return TPS65912_LDO8; | ||
229 | case TPS65912_REG_LDO9: | ||
230 | return TPS65912_LDO9; | ||
231 | case TPS65912_REG_LDO10: | ||
232 | return TPS65912_LDO10; | ||
233 | default: | ||
234 | return -EINVAL; | 209 | return -EINVAL; |
235 | } | ||
236 | } | 210 | } |
237 | 211 | ||
238 | static int tps65912_get_dcdc_sel_register(struct tps65912_reg *pmic, int id) | 212 | static int tps65912_get_sel_register(struct tps65912_reg *pmic, int id) |
239 | { | 213 | { |
240 | struct tps65912 *mfd = pmic->mfd; | 214 | struct tps65912 *mfd = pmic->mfd; |
241 | int opvsel = 0, sr = 0; | 215 | int opvsel; |
242 | u8 reg = 0; | 216 | u8 reg = 0; |
243 | 217 | ||
244 | if (id < TPS65912_REG_DCDC1 || id > TPS65912_REG_DCDC4) | 218 | if (id >= TPS65912_REG_DCDC1 && id <= TPS65912_REG_LDO4) { |
245 | return -EINVAL; | 219 | opvsel = tps65912_reg_read(mfd, id * 3 + TPS65912_DCDC1_OP); |
246 | 220 | if (opvsel & OP_SELREG_MASK) | |
247 | switch (id) { | 221 | reg = id * 3 + TPS65912_DCDC1_AVS; |
248 | case TPS65912_REG_DCDC1: | ||
249 | opvsel = tps65912_reg_read(mfd, TPS65912_DCDC1_OP); | ||
250 | sr = ((opvsel & OP_SELREG_MASK) >> OP_SELREG_SHIFT); | ||
251 | if (sr) | ||
252 | reg = TPS65912_DCDC1_AVS; | ||
253 | else | 222 | else |
254 | reg = TPS65912_DCDC1_OP; | 223 | reg = id * 3 + TPS65912_DCDC1_OP; |
255 | break; | 224 | } else if (id >= TPS65912_REG_LDO5 && id <= TPS65912_REG_LDO10) { |
256 | case TPS65912_REG_DCDC2: | 225 | reg = id - TPS65912_REG_LDO5 + TPS65912_LDO5; |
257 | opvsel = tps65912_reg_read(mfd, TPS65912_DCDC2_OP); | 226 | } else { |
258 | sr = (opvsel & OP_SELREG_MASK) >> OP_SELREG_SHIFT; | ||
259 | if (sr) | ||
260 | reg = TPS65912_DCDC2_AVS; | ||
261 | else | ||
262 | reg = TPS65912_DCDC2_OP; | ||
263 | break; | ||
264 | case TPS65912_REG_DCDC3: | ||
265 | opvsel = tps65912_reg_read(mfd, TPS65912_DCDC3_OP); | ||
266 | sr = (opvsel & OP_SELREG_MASK) >> OP_SELREG_SHIFT; | ||
267 | if (sr) | ||
268 | reg = TPS65912_DCDC3_AVS; | ||
269 | else | ||
270 | reg = TPS65912_DCDC3_OP; | ||
271 | break; | ||
272 | case TPS65912_REG_DCDC4: | ||
273 | opvsel = tps65912_reg_read(mfd, TPS65912_DCDC4_OP); | ||
274 | sr = (opvsel & OP_SELREG_MASK) >> OP_SELREG_SHIFT; | ||
275 | if (sr) | ||
276 | reg = TPS65912_DCDC4_AVS; | ||
277 | else | ||
278 | reg = TPS65912_DCDC4_OP; | ||
279 | break; | ||
280 | } | ||
281 | return reg; | ||
282 | } | ||
283 | |||
284 | static int tps65912_get_ldo_sel_register(struct tps65912_reg *pmic, int id) | ||
285 | { | ||
286 | struct tps65912 *mfd = pmic->mfd; | ||
287 | int opvsel = 0, sr = 0; | ||
288 | u8 reg = 0; | ||
289 | |||
290 | if (id < TPS65912_REG_LDO1 || id > TPS65912_REG_LDO10) | ||
291 | return -EINVAL; | 227 | return -EINVAL; |
292 | |||
293 | switch (id) { | ||
294 | case TPS65912_REG_LDO1: | ||
295 | opvsel = tps65912_reg_read(mfd, TPS65912_LDO1_OP); | ||
296 | sr = (opvsel & OP_SELREG_MASK) >> OP_SELREG_SHIFT; | ||
297 | if (sr) | ||
298 | reg = TPS65912_LDO1_AVS; | ||
299 | else | ||
300 | reg = TPS65912_LDO1_OP; | ||
301 | break; | ||
302 | case TPS65912_REG_LDO2: | ||
303 | opvsel = tps65912_reg_read(mfd, TPS65912_LDO2_OP); | ||
304 | sr = (opvsel & OP_SELREG_MASK) >> OP_SELREG_SHIFT; | ||
305 | if (sr) | ||
306 | reg = TPS65912_LDO2_AVS; | ||
307 | else | ||
308 | reg = TPS65912_LDO2_OP; | ||
309 | break; | ||
310 | case TPS65912_REG_LDO3: | ||
311 | opvsel = tps65912_reg_read(mfd, TPS65912_LDO3_OP); | ||
312 | sr = (opvsel & OP_SELREG_MASK) >> OP_SELREG_SHIFT; | ||
313 | if (sr) | ||
314 | reg = TPS65912_LDO3_AVS; | ||
315 | else | ||
316 | reg = TPS65912_LDO3_OP; | ||
317 | break; | ||
318 | case TPS65912_REG_LDO4: | ||
319 | opvsel = tps65912_reg_read(mfd, TPS65912_LDO4_OP); | ||
320 | sr = (opvsel & OP_SELREG_MASK) >> OP_SELREG_SHIFT; | ||
321 | if (sr) | ||
322 | reg = TPS65912_LDO4_AVS; | ||
323 | else | ||
324 | reg = TPS65912_LDO4_OP; | ||
325 | break; | ||
326 | case TPS65912_REG_LDO5: | ||
327 | reg = TPS65912_LDO5; | ||
328 | break; | ||
329 | case TPS65912_REG_LDO6: | ||
330 | reg = TPS65912_LDO6; | ||
331 | break; | ||
332 | case TPS65912_REG_LDO7: | ||
333 | reg = TPS65912_LDO7; | ||
334 | break; | ||
335 | case TPS65912_REG_LDO8: | ||
336 | reg = TPS65912_LDO8; | ||
337 | break; | ||
338 | case TPS65912_REG_LDO9: | ||
339 | reg = TPS65912_LDO9; | ||
340 | break; | ||
341 | case TPS65912_REG_LDO10: | ||
342 | reg = TPS65912_LDO10; | ||
343 | break; | ||
344 | } | 228 | } |
345 | 229 | ||
346 | return reg; | 230 | return reg; |
@@ -567,7 +451,7 @@ static int tps65912_set_voltage_dcdc_sel(struct regulator_dev *dev, | |||
567 | int value; | 451 | int value; |
568 | u8 reg; | 452 | u8 reg; |
569 | 453 | ||
570 | reg = tps65912_get_dcdc_sel_register(pmic, id); | 454 | reg = tps65912_get_sel_register(pmic, id); |
571 | value = tps65912_reg_read(mfd, reg); | 455 | value = tps65912_reg_read(mfd, reg); |
572 | value &= 0xC0; | 456 | value &= 0xC0; |
573 | return tps65912_reg_write(mfd, reg, selector | value); | 457 | return tps65912_reg_write(mfd, reg, selector | value); |
@@ -581,7 +465,7 @@ static int tps65912_get_voltage_ldo(struct regulator_dev *dev) | |||
581 | int vsel = 0; | 465 | int vsel = 0; |
582 | u8 reg; | 466 | u8 reg; |
583 | 467 | ||
584 | reg = tps65912_get_ldo_sel_register(pmic, id); | 468 | reg = tps65912_get_sel_register(pmic, id); |
585 | vsel = tps65912_reg_read(mfd, reg); | 469 | vsel = tps65912_reg_read(mfd, reg); |
586 | vsel &= 0x3F; | 470 | vsel &= 0x3F; |
587 | 471 | ||
@@ -595,7 +479,7 @@ static int tps65912_set_voltage_ldo_sel(struct regulator_dev *dev, | |||
595 | struct tps65912 *mfd = pmic->mfd; | 479 | struct tps65912 *mfd = pmic->mfd; |
596 | int id = rdev_get_id(dev), reg, value; | 480 | int id = rdev_get_id(dev), reg, value; |
597 | 481 | ||
598 | reg = tps65912_get_ldo_sel_register(pmic, id); | 482 | reg = tps65912_get_sel_register(pmic, id); |
599 | value = tps65912_reg_read(mfd, reg); | 483 | value = tps65912_reg_read(mfd, reg); |
600 | value &= 0xC0; | 484 | value &= 0xC0; |
601 | return tps65912_reg_write(mfd, reg, selector | value); | 485 | return tps65912_reg_write(mfd, reg, selector | value); |
@@ -718,22 +602,12 @@ static struct platform_driver tps65912_driver = { | |||
718 | .remove = __devexit_p(tps65912_remove), | 602 | .remove = __devexit_p(tps65912_remove), |
719 | }; | 603 | }; |
720 | 604 | ||
721 | /** | ||
722 | * tps65912_init | ||
723 | * | ||
724 | * Module init function | ||
725 | */ | ||
726 | static int __init tps65912_init(void) | 605 | static int __init tps65912_init(void) |
727 | { | 606 | { |
728 | return platform_driver_register(&tps65912_driver); | 607 | return platform_driver_register(&tps65912_driver); |
729 | } | 608 | } |
730 | subsys_initcall(tps65912_init); | 609 | subsys_initcall(tps65912_init); |
731 | 610 | ||
732 | /** | ||
733 | * tps65912_cleanup | ||
734 | * | ||
735 | * Module exit function | ||
736 | */ | ||
737 | static void __exit tps65912_cleanup(void) | 611 | static void __exit tps65912_cleanup(void) |
738 | { | 612 | { |
739 | platform_driver_unregister(&tps65912_driver); | 613 | platform_driver_unregister(&tps65912_driver); |