diff options
author | Mark Brown <broonie@linaro.org> | 2013-10-24 06:11:39 -0400 |
---|---|---|
committer | Mark Brown <broonie@linaro.org> | 2013-10-24 06:11:39 -0400 |
commit | 22eb85adaf0613acdbba2093b6ecc233b3f9ae41 (patch) | |
tree | c29adf954871589b3cba8537d19da188c0afd10f /drivers | |
parent | aef393da7501693a1b91a1cfed1a9ea408ceabe6 (diff) | |
parent | acc1ccadb85fc47238e9d92b2336c04c9fc64d53 (diff) |
Merge remote-tracking branch 'regulator/topic/palmas' into regulator-next
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/regulator/palmas-regulator.c | 166 |
1 files changed, 159 insertions, 7 deletions
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 | ||
38 | static const struct regs_info palmas_regs_info[] = { | 39 | static 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 | ||
509 | static 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 | |||
481 | static struct regulator_ops palmas_ops_smps10 = { | 520 | static 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 | ||
555 | static 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 | |||
516 | static struct regulator_ops palmas_ops_extreg = { | 562 | static 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 | ||
568 | static struct regulator_ops palmas_ops_ext_control_extreg = { | ||
569 | }; | ||
570 | |||
571 | static 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, ®); | ||
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); |