aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAxel Lin <axel.lin@gmail.com>2012-03-12 18:40:48 -0400
committerMark Brown <broonie@opensource.wolfsonmicro.com>2012-03-13 19:19:34 -0400
commit42b5efe4f9aa40b3b0a20149fd7357d9d6c96959 (patch)
tree7282449043edf9ef4bd22efdc5068126063d9448
parent585993932ccc44ab6a8c6dc590a2f3d6b2facb41 (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.c162
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
202static int tps65912_get_ctrl_register(int id) 202static 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
238static int tps65912_get_dcdc_sel_register(struct tps65912_reg *pmic, int id) 212static 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
284static 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 */
726static int __init tps65912_init(void) 605static int __init tps65912_init(void)
727{ 606{
728 return platform_driver_register(&tps65912_driver); 607 return platform_driver_register(&tps65912_driver);
729} 608}
730subsys_initcall(tps65912_init); 609subsys_initcall(tps65912_init);
731 610
732/**
733 * tps65912_cleanup
734 *
735 * Module exit function
736 */
737static void __exit tps65912_cleanup(void) 611static void __exit tps65912_cleanup(void)
738{ 612{
739 platform_driver_unregister(&tps65912_driver); 613 platform_driver_unregister(&tps65912_driver);