xref: /linux/drivers/regulator/wm831x-dcdc.c (revision 6469f540ea37d53db089c8fea9c0c77a3d9353d4)
1 /*
2  * wm831x-dcdc.c  --  DC-DC buck convertor 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 
23 #include <linux/mfd/wm831x/core.h>
24 #include <linux/mfd/wm831x/regulator.h>
25 #include <linux/mfd/wm831x/pdata.h>
26 
27 #define WM831X_BUCKV_MAX_SELECTOR 0x68
28 #define WM831X_BUCKP_MAX_SELECTOR 0x66
29 
30 #define WM831X_DCDC_MODE_FAST    0
31 #define WM831X_DCDC_MODE_NORMAL  1
32 #define WM831X_DCDC_MODE_IDLE    2
33 #define WM831X_DCDC_MODE_STANDBY 3
34 
35 #define WM831X_DCDC_MAX_NAME 6
36 
37 /* Register offsets in control block */
38 #define WM831X_DCDC_CONTROL_1     0
39 #define WM831X_DCDC_CONTROL_2     1
40 #define WM831X_DCDC_ON_CONFIG     2
41 #define WM831X_DCDC_SLEEP_CONTROL 3
42 
43 /*
44  * Shared
45  */
46 
47 struct wm831x_dcdc {
48 	char name[WM831X_DCDC_MAX_NAME];
49 	struct regulator_desc desc;
50 	int base;
51 	struct wm831x *wm831x;
52 	struct regulator_dev *regulator;
53 };
54 
55 static int wm831x_dcdc_is_enabled(struct regulator_dev *rdev)
56 {
57 	struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
58 	struct wm831x *wm831x = dcdc->wm831x;
59 	int mask = 1 << rdev_get_id(rdev);
60 	int reg;
61 
62 	reg = wm831x_reg_read(wm831x, WM831X_DCDC_ENABLE);
63 	if (reg < 0)
64 		return reg;
65 
66 	if (reg & mask)
67 		return 1;
68 	else
69 		return 0;
70 }
71 
72 static int wm831x_dcdc_enable(struct regulator_dev *rdev)
73 {
74 	struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
75 	struct wm831x *wm831x = dcdc->wm831x;
76 	int mask = 1 << rdev_get_id(rdev);
77 
78 	return wm831x_set_bits(wm831x, WM831X_DCDC_ENABLE, mask, mask);
79 }
80 
81 static int wm831x_dcdc_disable(struct regulator_dev *rdev)
82 {
83 	struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
84 	struct wm831x *wm831x = dcdc->wm831x;
85 	int mask = 1 << rdev_get_id(rdev);
86 
87 	return wm831x_set_bits(wm831x, WM831X_DCDC_ENABLE, mask, 0);
88 }
89 
90 static unsigned int wm831x_dcdc_get_mode(struct regulator_dev *rdev)
91 
92 {
93 	struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
94 	struct wm831x *wm831x = dcdc->wm831x;
95 	u16 reg = dcdc->base + WM831X_DCDC_ON_CONFIG;
96 	int val;
97 
98 	val = wm831x_reg_read(wm831x, reg);
99 	if (val < 0)
100 		return val;
101 
102 	val = (val & WM831X_DC1_ON_MODE_MASK) >> WM831X_DC1_ON_MODE_SHIFT;
103 
104 	switch (val) {
105 	case WM831X_DCDC_MODE_FAST:
106 		return REGULATOR_MODE_FAST;
107 	case WM831X_DCDC_MODE_NORMAL:
108 		return REGULATOR_MODE_NORMAL;
109 	case WM831X_DCDC_MODE_STANDBY:
110 		return REGULATOR_MODE_STANDBY;
111 	case WM831X_DCDC_MODE_IDLE:
112 		return REGULATOR_MODE_IDLE;
113 	default:
114 		BUG();
115 	}
116 }
117 
118 static int wm831x_dcdc_set_mode_int(struct wm831x *wm831x, int reg,
119 				    unsigned int mode)
120 {
121 	int val;
122 
123 	switch (mode) {
124 	case REGULATOR_MODE_FAST:
125 		val = WM831X_DCDC_MODE_FAST;
126 		break;
127 	case REGULATOR_MODE_NORMAL:
128 		val = WM831X_DCDC_MODE_NORMAL;
129 		break;
130 	case REGULATOR_MODE_STANDBY:
131 		val = WM831X_DCDC_MODE_STANDBY;
132 		break;
133 	case REGULATOR_MODE_IDLE:
134 		val = WM831X_DCDC_MODE_IDLE;
135 		break;
136 	default:
137 		return -EINVAL;
138 	}
139 
140 	return wm831x_set_bits(wm831x, reg, WM831X_DC1_ON_MODE_MASK,
141 			       val << WM831X_DC1_ON_MODE_SHIFT);
142 }
143 
144 static int wm831x_dcdc_set_mode(struct regulator_dev *rdev, unsigned int mode)
145 {
146 	struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
147 	struct wm831x *wm831x = dcdc->wm831x;
148 	u16 reg = dcdc->base + WM831X_DCDC_ON_CONFIG;
149 
150 	return wm831x_dcdc_set_mode_int(wm831x, reg, mode);
151 }
152 
153 static int wm831x_dcdc_set_suspend_mode(struct regulator_dev *rdev,
154 					unsigned int mode)
155 {
156 	struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
157 	struct wm831x *wm831x = dcdc->wm831x;
158 	u16 reg = dcdc->base + WM831X_DCDC_SLEEP_CONTROL;
159 
160 	return wm831x_dcdc_set_mode_int(wm831x, reg, mode);
161 }
162 
163 static int wm831x_dcdc_get_status(struct regulator_dev *rdev)
164 {
165 	struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
166 	struct wm831x *wm831x = dcdc->wm831x;
167 	int ret;
168 
169 	/* First, check for errors */
170 	ret = wm831x_reg_read(wm831x, WM831X_DCDC_UV_STATUS);
171 	if (ret < 0)
172 		return ret;
173 
174 	if (ret & (1 << rdev_get_id(rdev))) {
175 		dev_dbg(wm831x->dev, "DCDC%d under voltage\n",
176 			rdev_get_id(rdev) + 1);
177 		return REGULATOR_STATUS_ERROR;
178 	}
179 
180 	/* DCDC1 and DCDC2 can additionally detect high voltage/current */
181 	if (rdev_get_id(rdev) < 2) {
182 		if (ret & (WM831X_DC1_OV_STS << rdev_get_id(rdev))) {
183 			dev_dbg(wm831x->dev, "DCDC%d over voltage\n",
184 				rdev_get_id(rdev) + 1);
185 			return REGULATOR_STATUS_ERROR;
186 		}
187 
188 		if (ret & (WM831X_DC1_HC_STS << rdev_get_id(rdev))) {
189 			dev_dbg(wm831x->dev, "DCDC%d over current\n",
190 				rdev_get_id(rdev) + 1);
191 			return REGULATOR_STATUS_ERROR;
192 		}
193 	}
194 
195 	/* Is the regulator on? */
196 	ret = wm831x_reg_read(wm831x, WM831X_DCDC_STATUS);
197 	if (ret < 0)
198 		return ret;
199 	if (!(ret & (1 << rdev_get_id(rdev))))
200 		return REGULATOR_STATUS_OFF;
201 
202 	/* TODO: When we handle hardware control modes so we can report the
203 	 * current mode. */
204 	return REGULATOR_STATUS_ON;
205 }
206 
207 static irqreturn_t wm831x_dcdc_uv_irq(int irq, void *data)
208 {
209 	struct wm831x_dcdc *dcdc = data;
210 
211 	regulator_notifier_call_chain(dcdc->regulator,
212 				      REGULATOR_EVENT_UNDER_VOLTAGE,
213 				      NULL);
214 
215 	return IRQ_HANDLED;
216 }
217 
218 static irqreturn_t wm831x_dcdc_oc_irq(int irq, void *data)
219 {
220 	struct wm831x_dcdc *dcdc = data;
221 
222 	regulator_notifier_call_chain(dcdc->regulator,
223 				      REGULATOR_EVENT_OVER_CURRENT,
224 				      NULL);
225 
226 	return IRQ_HANDLED;
227 }
228 
229 /*
230  * BUCKV specifics
231  */
232 
233 static int wm831x_buckv_list_voltage(struct regulator_dev *rdev,
234 				      unsigned selector)
235 {
236 	if (selector <= 0x8)
237 		return 600000;
238 	if (selector <= WM831X_BUCKV_MAX_SELECTOR)
239 		return 600000 + ((selector - 0x8) * 12500);
240 	return -EINVAL;
241 }
242 
243 static int wm831x_buckv_set_voltage_int(struct regulator_dev *rdev, int reg,
244 					 int min_uV, int max_uV)
245 {
246 	struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
247 	struct wm831x *wm831x = dcdc->wm831x;
248 	u16 vsel;
249 
250 	if (min_uV < 600000)
251 		vsel = 0;
252 	else if (min_uV <= 1800000)
253 		vsel = ((min_uV - 600000) / 12500) + 8;
254 	else
255 		return -EINVAL;
256 
257 	if (wm831x_buckv_list_voltage(rdev, vsel) > max_uV)
258 		return -EINVAL;
259 
260 	return wm831x_set_bits(wm831x, reg, WM831X_DC1_ON_VSEL_MASK, vsel);
261 }
262 
263 static int wm831x_buckv_set_voltage(struct regulator_dev *rdev,
264 				     int min_uV, int max_uV)
265 {
266 	struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
267 	u16 reg = dcdc->base + WM831X_DCDC_ON_CONFIG;
268 
269 	return wm831x_buckv_set_voltage_int(rdev, reg, min_uV, max_uV);
270 }
271 
272 static int wm831x_buckv_set_suspend_voltage(struct regulator_dev *rdev,
273 					     int uV)
274 {
275 	struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
276 	u16 reg = dcdc->base + WM831X_DCDC_SLEEP_CONTROL;
277 
278 	return wm831x_buckv_set_voltage_int(rdev, reg, uV, uV);
279 }
280 
281 static int wm831x_buckv_get_voltage(struct regulator_dev *rdev)
282 {
283 	struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
284 	struct wm831x *wm831x = dcdc->wm831x;
285 	u16 reg = dcdc->base + WM831X_DCDC_ON_CONFIG;
286 	int val;
287 
288 	val = wm831x_reg_read(wm831x, reg);
289 	if (val < 0)
290 		return val;
291 
292 	return wm831x_buckv_list_voltage(rdev, val & WM831X_DC1_ON_VSEL_MASK);
293 }
294 
295 /* Current limit options */
296 static u16 wm831x_dcdc_ilim[] = {
297 	125, 250, 375, 500, 625, 750, 875, 1000
298 };
299 
300 static int wm831x_buckv_set_current_limit(struct regulator_dev *rdev,
301 					   int min_uA, int max_uA)
302 {
303 	struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
304 	struct wm831x *wm831x = dcdc->wm831x;
305 	u16 reg = dcdc->base + WM831X_DCDC_CONTROL_2;
306 	int i;
307 
308 	for (i = 0; i < ARRAY_SIZE(wm831x_dcdc_ilim); i++) {
309 		if (max_uA <= wm831x_dcdc_ilim[i])
310 			break;
311 	}
312 	if (i == ARRAY_SIZE(wm831x_dcdc_ilim))
313 		return -EINVAL;
314 
315 	return wm831x_set_bits(wm831x, reg, WM831X_DC1_HC_THR_MASK, i);
316 }
317 
318 static int wm831x_buckv_get_current_limit(struct regulator_dev *rdev)
319 {
320 	struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
321 	struct wm831x *wm831x = dcdc->wm831x;
322 	u16 reg = dcdc->base + WM831X_DCDC_CONTROL_2;
323 	int val;
324 
325 	val = wm831x_reg_read(wm831x, reg);
326 	if (val < 0)
327 		return val;
328 
329 	return wm831x_dcdc_ilim[val & WM831X_DC1_HC_THR_MASK];
330 }
331 
332 static struct regulator_ops wm831x_buckv_ops = {
333 	.set_voltage = wm831x_buckv_set_voltage,
334 	.get_voltage = wm831x_buckv_get_voltage,
335 	.list_voltage = wm831x_buckv_list_voltage,
336 	.set_suspend_voltage = wm831x_buckv_set_suspend_voltage,
337 	.set_current_limit = wm831x_buckv_set_current_limit,
338 	.get_current_limit = wm831x_buckv_get_current_limit,
339 
340 	.is_enabled = wm831x_dcdc_is_enabled,
341 	.enable = wm831x_dcdc_enable,
342 	.disable = wm831x_dcdc_disable,
343 	.get_status = wm831x_dcdc_get_status,
344 	.get_mode = wm831x_dcdc_get_mode,
345 	.set_mode = wm831x_dcdc_set_mode,
346 	.set_suspend_mode = wm831x_dcdc_set_suspend_mode,
347 };
348 
349 static __devinit int wm831x_buckv_probe(struct platform_device *pdev)
350 {
351 	struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
352 	struct wm831x_pdata *pdata = wm831x->dev->platform_data;
353 	int id = pdev->id % ARRAY_SIZE(pdata->dcdc);
354 	struct wm831x_dcdc *dcdc;
355 	struct resource *res;
356 	int ret, irq;
357 
358 	dev_dbg(&pdev->dev, "Probing DCDC%d\n", id + 1);
359 
360 	if (pdata == NULL || pdata->dcdc[id] == NULL)
361 		return -ENODEV;
362 
363 	dcdc = kzalloc(sizeof(struct wm831x_dcdc), GFP_KERNEL);
364 	if (dcdc == NULL) {
365 		dev_err(&pdev->dev, "Unable to allocate private data\n");
366 		return -ENOMEM;
367 	}
368 
369 	dcdc->wm831x = wm831x;
370 
371 	res = platform_get_resource(pdev, IORESOURCE_IO, 0);
372 	if (res == NULL) {
373 		dev_err(&pdev->dev, "No I/O resource\n");
374 		ret = -EINVAL;
375 		goto err;
376 	}
377 	dcdc->base = res->start;
378 
379 	snprintf(dcdc->name, sizeof(dcdc->name), "DCDC%d", id + 1);
380 	dcdc->desc.name = dcdc->name;
381 	dcdc->desc.id = id;
382 	dcdc->desc.type = REGULATOR_VOLTAGE;
383 	dcdc->desc.n_voltages = WM831X_BUCKV_MAX_SELECTOR + 1;
384 	dcdc->desc.ops = &wm831x_buckv_ops;
385 	dcdc->desc.owner = THIS_MODULE;
386 
387 	dcdc->regulator = regulator_register(&dcdc->desc, &pdev->dev,
388 					     pdata->dcdc[id], dcdc);
389 	if (IS_ERR(dcdc->regulator)) {
390 		ret = PTR_ERR(dcdc->regulator);
391 		dev_err(wm831x->dev, "Failed to register DCDC%d: %d\n",
392 			id + 1, ret);
393 		goto err;
394 	}
395 
396 	irq = platform_get_irq_byname(pdev, "UV");
397 	ret = wm831x_request_irq(wm831x, irq, wm831x_dcdc_uv_irq,
398 				 IRQF_TRIGGER_RISING, dcdc->name,
399 				 dcdc);
400 	if (ret != 0) {
401 		dev_err(&pdev->dev, "Failed to request UV IRQ %d: %d\n",
402 			irq, ret);
403 		goto err_regulator;
404 	}
405 
406 	irq = platform_get_irq_byname(pdev, "HC");
407 	ret = wm831x_request_irq(wm831x, irq, wm831x_dcdc_oc_irq,
408 				 IRQF_TRIGGER_RISING, dcdc->name,
409 				 dcdc);
410 	if (ret != 0) {
411 		dev_err(&pdev->dev, "Failed to request HC IRQ %d: %d\n",
412 			irq, ret);
413 		goto err_uv;
414 	}
415 
416 	platform_set_drvdata(pdev, dcdc);
417 
418 	return 0;
419 
420 err_uv:
421 	wm831x_free_irq(wm831x, platform_get_irq_byname(pdev, "UV"), dcdc);
422 err_regulator:
423 	regulator_unregister(dcdc->regulator);
424 err:
425 	kfree(dcdc);
426 	return ret;
427 }
428 
429 static __devexit int wm831x_buckv_remove(struct platform_device *pdev)
430 {
431 	struct wm831x_dcdc *dcdc = platform_get_drvdata(pdev);
432 	struct wm831x *wm831x = dcdc->wm831x;
433 
434 	wm831x_free_irq(wm831x, platform_get_irq_byname(pdev, "HC"), dcdc);
435 	wm831x_free_irq(wm831x, platform_get_irq_byname(pdev, "UV"), dcdc);
436 	regulator_unregister(dcdc->regulator);
437 	kfree(dcdc);
438 
439 	return 0;
440 }
441 
442 static struct platform_driver wm831x_buckv_driver = {
443 	.probe = wm831x_buckv_probe,
444 	.remove = __devexit_p(wm831x_buckv_remove),
445 	.driver		= {
446 		.name	= "wm831x-buckv",
447 	},
448 };
449 
450 /*
451  * BUCKP specifics
452  */
453 
454 static int wm831x_buckp_list_voltage(struct regulator_dev *rdev,
455 				      unsigned selector)
456 {
457 	if (selector <= WM831X_BUCKP_MAX_SELECTOR)
458 		return 850000 + (selector * 25000);
459 	else
460 		return -EINVAL;
461 }
462 
463 static int wm831x_buckp_set_voltage_int(struct regulator_dev *rdev, int reg,
464 					int min_uV, int max_uV)
465 {
466 	struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
467 	struct wm831x *wm831x = dcdc->wm831x;
468 	u16 vsel;
469 
470 	if (min_uV <= 34000000)
471 		vsel = (min_uV - 850000) / 25000;
472 	else
473 		return -EINVAL;
474 
475 	if (wm831x_buckp_list_voltage(rdev, vsel) > max_uV)
476 		return -EINVAL;
477 
478 	return wm831x_set_bits(wm831x, reg, WM831X_DC3_ON_VSEL_MASK, vsel);
479 }
480 
481 static int wm831x_buckp_set_voltage(struct regulator_dev *rdev,
482 				    int min_uV, int max_uV)
483 {
484 	struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
485 	u16 reg = dcdc->base + WM831X_DCDC_ON_CONFIG;
486 
487 	return wm831x_buckp_set_voltage_int(rdev, reg, min_uV, max_uV);
488 }
489 
490 static int wm831x_buckp_set_suspend_voltage(struct regulator_dev *rdev,
491 					    int uV)
492 {
493 	struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
494 	u16 reg = dcdc->base + WM831X_DCDC_SLEEP_CONTROL;
495 
496 	return wm831x_buckp_set_voltage_int(rdev, reg, uV, uV);
497 }
498 
499 static int wm831x_buckp_get_voltage(struct regulator_dev *rdev)
500 {
501 	struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
502 	struct wm831x *wm831x = dcdc->wm831x;
503 	u16 reg = dcdc->base + WM831X_DCDC_ON_CONFIG;
504 	int val;
505 
506 	val = wm831x_reg_read(wm831x, reg);
507 	if (val < 0)
508 		return val;
509 
510 	return wm831x_buckp_list_voltage(rdev, val & WM831X_DC3_ON_VSEL_MASK);
511 }
512 
513 static struct regulator_ops wm831x_buckp_ops = {
514 	.set_voltage = wm831x_buckp_set_voltage,
515 	.get_voltage = wm831x_buckp_get_voltage,
516 	.list_voltage = wm831x_buckp_list_voltage,
517 	.set_suspend_voltage = wm831x_buckp_set_suspend_voltage,
518 
519 	.is_enabled = wm831x_dcdc_is_enabled,
520 	.enable = wm831x_dcdc_enable,
521 	.disable = wm831x_dcdc_disable,
522 	.get_status = wm831x_dcdc_get_status,
523 	.get_mode = wm831x_dcdc_get_mode,
524 	.set_mode = wm831x_dcdc_set_mode,
525 	.set_suspend_mode = wm831x_dcdc_set_suspend_mode,
526 };
527 
528 static __devinit int wm831x_buckp_probe(struct platform_device *pdev)
529 {
530 	struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
531 	struct wm831x_pdata *pdata = wm831x->dev->platform_data;
532 	int id = pdev->id % ARRAY_SIZE(pdata->dcdc);
533 	struct wm831x_dcdc *dcdc;
534 	struct resource *res;
535 	int ret, irq;
536 
537 	dev_dbg(&pdev->dev, "Probing DCDC%d\n", id + 1);
538 
539 	if (pdata == NULL || pdata->dcdc[id] == NULL)
540 		return -ENODEV;
541 
542 	dcdc = kzalloc(sizeof(struct wm831x_dcdc), GFP_KERNEL);
543 	if (dcdc == NULL) {
544 		dev_err(&pdev->dev, "Unable to allocate private data\n");
545 		return -ENOMEM;
546 	}
547 
548 	dcdc->wm831x = wm831x;
549 
550 	res = platform_get_resource(pdev, IORESOURCE_IO, 0);
551 	if (res == NULL) {
552 		dev_err(&pdev->dev, "No I/O resource\n");
553 		ret = -EINVAL;
554 		goto err;
555 	}
556 	dcdc->base = res->start;
557 
558 	snprintf(dcdc->name, sizeof(dcdc->name), "DCDC%d", id + 1);
559 	dcdc->desc.name = dcdc->name;
560 	dcdc->desc.id = id;
561 	dcdc->desc.type = REGULATOR_VOLTAGE;
562 	dcdc->desc.n_voltages = WM831X_BUCKP_MAX_SELECTOR + 1;
563 	dcdc->desc.ops = &wm831x_buckp_ops;
564 	dcdc->desc.owner = THIS_MODULE;
565 
566 	dcdc->regulator = regulator_register(&dcdc->desc, &pdev->dev,
567 					     pdata->dcdc[id], dcdc);
568 	if (IS_ERR(dcdc->regulator)) {
569 		ret = PTR_ERR(dcdc->regulator);
570 		dev_err(wm831x->dev, "Failed to register DCDC%d: %d\n",
571 			id + 1, ret);
572 		goto err;
573 	}
574 
575 	irq = platform_get_irq_byname(pdev, "UV");
576 	ret = wm831x_request_irq(wm831x, irq, wm831x_dcdc_uv_irq,
577 				 IRQF_TRIGGER_RISING, dcdc->name,
578 				 dcdc);
579 	if (ret != 0) {
580 		dev_err(&pdev->dev, "Failed to request UV IRQ %d: %d\n",
581 			irq, ret);
582 		goto err_regulator;
583 	}
584 
585 	platform_set_drvdata(pdev, dcdc);
586 
587 	return 0;
588 
589 err_regulator:
590 	regulator_unregister(dcdc->regulator);
591 err:
592 	kfree(dcdc);
593 	return ret;
594 }
595 
596 static __devexit int wm831x_buckp_remove(struct platform_device *pdev)
597 {
598 	struct wm831x_dcdc *dcdc = platform_get_drvdata(pdev);
599 	struct wm831x *wm831x = dcdc->wm831x;
600 
601 	wm831x_free_irq(wm831x, platform_get_irq_byname(pdev, "UV"), dcdc);
602 	regulator_unregister(dcdc->regulator);
603 	kfree(dcdc);
604 
605 	return 0;
606 }
607 
608 static struct platform_driver wm831x_buckp_driver = {
609 	.probe = wm831x_buckp_probe,
610 	.remove = __devexit_p(wm831x_buckp_remove),
611 	.driver		= {
612 		.name	= "wm831x-buckp",
613 	},
614 };
615 
616 /*
617  * DCDC boost convertors
618  */
619 
620 static int wm831x_boostp_get_status(struct regulator_dev *rdev)
621 {
622 	struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
623 	struct wm831x *wm831x = dcdc->wm831x;
624 	int ret;
625 
626 	/* First, check for errors */
627 	ret = wm831x_reg_read(wm831x, WM831X_DCDC_UV_STATUS);
628 	if (ret < 0)
629 		return ret;
630 
631 	if (ret & (1 << rdev_get_id(rdev))) {
632 		dev_dbg(wm831x->dev, "DCDC%d under voltage\n",
633 			rdev_get_id(rdev) + 1);
634 		return REGULATOR_STATUS_ERROR;
635 	}
636 
637 	/* Is the regulator on? */
638 	ret = wm831x_reg_read(wm831x, WM831X_DCDC_STATUS);
639 	if (ret < 0)
640 		return ret;
641 	if (ret & (1 << rdev_get_id(rdev)))
642 		return REGULATOR_STATUS_ON;
643 	else
644 		return REGULATOR_STATUS_OFF;
645 }
646 
647 static struct regulator_ops wm831x_boostp_ops = {
648 	.get_status = wm831x_boostp_get_status,
649 
650 	.is_enabled = wm831x_dcdc_is_enabled,
651 	.enable = wm831x_dcdc_enable,
652 	.disable = wm831x_dcdc_disable,
653 };
654 
655 static __devinit int wm831x_boostp_probe(struct platform_device *pdev)
656 {
657 	struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
658 	struct wm831x_pdata *pdata = wm831x->dev->platform_data;
659 	int id = pdev->id % ARRAY_SIZE(pdata->dcdc);
660 	struct wm831x_dcdc *dcdc;
661 	struct resource *res;
662 	int ret, irq;
663 
664 	dev_dbg(&pdev->dev, "Probing DCDC%d\n", id + 1);
665 
666 	if (pdata == NULL || pdata->dcdc[id] == NULL)
667 		return -ENODEV;
668 
669 	dcdc = kzalloc(sizeof(struct wm831x_dcdc), GFP_KERNEL);
670 	if (dcdc == NULL) {
671 		dev_err(&pdev->dev, "Unable to allocate private data\n");
672 		return -ENOMEM;
673 	}
674 
675 	dcdc->wm831x = wm831x;
676 
677 	res = platform_get_resource(pdev, IORESOURCE_IO, 0);
678 	if (res == NULL) {
679 		dev_err(&pdev->dev, "No I/O resource\n");
680 		ret = -EINVAL;
681 		goto err;
682 	}
683 	dcdc->base = res->start;
684 
685 	snprintf(dcdc->name, sizeof(dcdc->name), "DCDC%d", id + 1);
686 	dcdc->desc.name = dcdc->name;
687 	dcdc->desc.id = id;
688 	dcdc->desc.type = REGULATOR_VOLTAGE;
689 	dcdc->desc.ops = &wm831x_boostp_ops;
690 	dcdc->desc.owner = THIS_MODULE;
691 
692 	dcdc->regulator = regulator_register(&dcdc->desc, &pdev->dev,
693 					     pdata->dcdc[id], dcdc);
694 	if (IS_ERR(dcdc->regulator)) {
695 		ret = PTR_ERR(dcdc->regulator);
696 		dev_err(wm831x->dev, "Failed to register DCDC%d: %d\n",
697 			id + 1, ret);
698 		goto err;
699 	}
700 
701 	irq = platform_get_irq_byname(pdev, "UV");
702 	ret = wm831x_request_irq(wm831x, irq, wm831x_dcdc_uv_irq,
703 				 IRQF_TRIGGER_RISING, dcdc->name,
704 				 dcdc);
705 	if (ret != 0) {
706 		dev_err(&pdev->dev, "Failed to request UV IRQ %d: %d\n",
707 			irq, ret);
708 		goto err_regulator;
709 	}
710 
711 	platform_set_drvdata(pdev, dcdc);
712 
713 	return 0;
714 
715 err_regulator:
716 	regulator_unregister(dcdc->regulator);
717 err:
718 	kfree(dcdc);
719 	return ret;
720 }
721 
722 static __devexit int wm831x_boostp_remove(struct platform_device *pdev)
723 {
724 	struct wm831x_dcdc *dcdc = platform_get_drvdata(pdev);
725 	struct wm831x *wm831x = dcdc->wm831x;
726 
727 	wm831x_free_irq(wm831x, platform_get_irq_byname(pdev, "UV"), dcdc);
728 	regulator_unregister(dcdc->regulator);
729 	kfree(dcdc);
730 
731 	return 0;
732 }
733 
734 static struct platform_driver wm831x_boostp_driver = {
735 	.probe = wm831x_boostp_probe,
736 	.remove = __devexit_p(wm831x_boostp_remove),
737 	.driver		= {
738 		.name	= "wm831x-boostp",
739 	},
740 };
741 
742 /*
743  * External Power Enable
744  *
745  * These aren't actually DCDCs but look like them in hardware so share
746  * code.
747  */
748 
749 #define WM831X_EPE_BASE 6
750 
751 static struct regulator_ops wm831x_epe_ops = {
752 	.is_enabled = wm831x_dcdc_is_enabled,
753 	.enable = wm831x_dcdc_enable,
754 	.disable = wm831x_dcdc_disable,
755 	.get_status = wm831x_dcdc_get_status,
756 };
757 
758 static __devinit int wm831x_epe_probe(struct platform_device *pdev)
759 {
760 	struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
761 	struct wm831x_pdata *pdata = wm831x->dev->platform_data;
762 	int id = pdev->id % ARRAY_SIZE(pdata->epe);
763 	struct wm831x_dcdc *dcdc;
764 	int ret;
765 
766 	dev_dbg(&pdev->dev, "Probing EPE%d\n", id + 1);
767 
768 	if (pdata == NULL || pdata->epe[id] == NULL)
769 		return -ENODEV;
770 
771 	dcdc = kzalloc(sizeof(struct wm831x_dcdc), GFP_KERNEL);
772 	if (dcdc == NULL) {
773 		dev_err(&pdev->dev, "Unable to allocate private data\n");
774 		return -ENOMEM;
775 	}
776 
777 	dcdc->wm831x = wm831x;
778 
779 	/* For current parts this is correct; probably need to revisit
780 	 * in future.
781 	 */
782 	snprintf(dcdc->name, sizeof(dcdc->name), "EPE%d", id + 1);
783 	dcdc->desc.name = dcdc->name;
784 	dcdc->desc.id = id + WM831X_EPE_BASE; /* Offset in DCDC registers */
785 	dcdc->desc.ops = &wm831x_epe_ops;
786 	dcdc->desc.type = REGULATOR_VOLTAGE;
787 	dcdc->desc.owner = THIS_MODULE;
788 
789 	dcdc->regulator = regulator_register(&dcdc->desc, &pdev->dev,
790 					     pdata->epe[id], dcdc);
791 	if (IS_ERR(dcdc->regulator)) {
792 		ret = PTR_ERR(dcdc->regulator);
793 		dev_err(wm831x->dev, "Failed to register EPE%d: %d\n",
794 			id + 1, ret);
795 		goto err;
796 	}
797 
798 	platform_set_drvdata(pdev, dcdc);
799 
800 	return 0;
801 
802 err:
803 	kfree(dcdc);
804 	return ret;
805 }
806 
807 static __devexit int wm831x_epe_remove(struct platform_device *pdev)
808 {
809 	struct wm831x_dcdc *dcdc = platform_get_drvdata(pdev);
810 
811 	regulator_unregister(dcdc->regulator);
812 	kfree(dcdc);
813 
814 	return 0;
815 }
816 
817 static struct platform_driver wm831x_epe_driver = {
818 	.probe = wm831x_epe_probe,
819 	.remove = __devexit_p(wm831x_epe_remove),
820 	.driver		= {
821 		.name	= "wm831x-epe",
822 	},
823 };
824 
825 static int __init wm831x_dcdc_init(void)
826 {
827 	int ret;
828 	ret = platform_driver_register(&wm831x_buckv_driver);
829 	if (ret != 0)
830 		pr_err("Failed to register WM831x BUCKV driver: %d\n", ret);
831 
832 	ret = platform_driver_register(&wm831x_buckp_driver);
833 	if (ret != 0)
834 		pr_err("Failed to register WM831x BUCKP driver: %d\n", ret);
835 
836 	ret = platform_driver_register(&wm831x_boostp_driver);
837 	if (ret != 0)
838 		pr_err("Failed to register WM831x BOOST driver: %d\n", ret);
839 
840 	ret = platform_driver_register(&wm831x_epe_driver);
841 	if (ret != 0)
842 		pr_err("Failed to register WM831x EPE driver: %d\n", ret);
843 
844 	return 0;
845 }
846 subsys_initcall(wm831x_dcdc_init);
847 
848 static void __exit wm831x_dcdc_exit(void)
849 {
850 	platform_driver_unregister(&wm831x_epe_driver);
851 	platform_driver_unregister(&wm831x_boostp_driver);
852 	platform_driver_unregister(&wm831x_buckp_driver);
853 	platform_driver_unregister(&wm831x_buckv_driver);
854 }
855 module_exit(wm831x_dcdc_exit);
856 
857 /* Module information */
858 MODULE_AUTHOR("Mark Brown");
859 MODULE_DESCRIPTION("WM831x DC-DC convertor driver");
860 MODULE_LICENSE("GPL");
861 MODULE_ALIAS("platform:wm831x-buckv");
862 MODULE_ALIAS("platform:wm831x-buckp");
863