aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Brown <broonie@opensource.wolfsonmicro.com>2013-02-19 07:42:47 -0500
committerMark Brown <broonie@opensource.wolfsonmicro.com>2013-02-19 07:42:47 -0500
commitc7b094828bc1b83eb507f43ebc8f9f8abfb3ec22 (patch)
treed342df2f47304199e49e2c1601329ed320067eb6
parent800d290182ddea3d1e79b57711c15639f72f3185 (diff)
parente69995d3bfbdc8d30ae3548c69f669139791b739 (diff)
Merge remote-tracking branch 'regulator/topic/lp8788' into regulator-next
-rw-r--r--drivers/regulator/lp8788-buck.c41
-rw-r--r--drivers/regulator/lp8788-ldo.c133
2 files changed, 46 insertions, 128 deletions
diff --git a/drivers/regulator/lp8788-buck.c b/drivers/regulator/lp8788-buck.c
index aef3f2b0c5ea..97891a7ea7b2 100644
--- a/drivers/regulator/lp8788-buck.c
+++ b/drivers/regulator/lp8788-buck.c
@@ -103,16 +103,6 @@ static const int lp8788_buck_vtbl[] = {
103 1950000, 2000000, 103 1950000, 2000000,
104}; 104};
105 105
106static const u8 buck1_vout_addr[] = {
107 LP8788_BUCK1_VOUT0, LP8788_BUCK1_VOUT1,
108 LP8788_BUCK1_VOUT2, LP8788_BUCK1_VOUT3,
109};
110
111static const u8 buck2_vout_addr[] = {
112 LP8788_BUCK2_VOUT0, LP8788_BUCK2_VOUT1,
113 LP8788_BUCK2_VOUT2, LP8788_BUCK2_VOUT3,
114};
115
116static void lp8788_buck1_set_dvs(struct lp8788_buck *buck) 106static void lp8788_buck1_set_dvs(struct lp8788_buck *buck)
117{ 107{
118 struct lp8788_buck1_dvs *dvs = (struct lp8788_buck1_dvs *)buck->dvs; 108 struct lp8788_buck1_dvs *dvs = (struct lp8788_buck1_dvs *)buck->dvs;
@@ -235,7 +225,7 @@ static u8 lp8788_select_buck_vout_addr(struct lp8788_buck *buck,
235 lp8788_read_byte(buck->lp, LP8788_BUCK_DVS_SEL, &val); 225 lp8788_read_byte(buck->lp, LP8788_BUCK_DVS_SEL, &val);
236 idx = (val & LP8788_BUCK1_DVS_M) >> LP8788_BUCK1_DVS_S; 226 idx = (val & LP8788_BUCK1_DVS_M) >> LP8788_BUCK1_DVS_S;
237 } 227 }
238 addr = buck1_vout_addr[idx]; 228 addr = LP8788_BUCK1_VOUT0 + idx;
239 break; 229 break;
240 case BUCK2: 230 case BUCK2:
241 if (mode == EXTPIN) { 231 if (mode == EXTPIN) {
@@ -258,7 +248,7 @@ static u8 lp8788_select_buck_vout_addr(struct lp8788_buck *buck,
258 lp8788_read_byte(buck->lp, LP8788_BUCK_DVS_SEL, &val); 248 lp8788_read_byte(buck->lp, LP8788_BUCK_DVS_SEL, &val);
259 idx = (val & LP8788_BUCK2_DVS_M) >> LP8788_BUCK2_DVS_S; 249 idx = (val & LP8788_BUCK2_DVS_M) >> LP8788_BUCK2_DVS_S;
260 } 250 }
261 addr = buck2_vout_addr[idx]; 251 addr = LP8788_BUCK2_VOUT0 + idx;
262 break; 252 break;
263 default: 253 default:
264 goto err; 254 goto err;
@@ -429,7 +419,8 @@ static struct regulator_desc lp8788_buck_desc[] = {
429 }, 419 },
430}; 420};
431 421
432static int lp8788_dvs_gpio_request(struct lp8788_buck *buck, 422static int lp8788_dvs_gpio_request(struct platform_device *pdev,
423 struct lp8788_buck *buck,
433 enum lp8788_buck_id id) 424 enum lp8788_buck_id id)
434{ 425{
435 struct lp8788_platform_data *pdata = buck->lp->pdata; 426 struct lp8788_platform_data *pdata = buck->lp->pdata;
@@ -440,7 +431,7 @@ static int lp8788_dvs_gpio_request(struct lp8788_buck *buck,
440 switch (id) { 431 switch (id) {
441 case BUCK1: 432 case BUCK1:
442 gpio = pdata->buck1_dvs->gpio; 433 gpio = pdata->buck1_dvs->gpio;
443 ret = devm_gpio_request_one(buck->lp->dev, gpio, DVS_LOW, 434 ret = devm_gpio_request_one(&pdev->dev, gpio, DVS_LOW,
444 b1_name); 435 b1_name);
445 if (ret) 436 if (ret)
446 return ret; 437 return ret;
@@ -448,9 +439,9 @@ static int lp8788_dvs_gpio_request(struct lp8788_buck *buck,
448 buck->dvs = pdata->buck1_dvs; 439 buck->dvs = pdata->buck1_dvs;
449 break; 440 break;
450 case BUCK2: 441 case BUCK2:
451 for (i = 0 ; i < LP8788_NUM_BUCK2_DVS ; i++) { 442 for (i = 0; i < LP8788_NUM_BUCK2_DVS; i++) {
452 gpio = pdata->buck2_dvs->gpio[i]; 443 gpio = pdata->buck2_dvs->gpio[i];
453 ret = devm_gpio_request_one(buck->lp->dev, gpio, 444 ret = devm_gpio_request_one(&pdev->dev, gpio,
454 DVS_LOW, b2_name[i]); 445 DVS_LOW, b2_name[i]);
455 if (ret) 446 if (ret)
456 return ret; 447 return ret;
@@ -464,7 +455,8 @@ static int lp8788_dvs_gpio_request(struct lp8788_buck *buck,
464 return 0; 455 return 0;
465} 456}
466 457
467static int lp8788_init_dvs(struct lp8788_buck *buck, enum lp8788_buck_id id) 458static int lp8788_init_dvs(struct platform_device *pdev,
459 struct lp8788_buck *buck, enum lp8788_buck_id id)
468{ 460{
469 struct lp8788_platform_data *pdata = buck->lp->pdata; 461 struct lp8788_platform_data *pdata = buck->lp->pdata;
470 u8 mask[] = { LP8788_BUCK1_DVS_SEL_M, LP8788_BUCK2_DVS_SEL_M }; 462 u8 mask[] = { LP8788_BUCK1_DVS_SEL_M, LP8788_BUCK2_DVS_SEL_M };
@@ -472,7 +464,7 @@ static int lp8788_init_dvs(struct lp8788_buck *buck, enum lp8788_buck_id id)
472 u8 default_dvs_mode[] = { LP8788_BUCK1_DVS_I2C, LP8788_BUCK2_DVS_I2C }; 464 u8 default_dvs_mode[] = { LP8788_BUCK1_DVS_I2C, LP8788_BUCK2_DVS_I2C };
473 465
474 /* no dvs for buck3, 4 */ 466 /* no dvs for buck3, 4 */
475 if (id == BUCK3 || id == BUCK4) 467 if (id > BUCK2)
476 return 0; 468 return 0;
477 469
478 /* no dvs platform data, then dvs will be selected by I2C registers */ 470 /* no dvs platform data, then dvs will be selected by I2C registers */
@@ -483,7 +475,7 @@ static int lp8788_init_dvs(struct lp8788_buck *buck, enum lp8788_buck_id id)
483 (id == BUCK2 && !pdata->buck2_dvs)) 475 (id == BUCK2 && !pdata->buck2_dvs))
484 goto set_default_dvs_mode; 476 goto set_default_dvs_mode;
485 477
486 if (lp8788_dvs_gpio_request(buck, id)) 478 if (lp8788_dvs_gpio_request(pdev, buck, id))
487 goto set_default_dvs_mode; 479 goto set_default_dvs_mode;
488 480
489 return lp8788_update_bits(buck->lp, LP8788_BUCK_DVS_SEL, mask[id], 481 return lp8788_update_bits(buck->lp, LP8788_BUCK_DVS_SEL, mask[id],
@@ -503,17 +495,20 @@ static int lp8788_buck_probe(struct platform_device *pdev)
503 struct regulator_dev *rdev; 495 struct regulator_dev *rdev;
504 int ret; 496 int ret;
505 497
506 buck = devm_kzalloc(lp->dev, sizeof(struct lp8788_buck), GFP_KERNEL); 498 if (id >= LP8788_NUM_BUCKS)
499 return -EINVAL;
500
501 buck = devm_kzalloc(&pdev->dev, sizeof(struct lp8788_buck), GFP_KERNEL);
507 if (!buck) 502 if (!buck)
508 return -ENOMEM; 503 return -ENOMEM;
509 504
510 buck->lp = lp; 505 buck->lp = lp;
511 506
512 ret = lp8788_init_dvs(buck, id); 507 ret = lp8788_init_dvs(pdev, buck, id);
513 if (ret) 508 if (ret)
514 return ret; 509 return ret;
515 510
516 cfg.dev = lp->dev; 511 cfg.dev = pdev->dev.parent;
517 cfg.init_data = lp->pdata ? lp->pdata->buck_data[id] : NULL; 512 cfg.init_data = lp->pdata ? lp->pdata->buck_data[id] : NULL;
518 cfg.driver_data = buck; 513 cfg.driver_data = buck;
519 cfg.regmap = lp->regmap; 514 cfg.regmap = lp->regmap;
@@ -521,7 +516,7 @@ static int lp8788_buck_probe(struct platform_device *pdev)
521 rdev = regulator_register(&lp8788_buck_desc[id], &cfg); 516 rdev = regulator_register(&lp8788_buck_desc[id], &cfg);
522 if (IS_ERR(rdev)) { 517 if (IS_ERR(rdev)) {
523 ret = PTR_ERR(rdev); 518 ret = PTR_ERR(rdev);
524 dev_err(lp->dev, "BUCK%d regulator register err = %d\n", 519 dev_err(&pdev->dev, "BUCK%d regulator register err = %d\n",
525 id + 1, ret); 520 id + 1, ret);
526 return ret; 521 return ret;
527 } 522 }
diff --git a/drivers/regulator/lp8788-ldo.c b/drivers/regulator/lp8788-ldo.c
index 3792741708ce..cd5a14ad9263 100644
--- a/drivers/regulator/lp8788-ldo.c
+++ b/drivers/regulator/lp8788-ldo.c
@@ -88,11 +88,6 @@
88#define ENABLE GPIOF_OUT_INIT_HIGH 88#define ENABLE GPIOF_OUT_INIT_HIGH
89#define DISABLE GPIOF_OUT_INIT_LOW 89#define DISABLE GPIOF_OUT_INIT_LOW
90 90
91enum lp8788_enable_mode {
92 REGISTER,
93 EXTPIN,
94};
95
96enum lp8788_ldo_id { 91enum lp8788_ldo_id {
97 DLDO1, 92 DLDO1,
98 DLDO2, 93 DLDO2,
@@ -189,114 +184,38 @@ static enum lp8788_ldo_id lp8788_aldo_id[] = {
189 ALDO10, 184 ALDO10,
190}; 185};
191 186
192/* DLDO 7, 9 and 11, ALDO 1 ~ 5 and 7
193 : can be enabled either by external pin or by i2c register */
194static enum lp8788_enable_mode
195lp8788_get_ldo_enable_mode(struct lp8788_ldo *ldo, enum lp8788_ldo_id id)
196{