xref: /linux/drivers/regulator/lp872x.c (revision b85d45947951d23cb22d90caecf4c1eb81342c96)
1 /*
2  * Copyright 2012 Texas Instruments
3  *
4  * Author: Milo(Woogyom) Kim <milo.kim@ti.com>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9  *
10  */
11 
12 #include <linux/module.h>
13 #include <linux/slab.h>
14 #include <linux/i2c.h>
15 #include <linux/regmap.h>
16 #include <linux/err.h>
17 #include <linux/gpio.h>
18 #include <linux/regulator/lp872x.h>
19 #include <linux/regulator/driver.h>
20 #include <linux/platform_device.h>
21 #include <linux/of.h>
22 #include <linux/of_gpio.h>
23 #include <linux/regulator/of_regulator.h>
24 
25 /* Registers : LP8720/8725 shared */
26 #define LP872X_GENERAL_CFG		0x00
27 #define LP872X_LDO1_VOUT		0x01
28 #define LP872X_LDO2_VOUT		0x02
29 #define LP872X_LDO3_VOUT		0x03
30 #define LP872X_LDO4_VOUT		0x04
31 #define LP872X_LDO5_VOUT		0x05
32 
33 /* Registers : LP8720 */
34 #define LP8720_BUCK_VOUT1		0x06
35 #define LP8720_BUCK_VOUT2		0x07
36 #define LP8720_ENABLE			0x08
37 
38 /* Registers : LP8725 */
39 #define LP8725_LILO1_VOUT		0x06
40 #define LP8725_LILO2_VOUT		0x07
41 #define LP8725_BUCK1_VOUT1		0x08
42 #define LP8725_BUCK1_VOUT2		0x09
43 #define LP8725_BUCK2_VOUT1		0x0A
44 #define LP8725_BUCK2_VOUT2		0x0B
45 #define LP8725_BUCK_CTRL		0x0C
46 #define LP8725_LDO_CTRL			0x0D
47 
48 /* Mask/shift : LP8720/LP8725 shared */
49 #define LP872X_VOUT_M			0x1F
50 #define LP872X_START_DELAY_M		0xE0
51 #define LP872X_START_DELAY_S		5
52 #define LP872X_EN_LDO1_M		BIT(0)
53 #define LP872X_EN_LDO2_M		BIT(1)
54 #define LP872X_EN_LDO3_M		BIT(2)
55 #define LP872X_EN_LDO4_M		BIT(3)
56 #define LP872X_EN_LDO5_M		BIT(4)
57 
58 /* Mask/shift : LP8720 */
59 #define LP8720_TIMESTEP_S		0		/* Addr 00h */
60 #define LP8720_TIMESTEP_M		BIT(0)
61 #define LP8720_EXT_DVS_M		BIT(2)
62 #define LP8720_BUCK_FPWM_S		5		/* Addr 07h */
63 #define LP8720_BUCK_FPWM_M		BIT(5)
64 #define LP8720_EN_BUCK_M		BIT(5)		/* Addr 08h */
65 #define LP8720_DVS_SEL_M		BIT(7)
66 
67 /* Mask/shift : LP8725 */
68 #define LP8725_TIMESTEP_M		0xC0		/* Addr 00h */
69 #define LP8725_TIMESTEP_S		6
70 #define LP8725_BUCK1_EN_M		BIT(0)
71 #define LP8725_DVS1_M			BIT(2)
72 #define LP8725_DVS2_M			BIT(3)
73 #define LP8725_BUCK2_EN_M		BIT(4)
74 #define LP8725_BUCK_CL_M		0xC0		/* Addr 09h, 0Bh */
75 #define LP8725_BUCK_CL_S		6
76 #define LP8725_BUCK1_FPWM_S		1		/* Addr 0Ch */
77 #define LP8725_BUCK1_FPWM_M		BIT(1)
78 #define LP8725_BUCK2_FPWM_S		5
79 #define LP8725_BUCK2_FPWM_M		BIT(5)
80 #define LP8725_EN_LILO1_M		BIT(5)		/* Addr 0Dh */
81 #define LP8725_EN_LILO2_M		BIT(6)
82 
83 /* PWM mode */
84 #define LP872X_FORCE_PWM		1
85 #define LP872X_AUTO_PWM			0
86 
87 #define LP8720_NUM_REGULATORS		6
88 #define LP8725_NUM_REGULATORS		9
89 #define EXTERN_DVS_USED			0
90 #define MAX_DELAY			6
91 
92 /* Default DVS Mode */
93 #define LP8720_DEFAULT_DVS		0
94 #define LP8725_DEFAULT_DVS		BIT(2)
95 
96 /* dump registers in regmap-debugfs */
97 #define MAX_REGISTERS			0x0F
98 
99 enum lp872x_id {
100 	LP8720,
101 	LP8725,
102 };
103 
104 struct lp872x {
105 	struct regmap *regmap;
106 	struct device *dev;
107 	enum lp872x_id chipid;
108 	struct lp872x_platform_data *pdata;
109 	int num_regulators;
110 	enum lp872x_dvs_state dvs_pin;
111 	int dvs_gpio;
112 };
113 
114 /* LP8720/LP8725 shared voltage table for LDOs */
115 static const unsigned int lp872x_ldo_vtbl[] = {
116 	1200000, 1250000, 1300000, 1350000, 1400000, 1450000, 1500000, 1550000,
117 	1600000, 1650000, 1700000, 1750000, 1800000, 1850000, 1900000, 2000000,
118 	2100000, 2200000, 2300000, 2400000, 2500000, 2600000, 2650000, 2700000,
119 	2750000, 2800000, 2850000, 2900000, 2950000, 3000000, 3100000, 3300000,
120 };
121 
122 /* LP8720 LDO4 voltage table */
123 static const unsigned int lp8720_ldo4_vtbl[] = {
124 	 800000,  850000,  900000, 1000000, 1100000, 1200000, 1250000, 1300000,
125 	1350000, 1400000, 1450000, 1500000, 1550000, 1600000, 1650000, 1700000,
126 	1750000, 1800000, 1850000, 1900000, 2000000, 2100000, 2200000, 2300000,
127 	2400000, 2500000, 2600000, 2650000, 2700000, 2750000, 2800000, 2850000,
128 };
129 
130 /* LP8725 LILO(Low Input Low Output) voltage table */
131 static const unsigned int lp8725_lilo_vtbl[] = {
132 	 800000,  850000,  900000,  950000, 1000000, 1050000, 1100000, 1150000,
133 	1200000, 1250000, 1300000, 1350000, 1400000, 1500000, 1600000, 1700000,
134 	1800000, 1900000, 2000000, 2100000, 2200000, 2300000, 2400000, 2500000,
135 	2600000, 2700000, 2800000, 2850000, 2900000, 3000000, 3100000, 3300000,
136 };
137 
138 /* LP8720 BUCK voltage table */
139 #define EXT_R		0	/* external resistor divider */
140 static const unsigned int lp8720_buck_vtbl[] = {
141 	  EXT_R,  800000,  850000,  900000,  950000, 1000000, 1050000, 1100000,
142 	1150000, 1200000, 1250000, 1300000, 1350000, 1400000, 1450000, 1500000,
143 	1550000, 1600000, 1650000, 1700000, 1750000, 1800000, 1850000, 1900000,
144 	1950000, 2000000, 2050000, 2100000, 2150000, 2200000, 2250000, 2300000,
145 };
146 
147 /* LP8725 BUCK voltage table */
148 static const unsigned int lp8725_buck_vtbl[] = {
149 	 800000,  850000,  900000,  950000, 1000000, 1050000, 1100000, 1150000,
150 	1200000, 1250000, 1300000, 1350000, 1400000, 1500000, 1600000, 1700000,
151 	1750000, 1800000, 1850000, 1900000, 2000000, 2100000, 2200000, 2300000,
152 	2400000, 2500000, 2600000, 2700000, 2800000, 2850000, 2900000, 3000000,
153 };
154 
155 /* LP8725 BUCK current limit */
156 static const unsigned int lp8725_buck_uA[] = {
157 	460000, 780000, 1050000, 1370000,
158 };
159 
160 static int lp872x_read_byte(struct lp872x *lp, u8 addr, u8 *data)
161 {
162 	int ret;
163 	unsigned int val;
164 
165 	ret = regmap_read(lp->regmap, addr, &val);
166 	if (ret < 0) {
167 		dev_err(lp->dev, "failed to read 0x%.2x\n", addr);
168 		return ret;
169 	}
170 
171 	*data = (u8)val;
172 	return 0;
173 }
174 
175 static inline int lp872x_write_byte(struct lp872x *lp, u8 addr, u8 data)
176 {
177 	return regmap_write(lp->regmap, addr, data);
178 }
179 
180 static inline int lp872x_update_bits(struct lp872x *lp, u8 addr,
181 				unsigned int mask, u8 data)
182 {
183 	return regmap_update_bits(lp->regmap, addr, mask, data);
184 }
185 
186 static int lp872x_get_timestep_usec(struct lp872x *lp)
187 {
188 	enum lp872x_id chip = lp->chipid;
189 	u8 val, mask, shift;
190 	int *time_usec, size, ret;
191 	int lp8720_time_usec[] = { 25, 50 };
192 	int lp8725_time_usec[] = { 32, 64, 128, 256 };
193 
194 	switch (chip) {
195 	case LP8720:
196 		mask = LP8720_TIMESTEP_M;
197 		shift = LP8720_TIMESTEP_S;
198 		time_usec = &lp8720_time_usec[0];
199 		size = ARRAY_SIZE(lp8720_time_usec);
200 		break;
201 	case LP8725:
202 		mask = LP8725_TIMESTEP_M;
203 		shift = LP8725_TIMESTEP_S;
204 		time_usec = &lp8725_time_usec[0];
205 		size = ARRAY_SIZE(lp8725_time_usec);
206 		break;
207 	default:
208 		return -EINVAL;
209 	}
210 
211 	ret = lp872x_read_byte(lp, LP872X_GENERAL_CFG, &val);
212 	if (ret)
213 		return ret;
214 
215 	val = (val & mask) >> shift;
216 	if (val >= size)
217 		return -EINVAL;
218 
219 	return *(time_usec + val);
220 }
221 
222 static int lp872x_regulator_enable_time(struct regulator_dev *rdev)
223 {
224 	struct lp872x *lp = rdev_get_drvdata(rdev);
225 	enum lp872x_regulator_id rid = rdev_get_id(rdev);
226 	int time_step_us = lp872x_get_timestep_usec(lp);
227 	int ret;
228 	u8 addr, val;
229 
230 	if (time_step_us < 0)
231 		return time_step_us;
232 
233 	switch (rid) {
234 	case LP8720_ID_LDO1 ... LP8720_ID_BUCK:
235 		addr = LP872X_LDO1_VOUT + rid;
236 		break;
237 	case LP8725_ID_LDO1 ... LP8725_ID_BUCK1:
238 		addr = LP872X_LDO1_VOUT + rid - LP8725_ID_BASE;
239 		break;
240 	case LP8725_ID_BUCK2:
241 		addr = LP8725_BUCK2_VOUT1;
242 		break;
243 	default:
244 		return -EINVAL;
245 	}
246 
247 	ret = lp872x_read_byte(lp, addr, &val);
248 	if (ret)
249 		return ret;
250 
251 	val = (val & LP872X_START_DELAY_M) >> LP872X_START_DELAY_S;
252 
253 	return val > MAX_DELAY ? 0 : val * time_step_us;
254 }
255 
256 static void lp872x_set_dvs(struct lp872x *lp, enum lp872x_dvs_sel dvs_sel,
257 			int gpio)
258 {
259 	enum lp872x_dvs_state state;
260 
261 	state = dvs_sel == SEL_V1 ? DVS_HIGH : DVS_LOW;
262 	gpio_set_value(gpio, state);
263 	lp->dvs_pin = state;
264 }
265 
266 static u8 lp872x_select_buck_vout_addr(struct lp872x *lp,
267 				enum lp872x_regulator_id buck)
268 {
269 	u8 val, addr;
270 
271 	if (lp872x_read_byte(lp, LP872X_GENERAL_CFG, &val))
272 		return 0;
273 
274 	switch (buck) {
275 	case LP8720_ID_BUCK:
276 		if (val & LP8720_EXT_DVS_M) {
277 			addr = (lp->dvs_pin == DVS_HIGH) ?
278 				LP8720_BUCK_VOUT1 : LP8720_BUCK_VOUT2;
279 		} else {
280 			if (lp872x_read_byte(lp, LP8720_ENABLE, &val))
281 				return 0;
282 
283 			addr = val & LP8720_DVS_SEL_M ?
284 				LP8720_BUCK_VOUT1 : LP8720_BUCK_VOUT2;
285 		}
286 		break;
287 	case LP8725_ID_BUCK1:
288 		if (val & LP8725_DVS1_M)
289 			addr = LP8725_BUCK1_VOUT1;
290 		else
291 			addr = (lp->dvs_pin == DVS_HIGH) ?
292 				LP8725_BUCK1_VOUT1 : LP8725_BUCK1_VOUT2;
293 		break;
294 	case LP8725_ID_BUCK2:
295 		addr =  val & LP8725_DVS2_M ?
296 			LP8725_BUCK2_VOUT1 : LP8725_BUCK2_VOUT2;
297 		break;
298 	default:
299 		return 0;
300 	}
301 
302 	return addr;
303 }
304 
305 static bool lp872x_is_valid_buck_addr(u8 addr)
306 {
307 	switch (addr) {
308 	case LP8720_BUCK_VOUT1:
309 	case LP8720_BUCK_VOUT2:
310 	case LP8725_BUCK1_VOUT1:
311 	case LP8725_BUCK1_VOUT2:
312 	case LP8725_BUCK2_VOUT1:
313 	case LP8725_BUCK2_VOUT2:
314 		return true;
315 	default:
316 		return false;
317 	}
318 }
319 
320 static int lp872x_buck_set_voltage_sel(struct regulator_dev *rdev,
321 					unsigned selector)
322 {
323 	struct lp872x *lp = rdev_get_drvdata(rdev);
324 	enum lp872x_regulator_id buck = rdev_get_id(rdev);
325 	u8 addr, mask = LP872X_VOUT_M;
326 	struct lp872x_dvs *dvs = lp->pdata ? lp->pdata->dvs : NULL;
327 
328 	if (dvs && gpio_is_valid(dvs->gpio))
329 		lp872x_set_dvs(lp, dvs->vsel, dvs->gpio);
330 
331 	addr = lp872x_select_buck_vout_addr(lp, buck);
332 	if (!lp872x_is_valid_buck_addr(addr))
333 		return -EINVAL;
334 
335 	return lp872x_update_bits(lp, addr, mask, selector);
336 }
337 
338 static int lp872x_buck_get_voltage_sel(struct regulator_dev *rdev)
339 {
340 	struct lp872x *lp = rdev_get_drvdata(rdev);
341 	enum lp872x_regulator_id buck = rdev_get_id(rdev);
342 	u8 addr, val;
343 	int ret;
344 
345 	addr = lp872x_select_buck_vout_addr(lp, buck);
346 	if (!lp872x_is_valid_buck_addr(addr))
347 		return -EINVAL;
348 
349 	ret = lp872x_read_byte(lp, addr, &val);
350 	if (ret)
351 		return ret;
352 
353 	return val & LP872X_VOUT_M;
354 }
355 
356 static int lp8725_buck_set_current_limit(struct regulator_dev *rdev,
357 					int min_uA, int max_uA)
358 {
359 	struct lp872x *lp = rdev_get_drvdata(rdev);
360 	enum lp872x_regulator_id buck = rdev_get_id(rdev);
361 	int i;
362 	u8 addr;
363 
364 	switch (buck) {
365 	case LP8725_ID_BUCK1:
366 		addr = LP8725_BUCK1_VOUT2;
367 		break;
368 	case LP8725_ID_BUCK2:
369 		addr = LP8725_BUCK2_VOUT2;
370 		break;
371 	default:
372 		return -EINVAL;
373 	}
374 
375 	for (i = ARRAY_SIZE(lp8725_buck_uA) - 1; i >= 0; i--) {
376 		if (lp8725_buck_uA[i] >= min_uA &&
377 			lp8725_buck_uA[i] <= max_uA)
378 			return lp872x_update_bits(lp, addr,
379 						  LP8725_BUCK_CL_M,
380 						  i << LP8725_BUCK_CL_S);
381 	}
382 
383 	return -EINVAL;
384 }
385 
386 static int lp8725_buck_get_current_limit(struct regulator_dev *rdev)
387 {
388 	struct lp872x *lp = rdev_get_drvdata(rdev);
389 	enum lp872x_regulator_id buck = rdev_get_id(rdev);
390 	u8 addr, val;
391 	int ret;
392 
393 	switch (buck) {
394 	case LP8725_ID_BUCK1:
395 		addr = LP8725_BUCK1_VOUT2;
396 		break;
397 	case LP8725_ID_BUCK2:
398 		addr = LP8725_BUCK2_VOUT2;
399 		break;
400 	default:
401 		return -EINVAL;
402 	}
403 
404 	ret = lp872x_read_byte(lp, addr, &val);
405 	if (ret)
406 		return ret;
407 
408 	val = (val & LP8725_BUCK_CL_M) >> LP8725_BUCK_CL_S;
409 
410 	return (val < ARRAY_SIZE(lp8725_buck_uA)) ?
411 			lp8725_buck_uA[val] : -EINVAL;
412 }
413 
414 static int lp872x_buck_set_mode(struct regulator_dev *rdev, unsigned int mode)
415 {
416 	struct lp872x *lp = rdev_get_drvdata(rdev);
417 	enum lp872x_regulator_id buck = rdev_get_id(rdev);
418 	u8 addr, mask, shift, val;
419 
420 	switch (buck) {
421 	case LP8720_ID_BUCK:
422 		addr = LP8720_BUCK_VOUT2;
423 		mask = LP8720_BUCK_FPWM_M;
424 		shift = LP8720_BUCK_FPWM_S;
425 		break;
426 	case LP8725_ID_BUCK1:
427 		addr = LP8725_BUCK_CTRL;
428 		mask = LP8725_BUCK1_FPWM_M;
429 		shift = LP8725_BUCK1_FPWM_S;
430 		break;
431 	case LP8725_ID_BUCK2:
432 		addr = LP8725_BUCK_CTRL;
433 		mask = LP8725_BUCK2_FPWM_M;
434 		shift = LP8725_BUCK2_FPWM_S;
435 		break;
436 	default:
437 		return -EINVAL;
438 	}
439 
440 	if (mode == REGULATOR_MODE_FAST)
441 		val = LP872X_FORCE_PWM << shift;
442 	else if (mode == REGULATOR_MODE_NORMAL)
443 		val = LP872X_AUTO_PWM << shift;
444 	else
445 		return -EINVAL;
446 
447 	return lp872x_update_bits(lp, addr, mask, val);
448 }
449 
450 static unsigned int lp872x_buck_get_mode(struct regulator_dev *rdev)
451 {
452 	struct lp872x *lp = rdev_get_drvdata(rdev);
453 	enum lp872x_regulator_id buck = rdev_get_id(rdev);
454 	u8 addr, mask, val;
455 	int ret;
456 
457 	switch (buck) {
458 	case LP8720_ID_BUCK:
459 		addr = LP8720_BUCK_VOUT2;
460 		mask = LP8720_BUCK_FPWM_M;
461 		break;
462 	case LP8725_ID_BUCK1:
463 		addr = LP8725_BUCK_CTRL;
464 		mask = LP8725_BUCK1_FPWM_M;
465 		break;
466 	case LP8725_ID_BUCK2:
467 		addr = LP8725_BUCK_CTRL;
468 		mask = LP8725_BUCK2_FPWM_M;
469 		break;
470 	default:
471 		return -EINVAL;
472 	}
473 
474 	ret = lp872x_read_byte(lp, addr, &val);
475 	if (ret)
476 		return ret;
477 
478 	return val & mask ? REGULATOR_MODE_FAST : REGULATOR_MODE_NORMAL;
479 }
480 
481 static struct regulator_ops lp872x_ldo_ops = {
482 	.list_voltage = regulator_list_voltage_table,
483 	.map_voltage = regulator_map_voltage_ascend,
484 	.set_voltage_sel = regulator_set_voltage_sel_regmap,
485 	.get_voltage_sel = regulator_get_voltage_sel_regmap,
486 	.enable = regulator_enable_regmap,
487 	.disable = regulator_disable_regmap,
488 	.is_enabled = regulator_is_enabled_regmap,
489 	.enable_time = lp872x_regulator_enable_time,
490 };
491 
492 static struct regulator_ops lp8720_buck_ops = {
493 	.list_voltage = regulator_list_voltage_table,
494 	.map_voltage = regulator_map_voltage_ascend,
495 	.set_voltage_sel = lp872x_buck_set_voltage_sel,
496 	.get_voltage_sel = lp872x_buck_get_voltage_sel,
497 	.enable = regulator_enable_regmap,
498 	.disable = regulator_disable_regmap,
499 	.is_enabled = regulator_is_enabled_regmap,
500 	.enable_time = lp872x_regulator_enable_time,
501 	.set_mode = lp872x_buck_set_mode,
502 	.get_mode = lp872x_buck_get_mode,
503 };
504 
505 static struct regulator_ops lp8725_buck_ops = {
506 	.list_voltage = regulator_list_voltage_table,
507 	.map_voltage = regulator_map_voltage_ascend,
508 	.set_voltage_sel = lp872x_buck_set_voltage_sel,
509 	.get_voltage_sel = lp872x_buck_get_voltage_sel,
510 	.enable = regulator_enable_regmap,
511 	.disable = regulator_disable_regmap,
512 	.is_enabled = regulator_is_enabled_regmap,
513 	.enable_time = lp872x_regulator_enable_time,
514 	.set_mode = lp872x_buck_set_mode,
515 	.get_mode = lp872x_buck_get_mode,
516 	.set_current_limit = lp8725_buck_set_current_limit,
517 	.get_current_limit = lp8725_buck_get_current_limit,
518 };
519 
520 static struct regulator_desc lp8720_regulator_desc[] = {
521 	{
522 		.name = "ldo1",
523 		.id = LP8720_ID_LDO1,
524 		.ops = &lp872x_ldo_ops,
525 		.n_voltages = ARRAY_SIZE(lp872x_ldo_vtbl),
526 		.volt_table = lp872x_ldo_vtbl,
527 		.type = REGULATOR_VOLTAGE,
528 		.owner = THIS_MODULE,
529 		.vsel_reg = LP872X_LDO1_VOUT,
530 		.vsel_mask = LP872X_VOUT_M,
531 		.enable_reg = LP8720_ENABLE,
532 		.enable_mask = LP872X_EN_LDO1_M,
533 	},
534 	{
535 		.name = "ldo2",
536 		.id = LP8720_ID_LDO2,
537 		.ops = &lp872x_ldo_ops,
538 		.n_voltages = ARRAY_SIZE(lp872x_ldo_vtbl),
539 		.volt_table = lp872x_ldo_vtbl,
540 		.type = REGULATOR_VOLTAGE,
541 		.owner = THIS_MODULE,
542 		.vsel_reg = LP872X_LDO2_VOUT,
543 		.vsel_mask = LP872X_VOUT_M,
544 		.enable_reg = LP8720_ENABLE,
545 		.enable_mask = LP872X_EN_LDO2_M,
546 	},
547 	{
548 		.name = "ldo3",
549 		.id = LP8720_ID_LDO3,
550 		.ops = &lp872x_ldo_ops,
551 		.n_voltages = ARRAY_SIZE(lp872x_ldo_vtbl),
552 		.volt_table = lp872x_ldo_vtbl,
553 		.type = REGULATOR_VOLTAGE,
554 		.owner = THIS_MODULE,
555 		.vsel_reg = LP872X_LDO3_VOUT,
556 		.vsel_mask = LP872X_VOUT_M,
557 		.enable_reg = LP8720_ENABLE,
558 		.enable_mask = LP872X_EN_LDO3_M,
559 	},
560 	{
561 		.name = "ldo4",
562 		.id = LP8720_ID_LDO4,
563 		.ops = &lp872x_ldo_ops,
564 		.n_voltages = ARRAY_SIZE(lp8720_ldo4_vtbl),
565 		.volt_table = lp8720_ldo4_vtbl,
566 		.type = REGULATOR_VOLTAGE,
567 		.owner = THIS_MODULE,
568 		.vsel_reg = LP872X_LDO4_VOUT,
569 		.vsel_mask = LP872X_VOUT_M,
570 		.enable_reg = LP8720_ENABLE,
571 		.enable_mask = LP872X_EN_LDO4_M,
572 	},
573 	{
574 		.name = "ldo5",
575 		.id = LP8720_ID_LDO5,
576 		.ops = &lp872x_ldo_ops,
577 		.n_voltages = ARRAY_SIZE(lp872x_ldo_vtbl),
578 		.volt_table = lp872x_ldo_vtbl,
579 		.type = REGULATOR_VOLTAGE,
580 		.owner = THIS_MODULE,
581 		.vsel_reg = LP872X_LDO5_VOUT,
582 		.vsel_mask = LP872X_VOUT_M,
583 		.enable_reg = LP8720_ENABLE,
584 		.enable_mask = LP872X_EN_LDO5_M,
585 	},
586 	{
587 		.name = "buck",
588 		.id = LP8720_ID_BUCK,
589 		.ops = &lp8720_buck_ops,
590 		.n_voltages = ARRAY_SIZE(lp8720_buck_vtbl),
591 		.volt_table = lp8720_buck_vtbl,
592 		.type = REGULATOR_VOLTAGE,
593 		.owner = THIS_MODULE,
594 		.enable_reg = LP8720_ENABLE,
595 		.enable_mask = LP8720_EN_BUCK_M,
596 	},
597 };
598 
599 static struct regulator_desc lp8725_regulator_desc[] = {
600 	{
601 		.name = "ldo1",
602 		.id = LP8725_ID_LDO1,
603 		.ops = &lp872x_ldo_ops,
604 		.n_voltages = ARRAY_SIZE(lp872x_ldo_vtbl),
605 		.volt_table = lp872x_ldo_vtbl,
606 		.type = REGULATOR_VOLTAGE,
607 		.owner = THIS_MODULE,
608 		.vsel_reg = LP872X_LDO1_VOUT,
609 		.vsel_mask = LP872X_VOUT_M,
610 		.enable_reg = LP8725_LDO_CTRL,
611 		.enable_mask = LP872X_EN_LDO1_M,
612 	},
613 	{
614 		.name = "ldo2",
615 		.id = LP8725_ID_LDO2,
616 		.ops = &lp872x_ldo_ops,
617 		.n_voltages = ARRAY_SIZE(lp872x_ldo_vtbl),
618 		.volt_table = lp872x_ldo_vtbl,
619 		.type = REGULATOR_VOLTAGE,
620 		.owner = THIS_MODULE,
621 		.vsel_reg = LP872X_LDO2_VOUT,
622 		.vsel_mask = LP872X_VOUT_M,
623 		.enable_reg = LP8725_LDO_CTRL,
624 		.enable_mask = LP872X_EN_LDO2_M,
625 	},
626 	{
627 		.name = "ldo3",
628 		.id = LP8725_ID_LDO3,
629 		.ops = &lp872x_ldo_ops,
630 		.n_voltages = ARRAY_SIZE(lp872x_ldo_vtbl),
631 		.volt_table = lp872x_ldo_vtbl,
632 		.type = REGULATOR_VOLTAGE,
633 		.owner = THIS_MODULE,
634 		.vsel_reg = LP872X_LDO3_VOUT,
635 		.vsel_mask = LP872X_VOUT_M,
636 		.enable_reg = LP8725_LDO_CTRL,
637 		.enable_mask = LP872X_EN_LDO3_M,
638 	},
639 	{
640 		.name = "ldo4",
641 		.id = LP8725_ID_LDO4,
642 		.ops = &lp872x_ldo_ops,
643 		.n_voltages = ARRAY_SIZE(lp872x_ldo_vtbl),
644 		.volt_table = lp872x_ldo_vtbl,
645 		.type = REGULATOR_VOLTAGE,
646 		.owner = THIS_MODULE,
647 		.vsel_reg = LP872X_LDO4_VOUT,
648 		.vsel_mask = LP872X_VOUT_M,
649 		.enable_reg = LP8725_LDO_CTRL,
650 		.enable_mask = LP872X_EN_LDO4_M,
651 	},
652 	{
653 		.name = "ldo5",
654 		.id = LP8725_ID_LDO5,
655 		.ops = &lp872x_ldo_ops,
656 		.n_voltages = ARRAY_SIZE(lp872x_ldo_vtbl),
657 		.volt_table = lp872x_ldo_vtbl,
658 		.type = REGULATOR_VOLTAGE,
659 		.owner = THIS_MODULE,
660 		.vsel_reg = LP872X_LDO5_VOUT,
661 		.vsel_mask = LP872X_VOUT_M,
662 		.enable_reg = LP8725_LDO_CTRL,
663 		.enable_mask = LP872X_EN_LDO5_M,
664 	},
665 	{
666 		.name = "lilo1",
667 		.id = LP8725_ID_LILO1,
668 		.ops = &lp872x_ldo_ops,
669 		.n_voltages = ARRAY_SIZE(lp8725_lilo_vtbl),
670 		.volt_table = lp8725_lilo_vtbl,
671 		.type = REGULATOR_VOLTAGE,
672 		.owner = THIS_MODULE,
673 		.vsel_reg = LP8725_LILO1_VOUT,
674 		.vsel_mask = LP872X_VOUT_M,
675 		.enable_reg = LP8725_LDO_CTRL,
676 		.enable_mask = LP8725_EN_LILO1_M,
677 	},
678 	{
679 		.name = "lilo2",
680 		.id = LP8725_ID_LILO2,
681 		.ops = &lp872x_ldo_ops,
682 		.n_voltages = ARRAY_SIZE(lp8725_lilo_vtbl),
683 		.volt_table = lp8725_lilo_vtbl,
684 		.type = REGULATOR_VOLTAGE,
685 		.owner = THIS_MODULE,
686 		.vsel_reg = LP8725_LILO2_VOUT,
687 		.vsel_mask = LP872X_VOUT_M,
688 		.enable_reg = LP8725_LDO_CTRL,
689 		.enable_mask = LP8725_EN_LILO2_M,
690 	},
691 	{
692 		.name = "buck1",
693 		.id = LP8725_ID_BUCK1,
694 		.ops = &lp8725_buck_ops,
695 		.n_voltages = ARRAY_SIZE(lp8725_buck_vtbl),
696 		.volt_table = lp8725_buck_vtbl,
697 		.type = REGULATOR_VOLTAGE,
698 		.owner = THIS_MODULE,
699 		.enable_reg = LP872X_GENERAL_CFG,
700 		.enable_mask = LP8725_BUCK1_EN_M,
701 	},
702 	{
703 		.name = "buck2",
704 		.id = LP8725_ID_BUCK2,
705 		.ops = &lp8725_buck_ops,
706 		.n_voltages = ARRAY_SIZE(lp8725_buck_vtbl),
707 		.volt_table = lp8725_buck_vtbl,
708 		.type = REGULATOR_VOLTAGE,
709 		.owner = THIS_MODULE,
710 		.enable_reg = LP872X_GENERAL_CFG,
711 		.enable_mask = LP8725_BUCK2_EN_M,
712 	},
713 };
714 
715 static int lp872x_init_dvs(struct lp872x *lp)
716 {
717 	int ret, gpio;
718 	struct lp872x_dvs *dvs = lp->pdata ? lp->pdata->dvs : NULL;
719 	enum lp872x_dvs_state pinstate;
720 	u8 mask[] = { LP8720_EXT_DVS_M, LP8725_DVS1_M | LP8725_DVS2_M };
721 	u8 default_dvs_mode[] = { LP8720_DEFAULT_DVS, LP8725_DEFAULT_DVS };
722 
723 	if (!dvs)
724 		goto set_default_dvs_mode;
725 
726 	gpio = dvs->gpio;
727 	if (!gpio_is_valid(gpio)) {
728 		dev_warn(lp->dev, "invalid gpio: %d\n", gpio);
729 		goto set_default_dvs_mode;
730 	}
731 
732 	pinstate = dvs->init_state;
733 	ret = devm_gpio_request_one(lp->dev, gpio, pinstate, "LP872X DVS");
734 	if (ret) {
735 		dev_err(lp->dev, "gpio request err: %d\n", ret);
736 		return ret;
737 	}
738 
739 	lp->dvs_pin = pinstate;
740 	lp->dvs_gpio = gpio;
741 
742 	return 0;
743 
744 set_default_dvs_mode:
745 	return lp872x_update_bits(lp, LP872X_GENERAL_CFG, mask[lp->chipid],
746 				default_dvs_mode[lp->chipid]);
747 }
748 
749 static int lp872x_config(struct lp872x *lp)
750 {
751 	struct lp872x_platform_data *pdata = lp->pdata;
752 	int ret;
753 
754 	if (!pdata || !pdata->update_config)
755 		goto init_dvs;
756 
757 	ret = lp872x_write_byte(lp, LP872X_GENERAL_CFG, pdata->general_config);
758 	if (ret)
759 		return ret;
760 
761 init_dvs:
762 	return lp872x_init_dvs(lp);
763 }
764 
765 static struct regulator_init_data
766 *lp872x_find_regulator_init_data(int id, struct lp872x *lp)
767 {
768 	struct lp872x_platform_data *pdata = lp->pdata;
769 	int i;
770 
771 	if (!pdata)
772 		return NULL;
773 
774 	for (i = 0; i < lp->num_regulators; i++) {
775 		if (pdata->regulator_data[i].id == id)
776 			return pdata->regulator_data[i].init_data;
777 	}
778 
779 	return NULL;
780 }
781 
782 static int lp872x_regulator_register(struct lp872x *lp)
783 {
784 	struct regulator_desc *desc;
785 	struct regulator_config cfg = { };
786 	struct regulator_dev *rdev;
787 	int i;
788 
789 	for (i = 0; i < lp->num_regulators; i++) {
790 		desc = (lp->chipid == LP8720) ? &lp8720_regulator_desc[i] :
791 						&lp8725_regulator_desc[i];
792 
793 		cfg.dev = lp->dev;
794 		cfg.init_data = lp872x_find_regulator_init_data(desc->id, lp);
795 		cfg.driver_data = lp;
796 		cfg.regmap = lp->regmap;
797 
798 		rdev = devm_regulator_register(lp->dev, desc, &cfg);
799 		if (IS_ERR(rdev)) {
800 			dev_err(lp->dev, "regulator register err");
801 			return PTR_ERR(rdev);
802 		}
803 	}
804 
805 	return 0;
806 }
807 
808 static const struct regmap_config lp872x_regmap_config = {
809 	.reg_bits = 8,
810 	.val_bits = 8,
811 	.max_register = MAX_REGISTERS,
812 };
813 
814 #ifdef CONFIG_OF
815 
816 #define LP872X_VALID_OPMODE	(REGULATOR_MODE_FAST | REGULATOR_MODE_NORMAL)
817 
818 static struct of_regulator_match lp8720_matches[] = {
819 	{ .name = "ldo1", .driver_data = (void *)LP8720_ID_LDO1, },
820 	{ .name = "ldo2", .driver_data = (void *)LP8720_ID_LDO2, },
821 	{ .name = "ldo3", .driver_data = (void *)LP8720_ID_LDO3, },
822 	{ .name = "ldo4", .driver_data = (void *)LP8720_ID_LDO4, },
823 	{ .name = "ldo5", .driver_data = (void *)LP8720_ID_LDO5, },
824 	{ .name = "buck", .driver_data = (void *)LP8720_ID_BUCK, },
825 };
826 
827 static struct of_regulator_match lp8725_matches[] = {
828 	{ .name = "ldo1", .driver_data = (void *)LP8725_ID_LDO1, },
829 	{ .name = "ldo2", .driver_data = (void *)LP8725_ID_LDO2, },
830 	{ .name = "ldo3", .driver_data = (void *)LP8725_ID_LDO3, },
831 	{ .name = "ldo4", .driver_data = (void *)LP8725_ID_LDO4, },
832 	{ .name = "ldo5", .driver_data = (void *)LP8725_ID_LDO5, },
833 	{ .name = "lilo1", .driver_data = (void *)LP8725_ID_LILO1, },
834 	{ .name = "lilo2", .driver_data = (void *)LP8725_ID_LILO2, },
835 	{ .name = "buck1", .driver_data = (void *)LP8725_ID_BUCK1, },
836 	{ .name = "buck2", .driver_data = (void *)LP8725_ID_BUCK2, },
837 };
838 
839 static struct lp872x_platform_data
840 *lp872x_populate_pdata_from_dt(struct device *dev, enum lp872x_id which)
841 {
842 	struct device_node *np = dev->of_node;
843 	struct lp872x_platform_data *pdata;
844 	struct of_regulator_match *match;
845 	int num_matches;
846 	int count;
847 	int i;
848 	u8 dvs_state;
849 
850 	pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
851 	if (!pdata)
852 		return ERR_PTR(-ENOMEM);
853 
854 	of_property_read_u8(np, "ti,general-config", &pdata->general_config);
855 	if (of_find_property(np, "ti,update-config", NULL))
856 		pdata->update_config = true;
857 
858 	pdata->dvs = devm_kzalloc(dev, sizeof(struct lp872x_dvs), GFP_KERNEL);
859 	if (!pdata->dvs)
860 		return ERR_PTR(-ENOMEM);
861 
862 	pdata->dvs->gpio = of_get_named_gpio(np, "ti,dvs-gpio", 0);
863 	of_property_read_u8(np, "ti,dvs-vsel", (u8 *)&pdata->dvs->vsel);
864 	of_property_read_u8(np, "ti,dvs-state", &dvs_state);
865 	pdata->dvs->init_state = dvs_state ? DVS_HIGH : DVS_LOW;
866 
867 	if (of_get_child_count(np) == 0)
868 		goto out;
869 
870 	switch (which) {
871 	case LP8720:
872 		match = lp8720_matches;
873 		num_matches = ARRAY_SIZE(lp8720_matches);
874 		break;
875 	case LP8725:
876 		match = lp8725_matches;
877 		num_matches = ARRAY_SIZE(lp8725_matches);
878 		break;
879 	default:
880 		goto out;
881 	}
882 
883 	count = of_regulator_match(dev, np, match, num_matches);
884 	if (count <= 0)
885 		goto out;
886 
887 	for (i = 0; i < num_matches; i++) {
888 		pdata->regulator_data[i].id =
889 				(enum lp872x_regulator_id)match[i].driver_data;
890 		pdata->regulator_data[i].init_data = match[i].init_data;
891 	}
892 out:
893 	return pdata;
894 }
895 #else
896 static struct lp872x_platform_data
897 *lp872x_populate_pdata_from_dt(struct device *dev, enum lp872x_id which)
898 {
899 	return NULL;
900 }
901 #endif
902 
903 static int lp872x_probe(struct i2c_client *cl, const struct i2c_device_id *id)
904 {
905 	struct lp872x *lp;
906 	struct lp872x_platform_data *pdata;
907 	int ret;
908 	const int lp872x_num_regulators[] = {
909 		[LP8720] = LP8720_NUM_REGULATORS,
910 		[LP8725] = LP8725_NUM_REGULATORS,
911 	};
912 
913 	if (cl->dev.of_node) {
914 		pdata = lp872x_populate_pdata_from_dt(&cl->dev,
915 					      (enum lp872x_id)id->driver_data);
916 		if (IS_ERR(pdata))
917 			return PTR_ERR(pdata);
918 	} else {
919 		pdata = dev_get_platdata(&cl->dev);
920 	}
921 
922 	lp = devm_kzalloc(&cl->dev, sizeof(struct lp872x), GFP_KERNEL);
923 	if (!lp)
924 		return -ENOMEM;
925 
926 	lp->num_regulators = lp872x_num_regulators[id->driver_data];
927 
928 	lp->regmap = devm_regmap_init_i2c(cl, &lp872x_regmap_config);
929 	if (IS_ERR(lp->regmap)) {
930 		ret = PTR_ERR(lp->regmap);
931 		dev_err(&cl->dev, "regmap init i2c err: %d\n", ret);
932 		return ret;
933 	}
934 
935 	lp->dev = &cl->dev;
936 	lp->pdata = pdata;
937 	lp->chipid = id->driver_data;
938 	i2c_set_clientdata(cl, lp);
939 
940 	ret = lp872x_config(lp);
941 	if (ret)
942 		return ret;
943 
944 	return lp872x_regulator_register(lp);
945 }
946 
947 static const struct of_device_id lp872x_dt_ids[] = {
948 	{ .compatible = "ti,lp8720", },
949 	{ .compatible = "ti,lp8725", },
950 	{ }
951 };
952 MODULE_DEVICE_TABLE(of, lp872x_dt_ids);
953 
954 static const struct i2c_device_id lp872x_ids[] = {
955 	{"lp8720", LP8720},
956 	{"lp8725", LP8725},
957 	{ }
958 };
959 MODULE_DEVICE_TABLE(i2c, lp872x_ids);
960 
961 static struct i2c_driver lp872x_driver = {
962 	.driver = {
963 		.name = "lp872x",
964 		.of_match_table = of_match_ptr(lp872x_dt_ids),
965 	},
966 	.probe = lp872x_probe,
967 	.id_table = lp872x_ids,
968 };
969 
970 module_i2c_driver(lp872x_driver);
971 
972 MODULE_DESCRIPTION("TI/National Semiconductor LP872x PMU Regulator Driver");
973 MODULE_AUTHOR("Milo Kim");
974 MODULE_LICENSE("GPL");
975