Merge tag 'nfs-for-3.4-3' of git://git.linux-nfs.org/projects/trondmy/linux-nfs
[pandora-kernel.git] / drivers / regulator / tps65912-regulator.c
1 /*
2  * tps65912.c  --  TI tps65912
3  *
4  * Copyright 2011 Texas Instruments Inc.
5  *
6  * Author: Margarita Olaya Cabrera <magi@slimlogic.co.uk>
7  *
8  *  This program is free software; you can redistribute it and/or modify it
9  *  under  the terms of the GNU General  Public License as published by the
10  *  Free Software Foundation;  either version 2 of the License, or (at your
11  *  option) any later version.
12  *
13  * This driver is based on wm8350 implementation.
14  */
15
16 #include <linux/kernel.h>
17 #include <linux/module.h>
18 #include <linux/init.h>
19 #include <linux/err.h>
20 #include <linux/platform_device.h>
21 #include <linux/regulator/driver.h>
22 #include <linux/regulator/machine.h>
23 #include <linux/delay.h>
24 #include <linux/slab.h>
25 #include <linux/gpio.h>
26 #include <linux/mfd/tps65912.h>
27
28 /* DCDC's */
29 #define TPS65912_REG_DCDC1      0
30 #define TPS65912_REG_DCDC2      1
31 #define TPS65912_REG_DCDC3      2
32 #define TPS65912_REG_DCDC4      3
33
34 /* LDOs */
35 #define TPS65912_REG_LDO1       4
36 #define TPS65912_REG_LDO2       5
37 #define TPS65912_REG_LDO3       6
38 #define TPS65912_REG_LDO4       7
39 #define TPS65912_REG_LDO5       8
40 #define TPS65912_REG_LDO6       9
41 #define TPS65912_REG_LDO7       10
42 #define TPS65912_REG_LDO8       11
43 #define TPS65912_REG_LDO9       12
44 #define TPS65912_REG_LDO10      13
45
46 /* Number of step-down converters available */
47 #define TPS65912_NUM_DCDC       4
48
49 /* Number of LDO voltage regulators  available */
50 #define TPS65912_NUM_LDO        10
51
52 /* Number of total regulators available */
53 #define TPS65912_NUM_REGULATOR          (TPS65912_NUM_DCDC + TPS65912_NUM_LDO)
54
55 #define TPS65912_REG_ENABLED    0x80
56 #define OP_SELREG_MASK          0x40
57 #define OP_SELREG_SHIFT         6
58
59 struct tps_info {
60         const char *name;
61 };
62
63 static struct tps_info tps65912_regs[] = {
64         {
65                 .name = "DCDC1",
66         },
67         {
68                 .name = "DCDC2",
69         },
70         {
71                 .name = "DCDC3",
72         },
73         {
74                 .name = "DCDC4",
75         },
76         {
77                 .name = "LDO1",
78         },
79         {
80                 .name = "LDO2",
81         },
82         {
83                 .name = "LDO3",
84         },
85         {
86                 .name = "LDO4",
87         },
88         {
89                 .name = "LDO5",
90         },
91         {
92                 .name = "LDO6",
93         },
94         {
95                 .name = "LDO7",
96         },
97         {
98                 .name = "LDO8",
99         },
100         {
101                 .name = "LDO9",
102         },
103         {
104                 .name = "LDO10",
105         },
106 };
107
108 struct tps65912_reg {
109         struct regulator_desc desc[TPS65912_NUM_REGULATOR];
110         struct tps65912 *mfd;
111         struct regulator_dev *rdev[TPS65912_NUM_REGULATOR];
112         struct tps_info *info[TPS65912_NUM_REGULATOR];
113         /* for read/write access */
114         struct mutex io_lock;
115         int mode;
116         int (*get_ctrl_reg)(int);
117         int dcdc_range[TPS65912_NUM_DCDC];
118         int pwm_mode_reg;
119         int eco_reg;
120 };
121
122 static int tps65912_get_range(struct tps65912_reg *pmic, int id)
123 {
124         struct tps65912 *mfd = pmic->mfd;
125         int range;
126
127         switch (id) {
128         case TPS65912_REG_DCDC1:
129                 range = tps65912_reg_read(mfd, TPS65912_DCDC1_LIMIT);
130                 break;
131         case TPS65912_REG_DCDC2:
132                 range = tps65912_reg_read(mfd, TPS65912_DCDC2_LIMIT);
133                 break;
134         case TPS65912_REG_DCDC3:
135                 range = tps65912_reg_read(mfd, TPS65912_DCDC3_LIMIT);
136                 break;
137         case TPS65912_REG_DCDC4:
138                 range = tps65912_reg_read(mfd, TPS65912_DCDC4_LIMIT);
139                 break;
140         default:
141                 return 0;
142         }
143
144         if (range >= 0)
145                 range = (range & DCDC_LIMIT_RANGE_MASK)
146                         >> DCDC_LIMIT_RANGE_SHIFT;
147
148         pmic->dcdc_range[id] = range;
149         return range;
150 }
151
152 static unsigned long tps65912_vsel_to_uv_range0(u8 vsel)
153 {
154         unsigned long uv;
155
156         uv = ((vsel * 12500) + 500000);
157         return uv;
158 }
159
160 static unsigned long tps65912_vsel_to_uv_range1(u8 vsel)
161 {
162         unsigned long uv;
163
164          uv = ((vsel * 12500) + 700000);
165         return uv;
166 }
167
168 static unsigned long tps65912_vsel_to_uv_range2(u8 vsel)
169 {
170         unsigned long uv;
171
172         uv = ((vsel * 25000) + 500000);
173         return uv;
174 }
175
176 static unsigned long tps65912_vsel_to_uv_range3(u8 vsel)
177 {
178         unsigned long uv;
179
180         if (vsel == 0x3f)
181                 uv = 3800000;
182         else
183                 uv = ((vsel * 50000) + 500000);
184
185         return uv;
186 }
187
188 static unsigned long tps65912_vsel_to_uv_ldo(u8 vsel)
189 {
190         unsigned long uv = 0;
191
192         if (vsel <= 32)
193                 uv = ((vsel * 25000) + 800000);
194         else if (vsel > 32 && vsel <= 60)
195                 uv = (((vsel - 32) * 50000) + 1600000);
196         else if (vsel > 60)
197                 uv = (((vsel - 60) * 100000) + 3000000);
198
199         return uv;
200 }
201
202 static int tps65912_get_ctrl_register(int id)
203 {
204         if (id >= TPS65912_REG_DCDC1 && id <= TPS65912_REG_LDO4)
205                 return id * 3 + TPS65912_DCDC1_AVS;
206         else if (id >= TPS65912_REG_LDO5 && id <= TPS65912_REG_LDO10)
207                 return id - TPS65912_REG_LDO5 + TPS65912_LDO5;
208         else
209                 return -EINVAL;
210 }
211
212 static int tps65912_get_sel_register(struct tps65912_reg *pmic, int id)
213 {
214         struct tps65912 *mfd = pmic->mfd;
215         int opvsel;
216         u8 reg = 0;
217
218         if (id >= TPS65912_REG_DCDC1 && id <= TPS65912_REG_LDO4) {
219                 opvsel = tps65912_reg_read(mfd, id * 3 + TPS65912_DCDC1_OP);
220                 if (opvsel & OP_SELREG_MASK)
221                         reg = id * 3 + TPS65912_DCDC1_AVS;
222                 else
223                         reg = id * 3 + TPS65912_DCDC1_OP;
224         } else if (id >= TPS65912_REG_LDO5 && id <= TPS65912_REG_LDO10) {
225                 reg = id - TPS65912_REG_LDO5 + TPS65912_LDO5;
226         } else {
227                 return -EINVAL;
228         }
229
230         return reg;
231 }
232
233 static int tps65912_get_mode_regiters(struct tps65912_reg *pmic, int id)
234 {
235         switch (id) {
236         case TPS65912_REG_DCDC1:
237                 pmic->pwm_mode_reg = TPS65912_DCDC1_CTRL;
238                 pmic->eco_reg = TPS65912_DCDC1_AVS;
239                 break;
240         case TPS65912_REG_DCDC2:
241                 pmic->pwm_mode_reg = TPS65912_DCDC2_CTRL;
242                 pmic->eco_reg = TPS65912_DCDC2_AVS;
243                 break;
244         case TPS65912_REG_DCDC3:
245                 pmic->pwm_mode_reg = TPS65912_DCDC3_CTRL;
246                 pmic->eco_reg = TPS65912_DCDC3_AVS;
247                 break;
248         case TPS65912_REG_DCDC4:
249                 pmic->pwm_mode_reg = TPS65912_DCDC4_CTRL;
250                 pmic->eco_reg = TPS65912_DCDC4_AVS;
251                 break;
252         default:
253                 return -EINVAL;
254         }
255
256         return 0;
257 }
258
259 static int tps65912_reg_is_enabled(struct regulator_dev *dev)
260 {
261         struct tps65912_reg *pmic = rdev_get_drvdata(dev);
262         struct tps65912 *mfd = pmic->mfd;
263         int reg, value, id = rdev_get_id(dev);
264
265         if (id < TPS65912_REG_DCDC1 || id > TPS65912_REG_LDO10)
266                 return -EINVAL;
267
268         reg = pmic->get_ctrl_reg(id);
269         if (reg < 0)
270                 return reg;
271
272         value = tps65912_reg_read(mfd, reg);
273         if (value < 0)
274                 return value;
275
276         return value & TPS65912_REG_ENABLED;
277 }
278
279 static int tps65912_reg_enable(struct regulator_dev *dev)
280 {
281         struct tps65912_reg *pmic = rdev_get_drvdata(dev);
282         struct tps65912 *mfd = pmic->mfd;
283         int id = rdev_get_id(dev);
284         int reg;
285
286         if (id < TPS65912_REG_DCDC1 || id > TPS65912_REG_LDO10)
287                 return -EINVAL;
288
289         reg = pmic->get_ctrl_reg(id);
290         if (reg < 0)
291                 return reg;
292
293         return tps65912_set_bits(mfd, reg, TPS65912_REG_ENABLED);
294 }
295
296 static int tps65912_reg_disable(struct regulator_dev *dev)
297 {
298         struct tps65912_reg *pmic = rdev_get_drvdata(dev);
299         struct tps65912 *mfd = pmic->mfd;
300         int id = rdev_get_id(dev), reg;
301
302         reg = pmic->get_ctrl_reg(id);
303         if (reg < 0)
304                 return reg;
305
306         return tps65912_clear_bits(mfd, reg, TPS65912_REG_ENABLED);
307 }
308
309 static int tps65912_set_mode(struct regulator_dev *dev, unsigned int mode)
310 {
311         struct tps65912_reg *pmic = rdev_get_drvdata(dev);
312         struct tps65912 *mfd = pmic->mfd;
313         int pwm_mode, eco, id = rdev_get_id(dev);
314
315         tps65912_get_mode_regiters(pmic, id);
316
317         pwm_mode = tps65912_reg_read(mfd, pmic->pwm_mode_reg);
318         eco = tps65912_reg_read(mfd, pmic->eco_reg);
319
320         pwm_mode &= DCDCCTRL_DCDC_MODE_MASK;
321         eco &= DCDC_AVS_ECO_MASK;
322
323         switch (mode) {
324         case REGULATOR_MODE_FAST:
325                 /* Verify if mode alredy set */
326                 if (pwm_mode && !eco)
327                         break;
328                 tps65912_set_bits(mfd, pmic->pwm_mode_reg, DCDCCTRL_DCDC_MODE_MASK);
329                 tps65912_clear_bits(mfd, pmic->eco_reg, DCDC_AVS_ECO_MASK);
330                 break;
331         case REGULATOR_MODE_NORMAL:
332         case REGULATOR_MODE_IDLE:
333                 if (!pwm_mode && !eco)
334                         break;
335                 tps65912_clear_bits(mfd, pmic->pwm_mode_reg, DCDCCTRL_DCDC_MODE_MASK);
336                 tps65912_clear_bits(mfd, pmic->eco_reg, DCDC_AVS_ECO_MASK);
337                 break;
338         case REGULATOR_MODE_STANDBY:
339                 if (!pwm_mode && eco)
340                         break;
341                 tps65912_clear_bits(mfd, pmic->pwm_mode_reg, DCDCCTRL_DCDC_MODE_MASK);
342                 tps65912_set_bits(mfd, pmic->eco_reg, DCDC_AVS_ECO_MASK);
343                 break;
344         default:
345                 return -EINVAL;
346         }
347
348         return 0;
349 }
350
351 static unsigned int tps65912_get_mode(struct regulator_dev *dev)
352 {
353         struct tps65912_reg *pmic = rdev_get_drvdata(dev);
354         struct tps65912 *mfd = pmic->mfd;
355         int pwm_mode, eco, mode = 0, id = rdev_get_id(dev);
356
357         tps65912_get_mode_regiters(pmic, id);
358
359         pwm_mode = tps65912_reg_read(mfd, pmic->pwm_mode_reg);
360         eco = tps65912_reg_read(mfd, pmic->eco_reg);
361
362         pwm_mode &= DCDCCTRL_DCDC_MODE_MASK;
363         eco &= DCDC_AVS_ECO_MASK;
364
365         if (pwm_mode && !eco)
366                 mode = REGULATOR_MODE_FAST;
367         else if (!pwm_mode && !eco)
368                 mode = REGULATOR_MODE_NORMAL;
369         else if (!pwm_mode && eco)
370                 mode = REGULATOR_MODE_STANDBY;
371
372         return mode;
373 }
374
375 static int tps65912_list_voltage_dcdc(struct regulator_dev *dev,
376                                         unsigned selector)
377 {
378         struct tps65912_reg *pmic = rdev_get_drvdata(dev);
379         int range, voltage = 0, id = rdev_get_id(dev);
380
381         if (id > TPS65912_REG_DCDC4)
382                 return -EINVAL;
383
384         range = pmic->dcdc_range[id];
385
386         switch (range) {
387         case 0:
388                 /* 0.5 - 1.2875V in 12.5mV steps */
389                 voltage = tps65912_vsel_to_uv_range0(selector);
390                 break;
391         case 1:
392                 /* 0.7 - 1.4875V in 12.5mV steps */
393                 voltage = tps65912_vsel_to_uv_range1(selector);
394                 break;
395         case 2:
396                 /* 0.5 - 2.075V in 25mV steps */
397                 voltage = tps65912_vsel_to_uv_range2(selector);
398                 break;
399         case 3:
400                 /* 0.5 - 3.8V in 50mV steps */
401                 voltage = tps65912_vsel_to_uv_range3(selector);
402                 break;
403         }
404         return voltage;
405 }
406
407 static int tps65912_get_voltage_dcdc(struct regulator_dev *dev)
408 {
409         struct tps65912_reg *pmic = rdev_get_drvdata(dev);
410         struct tps65912 *mfd = pmic->mfd;
411         int id = rdev_get_id(dev);
412         int reg, vsel;
413
414         reg = tps65912_get_sel_register(pmic, id);
415         if (reg < 0)
416                 return reg;
417
418         vsel = tps65912_reg_read(mfd, reg);
419         vsel &= 0x3F;
420
421         return tps65912_list_voltage_dcdc(dev, vsel);
422 }
423
424 static int tps65912_set_voltage_sel(struct regulator_dev *dev,
425                                          unsigned selector)
426 {
427         struct tps65912_reg *pmic = rdev_get_drvdata(dev);
428         struct tps65912 *mfd = pmic->mfd;
429         int id = rdev_get_id(dev);
430         int value;
431         u8 reg;
432
433         reg = tps65912_get_sel_register(pmic, id);
434         value = tps65912_reg_read(mfd, reg);
435         value &= 0xC0;
436         return tps65912_reg_write(mfd, reg, selector | value);
437 }
438
439 static int tps65912_get_voltage_ldo(struct regulator_dev *dev)
440 {
441         struct tps65912_reg *pmic = rdev_get_drvdata(dev);
442         struct tps65912 *mfd = pmic->mfd;
443         int id = rdev_get_id(dev);
444         int vsel = 0;
445         u8 reg;
446
447         reg = tps65912_get_sel_register(pmic, id);
448         vsel = tps65912_reg_read(mfd, reg);
449         vsel &= 0x3F;
450
451         return tps65912_vsel_to_uv_ldo(vsel);
452 }
453
454 static int tps65912_list_voltage_ldo(struct regulator_dev *dev,
455                                         unsigned selector)
456 {
457         int ldo = rdev_get_id(dev);
458
459         if (ldo < TPS65912_REG_LDO1 || ldo > TPS65912_REG_LDO10)
460                 return -EINVAL;
461
462         return tps65912_vsel_to_uv_ldo(selector);
463 }
464
465 /* Operations permitted on DCDCx */
466 static struct regulator_ops tps65912_ops_dcdc = {
467         .is_enabled = tps65912_reg_is_enabled,
468         .enable = tps65912_reg_enable,
469         .disable = tps65912_reg_disable,
470         .set_mode = tps65912_set_mode,
471         .get_mode = tps65912_get_mode,
472         .get_voltage = tps65912_get_voltage_dcdc,
473         .set_voltage_sel = tps65912_set_voltage_sel,
474         .list_voltage = tps65912_list_voltage_dcdc,
475 };
476
477 /* Operations permitted on LDOx */
478 static struct regulator_ops tps65912_ops_ldo = {
479         .is_enabled = tps65912_reg_is_enabled,
480         .enable = tps65912_reg_enable,
481         .disable = tps65912_reg_disable,
482         .get_voltage = tps65912_get_voltage_ldo,
483         .set_voltage_sel = tps65912_set_voltage_sel,
484         .list_voltage = tps65912_list_voltage_ldo,
485 };
486
487 static __devinit int tps65912_probe(struct platform_device *pdev)
488 {
489         struct tps65912 *tps65912 = dev_get_drvdata(pdev->dev.parent);
490         struct tps_info *info;
491         struct regulator_init_data *reg_data;
492         struct regulator_dev *rdev;
493         struct tps65912_reg *pmic;
494         struct tps65912_board *pmic_plat_data;
495         int i, err;
496
497         pmic_plat_data = dev_get_platdata(tps65912->dev);
498         if (!pmic_plat_data)
499                 return -EINVAL;
500
501         reg_data = pmic_plat_data->tps65912_pmic_init_data;
502
503         pmic = kzalloc(sizeof(*pmic), GFP_KERNEL);
504         if (!pmic)
505                 return -ENOMEM;
506
507         mutex_init(&pmic->io_lock);
508         pmic->mfd = tps65912;
509         platform_set_drvdata(pdev, pmic);
510
511         pmic->get_ctrl_reg = &tps65912_get_ctrl_register;
512         info = tps65912_regs;
513
514         for (i = 0; i < TPS65912_NUM_REGULATOR; i++, info++, reg_data++) {
515                 int range = 0;
516                 /* Register the regulators */
517                 pmic->info[i] = info;
518
519                 pmic->desc[i].name = info->name;
520                 pmic->desc[i].id = i;
521                 pmic->desc[i].n_voltages = 64;
522                 pmic->desc[i].ops = (i > TPS65912_REG_DCDC4 ?
523                         &tps65912_ops_ldo : &tps65912_ops_dcdc);
524                 pmic->desc[i].type = REGULATOR_VOLTAGE;
525                 pmic->desc[i].owner = THIS_MODULE;
526                 range = tps65912_get_range(pmic, i);
527                 rdev = regulator_register(&pmic->desc[i],
528                                         tps65912->dev, reg_data, pmic, NULL);
529                 if (IS_ERR(rdev)) {
530                         dev_err(tps65912->dev,
531                                 "failed to register %s regulator\n",
532                                 pdev->name);
533                         err = PTR_ERR(rdev);
534                         goto err;
535                 }
536
537                 /* Save regulator for cleanup */
538                 pmic->rdev[i] = rdev;
539         }
540         return 0;
541
542 err:
543         while (--i >= 0)
544                 regulator_unregister(pmic->rdev[i]);
545
546         kfree(pmic);
547         return err;
548 }
549
550 static int __devexit tps65912_remove(struct platform_device *pdev)
551 {
552         struct tps65912_reg *tps65912_reg = platform_get_drvdata(pdev);
553         int i;
554
555         for (i = 0; i < TPS65912_NUM_REGULATOR; i++)
556                 regulator_unregister(tps65912_reg->rdev[i]);
557
558         kfree(tps65912_reg);
559         return 0;
560 }
561
562 static struct platform_driver tps65912_driver = {
563         .driver = {
564                 .name = "tps65912-pmic",
565                 .owner = THIS_MODULE,
566         },
567         .probe = tps65912_probe,
568         .remove = __devexit_p(tps65912_remove),
569 };
570
571 static int __init tps65912_init(void)
572 {
573         return platform_driver_register(&tps65912_driver);
574 }
575 subsys_initcall(tps65912_init);
576
577 static void __exit tps65912_cleanup(void)
578 {
579         platform_driver_unregister(&tps65912_driver);
580 }
581 module_exit(tps65912_cleanup);
582
583 MODULE_AUTHOR("Margarita Olaya Cabrera <magi@slimlogic.co.uk>");
584 MODULE_DESCRIPTION("TPS65912 voltage regulator driver");
585 MODULE_LICENSE("GPL v2");
586 MODULE_ALIAS("platform:tps65912-pmic");