diff options
author | Axel Lin <axel.lin@gmail.com> | 2012-04-17 22:50:37 -0400 |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2012-04-23 08:19:50 -0400 |
commit | 11bb88ec221b70374c48c034bc147af20e40ba15 (patch) | |
tree | a2eee915c8bec178c3e8ae1c5019d29e1a183080 | |
parent | a40a9c436b62251be285be9f3ba57864be10d000 (diff) |
regulator: pcf50633: Use generic regmap enable/disable operations
Signed-off-by: Axel Lin <axel.lin@gmail.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
-rw-r--r-- | drivers/regulator/pcf50633-regulator.c | 108 |
1 files changed, 25 insertions, 83 deletions
diff --git a/drivers/regulator/pcf50633-regulator.c b/drivers/regulator/pcf50633-regulator.c index 7ee70f1b3f24..5887505699d2 100644 --- a/drivers/regulator/pcf50633-regulator.c +++ b/drivers/regulator/pcf50633-regulator.c | |||
@@ -24,14 +24,16 @@ | |||
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, _n) \ | 27 | #define PCF50633_REGULATOR(_name, _id, _n) \ |
28 | { \ | 28 | { \ |
29 | .name = _name, \ | 29 | .name = _name, \ |
30 | .id = _id, \ | 30 | .id = PCF50633_REGULATOR_##_id, \ |
31 | .ops = &pcf50633_regulator_ops, \ | 31 | .ops = &pcf50633_regulator_ops, \ |
32 | .n_voltages = _n, \ | 32 | .n_voltages = _n, \ |
33 | .type = REGULATOR_VOLTAGE, \ | 33 | .type = REGULATOR_VOLTAGE, \ |
34 | .owner = THIS_MODULE, \ | 34 | .owner = THIS_MODULE, \ |
35 | .enable_reg = PCF50633_REG_##_id##OUT + 1, \ | ||
36 | .enable_mask = PCF50633_REGULATOR_ON, \ | ||
35 | } | 37 | } |
36 | 38 | ||
37 | static const u8 pcf50633_regulator_registers[PCF50633_NUM_REGULATORS] = { | 39 | static const u8 pcf50633_regulator_registers[PCF50633_NUM_REGULATORS] = { |
@@ -208,88 +210,27 @@ static int pcf50633_regulator_list_voltage(struct regulator_dev *rdev, | |||
208 | return millivolts * 1000; | 210 | return millivolts * 1000; |
209 | } | 211 | } |
210 | 212 | ||
211 | static int pcf50633_regulator_enable(struct regulator_dev *rdev) | ||
212 | { | ||
213 | struct pcf50633 *pcf = rdev_get_drvdata(rdev); | ||
214 | int regulator_id; | ||
215 | u8 regnr; | ||
216 | |||
217 | regulator_id = rdev_get_id(rdev); | ||
218 | if (regulator_id >= PCF50633_NUM_REGULATORS) | ||
219 | return -EINVAL; | ||
220 | |||
221 | /* The *ENA register is always one after the *OUT register */ | ||
222 | regnr = pcf50633_regulator_registers[regulator_id] + 1; | ||
223 | |||
224 | return pcf50633_reg_set_bit_mask(pcf, regnr, PCF50633_REGULATOR_ON, | ||
225 | PCF50633_REGULATOR_ON); | ||
226 | } | ||
227 | |||
228 | static int pcf50633_regulator_disable(struct regulator_dev *rdev) | ||
229 | { | ||
230 | struct pcf50633 *pcf = rdev_get_drvdata(rdev); | ||
231 | int regulator_id; | ||
232 | u8 regnr; | ||
233 | |||
234 | regulator_id = rdev_get_id(rdev); | ||
235 | if (regulator_id >= PCF50633_NUM_REGULATORS) | ||
236 | return -EINVAL; | ||
237 | |||
238 | /* the *ENA register is always one after the *OUT register */ | ||
239 | regnr = pcf50633_regulator_registers[regulator_id] + 1; | ||
240 | |||
241 | return pcf50633_reg_set_bit_mask(pcf, regnr, | ||
242 | PCF50633_REGULATOR_ON, 0); | ||
243 | } | ||
244 | |||
245 | static int pcf50633_regulator_is_enabled(struct regulator_dev *rdev) | ||
246 | { | ||
247 | struct pcf50633 *pcf = rdev_get_drvdata(rdev); | ||
248 | int regulator_id = rdev_get_id(rdev); | ||
249 | u8 regnr; | ||
250 | |||
251 | regulator_id = rdev_get_id(rdev); | ||
252 | if (regulator_id >= PCF50633_NUM_REGULATORS) | ||
253 | return -EINVAL; | ||
254 | |||
255 | /* the *ENA register is always one after the *OUT register */ | ||
256 | regnr = pcf50633_regulator_registers[regulator_id] + 1; | ||
257 | |||
258 | return pcf50633_reg_read(pcf, regnr) & PCF50633_REGULATOR_ON; | ||
259 | } | ||
260 | |||
261 | static struct regulator_ops pcf50633_regulator_ops = { | 213 | static struct regulator_ops pcf50633_regulator_ops = { |
262 | .set_voltage = pcf50633_regulator_set_voltage, | 214 | .set_voltage = pcf50633_regulator_set_voltage, |
263 | .get_voltage_sel = pcf50633_regulator_get_voltage_sel, | 215 | .get_voltage_sel = pcf50633_regulator_get_voltage_sel, |
264 | .list_voltage = pcf50633_regulator_list_voltage, | 216 | .list_voltage = pcf50633_regulator_list_voltage, |
265 | .enable = pcf50633_regulator_enable, | 217 | .enable = regulator_enable_regmap, |
266 | .disable = pcf50633_regulator_disable, | 218 | .disable = regulator_disable_regmap, |
267 | .is_enabled = pcf50633_regulator_is_enabled, | 219 | .is_enabled = regulator_is_enabled_regmap, |
268 | }; | 220 | }; |
269 | 221 | ||
270 | static const struct regulator_desc regulators[] = { | 222 | static const struct regulator_desc regulators[] = { |
271 | [PCF50633_REGULATOR_AUTO] = | 223 | [PCF50633_REGULATOR_AUTO] = PCF50633_REGULATOR("auto", AUTO, 128), |
272 | PCF50633_REGULATOR("auto", PCF50633_REGULATOR_AUTO, 128), | 224 | [PCF50633_REGULATOR_DOWN1] = PCF50633_REGULATOR("down1", DOWN1, 96), |
273 | [PCF50633_REGULATOR_DOWN1] = | 225 | [PCF50633_REGULATOR_DOWN2] = PCF50633_REGULATOR("down2", DOWN2, 96), |
274 | PCF50633_REGULATOR("down1", PCF50633_REGULATOR_DOWN1, 96), | 226 | [PCF50633_REGULATOR_LDO1] = PCF50633_REGULATOR("ldo1", LDO1, 28), |
275 | [PCF50633_REGULATOR_DOWN2] = | 227 | [PCF50633_REGULATOR_LDO2] = PCF50633_REGULATOR("ldo2", LDO2, 28), |
276 | PCF50633_REGULATOR("down2", PCF50633_REGULATOR_DOWN2, 96), | 228 | [PCF50633_REGULATOR_LDO3] = PCF50633_REGULATOR("ldo3", LDO3, 28), |
277 | [PCF50633_REGULATOR_LDO1] = | 229 | [PCF50633_REGULATOR_LDO4] = PCF50633_REGULATOR("ldo4", LDO4, 28), |
278 | PCF50633_REGULATOR("ldo1", PCF50633_REGULATOR_LDO1, 28), | 230 | [PCF50633_REGULATOR_LDO5] = PCF50633_REGULATOR("ldo5", LDO5, 28), |
279 | [PCF50633_REGULATOR_LDO2] = | 231 | [PCF50633_REGULATOR_LDO6] = PCF50633_REGULATOR("ldo6", LDO6, 28), |
280 | PCF50633_REGULATOR("ldo2", PCF50633_REGULATOR_LDO2, 28), | 232 | [PCF50633_REGULATOR_HCLDO] = PCF50633_REGULATOR("hcldo", HCLDO, 28), |
281 | [PCF50633_REGULATOR_LDO3] = | 233 | [PCF50633_REGULATOR_MEMLDO] = PCF50633_REGULATOR("memldo", MEMLDO, 28), |
282 | PCF50633_REGULATOR("ldo3", PCF50633_REGULATOR_LDO3, 28), | ||
283 | [PCF50633_REGULATOR_LDO4] = | ||
284 | PCF50633_REGULATOR("ldo4", PCF50633_REGULATOR_LDO4, 28), | ||
285 | [PCF50633_REGULATOR_LDO5] = | ||
286 | PCF50633_REGULATOR("ldo5", PCF50633_REGULATOR_LDO5, 28), | ||
287 | [PCF50633_REGULATOR_LDO6] = | ||
288 | PCF50633_REGULATOR("ldo6", PCF50633_REGULATOR_LDO6, 28), | ||
289 | [PCF50633_REGULATOR_HCLDO] = | ||
290 | PCF50633_REGULATOR("hcldo", PCF50633_REGULATOR_HCLDO, 28), | ||
291 | [PCF50633_REGULATOR_MEMLDO] = | ||
292 | PCF50633_REGULATOR("memldo", PCF50633_REGULATOR_MEMLDO, 28), | ||
293 | }; | 234 | }; |
294 | 235 | ||
295 | static int __devinit pcf50633_regulator_probe(struct platform_device *pdev) | 236 | static int __devinit pcf50633_regulator_probe(struct platform_device *pdev) |
@@ -304,6 +245,7 @@ static int __devinit pcf50633_regulator_probe(struct platform_device *pdev) | |||
304 | config.dev = &pdev->dev; | 245 | config.dev = &pdev->dev; |
305 | config.init_data = pdev->dev.platform_data; | 246 | config.init_data = pdev->dev.platform_data; |
306 | config.driver_data = pcf; | 247 | config.driver_data = pcf; |
248 | config.regmap = pcf->regmap; | ||
307 | 249 | ||
308 | rdev = regulator_register(®ulators[pdev->id], &config); | 250 | rdev = regulator_register(®ulators[pdev->id], &config); |
309 | if (IS_ERR(rdev)) | 251 | if (IS_ERR(rdev)) |