aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaxman Dewangan <ldewangan@nvidia.com>2016-04-22 08:39:41 -0400
committerMark Brown <broonie@kernel.org>2016-04-22 11:26:41 -0400
commit5aa43599daddbe972f955b2357c76866a6f92973 (patch)
tree4aecd5266aeb3bbeaa41e7fdf257fd9b65e158fa
parente7fc278ceb5725070e4e3ecfc2f259ab2101c30e (diff)
regulator: max77620: Add support for device specific ramp rate setting
Maxim advertised the ramp rate of the rail with some recommended design specification like output capacitance of rail should be 2.2uF. This make sure that current change in the rail is within maximum current limit and hence meet the advertised ramp rate. If there is variation in design which causes the rail current to change more that maximum current limit then device applies the current limit. In this case, ramp rate is different than advertised ramp rate. Add device specific settings for ramp rate which need to be configure on device register when measure ramp rate on platform is deviated from advertised ramp rate. In this case, all delay time calculation for voltage change is done with measured ramp rate and device ramp rate is used for configuring the device register. If measured ramp rate in the platform is same as advertised ramp rate then regulator-ramp-delay is used for the device register configuration and ramp time calculation for voltage change. Signed-off-by: Laxman Dewangan <ldewangan@nvidia.com> Signed-off-by: Mark Brown <broonie@kernel.org>
-rw-r--r--drivers/regulator/max77620-regulator.c83
1 files changed, 56 insertions, 27 deletions
diff --git a/drivers/regulator/max77620-regulator.c b/drivers/regulator/max77620-regulator.c
index 73a3356a5c19..321e804aeab0 100644
--- a/drivers/regulator/max77620-regulator.c
+++ b/drivers/regulator/max77620-regulator.c
@@ -81,6 +81,7 @@ struct max77620_regulator_pdata {
81 int suspend_fps_pd_slot; 81 int suspend_fps_pd_slot;
82 int suspend_fps_pu_slot; 82 int suspend_fps_pu_slot;
83 int current_mode; 83 int current_mode;
84 int ramp_rate_setting;
84}; 85};
85 86
86struct max77620_regulator { 87struct max77620_regulator {
@@ -307,6 +308,43 @@ static int max77620_read_slew_rate(struct max77620_regulator *pmic, int id)
307 return 0; 308 return 0;
308} 309}
309 310
311static int max77620_set_slew_rate(struct max77620_regulator *pmic, int id,
312 int slew_rate)
313{
314 struct max77620_regulator_info *rinfo = pmic->rinfo[id];
315 unsigned int val;
316 int ret;
317 u8 mask;
318
319 if (rinfo->type == MAX77620_REGULATOR_TYPE_SD) {
320 if (slew_rate <= 13750)
321 val = 0;
322 else if (slew_rate <= 27500)
323 val = 1;
324 else if (slew_rate <= 55000)
325 val = 2;
326 else
327 val = 3;
328 val <<= MAX77620_SD_SR_SHIFT;
329 mask = MAX77620_SD_SR_MASK;
330 } else {
331 if (slew_rate <= 5000)
332 val = 1;
333 else
334 val = 0;
335 mask = MAX77620_LDO_SLEW_RATE_MASK;
336 }
337
338 ret = regmap_update_bits(pmic->rmap, rinfo->cfg_addr, mask, val);
339 if (ret < 0) {
340 dev_err(pmic->dev, "Regulator %d slew rate set failed: %d\n",
341 id, ret);
342 return ret;
343 }
344
345 return 0;
346}
347
310static int max77620_init_pmic(struct max77620_regulator *pmic, int id) 348static int max77620_init_pmic(struct max77620_regulator *pmic, int id)
311{ 349{
312 struct max77620_regulator_pdata *rpdata = &pmic->reg_pdata[id]; 350 struct max77620_regulator_pdata *rpdata = &pmic->reg_pdata[id];
@@ -351,6 +389,13 @@ static int max77620_init_pmic(struct max77620_regulator *pmic, int id)
351 if (ret < 0) 389 if (ret < 0)
352 return ret; 390 return ret;
353 391
392 if (rpdata->ramp_rate_setting) {
393 ret = max77620_set_slew_rate(pmic, id,
394 rpdata->ramp_rate_setting);
395 if (ret < 0)
396 return ret;
397 }
398
354 return 0; 399 return 0;
355} 400}
356 401
@@ -502,35 +547,16 @@ static int max77620_regulator_set_ramp_delay(struct regulator_dev *rdev,
502{ 547{
503 struct max77620_regulator *pmic = rdev_get_drvdata(rdev); 548 struct max77620_regulator *pmic = rdev_get_drvdata(rdev);
504 int id = rdev_get_id(rdev); 549 int id = rdev_get_id(rdev);
505 struct max77620_regulator_info *rinfo = pmic->rinfo[id]; 550 struct max77620_regulator_pdata *rpdata = &pmic->reg_pdata[id];
506 int ret, val;
507 u8 mask;
508
509 if (rinfo->type == MAX77620_REGULATOR_TYPE_SD) {
510 if (ramp_delay <= 13750)
511 val = 0;
512 else if (ramp_delay <= 27500)
513 val = 1;
514 else if (ramp_delay <= 55000)
515 val = 2;
516 else
517 val = 3;
518 val <<= MAX77620_SD_SR_SHIFT;
519 mask = MAX77620_SD_SR_MASK;
520 } else {
521 if (ramp_delay <= 5000)
522 val = 1;
523 else
524 val = 0;
525 mask = MAX77620_LDO_SLEW_RATE_MASK;
526 }
527 551
528 ret = regmap_update_bits(pmic->rmap, rinfo->cfg_addr, mask, val); 552 /* Device specific ramp rate setting tells that platform has
529 if (ret < 0) 553 * different ramp rate from advertised value. In this case,
530 dev_err(pmic->dev, "Reg 0x%02x update failed: %d\n", 554 * do not configure anything and just return success.
531 rinfo->cfg_addr, ret); 555 */
556 if (rpdata->ramp_rate_setting)
557 return 0;
532 558
533 return ret; 559 return max77620_set_slew_rate(pmic, id, ramp_delay);
534} 560}
535 561
536static int max77620_of_parse_cb(struct device_node *np, 562static int max77620_of_parse_cb(struct device_node *np,
@@ -563,6 +589,9 @@ static int max77620_of_parse_cb(struct device_node *np,
563 np, "maxim,suspend-fps-power-down-slot", &pval); 589 np, "maxim,suspend-fps-power-down-slot", &pval);
564 rpdata->suspend_fps_pd_slot = (!ret) ? pval : -1; 590 rpdata->suspend_fps_pd_slot = (!ret) ? pval : -1;
565 591
592 ret = of_property_read_u32(np, "maxim,ramp-rate-setting", &pval);
593 rpdata->ramp_rate_setting = (!ret) ? pval : 0;
594
566 return max77620_init_pmic(pmic, desc->id); 595 return max77620_init_pmic(pmic, desc->id);
567} 596}
568 597