]> nv-tegra.nvidia Code Review - linux-2.6.git/blob - drivers/regulator/tps6586x-regulator.c
8c33fea313f8e7e320487a002113dc8f00cab270
[linux-2.6.git] / drivers / regulator / tps6586x-regulator.c
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
16 #include <linux/kernel.h>
17 #include <linux/init.h>
18 #include <linux/err.h>
19 #include <linux/slab.h>
20 #include <linux/platform_device.h>
21 #include <linux/regulator/driver.h>
22 #include <linux/regulator/machine.h>
23 #include <linux/mfd/tps6586x.h>
24 #include <linux/delay.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
57 struct 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         int *voltages;
66         int delay; /* delay in us for regulator to stabilize */
67
68         /* for DVM regulators */
69         int go_reg;
70         int go_bit;
71 };
72
73 static inline struct device *to_tps6586x_dev(struct regulator_dev *rdev)
74 {
75         return rdev_get_dev(rdev)->parent->parent;
76 }
77
78 static int tps6586x_ldo_list_voltage(struct regulator_dev *rdev,
79                                      unsigned selector)
80 {
81         struct tps6586x_regulator *info = rdev_get_drvdata(rdev);
82
83         return info->voltages[selector] * 1000;
84 }
85
86
87 static int __tps6586x_ldo_set_voltage(struct device *parent,
88                                       struct tps6586x_regulator *ri,
89                                       int min_uV, int max_uV,
90                                       unsigned *selector)
91 {
92         int val, uV;
93         uint8_t mask;
94
95         for (val = 0; val < ri->desc.n_voltages; val++) {
96                 uV = ri->voltages[val] * 1000;
97
98                 /* LDO0 has minimal voltage 1.2 rather than 1.25 */
99                 if (ri->desc.id == TPS6586X_ID_LDO_0 && val == 0)
100                         uV -= 50 * 1000;
101
102                 /* use the first in-range value */
103                 if (min_uV <= uV && uV <= max_uV) {
104
105                         *selector = val;
106
107                         val <<= ri->volt_shift;
108                         mask = ((1 << ri->volt_nbits) - 1) << ri->volt_shift;
109
110                         return tps6586x_update(parent, ri->volt_reg, val, mask);
111                 }
112         }
113
114         return -EINVAL;
115 }
116
117 static int tps6586x_ldo_set_voltage(struct regulator_dev *rdev,
118                                     int min_uV, int max_uV, unsigned *selector)
119 {
120         struct tps6586x_regulator *ri = rdev_get_drvdata(rdev);
121         struct device *parent = to_tps6586x_dev(rdev);
122
123         return __tps6586x_ldo_set_voltage(parent, ri, min_uV, max_uV,
124                                           selector);
125 }
126
127 static int tps6586x_ldo_get_voltage(struct regulator_dev *rdev)
128 {
129         struct tps6586x_regulator *ri = rdev_get_drvdata(rdev);
130         struct device *parent = to_tps6586x_dev(rdev);
131         uint8_t val, mask;
132         int ret;
133
134         ret = tps6586x_read(parent, ri->volt_reg, &val);
135         if (ret)
136                 return ret;
137
138         mask = ((1 << ri->volt_nbits) - 1) << ri->volt_shift;
139         val = (val & mask) >> ri->volt_shift;
140
141         if (val >= ri->desc.n_voltages)
142                 BUG();
143
144         return ri->voltages[val] * 1000;
145 }
146
147 static int tps6586x_dvm_set_voltage(struct regulator_dev *rdev,
148                                     int min_uV, int max_uV, unsigned *selector)
149 {
150         struct tps6586x_regulator *ri = rdev_get_drvdata(rdev);
151         struct device *parent = to_tps6586x_dev(rdev);
152         int ret;
153
154         ret = __tps6586x_ldo_set_voltage(parent, ri, min_uV, max_uV,
155                                          selector);
156         if (ret)
157                 return ret;
158
159         return tps6586x_set_bits(parent, ri->go_reg, 1 << ri->go_bit);
160 }
161
162 static int tps6586x_regulator_enable(struct regulator_dev *rdev)
163 {
164         struct tps6586x_regulator *ri = rdev_get_drvdata(rdev);
165         struct device *parent = to_tps6586x_dev(rdev);
166
167         return tps6586x_set_bits(parent, ri->enable_reg[0],
168                                  1 << ri->enable_bit[0]);
169 }
170
171 static int tps6586x_regulator_disable(struct regulator_dev *rdev)
172 {
173         struct tps6586x_regulator *ri = rdev_get_drvdata(rdev);
174         struct device *parent = to_tps6586x_dev(rdev);
175
176         return tps6586x_clr_bits(parent, ri->enable_reg[0],
177                                  1 << ri->enable_bit[0]);
178 }
179
180 static int tps6586x_regulator_is_enabled(struct regulator_dev *rdev)
181 {
182         struct tps6586x_regulator *ri = rdev_get_drvdata(rdev);
183         struct device *parent = to_tps6586x_dev(rdev);
184         uint8_t reg_val;
185         int ret;
186
187         ret = tps6586x_read(parent, ri->enable_reg[0], &reg_val);
188         if (ret)
189                 return ret;
190
191         return !!(reg_val & (1 << ri->enable_bit[0]));
192 }
193
194 static int tps6586x_regulator_enable_time(struct regulator_dev *rdev)
195 {
196         struct tps6586x_regulator *ri = rdev_get_drvdata(rdev);
197
198         return ri->delay;
199 }
200
201 static struct regulator_ops tps6586x_regulator_ldo_ops = {
202         .list_voltage = tps6586x_ldo_list_voltage,
203         .get_voltage = tps6586x_ldo_get_voltage,
204         .set_voltage = tps6586x_ldo_set_voltage,
205         .enable_time = tps6586x_regulator_enable_time,
206         .is_enabled = tps6586x_regulator_is_enabled,
207         .enable = tps6586x_regulator_enable,
208         .disable = tps6586x_regulator_disable,
209 };
210
211 static struct regulator_ops tps6586x_regulator_dvm_ops = {
212         .list_voltage = tps6586x_ldo_list_voltage,
213         .get_voltage = tps6586x_ldo_get_voltage,
214         .set_voltage = tps6586x_dvm_set_voltage,
215         .enable_time = tps6586x_regulator_enable_time,
216         .is_enabled = tps6586x_regulator_is_enabled,
217         .enable = tps6586x_regulator_enable,
218         .disable = tps6586x_regulator_disable,
219 };
220
221 static int tps6586x_ldo_voltages[] = {
222         1250, 1500, 1800, 2500, 2700, 2850, 3100, 3300,
223 };
224
225 static int tps6586x_ldo4_voltages[] = {
226         1700, 1725, 1750, 1775, 1800, 1825, 1850, 1875,
227         1900, 1925, 1950, 1975, 2000, 2025, 2050, 2075,
228         2100, 2125, 2150, 2175, 2200, 2225, 2250, 2275,
229         2300, 2325, 2350, 2375, 2400, 2425, 2450, 2475,
230 };
231
232 static int tps6586x_sm2_voltages[] = {
233         3000, 3050, 3100, 3150, 3200, 3250, 3300, 3350,
234         3400, 3450, 3500, 3550, 3600, 3650, 3700, 3750,
235         3800, 3850, 3900, 3950, 4000, 4050, 4100, 4150,
236         4200, 4250, 4300, 4350, 4400, 4450, 4500, 4550,
237 };
238
239 static int tps6586x_dvm_voltages[] = {
240          725,  750,  775,  800,  825,  850,  875,  900,
241          925,  950,  975, 1000, 1025, 1050, 1075, 1100,
242         1125, 1150, 1175, 1200, 1225, 1250, 1275, 1300,
243         1325, 1350, 1375, 1400, 1425, 1450, 1475, 1500,
244 };
245
246 #define TPS6586X_REGULATOR(_id, vdata, _ops, vreg, shift, nbits,        \
247                            ereg0, ebit0, ereg1, ebit1, en_time)         \
248         .desc   = {                                                     \
249                 .name   = "REG-" #_id,                                  \
250                 .ops    = &tps6586x_regulator_##_ops,                   \
251                 .type   = REGULATOR_VOLTAGE,                            \
252                 .id     = TPS6586X_ID_##_id,                            \
253                 .n_voltages = ARRAY_SIZE(tps6586x_##vdata##_voltages),  \
254                 .owner  = THIS_MODULE,                                  \
255         },                                                              \
256         .volt_reg       = TPS6586X_##vreg,                              \
257         .volt_shift     = (shift),                                      \
258         .volt_nbits     = (nbits),                                      \
259         .enable_reg[0]  = TPS6586X_SUPPLY##ereg0,                       \
260         .enable_bit[0]  = (ebit0),                                      \
261         .enable_reg[1]  = TPS6586X_SUPPLY##ereg1,                       \
262         .enable_bit[1]  = (ebit1),                                      \
263         .voltages       = tps6586x_##vdata##_voltages,                  \
264         .delay          = en_time,
265
266 #define TPS6586X_REGULATOR_DVM_GOREG(goreg, gobit)                      \
267         .go_reg = TPS6586X_##goreg,                                     \
268         .go_bit = (gobit),
269
270 #define TPS6586X_LDO(_id, vdata, vreg, shift, nbits,                    \
271                      ereg0, ebit0, ereg1, ebit1, en_time)               \
272 {                                                                       \
273         TPS6586X_REGULATOR(_id, vdata, ldo_ops, vreg, shift, nbits,     \
274                            ereg0, ebit0, ereg1, ebit1, en_time)         \
275 }
276
277 #define TPS6586X_DVM(_id, vdata, vreg, shift, nbits,                    \
278                      ereg0, ebit0, ereg1, ebit1, goreg, gobit, en_time) \
279 {                                                                       \
280         TPS6586X_REGULATOR(_id, vdata, dvm_ops, vreg, shift, nbits,     \
281                            ereg0, ebit0, ereg1, ebit1, en_time)         \
282         TPS6586X_REGULATOR_DVM_GOREG(goreg, gobit)                      \
283 }
284
285 static struct tps6586x_regulator tps6586x_regulator[] = {
286         TPS6586X_LDO(LDO_0, ldo, SUPPLYV1, 5, 3, ENC, 0, END, 0, 4000),
287         TPS6586X_LDO(LDO_1, dvm, SUPPLYV1, 0, 5, ENC, 1, END, 1, 4000),
288         TPS6586X_LDO(LDO_3, ldo, SUPPLYV4, 0, 3, ENC, 2, END, 2, 3000),
289         TPS6586X_LDO(LDO_5, ldo, SUPPLYV6, 0, 3, ENE, 6, ENE, 6, 3000),
290         TPS6586X_LDO(LDO_6, ldo, SUPPLYV3, 0, 3, ENC, 4, END, 4, 15000),
291         TPS6586X_LDO(LDO_7, ldo, SUPPLYV3, 3, 3, ENC, 5, END, 5, 15000),
292         TPS6586X_LDO(LDO_8, ldo, SUPPLYV2, 5, 3, ENC, 6, END, 6, 15000),
293         TPS6586X_LDO(LDO_9, ldo, SUPPLYV6, 3, 3, ENE, 7, ENE, 7, 3000),
294         TPS6586X_LDO(LDO_RTC, ldo, SUPPLYV4, 3, 3, V4, 7, V4, 7, 0),
295         TPS6586X_LDO(SM_2, sm2, SUPPLYV2, 0, 5, ENC, 7, END, 7, 0),
296
297         TPS6586X_DVM(LDO_2, dvm, LDO2BV1, 0, 5, ENA, 3, ENB, 3, VCC2, 6, 3000),
298         TPS6586X_DVM(SM_0, dvm, SM0V1, 0, 5, ENA, 1, ENB, 1, VCC1, 2, 4000),
299         TPS6586X_DVM(SM_1, dvm, SM1V1, 0, 5, ENA, 0, ENB, 0, VCC1, 0, 4000),
300         TPS6586X_DVM(LDO_4, ldo4, LDO4V1, 0, 5, ENC, 3, END, 3, VCC1, 6, 15000),
301 };
302
303 /*
304  * TPS6586X has 2 enable bits that are OR'ed to determine the actual
305  * regulator state. Clearing one of this bits allows switching
306  * regulator on and of with single register write.
307  */
308 static inline int tps6586x_regulator_preinit(struct device *parent,
309                                              struct tps6586x_regulator *ri)
310 {
311         uint8_t val1, val2;
312         int ret;
313
314         if (ri->enable_reg[0] == ri->enable_reg[1] &&
315             ri->enable_bit[0] == ri->enable_bit[1])
316                         return 0;
317
318         ret = tps6586x_read(parent, ri->enable_reg[0], &val1);
319         if (ret)
320                 return ret;
321
322         ret = tps6586x_read(parent, ri->enable_reg[1], &val2);
323         if (ret)
324                 return ret;
325
326         if (!(val2 & (1 << ri->enable_bit[1])))
327                 return 0;
328
329         /*
330          * The regulator is on, but it's enabled with the bit we don't
331          * want to use, so we switch the enable bits
332          */
333         if (!(val1 & (1 << ri->enable_bit[0]))) {
334                 ret = tps6586x_set_bits(parent, ri->enable_reg[0],
335                                         1 << ri->enable_bit[0]);
336                 if (ret)
337                         return ret;
338         }
339
340         return tps6586x_clr_bits(parent, ri->enable_reg[1],
341                                  1 << ri->enable_bit[1]);
342 }
343
344 static inline struct tps6586x_regulator *find_regulator_info(int id)
345 {
346         struct tps6586x_regulator *ri;
347         int i;
348
349         for (i = 0; i < ARRAY_SIZE(tps6586x_regulator); i++) {
350                 ri = &tps6586x_regulator[i];
351                 if (ri->desc.id == id)
352                         return ri;
353         }
354         return NULL;
355 }
356
357 static int __devinit tps6586x_regulator_probe(struct platform_device *pdev)
358 {
359         struct tps6586x_regulator *ri = NULL;
360         struct regulator_dev *rdev;
361         int id = pdev->id;
362         int err;
363
364         dev_dbg(&pdev->dev, "Probing reulator %d\n", id);
365
366         ri = find_regulator_info(id);
367         if (ri == NULL) {
368                 dev_err(&pdev->dev, "invalid regulator ID specified\n");
369                 return -EINVAL;
370         }
371
372         err = tps6586x_regulator_preinit(pdev->dev.parent, ri);
373         if (err)
374                 return err;
375
376         rdev = regulator_register(&ri->desc, &pdev->dev,
377                                   pdev->dev.platform_data, ri);
378         if (IS_ERR(rdev)) {
379                 dev_err(&pdev->dev, "failed to register regulator %s\n",
380                                 ri->desc.name);
381                 return PTR_ERR(rdev);
382         }
383
384         platform_set_drvdata(pdev, rdev);
385
386         return 0;
387 }
388
389 static int __devexit tps6586x_regulator_remove(struct platform_device *pdev)
390 {
391         struct regulator_dev *rdev = platform_get_drvdata(pdev);
392
393         regulator_unregister(rdev);
394         return 0;
395 }
396
397 static struct platform_driver tps6586x_regulator_driver = {
398         .driver = {
399                 .name   = "tps6586x-regulator",
400                 .owner  = THIS_MODULE,
401         },
402         .probe          = tps6586x_regulator_probe,
403         .remove         = __devexit_p(tps6586x_regulator_remove),
404 };
405
406 static int __init tps6586x_regulator_init(void)
407 {
408         return platform_driver_register(&tps6586x_regulator_driver);
409 }
410 subsys_initcall(tps6586x_regulator_init);
411
412 static void __exit tps6586x_regulator_exit(void)
413 {
414         platform_driver_unregister(&tps6586x_regulator_driver);
415 }
416 module_exit(tps6586x_regulator_exit);
417
418 MODULE_LICENSE("GPL");
419 MODULE_AUTHOR("Mike Rapoport <mike@compulab.co.il>");
420 MODULE_DESCRIPTION("Regulator Driver for TI TPS6586X PMIC");
421 MODULE_ALIAS("platform:tps6586x-regulator");