diff options
| author | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2013-02-19 07:42:47 -0500 |
|---|---|---|
| committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2013-02-19 07:42:47 -0500 |
| commit | c7b094828bc1b83eb507f43ebc8f9f8abfb3ec22 (patch) | |
| tree | d342df2f47304199e49e2c1601329ed320067eb6 | |
| parent | 800d290182ddea3d1e79b57711c15639f72f3185 (diff) | |
| parent | e69995d3bfbdc8d30ae3548c69f669139791b739 (diff) | |
Merge remote-tracking branch 'regulator/topic/lp8788' into regulator-next
| -rw-r--r-- | drivers/regulator/lp8788-buck.c | 41 | ||||
| -rw-r--r-- | drivers/regulator/lp8788-ldo.c | 133 |
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 | ||
| 106 | static const u8 buck1_vout_addr[] = { | ||
| 107 | LP8788_BUCK1_VOUT0, LP8788_BUCK1_VOUT1, | ||
| 108 | LP8788_BUCK1_VOUT2, LP8788_BUCK1_VOUT3, | ||
| 109 | }; | ||
| 110 | |||
| 111 | static const u8 buck2_vout_addr[] = { | ||
| 112 | LP8788_BUCK2_VOUT0, LP8788_BUCK2_VOUT1, | ||
| 113 | LP8788_BUCK2_VOUT2, LP8788_BUCK2_VOUT3, | ||
| 114 | }; | ||
| 115 | |||
| 116 | static void lp8788_buck1_set_dvs(struct lp8788_buck *buck) | 106 | static 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 | ||
| 432 | static int lp8788_dvs_gpio_request(struct lp8788_buck *buck, | 422 | static 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 | ||
| 467 | static int lp8788_init_dvs(struct lp8788_buck *buck, enum lp8788_buck_id id) | 458 | static 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 | ||
| 91 | enum lp8788_enable_mode { | ||
| 92 | REGISTER, | ||
| 93 | EXTPIN, | ||
| 94 | }; | ||
| 95 | |||
| 96 | enum lp8788_ldo_id { | 91 | enum 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 */ | ||
| 194 | static enum lp8788_enable_mode | ||
| 195 | lp8788_get_ldo_enable_mode(struct lp8788_ldo *ldo, enum lp8788_ldo_id id) | ||
| 196 | { | ||
