Merge tag 'stable/for-linus-3.6-rc0-tag' of git://git.kernel.org/pub/scm/linux/kernel...
[pandora-kernel.git] / drivers / regulator / lp8788-buck.c
1 /*
2  * TI LP8788 MFD - buck regulator driver
3  *
4  * Copyright 2012 Texas Instruments
5  *
6  * Author: Milo(Woogyom) Kim <milo.kim@ti.com>
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License version 2 as
10  * published by the Free Software Foundation.
11  *
12  */
13
14 #include <linux/module.h>
15 #include <linux/slab.h>
16 #include <linux/err.h>
17 #include <linux/platform_device.h>
18 #include <linux/regulator/driver.h>
19 #include <linux/mfd/lp8788.h>
20 #include <linux/gpio.h>
21
22 /* register address */
23 #define LP8788_EN_BUCK                  0x0C
24 #define LP8788_BUCK_DVS_SEL             0x1D
25 #define LP8788_BUCK1_VOUT0              0x1E
26 #define LP8788_BUCK1_VOUT1              0x1F
27 #define LP8788_BUCK1_VOUT2              0x20
28 #define LP8788_BUCK1_VOUT3              0x21
29 #define LP8788_BUCK2_VOUT0              0x22
30 #define LP8788_BUCK2_VOUT1              0x23
31 #define LP8788_BUCK2_VOUT2              0x24
32 #define LP8788_BUCK2_VOUT3              0x25
33 #define LP8788_BUCK3_VOUT               0x26
34 #define LP8788_BUCK4_VOUT               0x27
35 #define LP8788_BUCK1_TIMESTEP           0x28
36 #define LP8788_BUCK_PWM                 0x2D
37
38 /* mask/shift bits */
39 #define LP8788_EN_BUCK1_M               BIT(0)  /* Addr 0Ch */
40 #define LP8788_EN_BUCK2_M               BIT(1)
41 #define LP8788_EN_BUCK3_M               BIT(2)
42 #define LP8788_EN_BUCK4_M               BIT(3)
43 #define LP8788_BUCK1_DVS_SEL_M          0x04    /* Addr 1Dh */
44 #define LP8788_BUCK1_DVS_M              0x03
45 #define LP8788_BUCK1_DVS_S              0
46 #define LP8788_BUCK2_DVS_SEL_M          0x40
47 #define LP8788_BUCK2_DVS_M              0x30
48 #define LP8788_BUCK2_DVS_S              4
49 #define LP8788_BUCK1_DVS_I2C            BIT(2)
50 #define LP8788_BUCK2_DVS_I2C            BIT(6)
51 #define LP8788_BUCK1_DVS_PIN            (0 << 2)
52 #define LP8788_BUCK2_DVS_PIN            (0 << 6)
53 #define LP8788_VOUT_M                   0x1F    /* Addr 1Eh ~ 27h */
54 #define LP8788_STARTUP_TIME_M           0xF8    /* Addr 28h ~ 2Bh */
55 #define LP8788_STARTUP_TIME_S           3
56 #define LP8788_FPWM_BUCK1_M             BIT(0)  /* Addr 2Dh */
57 #define LP8788_FPWM_BUCK1_S             0
58 #define LP8788_FPWM_BUCK2_M             BIT(1)
59 #define LP8788_FPWM_BUCK2_S             1
60 #define LP8788_FPWM_BUCK3_M             BIT(2)
61 #define LP8788_FPWM_BUCK3_S             2
62 #define LP8788_FPWM_BUCK4_M             BIT(3)
63 #define LP8788_FPWM_BUCK4_S             3
64
65 #define INVALID_ADDR                    0xFF
66 #define LP8788_FORCE_PWM                1
67 #define LP8788_AUTO_PWM                 0
68 #define PIN_LOW                         0
69 #define PIN_HIGH                        1
70 #define ENABLE_TIME_USEC                32
71
72 enum lp8788_dvs_state {
73         DVS_LOW  = GPIOF_OUT_INIT_LOW,
74         DVS_HIGH = GPIOF_OUT_INIT_HIGH,
75 };
76
77 enum lp8788_dvs_mode {
78         REGISTER,
79         EXTPIN,
80 };
81
82 enum lp8788_buck_id {
83         BUCK1,
84         BUCK2,
85         BUCK3,
86         BUCK4,
87 };
88
89 struct lp8788_pwm_map {
90         u8 mask;
91         u8 shift;
92 };
93
94 struct lp8788_buck {
95         struct lp8788 *lp;
96         struct regulator_dev *regulator;
97         struct lp8788_pwm_map *pmap;
98         void *dvs;
99 };
100
101 /* BUCK 1 ~ 4 voltage table */
102 static const int lp8788_buck_vtbl[] = {
103          500000,  800000,  850000,  900000,  950000, 1000000, 1050000, 1100000,
104         1150000, 1200000, 1250000, 1300000, 1350000, 1400000, 1450000, 1500000,
105         1550000, 1600000, 1650000, 1700000, 1750000, 1800000, 1850000, 1900000,
106         1950000, 2000000,
107 };
108
109 /* buck pwm mode selection : used for set/get_mode in regulator ops
110  * @forced pwm : fast mode
111  * @auto pwm   : normal mode
112  */
113 static struct lp8788_pwm_map buck_pmap[] = {
114         [BUCK1] = {
115                 .mask = LP8788_FPWM_BUCK1_M,
116                 .shift = LP8788_FPWM_BUCK1_S,
117         },
118         [BUCK2] = {
119                 .mask = LP8788_FPWM_BUCK2_M,
120                 .shift = LP8788_FPWM_BUCK2_S,
121         },
122         [BUCK3] = {
123                 .mask = LP8788_FPWM_BUCK3_M,
124                 .shift = LP8788_FPWM_BUCK3_S,
125         },
126         [BUCK4] = {
127                 .mask = LP8788_FPWM_BUCK4_M,
128                 .shift = LP8788_FPWM_BUCK4_S,
129         },
130 };
131
132 static const u8 buck1_vout_addr[] = {
133         LP8788_BUCK1_VOUT0, LP8788_BUCK1_VOUT1,
134         LP8788_BUCK1_VOUT2, LP8788_BUCK1_VOUT3,
135 };
136
137 static const u8 buck2_vout_addr[] = {
138         LP8788_BUCK2_VOUT0, LP8788_BUCK2_VOUT1,
139         LP8788_BUCK2_VOUT2, LP8788_BUCK2_VOUT3,
140 };
141
142 static void lp8788_buck1_set_dvs(struct lp8788_buck *buck)
143 {
144         struct lp8788_buck1_dvs *dvs = (struct lp8788_buck1_dvs *)buck->dvs;
145         enum lp8788_dvs_state pinstate;
146
147         if (!dvs)
148                 return;
149
150         pinstate = dvs->vsel == DVS_SEL_V0 ? DVS_LOW : DVS_HIGH;
151         if (gpio_is_valid(dvs->gpio))
152                 gpio_set_value(dvs->gpio, pinstate);
153 }
154
155 static void lp8788_buck2_set_dvs(struct lp8788_buck *buck)
156 {
157         struct lp8788_buck2_dvs *dvs = (struct lp8788_buck2_dvs *)buck->dvs;
158         enum lp8788_dvs_state pin1, pin2;
159
160         if (!dvs)
161                 return;
162
163         switch (dvs->vsel) {
164         case DVS_SEL_V0:
165                 pin1 = DVS_LOW;
166                 pin2 = DVS_LOW;
167                 break;
168         case DVS_SEL_V1:
169                 pin1 = DVS_HIGH;
170                 pin2 = DVS_LOW;
171                 break;
172         case DVS_SEL_V2:
173                 pin1 = DVS_LOW;
174                 pin2 = DVS_HIGH;
175                 break;
176         case DVS_SEL_V3:
177                 pin1 = DVS_HIGH;
178                 pin2 = DVS_HIGH;
179                 break;
180         default:
181                 return;
182         }
183
184         if (gpio_is_valid(dvs->gpio[0]))
185                 gpio_set_value(dvs->gpio[0], pin1);
186
187         if (gpio_is_valid(dvs->gpio[1]))
188                 gpio_set_value(dvs->gpio[1], pin2);
189 }
190
191 static void lp8788_set_dvs(struct lp8788_buck *buck, enum lp8788_buck_id id)
192 {
193         switch (id) {
194         case BUCK1:
195                 lp8788_buck1_set_dvs(buck);
196                 break;
197         case BUCK2:
198                 lp8788_buck2_set_dvs(buck);
199                 break;
200         default:
201                 break;
202         }
203 }
204
205 static enum lp8788_dvs_mode
206 lp8788_get_buck_dvs_ctrl_mode(struct lp8788_buck *buck, enum lp8788_buck_id id)
207 {
208         u8 val, mask;
209
210         switch (id) {
211         case BUCK1:
212                 mask = LP8788_BUCK1_DVS_SEL_M;
213                 break;
214         case BUCK2:
215                 mask = LP8788_BUCK2_DVS_SEL_M;
216                 break;
217         default:
218                 return REGISTER;
219         }
220
221         lp8788_read_byte(buck->lp, LP8788_BUCK_DVS_SEL, &val);
222
223         return val & mask ? REGISTER : EXTPIN;
224 }
225
226 static bool lp8788_is_valid_buck_addr(u8 addr)
227 {
228         switch (addr) {
229         case LP8788_BUCK1_VOUT0:
230         case LP8788_BUCK1_VOUT1:
231         case LP8788_BUCK1_VOUT2:
232         case LP8788_BUCK1_VOUT3:
233         case LP8788_BUCK2_VOUT0:
234         case LP8788_BUCK2_VOUT1:
235         case LP8788_BUCK2_VOUT2:
236         case LP8788_BUCK2_VOUT3:
237                 return true;
238         default:
239                 return false;
240         }
241 }
242
243 static u8 lp8788_select_buck_vout_addr(struct lp8788_buck *buck,
244                                         enum lp8788_buck_id id)
245 {
246         enum lp8788_dvs_mode mode = lp8788_get_buck_dvs_ctrl_mode(buck, id);
247         struct lp8788_buck1_dvs *b1_dvs;
248         struct lp8788_buck2_dvs *b2_dvs;
249         u8 val, idx, addr;
250         int pin1, pin2;
251
252         switch (id) {
253         case BUCK1:
254                 if (mode == EXTPIN) {
255                         b1_dvs = (struct lp8788_buck1_dvs *)buck->dvs;
256                         if (!b1_dvs)
257                                 goto err;
258
259                         idx = gpio_get_value(b1_dvs->gpio) ? 1 : 0;
260                 } else {
261                         lp8788_read_byte(buck->lp, LP8788_BUCK_DVS_SEL, &val);
262                         idx = (val & LP8788_BUCK1_DVS_M) >> LP8788_BUCK1_DVS_S;
263                 }
264                 addr = buck1_vout_addr[idx];
265                 break;
266         case BUCK2:
267                 if (mode == EXTPIN) {
268                         b2_dvs = (struct lp8788_buck2_dvs *)buck->dvs;
269                         if (!b2_dvs)
270                                 goto err;
271
272                         pin1 = gpio_get_value(b2_dvs->gpio[0]);
273                         pin2 = gpio_get_value(b2_dvs->gpio[1]);
274
275                         if (pin1 == PIN_LOW && pin2 == PIN_LOW)
276                                 idx = 0;
277                         else if (pin1 == PIN_LOW && pin2 == PIN_HIGH)
278                                 idx = 2;
279                         else if (pin1 == PIN_HIGH && pin2 == PIN_LOW)
280                                 idx = 1;
281                         else
282                                 idx = 3;
283                 } else {
284                         lp8788_read_byte(buck->lp, LP8788_BUCK_DVS_SEL, &val);
285                         idx = (val & LP8788_BUCK2_DVS_M) >> LP8788_BUCK2_DVS_S;
286                 }
287                 addr = buck2_vout_addr[idx];
288                 break;
289         default:
290                 goto err;
291         }
292
293         return addr;
294 err:
295         return INVALID_ADDR;
296 }
297
298 static int lp8788_buck12_set_voltage_sel(struct regulator_dev *rdev,
299                                         unsigned selector)
300 {
301         struct lp8788_buck *buck = rdev_get_drvdata(rdev);
302         enum lp8788_buck_id id = rdev_get_id(rdev);
303         u8 addr;
304
305         if (buck->dvs)
306                 lp8788_set_dvs(buck, id);
307
308         addr = lp8788_select_buck_vout_addr(buck, id);
309         if (!lp8788_is_valid_buck_addr(addr))
310                 return -EINVAL;
311
312         return lp8788_update_bits(buck->lp, addr, LP8788_VOUT_M, selector);
313 }
314
315 static int lp8788_buck12_get_voltage_sel(struct regulator_dev *rdev)
316 {
317         struct lp8788_buck *buck = rdev_get_drvdata(rdev);
318         enum lp8788_buck_id id = rdev_get_id(rdev);
319         int ret;
320         u8 val, addr;
321
322         addr = lp8788_select_buck_vout_addr(buck, id);
323         if (!lp8788_is_valid_buck_addr(addr))
324                 return -EINVAL;
325
326         ret = lp8788_read_byte(buck->lp, addr, &val);
327         if (ret)
328                 return ret;
329
330         return val & LP8788_VOUT_M;
331 }
332
333 static int lp8788_buck_enable_time(struct regulator_dev *rdev)
334 {
335         struct lp8788_buck *buck = rdev_get_drvdata(rdev);
336         enum lp8788_buck_id id = rdev_get_id(rdev);
337         u8 val, addr = LP8788_BUCK1_TIMESTEP + id;
338
339         if (lp8788_read_byte(buck->lp, addr, &val))
340                 return -EINVAL;
341
342         val = (val & LP8788_STARTUP_TIME_M) >> LP8788_STARTUP_TIME_S;
343
344         return ENABLE_TIME_USEC * val;
345 }
346
347 static int lp8788_buck_set_mode(struct regulator_dev *rdev, unsigned int mode)
348 {
349         struct lp8788_buck *buck = rdev_get_drvdata(rdev);
350         struct lp8788_pwm_map *pmap = buck->pmap;
351         u8 val;
352
353         if (!pmap)
354                 return -EINVAL;
355
356         switch (mode) {
357         case REGULATOR_MODE_FAST:
358                 val = LP8788_FORCE_PWM << pmap->shift;
359                 break;
360         case REGULATOR_MODE_NORMAL:
361                 val = LP8788_AUTO_PWM << pmap->shift;
362                 break;
363         default:
364                 return -EINVAL;
365         }
366
367         return lp8788_update_bits(buck->lp, LP8788_BUCK_PWM, pmap->mask, val);
368 }
369
370 static unsigned int lp8788_buck_get_mode(struct regulator_dev *rdev)
371 {
372         struct lp8788_buck *buck = rdev_get_drvdata(rdev);
373         struct lp8788_pwm_map *pmap = buck->pmap;
374         u8 val;
375         int ret;
376
377         if (!pmap)
378                 return -EINVAL;
379
380         ret = lp8788_read_byte(buck->lp, LP8788_BUCK_PWM, &val);
381         if (ret)
382                 return ret;
383
384         return val & pmap->mask ? REGULATOR_MODE_FAST : REGULATOR_MODE_NORMAL;
385 }
386
387 static struct regulator_ops lp8788_buck12_ops = {
388         .list_voltage = regulator_list_voltage_table,
389         .set_voltage_sel = lp8788_buck12_set_voltage_sel,
390         .get_voltage_sel = lp8788_buck12_get_voltage_sel,
391         .enable = regulator_enable_regmap,
392         .disable = regulator_disable_regmap,
393         .is_enabled = regulator_is_enabled_regmap,
394         .enable_time = lp8788_buck_enable_time,
395         .set_mode = lp8788_buck_set_mode,
396         .get_mode = lp8788_buck_get_mode,
397 };
398
399 static struct regulator_ops lp8788_buck34_ops = {
400         .list_voltage = regulator_list_voltage_table,
401         .set_voltage_sel = regulator_set_voltage_sel_regmap,
402         .get_voltage_sel = regulator_get_voltage_sel_regmap,
403         .enable = regulator_enable_regmap,
404         .disable = regulator_disable_regmap,
405         .is_enabled = regulator_is_enabled_regmap,
406         .enable_time = lp8788_buck_enable_time,
407         .set_mode = lp8788_buck_set_mode,
408         .get_mode = lp8788_buck_get_mode,
409 };
410
411 static struct regulator_desc lp8788_buck_desc[] = {
412         {
413                 .name = "buck1",
414                 .id = BUCK1,
415                 .ops = &lp8788_buck12_ops,
416                 .n_voltages = ARRAY_SIZE(lp8788_buck_vtbl),
417                 .volt_table = lp8788_buck_vtbl,
418                 .type = REGULATOR_VOLTAGE,
419                 .owner = THIS_MODULE,
420                 .enable_reg = LP8788_EN_BUCK,
421                 .enable_mask = LP8788_EN_BUCK1_M,
422         },
423         {
424                 .name = "buck2",
425                 .id = BUCK2,
426                 .ops = &lp8788_buck12_ops,
427                 .n_voltages = ARRAY_SIZE(lp8788_buck_vtbl),
428                 .volt_table = lp8788_buck_vtbl,
429                 .type = REGULATOR_VOLTAGE,
430                 .owner = THIS_MODULE,
431                 .enable_reg = LP8788_EN_BUCK,
432                 .enable_mask = LP8788_EN_BUCK2_M,
433         },
434         {
435                 .name = "buck3",
436                 .id = BUCK3,
437                 .ops = &lp8788_buck34_ops,
438                 .n_voltages = ARRAY_SIZE(lp8788_buck_vtbl),
439                 .volt_table = lp8788_buck_vtbl,
440                 .type = REGULATOR_VOLTAGE,
441                 .owner = THIS_MODULE,
442                 .vsel_reg = LP8788_BUCK3_VOUT,
443                 .vsel_mask = LP8788_VOUT_M,
444                 .enable_reg = LP8788_EN_BUCK,
445                 .enable_mask = LP8788_EN_BUCK3_M,
446         },
447         {
448                 .name = "buck4",
449                 .id = BUCK4,
450                 .ops = &lp8788_buck34_ops,
451                 .n_voltages = ARRAY_SIZE(lp8788_buck_vtbl),
452                 .volt_table = lp8788_buck_vtbl,
453                 .type = REGULATOR_VOLTAGE,
454                 .owner = THIS_MODULE,
455                 .vsel_reg = LP8788_BUCK4_VOUT,
456                 .vsel_mask = LP8788_VOUT_M,
457                 .enable_reg = LP8788_EN_BUCK,
458                 .enable_mask = LP8788_EN_BUCK4_M,
459         },
460 };
461
462 static int lp8788_set_default_dvs_ctrl_mode(struct lp8788 *lp,
463                                         enum lp8788_buck_id id)
464 {
465         u8 mask, val;
466
467         switch (id) {
468         case BUCK1:
469                 mask = LP8788_BUCK1_DVS_SEL_M;
470                 val  = LP8788_BUCK1_DVS_I2C;
471                 break;
472         case BUCK2:
473                 mask = LP8788_BUCK2_DVS_SEL_M;
474                 val  = LP8788_BUCK2_DVS_I2C;
475                 break;
476         default:
477                 return 0;
478         }
479
480         return lp8788_update_bits(lp, LP8788_BUCK_DVS_SEL, mask, val);
481 }
482
483 static int _gpio_request(struct lp8788_buck *buck, int gpio, char *name)
484 {
485         struct device *dev = buck->lp->dev;
486
487         if (!gpio_is_valid(gpio)) {
488                 dev_err(dev, "invalid gpio: %d\n", gpio);
489                 return -EINVAL;
490         }
491
492         return devm_gpio_request_one(dev, gpio, DVS_LOW, name);
493 }
494
495 static int lp8788_dvs_gpio_request(struct lp8788_buck *buck,
496                                 enum lp8788_buck_id id)
497 {
498         struct lp8788_platform_data *pdata = buck->lp->pdata;
499         char *b1_name = "LP8788_B1_DVS";
500         char *b2_name[] = { "LP8788_B2_DVS1", "LP8788_B2_DVS2" };
501         int i, gpio, ret;
502
503         switch (id) {
504         case BUCK1:
505                 gpio = pdata->buck1_dvs->gpio;
506                 ret = _gpio_request(buck, gpio, b1_name);
507                 if (ret)
508                         return ret;
509
510                 buck->dvs = pdata->buck1_dvs;
511                 break;
512         case BUCK2:
513                 for (i = 0 ; i < LP8788_NUM_BUCK2_DVS ; i++) {
514                         gpio = pdata->buck2_dvs->gpio[i];
515                         ret = _gpio_request(buck, gpio, b2_name[i]);
516                         if (ret)
517                                 return ret;
518                 }
519                 buck->dvs = pdata->buck2_dvs;
520                 break;
521         default:
522                 break;
523         }
524
525         return 0;
526 }
527
528 static int lp8788_init_dvs(struct lp8788_buck *buck, enum lp8788_buck_id id)
529 {
530         struct lp8788_platform_data *pdata = buck->lp->pdata;
531         u8 mask[] = { LP8788_BUCK1_DVS_SEL_M, LP8788_BUCK2_DVS_SEL_M };
532         u8 val[]  = { LP8788_BUCK1_DVS_PIN, LP8788_BUCK2_DVS_PIN };
533
534         /* no dvs for buck3, 4 */
535         if (id == BUCK3 || id == BUCK4)
536                 return 0;
537
538         /* no dvs platform data, then dvs will be selected by I2C registers */
539         if (!pdata)
540                 goto set_default_dvs_mode;
541
542         if ((id == BUCK1 && !pdata->buck1_dvs) ||
543                 (id == BUCK2 && !pdata->buck2_dvs))
544                 goto set_default_dvs_mode;
545
546         if (lp8788_dvs_gpio_request(buck, id))
547                 goto set_default_dvs_mode;
548
549         return lp8788_update_bits(buck->lp, LP8788_BUCK_DVS_SEL, mask[id],
550                                 val[id]);
551
552 set_default_dvs_mode:
553         return lp8788_set_default_dvs_ctrl_mode(buck->lp, id);
554 }
555
556 static __devinit int lp8788_buck_probe(struct platform_device *pdev)
557 {
558         struct lp8788 *lp = dev_get_drvdata(pdev->dev.parent);
559         int id = pdev->id;
560         struct lp8788_buck *buck;
561         struct regulator_config cfg = { };
562         struct regulator_dev *rdev;
563         int ret;
564
565         buck = devm_kzalloc(lp->dev, sizeof(struct lp8788_buck), GFP_KERNEL);
566         if (!buck)
567                 return -ENOMEM;
568
569         buck->lp = lp;
570         buck->pmap = &buck_pmap[id];
571
572         ret = lp8788_init_dvs(buck, id);
573         if (ret)
574                 return ret;
575
576         cfg.dev = lp->dev;
577         cfg.init_data = lp->pdata ? lp->pdata->buck_data[id] : NULL;
578         cfg.driver_data = buck;
579         cfg.regmap = lp->regmap;
580
581         rdev = regulator_register(&lp8788_buck_desc[id], &cfg);
582         if (IS_ERR(rdev)) {
583                 ret = PTR_ERR(rdev);
584                 dev_err(lp->dev, "BUCK%d regulator register err = %d\n",
585                                 id + 1, ret);
586                 return ret;
587         }
588
589         buck->regulator = rdev;
590         platform_set_drvdata(pdev, buck);
591
592         return 0;
593 }
594
595 static int __devexit lp8788_buck_remove(struct platform_device *pdev)
596 {
597         struct lp8788_buck *buck = platform_get_drvdata(pdev);
598
599         platform_set_drvdata(pdev, NULL);
600         regulator_unregister(buck->regulator);
601
602         return 0;
603 }
604
605 static struct platform_driver lp8788_buck_driver = {
606         .probe = lp8788_buck_probe,
607         .remove = __devexit_p(lp8788_buck_remove),
608         .driver = {
609                 .name = LP8788_DEV_BUCK,
610                 .owner = THIS_MODULE,
611         },
612 };
613
614 static int __init lp8788_buck_init(void)
615 {
616         return platform_driver_register(&lp8788_buck_driver);
617 }
618 subsys_initcall(lp8788_buck_init);
619
620 static void __exit lp8788_buck_exit(void)
621 {
622         platform_driver_unregister(&lp8788_buck_driver);
623 }
624 module_exit(lp8788_buck_exit);
625
626 MODULE_DESCRIPTION("TI LP8788 BUCK Driver");
627 MODULE_AUTHOR("Milo Kim");
628 MODULE_LICENSE("GPL");
629 MODULE_ALIAS("platform:lp8788-buck");