Merge branch 'regulator-register' into regulator-drivers
[deliverable/linux.git] / drivers / regulator / tps6586x-regulator.c
CommitLineData
49610235
MR
1/*
2 * Regulator driver for TI TPS6586x
3 *
4 * Copyright (C) 2010 Compulab Ltd.
5 * Author: Mike Rapoport <mike@compulab.co.il>
6 *
7 * Based on da903x
8 * Copyright (C) 2006-2008 Marvell International Ltd.
9 * Copyright (C) 2008 Compulab Ltd.
10 *
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License version 2 as
13 * published by the Free Software Foundation.
14 */
15
49610235 16#include <linux/kernel.h>
65602c32 17#include <linux/module.h>
49610235
MR
18#include <linux/init.h>
19#include <linux/err.h>
20#include <linux/slab.h>
21#include <linux/platform_device.h>
22#include <linux/regulator/driver.h>
23#include <linux/regulator/machine.h>
24#include <linux/mfd/tps6586x.h>
25
26/* supply control and voltage setting */
27#define TPS6586X_SUPPLYENA 0x10
28#define TPS6586X_SUPPLYENB 0x11
29#define TPS6586X_SUPPLYENC 0x12
30#define TPS6586X_SUPPLYEND 0x13
31#define TPS6586X_SUPPLYENE 0x14
32#define TPS6586X_VCC1 0x20
33#define TPS6586X_VCC2 0x21
34#define TPS6586X_SM1V1 0x23
35#define TPS6586X_SM1V2 0x24
36#define TPS6586X_SM1SL 0x25
37#define TPS6586X_SM0V1 0x26
38#define TPS6586X_SM0V2 0x27
39#define TPS6586X_SM0SL 0x28
40#define TPS6586X_LDO2AV1 0x29
41#define TPS6586X_LDO2AV2 0x2A
42#define TPS6586X_LDO2BV1 0x2F
43#define TPS6586X_LDO2BV2 0x30
44#define TPS6586X_LDO4V1 0x32
45#define TPS6586X_LDO4V2 0x33
46
47/* converter settings */
48#define TPS6586X_SUPPLYV1 0x41
49#define TPS6586X_SUPPLYV2 0x42
50#define TPS6586X_SUPPLYV3 0x43
51#define TPS6586X_SUPPLYV4 0x44
52#define TPS6586X_SUPPLYV5 0x45
53#define TPS6586X_SUPPLYV6 0x46
54#define TPS6586X_SMODE1 0x47
55#define TPS6586X_SMODE2 0x48
56
57struct tps6586x_regulator {
58 struct regulator_desc desc;
59
60 int volt_reg;
61 int volt_shift;
62 int volt_nbits;
63 int enable_bit[2];
64 int enable_reg[2];
65
66 int *voltages;
67
68 /* for DVM regulators */
69 int go_reg;
70 int go_bit;
71};
72
73static inline struct device *to_tps6586x_dev(struct regulator_dev *rdev)
74{
75 return rdev_get_dev(rdev)->parent->parent;
76}
77
e1816235 78static int tps6586x_list_voltage(struct regulator_dev *rdev, unsigned selector)
49610235
MR
79{
80 struct tps6586x_regulator *info = rdev_get_drvdata(rdev);
81
4cc2e393 82 return info->voltages[selector] * 1000;
49610235
MR
83}
84
85
eed06517
AL
86static int tps6586x_set_voltage_sel(struct regulator_dev *rdev,
87 unsigned selector)
49610235 88{
eed06517
AL
89 struct tps6586x_regulator *ri = rdev_get_drvdata(rdev);
90 struct device *parent = to_tps6586x_dev(rdev);
91 int ret, val, rid = rdev_get_id(rdev);
49610235
MR
92 uint8_t mask;
93
eed06517
AL
94 val = selector << ri->volt_shift;
95 mask = ((1 << ri->volt_nbits) - 1) << ri->volt_shift;
3a93f2a9 96
eed06517
AL
97 ret = tps6586x_update(parent, ri->volt_reg, val, mask);
98 if (ret)
99 return ret;
49610235 100
eed06517
AL
101 /* Update go bit for DVM regulators */
102 switch (rid) {
103 case TPS6586X_ID_LDO_2:
104 case TPS6586X_ID_LDO_4:
105 case TPS6586X_ID_SM_0:
106 case TPS6586X_ID_SM_1:
107 ret = tps6586x_set_bits(parent, ri->go_reg, 1 << ri->go_bit);
108 break;
49610235 109 }
eed06517 110 return ret;
49610235
MR
111}
112
44a7cdab 113static int tps6586x_get_voltage_sel(struct regulator_dev *rdev)
49610235
MR
114{
115 struct tps6586x_regulator *ri = rdev_get_drvdata(rdev);
116 struct device *parent = to_tps6586x_dev(rdev);
117 uint8_t val, mask;
118 int ret;
119
120 ret = tps6586x_read(parent, ri->volt_reg, &val);
121 if (ret)
122 return ret;
123
124 mask = ((1 << ri->volt_nbits) - 1) << ri->volt_shift;
125 val = (val & mask) >> ri->volt_shift;
126
327531ba 127 if (val >= ri->desc.n_voltages)
49610235
MR
128 BUG();
129
44a7cdab 130 return val;
49610235
MR
131}
132
49610235
MR
133static int tps6586x_regulator_enable(struct regulator_dev *rdev)
134{
135 struct tps6586x_regulator *ri = rdev_get_drvdata(rdev);
136 struct device *parent = to_tps6586x_dev(rdev);
137
138 return tps6586x_set_bits(parent, ri->enable_reg[0],
139 1 << ri->enable_bit[0]);
140}
141
142static int tps6586x_regulator_disable(struct regulator_dev *rdev)
143{
144 struct tps6586x_regulator *ri = rdev_get_drvdata(rdev);
145 struct device *parent = to_tps6586x_dev(rdev);
146
147 return tps6586x_clr_bits(parent, ri->enable_reg[0],
148 1 << ri->enable_bit[0]);
149}
150
151static int tps6586x_regulator_is_enabled(struct regulator_dev *rdev)
152{
153 struct tps6586x_regulator *ri = rdev_get_drvdata(rdev);
154 struct device *parent = to_tps6586x_dev(rdev);
155 uint8_t reg_val;
156 int ret;
157
158 ret = tps6586x_read(parent, ri->enable_reg[0], &reg_val);
159 if (ret)
160 return ret;
161
162 return !!(reg_val & (1 << ri->enable_bit[0]));
163}
164
e1816235
AL
165static struct regulator_ops tps6586x_regulator_ops = {
166 .list_voltage = tps6586x_list_voltage,
44a7cdab 167 .get_voltage_sel = tps6586x_get_voltage_sel,
eed06517 168 .set_voltage_sel = tps6586x_set_voltage_sel,
49610235
MR
169
170 .is_enabled = tps6586x_regulator_is_enabled,
171 .enable = tps6586x_regulator_enable,
172 .disable = tps6586x_regulator_disable,
173};
174
175static int tps6586x_ldo_voltages[] = {
176 1250, 1500, 1800, 2500, 2700, 2850, 3100, 3300,
177};
178
179static int tps6586x_ldo4_voltages[] = {
180 1700, 1725, 1750, 1775, 1800, 1825, 1850, 1875,
181 1900, 1925, 1950, 1975, 2000, 2025, 2050, 2075,
182 2100, 2125, 2150, 2175, 2200, 2225, 2250, 2275,
183 2300, 2325, 2350, 2375, 2400, 2425, 2450, 2475,
184};
185
4cc2e393
GK
186static int tps6586x_sm2_voltages[] = {
187 3000, 3050, 3100, 3150, 3200, 3250, 3300, 3350,
188 3400, 3450, 3500, 3550, 3600, 3650, 3700, 3750,
189 3800, 3850, 3900, 3950, 4000, 4050, 4100, 4150,
190 4200, 4250, 4300, 4350, 4400, 4450, 4500, 4550,
191};
192
49610235
MR
193static int tps6586x_dvm_voltages[] = {
194 725, 750, 775, 800, 825, 850, 875, 900,
195 925, 950, 975, 1000, 1025, 1050, 1075, 1100,
196 1125, 1150, 1175, 1200, 1225, 1250, 1275, 1300,
197 1325, 1350, 1375, 1400, 1425, 1450, 1475, 1500,
198};
199
e1816235 200#define TPS6586X_REGULATOR(_id, vdata, vreg, shift, nbits, \
64db657b 201 ereg0, ebit0, ereg1, ebit1) \
49610235
MR
202 .desc = { \
203 .name = "REG-" #_id, \
e1816235 204 .ops = &tps6586x_regulator_ops, \
49610235
MR
205 .type = REGULATOR_VOLTAGE, \
206 .id = TPS6586X_ID_##_id, \
207 .n_voltages = ARRAY_SIZE(tps6586x_##vdata##_voltages), \
208 .owner = THIS_MODULE, \
209 }, \
210 .volt_reg = TPS6586X_##vreg, \
211 .volt_shift = (shift), \
212 .volt_nbits = (nbits), \
213 .enable_reg[0] = TPS6586X_SUPPLY##ereg0, \
214 .enable_bit[0] = (ebit0), \
215 .enable_reg[1] = TPS6586X_SUPPLY##ereg1, \
216 .enable_bit[1] = (ebit1), \
64db657b
DH
217 .voltages = tps6586x_##vdata##_voltages,
218
219#define TPS6586X_REGULATOR_DVM_GOREG(goreg, gobit) \
220 .go_reg = TPS6586X_##goreg, \
221 .go_bit = (gobit),
49610235
MR
222
223#define TPS6586X_LDO(_id, vdata, vreg, shift, nbits, \
224 ereg0, ebit0, ereg1, ebit1) \
64db657b 225{ \
e1816235 226 TPS6586X_REGULATOR(_id, vdata, vreg, shift, nbits, \
64db657b
DH
227 ereg0, ebit0, ereg1, ebit1) \
228}
49610235
MR
229
230#define TPS6586X_DVM(_id, vdata, vreg, shift, nbits, \
231 ereg0, ebit0, ereg1, ebit1, goreg, gobit) \
64db657b 232{ \
e1816235 233 TPS6586X_REGULATOR(_id, vdata, vreg, shift, nbits, \
64db657b
DH
234 ereg0, ebit0, ereg1, ebit1) \
235 TPS6586X_REGULATOR_DVM_GOREG(goreg, gobit) \
236}
49610235
MR
237
238static struct tps6586x_regulator tps6586x_regulator[] = {
239 TPS6586X_LDO(LDO_0, ldo, SUPPLYV1, 5, 3, ENC, 0, END, 0),
240 TPS6586X_LDO(LDO_3, ldo, SUPPLYV4, 0, 3, ENC, 2, END, 2),
241 TPS6586X_LDO(LDO_5, ldo, SUPPLYV6, 0, 3, ENE, 6, ENE, 6),
242 TPS6586X_LDO(LDO_6, ldo, SUPPLYV3, 0, 3, ENC, 4, END, 4),
243 TPS6586X_LDO(LDO_7, ldo, SUPPLYV3, 3, 3, ENC, 5, END, 5),
1b39ed0c 244 TPS6586X_LDO(LDO_8, ldo, SUPPLYV2, 5, 3, ENC, 6, END, 6),
49610235 245 TPS6586X_LDO(LDO_9, ldo, SUPPLYV6, 3, 3, ENE, 7, ENE, 7),
1b39ed0c 246 TPS6586X_LDO(LDO_RTC, ldo, SUPPLYV4, 3, 3, V4, 7, V4, 7),
49610235 247 TPS6586X_LDO(LDO_1, dvm, SUPPLYV1, 0, 5, ENC, 1, END, 1),
1b39ed0c 248 TPS6586X_LDO(SM_2, sm2, SUPPLYV2, 0, 5, ENC, 7, END, 7),
49610235
MR
249
250 TPS6586X_DVM(LDO_2, dvm, LDO2BV1, 0, 5, ENA, 3, ENB, 3, VCC2, 6),
251 TPS6586X_DVM(LDO_4, ldo4, LDO4V1, 0, 5, ENC, 3, END, 3, VCC1, 6),
252 TPS6586X_DVM(SM_0, dvm, SM0V1, 0, 5, ENA, 1, ENB, 1, VCC1, 2),
253 TPS6586X_DVM(SM_1, dvm, SM1V1, 0, 5, ENA, 0, ENB, 0, VCC1, 0),
254};
255
256/*
257 * TPS6586X has 2 enable bits that are OR'ed to determine the actual
258 * regulator state. Clearing one of this bits allows switching
259 * regulator on and of with single register write.
260 */
261static inline int tps6586x_regulator_preinit(struct device *parent,
262 struct tps6586x_regulator *ri)
263{
264 uint8_t val1, val2;
265 int ret;
266
1dbcf35c
DH
267 if (ri->enable_reg[0] == ri->enable_reg[1] &&
268 ri->enable_bit[0] == ri->enable_bit[1])
269 return 0;
270
49610235
MR
271 ret = tps6586x_read(parent, ri->enable_reg[0], &val1);
272 if (ret)
273 return ret;
274
275 ret = tps6586x_read(parent, ri->enable_reg[1], &val2);
276 if (ret)
277 return ret;
278
4f586707 279 if (!(val2 & (1 << ri->enable_bit[1])))
49610235
MR
280 return 0;
281
282 /*
283 * The regulator is on, but it's enabled with the bit we don't
284 * want to use, so we switch the enable bits
285 */
4f586707 286 if (!(val1 & (1 << ri->enable_bit[0]))) {
49610235
MR
287 ret = tps6586x_set_bits(parent, ri->enable_reg[0],
288 1 << ri->enable_bit[0]);
289 if (ret)
290 return ret;
291 }
292
293 return tps6586x_clr_bits(parent, ri->enable_reg[1],
294 1 << ri->enable_bit[1]);
295}
296
500c524a
XX
297static int tps6586x_regulator_set_slew_rate(struct platform_device *pdev)
298{
299 struct device *parent = pdev->dev.parent;
300 struct regulator_init_data *p = pdev->dev.platform_data;
301 struct tps6586x_settings *setting = p->driver_data;
302 uint8_t reg;
303
304 if (setting == NULL)
305 return 0;
306
307 if (!(setting->slew_rate & TPS6586X_SLEW_RATE_SET))
308 return 0;
309
310 /* only SM0 and SM1 can have the slew rate settings */
311 switch (pdev->id) {
312 case TPS6586X_ID_SM_0:
313 reg = TPS6586X_SM0SL;
314 break;
315 case TPS6586X_ID_SM_1:
316 reg = TPS6586X_SM1SL;
317 break;
318 default:
319 dev_warn(&pdev->dev, "Only SM0/SM1 can set slew rate\n");
320 return -EINVAL;
321 }
322
323 return tps6586x_write(parent, reg,
324 setting->slew_rate & TPS6586X_SLEW_RATE_MASK);
325}
326
49610235
MR
327static inline struct tps6586x_regulator *find_regulator_info(int id)
328{
329 struct tps6586x_regulator *ri;
330 int i;
331
332 for (i = 0; i < ARRAY_SIZE(tps6586x_regulator); i++) {
333 ri = &tps6586x_regulator[i];
334 if (ri->desc.id == id)
335 return ri;
336 }
337 return NULL;
338}
339
340static int __devinit tps6586x_regulator_probe(struct platform_device *pdev)
341{
342 struct tps6586x_regulator *ri = NULL;
343 struct regulator_dev *rdev;
344 int id = pdev->id;
345 int err;
346
394ee3d5 347 dev_dbg(&pdev->dev, "Probing regulator %d\n", id);
49610235
MR
348
349 ri = find_regulator_info(id);
350 if (ri == NULL) {
351 dev_err(&pdev->dev, "invalid regulator ID specified\n");
352 return -EINVAL;
353 }
354
355 err = tps6586x_regulator_preinit(pdev->dev.parent, ri);
356 if (err)
357 return err;
358
359 rdev = regulator_register(&ri->desc, &pdev->dev,
2c043bcb 360 pdev->dev.platform_data, ri, NULL);
49610235
MR
361 if (IS_ERR(rdev)) {
362 dev_err(&pdev->dev, "failed to register regulator %s\n",
363 ri->desc.name);
364 return PTR_ERR(rdev);
365 }
366
e7973c3c 367 platform_set_drvdata(pdev, rdev);
49610235 368
500c524a 369 return tps6586x_regulator_set_slew_rate(pdev);
49610235
MR
370}
371
372static int __devexit tps6586x_regulator_remove(struct platform_device *pdev)
373{
e7973c3c
AL
374 struct regulator_dev *rdev = platform_get_drvdata(pdev);
375
376 regulator_unregister(rdev);
49610235
MR
377 return 0;
378}
379
380static struct platform_driver tps6586x_regulator_driver = {
381 .driver = {
382 .name = "tps6586x-regulator",
383 .owner = THIS_MODULE,
384 },
385 .probe = tps6586x_regulator_probe,
386 .remove = __devexit_p(tps6586x_regulator_remove),
387};
388
389static int __init tps6586x_regulator_init(void)
390{
391 return platform_driver_register(&tps6586x_regulator_driver);
392}
393subsys_initcall(tps6586x_regulator_init);
394
395static void __exit tps6586x_regulator_exit(void)
396{
397 platform_driver_unregister(&tps6586x_regulator_driver);
398}
399module_exit(tps6586x_regulator_exit);
400
401MODULE_LICENSE("GPL");
402MODULE_AUTHOR("Mike Rapoport <mike@compulab.co.il>");
403MODULE_DESCRIPTION("Regulator Driver for TI TPS6586X PMIC");
404MODULE_ALIAS("platform:tps6586x-regulator");
This page took 0.121939 seconds and 5 git commands to generate.