]> git.karo-electronics.de Git - karo-tx-linux.git/blob - drivers/regulator/wm831x-ldo.c
da73daf2eb7c9e1383aaac15e58e7a522837bddb
[karo-tx-linux.git] / drivers / regulator / wm831x-ldo.c
1 /*
2  * wm831x-ldo.c  --  LDO driver for the WM831x series
3  *
4  * Copyright 2009 Wolfson Microelectronics PLC.
5  *
6  * Author: Mark Brown <broonie@opensource.wolfsonmicro.com>
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
14 #include <linux/module.h>
15 #include <linux/moduleparam.h>
16 #include <linux/init.h>
17 #include <linux/bitops.h>
18 #include <linux/err.h>
19 #include <linux/i2c.h>
20 #include <linux/platform_device.h>
21 #include <linux/regulator/driver.h>
22 #include <linux/slab.h>
23
24 #include <linux/mfd/wm831x/core.h>
25 #include <linux/mfd/wm831x/regulator.h>
26 #include <linux/mfd/wm831x/pdata.h>
27
28 #define WM831X_LDO_MAX_NAME 9
29
30 #define WM831X_LDO_CONTROL       0
31 #define WM831X_LDO_ON_CONTROL    1
32 #define WM831X_LDO_SLEEP_CONTROL 2
33
34 #define WM831X_ALIVE_LDO_ON_CONTROL    0
35 #define WM831X_ALIVE_LDO_SLEEP_CONTROL 1
36
37 struct wm831x_ldo {
38         char name[WM831X_LDO_MAX_NAME];
39         char supply_name[WM831X_LDO_MAX_NAME];
40         struct regulator_desc desc;
41         int base;
42         struct wm831x *wm831x;
43         struct regulator_dev *regulator;
44 };
45
46 /*
47  * Shared
48  */
49
50 static irqreturn_t wm831x_ldo_uv_irq(int irq, void *data)
51 {
52         struct wm831x_ldo *ldo = data;
53
54         regulator_notifier_call_chain(ldo->regulator,
55                                       REGULATOR_EVENT_UNDER_VOLTAGE,
56                                       NULL);
57
58         return IRQ_HANDLED;
59 }
60
61 /*
62  * General purpose LDOs
63  */
64
65 #define WM831X_GP_LDO_SELECTOR_LOW 0xe
66 #define WM831X_GP_LDO_MAX_SELECTOR 0x1f
67
68 static int wm831x_gp_ldo_list_voltage(struct regulator_dev *rdev,
69                                       unsigned int selector)
70 {
71         /* 0.9-1.6V in 50mV steps */
72         if (selector <= WM831X_GP_LDO_SELECTOR_LOW)
73                 return 900000 + (selector * 50000);
74         /* 1.7-3.3V in 100mV steps */
75         if (selector <= WM831X_GP_LDO_MAX_SELECTOR)
76                 return 1600000 + ((selector - WM831X_GP_LDO_SELECTOR_LOW)
77                                   * 100000);
78         return -EINVAL;
79 }
80
81 static int wm831x_gp_ldo_map_voltage(struct regulator_dev *rdev,
82                                      int min_uV, int max_uV)
83 {
84         int volt, vsel;
85
86         if (min_uV < 900000)
87                 vsel = 0;
88         else if (min_uV < 1700000)
89                 vsel = ((min_uV - 900000) / 50000);
90         else
91                 vsel = ((min_uV - 1700000) / 100000)
92                         + WM831X_GP_LDO_SELECTOR_LOW + 1;
93
94         volt = wm831x_gp_ldo_list_voltage(rdev, vsel);
95         if (volt < min_uV || volt > max_uV)
96                 return -EINVAL;
97
98         return vsel;
99 }
100
101 static int wm831x_gp_ldo_set_suspend_voltage(struct regulator_dev *rdev,
102                                              int uV)
103 {
104         struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
105         struct wm831x *wm831x = ldo->wm831x;
106         int sel, reg = ldo->base + WM831X_LDO_SLEEP_CONTROL;
107
108         sel = wm831x_gp_ldo_map_voltage(rdev, uV, uV);
109         if (sel < 0)
110                 return sel;
111
112         return wm831x_set_bits(wm831x, reg, WM831X_LDO1_ON_VSEL_MASK, sel);
113 }
114
115 static unsigned int wm831x_gp_ldo_get_mode(struct regulator_dev *rdev)
116 {
117         struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
118         struct wm831x *wm831x = ldo->wm831x;
119         int ctrl_reg = ldo->base + WM831X_LDO_CONTROL;
120         int on_reg = ldo->base + WM831X_LDO_ON_CONTROL;
121         int ret;
122
123         ret = wm831x_reg_read(wm831x, on_reg);
124         if (ret < 0)
125                 return ret;
126
127         if (!(ret & WM831X_LDO1_ON_MODE))
128                 return REGULATOR_MODE_NORMAL;
129
130         ret = wm831x_reg_read(wm831x, ctrl_reg);
131         if (ret < 0)
132                 return ret;
133
134         if (ret & WM831X_LDO1_LP_MODE)
135                 return REGULATOR_MODE_STANDBY;
136         else
137                 return REGULATOR_MODE_IDLE;
138 }
139
140 static int wm831x_gp_ldo_set_mode(struct regulator_dev *rdev,
141                                   unsigned int mode)
142 {
143         struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
144         struct wm831x *wm831x = ldo->wm831x;
145         int ctrl_reg = ldo->base + WM831X_LDO_CONTROL;
146         int on_reg = ldo->base + WM831X_LDO_ON_CONTROL;
147         int ret;
148
149
150         switch (mode) {
151         case REGULATOR_MODE_NORMAL:
152                 ret = wm831x_set_bits(wm831x, on_reg,
153                                       WM831X_LDO1_ON_MODE, 0);
154                 if (ret < 0)
155                         return ret;
156                 break;
157
158         case REGULATOR_MODE_IDLE:
159                 ret = wm831x_set_bits(wm831x, ctrl_reg,
160                                       WM831X_LDO1_LP_MODE, 0);
161                 if (ret < 0)
162                         return ret;
163
164                 ret = wm831x_set_bits(wm831x, on_reg,
165                                       WM831X_LDO1_ON_MODE,
166                                       WM831X_LDO1_ON_MODE);
167                 if (ret < 0)
168                         return ret;
169                 break;
170
171         case REGULATOR_MODE_STANDBY:
172                 ret = wm831x_set_bits(wm831x, ctrl_reg,
173                                       WM831X_LDO1_LP_MODE,
174                                       WM831X_LDO1_LP_MODE);
175                 if (ret < 0)
176                         return ret;
177
178                 ret = wm831x_set_bits(wm831x, on_reg,
179                                       WM831X_LDO1_ON_MODE,
180                                       WM831X_LDO1_ON_MODE);
181                 if (ret < 0)
182                         return ret;
183                 break;
184
185         default:
186                 return -EINVAL;
187         }
188
189         return 0;
190 }
191
192 static int wm831x_gp_ldo_get_status(struct regulator_dev *rdev)
193 {
194         struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
195         struct wm831x *wm831x = ldo->wm831x;
196         int mask = 1 << rdev_get_id(rdev);
197         int ret;
198
199         /* Is the regulator on? */
200         ret = wm831x_reg_read(wm831x, WM831X_LDO_STATUS);
201         if (ret < 0)
202                 return ret;
203         if (!(ret & mask))
204                 return REGULATOR_STATUS_OFF;
205
206         /* Is it reporting under voltage? */
207         ret = wm831x_reg_read(wm831x, WM831X_LDO_UV_STATUS);
208         if (ret & mask)
209                 return REGULATOR_STATUS_ERROR;
210
211         ret = wm831x_gp_ldo_get_mode(rdev);
212         if (ret < 0)
213                 return ret;
214         else
215                 return regulator_mode_to_status(ret);
216 }
217
218 static unsigned int wm831x_gp_ldo_get_optimum_mode(struct regulator_dev *rdev,
219                                                    int input_uV,
220                                                    int output_uV, int load_uA)
221 {
222         if (load_uA < 20000)
223                 return REGULATOR_MODE_STANDBY;
224         if (load_uA < 50000)
225                 return REGULATOR_MODE_IDLE;
226         return REGULATOR_MODE_NORMAL;
227 }
228
229
230 static struct regulator_ops wm831x_gp_ldo_ops = {
231         .list_voltage = wm831x_gp_ldo_list_voltage,
232         .map_voltage = wm831x_gp_ldo_map_voltage,
233         .get_voltage_sel = regulator_get_voltage_sel_regmap,
234         .set_voltage_sel = regulator_set_voltage_sel_regmap,
235         .set_suspend_voltage = wm831x_gp_ldo_set_suspend_voltage,
236         .get_mode = wm831x_gp_ldo_get_mode,
237         .set_mode = wm831x_gp_ldo_set_mode,
238         .get_status = wm831x_gp_ldo_get_status,
239         .get_optimum_mode = wm831x_gp_ldo_get_optimum_mode,
240
241         .is_enabled = regulator_is_enabled_regmap,
242         .enable = regulator_enable_regmap,
243         .disable = regulator_disable_regmap,
244 };
245
246 static __devinit int wm831x_gp_ldo_probe(struct platform_device *pdev)
247 {
248         struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
249         struct wm831x_pdata *pdata = wm831x->dev->platform_data;
250         struct regulator_config config = { };
251         int id;
252         struct wm831x_ldo *ldo;
253         struct resource *res;
254         int ret, irq;
255
256         if (pdata && pdata->wm831x_num)
257                 id = (pdata->wm831x_num * 10) + 1;
258         else
259                 id = 0;
260         id = pdev->id - id;
261
262         dev_dbg(&pdev->dev, "Probing LDO%d\n", id + 1);
263
264         ldo = devm_kzalloc(&pdev->dev, sizeof(struct wm831x_ldo), GFP_KERNEL);
265         if (ldo == NULL) {
266                 dev_err(&pdev->dev, "Unable to allocate private data\n");
267                 return -ENOMEM;
268         }
269
270         ldo->wm831x = wm831x;
271
272         res = platform_get_resource(pdev, IORESOURCE_REG, 0);
273         if (res == NULL) {
274                 dev_err(&pdev->dev, "No REG resource\n");
275                 ret = -EINVAL;
276                 goto err;
277         }
278         ldo->base = res->start;
279
280         snprintf(ldo->name, sizeof(ldo->name), "LDO%d", id + 1);
281         ldo->desc.name = ldo->name;
282
283         snprintf(ldo->supply_name, sizeof(ldo->supply_name),
284                  "LDO%dVDD", id + 1);
285         ldo->desc.supply_name = ldo->supply_name;
286
287         ldo->desc.id = id;
288         ldo->desc.type = REGULATOR_VOLTAGE;
289         ldo->desc.n_voltages = WM831X_GP_LDO_MAX_SELECTOR + 1;
290         ldo->desc.ops = &wm831x_gp_ldo_ops;
291         ldo->desc.owner = THIS_MODULE;
292         ldo->desc.vsel_reg = ldo->base + WM831X_LDO_ON_CONTROL;
293         ldo->desc.vsel_mask = WM831X_LDO1_ON_VSEL_MASK;
294         ldo->desc.enable_reg = WM831X_LDO_ENABLE;
295         ldo->desc.enable_mask = 1 << id;
296
297         config.dev = pdev->dev.parent;
298         if (pdata)
299                 config.init_data = pdata->ldo[id];
300         config.driver_data = ldo;
301         config.regmap = wm831x->regmap;
302
303         ldo->regulator = regulator_register(&ldo->desc, &config);
304         if (IS_ERR(ldo->regulator)) {
305                 ret = PTR_ERR(ldo->regulator);
306                 dev_err(wm831x->dev, "Failed to register LDO%d: %d\n",
307                         id + 1, ret);
308                 goto err;
309         }
310
311         irq = wm831x_irq(wm831x, platform_get_irq_byname(pdev, "UV"));
312         ret = request_threaded_irq(irq, NULL, wm831x_ldo_uv_irq,
313                                    IRQF_TRIGGER_RISING, ldo->name,
314                                    ldo);
315         if (ret != 0) {
316                 dev_err(&pdev->dev, "Failed to request UV IRQ %d: %d\n",
317                         irq, ret);
318                 goto err_regulator;
319         }
320
321         platform_set_drvdata(pdev, ldo);
322
323         return 0;
324
325 err_regulator:
326         regulator_unregister(ldo->regulator);
327 err:
328         return ret;
329 }
330
331 static __devexit int wm831x_gp_ldo_remove(struct platform_device *pdev)
332 {
333         struct wm831x_ldo *ldo = platform_get_drvdata(pdev);
334
335         platform_set_drvdata(pdev, NULL);
336
337         free_irq(wm831x_irq(ldo->wm831x,
338                             platform_get_irq_byname(pdev, "UV")), ldo);
339         regulator_unregister(ldo->regulator);
340
341         return 0;
342 }
343
344 static struct platform_driver wm831x_gp_ldo_driver = {
345         .probe = wm831x_gp_ldo_probe,
346         .remove = __devexit_p(wm831x_gp_ldo_remove),
347         .driver         = {
348                 .name   = "wm831x-ldo",
349                 .owner  = THIS_MODULE,
350         },
351 };
352
353 /*
354  * Analogue LDOs
355  */
356
357
358 #define WM831X_ALDO_SELECTOR_LOW 0xc
359 #define WM831X_ALDO_MAX_SELECTOR 0x1f
360
361 static int wm831x_aldo_list_voltage(struct regulator_dev *rdev,
362                                       unsigned int selector)
363 {
364         /* 1-1.6V in 50mV steps */
365         if (selector <= WM831X_ALDO_SELECTOR_LOW)
366                 return 1000000 + (selector * 50000);
367         /* 1.7-3.5V in 100mV steps */
368         if (selector <= WM831X_ALDO_MAX_SELECTOR)
369                 return 1600000 + ((selector - WM831X_ALDO_SELECTOR_LOW)
370                                   * 100000);
371         return -EINVAL;
372 }
373
374 static int wm831x_aldo_map_voltage(struct regulator_dev *rdev,
375                                    int min_uV, int max_uV)
376 {
377         int volt, vsel;
378
379         if (min_uV < 1000000)
380                 vsel = 0;
381         else if (min_uV < 1700000)
382                 vsel = ((min_uV - 1000000) / 50000);
383         else
384                 vsel = ((min_uV - 1700000) / 100000)
385                         + WM831X_ALDO_SELECTOR_LOW + 1;
386
387         volt = wm831x_aldo_list_voltage(rdev, vsel);
388         if (volt < min_uV || volt > max_uV)
389                 return -EINVAL;
390
391         return vsel;
392
393 }
394
395 static int wm831x_aldo_set_suspend_voltage(struct regulator_dev *rdev,
396                                              int uV)
397 {
398         struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
399         struct wm831x *wm831x = ldo->wm831x;
400         int sel, reg = ldo->base + WM831X_LDO_SLEEP_CONTROL;
401
402         sel = wm831x_aldo_map_voltage(rdev, uV, uV);
403         if (sel < 0)
404                 return sel;
405
406         return wm831x_set_bits(wm831x, reg, WM831X_LDO7_ON_VSEL_MASK, sel);
407 }
408
409 static unsigned int wm831x_aldo_get_mode(struct regulator_dev *rdev)
410 {
411         struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
412         struct wm831x *wm831x = ldo->wm831x;
413         int on_reg = ldo->base + WM831X_LDO_ON_CONTROL;
414         int ret;
415
416         ret = wm831x_reg_read(wm831x, on_reg);
417         if (ret < 0)
418                 return 0;
419
420         if (ret & WM831X_LDO7_ON_MODE)
421                 return REGULATOR_MODE_IDLE;
422         else
423                 return REGULATOR_MODE_NORMAL;
424 }
425
426 static int wm831x_aldo_set_mode(struct regulator_dev *rdev,
427                                   unsigned int mode)
428 {
429         struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
430         struct wm831x *wm831x = ldo->wm831x;
431         int on_reg = ldo->base + WM831X_LDO_ON_CONTROL;
432         int ret;
433
434
435         switch (mode) {
436         case REGULATOR_MODE_NORMAL:
437                 ret = wm831x_set_bits(wm831x, on_reg, WM831X_LDO7_ON_MODE, 0);
438                 if (ret < 0)
439                         return ret;
440                 break;
441
442         case REGULATOR_MODE_IDLE:
443                 ret = wm831x_set_bits(wm831x, on_reg, WM831X_LDO7_ON_MODE,
444                                       WM831X_LDO7_ON_MODE);
445                 if (ret < 0)
446                         return ret;
447                 break;
448
449         default:
450                 return -EINVAL;
451         }
452
453         return 0;
454 }
455
456 static int wm831x_aldo_get_status(struct regulator_dev *rdev)
457 {
458         struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
459         struct wm831x *wm831x = ldo->wm831x;
460         int mask = 1 << rdev_get_id(rdev);
461         int ret;
462
463         /* Is the regulator on? */
464         ret = wm831x_reg_read(wm831x, WM831X_LDO_STATUS);
465         if (ret < 0)
466                 return ret;
467         if (!(ret & mask))
468                 return REGULATOR_STATUS_OFF;
469
470         /* Is it reporting under voltage? */
471         ret = wm831x_reg_read(wm831x, WM831X_LDO_UV_STATUS);
472         if (ret & mask)
473                 return REGULATOR_STATUS_ERROR;
474
475         ret = wm831x_aldo_get_mode(rdev);
476         if (ret < 0)
477                 return ret;
478         else
479                 return regulator_mode_to_status(ret);
480 }
481
482 static struct regulator_ops wm831x_aldo_ops = {
483         .list_voltage = wm831x_aldo_list_voltage,
484         .map_voltage = wm831x_aldo_map_voltage,
485         .get_voltage_sel = regulator_get_voltage_sel_regmap,
486         .set_voltage_sel = regulator_set_voltage_sel_regmap,
487         .set_suspend_voltage = wm831x_aldo_set_suspend_voltage,
488         .get_mode = wm831x_aldo_get_mode,
489         .set_mode = wm831x_aldo_set_mode,
490         .get_status = wm831x_aldo_get_status,
491
492         .is_enabled = regulator_is_enabled_regmap,
493         .enable = regulator_enable_regmap,
494         .disable = regulator_disable_regmap,
495 };
496
497 static __devinit int wm831x_aldo_probe(struct platform_device *pdev)
498 {
499         struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
500         struct wm831x_pdata *pdata = wm831x->dev->platform_data;
501         struct regulator_config config = { };
502         int id;
503         struct wm831x_ldo *ldo;
504         struct resource *res;
505         int ret, irq;
506
507         if (pdata && pdata->wm831x_num)
508                 id = (pdata->wm831x_num * 10) + 1;
509         else
510                 id = 0;
511         id = pdev->id - id;
512
513         dev_dbg(&pdev->dev, "Probing LDO%d\n", id + 1);
514
515         ldo = devm_kzalloc(&pdev->dev, sizeof(struct wm831x_ldo), GFP_KERNEL);
516         if (ldo == NULL) {
517                 dev_err(&pdev->dev, "Unable to allocate private data\n");
518                 return -ENOMEM;
519         }
520
521         ldo->wm831x = wm831x;
522
523         res = platform_get_resource(pdev, IORESOURCE_REG, 0);
524         if (res == NULL) {
525                 dev_err(&pdev->dev, "No REG resource\n");
526                 ret = -EINVAL;
527                 goto err;
528         }
529         ldo->base = res->start;
530
531         snprintf(ldo->name, sizeof(ldo->name), "LDO%d", id + 1);
532         ldo->desc.name = ldo->name;
533
534         snprintf(ldo->supply_name, sizeof(ldo->supply_name),
535                  "LDO%dVDD", id + 1);
536         ldo->desc.supply_name = ldo->supply_name;
537
538         ldo->desc.id = id;
539         ldo->desc.type = REGULATOR_VOLTAGE;
540         ldo->desc.n_voltages = WM831X_ALDO_MAX_SELECTOR + 1;
541         ldo->desc.ops = &wm831x_aldo_ops;
542         ldo->desc.owner = THIS_MODULE;
543         ldo->desc.vsel_reg = ldo->base + WM831X_LDO_ON_CONTROL;
544         ldo->desc.vsel_mask = WM831X_LDO7_ON_VSEL_MASK;
545         ldo->desc.enable_reg = WM831X_LDO_ENABLE;
546         ldo->desc.enable_mask = 1 << id;
547
548         config.dev = pdev->dev.parent;
549         if (pdata)
550                 config.init_data = pdata->ldo[id];
551         config.driver_data = ldo;
552         config.regmap = wm831x->regmap;
553
554         ldo->regulator = regulator_register(&ldo->desc, &config);
555         if (IS_ERR(ldo->regulator)) {
556                 ret = PTR_ERR(ldo->regulator);
557                 dev_err(wm831x->dev, "Failed to register LDO%d: %d\n",
558                         id + 1, ret);
559                 goto err;
560         }
561
562         irq = wm831x_irq(wm831x, platform_get_irq_byname(pdev, "UV"));
563         ret = request_threaded_irq(irq, NULL, wm831x_ldo_uv_irq,
564                                    IRQF_TRIGGER_RISING, ldo->name, ldo);
565         if (ret != 0) {
566                 dev_err(&pdev->dev, "Failed to request UV IRQ %d: %d\n",
567                         irq, ret);
568                 goto err_regulator;
569         }
570
571         platform_set_drvdata(pdev, ldo);
572
573         return 0;
574
575 err_regulator:
576         regulator_unregister(ldo->regulator);
577 err:
578         return ret;
579 }
580
581 static __devexit int wm831x_aldo_remove(struct platform_device *pdev)
582 {
583         struct wm831x_ldo *ldo = platform_get_drvdata(pdev);
584
585         free_irq(wm831x_irq(ldo->wm831x, platform_get_irq_byname(pdev, "UV")),
586                  ldo);
587         regulator_unregister(ldo->regulator);
588
589         return 0;
590 }
591
592 static struct platform_driver wm831x_aldo_driver = {
593         .probe = wm831x_aldo_probe,
594         .remove = __devexit_p(wm831x_aldo_remove),
595         .driver         = {
596                 .name   = "wm831x-aldo",
597                 .owner  = THIS_MODULE,
598         },
599 };
600
601 /*
602  * Alive LDO
603  */
604
605 #define WM831X_ALIVE_LDO_MAX_SELECTOR 0xf
606
607 static int wm831x_alive_ldo_set_suspend_voltage(struct regulator_dev *rdev,
608                                              int uV)
609 {
610         struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
611         struct wm831x *wm831x = ldo->wm831x;
612         int sel, reg = ldo->base + WM831X_ALIVE_LDO_SLEEP_CONTROL;
613
614         sel = regulator_map_voltage_linear(rdev, uV, uV);
615         if (sel < 0)
616                 return sel;
617
618         return wm831x_set_bits(wm831x, reg, WM831X_LDO11_ON_VSEL_MASK, sel);
619 }
620
621 static int wm831x_alive_ldo_get_status(struct regulator_dev *rdev)
622 {
623         struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
624         struct wm831x *wm831x = ldo->wm831x;
625         int mask = 1 << rdev_get_id(rdev);
626         int ret;
627
628         /* Is the regulator on? */
629         ret = wm831x_reg_read(wm831x, WM831X_LDO_STATUS);
630         if (ret < 0)
631                 return ret;
632         if (ret & mask)
633                 return REGULATOR_STATUS_ON;
634         else
635                 return REGULATOR_STATUS_OFF;
636 }
637
638 static struct regulator_ops wm831x_alive_ldo_ops = {
639         .list_voltage = regulator_list_voltage_linear,
640         .map_voltage = regulator_map_voltage_linear,
641         .get_voltage_sel = regulator_get_voltage_sel_regmap,
642         .set_voltage_sel = regulator_set_voltage_sel_regmap,
643         .set_suspend_voltage = wm831x_alive_ldo_set_suspend_voltage,
644         .get_status = wm831x_alive_ldo_get_status,
645
646         .is_enabled = regulator_is_enabled_regmap,
647         .enable = regulator_enable_regmap,
648         .disable = regulator_disable_regmap,
649 };
650
651 static __devinit int wm831x_alive_ldo_probe(struct platform_device *pdev)
652 {
653         struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
654         struct wm831x_pdata *pdata = wm831x->dev->platform_data;
655         struct regulator_config config = { };
656         int id;
657         struct wm831x_ldo *ldo;
658         struct resource *res;
659         int ret;
660
661         if (pdata && pdata->wm831x_num)
662                 id = (pdata->wm831x_num * 10) + 1;
663         else
664                 id = 0;
665         id = pdev->id - id;
666
667
668         dev_dbg(&pdev->dev, "Probing LDO%d\n", id + 1);
669
670         ldo = devm_kzalloc(&pdev->dev, sizeof(struct wm831x_ldo), GFP_KERNEL);
671         if (ldo == NULL) {
672                 dev_err(&pdev->dev, "Unable to allocate private data\n");
673                 return -ENOMEM;
674         }
675
676         ldo->wm831x = wm831x;
677
678         res = platform_get_resource(pdev, IORESOURCE_REG, 0);
679         if (res == NULL) {
680                 dev_err(&pdev->dev, "No REG resource\n");
681                 ret = -EINVAL;
682                 goto err;
683         }
684         ldo->base = res->start;
685
686         snprintf(ldo->name, sizeof(ldo->name), "LDO%d", id + 1);
687         ldo->desc.name = ldo->name;
688
689         snprintf(ldo->supply_name, sizeof(ldo->supply_name),
690                  "LDO%dVDD", id + 1);
691         ldo->desc.supply_name = ldo->supply_name;
692
693         ldo->desc.id = id;
694         ldo->desc.type = REGULATOR_VOLTAGE;
695         ldo->desc.n_voltages = WM831X_ALIVE_LDO_MAX_SELECTOR + 1;
696         ldo->desc.ops = &wm831x_alive_ldo_ops;
697         ldo->desc.owner = THIS_MODULE;
698         ldo->desc.vsel_reg = ldo->base + WM831X_ALIVE_LDO_ON_CONTROL;
699         ldo->desc.vsel_mask = WM831X_LDO11_ON_VSEL_MASK;
700         ldo->desc.enable_reg = WM831X_LDO_ENABLE;
701         ldo->desc.enable_mask = 1 << id;
702         ldo->desc.min_uV = 800000;
703         ldo->desc.uV_step = 50000;
704         ldo->desc.enable_time = 1000;
705
706         config.dev = pdev->dev.parent;
707         if (pdata)
708                 config.init_data = pdata->ldo[id];
709         config.driver_data = ldo;
710         config.regmap = wm831x->regmap;
711
712         ldo->regulator = regulator_register(&ldo->desc, &config);
713         if (IS_ERR(ldo->regulator)) {
714                 ret = PTR_ERR(ldo->regulator);
715                 dev_err(wm831x->dev, "Failed to register LDO%d: %d\n",
716                         id + 1, ret);
717                 goto err;
718         }
719
720         platform_set_drvdata(pdev, ldo);
721
722         return 0;
723
724 err:
725         return ret;
726 }
727
728 static __devexit int wm831x_alive_ldo_remove(struct platform_device *pdev)
729 {
730         struct wm831x_ldo *ldo = platform_get_drvdata(pdev);
731
732         regulator_unregister(ldo->regulator);
733
734         return 0;
735 }
736
737 static struct platform_driver wm831x_alive_ldo_driver = {
738         .probe = wm831x_alive_ldo_probe,
739         .remove = __devexit_p(wm831x_alive_ldo_remove),
740         .driver         = {
741                 .name   = "wm831x-alive-ldo",
742                 .owner  = THIS_MODULE,
743         },
744 };
745
746 static int __init wm831x_ldo_init(void)
747 {
748         int ret;
749
750         ret = platform_driver_register(&wm831x_gp_ldo_driver);
751         if (ret != 0)
752                 pr_err("Failed to register WM831x GP LDO driver: %d\n", ret);
753
754         ret = platform_driver_register(&wm831x_aldo_driver);
755         if (ret != 0)
756                 pr_err("Failed to register WM831x ALDO driver: %d\n", ret);
757
758         ret = platform_driver_register(&wm831x_alive_ldo_driver);
759         if (ret != 0)
760                 pr_err("Failed to register WM831x alive LDO driver: %d\n",
761                        ret);
762
763         return 0;
764 }
765 subsys_initcall(wm831x_ldo_init);
766
767 static void __exit wm831x_ldo_exit(void)
768 {
769         platform_driver_unregister(&wm831x_alive_ldo_driver);
770         platform_driver_unregister(&wm831x_aldo_driver);
771         platform_driver_unregister(&wm831x_gp_ldo_driver);
772 }
773 module_exit(wm831x_ldo_exit);
774
775 /* Module information */
776 MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>");
777 MODULE_DESCRIPTION("WM831x LDO driver");
778 MODULE_LICENSE("GPL");
779 MODULE_ALIAS("platform:wm831x-ldo");
780 MODULE_ALIAS("platform:wm831x-aldo");
781 MODULE_ALIAS("platform:wm831x-aliveldo");