xref: /linux/drivers/regulator/tps65912-regulator.c (revision f2ee442115c9b6219083c019939a9cc0c9abb2f8)
1 /*
2  * tps65912.c  --  TI tps65912
3  *
4  * Copyright 2011 Texas Instruments Inc.
5  *
6  * Author: Margarita Olaya Cabrera <magi@slimlogic.co.uk>
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  * This driver is based on wm8350 implementation.
14  */
15 
16 #include <linux/kernel.h>
17 #include <linux/module.h>
18 #include <linux/init.h>
19 #include <linux/err.h>
20 #include <linux/platform_device.h>
21 #include <linux/regulator/driver.h>
22 #include <linux/regulator/machine.h>
23 #include <linux/delay.h>
24 #include <linux/slab.h>
25 #include <linux/gpio.h>
26 #include <linux/mfd/tps65912.h>
27 
28 /* DCDC's */
29 #define TPS65912_REG_DCDC1	0
30 #define TPS65912_REG_DCDC2	1
31 #define TPS65912_REG_DCDC3	2
32 #define TPS65912_REG_DCDC4	3
33 
34 /* LDOs */
35 #define TPS65912_REG_LDO1	4
36 #define TPS65912_REG_LDO2	5
37 #define TPS65912_REG_LDO3	6
38 #define TPS65912_REG_LDO4	7
39 #define TPS65912_REG_LDO5	8
40 #define TPS65912_REG_LDO6	9
41 #define TPS65912_REG_LDO7	10
42 #define TPS65912_REG_LDO8	11
43 #define TPS65912_REG_LDO9	12
44 #define TPS65912_REG_LDO10	13
45 
46 /* Number of step-down converters available */
47 #define TPS65912_NUM_DCDC	4
48 
49 /* Number of LDO voltage regulators  available */
50 #define TPS65912_NUM_LDO	10
51 
52 /* Number of total regulators available */
53 #define TPS65912_NUM_REGULATOR		(TPS65912_NUM_DCDC + TPS65912_NUM_LDO)
54 
55 #define TPS65912_REG_ENABLED	0x80
56 #define OP_SELREG_MASK		0x40
57 #define OP_SELREG_SHIFT		6
58 
59 struct tps_info {
60 	const char *name;
61 };
62 
63 static struct tps_info tps65912_regs[] = {
64 	{
65 		.name = "DCDC1",
66 	},
67 	{
68 		.name = "DCDC2",
69 	},
70 	{
71 		.name = "DCDC3",
72 	},
73 	{
74 		.name = "DCDC4",
75 	},
76 	{
77 		.name = "LDO1",
78 	},
79 	{
80 		.name = "LDO2",
81 	},
82 	{
83 		.name = "LDO3",
84 	},
85 	{
86 		.name = "LDO4",
87 	},
88 	{
89 		.name = "LDO5",
90 	},
91 	{
92 		.name = "LDO6",
93 	},
94 	{
95 		.name = "LDO7",
96 	},
97 	{
98 		.name = "LDO8",
99 	},
100 	{
101 		.name = "LDO9",
102 	},
103 	{
104 		.name = "LDO10",
105 	},
106 };
107 
108 struct tps65912_reg {
109 	struct regulator_desc desc[TPS65912_NUM_REGULATOR];
110 	struct tps65912 *mfd;
111 	struct regulator_dev *rdev[TPS65912_NUM_REGULATOR];
112 	struct tps_info *info[TPS65912_NUM_REGULATOR];
113 	/* for read/write access */
114 	struct mutex io_lock;
115 	int mode;
116 	int (*get_ctrl_reg)(int);
117 	int dcdc1_range;
118 	int dcdc2_range;
119 	int dcdc3_range;
120 	int dcdc4_range;
121 	int pwm_mode_reg;
122 	int eco_reg;
123 };
124 
125 static int tps65912_get_range(struct tps65912_reg *pmic, int id)
126 {
127 	struct tps65912 *mfd = pmic->mfd;
128 
129 	if (id > TPS65912_REG_DCDC4)
130 		return 0;
131 
132 	switch (id) {
133 	case TPS65912_REG_DCDC1:
134 		pmic->dcdc1_range = tps65912_reg_read(mfd,
135 							TPS65912_DCDC1_LIMIT);
136 		if (pmic->dcdc1_range < 0)
137 			return pmic->dcdc1_range;
138 		pmic->dcdc1_range = (pmic->dcdc1_range &
139 			DCDC_LIMIT_RANGE_MASK) >> DCDC_LIMIT_RANGE_SHIFT;
140 		return pmic->dcdc1_range;
141 	case TPS65912_REG_DCDC2:
142 		pmic->dcdc2_range = tps65912_reg_read(mfd,
143 							TPS65912_DCDC2_LIMIT);
144 		if (pmic->dcdc2_range < 0)
145 			return pmic->dcdc2_range;
146 		pmic->dcdc2_range = (pmic->dcdc2_range &
147 			DCDC_LIMIT_RANGE_MASK) >> DCDC_LIMIT_RANGE_SHIFT;
148 		return pmic->dcdc2_range;
149 	case TPS65912_REG_DCDC3:
150 		pmic->dcdc3_range = tps65912_reg_read(mfd,
151 							TPS65912_DCDC3_LIMIT);
152 		if (pmic->dcdc3_range < 0)
153 			return pmic->dcdc3_range;
154 		pmic->dcdc3_range = (pmic->dcdc3_range &
155 			DCDC_LIMIT_RANGE_MASK) >> DCDC_LIMIT_RANGE_SHIFT;
156 		return pmic->dcdc3_range;
157 	case TPS65912_REG_DCDC4:
158 		pmic->dcdc4_range = tps65912_reg_read(mfd,
159 							TPS65912_DCDC4_LIMIT);
160 		if (pmic->dcdc4_range < 0)
161 			return pmic->dcdc4_range;
162 		pmic->dcdc4_range = (pmic->dcdc4_range &
163 			DCDC_LIMIT_RANGE_MASK) >> DCDC_LIMIT_RANGE_SHIFT;
164 		return pmic->dcdc4_range;
165 	default:
166 		return 0;
167 	}
168 }
169 
170 static unsigned long tps65912_vsel_to_uv_range0(u8 vsel)
171 {
172 	unsigned long uv;
173 
174 	uv = ((vsel * 12500) + 500000);
175 	return uv;
176 }
177 
178 static unsigned long tps65912_vsel_to_uv_range1(u8 vsel)
179 {
180 	unsigned long uv;
181 
182 	 uv = ((vsel * 12500) + 700000);
183 	return uv;
184 }
185 
186 static unsigned long tps65912_vsel_to_uv_range2(u8 vsel)
187 {
188 	unsigned long uv;
189 
190 	uv = ((vsel * 25000) + 500000);
191 	return uv;
192 }
193 
194 static unsigned long tps65912_vsel_to_uv_range3(u8 vsel)
195 {
196 	unsigned long uv;
197 
198 	if (vsel == 0x3f)
199 		uv = 3800000;
200 	else
201 		uv = ((vsel * 50000) + 500000);
202 
203 	return uv;
204 }
205 
206 static unsigned long tps65912_vsel_to_uv_ldo(u8 vsel)
207 {
208 	unsigned long uv = 0;
209 
210 	if (vsel <= 32)
211 		uv = ((vsel * 25000) + 800000);
212 	else if (vsel > 32 && vsel <= 60)
213 		uv = (((vsel - 32) * 50000) + 1600000);
214 	else if (vsel > 60)
215 		uv = (((vsel - 60) * 100000) + 3000000);
216 
217 	return uv;
218 }
219 
220 static int tps65912_get_ctrl_register(int id)
221 {
222 	switch (id) {
223 	case TPS65912_REG_DCDC1:
224 		return TPS65912_DCDC1_AVS;
225 	case TPS65912_REG_DCDC2:
226 		return TPS65912_DCDC2_AVS;
227 	case TPS65912_REG_DCDC3:
228 		return TPS65912_DCDC3_AVS;
229 	case TPS65912_REG_DCDC4:
230 		return TPS65912_DCDC4_AVS;
231 	case TPS65912_REG_LDO1:
232 		return TPS65912_LDO1_AVS;
233 	case TPS65912_REG_LDO2:
234 		return TPS65912_LDO2_AVS;
235 	case TPS65912_REG_LDO3:
236 		return TPS65912_LDO3_AVS;
237 	case TPS65912_REG_LDO4:
238 		return TPS65912_LDO4_AVS;
239 	case TPS65912_REG_LDO5:
240 		return TPS65912_LDO5;
241 	case TPS65912_REG_LDO6:
242 		return TPS65912_LDO6;
243 	case TPS65912_REG_LDO7:
244 		return TPS65912_LDO7;
245 	case TPS65912_REG_LDO8:
246 		return TPS65912_LDO8;
247 	case TPS65912_REG_LDO9:
248 		return TPS65912_LDO9;
249 	case TPS65912_REG_LDO10:
250 		return TPS65912_LDO10;
251 	default:
252 		return -EINVAL;
253 	}
254 }
255 
256 static int tps65912_get_dcdc_sel_register(struct tps65912_reg *pmic, int id)
257 {
258 	struct tps65912 *mfd = pmic->mfd;
259 	int opvsel = 0, sr = 0;
260 	u8 reg = 0;
261 
262 	if (id < TPS65912_REG_DCDC1 || id > TPS65912_REG_DCDC4)
263 		return -EINVAL;
264 
265 	switch (id) {
266 	case TPS65912_REG_DCDC1:
267 		opvsel = tps65912_reg_read(mfd, TPS65912_DCDC1_OP);
268 		sr = ((opvsel & OP_SELREG_MASK) >> OP_SELREG_SHIFT);
269 		if (sr)
270 			reg = TPS65912_DCDC1_AVS;
271 		else
272 			reg = TPS65912_DCDC1_OP;
273 		break;
274 	case TPS65912_REG_DCDC2:
275 		opvsel = tps65912_reg_read(mfd, TPS65912_DCDC2_OP);
276 		sr = (opvsel & OP_SELREG_MASK) >> OP_SELREG_SHIFT;
277 		if (sr)
278 			reg = TPS65912_DCDC2_AVS;
279 		else
280 			reg = TPS65912_DCDC2_OP;
281 		break;
282 	case TPS65912_REG_DCDC3:
283 		opvsel = tps65912_reg_read(mfd, TPS65912_DCDC3_OP);
284 		sr = (opvsel & OP_SELREG_MASK) >> OP_SELREG_SHIFT;
285 		if (sr)
286 			reg = TPS65912_DCDC3_AVS;
287 		else
288 			reg = TPS65912_DCDC3_OP;
289 		break;
290 	case TPS65912_REG_DCDC4:
291 		opvsel = tps65912_reg_read(mfd, TPS65912_DCDC4_OP);
292 		sr = (opvsel & OP_SELREG_MASK) >> OP_SELREG_SHIFT;
293 		if (sr)
294 			reg = TPS65912_DCDC4_AVS;
295 		else
296 			reg = TPS65912_DCDC4_OP;
297 		break;
298 	}
299 	return reg;
300 }
301 
302 static int tps65912_get_ldo_sel_register(struct tps65912_reg *pmic, int id)
303 {
304 	struct tps65912 *mfd = pmic->mfd;
305 	int opvsel = 0, sr = 0;
306 	u8 reg = 0;
307 
308 	if (id < TPS65912_REG_LDO1 || id > TPS65912_REG_LDO10)
309 		return -EINVAL;
310 
311 	switch (id) {
312 	case TPS65912_REG_LDO1:
313 		opvsel = tps65912_reg_read(mfd, TPS65912_LDO1_OP);
314 		sr = (opvsel & OP_SELREG_MASK) >> OP_SELREG_SHIFT;
315 		if (sr)
316 			reg = TPS65912_LDO1_AVS;
317 		else
318 			reg = TPS65912_LDO1_OP;
319 		break;
320 	case TPS65912_REG_LDO2:
321 		opvsel = tps65912_reg_read(mfd, TPS65912_LDO2_OP);
322 		sr = (opvsel & OP_SELREG_MASK) >> OP_SELREG_SHIFT;
323 		if (sr)
324 			reg = TPS65912_LDO2_AVS;
325 		else
326 			reg = TPS65912_LDO2_OP;
327 		break;
328 	case TPS65912_REG_LDO3:
329 		opvsel = tps65912_reg_read(mfd, TPS65912_LDO3_OP);
330 		sr = (opvsel & OP_SELREG_MASK) >> OP_SELREG_SHIFT;
331 		if (sr)
332 			reg = TPS65912_LDO3_AVS;
333 		else
334 			reg = TPS65912_LDO3_OP;
335 		break;
336 	case TPS65912_REG_LDO4:
337 		opvsel = tps65912_reg_read(mfd, TPS65912_LDO4_OP);
338 		sr = (opvsel & OP_SELREG_MASK) >> OP_SELREG_SHIFT;
339 		if (sr)
340 			reg = TPS65912_LDO4_AVS;
341 		else
342 			reg = TPS65912_LDO4_OP;
343 		break;
344 	case TPS65912_REG_LDO5:
345 		reg = TPS65912_LDO5;
346 		break;
347 	case TPS65912_REG_LDO6:
348 		reg = TPS65912_LDO6;
349 		break;
350 	case TPS65912_REG_LDO7:
351 		reg = TPS65912_LDO7;
352 		break;
353 	case TPS65912_REG_LDO8:
354 		reg = TPS65912_LDO8;
355 		break;
356 	case TPS65912_REG_LDO9:
357 		reg = TPS65912_LDO9;
358 		break;
359 	case TPS65912_REG_LDO10:
360 		reg = TPS65912_LDO10;
361 		break;
362 	}
363 
364 	return reg;
365 }
366 
367 static int tps65912_get_mode_regiters(struct tps65912_reg *pmic, int id)
368 {
369 	switch (id) {
370 	case TPS65912_REG_DCDC1:
371 		pmic->pwm_mode_reg = TPS65912_DCDC1_CTRL;
372 		pmic->eco_reg = TPS65912_DCDC1_AVS;
373 		break;
374 	case TPS65912_REG_DCDC2:
375 		pmic->pwm_mode_reg = TPS65912_DCDC2_CTRL;
376 		pmic->eco_reg = TPS65912_DCDC2_AVS;
377 		break;
378 	case TPS65912_REG_DCDC3:
379 		pmic->pwm_mode_reg = TPS65912_DCDC3_CTRL;
380 		pmic->eco_reg = TPS65912_DCDC3_AVS;
381 		break;
382 	case TPS65912_REG_DCDC4:
383 		pmic->pwm_mode_reg = TPS65912_DCDC4_CTRL;
384 		pmic->eco_reg = TPS65912_DCDC4_AVS;
385 		break;
386 	default:
387 		return -EINVAL;
388 	}
389 
390 	return 0;
391 }
392 
393 static int tps65912_reg_is_enabled(struct regulator_dev *dev)
394 {
395 	struct tps65912_reg *pmic = rdev_get_drvdata(dev);
396 	struct tps65912 *mfd = pmic->mfd;
397 	int reg, value, id = rdev_get_id(dev);
398 
399 	if (id < TPS65912_REG_DCDC1 || id > TPS65912_REG_LDO10)
400 		return -EINVAL;
401 
402 	reg = pmic->get_ctrl_reg(id);
403 	if (reg < 0)
404 		return reg;
405 
406 	value = tps65912_reg_read(mfd, reg);
407 	if (value < 0)
408 		return value;
409 
410 	return value & TPS65912_REG_ENABLED;
411 }
412 
413 static int tps65912_reg_enable(struct regulator_dev *dev)
414 {
415 	struct tps65912_reg *pmic = rdev_get_drvdata(dev);
416 	struct tps65912 *mfd = pmic->mfd;
417 	int id = rdev_get_id(dev);
418 	int reg;
419 
420 	if (id < TPS65912_REG_DCDC1 || id > TPS65912_REG_LDO10)
421 		return -EINVAL;
422 
423 	reg = pmic->get_ctrl_reg(id);
424 	if (reg < 0)
425 		return reg;
426 
427 	return tps65912_set_bits(mfd, reg, TPS65912_REG_ENABLED);
428 }
429 
430 static int tps65912_reg_disable(struct regulator_dev *dev)
431 {
432 	struct tps65912_reg *pmic = rdev_get_drvdata(dev);
433 	struct tps65912 *mfd = pmic->mfd;
434 	int id = rdev_get_id(dev), reg;
435 
436 	reg = pmic->get_ctrl_reg(id);
437 	if (reg < 0)
438 		return reg;
439 
440 	return tps65912_clear_bits(mfd, reg, TPS65912_REG_ENABLED);
441 }
442 
443 static int tps65912_set_mode(struct regulator_dev *dev, unsigned int mode)
444 {
445 	struct tps65912_reg *pmic = rdev_get_drvdata(dev);
446 	struct tps65912 *mfd = pmic->mfd;
447 	int pwm_mode, eco, id = rdev_get_id(dev);
448 
449 	tps65912_get_mode_regiters(pmic, id);
450 
451 	pwm_mode = tps65912_reg_read(mfd, pmic->pwm_mode_reg);
452 	eco = tps65912_reg_read(mfd, pmic->eco_reg);
453 
454 	pwm_mode &= DCDCCTRL_DCDC_MODE_MASK;
455 	eco &= DCDC_AVS_ECO_MASK;
456 
457 	switch (mode) {
458 	case REGULATOR_MODE_FAST:
459 		/* Verify if mode alredy set */
460 		if (pwm_mode && !eco)
461 			break;
462 		tps65912_set_bits(mfd, pmic->pwm_mode_reg, DCDCCTRL_DCDC_MODE_MASK);
463 		tps65912_clear_bits(mfd, pmic->eco_reg, DCDC_AVS_ECO_MASK);
464 		break;
465 	case REGULATOR_MODE_NORMAL:
466 	case REGULATOR_MODE_IDLE:
467 		if (!pwm_mode && !eco)
468 			break;
469 		tps65912_clear_bits(mfd, pmic->pwm_mode_reg, DCDCCTRL_DCDC_MODE_MASK);
470 		tps65912_clear_bits(mfd, pmic->eco_reg, DCDC_AVS_ECO_MASK);
471 		break;
472 	case REGULATOR_MODE_STANDBY:
473 		if (!pwm_mode && eco)
474 			break;
475 		tps65912_clear_bits(mfd, pmic->pwm_mode_reg, DCDCCTRL_DCDC_MODE_MASK);
476 		tps65912_set_bits(mfd, pmic->eco_reg, DCDC_AVS_ECO_MASK);
477 		break;
478 	default:
479 		return -EINVAL;
480 	}
481 
482 	return 0;
483 }
484 
485 static unsigned int tps65912_get_mode(struct regulator_dev *dev)
486 {
487 	struct tps65912_reg *pmic = rdev_get_drvdata(dev);
488 	struct tps65912 *mfd = pmic->mfd;
489 	int pwm_mode, eco, mode = 0, id = rdev_get_id(dev);
490 
491 	tps65912_get_mode_regiters(pmic, id);
492 
493 	pwm_mode = tps65912_reg_read(mfd, pmic->pwm_mode_reg);
494 	eco = tps65912_reg_read(mfd, pmic->eco_reg);
495 
496 	pwm_mode &= DCDCCTRL_DCDC_MODE_MASK;
497 	eco &= DCDC_AVS_ECO_MASK;
498 
499 	if (pwm_mode && !eco)
500 		mode = REGULATOR_MODE_FAST;
501 	else if (!pwm_mode && !eco)
502 		mode = REGULATOR_MODE_NORMAL;
503 	else if (!pwm_mode && eco)
504 		mode = REGULATOR_MODE_STANDBY;
505 
506 	return mode;
507 }
508 
509 static int tps65912_get_voltage_dcdc(struct regulator_dev *dev)
510 {
511 	struct tps65912_reg *pmic = rdev_get_drvdata(dev);
512 	struct tps65912 *mfd = pmic->mfd;
513 	int id = rdev_get_id(dev), voltage = 0, range;
514 	int opvsel = 0, avsel = 0, sr, vsel;
515 
516 	switch (id) {
517 	case TPS65912_REG_DCDC1:
518 		opvsel = tps65912_reg_read(mfd, TPS65912_DCDC1_OP);
519 		avsel = tps65912_reg_read(mfd, TPS65912_DCDC1_AVS);
520 		range = pmic->dcdc1_range;
521 		break;
522 	case TPS65912_REG_DCDC2:
523 		opvsel = tps65912_reg_read(mfd, TPS65912_DCDC2_OP);
524 		avsel = tps65912_reg_read(mfd, TPS65912_DCDC2_AVS);
525 		range = pmic->dcdc2_range;
526 		break;
527 	case TPS65912_REG_DCDC3:
528 		opvsel = tps65912_reg_read(mfd, TPS65912_DCDC3_OP);
529 		avsel = tps65912_reg_read(mfd, TPS65912_DCDC3_AVS);
530 		range = pmic->dcdc3_range;
531 		break;
532 	case TPS65912_REG_DCDC4:
533 		opvsel = tps65912_reg_read(mfd, TPS65912_DCDC4_OP);
534 		avsel = tps65912_reg_read(mfd, TPS65912_DCDC4_AVS);
535 		range = pmic->dcdc4_range;
536 		break;
537 	default:
538 		return -EINVAL;
539 	}
540 
541 	sr = (opvsel & OP_SELREG_MASK) >> OP_SELREG_SHIFT;
542 	if (sr)
543 		vsel = avsel;
544 	else
545 		vsel = opvsel;
546 	vsel &= 0x3F;
547 
548 	switch (range) {
549 	case 0:
550 		/* 0.5 - 1.2875V in 12.5mV steps */
551 		voltage = tps65912_vsel_to_uv_range0(vsel);
552 		break;
553 	case 1:
554 		/* 0.7 - 1.4875V in 12.5mV steps */
555 		voltage = tps65912_vsel_to_uv_range1(vsel);
556 		break;
557 	case 2:
558 		/* 0.5 - 2.075V in 25mV steps */
559 		voltage = tps65912_vsel_to_uv_range2(vsel);
560 		break;
561 	case 3:
562 		/* 0.5 - 3.8V in 50mV steps */
563 		voltage = tps65912_vsel_to_uv_range3(vsel);
564 		break;
565 	}
566 	return voltage;
567 }
568 
569 static int tps65912_set_voltage_dcdc(struct regulator_dev *dev,
570 						unsigned selector)
571 {
572 	struct tps65912_reg *pmic = rdev_get_drvdata(dev);
573 	struct tps65912 *mfd = pmic->mfd;
574 	int id = rdev_get_id(dev);
575 	int value;
576 	u8 reg;
577 
578 	reg = tps65912_get_dcdc_sel_register(pmic, id);
579 	value = tps65912_reg_read(mfd, reg);
580 	value &= 0xC0;
581 	return tps65912_reg_write(mfd, reg, selector | value);
582 }
583 
584 static int tps65912_get_voltage_ldo(struct regulator_dev *dev)
585 {
586 	struct tps65912_reg *pmic = rdev_get_drvdata(dev);
587 	struct tps65912 *mfd = pmic->mfd;
588 	int id = rdev_get_id(dev);
589 	int vsel = 0;
590 	u8 reg;
591 
592 	reg = tps65912_get_ldo_sel_register(pmic, id);
593 	vsel = tps65912_reg_read(mfd, reg);
594 	vsel &= 0x3F;
595 
596 	return tps65912_vsel_to_uv_ldo(vsel);
597 }
598 
599 static int tps65912_set_voltage_ldo(struct regulator_dev *dev,
600 						unsigned selector)
601 {
602 	struct tps65912_reg *pmic = rdev_get_drvdata(dev);
603 	struct tps65912 *mfd = pmic->mfd;
604 	int id = rdev_get_id(dev), reg, value;
605 
606 	reg = tps65912_get_ldo_sel_register(pmic, id);
607 	value = tps65912_reg_read(mfd, reg);
608 	value &= 0xC0;
609 	return tps65912_reg_write(mfd, reg, selector | value);
610 }
611 
612 static int tps65912_list_voltage_dcdc(struct regulator_dev *dev,
613 					unsigned selector)
614 {
615 	struct tps65912_reg *pmic = rdev_get_drvdata(dev);
616 	int range, voltage = 0, id = rdev_get_id(dev);
617 
618 	switch (id) {
619 	case TPS65912_REG_DCDC1:
620 		range = pmic->dcdc1_range;
621 		break;
622 	case TPS65912_REG_DCDC2:
623 		range = pmic->dcdc2_range;
624 		break;
625 	case TPS65912_REG_DCDC3:
626 		range = pmic->dcdc3_range;
627 		break;
628 	case TPS65912_REG_DCDC4:
629 		range = pmic->dcdc4_range;
630 		break;
631 	default:
632 		return -EINVAL;
633 	}
634 
635 	switch (range) {
636 	case 0:
637 		/* 0.5 - 1.2875V in 12.5mV steps */
638 		voltage = tps65912_vsel_to_uv_range0(selector);
639 		break;
640 	case 1:
641 		/* 0.7 - 1.4875V in 12.5mV steps */
642 		voltage = tps65912_vsel_to_uv_range1(selector);
643 		break;
644 	case 2:
645 		/* 0.5 - 2.075V in 25mV steps */
646 		voltage = tps65912_vsel_to_uv_range2(selector);
647 		break;
648 	case 3:
649 		/* 0.5 - 3.8V in 50mV steps */
650 		voltage = tps65912_vsel_to_uv_range3(selector);
651 		break;
652 	}
653 	return voltage;
654 }
655 
656 static int tps65912_list_voltage_ldo(struct regulator_dev *dev,
657 					unsigned selector)
658 {
659 	int ldo = rdev_get_id(dev);
660 
661 	if (ldo < TPS65912_REG_LDO1 || ldo > TPS65912_REG_LDO10)
662 		return -EINVAL;
663 
664 	return tps65912_vsel_to_uv_ldo(selector);
665 }
666 
667 /* Operations permitted on DCDCx */
668 static struct regulator_ops tps65912_ops_dcdc = {
669 	.is_enabled = tps65912_reg_is_enabled,
670 	.enable = tps65912_reg_enable,
671 	.disable = tps65912_reg_disable,
672 	.set_mode = tps65912_set_mode,
673 	.get_mode = tps65912_get_mode,
674 	.get_voltage = tps65912_get_voltage_dcdc,
675 	.set_voltage_sel = tps65912_set_voltage_dcdc,
676 	.list_voltage = tps65912_list_voltage_dcdc,
677 };
678 
679 /* Operations permitted on LDOx */
680 static struct regulator_ops tps65912_ops_ldo = {
681 	.is_enabled = tps65912_reg_is_enabled,
682 	.enable = tps65912_reg_enable,
683 	.disable = tps65912_reg_disable,
684 	.get_voltage = tps65912_get_voltage_ldo,
685 	.set_voltage_sel = tps65912_set_voltage_ldo,
686 	.list_voltage = tps65912_list_voltage_ldo,
687 };
688 
689 static __devinit int tps65912_probe(struct platform_device *pdev)
690 {
691 	struct tps65912 *tps65912 = dev_get_drvdata(pdev->dev.parent);
692 	struct tps_info *info;
693 	struct regulator_init_data *reg_data;
694 	struct regulator_dev *rdev;
695 	struct tps65912_reg *pmic;
696 	struct tps65912_board *pmic_plat_data;
697 	int i, err;
698 
699 	pmic_plat_data = dev_get_platdata(tps65912->dev);
700 	if (!pmic_plat_data)
701 		return -EINVAL;
702 
703 	reg_data = pmic_plat_data->tps65912_pmic_init_data;
704 
705 	pmic = kzalloc(sizeof(*pmic), GFP_KERNEL);
706 	if (!pmic)
707 		return -ENOMEM;
708 
709 	mutex_init(&pmic->io_lock);
710 	pmic->mfd = tps65912;
711 	platform_set_drvdata(pdev, pmic);
712 
713 	pmic->get_ctrl_reg = &tps65912_get_ctrl_register;
714 	info = tps65912_regs;
715 
716 	for (i = 0; i < TPS65912_NUM_REGULATOR; i++, info++, reg_data++) {
717 		int range = 0;
718 		/* Register the regulators */
719 		pmic->info[i] = info;
720 
721 		pmic->desc[i].name = info->name;
722 		pmic->desc[i].id = i;
723 		pmic->desc[i].n_voltages = 64;
724 		pmic->desc[i].ops = (i > TPS65912_REG_DCDC4 ?
725 			&tps65912_ops_ldo : &tps65912_ops_dcdc);
726 		pmic->desc[i].type = REGULATOR_VOLTAGE;
727 		pmic->desc[i].owner = THIS_MODULE;
728 		range = tps65912_get_range(pmic, i);
729 		rdev = regulator_register(&pmic->desc[i],
730 					tps65912->dev, reg_data, pmic);
731 		if (IS_ERR(rdev)) {
732 			dev_err(tps65912->dev,
733 				"failed to register %s regulator\n",
734 				pdev->name);
735 			err = PTR_ERR(rdev);
736 			goto err;
737 		}
738 
739 		/* Save regulator for cleanup */
740 		pmic->rdev[i] = rdev;
741 	}
742 	return 0;
743 
744 err:
745 	while (--i >= 0)
746 		regulator_unregister(pmic->rdev[i]);
747 
748 	kfree(pmic);
749 	return err;
750 }
751 
752 static int __devexit tps65912_remove(struct platform_device *pdev)
753 {
754 	struct tps65912_reg *tps65912_reg = platform_get_drvdata(pdev);
755 	int i;
756 
757 	for (i = 0; i < TPS65912_NUM_REGULATOR; i++)
758 		regulator_unregister(tps65912_reg->rdev[i]);
759 
760 	kfree(tps65912_reg);
761 	return 0;
762 }
763 
764 static struct platform_driver tps65912_driver = {
765 	.driver = {
766 		.name = "tps65912-pmic",
767 		.owner = THIS_MODULE,
768 	},
769 	.probe = tps65912_probe,
770 	.remove = __devexit_p(tps65912_remove),
771 };
772 
773 /**
774  * tps65912_init
775  *
776  * Module init function
777  */
778 static int __init tps65912_init(void)
779 {
780 	return platform_driver_register(&tps65912_driver);
781 }
782 subsys_initcall(tps65912_init);
783 
784 /**
785  * tps65912_cleanup
786  *
787  * Module exit function
788  */
789 static void __exit tps65912_cleanup(void)
790 {
791 	platform_driver_unregister(&tps65912_driver);
792 }
793 module_exit(tps65912_cleanup);
794 
795 MODULE_AUTHOR("Margarita Olaya Cabrera <magi@slimlogic.co.uk>");
796 MODULE_DESCRIPTION("TPS65912 voltage regulator driver");
797 MODULE_LICENSE("GPL v2");
798 MODULE_ALIAS("platform:tps65912-pmic");
799