Merge branch 'drm-fixes-3.14' of git://people.freedesktop.org/~agd5f/linux into drm...
[profile/ivi/kernel-x86-ivi.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 static const struct regulator_linear_range wm831x_gp_ldo_ranges[] = {
66         REGULATOR_LINEAR_RANGE(900000, 0, 14, 50000),
67         REGULATOR_LINEAR_RANGE(1700000, 15, 31, 100000),
68 };
69
70 static int wm831x_gp_ldo_set_suspend_voltage(struct regulator_dev *rdev,
71                                              int uV)
72 {
73         struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
74         struct wm831x *wm831x = ldo->wm831x;
75         int sel, reg = ldo->base + WM831X_LDO_SLEEP_CONTROL;
76
77         sel = regulator_map_voltage_linear_range(rdev, uV, uV);
78         if (sel < 0)
79                 return sel;
80
81         return wm831x_set_bits(wm831x, reg, WM831X_LDO1_ON_VSEL_MASK, sel);
82 }
83
84 static unsigned int wm831x_gp_ldo_get_mode(struct regulator_dev *rdev)
85 {
86         struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
87         struct wm831x *wm831x = ldo->wm831x;
88         int ctrl_reg = ldo->base + WM831X_LDO_CONTROL;
89         int on_reg = ldo->base + WM831X_LDO_ON_CONTROL;
90         int ret;
91
92         ret = wm831x_reg_read(wm831x, on_reg);
93         if (ret < 0)
94                 return ret;
95
96         if (!(ret & WM831X_LDO1_ON_MODE))
97                 return REGULATOR_MODE_NORMAL;
98
99         ret = wm831x_reg_read(wm831x, ctrl_reg);
100         if (ret < 0)
101                 return ret;
102
103         if (ret & WM831X_LDO1_LP_MODE)
104                 return REGULATOR_MODE_STANDBY;
105         else
106                 return REGULATOR_MODE_IDLE;
107 }
108
109 static int wm831x_gp_ldo_set_mode(struct regulator_dev *rdev,
110                                   unsigned int mode)
111 {
112         struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
113         struct wm831x *wm831x = ldo->wm831x;
114         int ctrl_reg = ldo->base + WM831X_LDO_CONTROL;
115         int on_reg = ldo->base + WM831X_LDO_ON_CONTROL;
116         int ret;
117
118
119         switch (mode) {
120         case REGULATOR_MODE_NORMAL:
121                 ret = wm831x_set_bits(wm831x, on_reg,
122                                       WM831X_LDO1_ON_MODE, 0);
123                 if (ret < 0)
124                         return ret;
125                 break;
126
127         case REGULATOR_MODE_IDLE:
128                 ret = wm831x_set_bits(wm831x, ctrl_reg,
129                                       WM831X_LDO1_LP_MODE, 0);
130                 if (ret < 0)
131                         return ret;
132
133                 ret = wm831x_set_bits(wm831x, on_reg,
134                                       WM831X_LDO1_ON_MODE,
135                                       WM831X_LDO1_ON_MODE);
136                 if (ret < 0)
137                         return ret;
138                 break;
139
140         case REGULATOR_MODE_STANDBY:
141                 ret = wm831x_set_bits(wm831x, ctrl_reg,
142                                       WM831X_LDO1_LP_MODE,
143                                       WM831X_LDO1_LP_MODE);
144                 if (ret < 0)
145                         return ret;
146
147                 ret = wm831x_set_bits(wm831x, on_reg,
148                                       WM831X_LDO1_ON_MODE,
149                                       WM831X_LDO1_ON_MODE);
150                 if (ret < 0)
151                         return ret;
152                 break;
153
154         default:
155                 return -EINVAL;
156         }
157
158         return 0;
159 }
160
161 static int wm831x_gp_ldo_get_status(struct regulator_dev *rdev)
162 {
163         struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
164         struct wm831x *wm831x = ldo->wm831x;
165         int mask = 1 << rdev_get_id(rdev);
166         int ret;
167
168         /* Is the regulator on? */
169         ret = wm831x_reg_read(wm831x, WM831X_LDO_STATUS);
170         if (ret < 0)
171                 return ret;
172         if (!(ret & mask))
173                 return REGULATOR_STATUS_OFF;
174
175         /* Is it reporting under voltage? */
176         ret = wm831x_reg_read(wm831x, WM831X_LDO_UV_STATUS);
177         if (ret < 0)
178                 return ret;
179         if (ret & mask)
180                 return REGULATOR_STATUS_ERROR;
181
182         ret = wm831x_gp_ldo_get_mode(rdev);
183         if (ret < 0)
184                 return ret;
185         else
186                 return regulator_mode_to_status(ret);
187 }
188
189 static unsigned int wm831x_gp_ldo_get_optimum_mode(struct regulator_dev *rdev,
190                                                    int input_uV,
191                                                    int output_uV, int load_uA)
192 {
193         if (load_uA < 20000)
194                 return REGULATOR_MODE_STANDBY;
195         if (load_uA < 50000)
196                 return REGULATOR_MODE_IDLE;
197         return REGULATOR_MODE_NORMAL;
198 }
199
200
201 static struct regulator_ops wm831x_gp_ldo_ops = {
202         .list_voltage = regulator_list_voltage_linear_range,
203         .map_voltage = regulator_map_voltage_linear_range,
204         .get_voltage_sel = regulator_get_voltage_sel_regmap,
205         .set_voltage_sel = regulator_set_voltage_sel_regmap,
206         .set_suspend_voltage = wm831x_gp_ldo_set_suspend_voltage,
207         .get_mode = wm831x_gp_ldo_get_mode,
208         .set_mode = wm831x_gp_ldo_set_mode,
209         .get_status = wm831x_gp_ldo_get_status,
210         .get_optimum_mode = wm831x_gp_ldo_get_optimum_mode,
211         .get_bypass = regulator_get_bypass_regmap,
212         .set_bypass = regulator_set_bypass_regmap,
213
214         .is_enabled = regulator_is_enabled_regmap,
215         .enable = regulator_enable_regmap,
216         .disable = regulator_disable_regmap,
217 };
218
219 static int wm831x_gp_ldo_probe(struct platform_device *pdev)
220 {
221         struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
222         struct wm831x_pdata *pdata = dev_get_platdata(wm831x->dev);
223         struct regulator_config config = { };
224         int id;
225         struct wm831x_ldo *ldo;
226         struct resource *res;
227         int ret, irq;
228
229         if (pdata && pdata->wm831x_num)
230                 id = (pdata->wm831x_num * 10) + 1;
231         else
232                 id = 0;
233         id = pdev->id - id;
234
235         dev_dbg(&pdev->dev, "Probing LDO%d\n", id + 1);
236
237         ldo = devm_kzalloc(&pdev->dev, sizeof(struct wm831x_ldo), GFP_KERNEL);
238         if (ldo == NULL) {
239                 dev_err(&pdev->dev, "Unable to allocate private data\n");
240                 return -ENOMEM;
241         }
242
243         ldo->wm831x = wm831x;
244
245         res = platform_get_resource(pdev, IORESOURCE_REG, 0);
246         if (res == NULL) {
247                 dev_err(&pdev->dev, "No REG resource\n");
248                 ret = -EINVAL;
249                 goto err;
250         }
251         ldo->base = res->start;
252
253         snprintf(ldo->name, sizeof(ldo->name), "LDO%d", id + 1);
254         ldo->desc.name = ldo->name;
255
256         snprintf(ldo->supply_name, sizeof(ldo->supply_name),
257                  "LDO%dVDD", id + 1);
258         ldo->desc.supply_name = ldo->supply_name;
259
260         ldo->desc.id = id;
261         ldo->desc.type = REGULATOR_VOLTAGE;
262         ldo->desc.n_voltages = 32;
263         ldo->desc.ops = &wm831x_gp_ldo_ops;
264         ldo->desc.owner = THIS_MODULE;
265         ldo->desc.vsel_reg = ldo->base + WM831X_LDO_ON_CONTROL;
266         ldo->desc.vsel_mask = WM831X_LDO1_ON_VSEL_MASK;
267         ldo->desc.enable_reg = WM831X_LDO_ENABLE;
268         ldo->desc.enable_mask = 1 << id;
269         ldo->desc.bypass_reg = ldo->base;
270         ldo->desc.bypass_mask = WM831X_LDO1_SWI;
271         ldo->desc.linear_ranges = wm831x_gp_ldo_ranges;
272         ldo->desc.n_linear_ranges = ARRAY_SIZE(wm831x_gp_ldo_ranges);
273
274         config.dev = pdev->dev.parent;
275         if (pdata)
276                 config.init_data = pdata->ldo[id];
277         config.driver_data = ldo;
278         config.regmap = wm831x->regmap;
279
280         ldo->regulator = devm_regulator_register(&pdev->dev, &ldo->desc,
281                                                  &config);
282         if (IS_ERR(ldo->regulator)) {
283                 ret = PTR_ERR(ldo->regulator);
284                 dev_err(wm831x->dev, "Failed to register LDO%d: %d\n",
285                         id + 1, ret);
286                 goto err;
287         }
288
289         irq = wm831x_irq(wm831x, platform_get_irq_byname(pdev, "UV"));
290         ret = devm_request_threaded_irq(&pdev->dev, irq, NULL,
291                                         wm831x_ldo_uv_irq,
292                                         IRQF_TRIGGER_RISING, ldo->name,
293                                         ldo);
294         if (ret != 0) {
295                 dev_err(&pdev->dev, "Failed to request UV IRQ %d: %d\n",
296                         irq, ret);
297                 goto err;
298         }
299
300         platform_set_drvdata(pdev, ldo);
301
302         return 0;
303
304 err:
305         return ret;
306 }
307
308 static struct platform_driver wm831x_gp_ldo_driver = {
309         .probe = wm831x_gp_ldo_probe,
310         .driver         = {
311                 .name   = "wm831x-ldo",
312                 .owner  = THIS_MODULE,
313         },
314 };
315
316 /*
317  * Analogue LDOs
318  */
319
320 static const struct regulator_linear_range wm831x_aldo_ranges[] = {
321         REGULATOR_LINEAR_RANGE(1000000, 0, 12, 50000),
322         REGULATOR_LINEAR_RANGE(1700000, 13, 31, 100000),
323 };
324
325 static int wm831x_aldo_set_suspend_voltage(struct regulator_dev *rdev,
326                                              int uV)
327 {
328         struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
329         struct wm831x *wm831x = ldo->wm831x;
330         int sel, reg = ldo->base + WM831X_LDO_SLEEP_CONTROL;
331
332         sel = regulator_map_voltage_linear_range(rdev, uV, uV);
333         if (sel < 0)
334                 return sel;
335
336         return wm831x_set_bits(wm831x, reg, WM831X_LDO7_ON_VSEL_MASK, sel);
337 }
338
339 static unsigned int wm831x_aldo_get_mode(struct regulator_dev *rdev)
340 {
341         struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
342         struct wm831x *wm831x = ldo->wm831x;
343         int on_reg = ldo->base + WM831X_LDO_ON_CONTROL;
344         int ret;
345
346         ret = wm831x_reg_read(wm831x, on_reg);
347         if (ret < 0)
348                 return 0;
349
350         if (ret & WM831X_LDO7_ON_MODE)
351                 return REGULATOR_MODE_IDLE;
352         else
353                 return REGULATOR_MODE_NORMAL;
354 }
355
356 static int wm831x_aldo_set_mode(struct regulator_dev *rdev,
357                                   unsigned int mode)
358 {
359         struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
360         struct wm831x *wm831x = ldo->wm831x;
361         int on_reg = ldo->base + WM831X_LDO_ON_CONTROL;
362         int ret;
363
364
365         switch (mode) {
366         case REGULATOR_MODE_NORMAL:
367                 ret = wm831x_set_bits(wm831x, on_reg, WM831X_LDO7_ON_MODE, 0);
368                 if (ret < 0)
369                         return ret;
370                 break;
371
372         case REGULATOR_MODE_IDLE:
373                 ret = wm831x_set_bits(wm831x, on_reg, WM831X_LDO7_ON_MODE,
374                                       WM831X_LDO7_ON_MODE);
375                 if (ret < 0)
376                         return ret;
377                 break;
378
379         default:
380                 return -EINVAL;
381         }
382
383         return 0;
384 }
385
386 static int wm831x_aldo_get_status(struct regulator_dev *rdev)
387 {
388         struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
389         struct wm831x *wm831x = ldo->wm831x;
390         int mask = 1 << rdev_get_id(rdev);
391         int ret;
392
393         /* Is the regulator on? */
394         ret = wm831x_reg_read(wm831x, WM831X_LDO_STATUS);
395         if (ret < 0)
396                 return ret;
397         if (!(ret & mask))
398                 return REGULATOR_STATUS_OFF;
399
400         /* Is it reporting under voltage? */
401         ret = wm831x_reg_read(wm831x, WM831X_LDO_UV_STATUS);
402         if (ret < 0)
403                 return ret;
404         if (ret & mask)
405                 return REGULATOR_STATUS_ERROR;
406
407         ret = wm831x_aldo_get_mode(rdev);
408         if (ret < 0)
409                 return ret;
410         else
411                 return regulator_mode_to_status(ret);
412 }
413
414 static struct regulator_ops wm831x_aldo_ops = {
415         .list_voltage = regulator_list_voltage_linear_range,
416         .map_voltage = regulator_map_voltage_linear_range,
417         .get_voltage_sel = regulator_get_voltage_sel_regmap,
418         .set_voltage_sel = regulator_set_voltage_sel_regmap,
419         .set_suspend_voltage = wm831x_aldo_set_suspend_voltage,
420         .get_mode = wm831x_aldo_get_mode,
421         .set_mode = wm831x_aldo_set_mode,
422         .get_status = wm831x_aldo_get_status,
423         .set_bypass = regulator_set_bypass_regmap,
424         .get_bypass = regulator_get_bypass_regmap,
425
426         .is_enabled = regulator_is_enabled_regmap,
427         .enable = regulator_enable_regmap,
428         .disable = regulator_disable_regmap,
429 };
430
431 static int wm831x_aldo_probe(struct platform_device *pdev)
432 {
433         struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
434         struct wm831x_pdata *pdata = dev_get_platdata(wm831x->dev);
435         struct regulator_config config = { };
436         int id;
437         struct wm831x_ldo *ldo;
438         struct resource *res;
439         int ret, irq;
440
441         if (pdata && pdata->wm831x_num)
442                 id = (pdata->wm831x_num * 10) + 1;
443         else
444                 id = 0;
445         id = pdev->id - id;
446
447         dev_dbg(&pdev->dev, "Probing LDO%d\n", id + 1);
448
449         ldo = devm_kzalloc(&pdev->dev, sizeof(struct wm831x_ldo), GFP_KERNEL);
450         if (ldo == NULL) {
451                 dev_err(&pdev->dev, "Unable to allocate private data\n");
452                 return -ENOMEM;
453         }
454
455         ldo->wm831x = wm831x;
456
457         res = platform_get_resource(pdev, IORESOURCE_REG, 0);
458         if (res == NULL) {
459                 dev_err(&pdev->dev, "No REG resource\n");
460                 ret = -EINVAL;
461                 goto err;
462         }
463         ldo->base = res->start;
464
465         snprintf(ldo->name, sizeof(ldo->name), "LDO%d", id + 1);
466         ldo->desc.name = ldo->name;
467
468         snprintf(ldo->supply_name, sizeof(ldo->supply_name),
469                  "LDO%dVDD", id + 1);
470         ldo->desc.supply_name = ldo->supply_name;
471
472         ldo->desc.id = id;
473         ldo->desc.type = REGULATOR_VOLTAGE;
474         ldo->desc.n_voltages = 32;
475         ldo->desc.linear_ranges = wm831x_aldo_ranges;
476         ldo->desc.n_linear_ranges = ARRAY_SIZE(wm831x_aldo_ranges);
477         ldo->desc.ops = &wm831x_aldo_ops;
478         ldo->desc.owner = THIS_MODULE;
479         ldo->desc.vsel_reg = ldo->base + WM831X_LDO_ON_CONTROL;
480         ldo->desc.vsel_mask = WM831X_LDO7_ON_VSEL_MASK;
481         ldo->desc.enable_reg = WM831X_LDO_ENABLE;
482         ldo->desc.enable_mask = 1 << id;
483         ldo->desc.bypass_reg = ldo->base;
484         ldo->desc.bypass_mask = WM831X_LDO7_SWI;
485
486         config.dev = pdev->dev.parent;
487         if (pdata)
488                 config.init_data = pdata->ldo[id];
489         config.driver_data = ldo;
490         config.regmap = wm831x->regmap;
491
492         ldo->regulator = devm_regulator_register(&pdev->dev, &ldo->desc,
493                                                  &config);
494         if (IS_ERR(ldo->regulator)) {
495                 ret = PTR_ERR(ldo->regulator);
496                 dev_err(wm831x->dev, "Failed to register LDO%d: %d\n",
497                         id + 1, ret);
498                 goto err;
499         }
500
501         irq = wm831x_irq(wm831x, platform_get_irq_byname(pdev, "UV"));
502         ret = devm_request_threaded_irq(&pdev->dev, irq, NULL,
503                                         wm831x_ldo_uv_irq,
504                                         IRQF_TRIGGER_RISING, ldo->name, ldo);
505         if (ret != 0) {
506                 dev_err(&pdev->dev, "Failed to request UV IRQ %d: %d\n",
507                         irq, ret);
508                 goto err;
509         }
510
511         platform_set_drvdata(pdev, ldo);
512
513         return 0;
514
515 err:
516         return ret;
517 }
518
519 static struct platform_driver wm831x_aldo_driver = {
520         .probe = wm831x_aldo_probe,
521         .driver         = {
522                 .name   = "wm831x-aldo",
523                 .owner  = THIS_MODULE,
524         },
525 };
526
527 /*
528  * Alive LDO
529  */
530
531 #define WM831X_ALIVE_LDO_MAX_SELECTOR 0xf
532
533 static int wm831x_alive_ldo_set_suspend_voltage(struct regulator_dev *rdev,
534                                              int uV)
535 {
536         struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
537         struct wm831x *wm831x = ldo->wm831x;
538         int sel, reg = ldo->base + WM831X_ALIVE_LDO_SLEEP_CONTROL;
539
540         sel = regulator_map_voltage_linear(rdev, uV, uV);
541         if (sel < 0)
542                 return sel;
543
544         return wm831x_set_bits(wm831x, reg, WM831X_LDO11_ON_VSEL_MASK, sel);
545 }
546
547 static int wm831x_alive_ldo_get_status(struct regulator_dev *rdev)
548 {
549         struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
550         struct wm831x *wm831x = ldo->wm831x;
551         int mask = 1 << rdev_get_id(rdev);
552         int ret;
553
554         /* Is the regulator on? */
555         ret = wm831x_reg_read(wm831x, WM831X_LDO_STATUS);
556         if (ret < 0)
557                 return ret;
558         if (ret & mask)
559                 return REGULATOR_STATUS_ON;
560         else
561                 return REGULATOR_STATUS_OFF;
562 }
563
564 static struct regulator_ops wm831x_alive_ldo_ops = {
565         .list_voltage = regulator_list_voltage_linear,
566         .map_voltage = regulator_map_voltage_linear,
567         .get_voltage_sel = regulator_get_voltage_sel_regmap,
568         .set_voltage_sel = regulator_set_voltage_sel_regmap,
569         .set_suspend_voltage = wm831x_alive_ldo_set_suspend_voltage,
570         .get_status = wm831x_alive_ldo_get_status,
571
572         .is_enabled = regulator_is_enabled_regmap,
573         .enable = regulator_enable_regmap,
574         .disable = regulator_disable_regmap,
575 };
576
577 static int wm831x_alive_ldo_probe(struct platform_device *pdev)
578 {
579         struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
580         struct wm831x_pdata *pdata = dev_get_platdata(wm831x->dev);
581         struct regulator_config config = { };
582         int id;
583         struct wm831x_ldo *ldo;
584         struct resource *res;
585         int ret;
586
587         if (pdata && pdata->wm831x_num)
588                 id = (pdata->wm831x_num * 10) + 1;
589         else
590                 id = 0;
591         id = pdev->id - id;
592
593
594         dev_dbg(&pdev->dev, "Probing LDO%d\n", id + 1);
595
596         ldo = devm_kzalloc(&pdev->dev, sizeof(struct wm831x_ldo), GFP_KERNEL);
597         if (ldo == NULL) {
598                 dev_err(&pdev->dev, "Unable to allocate private data\n");
599                 return -ENOMEM;
600         }
601
602         ldo->wm831x = wm831x;
603
604         res = platform_get_resource(pdev, IORESOURCE_REG, 0);
605         if (res == NULL) {
606                 dev_err(&pdev->dev, "No REG resource\n");
607                 ret = -EINVAL;
608                 goto err;
609         }
610         ldo->base = res->start;
611
612         snprintf(ldo->name, sizeof(ldo->name), "LDO%d", id + 1);
613         ldo->desc.name = ldo->name;
614
615         snprintf(ldo->supply_name, sizeof(ldo->supply_name),
616                  "LDO%dVDD", id + 1);
617         ldo->desc.supply_name = ldo->supply_name;
618
619         ldo->desc.id = id;
620         ldo->desc.type = REGULATOR_VOLTAGE;
621         ldo->desc.n_voltages = WM831X_ALIVE_LDO_MAX_SELECTOR + 1;
622         ldo->desc.ops = &wm831x_alive_ldo_ops;
623         ldo->desc.owner = THIS_MODULE;
624         ldo->desc.vsel_reg = ldo->base + WM831X_ALIVE_LDO_ON_CONTROL;
625         ldo->desc.vsel_mask = WM831X_LDO11_ON_VSEL_MASK;
626         ldo->desc.enable_reg = WM831X_LDO_ENABLE;
627         ldo->desc.enable_mask = 1 << id;
628         ldo->desc.min_uV = 800000;
629         ldo->desc.uV_step = 50000;
630         ldo->desc.enable_time = 1000;
631
632         config.dev = pdev->dev.parent;
633         if (pdata)
634                 config.init_data = pdata->ldo[id];
635         config.driver_data = ldo;
636         config.regmap = wm831x->regmap;
637
638         ldo->regulator = devm_regulator_register(&pdev->dev, &ldo->desc,
639                                                  &config);
640         if (IS_ERR(ldo->regulator)) {
641                 ret = PTR_ERR(ldo->regulator);
642                 dev_err(wm831x->dev, "Failed to register LDO%d: %d\n",
643                         id + 1, ret);
644                 goto err;
645         }
646
647         platform_set_drvdata(pdev, ldo);
648
649         return 0;
650
651 err:
652         return ret;
653 }
654
655 static struct platform_driver wm831x_alive_ldo_driver = {
656         .probe = wm831x_alive_ldo_probe,
657         .driver         = {
658                 .name   = "wm831x-alive-ldo",
659                 .owner  = THIS_MODULE,
660         },
661 };
662
663 static int __init wm831x_ldo_init(void)
664 {
665         int ret;
666
667         ret = platform_driver_register(&wm831x_gp_ldo_driver);
668         if (ret != 0)
669                 pr_err("Failed to register WM831x GP LDO driver: %d\n", ret);
670
671         ret = platform_driver_register(&wm831x_aldo_driver);
672         if (ret != 0)
673                 pr_err("Failed to register WM831x ALDO driver: %d\n", ret);
674
675         ret = platform_driver_register(&wm831x_alive_ldo_driver);
676         if (ret != 0)
677                 pr_err("Failed to register WM831x alive LDO driver: %d\n",
678                        ret);
679
680         return 0;
681 }
682 subsys_initcall(wm831x_ldo_init);
683
684 static void __exit wm831x_ldo_exit(void)
685 {
686         platform_driver_unregister(&wm831x_alive_ldo_driver);
687         platform_driver_unregister(&wm831x_aldo_driver);
688         platform_driver_unregister(&wm831x_gp_ldo_driver);
689 }
690 module_exit(wm831x_ldo_exit);
691
692 /* Module information */
693 MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>");
694 MODULE_DESCRIPTION("WM831x LDO driver");
695 MODULE_LICENSE("GPL");
696 MODULE_ALIAS("platform:wm831x-ldo");
697 MODULE_ALIAS("platform:wm831x-aldo");
698 MODULE_ALIAS("platform:wm831x-aliveldo");