Merge branch 'next/cleanup2' into HEAD
[sfrench/cifs-2.6.git] / drivers / regulator / ab3100.c
1 /*
2  * drivers/regulator/ab3100.c
3  *
4  * Copyright (C) 2008-2009 ST-Ericsson AB
5  * License terms: GNU General Public License (GPL) version 2
6  * Low-level control of the AB3100 IC Low Dropout (LDO)
7  * regulators, external regulator and buck converter
8  * Author: Mattias Wallin <mattias.wallin@stericsson.com>
9  * Author: Linus Walleij <linus.walleij@stericsson.com>
10  */
11
12 #include <linux/module.h>
13 #include <linux/kernel.h>
14 #include <linux/init.h>
15 #include <linux/err.h>
16 #include <linux/platform_device.h>
17 #include <linux/regulator/driver.h>
18 #include <linux/mfd/abx500.h>
19
20 /* LDO registers and some handy masking definitions for AB3100 */
21 #define AB3100_LDO_A            0x40
22 #define AB3100_LDO_C            0x41
23 #define AB3100_LDO_D            0x42
24 #define AB3100_LDO_E            0x43
25 #define AB3100_LDO_E_SLEEP      0x44
26 #define AB3100_LDO_F            0x45
27 #define AB3100_LDO_G            0x46
28 #define AB3100_LDO_H            0x47
29 #define AB3100_LDO_H_SLEEP_MODE 0
30 #define AB3100_LDO_H_SLEEP_EN   2
31 #define AB3100_LDO_ON           4
32 #define AB3100_LDO_H_VSEL_AC    5
33 #define AB3100_LDO_K            0x48
34 #define AB3100_LDO_EXT          0x49
35 #define AB3100_BUCK             0x4A
36 #define AB3100_BUCK_SLEEP       0x4B
37 #define AB3100_REG_ON_MASK      0x10
38
39 /**
40  * struct ab3100_regulator
41  * A struct passed around the individual regulator functions
42  * @platform_device: platform device holding this regulator
43  * @dev: handle to the device
44  * @plfdata: AB3100 platform data passed in at probe time
45  * @regreg: regulator register number in the AB3100
46  */
47 struct ab3100_regulator {
48         struct regulator_dev *rdev;
49         struct device *dev;
50         struct ab3100_platform_data *plfdata;
51         u8 regreg;
52 };
53
54 /* The order in which registers are initialized */
55 static const u8 ab3100_reg_init_order[AB3100_NUM_REGULATORS+2] = {
56         AB3100_LDO_A,
57         AB3100_LDO_C,
58         AB3100_LDO_E,
59         AB3100_LDO_E_SLEEP,
60         AB3100_LDO_F,
61         AB3100_LDO_G,
62         AB3100_LDO_H,
63         AB3100_LDO_K,
64         AB3100_LDO_EXT,
65         AB3100_BUCK,
66         AB3100_BUCK_SLEEP,
67         AB3100_LDO_D,
68 };
69
70 /* Preset (hardware defined) voltages for these regulators */
71 #define LDO_A_VOLTAGE 2750000
72 #define LDO_C_VOLTAGE 2650000
73 #define LDO_D_VOLTAGE 2650000
74
75 static const unsigned int ldo_e_buck_typ_voltages[] = {
76         1800000,
77         1400000,
78         1300000,
79         1200000,
80         1100000,
81         1050000,
82         900000,
83 };
84
85 static const unsigned int ldo_f_typ_voltages[] = {
86         1800000,
87         1400000,
88         1300000,
89         1200000,
90         1100000,
91         1050000,
92         2500000,
93         2650000,
94 };
95
96 static const unsigned int ldo_g_typ_voltages[] = {
97         2850000,
98         2750000,
99         1800000,
100         1500000,
101 };
102
103 static const unsigned int ldo_h_typ_voltages[] = {
104         2750000,
105         1800000,
106         1500000,
107         1200000,
108 };
109
110 static const unsigned int ldo_k_typ_voltages[] = {
111         2750000,
112         1800000,
113 };
114
115
116 /* The regulator devices */
117 static struct ab3100_regulator
118 ab3100_regulators[AB3100_NUM_REGULATORS] = {
119         {
120                 .regreg = AB3100_LDO_A,
121         },
122         {
123                 .regreg = AB3100_LDO_C,
124         },
125         {
126                 .regreg = AB3100_LDO_D,
127         },
128         {
129                 .regreg = AB3100_LDO_E,
130         },
131         {
132                 .regreg = AB3100_LDO_F,
133         },
134         {
135                 .regreg = AB3100_LDO_G,
136         },
137         {
138                 .regreg = AB3100_LDO_H,
139         },
140         {
141                 .regreg = AB3100_LDO_K,
142         },
143         {
144                 .regreg = AB3100_LDO_EXT,
145                 /* No voltages for the external regulator */
146         },
147         {
148                 .regreg = AB3100_BUCK,
149         },
150 };
151
152 /*
153  * General functions for enable, disable and is_enabled used for
154  * LDO: A,C,E,F,G,H,K,EXT and BUCK
155  */
156 static int ab3100_enable_regulator(struct regulator_dev *reg)
157 {
158         struct ab3100_regulator *abreg = rdev_get_drvdata(reg);
159         int err;
160         u8 regval;
161
162         err = abx500_get_register_interruptible(abreg->dev, 0, abreg->regreg,
163                                                 &regval);
164         if (err) {
165                 dev_warn(&reg->dev, "failed to get regid %d value\n",
166                          abreg->regreg);
167                 return err;
168         }
169
170         /* The regulator is already on, no reason to go further */
171         if (regval & AB3100_REG_ON_MASK)
172                 return 0;
173
174         regval |= AB3100_REG_ON_MASK;
175
176         err = abx500_set_register_interruptible(abreg->dev, 0, abreg->regreg,
177                                                 regval);
178         if (err) {
179                 dev_warn(&reg->dev, "failed to set regid %d value\n",
180                          abreg->regreg);
181                 return err;
182         }
183
184         return 0;
185 }
186
187 static int ab3100_disable_regulator(struct regulator_dev *reg)
188 {
189         struct ab3100_regulator *abreg = rdev_get_drvdata(reg);
190         int err;
191         u8 regval;
192
193         /*
194          * LDO D is a special regulator. When it is disabled, the entire
195          * system is shut down. So this is handled specially.
196          */
197         pr_info("Called ab3100_disable_regulator\n");
198         if (abreg->regreg == AB3100_LDO_D) {
199                 dev_info(&reg->dev, "disabling LDO D - shut down system\n");
200                 /* Setting LDO D to 0x00 cuts the power to the SoC */
201                 return abx500_set_register_interruptible(abreg->dev, 0,
202                                                          AB3100_LDO_D, 0x00U);
203         }
204
205         /*
206          * All other regulators are handled here
207          */
208         err = abx500_get_register_interruptible(abreg->dev, 0, abreg->regreg,
209                                                 &regval);
210         if (err) {
211                 dev_err(&reg->dev, "unable to get register 0x%x\n",
212                         abreg->regreg);
213                 return err;
214         }
215         regval &= ~AB3100_REG_ON_MASK;
216         return abx500_set_register_interruptible(abreg->dev, 0, abreg->regreg,
217                                                  regval);
218 }
219
220 static int ab3100_is_enabled_regulator(struct regulator_dev *reg)
221 {
222         struct ab3100_regulator *abreg = rdev_get_drvdata(reg);
223         u8 regval;
224         int err;
225
226         err = abx500_get_register_interruptible(abreg->dev, 0, abreg->regreg,
227                                                 &regval);
228         if (err) {
229                 dev_err(&reg->dev, "unable to get register 0x%x\n",
230                         abreg->regreg);
231                 return err;
232         }
233
234         return regval & AB3100_REG_ON_MASK;
235 }
236
237 static int ab3100_get_voltage_regulator(struct regulator_dev *reg)
238 {
239         struct ab3100_regulator *abreg = rdev_get_drvdata(reg);
240         u8 regval;
241         int err;
242
243         /*
244          * For variable types, read out setting and index into
245          * supplied voltage list.
246          */
247         err = abx500_get_register_interruptible(abreg->dev, 0,
248                                                 abreg->regreg, &regval);
249         if (err) {
250                 dev_warn(&reg->dev,
251                          "failed to get regulator value in register %02x\n",
252                          abreg->regreg);
253                 return err;
254         }
255
256         /* The 3 highest bits index voltages */
257         regval &= 0xE0;
258         regval >>= 5;
259
260         if (regval >= reg->desc->n_voltages) {
261                 dev_err(&reg->dev,
262                         "regulator register %02x contains an illegal voltage setting\n",
263                         abreg->regreg);
264                 return -EINVAL;
265         }
266
267         return reg->desc->volt_table[regval];
268 }
269
270 static int ab3100_set_voltage_regulator_sel(struct regulator_dev *reg,
271                                             unsigned selector)
272 {
273         struct ab3100_regulator *abreg = rdev_get_drvdata(reg);
274         u8 regval;
275         int err;
276
277         err = abx500_get_register_interruptible(abreg->dev, 0,
278                                                 abreg->regreg, &regval);
279         if (err) {
280                 dev_warn(&reg->dev,
281                          "failed to get regulator register %02x\n",
282                          abreg->regreg);
283                 return err;
284         }
285
286         /* The highest three bits control the variable regulators */
287         regval &= ~0xE0;
288         regval |= (selector << 5);
289
290         err = abx500_set_register_interruptible(abreg->dev, 0,
291                                                 abreg->regreg, regval);
292         if (err)
293                 dev_warn(&reg->dev, "failed to set regulator register %02x\n",
294                         abreg->regreg);
295
296         return err;
297 }
298
299 static int ab3100_set_suspend_voltage_regulator(struct regulator_dev *reg,
300                                                 int uV)
301 {
302         struct ab3100_regulator *abreg = rdev_get_drvdata(reg);
303         u8 regval;
304         int err;
305         int bestindex;
306         u8 targetreg;
307
308         if (abreg->regreg == AB3100_LDO_E)
309                 targetreg = AB3100_LDO_E_SLEEP;
310         else if (abreg->regreg == AB3100_BUCK)
311                 targetreg = AB3100_BUCK_SLEEP;
312         else
313                 return -EINVAL;
314
315         /* LDO E and BUCK have special suspend voltages you can set */
316         bestindex = regulator_map_voltage_iterate(reg, uV, uV);
317
318         err = abx500_get_register_interruptible(abreg->dev, 0,
319                                                 targetreg, &regval);
320         if (err) {
321                 dev_warn(&reg->dev,
322                          "failed to get regulator register %02x\n",
323                          targetreg);
324                 return err;
325         }
326
327         /* The highest three bits control the variable regulators */
328         regval &= ~0xE0;
329         regval |= (bestindex << 5);
330
331         err = abx500_set_register_interruptible(abreg->dev, 0,
332                                                 targetreg, regval);
333         if (err)
334                 dev_warn(&reg->dev, "failed to set regulator register %02x\n",
335                         abreg->regreg);
336
337         return err;
338 }
339
340 /*
341  * The external regulator can just define a fixed voltage.
342  */
343 static int ab3100_get_voltage_regulator_external(struct regulator_dev *reg)
344 {
345         struct ab3100_regulator *abreg = rdev_get_drvdata(reg);
346
347         return abreg->plfdata->external_voltage;
348 }
349
350 static struct regulator_ops regulator_ops_fixed = {
351         .list_voltage = regulator_list_voltage_linear,
352         .enable      = ab3100_enable_regulator,
353         .disable     = ab3100_disable_regulator,
354         .is_enabled  = ab3100_is_enabled_regulator,
355 };
356
357 static struct regulator_ops regulator_ops_variable = {
358         .enable      = ab3100_enable_regulator,
359         .disable     = ab3100_disable_regulator,
360         .is_enabled  = ab3100_is_enabled_regulator,
361         .get_voltage = ab3100_get_voltage_regulator,
362         .set_voltage_sel = ab3100_set_voltage_regulator_sel,
363         .list_voltage = regulator_list_voltage_table,
364 };
365
366 static struct regulator_ops regulator_ops_variable_sleepable = {
367         .enable      = ab3100_enable_regulator,
368         .disable     = ab3100_disable_regulator,
369         .is_enabled  = ab3100_is_enabled_regulator,
370         .get_voltage = ab3100_get_voltage_regulator,
371         .set_voltage_sel = ab3100_set_voltage_regulator_sel,
372         .set_suspend_voltage = ab3100_set_suspend_voltage_regulator,
373         .list_voltage = regulator_list_voltage_table,
374 };
375
376 /*
377  * LDO EXT is an external regulator so it is really
378  * not possible to set any voltage locally here, AB3100
379  * is an on/off switch plain an simple. The external
380  * voltage is defined in the board set-up if any.
381  */
382 static struct regulator_ops regulator_ops_external = {
383         .enable      = ab3100_enable_regulator,
384         .disable     = ab3100_disable_regulator,
385         .is_enabled  = ab3100_is_enabled_regulator,
386         .get_voltage = ab3100_get_voltage_regulator_external,
387 };
388
389 static struct regulator_desc
390 ab3100_regulator_desc[AB3100_NUM_REGULATORS] = {
391         {
392                 .name = "LDO_A",
393                 .id   = AB3100_LDO_A,
394                 .ops  = &regulator_ops_fixed,
395                 .n_voltages = 1,
396                 .type = REGULATOR_VOLTAGE,
397                 .owner = THIS_MODULE,
398                 .min_uV = LDO_A_VOLTAGE,
399                 .enable_time = 200,
400         },
401         {
402                 .name = "LDO_C",
403                 .id   = AB3100_LDO_C,
404                 .ops  = &regulator_ops_fixed,
405                 .n_voltages = 1,
406                 .type = REGULATOR_VOLTAGE,
407                 .owner = THIS_MODULE,
408                 .min_uV = LDO_C_VOLTAGE,
409                 .enable_time = 200,
410         },
411         {
412                 .name = "LDO_D",
413                 .id   = AB3100_LDO_D,
414                 .ops  = &regulator_ops_fixed,
415                 .n_voltages = 1,
416                 .type = REGULATOR_VOLTAGE,
417                 .owner = THIS_MODULE,
418                 .min_uV = LDO_D_VOLTAGE,
419                 .enable_time = 200,
420         },
421         {
422                 .name = "LDO_E",
423                 .id   = AB3100_LDO_E,
424                 .ops  = &regulator_ops_variable_sleepable,
425                 .n_voltages = ARRAY_SIZE(ldo_e_buck_typ_voltages),
426                 .volt_table = ldo_e_buck_typ_voltages,
427                 .type = REGULATOR_VOLTAGE,
428                 .owner = THIS_MODULE,
429                 .enable_time = 200,
430         },
431         {
432                 .name = "LDO_F",
433                 .id   = AB3100_LDO_F,
434                 .ops  = &regulator_ops_variable,
435                 .n_voltages = ARRAY_SIZE(ldo_f_typ_voltages),
436                 .volt_table = ldo_f_typ_voltages,
437                 .type = REGULATOR_VOLTAGE,
438                 .owner = THIS_MODULE,
439                 .enable_time = 600,
440         },
441         {
442                 .name = "LDO_G",
443                 .id   = AB3100_LDO_G,
444                 .ops  = &regulator_ops_variable,
445                 .n_voltages = ARRAY_SIZE(ldo_g_typ_voltages),
446                 .volt_table = ldo_g_typ_voltages,
447                 .type = REGULATOR_VOLTAGE,
448                 .owner = THIS_MODULE,
449                 .enable_time = 400,
450         },
451         {
452                 .name = "LDO_H",
453                 .id   = AB3100_LDO_H,
454                 .ops  = &regulator_ops_variable,
455                 .n_voltages = ARRAY_SIZE(ldo_h_typ_voltages),
456                 .volt_table = ldo_h_typ_voltages,
457                 .type = REGULATOR_VOLTAGE,
458                 .owner = THIS_MODULE,
459                 .enable_time = 200,
460         },
461         {
462                 .name = "LDO_K",
463                 .id   = AB3100_LDO_K,
464                 .ops  = &regulator_ops_variable,
465                 .n_voltages = ARRAY_SIZE(ldo_k_typ_voltages),
466                 .volt_table = ldo_k_typ_voltages,
467                 .type = REGULATOR_VOLTAGE,
468                 .owner = THIS_MODULE,
469                 .enable_time = 200,
470         },
471         {
472                 .name = "LDO_EXT",
473                 .id   = AB3100_LDO_EXT,
474                 .ops  = &regulator_ops_external,
475                 .type = REGULATOR_VOLTAGE,
476                 .owner = THIS_MODULE,
477         },
478         {
479                 .name = "BUCK",
480                 .id   = AB3100_BUCK,
481                 .ops  = &regulator_ops_variable_sleepable,
482                 .n_voltages = ARRAY_SIZE(ldo_e_buck_typ_voltages),
483                 .volt_table = ldo_e_buck_typ_voltages,
484                 .type = REGULATOR_VOLTAGE,
485                 .owner = THIS_MODULE,
486                 .enable_time = 1000,
487         },
488 };
489
490 /*
491  * NOTE: the following functions are regulators pluralis - it is the
492  * binding to the AB3100 core driver and the parent platform device
493  * for all the different regulators.
494  */
495
496 static int __devinit ab3100_regulators_probe(struct platform_device *pdev)
497 {
498         struct ab3100_platform_data *plfdata = pdev->dev.platform_data;
499         struct regulator_config config = { };
500         int err = 0;
501         u8 data;
502         int i;
503
504         /* Check chip state */
505         err = abx500_get_register_interruptible(&pdev->dev, 0,
506                                                 AB3100_LDO_D, &data);
507         if (err) {
508                 dev_err(&pdev->dev, "could not read initial status of LDO_D\n");
509                 return err;
510         }
511         if (data & 0x10)
512                 dev_notice(&pdev->dev,
513                            "chip is already in active mode (Warm start)\n");
514         else
515                 dev_notice(&pdev->dev,
516                            "chip is in inactive mode (Cold start)\n");
517
518         /* Set up regulators */
519         for (i = 0; i < ARRAY_SIZE(ab3100_reg_init_order); i++) {
520                 err = abx500_set_register_interruptible(&pdev->dev, 0,
521                                         ab3100_reg_init_order[i],
522                                         plfdata->reg_initvals[i]);
523                 if (err) {
524                         dev_err(&pdev->dev, "regulator initialization failed with error %d\n",
525                                 err);
526                         return err;
527                 }
528         }
529
530         /* Register the regulators */
531         for (i = 0; i < AB3100_NUM_REGULATORS; i++) {
532                 struct ab3100_regulator *reg = &ab3100_regulators[i];
533                 struct regulator_dev *rdev;
534
535                 /*
536                  * Initialize per-regulator struct.
537                  * Inherit platform data, this comes down from the
538                  * i2c boarddata, from the machine. So if you want to
539                  * see what it looks like for a certain machine, go
540                  * into the machine I2C setup.
541                  */
542                 reg->dev = &pdev->dev;
543                 reg->plfdata = plfdata;
544
545                 config.dev = &pdev->dev;
546                 config.driver_data = reg;
547                 config.init_data = &plfdata->reg_constraints[i];
548
549                 /*
550                  * Register the regulator, pass around
551                  * the ab3100_regulator struct
552                  */
553                 rdev = regulator_register(&ab3100_regulator_desc[i], &config);
554                 if (IS_ERR(rdev)) {
555                         err = PTR_ERR(rdev);
556                         dev_err(&pdev->dev,
557                                 "%s: failed to register regulator %s err %d\n",
558                                 __func__, ab3100_regulator_desc[i].name,
559                                 err);
560                         /* remove the already registered regulators */
561                         while (--i >= 0)
562                                 regulator_unregister(ab3100_regulators[i].rdev);
563                         return err;
564                 }
565
566                 /* Then set a pointer back to the registered regulator */
567                 reg->rdev = rdev;
568         }
569
570         return 0;
571 }
572
573 static int __devexit ab3100_regulators_remove(struct platform_device *pdev)
574 {
575         int i;
576
577         for (i = 0; i < AB3100_NUM_REGULATORS; i++) {
578                 struct ab3100_regulator *reg = &ab3100_regulators[i];
579
580                 regulator_unregister(reg->rdev);
581         }
582         return 0;
583 }
584
585 static struct platform_driver ab3100_regulators_driver = {
586         .driver = {
587                 .name  = "ab3100-regulators",
588                 .owner = THIS_MODULE,
589         },
590         .probe = ab3100_regulators_probe,
591         .remove = __devexit_p(ab3100_regulators_remove),
592 };
593
594 static __init int ab3100_regulators_init(void)
595 {
596         return platform_driver_register(&ab3100_regulators_driver);
597 }
598
599 static __exit void ab3100_regulators_exit(void)
600 {
601         platform_driver_unregister(&ab3100_regulators_driver);
602 }
603
604 subsys_initcall(ab3100_regulators_init);
605 module_exit(ab3100_regulators_exit);
606
607 MODULE_AUTHOR("Mattias Wallin <mattias.wallin@stericsson.com>");
608 MODULE_DESCRIPTION("AB3100 Regulator driver");
609 MODULE_LICENSE("GPL");
610 MODULE_ALIAS("platform:ab3100-regulators");