diff options
Diffstat (limited to 'drivers/regulator')
-rw-r--r-- | drivers/regulator/pcf50633-regulator.c | 96 |
1 files changed, 64 insertions, 32 deletions
diff --git a/drivers/regulator/pcf50633-regulator.c b/drivers/regulator/pcf50633-regulator.c index 70ba77557650..0803ffe6236d 100644 --- a/drivers/regulator/pcf50633-regulator.c +++ b/drivers/regulator/pcf50633-regulator.c | |||
@@ -24,11 +24,12 @@ | |||
24 | #include <linux/mfd/pcf50633/core.h> | 24 | #include <linux/mfd/pcf50633/core.h> |
25 | #include <linux/mfd/pcf50633/pmic.h> | 25 | #include <linux/mfd/pcf50633/pmic.h> |
26 | 26 | ||
27 | #define PCF50633_REGULATOR(_name, _id) \ | 27 | #define PCF50633_REGULATOR(_name, _id, _n) \ |
28 | { \ | 28 | { \ |
29 | .name = _name, \ | 29 | .name = _name, \ |
30 | .id = _id, \ | 30 | .id = _id, \ |
31 | .ops = &pcf50633_regulator_ops, \ | 31 | .ops = &pcf50633_regulator_ops, \ |
32 | .n_voltages = _n, \ | ||
32 | .type = REGULATOR_VOLTAGE, \ | 33 | .type = REGULATOR_VOLTAGE, \ |
33 | .owner = THIS_MODULE, \ | 34 | .owner = THIS_MODULE, \ |
34 | } | 35 | } |
@@ -149,11 +150,42 @@ static int pcf50633_regulator_set_voltage(struct regulator_dev *rdev, | |||
149 | return pcf50633_reg_write(pcf, regnr, volt_bits); | 150 | return pcf50633_reg_write(pcf, regnr, volt_bits); |
150 | } | 151 | } |
151 | 152 | ||
153 | static int pcf50633_regulator_voltage_value(enum pcf50633_regulator_id id, | ||
154 | u8 bits) | ||
155 | { | ||
156 | int millivolts; | ||
157 | |||
158 | switch (id) { | ||
159 | case PCF50633_REGULATOR_AUTO: | ||
160 | millivolts = auto_voltage_value(bits); | ||
161 | break; | ||
162 | case PCF50633_REGULATOR_DOWN1: | ||
163 | millivolts = down_voltage_value(bits); | ||
164 | break; | ||
165 | case PCF50633_REGULATOR_DOWN2: | ||
166 | millivolts = down_voltage_value(bits); | ||
167 | break; | ||
168 | case PCF50633_REGULATOR_LDO1: | ||
169 | case PCF50633_REGULATOR_LDO2: | ||
170 | case PCF50633_REGULATOR_LDO3: | ||
171 | case PCF50633_REGULATOR_LDO4: | ||
172 | case PCF50633_REGULATOR_LDO5: | ||
173 | case PCF50633_REGULATOR_LDO6: | ||
174 | case PCF50633_REGULATOR_HCLDO: | ||
175 | millivolts = ldo_voltage_value(bits); | ||
176 | break; | ||
177 | default: | ||
178 | return -EINVAL; | ||
179 | } | ||
180 | |||
181 | return millivolts * 1000; | ||
182 | } | ||
183 | |||
152 | static int pcf50633_regulator_get_voltage(struct regulator_dev *rdev) | 184 | static int pcf50633_regulator_get_voltage(struct regulator_dev *rdev) |
153 | { | 185 | { |
154 | struct pcf50633 *pcf; | 186 | struct pcf50633 *pcf; |
155 | int regulator_id, millivolts, volt_bits; | 187 | int regulator_id; |
156 | u8 regnr; | 188 | u8 volt_bits, regnr; |
157 | 189 | ||
158 | pcf = rdev_get_drvdata(rdev); | 190 | pcf = rdev_get_drvdata(rdev); |
159 | 191 | ||
@@ -164,33 +196,32 @@ static int pcf50633_regulator_get_voltage(struct regulator_dev *rdev) | |||
164 | regnr = pcf50633_regulator_registers[regulator_id]; | 196 | regnr = pcf50633_regulator_registers[regulator_id]; |
165 | 197 | ||
166 | volt_bits = pcf50633_reg_read(pcf, regnr); | 198 | volt_bits = pcf50633_reg_read(pcf, regnr); |
167 | if (volt_bits < 0) | 199 | |
168 | return -1; | 200 | return pcf50633_regulator_voltage_value(regulator_id, volt_bits); |
201 | } | ||
202 | |||
203 | static int pcf50633_regulator_list_voltage(struct regulator_dev *rdev, | ||
204 | unsigned int index) | ||
205 | { | ||
206 | struct pcf50633 *pcf; | ||
207 | int regulator_id; | ||
208 | |||
209 | pcf = rdev_get_drvdata(rdev); | ||
210 | |||
211 | regulator_id = rdev_get_id(rdev); | ||
169 | 212 | ||
170 | switch (regulator_id) { | 213 | switch (regulator_id) { |
171 | case PCF50633_REGULATOR_AUTO: | 214 | case PCF50633_REGULATOR_AUTO: |
172 | millivolts = auto_voltage_value(volt_bits); | 215 | index += 0x2f; |
173 | break; | ||
174 | case PCF50633_REGULATOR_DOWN1: | ||
175 | millivolts = down_voltage_value(volt_bits); | ||
176 | break; | ||
177 | case PCF50633_REGULATOR_DOWN2: | ||
178 | millivolts = down_voltage_value(volt_bits); | ||
179 | break; | 216 | break; |
180 | case PCF50633_REGULATOR_LDO1: | ||
181 | case PCF50633_REGULATOR_LDO2: | ||
182 | case PCF50633_REGULATOR_LDO3: | ||
183 | case PCF50633_REGULATOR_LDO4: | ||
184 | case PCF50633_REGULATOR_LDO5: | ||
185 | case PCF50633_REGULATOR_LDO6: | ||
186 | case PCF50633_REGULATOR_HCLDO: | 217 | case PCF50633_REGULATOR_HCLDO: |
187 | millivolts = ldo_voltage_value(volt_bits); | 218 | index += 0x01; |
188 | break; | 219 | break; |
189 | default: | 220 | default: |
190 | return -EINVAL; | 221 | break; |
191 | } | 222 | } |
192 | 223 | ||
193 | return millivolts * 1000; | 224 | return pcf50633_regulator_voltage_value(regulator_id, index); |
194 | } | 225 | } |
195 | 226 | ||
196 | static int pcf50633_regulator_enable(struct regulator_dev *rdev) | 227 | static int pcf50633_regulator_enable(struct regulator_dev *rdev) |
@@ -246,6 +277,7 @@ static int pcf50633_regulator_is_enabled(struct regulator_dev *rdev) | |||
246 | static struct regulator_ops pcf50633_regulator_ops = { | 277 | static struct regulator_ops pcf50633_regulator_ops = { |
247 | .set_voltage = pcf50633_regulator_set_voltage, | 278 | .set_voltage = pcf50633_regulator_set_voltage, |
248 | .get_voltage = pcf50633_regulator_get_voltage, | 279 | .get_voltage = pcf50633_regulator_get_voltage, |
280 | .list_voltage = pcf50633_regulator_list_voltage, | ||
249 | .enable = pcf50633_regulator_enable, | 281 | .enable = pcf50633_regulator_enable, |
250 | .disable = pcf50633_regulator_disable, | 282 | .disable = pcf50633_regulator_disable, |
251 | .is_enabled = pcf50633_regulator_is_enabled, | 283 | .is_enabled = pcf50633_regulator_is_enabled, |
@@ -253,27 +285,27 @@ static struct regulator_ops pcf50633_regulator_ops = { | |||
253 | 285 | ||
254 | static struct regulator_desc regulators[] = { | 286 | static struct regulator_desc regulators[] = { |
255 | [PCF50633_REGULATOR_AUTO] = | 287 | [PCF50633_REGULATOR_AUTO] = |
256 | PCF50633_REGULATOR("auto", PCF50633_REGULATOR_AUTO), | 288 | PCF50633_REGULATOR("auto", PCF50633_REGULATOR_AUTO, 80), |
257 | [PCF50633_REGULATOR_DOWN1] = | 289 | [PCF50633_REGULATOR_DOWN1] = |
258 | PCF50633_REGULATOR("down1", PCF50633_REGULATOR_DOWN1), | 290 | PCF50633_REGULATOR("down1", PCF50633_REGULATOR_DOWN1, 95), |
259 | [PCF50633_REGULATOR_DOWN2] = | 291 | [PCF50633_REGULATOR_DOWN2] = |
260 | PCF50633_REGULATOR("down2", PCF50633_REGULATOR_DOWN2), | 292 | PCF50633_REGULATOR("down2", PCF50633_REGULATOR_DOWN2, 95), |
261 | [PCF50633_REGULATOR_LDO1] = | 293 | [PCF50633_REGULATOR_LDO1] = |
262 | PCF50633_REGULATOR("ldo1", PCF50633_REGULATOR_LDO1), | 294 | PCF50633_REGULATOR("ldo1", PCF50633_REGULATOR_LDO1, 27), |
263 | [PCF50633_REGULATOR_LDO2] = | 295 | [PCF50633_REGULATOR_LDO2] = |
264 | PCF50633_REGULATOR("ldo2", PCF50633_REGULATOR_LDO2), | 296 | PCF50633_REGULATOR("ldo2", PCF50633_REGULATOR_LDO2, 27), |
265 | [PCF50633_REGULATOR_LDO3] = | 297 | [PCF50633_REGULATOR_LDO3] = |
266 | PCF50633_REGULATOR("ldo3", PCF50633_REGULATOR_LDO3), | 298 | PCF50633_REGULATOR("ldo3", PCF50633_REGULATOR_LDO3, 27), |
267 | [PCF50633_REGULATOR_LDO4] = | 299 | [PCF50633_REGULATOR_LDO4] = |
268 | PCF50633_REGULATOR("ldo4", PCF50633_REGULATOR_LDO4), | 300 | PCF50633_REGULATOR("ldo4", PCF50633_REGULATOR_LDO4, 27), |
269 | [PCF50633_REGULATOR_LDO5] = | 301 | [PCF50633_REGULATOR_LDO5] = |
270 | PCF50633_REGULATOR("ldo5", PCF50633_REGULATOR_LDO5), | 302 | PCF50633_REGULATOR("ldo5", PCF50633_REGULATOR_LDO5, 27), |
271 | [PCF50633_REGULATOR_LDO6] = | 303 | [PCF50633_REGULATOR_LDO6] = |
272 | PCF50633_REGULATOR("ldo6", PCF50633_REGULATOR_LDO6), | 304 | PCF50633_REGULATOR("ldo6", PCF50633_REGULATOR_LDO6, 27), |
273 | [PCF50633_REGULATOR_HCLDO] = | 305 | [PCF50633_REGULATOR_HCLDO] = |
274 | PCF50633_REGULATOR("hcldo", PCF50633_REGULATOR_HCLDO), | 306 | PCF50633_REGULATOR("hcldo", PCF50633_REGULATOR_HCLDO, 26), |
275 | [PCF50633_REGULATOR_MEMLDO] = | 307 | [PCF50633_REGULATOR_MEMLDO] = |
276 | PCF50633_REGULATOR("memldo", PCF50633_REGULATOR_MEMLDO), | 308 | PCF50633_REGULATOR("memldo", PCF50633_REGULATOR_MEMLDO, 0), |
277 | }; | 309 | }; |
278 | 310 | ||
279 | static int __devinit pcf50633_regulator_probe(struct platform_device *pdev) | 311 | static int __devinit pcf50633_regulator_probe(struct platform_device *pdev) |