aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Documentation/devicetree/bindings/regulator/palmas-pmic.txt12
-rw-r--r--drivers/regulator/palmas-regulator.c166
2 files changed, 168 insertions, 10 deletions
diff --git a/Documentation/devicetree/bindings/regulator/palmas-pmic.txt b/Documentation/devicetree/bindings/regulator/palmas-pmic.txt
index 875639ae0606..42e6b6bc48ff 100644
--- a/Documentation/devicetree/bindings/regulator/palmas-pmic.txt
+++ b/Documentation/devicetree/bindings/regulator/palmas-pmic.txt
@@ -26,11 +26,17 @@ Optional nodes:
26 26
27 For ti,palmas-pmic - smps12, smps123, smps3 depending on OTP, 27 For ti,palmas-pmic - smps12, smps123, smps3 depending on OTP,
28 smps45, smps457, smps7 depending on variant, smps6, smps[8-9], 28 smps45, smps457, smps7 depending on variant, smps6, smps[8-9],
29 smps10_out2, smps10_out1, do[1-9], ldoln, ldousb. 29 smps10_out2, smps10_out1, ldo[1-9], ldoln, ldousb.
30 30
31 Optional sub-node properties: 31 Optional sub-node properties:
32 ti,warm-reset - maintain voltage during warm reset(boolean) 32 ti,warm-reset - maintain voltage during warm reset(boolean)
33 ti,roof-floor - control voltage selection by pin(boolean) 33 ti,roof-floor - This takes as optional argument on platform supporting
34 the rail from desired external control. If there is no argument then
35 it will be assume that it is controlled by NSLEEP pin.
36 The valid value for external pins are:
37 ENABLE1 then 1,
38 ENABLE2 then 2 or
39 NSLEEP then 3.
34 ti,mode-sleep - mode to adopt in pmic sleep 0 - off, 1 - auto, 40 ti,mode-sleep - mode to adopt in pmic sleep 0 - off, 1 - auto,
35 2 - eco, 3 - forced pwm 41 2 - eco, 3 - forced pwm
36 ti,smps-range - OTP has the wrong range set for the hardware so override 42 ti,smps-range - OTP has the wrong range set for the hardware so override
@@ -61,7 +67,7 @@ pmic {
61 regulator-always-on; 67 regulator-always-on;
62 regulator-boot-on; 68 regulator-boot-on;
63 ti,warm-reset; 69 ti,warm-reset;
64 ti,roof-floor; 70 ti,roof-floor = <1>; /* ENABLE1 control */
65 ti,mode-sleep = <0>; 71 ti,mode-sleep = <0>;
66 ti,smps-range = <1>; 72 ti,smps-range = <1>;
67 }; 73 };
diff --git a/drivers/regulator/palmas-regulator.c b/drivers/regulator/palmas-regulator.c
index 4f79c0d61faf..9c62b1d34685 100644
--- a/drivers/regulator/palmas-regulator.c
+++ b/drivers/regulator/palmas-regulator.c
@@ -33,6 +33,7 @@ struct regs_info {
33 u8 vsel_addr; 33 u8 vsel_addr;
34 u8 ctrl_addr; 34 u8 ctrl_addr;
35 u8 tstep_addr; 35 u8 tstep_addr;
36 int sleep_id;
36}; 37};
37 38
38static const struct regs_info palmas_regs_info[] = { 39static const struct regs_info palmas_regs_info[] = {
@@ -42,6 +43,7 @@ static const struct regs_info palmas_regs_info[] = {
42 .vsel_addr = PALMAS_SMPS12_VOLTAGE, 43 .vsel_addr = PALMAS_SMPS12_VOLTAGE,
43 .ctrl_addr = PALMAS_SMPS12_CTRL, 44 .ctrl_addr = PALMAS_SMPS12_CTRL,
44 .tstep_addr = PALMAS_SMPS12_TSTEP, 45 .tstep_addr = PALMAS_SMPS12_TSTEP,
46 .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_SMPS12,
45 }, 47 },
46 { 48 {
47 .name = "SMPS123", 49 .name = "SMPS123",
@@ -49,12 +51,14 @@ static const struct regs_info palmas_regs_info[] = {
49 .vsel_addr = PALMAS_SMPS12_VOLTAGE, 51 .vsel_addr = PALMAS_SMPS12_VOLTAGE,
50 .ctrl_addr = PALMAS_SMPS12_CTRL, 52 .ctrl_addr = PALMAS_SMPS12_CTRL,
51 .tstep_addr = PALMAS_SMPS12_TSTEP, 53 .tstep_addr = PALMAS_SMPS12_TSTEP,
54 .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_SMPS12,
52 }, 55 },
53 { 56 {
54 .name = "SMPS3", 57 .name = "SMPS3",
55 .sname = "smps3-in", 58 .sname = "smps3-in",
56 .vsel_addr = PALMAS_SMPS3_VOLTAGE, 59 .vsel_addr = PALMAS_SMPS3_VOLTAGE,
57 .ctrl_addr = PALMAS_SMPS3_CTRL, 60 .ctrl_addr = PALMAS_SMPS3_CTRL,
61 .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_SMPS3,
58 }, 62 },
59 { 63 {
60 .name = "SMPS45", 64 .name = "SMPS45",
@@ -62,6 +66,7 @@ static const struct regs_info palmas_regs_info[] = {
62 .vsel_addr = PALMAS_SMPS45_VOLTAGE, 66 .vsel_addr = PALMAS_SMPS45_VOLTAGE,
63 .ctrl_addr = PALMAS_SMPS45_CTRL, 67 .ctrl_addr = PALMAS_SMPS45_CTRL,
64 .tstep_addr = PALMAS_SMPS45_TSTEP, 68 .tstep_addr = PALMAS_SMPS45_TSTEP,
69 .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_SMPS45,
65 }, 70 },
66 { 71 {
67 .name = "SMPS457", 72 .name = "SMPS457",
@@ -69,6 +74,7 @@ static const struct regs_info palmas_regs_info[] = {
69 .vsel_addr = PALMAS_SMPS45_VOLTAGE, 74 .vsel_addr = PALMAS_SMPS45_VOLTAGE,
70 .ctrl_addr = PALMAS_SMPS45_CTRL, 75 .ctrl_addr = PALMAS_SMPS45_CTRL,
71 .tstep_addr = PALMAS_SMPS45_TSTEP, 76 .tstep_addr = PALMAS_SMPS45_TSTEP,
77 .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_SMPS45,
72 }, 78 },
73 { 79 {
74 .name = "SMPS6", 80 .name = "SMPS6",
@@ -76,12 +82,14 @@ static const struct regs_info palmas_regs_info[] = {
76 .vsel_addr = PALMAS_SMPS6_VOLTAGE, 82 .vsel_addr = PALMAS_SMPS6_VOLTAGE,
77 .ctrl_addr = PALMAS_SMPS6_CTRL, 83 .ctrl_addr = PALMAS_SMPS6_CTRL,
78 .tstep_addr = PALMAS_SMPS6_TSTEP, 84 .tstep_addr = PALMAS_SMPS6_TSTEP,
85 .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_SMPS6,
79 }, 86 },
80 { 87 {
81 .name = "SMPS7", 88 .name = "SMPS7",
82 .sname = "smps7-in", 89 .sname = "smps7-in",
83 .vsel_addr = PALMAS_SMPS7_VOLTAGE, 90 .vsel_addr = PALMAS_SMPS7_VOLTAGE,
84 .ctrl_addr = PALMAS_SMPS7_CTRL, 91 .ctrl_addr = PALMAS_SMPS7_CTRL,
92 .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_SMPS7,
85 }, 93 },
86 { 94 {
87 .name = "SMPS8", 95 .name = "SMPS8",
@@ -89,108 +97,128 @@ static const struct regs_info palmas_regs_info[] = {
89 .vsel_addr = PALMAS_SMPS8_VOLTAGE, 97 .vsel_addr = PALMAS_SMPS8_VOLTAGE,
90 .ctrl_addr = PALMAS_SMPS8_CTRL, 98 .ctrl_addr = PALMAS_SMPS8_CTRL,
91 .tstep_addr = PALMAS_SMPS8_TSTEP, 99 .tstep_addr = PALMAS_SMPS8_TSTEP,
100 .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_SMPS8,
92 }, 101 },
93 { 102 {
94 .name = "SMPS9", 103 .name = "SMPS9",
95 .sname = "smps9-in", 104 .sname = "smps9-in",
96 .vsel_addr = PALMAS_SMPS9_VOLTAGE, 105 .vsel_addr = PALMAS_SMPS9_VOLTAGE,
97 .ctrl_addr = PALMAS_SMPS9_CTRL, 106 .ctrl_addr = PALMAS_SMPS9_CTRL,
107 .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_SMPS9,
98 }, 108 },
99 { 109 {
100 .name = "SMPS10_OUT2", 110 .name = "SMPS10_OUT2",
101 .sname = "smps10-in", 111 .sname = "smps10-in",
102 .ctrl_addr = PALMAS_SMPS10_CTRL, 112 .ctrl_addr = PALMAS_SMPS10_CTRL,
113 .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_SMPS10,
103 }, 114 },
104 { 115 {
105 .name = "SMPS10_OUT1", 116 .name = "SMPS10_OUT1",
106 .sname = "smps10-out2", 117 .sname = "smps10-out2",
107 .ctrl_addr = PALMAS_SMPS10_CTRL, 118 .ctrl_addr = PALMAS_SMPS10_CTRL,
119 .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_SMPS10,
108 }, 120 },
109 { 121 {
110 .name = "LDO1", 122 .name = "LDO1",
111 .sname = "ldo1-in", 123 .sname = "ldo1-in",
112 .vsel_addr = PALMAS_LDO1_VOLTAGE, 124 .vsel_addr = PALMAS_LDO1_VOLTAGE,
113 .ctrl_addr = PALMAS_LDO1_CTRL, 125 .ctrl_addr = PALMAS_LDO1_CTRL,
126 .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_LDO1,
114 }, 127 },
115 { 128 {
116 .name = "LDO2", 129 .name = "LDO2",
117 .sname = "ldo2-in", 130 .sname = "ldo2-in",
118 .vsel_addr = PALMAS_LDO2_VOLTAGE, 131 .vsel_addr = PALMAS_LDO2_VOLTAGE,
119 .ctrl_addr = PALMAS_LDO2_CTRL, 132 .ctrl_addr = PALMAS_LDO2_CTRL,
133 .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_LDO2,
120 }, 134 },
121 { 135 {
122 .name = "LDO3", 136 .name = "LDO3",
123 .sname = "ldo3-in", 137 .sname = "ldo3-in",
124 .vsel_addr = PALMAS_LDO3_VOLTAGE, 138 .vsel_addr = PALMAS_LDO3_VOLTAGE,
125 .ctrl_addr = PALMAS_LDO3_CTRL, 139 .ctrl_addr = PALMAS_LDO3_CTRL,
140 .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_LDO3,
126 }, 141 },
127 { 142 {
128 .name = "LDO4", 143 .name = "LDO4",
129 .sname = "ldo4-in", 144 .sname = "ldo4-in",
130 .vsel_addr = PALMAS_LDO4_VOLTAGE, 145 .vsel_addr = PALMAS_LDO4_VOLTAGE,
131 .ctrl_addr = PALMAS_LDO4_CTRL, 146 .ctrl_addr = PALMAS_LDO4_CTRL,
147 .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_LDO4,
132 }, 148 },
133 { 149 {
134 .name = "LDO5", 150 .name = "LDO5",
135 .sname = "ldo5-in", 151 .sname = "ldo5-in",
136 .vsel_addr = PALMAS_LDO5_VOLTAGE, 152 .vsel_addr = PALMAS_LDO5_VOLTAGE,
137 .ctrl_addr = PALMAS_LDO5_CTRL, 153 .ctrl_addr = PALMAS_LDO5_CTRL,
154 .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_LDO5,
138 }, 155 },
139 { 156 {
140 .name = "LDO6", 157 .name = "LDO6",
141 .sname = "ldo6-in", 158 .sname = "ldo6-in",
142 .vsel_addr = PALMAS_LDO6_VOLTAGE, 159 .vsel_addr = PALMAS_LDO6_VOLTAGE,
143 .ctrl_addr = PALMAS_LDO6_CTRL, 160 .ctrl_addr = PALMAS_LDO6_CTRL,
161 .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_LDO6,
144 }, 162 },
145 { 163 {
146 .name = "LDO7", 164 .name = "LDO7",
147 .sname = "ldo7-in", 165 .sname = "ldo7-in",
148 .vsel_addr = PALMAS_LDO7_VOLTAGE, 166 .vsel_addr = PALMAS_LDO7_VOLTAGE,
149 .ctrl_addr = PALMAS_LDO7_CTRL, 167 .ctrl_addr = PALMAS_LDO7_CTRL,
168 .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_LDO7,
150 }, 169 },
151 { 170 {
152 .name = "LDO8", 171 .name = "LDO8",
153 .sname = "ldo8-in", 172 .sname = "ldo8-in",
154 .vsel_addr = PALMAS_LDO8_VOLTAGE, 173 .vsel_addr = PALMAS_LDO8_VOLTAGE,
155 .ctrl_addr = PALMAS_LDO8_CTRL, 174 .ctrl_addr = PALMAS_LDO8_CTRL,
175 .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_LDO8,
156 }, 176 },
157 { 177 {
158 .name = "LDO9", 178 .name = "LDO9",
159 .sname = "ldo9-in", 179 .sname = "ldo9-in",
160 .vsel_addr = PALMAS_LDO9_VOLTAGE, 180 .vsel_addr = PALMAS_LDO9_VOLTAGE,
161 .ctrl_addr = PALMAS_LDO9_CTRL, 181 .ctrl_addr = PALMAS_LDO9_CTRL,
182 .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_LDO9,
162 }, 183 },
163 { 184 {
164 .name = "LDOLN", 185 .name = "LDOLN",
165 .sname = "ldoln-in", 186 .sname = "ldoln-in",
166 .vsel_addr = PALMAS_LDOLN_VOLTAGE, 187 .vsel_addr = PALMAS_LDOLN_VOLTAGE,
167 .ctrl_addr = PALMAS_LDOLN_CTRL, 188 .ctrl_addr = PALMAS_LDOLN_CTRL,
189 .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_LDOLN,
168 }, 190 },
169 { 191 {
170 .name = "LDOUSB", 192 .name = "LDOUSB",
171 .sname = "ldousb-in", 193 .sname = "ldousb-in",
172 .vsel_addr = PALMAS_LDOUSB_VOLTAGE, 194 .vsel_addr = PALMAS_LDOUSB_VOLTAGE,
173 .ctrl_addr = PALMAS_LDOUSB_CTRL, 195 .ctrl_addr = PALMAS_LDOUSB_CTRL,
196 .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_LDOUSB,
174 }, 197 },
175 { 198 {
176 .name = "REGEN1", 199 .name = "REGEN1",
177 .ctrl_addr = PALMAS_REGEN1_CTRL, 200 .ctrl_addr = PALMAS_REGEN1_CTRL,
201 .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_REGEN1,
178 }, 202 },
179 { 203 {
180 .name = "REGEN2", 204 .name = "REGEN2",
181 .ctrl_addr = PALMAS_REGEN2_CTRL, 205 .ctrl_addr = PALMAS_REGEN2_CTRL,
206 .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_REGEN2,
182 }, 207 },
183 { 208 {
184 .name = "REGEN3", 209 .name = "REGEN3",
185 .ctrl_addr = PALMAS_REGEN3_CTRL, 210 .ctrl_addr = PALMAS_REGEN3_CTRL,
211 .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_REGEN3,
186 }, 212 },
187 { 213 {
188 .name = "SYSEN1", 214 .name = "SYSEN1",
189 .ctrl_addr = PALMAS_SYSEN1_CTRL, 215 .ctrl_addr = PALMAS_SYSEN1_CTRL,
216 .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_SYSEN1,
190 }, 217 },
191 { 218 {
192 .name = "SYSEN2", 219 .name = "SYSEN2",
193 .ctrl_addr = PALMAS_SYSEN2_CTRL, 220 .ctrl_addr = PALMAS_SYSEN2_CTRL,
221 .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_SYSEN2,
194 }, 222 },
195}; 223};
196 224
@@ -478,6 +506,17 @@ static struct regulator_ops palmas_ops_smps = {
478 .set_ramp_delay = palmas_smps_set_ramp_delay, 506 .set_ramp_delay = palmas_smps_set_ramp_delay,
479}; 507};
480 508
509static struct regulator_ops palmas_ops_ext_control_smps = {
510 .set_mode = palmas_set_mode_smps,
511 .get_mode = palmas_get_mode_smps,
512 .get_voltage_sel = regulator_get_voltage_sel_regmap,
513 .set_voltage_sel = regulator_set_voltage_sel_regmap,
514 .list_voltage = palmas_list_voltage_smps,
515 .map_voltage = palmas_map_voltage_smps,
516 .set_voltage_time_sel = palma_smps_set_voltage_smps_time_sel,
517 .set_ramp_delay = palmas_smps_set_ramp_delay,
518};
519
481static struct regulator_ops palmas_ops_smps10 = { 520static struct regulator_ops palmas_ops_smps10 = {
482 .is_enabled = regulator_is_enabled_regmap, 521 .is_enabled = regulator_is_enabled_regmap,
483 .enable = regulator_enable_regmap, 522 .enable = regulator_enable_regmap,
@@ -513,12 +552,37 @@ static struct regulator_ops palmas_ops_ldo = {
513 .map_voltage = regulator_map_voltage_linear, 552 .map_voltage = regulator_map_voltage_linear,
514}; 553};
515 554
555static struct regulator_ops palmas_ops_ext_control_ldo = {
556 .get_voltage_sel = regulator_get_voltage_sel_regmap,
557 .set_voltage_sel = regulator_set_voltage_sel_regmap,
558 .list_voltage = regulator_list_voltage_linear,
559 .map_voltage = regulator_map_voltage_linear,
560};
561
516static struct regulator_ops palmas_ops_extreg = { 562static struct regulator_ops palmas_ops_extreg = {
517 .is_enabled = regulator_is_enabled_regmap, 563 .is_enabled = regulator_is_enabled_regmap,
518 .enable = regulator_enable_regmap, 564 .enable = regulator_enable_regmap,
519 .disable = regulator_disable_regmap, 565 .disable = regulator_disable_regmap,
520}; 566};
521 567
568static struct regulator_ops palmas_ops_ext_control_extreg = {
569};
570
571static int palmas_regulator_config_external(struct palmas *palmas, int id,
572 struct palmas_reg_init *reg_init)
573{
574 int sleep_id = palmas_regs_info[id].sleep_id;
575 int ret;
576
577 ret = palmas_ext_control_req_config(palmas, sleep_id,
578 reg_init->roof_floor, true);
579 if (ret < 0)
580 dev_err(palmas->dev,
581 "Ext control config for regulator %d failed %d\n",
582 id, ret);
583 return ret;
584}
585
522/* 586/*
523 * setup the hardware based sleep configuration of the SMPS/LDO regulators 587 * setup the hardware based sleep configuration of the SMPS/LDO regulators
524 * from the platform data. This is different to the software based control 588 * from the platform data. This is different to the software based control
@@ -577,7 +641,22 @@ static int palmas_smps_init(struct palmas *palmas, int id,
577 return ret; 641 return ret;
578 } 642 }
579 643
644 if (reg_init->roof_floor && (id != PALMAS_REG_SMPS10_OUT1) &&
645 (id != PALMAS_REG_SMPS10_OUT2)) {
646 /* Enable externally controlled regulator */
647 addr = palmas_regs_info[id].ctrl_addr;
648 ret = palmas_smps_read(palmas, addr, &reg);
649 if (ret < 0)
650 return ret;
580 651
652 if (!(reg & PALMAS_SMPS12_CTRL_MODE_ACTIVE_MASK)) {
653 reg |= SMPS_CTRL_MODE_ON;
654 ret = palmas_smps_write(palmas, addr, reg);
655 if (ret < 0)
656 return ret;
657 }
658 return palmas_regulator_config_external(palmas, id, reg_init);
659 }
581 return 0; 660 return 0;
582} 661}
583 662
@@ -608,6 +687,20 @@ static int palmas_ldo_init(struct palmas *palmas, int id,
608 if (ret) 687 if (ret)
609 return ret; 688 return ret;
610 689
690 if (reg_init->roof_floor) {
691 /* Enable externally controlled regulator */
692 addr = palmas_regs_info[id].ctrl_addr;
693 ret = palmas_update_bits(palmas, PALMAS_LDO_BASE,
694 addr, PALMAS_LDO1_CTRL_MODE_ACTIVE,
695 PALMAS_LDO1_CTRL_MODE_ACTIVE);
696 if (ret < 0) {
697 dev_err(palmas->dev,
698 "LDO Register 0x%02x update failed %d\n",
699 addr, ret);
700 return ret;
701 }
702 return palmas_regulator_config_external(palmas, id, reg_init);
703 }
611 return 0; 704 return 0;
612} 705}
613 706
@@ -630,6 +723,21 @@ static int palmas_extreg_init(struct palmas *palmas, int id,
630 addr, ret); 723 addr, ret);
631 return ret; 724 return ret;
632 } 725 }
726
727 if (reg_init->roof_floor) {
728 /* Enable externally controlled regulator */
729 addr = palmas_regs_info[id].ctrl_addr;
730 ret = palmas_update_bits(palmas, PALMAS_RESOURCE_BASE,
731 addr, PALMAS_REGEN1_CTRL_MODE_ACTIVE,
732 PALMAS_REGEN1_CTRL_MODE_ACTIVE);
733 if (ret < 0) {
734 dev_err(palmas->dev,
735 "Resource Register 0x%02x update failed %d\n",
736 addr, ret);
737 return ret;
738 }
739 return palmas_regulator_config_external(palmas, id, reg_init);
740 }
633 return 0; 741 return 0;
634} 742}
635 743
@@ -712,7 +820,7 @@ static void palmas_dt_to_pdata(struct device *dev,
712 int idx, ret; 820 int idx, ret;
713 821
714 node = of_node_get(node); 822 node = of_node_get(node);
715 regulators = of_find_node_by_name(node, "regulators"); 823 regulators = of_get_child_by_name(node, "regulators");
716 if (!regulators) { 824 if (!regulators) {
717 dev_info(dev, "regulator node not found\n"); 825 dev_info(dev, "regulator node not found\n");
718 return; 826 return;
@@ -740,9 +848,35 @@ static void palmas_dt_to_pdata(struct device *dev,
740 of_property_read_bool(palmas_matches[idx].of_node, 848 of_property_read_bool(palmas_matches[idx].of_node,
741 "ti,warm-reset"); 849 "ti,warm-reset");
742 850
743 pdata->reg_init[idx]->roof_floor = 851 ret = of_property_read_u32(palmas_matches[idx].of_node,
744 of_property_read_bool(palmas_matches[idx].of_node, 852 "ti,roof-floor", &prop);
745 "ti,roof-floor"); 853 /* EINVAL: Property not found */
854 if (ret != -EINVAL) {
855 int econtrol;
856
857 /* use default value, when no value is specified */
858 econtrol = PALMAS_EXT_CONTROL_NSLEEP;
859 if (!ret) {
860 switch (prop) {
861 case 1:
862 econtrol = PALMAS_EXT_CONTROL_ENABLE1;
863 break;
864 case 2:
865 econtrol = PALMAS_EXT_CONTROL_ENABLE2;
866 break;
867 case 3:
868 econtrol = PALMAS_EXT_CONTROL_NSLEEP;
869 break;
870 default:
871 WARN_ON(1);
872 dev_warn(dev,
873 "%s: Invalid roof-floor option: %u\n",
874 palmas_matches[idx].name, prop);
875 break;
876 }
877 }
878 pdata->reg_init[idx]->roof_floor = econtrol;
879 }
746 880
747 ret = of_property_read_u32(palmas_matches[idx].of_node, 881 ret = of_property_read_u32(palmas_matches[idx].of_node,
748 "ti,mode-sleep", &prop); 882 "ti,mode-sleep", &prop);
@@ -869,6 +1003,8 @@ static int palmas_regulators_probe(struct platform_device *pdev)
869 ret = palmas_smps_init(palmas, id, reg_init); 1003 ret = palmas_smps_init(palmas, id, reg_init);
870 if (ret) 1004 if (ret)
871 return ret; 1005 return ret;
1006 } else {
1007 reg_init = NULL;
872 } 1008 }
873 1009
874 /* Register the regulators */ 1010 /* Register the regulators */
@@ -913,7 +1049,11 @@ static int palmas_regulators_probe(struct platform_device *pdev)
913 if (reg & PALMAS_SMPS12_VOLTAGE_RANGE) 1049 if (reg & PALMAS_SMPS12_VOLTAGE_RANGE)
914 pmic->range[id] = 1; 1050 pmic->range[id] = 1;
915 1051
916 pmic->desc[id].ops = &palmas_ops_smps; 1052 if (reg_init && reg_init->roof_floor)
1053 pmic->desc[id].ops =
1054 &palmas_ops_ext_control_smps;
1055 else
1056 pmic->desc[id].ops = &palmas_ops_smps;
917 pmic->desc[id].n_voltages = PALMAS_SMPS_NUM_VOLTAGES; 1057 pmic->desc[id].n_voltages = PALMAS_SMPS_NUM_VOLTAGES;
918 pmic->desc[id].vsel_reg = 1058 pmic->desc[id].vsel_reg =
919 PALMAS_BASE_TO_REG(PALMAS_SMPS_BASE, 1059 PALMAS_BASE_TO_REG(PALMAS_SMPS_BASE,
@@ -956,6 +1096,10 @@ static int palmas_regulators_probe(struct platform_device *pdev)
956 1096
957 /* Start this loop from the id left from previous loop */ 1097 /* Start this loop from the id left from previous loop */
958 for (; id < PALMAS_NUM_REGS; id++) { 1098 for (; id < PALMAS_NUM_REGS; id++) {
1099 if (pdata && pdata->reg_init[id])
1100 reg_init = pdata->reg_init[id];
1101 else
1102 reg_init = NULL;
959 1103
960 /* Miss out regulators which are not available due 1104 /* Miss out regulators which are not available due
961 * to alternate functions. 1105 * to alternate functions.
@@ -969,7 +1113,11 @@ static int palmas_regulators_probe(struct platform_device *pdev)
969 1113
970 if (id < PALMAS_REG_REGEN1) { 1114 if (id < PALMAS_REG_REGEN1) {
971 pmic->desc[id].n_voltages = PALMAS_LDO_NUM_VOLTAGES; 1115 pmic->desc[id].n_voltages = PALMAS_LDO_NUM_VOLTAGES;
972 pmic->desc[id].ops = &palmas_ops_ldo; 1116 if (reg_init && reg_init->roof_floor)
1117 pmic->desc[id].ops =
1118 &palmas_ops_ext_control_ldo;
1119 else
1120 pmic->desc[id].ops = &palmas_ops_ldo;
973 pmic->desc[id].min_uV = 900000; 1121 pmic->desc[id].min_uV = 900000;
974 pmic->desc[id].uV_step = 50000; 1122 pmic->desc[id].uV_step = 50000;
975 pmic->desc[id].linear_min_sel = 1; 1123 pmic->desc[id].linear_min_sel = 1;
@@ -999,7 +1147,11 @@ static int palmas_regulators_probe(struct platform_device *pdev)
999 pmic->desc[id].enable_time = 2000; 1147 pmic->desc[id].enable_time = 2000;
1000 } else { 1148 } else {
1001 pmic->desc[id].n_voltages = 1; 1149 pmic->desc[id].n_voltages = 1;
1002 pmic->desc[id].ops = &palmas_ops_extreg; 1150 if (reg_init && reg_init->roof_floor)
1151 pmic->desc[id].ops =
1152 &palmas_ops_ext_control_extreg;
1153 else
1154 pmic->desc[id].ops = &palmas_ops_extreg;
1003 pmic->desc[id].enable_reg = 1155 pmic->desc[id].enable_reg =
1004 PALMAS_BASE_TO_REG(PALMAS_RESOURCE_BASE, 1156 PALMAS_BASE_TO_REG(PALMAS_RESOURCE_BASE,
1005 palmas_regs_info[id].ctrl_addr); 1157 palmas_regs_info[id].ctrl_addr);