xref: /openbmc/linux/drivers/regulator/lp872x.c (revision d4fd6347)
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/delay.h>
19 #include <linux/regulator/lp872x.h>
20 #include <linux/regulator/driver.h>
21 #include <linux/platform_device.h>
22 #include <linux/of.h>
23 #include <linux/of_gpio.h>
24 #include <linux/regulator/of_regulator.h>
25 
26 /* Registers : LP8720/8725 shared */
27 #define LP872X_GENERAL_CFG		0x00
28 #define LP872X_LDO1_VOUT		0x01
29 #define LP872X_LDO2_VOUT		0x02
30 #define LP872X_LDO3_VOUT		0x03
31 #define LP872X_LDO4_VOUT		0x04
32 #define LP872X_LDO5_VOUT		0x05
33 
34 /* Registers : LP8720 */
35 #define LP8720_BUCK_VOUT1		0x06
36 #define LP8720_BUCK_VOUT2		0x07
37 #define LP8720_ENABLE			0x08
38 
39 /* Registers : LP8725 */
40 #define LP8725_LILO1_VOUT		0x06
41 #define LP8725_LILO2_VOUT		0x07
42 #define LP8725_BUCK1_VOUT1		0x08
43 #define LP8725_BUCK1_VOUT2		0x09
44 #define LP8725_BUCK2_VOUT1		0x0A
45 #define LP8725_BUCK2_VOUT2		0x0B
46 #define LP8725_BUCK_CTRL		0x0C
47 #define LP8725_LDO_CTRL			0x0D
48 
49 /* Mask/shift : LP8720/LP8725 shared */
50 #define LP872X_VOUT_M			0x1F
51 #define LP872X_START_DELAY_M		0xE0
52 #define LP872X_START_DELAY_S		5
53 #define LP872X_EN_LDO1_M		BIT(0)
54 #define LP872X_EN_LDO2_M		BIT(1)
55 #define LP872X_EN_LDO3_M		BIT(2)
56 #define LP872X_EN_LDO4_M		BIT(3)
57 #define LP872X_EN_LDO5_M		BIT(4)
58 
59 /* Mask/shift : LP8720 */
60 #define LP8720_TIMESTEP_S		0		/* Addr 00h */
61 #define LP8720_TIMESTEP_M		BIT(0)
62 #define LP8720_EXT_DVS_M		BIT(2)
63 #define LP8720_BUCK_FPWM_S		5		/* Addr 07h */
64 #define LP8720_BUCK_FPWM_M		BIT(5)
65 #define LP8720_EN_BUCK_M		BIT(5)		/* Addr 08h */
66 #define LP8720_DVS_SEL_M		BIT(7)
67 
68 /* Mask/shift : LP8725 */
69 #define LP8725_TIMESTEP_M		0xC0		/* Addr 00h */
70 #define LP8725_TIMESTEP_S		6
71 #define LP8725_BUCK1_EN_M		BIT(0)
72 #define LP8725_DVS1_M			BIT(2)
73 #define LP8725_DVS2_M			BIT(3)
74 #define LP8725_BUCK2_EN_M		BIT(4)
75 #define LP8725_BUCK_CL_M		0xC0		/* Addr 09h, 0Bh */
76 #define LP8725_BUCK_CL_S		6
77 #define LP8725_BUCK1_FPWM_S		1		/* Addr 0Ch */
78 #define LP8725_BUCK1_FPWM_M		BIT(1)
79 #define LP8725_BUCK2_FPWM_S		5
80 #define LP8725_BUCK2_FPWM_M		BIT(5)
81 #define LP8725_EN_LILO1_M		BIT(5)		/* Addr 0Dh */
82 #define LP8725_EN_LILO2_M		BIT(6)
83 
84 /* PWM mode */
85 #define LP872X_FORCE_PWM		1
86 #define LP872X_AUTO_PWM			0
87 
88 #define LP8720_NUM_REGULATORS		6
89 #define LP8725_NUM_REGULATORS		9
90 #define EXTERN_DVS_USED			0
91 #define MAX_DELAY			6
92 
93 /* Default DVS Mode */
94 #define LP8720_DEFAULT_DVS		0
95 #define LP8725_DEFAULT_DVS		BIT(2)
96 
97 /* dump registers in regmap-debugfs */
98 #define MAX_REGISTERS			0x0F
99 
100 enum lp872x_id {
101 	LP8720,
102 	LP8725,
103 };
104 
105 struct lp872x {
106 	struct regmap *regmap;
107 	struct device *dev;
108 	enum lp872x_id chipid;
109 	struct lp872x_platform_data *pdata;
110 	int num_regulators;
111 	enum lp872x_dvs_state dvs_pin;
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 lp872x_buck_set_mode(struct regulator_dev *rdev, unsigned int mode)
357 {
358 	struct lp872x *lp = rdev_get_drvdata(rdev);
359 	enum lp872x_regulator_id buck = rdev_get_id(rdev);
360 	u8 addr, mask, shift, val;
361 
362 	switch (buck) {
363 	case LP8720_ID_BUCK:
364 		addr = LP8720_BUCK_VOUT2;
365 		mask = LP8720_BUCK_FPWM_M;
366 		shift = LP8720_BUCK_FPWM_S;
367 		break;
368 	case LP8725_ID_BUCK1:
369 		addr = LP8725_BUCK_CTRL;
370 		mask = LP8725_BUCK1_FPWM_M;
371 		shift = LP8725_BUCK1_FPWM_S;
372 		break;
373 	case LP8725_ID_BUCK2:
374 		addr = LP8725_BUCK_CTRL;
375 		mask = LP8725_BUCK2_FPWM_M;
376 		shift = LP8725_BUCK2_FPWM_S;
377 		break;
378 	default:
379 		return -EINVAL;
380 	}
381 
382 	if (mode == REGULATOR_MODE_FAST)
383 		val = LP872X_FORCE_PWM << shift;
384 	else if (mode == REGULATOR_MODE_NORMAL)
385 		val = LP872X_AUTO_PWM << shift;
386 	else
387 		return -EINVAL;
388 
389 	return lp872x_update_bits(lp, addr, mask, val);
390 }
391 
392 static unsigned int lp872x_buck_get_mode(struct regulator_dev *rdev)
393 {
394 	struct lp872x *lp = rdev_get_drvdata(rdev);
395 	enum lp872x_regulator_id buck = rdev_get_id(rdev);
396 	u8 addr, mask, val;
397 	int ret;
398 
399 	switch (buck) {
400 	case LP8720_ID_BUCK:
401 		addr = LP8720_BUCK_VOUT2;
402 		mask = LP8720_BUCK_FPWM_M;
403 		break;
404 	case LP8725_ID_BUCK1:
405 		addr = LP8725_BUCK_CTRL;
406 		mask = LP8725_BUCK1_FPWM_M;
407 		break;
408 	case LP8725_ID_BUCK2:
409 		addr = LP8725_BUCK_CTRL;
410 		mask = LP8725_BUCK2_FPWM_M;
411 		break;
412 	default:
413 		return -EINVAL;
414 	}
415 
416 	ret = lp872x_read_byte(lp, addr, &val);
417 	if (ret)
418 		return ret;
419 
420 	return val & mask ? REGULATOR_MODE_FAST : REGULATOR_MODE_NORMAL;
421 }
422 
423 static const struct regulator_ops lp872x_ldo_ops = {
424 	.list_voltage = regulator_list_voltage_table,
425 	.map_voltage = regulator_map_voltage_ascend,
426 	.set_voltage_sel = regulator_set_voltage_sel_regmap,
427 	.get_voltage_sel = regulator_get_voltage_sel_regmap,
428 	.enable = regulator_enable_regmap,
429 	.disable = regulator_disable_regmap,
430 	.is_enabled = regulator_is_enabled_regmap,
431 	.enable_time = lp872x_regulator_enable_time,
432 };
433 
434 static const struct regulator_ops lp8720_buck_ops = {
435 	.list_voltage = regulator_list_voltage_table,
436 	.map_voltage = regulator_map_voltage_ascend,
437 	.set_voltage_sel = lp872x_buck_set_voltage_sel,
438 	.get_voltage_sel = lp872x_buck_get_voltage_sel,
439 	.enable = regulator_enable_regmap,
440 	.disable = regulator_disable_regmap,
441 	.is_enabled = regulator_is_enabled_regmap,
442 	.enable_time = lp872x_regulator_enable_time,
443 	.set_mode = lp872x_buck_set_mode,
444 	.get_mode = lp872x_buck_get_mode,
445 };
446 
447 static const struct regulator_ops lp8725_buck_ops = {
448 	.list_voltage = regulator_list_voltage_table,
449 	.map_voltage = regulator_map_voltage_ascend,
450 	.set_voltage_sel = lp872x_buck_set_voltage_sel,
451 	.get_voltage_sel = lp872x_buck_get_voltage_sel,
452 	.enable = regulator_enable_regmap,
453 	.disable = regulator_disable_regmap,
454 	.is_enabled = regulator_is_enabled_regmap,
455 	.enable_time = lp872x_regulator_enable_time,
456 	.set_mode = lp872x_buck_set_mode,
457 	.get_mode = lp872x_buck_get_mode,
458 	.set_current_limit = regulator_set_current_limit_regmap,
459 	.get_current_limit = regulator_get_current_limit_regmap,
460 };
461 
462 static const struct regulator_desc lp8720_regulator_desc[] = {
463 	{
464 		.name = "ldo1",
465 		.of_match = of_match_ptr("ldo1"),
466 		.id = LP8720_ID_LDO1,
467 		.ops = &lp872x_ldo_ops,
468 		.n_voltages = ARRAY_SIZE(lp872x_ldo_vtbl),
469 		.volt_table = lp872x_ldo_vtbl,
470 		.type = REGULATOR_VOLTAGE,
471 		.owner = THIS_MODULE,
472 		.vsel_reg = LP872X_LDO1_VOUT,
473 		.vsel_mask = LP872X_VOUT_M,
474 		.enable_reg = LP8720_ENABLE,
475 		.enable_mask = LP872X_EN_LDO1_M,
476 	},
477 	{
478 		.name = "ldo2",
479 		.of_match = of_match_ptr("ldo2"),
480 		.id = LP8720_ID_LDO2,
481 		.ops = &lp872x_ldo_ops,
482 		.n_voltages = ARRAY_SIZE(lp872x_ldo_vtbl),
483 		.volt_table = lp872x_ldo_vtbl,
484 		.type = REGULATOR_VOLTAGE,
485 		.owner = THIS_MODULE,
486 		.vsel_reg = LP872X_LDO2_VOUT,
487 		.vsel_mask = LP872X_VOUT_M,
488 		.enable_reg = LP8720_ENABLE,
489 		.enable_mask = LP872X_EN_LDO2_M,
490 	},
491 	{
492 		.name = "ldo3",
493 		.of_match = of_match_ptr("ldo3"),
494 		.id = LP8720_ID_LDO3,
495 		.ops = &lp872x_ldo_ops,
496 		.n_voltages = ARRAY_SIZE(lp872x_ldo_vtbl),
497 		.volt_table = lp872x_ldo_vtbl,
498 		.type = REGULATOR_VOLTAGE,
499 		.owner = THIS_MODULE,
500 		.vsel_reg = LP872X_LDO3_VOUT,
501 		.vsel_mask = LP872X_VOUT_M,
502 		.enable_reg = LP8720_ENABLE,
503 		.enable_mask = LP872X_EN_LDO3_M,
504 	},
505 	{
506 		.name = "ldo4",
507 		.of_match = of_match_ptr("ldo4"),
508 		.id = LP8720_ID_LDO4,
509 		.ops = &lp872x_ldo_ops,
510 		.n_voltages = ARRAY_SIZE(lp8720_ldo4_vtbl),
511 		.volt_table = lp8720_ldo4_vtbl,
512 		.type = REGULATOR_VOLTAGE,
513 		.owner = THIS_MODULE,
514 		.vsel_reg = LP872X_LDO4_VOUT,
515 		.vsel_mask = LP872X_VOUT_M,
516 		.enable_reg = LP8720_ENABLE,
517 		.enable_mask = LP872X_EN_LDO4_M,
518 	},
519 	{
520 		.name = "ldo5",
521 		.of_match = of_match_ptr("ldo5"),
522 		.id = LP8720_ID_LDO5,
523 		.ops = &lp872x_ldo_ops,
524 		.n_voltages = ARRAY_SIZE(lp872x_ldo_vtbl),
525 		.volt_table = lp872x_ldo_vtbl,
526 		.type = REGULATOR_VOLTAGE,
527 		.owner = THIS_MODULE,
528 		.vsel_reg = LP872X_LDO5_VOUT,
529 		.vsel_mask = LP872X_VOUT_M,
530 		.enable_reg = LP8720_ENABLE,
531 		.enable_mask = LP872X_EN_LDO5_M,
532 	},
533 	{
534 		.name = "buck",
535 		.of_match = of_match_ptr("buck"),
536 		.id = LP8720_ID_BUCK,
537 		.ops = &lp8720_buck_ops,
538 		.n_voltages = ARRAY_SIZE(lp8720_buck_vtbl),
539 		.volt_table = lp8720_buck_vtbl,
540 		.type = REGULATOR_VOLTAGE,
541 		.owner = THIS_MODULE,
542 		.enable_reg = LP8720_ENABLE,
543 		.enable_mask = LP8720_EN_BUCK_M,
544 	},
545 };
546 
547 static const struct regulator_desc lp8725_regulator_desc[] = {
548 	{
549 		.name = "ldo1",
550 		.of_match = of_match_ptr("ldo1"),
551 		.id = LP8725_ID_LDO1,
552 		.ops = &lp872x_ldo_ops,
553 		.n_voltages = ARRAY_SIZE(lp872x_ldo_vtbl),
554 		.volt_table = lp872x_ldo_vtbl,
555 		.type = REGULATOR_VOLTAGE,
556 		.owner = THIS_MODULE,
557 		.vsel_reg = LP872X_LDO1_VOUT,
558 		.vsel_mask = LP872X_VOUT_M,
559 		.enable_reg = LP8725_LDO_CTRL,
560 		.enable_mask = LP872X_EN_LDO1_M,
561 	},
562 	{
563 		.name = "ldo2",
564 		.of_match = of_match_ptr("ldo2"),
565 		.id = LP8725_ID_LDO2,
566 		.ops = &lp872x_ldo_ops,
567 		.n_voltages = ARRAY_SIZE(lp872x_ldo_vtbl),
568 		.volt_table = lp872x_ldo_vtbl,
569 		.type = REGULATOR_VOLTAGE,
570 		.owner = THIS_MODULE,
571 		.vsel_reg = LP872X_LDO2_VOUT,
572 		.vsel_mask = LP872X_VOUT_M,
573 		.enable_reg = LP8725_LDO_CTRL,
574 		.enable_mask = LP872X_EN_LDO2_M,
575 	},
576 	{
577 		.name = "ldo3",
578 		.of_match = of_match_ptr("ldo3"),
579 		.id = LP8725_ID_LDO3,
580 		.ops = &lp872x_ldo_ops,
581 		.n_voltages = ARRAY_SIZE(lp872x_ldo_vtbl),
582 		.volt_table = lp872x_ldo_vtbl,
583 		.type = REGULATOR_VOLTAGE,
584 		.owner = THIS_MODULE,
585 		.vsel_reg = LP872X_LDO3_VOUT,
586 		.vsel_mask = LP872X_VOUT_M,
587 		.enable_reg = LP8725_LDO_CTRL,
588 		.enable_mask = LP872X_EN_LDO3_M,
589 	},
590 	{
591 		.name = "ldo4",
592 		.of_match = of_match_ptr("ldo4"),
593 		.id = LP8725_ID_LDO4,
594 		.ops = &lp872x_ldo_ops,
595 		.n_voltages = ARRAY_SIZE(lp872x_ldo_vtbl),
596 		.volt_table = lp872x_ldo_vtbl,
597 		.type = REGULATOR_VOLTAGE,
598 		.owner = THIS_MODULE,
599 		.vsel_reg = LP872X_LDO4_VOUT,
600 		.vsel_mask = LP872X_VOUT_M,
601 		.enable_reg = LP8725_LDO_CTRL,
602 		.enable_mask = LP872X_EN_LDO4_M,
603 	},
604 	{
605 		.name = "ldo5",
606 		.of_match = of_match_ptr("ldo5"),
607 		.id = LP8725_ID_LDO5,
608 		.ops = &lp872x_ldo_ops,
609 		.n_voltages = ARRAY_SIZE(lp872x_ldo_vtbl),
610 		.volt_table = lp872x_ldo_vtbl,
611 		.type = REGULATOR_VOLTAGE,
612 		.owner = THIS_MODULE,
613 		.vsel_reg = LP872X_LDO5_VOUT,
614 		.vsel_mask = LP872X_VOUT_M,
615 		.enable_reg = LP8725_LDO_CTRL,
616 		.enable_mask = LP872X_EN_LDO5_M,
617 	},
618 	{
619 		.name = "lilo1",
620 		.of_match = of_match_ptr("lilo1"),
621 		.id = LP8725_ID_LILO1,
622 		.ops = &lp872x_ldo_ops,
623 		.n_voltages = ARRAY_SIZE(lp8725_lilo_vtbl),
624 		.volt_table = lp8725_lilo_vtbl,
625 		.type = REGULATOR_VOLTAGE,
626 		.owner = THIS_MODULE,
627 		.vsel_reg = LP8725_LILO1_VOUT,
628 		.vsel_mask = LP872X_VOUT_M,
629 		.enable_reg = LP8725_LDO_CTRL,
630 		.enable_mask = LP8725_EN_LILO1_M,
631 	},
632 	{
633 		.name = "lilo2",
634 		.of_match = of_match_ptr("lilo2"),
635 		.id = LP8725_ID_LILO2,
636 		.ops = &lp872x_ldo_ops,
637 		.n_voltages = ARRAY_SIZE(lp8725_lilo_vtbl),
638 		.volt_table = lp8725_lilo_vtbl,
639 		.type = REGULATOR_VOLTAGE,
640 		.owner = THIS_MODULE,
641 		.vsel_reg = LP8725_LILO2_VOUT,
642 		.vsel_mask = LP872X_VOUT_M,
643 		.enable_reg = LP8725_LDO_CTRL,
644 		.enable_mask = LP8725_EN_LILO2_M,
645 	},
646 	{
647 		.name = "buck1",
648 		.of_match = of_match_ptr("buck1"),
649 		.id = LP8725_ID_BUCK1,
650 		.ops = &lp8725_buck_ops,
651 		.n_voltages = ARRAY_SIZE(lp8725_buck_vtbl),
652 		.volt_table = lp8725_buck_vtbl,
653 		.type = REGULATOR_VOLTAGE,
654 		.owner = THIS_MODULE,
655 		.enable_reg = LP872X_GENERAL_CFG,
656 		.enable_mask = LP8725_BUCK1_EN_M,
657 		.curr_table = lp8725_buck_uA,
658 		.n_current_limits = ARRAY_SIZE(lp8725_buck_uA),
659 		.csel_reg = LP8725_BUCK1_VOUT2,
660 		.csel_mask = LP8725_BUCK_CL_M,
661 	},
662 	{
663 		.name = "buck2",
664 		.of_match = of_match_ptr("buck2"),
665 		.id = LP8725_ID_BUCK2,
666 		.ops = &lp8725_buck_ops,
667 		.n_voltages = ARRAY_SIZE(lp8725_buck_vtbl),
668 		.volt_table = lp8725_buck_vtbl,
669 		.type = REGULATOR_VOLTAGE,
670 		.owner = THIS_MODULE,
671 		.enable_reg = LP872X_GENERAL_CFG,
672 		.enable_mask = LP8725_BUCK2_EN_M,
673 		.curr_table = lp8725_buck_uA,
674 		.n_current_limits = ARRAY_SIZE(lp8725_buck_uA),
675 		.csel_reg = LP8725_BUCK2_VOUT2,
676 		.csel_mask = LP8725_BUCK_CL_M,
677 	},
678 };
679 
680 static int lp872x_init_dvs(struct lp872x *lp)
681 {
682 	int ret, gpio;
683 	struct lp872x_dvs *dvs = lp->pdata ? lp->pdata->dvs : NULL;
684 	enum lp872x_dvs_state pinstate;
685 	u8 mask[] = { LP8720_EXT_DVS_M, LP8725_DVS1_M | LP8725_DVS2_M };
686 	u8 default_dvs_mode[] = { LP8720_DEFAULT_DVS, LP8725_DEFAULT_DVS };
687 
688 	if (!dvs)
689 		goto set_default_dvs_mode;
690 
691 	gpio = dvs->gpio;
692 	if (!gpio_is_valid(gpio))
693 		goto set_default_dvs_mode;
694 
695 	pinstate = dvs->init_state;
696 	ret = devm_gpio_request_one(lp->dev, gpio, pinstate, "LP872X DVS");
697 	if (ret) {
698 		dev_err(lp->dev, "gpio request err: %d\n", ret);
699 		return ret;
700 	}
701 
702 	lp->dvs_pin = pinstate;
703 
704 	return 0;
705 
706 set_default_dvs_mode:
707 	return lp872x_update_bits(lp, LP872X_GENERAL_CFG, mask[lp->chipid],
708 				default_dvs_mode[lp->chipid]);
709 }
710 
711 static int lp872x_hw_enable(struct lp872x *lp)
712 {
713 	int ret, gpio;
714 
715 	if (!lp->pdata)
716 		return -EINVAL;
717 
718 	gpio = lp->pdata->enable_gpio;
719 	if (!gpio_is_valid(gpio))
720 		return 0;
721 
722 	/* Always set enable GPIO high. */
723 	ret = devm_gpio_request_one(lp->dev, gpio, GPIOF_OUT_INIT_HIGH, "LP872X EN");
724 	if (ret) {
725 		dev_err(lp->dev, "gpio request err: %d\n", ret);
726 		return ret;
727 	}
728 
729 	/* Each chip has a different enable delay. */
730 	if (lp->chipid == LP8720)
731 		usleep_range(LP8720_ENABLE_DELAY, 1.5 * LP8720_ENABLE_DELAY);
732 	else
733 		usleep_range(LP8725_ENABLE_DELAY, 1.5 * LP8725_ENABLE_DELAY);
734 
735 	return 0;
736 }
737 
738 static int lp872x_config(struct lp872x *lp)
739 {
740 	struct lp872x_platform_data *pdata = lp->pdata;
741 	int ret;
742 
743 	if (!pdata || !pdata->update_config)
744 		goto init_dvs;
745 
746 	ret = lp872x_write_byte(lp, LP872X_GENERAL_CFG, pdata->general_config);
747 	if (ret)
748 		return ret;
749 
750 init_dvs:
751 	return lp872x_init_dvs(lp);
752 }
753 
754 static struct regulator_init_data
755 *lp872x_find_regulator_init_data(int id, struct lp872x *lp)
756 {
757 	struct lp872x_platform_data *pdata = lp->pdata;
758 	int i;
759 
760 	if (!pdata)
761 		return NULL;
762 
763 	for (i = 0; i < lp->num_regulators; i++) {
764 		if (pdata->regulator_data[i].id == id)
765 			return pdata->regulator_data[i].init_data;
766 	}
767 
768 	return NULL;
769 }
770 
771 static int lp872x_regulator_register(struct lp872x *lp)
772 {
773 	const struct regulator_desc *desc;
774 	struct regulator_config cfg = { };
775 	struct regulator_dev *rdev;
776 	int i;
777 
778 	for (i = 0; i < lp->num_regulators; i++) {
779 		desc = (lp->chipid == LP8720) ? &lp8720_regulator_desc[i] :
780 						&lp8725_regulator_desc[i];
781 
782 		cfg.dev = lp->dev;
783 		cfg.init_data = lp872x_find_regulator_init_data(desc->id, lp);
784 		cfg.driver_data = lp;
785 		cfg.regmap = lp->regmap;
786 
787 		rdev = devm_regulator_register(lp->dev, desc, &cfg);
788 		if (IS_ERR(rdev)) {
789 			dev_err(lp->dev, "regulator register err");
790 			return PTR_ERR(rdev);
791 		}
792 	}
793 
794 	return 0;
795 }
796 
797 static const struct regmap_config lp872x_regmap_config = {
798 	.reg_bits = 8,
799 	.val_bits = 8,
800 	.max_register = MAX_REGISTERS,
801 };
802 
803 #ifdef CONFIG_OF
804 
805 #define LP872X_VALID_OPMODE	(REGULATOR_MODE_FAST | REGULATOR_MODE_NORMAL)
806 
807 static struct of_regulator_match lp8720_matches[] = {
808 	{ .name = "ldo1", .driver_data = (void *)LP8720_ID_LDO1, },
809 	{ .name = "ldo2", .driver_data = (void *)LP8720_ID_LDO2, },
810 	{ .name = "ldo3", .driver_data = (void *)LP8720_ID_LDO3, },
811 	{ .name = "ldo4", .driver_data = (void *)LP8720_ID_LDO4, },
812 	{ .name = "ldo5", .driver_data = (void *)LP8720_ID_LDO5, },
813 	{ .name = "buck", .driver_data = (void *)LP8720_ID_BUCK, },
814 };
815 
816 static struct of_regulator_match lp8725_matches[] = {
817 	{ .name = "ldo1", .driver_data = (void *)LP8725_ID_LDO1, },
818 	{ .name = "ldo2", .driver_data = (void *)LP8725_ID_LDO2, },
819 	{ .name = "ldo3", .driver_data = (void *)LP8725_ID_LDO3, },
820 	{ .name = "ldo4", .driver_data = (void *)LP8725_ID_LDO4, },
821 	{ .name = "ldo5", .driver_data = (void *)LP8725_ID_LDO5, },
822 	{ .name = "lilo1", .driver_data = (void *)LP8725_ID_LILO1, },
823 	{ .name = "lilo2", .driver_data = (void *)LP8725_ID_LILO2, },
824 	{ .name = "buck1", .driver_data = (void *)LP8725_ID_BUCK1, },
825 	{ .name = "buck2", .driver_data = (void *)LP8725_ID_BUCK2, },
826 };
827 
828 static struct lp872x_platform_data
829 *lp872x_populate_pdata_from_dt(struct device *dev, enum lp872x_id which)
830 {
831 	struct device_node *np = dev->of_node;
832 	struct lp872x_platform_data *pdata;
833 	struct of_regulator_match *match;
834 	int num_matches;
835 	int count;
836 	int i;
837 	u8 dvs_state;
838 
839 	pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
840 	if (!pdata)
841 		return ERR_PTR(-ENOMEM);
842 
843 	of_property_read_u8(np, "ti,general-config", &pdata->general_config);
844 	if (of_find_property(np, "ti,update-config", NULL))
845 		pdata->update_config = true;
846 
847 	pdata->dvs = devm_kzalloc(dev, sizeof(struct lp872x_dvs), GFP_KERNEL);
848 	if (!pdata->dvs)
849 		return ERR_PTR(-ENOMEM);
850 
851 	pdata->dvs->gpio = of_get_named_gpio(np, "ti,dvs-gpio", 0);
852 	of_property_read_u8(np, "ti,dvs-vsel", (u8 *)&pdata->dvs->vsel);
853 	of_property_read_u8(np, "ti,dvs-state", &dvs_state);
854 	pdata->dvs->init_state = dvs_state ? DVS_HIGH : DVS_LOW;
855 
856 	pdata->enable_gpio = of_get_named_gpio(np, "enable-gpios", 0);
857 
858 	if (of_get_child_count(np) == 0)
859 		goto out;
860 
861 	switch (which) {
862 	case LP8720:
863 		match = lp8720_matches;
864 		num_matches = ARRAY_SIZE(lp8720_matches);
865 		break;
866 	case LP8725:
867 		match = lp8725_matches;
868 		num_matches = ARRAY_SIZE(lp8725_matches);
869 		break;
870 	default:
871 		goto out;
872 	}
873 
874 	count = of_regulator_match(dev, np, match, num_matches);
875 	if (count <= 0)
876 		goto out;
877 
878 	for (i = 0; i < num_matches; i++) {
879 		pdata->regulator_data[i].id =
880 				(enum lp872x_regulator_id)match[i].driver_data;
881 		pdata->regulator_data[i].init_data = match[i].init_data;
882 	}
883 out:
884 	return pdata;
885 }
886 #else
887 static struct lp872x_platform_data
888 *lp872x_populate_pdata_from_dt(struct device *dev, enum lp872x_id which)
889 {
890 	return NULL;
891 }
892 #endif
893 
894 static int lp872x_probe(struct i2c_client *cl, const struct i2c_device_id *id)
895 {
896 	struct lp872x *lp;
897 	struct lp872x_platform_data *pdata;
898 	int ret;
899 	const int lp872x_num_regulators[] = {
900 		[LP8720] = LP8720_NUM_REGULATORS,
901 		[LP8725] = LP8725_NUM_REGULATORS,
902 	};
903 
904 	if (cl->dev.of_node) {
905 		pdata = lp872x_populate_pdata_from_dt(&cl->dev,
906 					      (enum lp872x_id)id->driver_data);
907 		if (IS_ERR(pdata))
908 			return PTR_ERR(pdata);
909 	} else {
910 		pdata = dev_get_platdata(&cl->dev);
911 	}
912 
913 	lp = devm_kzalloc(&cl->dev, sizeof(struct lp872x), GFP_KERNEL);
914 	if (!lp)
915 		return -ENOMEM;
916 
917 	lp->num_regulators = lp872x_num_regulators[id->driver_data];
918 
919 	lp->regmap = devm_regmap_init_i2c(cl, &lp872x_regmap_config);
920 	if (IS_ERR(lp->regmap)) {
921 		ret = PTR_ERR(lp->regmap);
922 		dev_err(&cl->dev, "regmap init i2c err: %d\n", ret);
923 		return ret;
924 	}
925 
926 	lp->dev = &cl->dev;
927 	lp->pdata = pdata;
928 	lp->chipid = id->driver_data;
929 	i2c_set_clientdata(cl, lp);
930 
931 	ret = lp872x_hw_enable(lp);
932 	if (ret)
933 		return ret;
934 
935 	ret = lp872x_config(lp);
936 	if (ret)
937 		return ret;
938 
939 	return lp872x_regulator_register(lp);
940 }
941 
942 static const struct of_device_id lp872x_dt_ids[] = {
943 	{ .compatible = "ti,lp8720", },
944 	{ .compatible = "ti,lp8725", },
945 	{ }
946 };
947 MODULE_DEVICE_TABLE(of, lp872x_dt_ids);
948 
949 static const struct i2c_device_id lp872x_ids[] = {
950 	{"lp8720", LP8720},
951 	{"lp8725", LP8725},
952 	{ }
953 };
954 MODULE_DEVICE_TABLE(i2c, lp872x_ids);
955 
956 static struct i2c_driver lp872x_driver = {
957 	.driver = {
958 		.name = "lp872x",
959 		.of_match_table = of_match_ptr(lp872x_dt_ids),
960 	},
961 	.probe = lp872x_probe,
962 	.id_table = lp872x_ids,
963 };
964 
965 module_i2c_driver(lp872x_driver);
966 
967 MODULE_DESCRIPTION("TI/National Semiconductor LP872x PMU Regulator Driver");
968 MODULE_AUTHOR("Milo Kim");
969 MODULE_LICENSE("GPL");
970