aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaxman Dewangan <ldewangan@nvidia.com>2013-04-17 05:43:13 -0400
committerMark Brown <broonie@opensource.wolfsonmicro.com>2013-04-17 10:05:19 -0400
commit17c11a7603496949989ed286ed218a9e645b6259 (patch)
treec6b66dd199b2e0c92deea8dd16ae401d06ad003c
parentaa07f02793ec149d560142f25af0243fff84208b (diff)
regulator: palmas: add support for LDO8 tracking mode
LDO8 of Palma device like tps65913 support the tracking mode on which LDO8 track the SMPS45 voltage when SMPS45 is ON and use the LDO8.VOLTAGE_SEL register when SMPS45 is OFF. On track mode, the steps of voltage change for LDO8 is 25mV where in non-tracking mode it is 50mV. Set the steps accordingly. Number of voltage count is still same for both the cases. Signed-off-by: Laxman Dewangan <ldewangan@nvidia.com> Acked-by: Graeme Gregory <gg@slimlogic.co.uk> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
-rw-r--r--drivers/regulator/palmas-regulator.c53
-rw-r--r--include/linux/mfd/palmas.h3
2 files changed, 56 insertions, 0 deletions
diff --git a/drivers/regulator/palmas-regulator.c b/drivers/regulator/palmas-regulator.c
index c61c0fa83e22..6538b339e441 100644
--- a/drivers/regulator/palmas-regulator.c
+++ b/drivers/regulator/palmas-regulator.c
@@ -571,6 +571,46 @@ static int palmas_extreg_init(struct palmas *palmas, int id,
571 return 0; 571 return 0;
572} 572}
573 573
574static void palmas_enable_ldo8_track(struct palmas *palmas)
575{
576 unsigned int reg;
577 unsigned int addr;
578 int ret;
579
580 addr = palmas_regs_info[PALMAS_REG_LDO8].ctrl_addr;
581
582 ret = palmas_ldo_read(palmas, addr, &reg);
583 if (ret) {
584 dev_err(palmas->dev, "Error in reading ldo8 control reg\n");
585 return;
586 }
587
588 reg |= PALMAS_LDO8_CTRL_LDO_TRACKING_EN;
589 ret = palmas_ldo_write(palmas, addr, reg);
590 if (ret < 0) {
591 dev_err(palmas->dev, "Error in enabling tracking mode\n");
592 return;
593 }
594 /*
595 * When SMPS45 is set to off and LDO8 tracking is enabled, the LDO8
596 * output is defined by the LDO8_VOLTAGE.VSEL register divided by two,
597 * and can be set from 0.45 to 1.65 V.
598 */
599 addr = palmas_regs_info[PALMAS_REG_LDO8].vsel_addr;
600 ret = palmas_ldo_read(palmas, addr, &reg);
601 if (ret) {
602 dev_err(palmas->dev, "Error in reading ldo8 voltage reg\n");
603 return;
604 }
605
606 reg = (reg << 1) & PALMAS_LDO8_VOLTAGE_VSEL_MASK;
607 ret = palmas_ldo_write(palmas, addr, reg);
608 if (ret < 0)
609 dev_err(palmas->dev, "Error in setting ldo8 voltage reg\n");
610
611 return;
612}
613
574static struct of_regulator_match palmas_matches[] = { 614static struct of_regulator_match palmas_matches[] = {
575 { .name = "smps12", }, 615 { .name = "smps12", },
576 { .name = "smps123", }, 616 { .name = "smps123", },
@@ -656,6 +696,11 @@ static void palmas_dt_to_pdata(struct device *dev,
656 if (ret) 696 if (ret)
657 pdata->reg_init[idx]->vsel = 697 pdata->reg_init[idx]->vsel =
658 PALMAS_SMPS12_VOLTAGE_RANGE; 698 PALMAS_SMPS12_VOLTAGE_RANGE;
699
700 if (idx == PALMAS_REG_LDO8)
701 pdata->enable_ldo8_tracking = of_property_read_bool(
702 palmas_matches[idx].of_node,
703 "ti,enable-ldo8-tracking");
659 } 704 }
660 705
661 pdata->ldo6_vibrator = of_property_read_bool(node, "ti,ldo6-vibrator"); 706 pdata->ldo6_vibrator = of_property_read_bool(node, "ti,ldo6-vibrator");
@@ -835,6 +880,13 @@ static int palmas_regulators_probe(struct platform_device *pdev)
835 palmas_regs_info[id].ctrl_addr); 880 palmas_regs_info[id].ctrl_addr);
836 pmic->desc[id].enable_mask = 881 pmic->desc[id].enable_mask =
837 PALMAS_LDO1_CTRL_MODE_ACTIVE; 882 PALMAS_LDO1_CTRL_MODE_ACTIVE;
883
884 /* Check if LDO8 is in tracking mode or not */
885 if (pdata && (id == PALMAS_REG_LDO8) &&
886 pdata->enable_ldo8_tracking) {
887 palmas_enable_ldo8_track(palmas);
888 pmic->desc[id].uV_step = 25000;
889 }
838 } else { 890 } else {
839 pmic->desc[id].n_voltages = 1; 891 pmic->desc[id].n_voltages = 1;
840 pmic->desc[id].ops = &palmas_ops_extreg; 892 pmic->desc[id].ops = &palmas_ops_extreg;
@@ -883,6 +935,7 @@ static int palmas_regulators_probe(struct platform_device *pdev)
883 } 935 }
884 } 936 }
885 937
938
886 return 0; 939 return 0;
887 940
888err_unregister_regulator: 941err_unregister_regulator:
diff --git a/include/linux/mfd/palmas.h b/include/linux/mfd/palmas.h
index 44256aa7b46a..10daa8c1e73c 100644
--- a/include/linux/mfd/palmas.h
+++ b/include/linux/mfd/palmas.h
@@ -177,6 +177,9 @@ struct palmas_pmic_platform_data {
177 177
178 /* use LDO6 for vibrator control */ 178 /* use LDO6 for vibrator control */
179 int ldo6_vibrator; 179 int ldo6_vibrator;
180
181 /* Enable tracking mode of LDO8 */
182 bool enable_ldo8_tracking;
180}; 183};
181 184
182struct palmas_usb_platform_data { 185struct palmas_usb_platform_data {