xref: /linux/drivers/regulator/wm831x-dcdc.c (revision d7be0ce6afb1df60bc786f57410407ceae92b994)
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 #include <linux/regulator/machine.h>
23 #include <linux/gpio.h>
24 #include <linux/slab.h>
25 
26 #include <linux/mfd/wm831x/core.h>
27 #include <linux/mfd/wm831x/regulator.h>
28 #include <linux/mfd/wm831x/pdata.h>
29 
30 #define WM831X_BUCKV_MAX_SELECTOR 0x68
31 #define WM831X_BUCKP_MAX_SELECTOR 0x66
32 
33 #define WM831X_DCDC_MODE_FAST    0
34 #define WM831X_DCDC_MODE_NORMAL  1
35 #define WM831X_DCDC_MODE_IDLE    2
36 #define WM831X_DCDC_MODE_STANDBY 3
37 
38 #define WM831X_DCDC_MAX_NAME 6
39 
40 /* Register offsets in control block */
41 #define WM831X_DCDC_CONTROL_1     0
42 #define WM831X_DCDC_CONTROL_2     1
43 #define WM831X_DCDC_ON_CONFIG     2
44 #define WM831X_DCDC_SLEEP_CONTROL 3
45 #define WM831X_DCDC_DVS_CONTROL   4
46 
47 /*
48  * Shared
49  */
50 
51 struct wm831x_dcdc {
52 	char name[WM831X_DCDC_MAX_NAME];
53 	struct regulator_desc desc;
54 	int base;
55 	struct wm831x *wm831x;
56 	struct regulator_dev *regulator;
57 	int dvs_gpio;
58 	int dvs_gpio_state;
59 	int on_vsel;
60 	int dvs_vsel;
61 };
62 
63 static int wm831x_dcdc_is_enabled(struct regulator_dev *rdev)
64 {
65 	struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
66 	struct wm831x *wm831x = dcdc->wm831x;
67 	int mask = 1 << rdev_get_id(rdev);
68 	int reg;
69 
70 	reg = wm831x_reg_read(wm831x, WM831X_DCDC_ENABLE);
71 	if (reg < 0)
72 		return reg;
73 
74 	if (reg & mask)
75 		return 1;
76 	else
77 		return 0;
78 }
79 
80 static int wm831x_dcdc_enable(struct regulator_dev *rdev)
81 {
82 	struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
83 	struct wm831x *wm831x = dcdc->wm831x;
84 	int mask = 1 << rdev_get_id(rdev);
85 
86 	return wm831x_set_bits(wm831x, WM831X_DCDC_ENABLE, mask, mask);
87 }
88 
89 static int wm831x_dcdc_disable(struct regulator_dev *rdev)
90 {
91 	struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
92 	struct wm831x *wm831x = dcdc->wm831x;
93 	int mask = 1 << rdev_get_id(rdev);
94 
95 	return wm831x_set_bits(wm831x, WM831X_DCDC_ENABLE, mask, 0);
96 }
97 
98 static unsigned int wm831x_dcdc_get_mode(struct regulator_dev *rdev)
99 
100 {
101 	struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
102 	struct wm831x *wm831x = dcdc->wm831x;
103 	u16 reg = dcdc->base + WM831X_DCDC_ON_CONFIG;
104 	int val;
105 
106 	val = wm831x_reg_read(wm831x, reg);
107 	if (val < 0)
108 		return val;
109 
110 	val = (val & WM831X_DC1_ON_MODE_MASK) >> WM831X_DC1_ON_MODE_SHIFT;
111 
112 	switch (val) {
113 	case WM831X_DCDC_MODE_FAST:
114 		return REGULATOR_MODE_FAST;
115 	case WM831X_DCDC_MODE_NORMAL:
116 		return REGULATOR_MODE_NORMAL;
117 	case WM831X_DCDC_MODE_STANDBY:
118 		return REGULATOR_MODE_STANDBY;
119 	case WM831X_DCDC_MODE_IDLE:
120 		return REGULATOR_MODE_IDLE;
121 	default:
122 		BUG();
123 	}
124 }
125 
126 static int wm831x_dcdc_set_mode_int(struct wm831x *wm831x, int reg,
127 				    unsigned int mode)
128 {
129 	int val;
130 
131 	switch (mode) {
132 	case REGULATOR_MODE_FAST:
133 		val = WM831X_DCDC_MODE_FAST;
134 		break;
135 	case REGULATOR_MODE_NORMAL:
136 		val = WM831X_DCDC_MODE_NORMAL;
137 		break;
138 	case REGULATOR_MODE_STANDBY:
139 		val = WM831X_DCDC_MODE_STANDBY;
140 		break;
141 	case REGULATOR_MODE_IDLE:
142 		val = WM831X_DCDC_MODE_IDLE;
143 		break;
144 	default:
145 		return -EINVAL;
146 	}
147 
148 	return wm831x_set_bits(wm831x, reg, WM831X_DC1_ON_MODE_MASK,
149 			       val << WM831X_DC1_ON_MODE_SHIFT);
150 }
151 
152 static int wm831x_dcdc_set_mode(struct regulator_dev *rdev, unsigned int mode)
153 {
154 	struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
155 	struct wm831x *wm831x = dcdc->wm831x;
156 	u16 reg = dcdc->base + WM831X_DCDC_ON_CONFIG;
157 
158 	return wm831x_dcdc_set_mode_int(wm831x, reg, mode);
159 }
160 
161 static int wm831x_dcdc_set_suspend_mode(struct regulator_dev *rdev,
162 					unsigned int mode)
163 {
164 	struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
165 	struct wm831x *wm831x = dcdc->wm831x;
166 	u16 reg = dcdc->base + WM831X_DCDC_SLEEP_CONTROL;
167 
168 	return wm831x_dcdc_set_mode_int(wm831x, reg, mode);
169 }
170 
171 static int wm831x_dcdc_get_status(struct regulator_dev *rdev)
172 {
173 	struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
174 	struct wm831x *wm831x = dcdc->wm831x;
175 	int ret;
176 
177 	/* First, check for errors */
178 	ret = wm831x_reg_read(wm831x, WM831X_DCDC_UV_STATUS);
179 	if (ret < 0)
180 		return ret;
181 
182 	if (ret & (1 << rdev_get_id(rdev))) {
183 		dev_dbg(wm831x->dev, "DCDC%d under voltage\n",
184 			rdev_get_id(rdev) + 1);
185 		return REGULATOR_STATUS_ERROR;
186 	}
187 
188 	/* DCDC1 and DCDC2 can additionally detect high voltage/current */
189 	if (rdev_get_id(rdev) < 2) {
190 		if (ret & (WM831X_DC1_OV_STS << rdev_get_id(rdev))) {
191 			dev_dbg(wm831x->dev, "DCDC%d over voltage\n",
192 				rdev_get_id(rdev) + 1);
193 			return REGULATOR_STATUS_ERROR;
194 		}
195 
196 		if (ret & (WM831X_DC1_HC_STS << rdev_get_id(rdev))) {
197 			dev_dbg(wm831x->dev, "DCDC%d over current\n",
198 				rdev_get_id(rdev) + 1);
199 			return REGULATOR_STATUS_ERROR;
200 		}
201 	}
202 
203 	/* Is the regulator on? */
204 	ret = wm831x_reg_read(wm831x, WM831X_DCDC_STATUS);
205 	if (ret < 0)
206 		return ret;
207 	if (!(ret & (1 << rdev_get_id(rdev))))
208 		return REGULATOR_STATUS_OFF;
209 
210 	/* TODO: When we handle hardware control modes so we can report the
211 	 * current mode. */
212 	return REGULATOR_STATUS_ON;
213 }
214 
215 static irqreturn_t wm831x_dcdc_uv_irq(int irq, void *data)
216 {
217 	struct wm831x_dcdc *dcdc = data;
218 
219 	regulator_notifier_call_chain(dcdc->regulator,
220 				      REGULATOR_EVENT_UNDER_VOLTAGE,
221 				      NULL);
222 
223 	return IRQ_HANDLED;
224 }
225 
226 static irqreturn_t wm831x_dcdc_oc_irq(int irq, void *data)
227 {
228 	struct wm831x_dcdc *dcdc = data;
229 
230 	regulator_notifier_call_chain(dcdc->regulator,
231 				      REGULATOR_EVENT_OVER_CURRENT,
232 				      NULL);
233 
234 	return IRQ_HANDLED;
235 }
236 
237 /*
238  * BUCKV specifics
239  */
240 
241 static int wm831x_buckv_list_voltage(struct regulator_dev *rdev,
242 				      unsigned selector)
243 {
244 	if (selector <= 0x8)
245 		return 600000;
246 	if (selector <= WM831X_BUCKV_MAX_SELECTOR)
247 		return 600000 + ((selector - 0x8) * 12500);
248 	return -EINVAL;
249 }
250 
251 static int wm831x_buckv_select_min_voltage(struct regulator_dev *rdev,
252 					   int min_uV, int max_uV)
253 {
254 	u16 vsel;
255 
256 	if (min_uV < 600000)
257 		vsel = 0;
258 	else if (min_uV <= 1800000)
259 		vsel = ((min_uV - 600000) / 12500) + 8;
260 	else
261 		return -EINVAL;
262 
263 	if (wm831x_buckv_list_voltage(rdev, vsel) > max_uV)
264 		return -EINVAL;
265 
266 	return vsel;
267 }
268 
269 static int wm831x_buckv_select_max_voltage(struct regulator_dev *rdev,
270 					   int min_uV, int max_uV)
271 {
272 	u16 vsel;
273 
274 	if (max_uV < 600000 || max_uV > 1800000)
275 		return -EINVAL;
276 
277 	vsel = ((max_uV - 600000) / 12500) + 8;
278 
279 	if (wm831x_buckv_list_voltage(rdev, vsel) < min_uV ||
280 	    wm831x_buckv_list_voltage(rdev, vsel) < max_uV)
281 		return -EINVAL;
282 
283 	return vsel;
284 }
285 
286 static int wm831x_buckv_set_dvs(struct regulator_dev *rdev, int state)
287 {
288 	struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
289 
290 	if (state == dcdc->dvs_gpio_state)
291 		return 0;
292 
293 	dcdc->dvs_gpio_state = state;
294 	gpio_set_value(dcdc->dvs_gpio, state);
295 
296 	/* Should wait for DVS state change to be asserted if we have
297 	 * a GPIO for it, for now assume the device is configured
298 	 * for the fastest possible transition.
299 	 */
300 
301 	return 0;
302 }
303 
304 static int wm831x_buckv_set_voltage(struct regulator_dev *rdev,
305 				    int min_uV, int max_uV)
306 {
307 	struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
308 	struct wm831x *wm831x = dcdc->wm831x;
309 	int on_reg = dcdc->base + WM831X_DCDC_ON_CONFIG;
310 	int dvs_reg = dcdc->base + WM831X_DCDC_DVS_CONTROL;
311 	int vsel, ret;
312 
313 	vsel = wm831x_buckv_select_min_voltage(rdev, min_uV, max_uV);
314 	if (vsel < 0)
315 		return vsel;
316 
317 	/* If this value is already set then do a GPIO update if we can */
318 	if (dcdc->dvs_gpio && dcdc->on_vsel == vsel)
319 		return wm831x_buckv_set_dvs(rdev, 0);
320 
321 	if (dcdc->dvs_gpio && dcdc->dvs_vsel == vsel)
322 		return wm831x_buckv_set_dvs(rdev, 1);
323 
324 	/* Always set the ON status to the minimum voltage */
325 	ret = wm831x_set_bits(wm831x, on_reg, WM831X_DC1_ON_VSEL_MASK, vsel);
326 	if (ret < 0)
327 		return ret;
328 	dcdc->on_vsel = vsel;
329 
330 	if (!dcdc->dvs_gpio)
331 		return ret;
332 
333 	/* Kick the voltage transition now */
334 	ret = wm831x_buckv_set_dvs(rdev, 0);
335 	if (ret < 0)
336 		return ret;
337 
338 	/* Set the high voltage as the DVS voltage.  This is optimised
339 	 * for CPUfreq usage, most processors will keep the maximum
340 	 * voltage constant and lower the minimum with the frequency. */
341 	vsel = wm831x_buckv_select_max_voltage(rdev, min_uV, max_uV);
342 	if (vsel < 0) {
343 		/* This should never happen - at worst the same vsel
344 		 * should be chosen */
345 		WARN_ON(vsel < 0);
346 		return 0;
347 	}
348 
349 	/* Don't bother if it's the same VSEL we're already using */
350 	if (vsel == dcdc->on_vsel)
351 		return 0;
352 
353 	ret = wm831x_set_bits(wm831x, dvs_reg, WM831X_DC1_DVS_VSEL_MASK, vsel);
354 	if (ret == 0)
355 		dcdc->dvs_vsel = vsel;
356 	else
357 		dev_warn(wm831x->dev, "Failed to set DCDC DVS VSEL: %d\n",
358 			 ret);
359 
360 	return 0;
361 }
362 
363 static int wm831x_buckv_set_suspend_voltage(struct regulator_dev *rdev,
364 					    int uV)
365 {
366 	struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
367 	struct wm831x *wm831x = dcdc->wm831x;
368 	u16 reg = dcdc->base + WM831X_DCDC_SLEEP_CONTROL;
369 	int vsel;
370 
371 	vsel = wm831x_buckv_select_min_voltage(rdev, uV, uV);
372 	if (vsel < 0)
373 		return vsel;
374 
375 	return wm831x_set_bits(wm831x, reg, WM831X_DC1_SLP_VSEL_MASK, vsel);
376 }
377 
378 static int wm831x_buckv_get_voltage(struct regulator_dev *rdev)
379 {
380 	struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
381 
382 	if (dcdc->dvs_gpio && dcdc->dvs_gpio_state)
383 		return wm831x_buckv_list_voltage(rdev, dcdc->dvs_vsel);
384 	else
385 		return wm831x_buckv_list_voltage(rdev, dcdc->on_vsel);
386 }
387 
388 /* Current limit options */
389 static u16 wm831x_dcdc_ilim[] = {
390 	125, 250, 375, 500, 625, 750, 875, 1000
391 };
392 
393 static int wm831x_buckv_set_current_limit(struct regulator_dev *rdev,
394 					   int min_uA, int max_uA)
395 {
396 	struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
397 	struct wm831x *wm831x = dcdc->wm831x;
398 	u16 reg = dcdc->base + WM831X_DCDC_CONTROL_2;
399 	int i;
400 
401 	for (i = 0; i < ARRAY_SIZE(wm831x_dcdc_ilim); i++) {
402 		if (max_uA <= wm831x_dcdc_ilim[i])
403 			break;
404 	}
405 	if (i == ARRAY_SIZE(wm831x_dcdc_ilim))
406 		return -EINVAL;
407 
408 	return wm831x_set_bits(wm831x, reg, WM831X_DC1_HC_THR_MASK, i);
409 }
410 
411 static int wm831x_buckv_get_current_limit(struct regulator_dev *rdev)
412 {
413 	struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
414 	struct wm831x *wm831x = dcdc->wm831x;
415 	u16 reg = dcdc->base + WM831X_DCDC_CONTROL_2;
416 	int val;
417 
418 	val = wm831x_reg_read(wm831x, reg);
419 	if (val < 0)
420 		return val;
421 
422 	return wm831x_dcdc_ilim[val & WM831X_DC1_HC_THR_MASK];
423 }
424 
425 static struct regulator_ops wm831x_buckv_ops = {
426 	.set_voltage = wm831x_buckv_set_voltage,
427 	.get_voltage = wm831x_buckv_get_voltage,
428 	.list_voltage = wm831x_buckv_list_voltage,
429 	.set_suspend_voltage = wm831x_buckv_set_suspend_voltage,
430 	.set_current_limit = wm831x_buckv_set_current_limit,
431 	.get_current_limit = wm831x_buckv_get_current_limit,
432 
433 	.is_enabled = wm831x_dcdc_is_enabled,
434 	.enable = wm831x_dcdc_enable,
435 	.disable = wm831x_dcdc_disable,
436 	.get_status = wm831x_dcdc_get_status,
437 	.get_mode = wm831x_dcdc_get_mode,
438 	.set_mode = wm831x_dcdc_set_mode,
439 	.set_suspend_mode = wm831x_dcdc_set_suspend_mode,
440 };
441 
442 /*
443  * Set up DVS control.  We just log errors since we can still run
444  * (with reduced performance) if we fail.
445  */
446 static __devinit void wm831x_buckv_dvs_init(struct wm831x_dcdc *dcdc,
447 					    struct wm831x_buckv_pdata *pdata)
448 {
449 	struct wm831x *wm831x = dcdc->wm831x;
450 	int ret;
451 	u16 ctrl;
452 
453 	if (!pdata || !pdata->dvs_gpio)
454 		return;
455 
456 	switch (pdata->dvs_control_src) {
457 	case 1:
458 		ctrl = 2 << WM831X_DC1_DVS_SRC_SHIFT;
459 		break;
460 	case 2:
461 		ctrl = 3 << WM831X_DC1_DVS_SRC_SHIFT;
462 		break;
463 	default:
464 		dev_err(wm831x->dev, "Invalid DVS control source %d for %s\n",
465 			pdata->dvs_control_src, dcdc->name);
466 		return;
467 	}
468 
469 	ret = wm831x_set_bits(wm831x, dcdc->base + WM831X_DCDC_DVS_CONTROL,
470 			      WM831X_DC1_DVS_SRC_MASK, ctrl);
471 	if (ret < 0) {
472 		dev_err(wm831x->dev, "Failed to set %s DVS source: %d\n",
473 			dcdc->name, ret);
474 		return;
475 	}
476 
477 	ret = gpio_request(pdata->dvs_gpio, "DCDC DVS");
478 	if (ret < 0) {
479 		dev_err(wm831x->dev, "Failed to get %s DVS GPIO: %d\n",
480 			dcdc->name, ret);
481 		return;
482 	}
483 
484 	/* gpiolib won't let us read the GPIO status so pick the higher
485 	 * of the two existing voltages so we take it as platform data.
486 	 */
487 	dcdc->dvs_gpio_state = pdata->dvs_init_state;
488 
489 	ret = gpio_direction_output(pdata->dvs_gpio, dcdc->dvs_gpio_state);
490 	if (ret < 0) {
491 		dev_err(wm831x->dev, "Failed to enable %s DVS GPIO: %d\n",
492 			dcdc->name, ret);
493 		gpio_free(pdata->dvs_gpio);
494 		return;
495 	}
496 
497 	dcdc->dvs_gpio = pdata->dvs_gpio;
498 }
499 
500 static __devinit int wm831x_buckv_probe(struct platform_device *pdev)
501 {
502 	struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
503 	struct wm831x_pdata *pdata = wm831x->dev->platform_data;
504 	int id = pdev->id % ARRAY_SIZE(pdata->dcdc);
505 	struct wm831x_dcdc *dcdc;
506 	struct resource *res;
507 	int ret, irq;
508 
509 	dev_dbg(&pdev->dev, "Probing DCDC%d\n", id + 1);
510 
511 	if (pdata == NULL || pdata->dcdc[id] == NULL)
512 		return -ENODEV;
513 
514 	dcdc = kzalloc(sizeof(struct wm831x_dcdc), GFP_KERNEL);
515 	if (dcdc == NULL) {
516 		dev_err(&pdev->dev, "Unable to allocate private data\n");
517 		return -ENOMEM;
518 	}
519 
520 	dcdc->wm831x = wm831x;
521 
522 	res = platform_get_resource(pdev, IORESOURCE_IO, 0);
523 	if (res == NULL) {
524 		dev_err(&pdev->dev, "No I/O resource\n");
525 		ret = -EINVAL;
526 		goto err;
527 	}
528 	dcdc->base = res->start;
529 
530 	snprintf(dcdc->name, sizeof(dcdc->name), "DCDC%d", id + 1);
531 	dcdc->desc.name = dcdc->name;
532 	dcdc->desc.id = id;
533 	dcdc->desc.type = REGULATOR_VOLTAGE;
534 	dcdc->desc.n_voltages = WM831X_BUCKV_MAX_SELECTOR + 1;
535 	dcdc->desc.ops = &wm831x_buckv_ops;
536 	dcdc->desc.owner = THIS_MODULE;
537 
538 	ret = wm831x_reg_read(wm831x, dcdc->base + WM831X_DCDC_ON_CONFIG);
539 	if (ret < 0) {
540 		dev_err(wm831x->dev, "Failed to read ON VSEL: %d\n", ret);
541 		goto err;
542 	}
543 	dcdc->on_vsel = ret & WM831X_DC1_ON_VSEL_MASK;
544 
545 	ret = wm831x_reg_read(wm831x, dcdc->base + WM831X_DCDC_ON_CONFIG);
546 	if (ret < 0) {
547 		dev_err(wm831x->dev, "Failed to read DVS VSEL: %d\n", ret);
548 		goto err;
549 	}
550 	dcdc->dvs_vsel = ret & WM831X_DC1_DVS_VSEL_MASK;
551 
552 	if (pdata->dcdc[id])
553 		wm831x_buckv_dvs_init(dcdc, pdata->dcdc[id]->driver_data);
554 
555 	dcdc->regulator = regulator_register(&dcdc->desc, &pdev->dev,
556 					     pdata->dcdc[id], dcdc);
557 	if (IS_ERR(dcdc->regulator)) {
558 		ret = PTR_ERR(dcdc->regulator);
559 		dev_err(wm831x->dev, "Failed to register DCDC%d: %d\n",
560 			id + 1, ret);
561 		goto err;
562 	}
563 
564 	irq = platform_get_irq_byname(pdev, "UV");
565 	ret = wm831x_request_irq(wm831x, irq, wm831x_dcdc_uv_irq,
566 				 IRQF_TRIGGER_RISING, dcdc->name,
567 				 dcdc);
568 	if (ret != 0) {
569 		dev_err(&pdev->dev, "Failed to request UV IRQ %d: %d\n",
570 			irq, ret);
571 		goto err_regulator;
572 	}
573 
574 	irq = platform_get_irq_byname(pdev, "HC");
575 	ret = wm831x_request_irq(wm831x, irq, wm831x_dcdc_oc_irq,
576 				 IRQF_TRIGGER_RISING, dcdc->name,
577 				 dcdc);
578 	if (ret != 0) {
579 		dev_err(&pdev->dev, "Failed to request HC IRQ %d: %d\n",
580 			irq, ret);
581 		goto err_uv;
582 	}
583 
584 	platform_set_drvdata(pdev, dcdc);
585 
586 	return 0;
587 
588 err_uv:
589 	wm831x_free_irq(wm831x, platform_get_irq_byname(pdev, "UV"), dcdc);
590 err_regulator:
591 	regulator_unregister(dcdc->regulator);
592 err:
593 	if (dcdc->dvs_gpio)
594 		gpio_free(dcdc->dvs_gpio);
595 	kfree(dcdc);
596 	return ret;
597 }
598 
599 static __devexit int wm831x_buckv_remove(struct platform_device *pdev)
600 {
601 	struct wm831x_dcdc *dcdc = platform_get_drvdata(pdev);
602 	struct wm831x *wm831x = dcdc->wm831x;
603 
604 	platform_set_drvdata(pdev, NULL);
605 
606 	wm831x_free_irq(wm831x, platform_get_irq_byname(pdev, "HC"), dcdc);
607 	wm831x_free_irq(wm831x, platform_get_irq_byname(pdev, "UV"), dcdc);
608 	regulator_unregister(dcdc->regulator);
609 	if (dcdc->dvs_gpio)
610 		gpio_free(dcdc->dvs_gpio);
611 	kfree(dcdc);
612 
613 	return 0;
614 }
615 
616 static struct platform_driver wm831x_buckv_driver = {
617 	.probe = wm831x_buckv_probe,
618 	.remove = __devexit_p(wm831x_buckv_remove),
619 	.driver		= {
620 		.name	= "wm831x-buckv",
621 		.owner	= THIS_MODULE,
622 	},
623 };
624 
625 /*
626  * BUCKP specifics
627  */
628 
629 static int wm831x_buckp_list_voltage(struct regulator_dev *rdev,
630 				      unsigned selector)
631 {
632 	if (selector <= WM831X_BUCKP_MAX_SELECTOR)
633 		return 850000 + (selector * 25000);
634 	else
635 		return -EINVAL;
636 }
637 
638 static int wm831x_buckp_set_voltage_int(struct regulator_dev *rdev, int reg,
639 					int min_uV, int max_uV)
640 {
641 	struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
642 	struct wm831x *wm831x = dcdc->wm831x;
643 	u16 vsel;
644 
645 	if (min_uV <= 34000000)
646 		vsel = (min_uV - 850000) / 25000;
647 	else
648 		return -EINVAL;
649 
650 	if (wm831x_buckp_list_voltage(rdev, vsel) > max_uV)
651 		return -EINVAL;
652 
653 	return wm831x_set_bits(wm831x, reg, WM831X_DC3_ON_VSEL_MASK, vsel);
654 }
655 
656 static int wm831x_buckp_set_voltage(struct regulator_dev *rdev,
657 				    int min_uV, int max_uV)
658 {
659 	struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
660 	u16 reg = dcdc->base + WM831X_DCDC_ON_CONFIG;
661 
662 	return wm831x_buckp_set_voltage_int(rdev, reg, min_uV, max_uV);
663 }
664 
665 static int wm831x_buckp_set_suspend_voltage(struct regulator_dev *rdev,
666 					    int uV)
667 {
668 	struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
669 	u16 reg = dcdc->base + WM831X_DCDC_SLEEP_CONTROL;
670 
671 	return wm831x_buckp_set_voltage_int(rdev, reg, uV, uV);
672 }
673 
674 static int wm831x_buckp_get_voltage(struct regulator_dev *rdev)
675 {
676 	struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
677 	struct wm831x *wm831x = dcdc->wm831x;
678 	u16 reg = dcdc->base + WM831X_DCDC_ON_CONFIG;
679 	int val;
680 
681 	val = wm831x_reg_read(wm831x, reg);
682 	if (val < 0)
683 		return val;
684 
685 	return wm831x_buckp_list_voltage(rdev, val & WM831X_DC3_ON_VSEL_MASK);
686 }
687 
688 static struct regulator_ops wm831x_buckp_ops = {
689 	.set_voltage = wm831x_buckp_set_voltage,
690 	.get_voltage = wm831x_buckp_get_voltage,
691 	.list_voltage = wm831x_buckp_list_voltage,
692 	.set_suspend_voltage = wm831x_buckp_set_suspend_voltage,
693 
694 	.is_enabled = wm831x_dcdc_is_enabled,
695 	.enable = wm831x_dcdc_enable,
696 	.disable = wm831x_dcdc_disable,
697 	.get_status = wm831x_dcdc_get_status,
698 	.get_mode = wm831x_dcdc_get_mode,
699 	.set_mode = wm831x_dcdc_set_mode,
700 	.set_suspend_mode = wm831x_dcdc_set_suspend_mode,
701 };
702 
703 static __devinit int wm831x_buckp_probe(struct platform_device *pdev)
704 {
705 	struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
706 	struct wm831x_pdata *pdata = wm831x->dev->platform_data;
707 	int id = pdev->id % ARRAY_SIZE(pdata->dcdc);
708 	struct wm831x_dcdc *dcdc;
709 	struct resource *res;
710 	int ret, irq;
711 
712 	dev_dbg(&pdev->dev, "Probing DCDC%d\n", id + 1);
713 
714 	if (pdata == NULL || pdata->dcdc[id] == NULL)
715 		return -ENODEV;
716 
717 	dcdc = kzalloc(sizeof(struct wm831x_dcdc), GFP_KERNEL);
718 	if (dcdc == NULL) {
719 		dev_err(&pdev->dev, "Unable to allocate private data\n");
720 		return -ENOMEM;
721 	}
722 
723 	dcdc->wm831x = wm831x;
724 
725 	res = platform_get_resource(pdev, IORESOURCE_IO, 0);
726 	if (res == NULL) {
727 		dev_err(&pdev->dev, "No I/O resource\n");
728 		ret = -EINVAL;
729 		goto err;
730 	}
731 	dcdc->base = res->start;
732 
733 	snprintf(dcdc->name, sizeof(dcdc->name), "DCDC%d", id + 1);
734 	dcdc->desc.name = dcdc->name;
735 	dcdc->desc.id = id;
736 	dcdc->desc.type = REGULATOR_VOLTAGE;
737 	dcdc->desc.n_voltages = WM831X_BUCKP_MAX_SELECTOR + 1;
738 	dcdc->desc.ops = &wm831x_buckp_ops;
739 	dcdc->desc.owner = THIS_MODULE;
740 
741 	dcdc->regulator = regulator_register(&dcdc->desc, &pdev->dev,
742 					     pdata->dcdc[id], dcdc);
743 	if (IS_ERR(dcdc->regulator)) {
744 		ret = PTR_ERR(dcdc->regulator);
745 		dev_err(wm831x->dev, "Failed to register DCDC%d: %d\n",
746 			id + 1, ret);
747 		goto err;
748 	}
749 
750 	irq = platform_get_irq_byname(pdev, "UV");
751 	ret = wm831x_request_irq(wm831x, irq, wm831x_dcdc_uv_irq,
752 				 IRQF_TRIGGER_RISING, dcdc->name,
753 				 dcdc);
754 	if (ret != 0) {
755 		dev_err(&pdev->dev, "Failed to request UV IRQ %d: %d\n",
756 			irq, ret);
757 		goto err_regulator;
758 	}
759 
760 	platform_set_drvdata(pdev, dcdc);
761 
762 	return 0;
763 
764 err_regulator:
765 	regulator_unregister(dcdc->regulator);
766 err:
767 	kfree(dcdc);
768 	return ret;
769 }
770 
771 static __devexit int wm831x_buckp_remove(struct platform_device *pdev)
772 {
773 	struct wm831x_dcdc *dcdc = platform_get_drvdata(pdev);
774 	struct wm831x *wm831x = dcdc->wm831x;
775 
776 	platform_set_drvdata(pdev, NULL);
777 
778 	wm831x_free_irq(wm831x, platform_get_irq_byname(pdev, "UV"), dcdc);
779 	regulator_unregister(dcdc->regulator);
780 	kfree(dcdc);
781 
782 	return 0;
783 }
784 
785 static struct platform_driver wm831x_buckp_driver = {
786 	.probe = wm831x_buckp_probe,
787 	.remove = __devexit_p(wm831x_buckp_remove),
788 	.driver		= {
789 		.name	= "wm831x-buckp",
790 		.owner	= THIS_MODULE,
791 	},
792 };
793 
794 /*
795  * DCDC boost convertors
796  */
797 
798 static int wm831x_boostp_get_status(struct regulator_dev *rdev)
799 {
800 	struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
801 	struct wm831x *wm831x = dcdc->wm831x;
802 	int ret;
803 
804 	/* First, check for errors */
805 	ret = wm831x_reg_read(wm831x, WM831X_DCDC_UV_STATUS);
806 	if (ret < 0)
807 		return ret;
808 
809 	if (ret & (1 << rdev_get_id(rdev))) {
810 		dev_dbg(wm831x->dev, "DCDC%d under voltage\n",
811 			rdev_get_id(rdev) + 1);
812 		return REGULATOR_STATUS_ERROR;
813 	}
814 
815 	/* Is the regulator on? */
816 	ret = wm831x_reg_read(wm831x, WM831X_DCDC_STATUS);
817 	if (ret < 0)
818 		return ret;
819 	if (ret & (1 << rdev_get_id(rdev)))
820 		return REGULATOR_STATUS_ON;
821 	else
822 		return REGULATOR_STATUS_OFF;
823 }
824 
825 static struct regulator_ops wm831x_boostp_ops = {
826 	.get_status = wm831x_boostp_get_status,
827 
828 	.is_enabled = wm831x_dcdc_is_enabled,
829 	.enable = wm831x_dcdc_enable,
830 	.disable = wm831x_dcdc_disable,
831 };
832 
833 static __devinit int wm831x_boostp_probe(struct platform_device *pdev)
834 {
835 	struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
836 	struct wm831x_pdata *pdata = wm831x->dev->platform_data;
837 	int id = pdev->id % ARRAY_SIZE(pdata->dcdc);
838 	struct wm831x_dcdc *dcdc;
839 	struct resource *res;
840 	int ret, irq;
841 
842 	dev_dbg(&pdev->dev, "Probing DCDC%d\n", id + 1);
843 
844 	if (pdata == NULL || pdata->dcdc[id] == NULL)
845 		return -ENODEV;
846 
847 	dcdc = kzalloc(sizeof(struct wm831x_dcdc), GFP_KERNEL);
848 	if (dcdc == NULL) {
849 		dev_err(&pdev->dev, "Unable to allocate private data\n");
850 		return -ENOMEM;
851 	}
852 
853 	dcdc->wm831x = wm831x;
854 
855 	res = platform_get_resource(pdev, IORESOURCE_IO, 0);
856 	if (res == NULL) {
857 		dev_err(&pdev->dev, "No I/O resource\n");
858 		ret = -EINVAL;
859 		goto err;
860 	}
861 	dcdc->base = res->start;
862 
863 	snprintf(dcdc->name, sizeof(dcdc->name), "DCDC%d", id + 1);
864 	dcdc->desc.name = dcdc->name;
865 	dcdc->desc.id = id;
866 	dcdc->desc.type = REGULATOR_VOLTAGE;
867 	dcdc->desc.ops = &wm831x_boostp_ops;
868 	dcdc->desc.owner = THIS_MODULE;
869 
870 	dcdc->regulator = regulator_register(&dcdc->desc, &pdev->dev,
871 					     pdata->dcdc[id], dcdc);
872 	if (IS_ERR(dcdc->regulator)) {
873 		ret = PTR_ERR(dcdc->regulator);
874 		dev_err(wm831x->dev, "Failed to register DCDC%d: %d\n",
875 			id + 1, ret);
876 		goto err;
877 	}
878 
879 	irq = platform_get_irq_byname(pdev, "UV");
880 	ret = wm831x_request_irq(wm831x, irq, wm831x_dcdc_uv_irq,
881 				 IRQF_TRIGGER_RISING, dcdc->name,
882 				 dcdc);
883 	if (ret != 0) {
884 		dev_err(&pdev->dev, "Failed to request UV IRQ %d: %d\n",
885 			irq, ret);
886 		goto err_regulator;
887 	}
888 
889 	platform_set_drvdata(pdev, dcdc);
890 
891 	return 0;
892 
893 err_regulator:
894 	regulator_unregister(dcdc->regulator);
895 err:
896 	kfree(dcdc);
897 	return ret;
898 }
899 
900 static __devexit int wm831x_boostp_remove(struct platform_device *pdev)
901 {
902 	struct wm831x_dcdc *dcdc = platform_get_drvdata(pdev);
903 	struct wm831x *wm831x = dcdc->wm831x;
904 
905 	platform_set_drvdata(pdev, NULL);
906 
907 	wm831x_free_irq(wm831x, platform_get_irq_byname(pdev, "UV"), dcdc);
908 	regulator_unregister(dcdc->regulator);
909 	kfree(dcdc);
910 
911 	return 0;
912 }
913 
914 static struct platform_driver wm831x_boostp_driver = {
915 	.probe = wm831x_boostp_probe,
916 	.remove = __devexit_p(wm831x_boostp_remove),
917 	.driver		= {
918 		.name	= "wm831x-boostp",
919 		.owner	= THIS_MODULE,
920 	},
921 };
922 
923 /*
924  * External Power Enable
925  *
926  * These aren't actually DCDCs but look like them in hardware so share
927  * code.
928  */
929 
930 #define WM831X_EPE_BASE 6
931 
932 static struct regulator_ops wm831x_epe_ops = {
933 	.is_enabled = wm831x_dcdc_is_enabled,
934 	.enable = wm831x_dcdc_enable,
935 	.disable = wm831x_dcdc_disable,
936 	.get_status = wm831x_dcdc_get_status,
937 };
938 
939 static __devinit int wm831x_epe_probe(struct platform_device *pdev)
940 {
941 	struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
942 	struct wm831x_pdata *pdata = wm831x->dev->platform_data;
943 	int id = pdev->id % ARRAY_SIZE(pdata->epe);
944 	struct wm831x_dcdc *dcdc;
945 	int ret;
946 
947 	dev_dbg(&pdev->dev, "Probing EPE%d\n", id + 1);
948 
949 	if (pdata == NULL || pdata->epe[id] == NULL)
950 		return -ENODEV;
951 
952 	dcdc = kzalloc(sizeof(struct wm831x_dcdc), GFP_KERNEL);
953 	if (dcdc == NULL) {
954 		dev_err(&pdev->dev, "Unable to allocate private data\n");
955 		return -ENOMEM;
956 	}
957 
958 	dcdc->wm831x = wm831x;
959 
960 	/* For current parts this is correct; probably need to revisit
961 	 * in future.
962 	 */
963 	snprintf(dcdc->name, sizeof(dcdc->name), "EPE%d", id + 1);
964 	dcdc->desc.name = dcdc->name;
965 	dcdc->desc.id = id + WM831X_EPE_BASE; /* Offset in DCDC registers */
966 	dcdc->desc.ops = &wm831x_epe_ops;
967 	dcdc->desc.type = REGULATOR_VOLTAGE;
968 	dcdc->desc.owner = THIS_MODULE;
969 
970 	dcdc->regulator = regulator_register(&dcdc->desc, &pdev->dev,
971 					     pdata->epe[id], dcdc);
972 	if (IS_ERR(dcdc->regulator)) {
973 		ret = PTR_ERR(dcdc->regulator);
974 		dev_err(wm831x->dev, "Failed to register EPE%d: %d\n",
975 			id + 1, ret);
976 		goto err;
977 	}
978 
979 	platform_set_drvdata(pdev, dcdc);
980 
981 	return 0;
982 
983 err:
984 	kfree(dcdc);
985 	return ret;
986 }
987 
988 static __devexit int wm831x_epe_remove(struct platform_device *pdev)
989 {
990 	struct wm831x_dcdc *dcdc = platform_get_drvdata(pdev);
991 
992 	platform_set_drvdata(pdev, NULL);
993 
994 	regulator_unregister(dcdc->regulator);
995 	kfree(dcdc);
996 
997 	return 0;
998 }
999 
1000 static struct platform_driver wm831x_epe_driver = {
1001 	.probe = wm831x_epe_probe,
1002 	.remove = __devexit_p(wm831x_epe_remove),
1003 	.driver		= {
1004 		.name	= "wm831x-epe",
1005 		.owner	= THIS_MODULE,
1006 	},
1007 };
1008 
1009 static int __init wm831x_dcdc_init(void)
1010 {
1011 	int ret;
1012 	ret = platform_driver_register(&wm831x_buckv_driver);
1013 	if (ret != 0)
1014 		pr_err("Failed to register WM831x BUCKV driver: %d\n", ret);
1015 
1016 	ret = platform_driver_register(&wm831x_buckp_driver);
1017 	if (ret != 0)
1018 		pr_err("Failed to register WM831x BUCKP driver: %d\n", ret);
1019 
1020 	ret = platform_driver_register(&wm831x_boostp_driver);
1021 	if (ret != 0)
1022 		pr_err("Failed to register WM831x BOOST driver: %d\n", ret);
1023 
1024 	ret = platform_driver_register(&wm831x_epe_driver);
1025 	if (ret != 0)
1026 		pr_err("Failed to register WM831x EPE driver: %d\n", ret);
1027 
1028 	return 0;
1029 }
1030 subsys_initcall(wm831x_dcdc_init);
1031 
1032 static void __exit wm831x_dcdc_exit(void)
1033 {
1034 	platform_driver_unregister(&wm831x_epe_driver);
1035 	platform_driver_unregister(&wm831x_boostp_driver);
1036 	platform_driver_unregister(&wm831x_buckp_driver);
1037 	platform_driver_unregister(&wm831x_buckv_driver);
1038 }
1039 module_exit(wm831x_dcdc_exit);
1040 
1041 /* Module information */
1042 MODULE_AUTHOR("Mark Brown");
1043 MODULE_DESCRIPTION("WM831x DC-DC convertor driver");
1044 MODULE_LICENSE("GPL");
1045 MODULE_ALIAS("platform:wm831x-buckv");
1046 MODULE_ALIAS("platform:wm831x-buckp");
1047