2 * Copyright 2012 Texas Instruments
4 * Author: Milo(Woogyom) Kim <milo.kim@ti.com>
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.
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>
23 #include <linux/of_gpio.h>
24 #include <linux/regulator/of_regulator.h>
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
34 /* Registers : LP8720 */
35 #define LP8720_BUCK_VOUT1 0x06
36 #define LP8720_BUCK_VOUT2 0x07
37 #define LP8720_ENABLE 0x08
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
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)
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)
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)
85 #define LP872X_FORCE_PWM 1
86 #define LP872X_AUTO_PWM 0
88 #define LP8720_NUM_REGULATORS 6
89 #define LP8725_NUM_REGULATORS 9
90 #define EXTERN_DVS_USED 0
93 /* Default DVS Mode */
94 #define LP8720_DEFAULT_DVS 0
95 #define LP8725_DEFAULT_DVS BIT(2)
97 /* dump registers in regmap-debugfs */
98 #define MAX_REGISTERS 0x0F
106 struct regmap
*regmap
;
108 enum lp872x_id chipid
;
109 struct lp872x_platform_data
*pdata
;
111 enum lp872x_dvs_state dvs_pin
;
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,
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,
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,
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,
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,
155 /* LP8725 BUCK current limit */
156 static const unsigned int lp8725_buck_uA
[] = {
157 460000, 780000, 1050000, 1370000,
160 static int lp872x_read_byte(struct lp872x
*lp
, u8 addr
, u8
*data
)
165 ret
= regmap_read(lp
->regmap
, addr
, &val
);
167 dev_err(lp
->dev
, "failed to read 0x%.2x\n", addr
);
175 static inline int lp872x_write_byte(struct lp872x
*lp
, u8 addr
, u8 data
)
177 return regmap_write(lp
->regmap
, addr
, data
);
180 static inline int lp872x_update_bits(struct lp872x
*lp
, u8 addr
,
181 unsigned int mask
, u8 data
)
183 return regmap_update_bits(lp
->regmap
, addr
, mask
, data
);
186 static int lp872x_get_timestep_usec(struct lp872x
*lp
)
188 enum lp872x_id chip
= lp
->chipid
;
190 int *time_usec
, size
, ret
;
191 int lp8720_time_usec
[] = { 25, 50 };
192 int lp8725_time_usec
[] = { 32, 64, 128, 256 };
196 mask
= LP8720_TIMESTEP_M
;
197 shift
= LP8720_TIMESTEP_S
;
198 time_usec
= &lp8720_time_usec
[0];
199 size
= ARRAY_SIZE(lp8720_time_usec
);
202 mask
= LP8725_TIMESTEP_M
;
203 shift
= LP8725_TIMESTEP_S
;
204 time_usec
= &lp8725_time_usec
[0];
205 size
= ARRAY_SIZE(lp8725_time_usec
);
211 ret
= lp872x_read_byte(lp
, LP872X_GENERAL_CFG
, &val
);
215 val
= (val
& mask
) >> shift
;
219 return *(time_usec
+ val
);
222 static int lp872x_regulator_enable_time(struct regulator_dev
*rdev
)
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
);
230 if (time_step_us
< 0)
234 case LP8720_ID_LDO1
... LP8720_ID_BUCK
:
235 addr
= LP872X_LDO1_VOUT
+ rid
;
237 case LP8725_ID_LDO1
... LP8725_ID_BUCK1
:
238 addr
= LP872X_LDO1_VOUT
+ rid
- LP8725_ID_BASE
;
240 case LP8725_ID_BUCK2
:
241 addr
= LP8725_BUCK2_VOUT1
;
247 ret
= lp872x_read_byte(lp
, addr
, &val
);
251 val
= (val
& LP872X_START_DELAY_M
) >> LP872X_START_DELAY_S
;
253 return val
> MAX_DELAY
? 0 : val
* time_step_us
;
256 static void lp872x_set_dvs(struct lp872x
*lp
, enum lp872x_dvs_sel dvs_sel
,
259 enum lp872x_dvs_state state
;
261 state
= dvs_sel
== SEL_V1
? DVS_HIGH
: DVS_LOW
;
262 gpio_set_value(gpio
, state
);
266 static u8
lp872x_select_buck_vout_addr(struct lp872x
*lp
,
267 enum lp872x_regulator_id buck
)
271 if (lp872x_read_byte(lp
, LP872X_GENERAL_CFG
, &val
))
276 if (val
& LP8720_EXT_DVS_M
) {
277 addr
= (lp
->dvs_pin
== DVS_HIGH
) ?
278 LP8720_BUCK_VOUT1
: LP8720_BUCK_VOUT2
;
280 if (lp872x_read_byte(lp
, LP8720_ENABLE
, &val
))
283 addr
= val
& LP8720_DVS_SEL_M
?
284 LP8720_BUCK_VOUT1
: LP8720_BUCK_VOUT2
;
287 case LP8725_ID_BUCK1
:
288 if (val
& LP8725_DVS1_M
)
289 addr
= LP8725_BUCK1_VOUT1
;
291 addr
= (lp
->dvs_pin
== DVS_HIGH
) ?
292 LP8725_BUCK1_VOUT1
: LP8725_BUCK1_VOUT2
;
294 case LP8725_ID_BUCK2
:
295 addr
= val
& LP8725_DVS2_M
?
296 LP8725_BUCK2_VOUT1
: LP8725_BUCK2_VOUT2
;
305 static bool lp872x_is_valid_buck_addr(u8 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
:
320 static int lp872x_buck_set_voltage_sel(struct regulator_dev
*rdev
,
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
;
328 if (dvs
&& gpio_is_valid(dvs
->gpio
))
329 lp872x_set_dvs(lp
, dvs
->vsel
, dvs
->gpio
);
331 addr
= lp872x_select_buck_vout_addr(lp
, buck
);
332 if (!lp872x_is_valid_buck_addr(addr
))
335 return lp872x_update_bits(lp
, addr
, mask
, selector
);
338 static int lp872x_buck_get_voltage_sel(struct regulator_dev
*rdev
)
340 struct lp872x
*lp
= rdev_get_drvdata(rdev
);
341 enum lp872x_regulator_id buck
= rdev_get_id(rdev
);
345 addr
= lp872x_select_buck_vout_addr(lp
, buck
);
346 if (!lp872x_is_valid_buck_addr(addr
))
349 ret
= lp872x_read_byte(lp
, addr
, &val
);
353 return val
& LP872X_VOUT_M
;
356 static int lp872x_buck_set_mode(struct regulator_dev
*rdev
, unsigned int mode
)
358 struct lp872x
*lp
= rdev_get_drvdata(rdev
);
359 enum lp872x_regulator_id buck
= rdev_get_id(rdev
);
360 u8 addr
, mask
, shift
, val
;
364 addr
= LP8720_BUCK_VOUT2
;
365 mask
= LP8720_BUCK_FPWM_M
;
366 shift
= LP8720_BUCK_FPWM_S
;
368 case LP8725_ID_BUCK1
:
369 addr
= LP8725_BUCK_CTRL
;
370 mask
= LP8725_BUCK1_FPWM_M
;
371 shift
= LP8725_BUCK1_FPWM_S
;
373 case LP8725_ID_BUCK2
:
374 addr
= LP8725_BUCK_CTRL
;
375 mask
= LP8725_BUCK2_FPWM_M
;
376 shift
= LP8725_BUCK2_FPWM_S
;
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
;
389 return lp872x_update_bits(lp
, addr
, mask
, val
);
392 static unsigned int lp872x_buck_get_mode(struct regulator_dev
*rdev
)
394 struct lp872x
*lp
= rdev_get_drvdata(rdev
);
395 enum lp872x_regulator_id buck
= rdev_get_id(rdev
);
401 addr
= LP8720_BUCK_VOUT2
;
402 mask
= LP8720_BUCK_FPWM_M
;
404 case LP8725_ID_BUCK1
:
405 addr
= LP8725_BUCK_CTRL
;
406 mask
= LP8725_BUCK1_FPWM_M
;
408 case LP8725_ID_BUCK2
:
409 addr
= LP8725_BUCK_CTRL
;
410 mask
= LP8725_BUCK2_FPWM_M
;
416 ret
= lp872x_read_byte(lp
, addr
, &val
);
420 return val
& mask
? REGULATOR_MODE_FAST
: REGULATOR_MODE_NORMAL
;
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
,
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
,
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
,
462 static const struct regulator_desc lp8720_regulator_desc
[] = {
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
,
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
,
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
,
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
,
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
,
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
,
547 static const struct regulator_desc lp8725_regulator_desc
[] = {
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
,
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
,
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
,
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
,
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
,
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
,
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
,
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
,
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
,
680 static int lp872x_init_dvs(struct lp872x
*lp
)
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
};
689 goto set_default_dvs_mode
;
692 if (!gpio_is_valid(gpio
))
693 goto set_default_dvs_mode
;
695 pinstate
= dvs
->init_state
;
696 ret
= devm_gpio_request_one(lp
->dev
, gpio
, pinstate
, "LP872X DVS");
698 dev_err(lp
->dev
, "gpio request err: %d\n", ret
);
702 lp
->dvs_pin
= pinstate
;
706 set_default_dvs_mode
:
707 return lp872x_update_bits(lp
, LP872X_GENERAL_CFG
, mask
[lp
->chipid
],
708 default_dvs_mode
[lp
->chipid
]);
711 static int lp872x_hw_enable(struct lp872x
*lp
)
718 gpio
= lp
->pdata
->enable_gpio
;
719 if (!gpio_is_valid(gpio
))
722 /* Always set enable GPIO high. */
723 ret
= devm_gpio_request_one(lp
->dev
, gpio
, GPIOF_OUT_INIT_HIGH
, "LP872X EN");
725 dev_err(lp
->dev
, "gpio request err: %d\n", ret
);
729 /* Each chip has a different enable delay. */
730 if (lp
->chipid
== LP8720
)
731 usleep_range(LP8720_ENABLE_DELAY
, 1.5 * LP8720_ENABLE_DELAY
);
733 usleep_range(LP8725_ENABLE_DELAY
, 1.5 * LP8725_ENABLE_DELAY
);
738 static int lp872x_config(struct lp872x
*lp
)
740 struct lp872x_platform_data
*pdata
= lp
->pdata
;
743 if (!pdata
|| !pdata
->update_config
)
746 ret
= lp872x_write_byte(lp
, LP872X_GENERAL_CFG
, pdata
->general_config
);
751 return lp872x_init_dvs(lp
);
754 static struct regulator_init_data
755 *lp872x_find_regulator_init_data(int id
, struct lp872x
*lp
)
757 struct lp872x_platform_data
*pdata
= lp
->pdata
;
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
;
771 static int lp872x_regulator_register(struct lp872x
*lp
)
773 const struct regulator_desc
*desc
;
774 struct regulator_config cfg
= { };
775 struct regulator_dev
*rdev
;
778 for (i
= 0; i
< lp
->num_regulators
; i
++) {
779 desc
= (lp
->chipid
== LP8720
) ? &lp8720_regulator_desc
[i
] :
780 &lp8725_regulator_desc
[i
];
783 cfg
.init_data
= lp872x_find_regulator_init_data(desc
->id
, lp
);
784 cfg
.driver_data
= lp
;
785 cfg
.regmap
= lp
->regmap
;
787 rdev
= devm_regulator_register(lp
->dev
, desc
, &cfg
);
789 dev_err(lp
->dev
, "regulator register err");
790 return PTR_ERR(rdev
);
797 static const struct regmap_config lp872x_regmap_config
= {
800 .max_register
= MAX_REGISTERS
,
805 #define LP872X_VALID_OPMODE (REGULATOR_MODE_FAST | REGULATOR_MODE_NORMAL)
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
, },
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
, },
828 static struct lp872x_platform_data
829 *lp872x_populate_pdata_from_dt(struct device
*dev
, enum lp872x_id which
)
831 struct device_node
*np
= dev
->of_node
;
832 struct lp872x_platform_data
*pdata
;
833 struct of_regulator_match
*match
;
839 pdata
= devm_kzalloc(dev
, sizeof(*pdata
), GFP_KERNEL
);
841 return ERR_PTR(-ENOMEM
);
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;
847 pdata
->dvs
= devm_kzalloc(dev
, sizeof(struct lp872x_dvs
), GFP_KERNEL
);
849 return ERR_PTR(-ENOMEM
);
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
;
856 pdata
->enable_gpio
= of_get_named_gpio(np
, "enable-gpios", 0);
858 if (of_get_child_count(np
) == 0)
863 match
= lp8720_matches
;
864 num_matches
= ARRAY_SIZE(lp8720_matches
);
867 match
= lp8725_matches
;
868 num_matches
= ARRAY_SIZE(lp8725_matches
);
874 count
= of_regulator_match(dev
, np
, match
, num_matches
);
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
;
887 static struct lp872x_platform_data
888 *lp872x_populate_pdata_from_dt(struct device
*dev
, enum lp872x_id which
)
894 static int lp872x_probe(struct i2c_client
*cl
, const struct i2c_device_id
*id
)
897 struct lp872x_platform_data
*pdata
;
899 const int lp872x_num_regulators
[] = {
900 [LP8720
] = LP8720_NUM_REGULATORS
,
901 [LP8725
] = LP8725_NUM_REGULATORS
,
904 if (cl
->dev
.of_node
) {
905 pdata
= lp872x_populate_pdata_from_dt(&cl
->dev
,
906 (enum lp872x_id
)id
->driver_data
);
908 return PTR_ERR(pdata
);
910 pdata
= dev_get_platdata(&cl
->dev
);
913 lp
= devm_kzalloc(&cl
->dev
, sizeof(struct lp872x
), GFP_KERNEL
);
917 lp
->num_regulators
= lp872x_num_regulators
[id
->driver_data
];
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
);
928 lp
->chipid
= id
->driver_data
;
929 i2c_set_clientdata(cl
, lp
);
931 ret
= lp872x_hw_enable(lp
);
935 ret
= lp872x_config(lp
);
939 return lp872x_regulator_register(lp
);
942 static const struct of_device_id lp872x_dt_ids
[] = {
943 { .compatible
= "ti,lp8720", },
944 { .compatible
= "ti,lp8725", },
947 MODULE_DEVICE_TABLE(of
, lp872x_dt_ids
);
949 static const struct i2c_device_id lp872x_ids
[] = {
954 MODULE_DEVICE_TABLE(i2c
, lp872x_ids
);
956 static struct i2c_driver lp872x_driver
= {
959 .of_match_table
= of_match_ptr(lp872x_dt_ids
),
961 .probe
= lp872x_probe
,
962 .id_table
= lp872x_ids
,
965 module_i2c_driver(lp872x_driver
);
967 MODULE_DESCRIPTION("TI/National Semiconductor LP872x PMU Regulator Driver");
968 MODULE_AUTHOR("Milo Kim");
969 MODULE_LICENSE("GPL");