1 // SPDX-License-Identifier: GPL-2.0-only
3 * LP8755 High Performance Power Management Unit : System Interface Driver
5 * Copyright 2012 Texas Instruments
7 * Author: Daniel(Geon Si) Jeong <daniel.jeong@ti.com>
10 #include <linux/module.h>
11 #include <linux/slab.h>
12 #include <linux/i2c.h>
13 #include <linux/err.h>
14 #include <linux/irq.h>
15 #include <linux/interrupt.h>
16 #include <linux/gpio.h>
17 #include <linux/regmap.h>
18 #include <linux/uaccess.h>
19 #include <linux/regulator/driver.h>
20 #include <linux/regulator/machine.h>
21 #include <linux/platform_data/lp8755.h>
23 #define LP8755_REG_BUCK0 0x00
24 #define LP8755_REG_BUCK1 0x03
25 #define LP8755_REG_BUCK2 0x04
26 #define LP8755_REG_BUCK3 0x01
27 #define LP8755_REG_BUCK4 0x05
28 #define LP8755_REG_BUCK5 0x02
29 #define LP8755_REG_MAX 0xFF
31 #define LP8755_BUCK_EN_M BIT(7)
32 #define LP8755_BUCK_LINEAR_OUT_MAX 0x76
33 #define LP8755_BUCK_VOUT_M 0x7F
35 struct lp8755_mphase
{
37 int buck_num
[LP8755_BUCK_MAX
];
42 struct regmap
*regmap
;
43 struct lp8755_platform_data
*pdata
;
49 struct regulator_dev
*rdev
[LP8755_BUCK_MAX
];
52 static int lp8755_buck_enable_time(struct regulator_dev
*rdev
)
56 enum lp8755_bucks id
= rdev_get_id(rdev
);
58 ret
= regmap_read(rdev
->regmap
, 0x12 + id
, ®val
);
60 dev_err(&rdev
->dev
, "i2c access error %s\n", __func__
);
63 return (regval
& 0xff) * 100;
66 static int lp8755_buck_set_mode(struct regulator_dev
*rdev
, unsigned int mode
)
69 unsigned int regbval
= 0x0;
70 enum lp8755_bucks id
= rdev_get_id(rdev
);
71 struct lp8755_chip
*pchip
= rdev_get_drvdata(rdev
);
74 case REGULATOR_MODE_FAST
:
76 regbval
= (0x01 << id
);
78 case REGULATOR_MODE_NORMAL
:
79 /* enable automatic pwm/pfm mode */
80 ret
= regmap_update_bits(rdev
->regmap
, 0x08 + id
, 0x20, 0x00);
84 case REGULATOR_MODE_IDLE
:
85 /* enable automatic pwm/pfm/lppfm mode */
86 ret
= regmap_update_bits(rdev
->regmap
, 0x08 + id
, 0x20, 0x20);
90 ret
= regmap_update_bits(rdev
->regmap
, 0x10, 0x01, 0x01);
95 dev_err(pchip
->dev
, "Not supported buck mode %s\n", __func__
);
97 regbval
= (0x01 << id
);
100 ret
= regmap_update_bits(rdev
->regmap
, 0x06, 0x01 << id
, regbval
);
105 dev_err(&rdev
->dev
, "i2c access error %s\n", __func__
);
109 static unsigned int lp8755_buck_get_mode(struct regulator_dev
*rdev
)
113 enum lp8755_bucks id
= rdev_get_id(rdev
);
115 ret
= regmap_read(rdev
->regmap
, 0x06, ®val
);
119 /* mode fast means forced pwm mode */
120 if (regval
& (0x01 << id
))
121 return REGULATOR_MODE_FAST
;
123 ret
= regmap_read(rdev
->regmap
, 0x08 + id
, ®val
);
127 /* mode idle means automatic pwm/pfm/lppfm mode */
129 return REGULATOR_MODE_IDLE
;
131 /* mode normal means automatic pwm/pfm mode */
132 return REGULATOR_MODE_NORMAL
;
135 dev_err(&rdev
->dev
, "i2c access error %s\n", __func__
);
139 static const unsigned int lp8755_buck_ramp_table
[] = {
140 30000, 15000, 7500, 3800, 1900, 940, 470, 230
143 static const struct regulator_ops lp8755_buck_ops
= {
144 .map_voltage
= regulator_map_voltage_linear
,
145 .list_voltage
= regulator_list_voltage_linear
,
146 .set_voltage_sel
= regulator_set_voltage_sel_regmap
,
147 .get_voltage_sel
= regulator_get_voltage_sel_regmap
,
148 .enable
= regulator_enable_regmap
,
149 .disable
= regulator_disable_regmap
,
150 .is_enabled
= regulator_is_enabled_regmap
,
151 .enable_time
= lp8755_buck_enable_time
,
152 .set_mode
= lp8755_buck_set_mode
,
153 .get_mode
= lp8755_buck_get_mode
,
154 .set_ramp_delay
= regulator_set_ramp_delay_regmap
,
157 #define lp8755_rail(_id) "lp8755_buck"#_id
158 #define lp8755_buck_init(_id)\
161 .name = lp8755_rail(_id),\
162 .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,\
168 static struct regulator_init_data lp8755_reg_default
[LP8755_BUCK_MAX
] = {
169 [LP8755_BUCK0
] = lp8755_buck_init(0),
170 [LP8755_BUCK1
] = lp8755_buck_init(1),
171 [LP8755_BUCK2
] = lp8755_buck_init(2),
172 [LP8755_BUCK3
] = lp8755_buck_init(3),
173 [LP8755_BUCK4
] = lp8755_buck_init(4),
174 [LP8755_BUCK5
] = lp8755_buck_init(5),
177 static const struct lp8755_mphase mphase_buck
[MPHASE_CONF_MAX
] = {
178 { 3, { LP8755_BUCK0
, LP8755_BUCK3
, LP8755_BUCK5
} },
179 { 6, { LP8755_BUCK0
, LP8755_BUCK1
, LP8755_BUCK2
, LP8755_BUCK3
,
180 LP8755_BUCK4
, LP8755_BUCK5
} },
181 { 5, { LP8755_BUCK0
, LP8755_BUCK2
, LP8755_BUCK3
, LP8755_BUCK4
,
183 { 4, { LP8755_BUCK0
, LP8755_BUCK3
, LP8755_BUCK4
, LP8755_BUCK5
} },
184 { 3, { LP8755_BUCK0
, LP8755_BUCK4
, LP8755_BUCK5
} },
185 { 2, { LP8755_BUCK0
, LP8755_BUCK5
} },
186 { 1, { LP8755_BUCK0
} },
187 { 2, { LP8755_BUCK0
, LP8755_BUCK3
} },
188 { 4, { LP8755_BUCK0
, LP8755_BUCK2
, LP8755_BUCK3
, LP8755_BUCK5
} },
191 static int lp8755_init_data(struct lp8755_chip
*pchip
)
194 int ret
, icnt
, buck_num
;
195 struct lp8755_platform_data
*pdata
= pchip
->pdata
;
197 /* read back muti-phase configuration */
198 ret
= regmap_read(pchip
->regmap
, 0x3D, ®val
);
201 pchip
->mphase
= regval
& 0x0F;
203 /* set default data based on multi-phase config */
204 for (icnt
= 0; icnt
< mphase_buck
[pchip
->mphase
].nreg
; icnt
++) {
205 buck_num
= mphase_buck
[pchip
->mphase
].buck_num
[icnt
];
206 pdata
->buck_data
[buck_num
] = &lp8755_reg_default
[buck_num
];
211 dev_err(pchip
->dev
, "i2c access error %s\n", __func__
);
215 #define lp8755_buck_desc(_id)\
217 .name = lp8755_rail(_id),\
218 .id = LP8755_BUCK##_id,\
219 .ops = &lp8755_buck_ops,\
220 .n_voltages = LP8755_BUCK_LINEAR_OUT_MAX+1,\
223 .type = REGULATOR_VOLTAGE,\
224 .owner = THIS_MODULE,\
225 .enable_reg = LP8755_REG_BUCK##_id,\
226 .enable_mask = LP8755_BUCK_EN_M,\
227 .vsel_reg = LP8755_REG_BUCK##_id,\
228 .vsel_mask = LP8755_BUCK_VOUT_M,\
229 .ramp_reg = (LP8755_BUCK##_id) + 0x7,\
231 .ramp_delay_table = lp8755_buck_ramp_table,\
232 .n_ramp_values = ARRAY_SIZE(lp8755_buck_ramp_table),\
235 static const struct regulator_desc lp8755_regulators
[] = {
244 static int lp8755_regulator_init(struct lp8755_chip
*pchip
)
246 int ret
, icnt
, buck_num
;
247 struct lp8755_platform_data
*pdata
= pchip
->pdata
;
248 struct regulator_config rconfig
= { };
250 rconfig
.regmap
= pchip
->regmap
;
251 rconfig
.dev
= pchip
->dev
;
252 rconfig
.driver_data
= pchip
;
254 for (icnt
= 0; icnt
< mphase_buck
[pchip
->mphase
].nreg
; icnt
++) {
255 buck_num
= mphase_buck
[pchip
->mphase
].buck_num
[icnt
];
256 rconfig
.init_data
= pdata
->buck_data
[buck_num
];
257 rconfig
.of_node
= pchip
->dev
->of_node
;
258 pchip
->rdev
[buck_num
] =
259 devm_regulator_register(pchip
->dev
,
260 &lp8755_regulators
[buck_num
], &rconfig
);
261 if (IS_ERR(pchip
->rdev
[buck_num
])) {
262 ret
= PTR_ERR(pchip
->rdev
[buck_num
]);
263 pchip
->rdev
[buck_num
] = NULL
;
264 dev_err(pchip
->dev
, "regulator init failed: buck %d\n",
273 static irqreturn_t
lp8755_irq_handler(int irq
, void *data
)
276 unsigned int flag0
, flag1
;
277 struct lp8755_chip
*pchip
= data
;
279 /* read flag0 register */
280 ret
= regmap_read(pchip
->regmap
, 0x0D, &flag0
);
283 /* clear flag register to pull up int. pin */
284 ret
= regmap_write(pchip
->regmap
, 0x0D, 0x00);
288 /* sent power fault detection event to specific regulator */
289 for (icnt
= 0; icnt
< LP8755_BUCK_MAX
; icnt
++)
290 if ((flag0
& (0x4 << icnt
))
291 && (pchip
->irqmask
& (0x04 << icnt
))
292 && (pchip
->rdev
[icnt
] != NULL
)) {
293 regulator_notifier_call_chain(pchip
->rdev
[icnt
],
294 LP8755_EVENT_PWR_FAULT
,
298 /* read flag1 register */
299 ret
= regmap_read(pchip
->regmap
, 0x0E, &flag1
);
302 /* clear flag register to pull up int. pin */
303 ret
= regmap_write(pchip
->regmap
, 0x0E, 0x00);
307 /* send OCP event to all regulator devices */
308 if ((flag1
& 0x01) && (pchip
->irqmask
& 0x01))
309 for (icnt
= 0; icnt
< LP8755_BUCK_MAX
; icnt
++)
310 if (pchip
->rdev
[icnt
] != NULL
) {
311 regulator_notifier_call_chain(pchip
->rdev
[icnt
],
316 /* send OVP event to all regulator devices */
317 if ((flag1
& 0x02) && (pchip
->irqmask
& 0x02))
318 for (icnt
= 0; icnt
< LP8755_BUCK_MAX
; icnt
++)
319 if (pchip
->rdev
[icnt
] != NULL
) {
320 regulator_notifier_call_chain(pchip
->rdev
[icnt
],
327 dev_err(pchip
->dev
, "i2c access error %s\n", __func__
);
331 static int lp8755_int_config(struct lp8755_chip
*pchip
)
336 if (pchip
->irq
== 0) {
337 dev_warn(pchip
->dev
, "not use interrupt : %s\n", __func__
);
341 ret
= regmap_read(pchip
->regmap
, 0x0F, ®val
);
343 dev_err(pchip
->dev
, "i2c access error %s\n", __func__
);
347 pchip
->irqmask
= regval
;
348 return devm_request_threaded_irq(pchip
->dev
, pchip
->irq
, NULL
,
350 IRQF_TRIGGER_FALLING
| IRQF_ONESHOT
,
351 "lp8755-irq", pchip
);
354 static const struct regmap_config lp8755_regmap
= {
357 .max_register
= LP8755_REG_MAX
,
360 static int lp8755_probe(struct i2c_client
*client
,
361 const struct i2c_device_id
*id
)
364 struct lp8755_chip
*pchip
;
365 struct lp8755_platform_data
*pdata
= dev_get_platdata(&client
->dev
);
367 if (!i2c_check_functionality(client
->adapter
, I2C_FUNC_I2C
)) {
368 dev_err(&client
->dev
, "i2c functionality check fail.\n");
372 pchip
= devm_kzalloc(&client
->dev
,
373 sizeof(struct lp8755_chip
), GFP_KERNEL
);
377 pchip
->dev
= &client
->dev
;
378 pchip
->regmap
= devm_regmap_init_i2c(client
, &lp8755_regmap
);
379 if (IS_ERR(pchip
->regmap
)) {
380 ret
= PTR_ERR(pchip
->regmap
);
381 dev_err(&client
->dev
, "fail to allocate regmap %d\n", ret
);
384 i2c_set_clientdata(client
, pchip
);
387 pchip
->pdata
= pdata
;
388 pchip
->mphase
= pdata
->mphase
;
390 pchip
->pdata
= devm_kzalloc(pchip
->dev
,
391 sizeof(struct lp8755_platform_data
),
395 ret
= lp8755_init_data(pchip
);
397 dev_err(&client
->dev
, "fail to initialize chip\n");
402 ret
= lp8755_regulator_init(pchip
);
404 dev_err(&client
->dev
, "fail to initialize regulators\n");
408 pchip
->irq
= client
->irq
;
409 ret
= lp8755_int_config(pchip
);
411 dev_err(&client
->dev
, "fail to irq config\n");
419 for (icnt
= 0; icnt
< LP8755_BUCK_MAX
; icnt
++)
420 regmap_write(pchip
->regmap
, icnt
, 0x00);
425 static int lp8755_remove(struct i2c_client
*client
)
428 struct lp8755_chip
*pchip
= i2c_get_clientdata(client
);
430 for (icnt
= 0; icnt
< LP8755_BUCK_MAX
; icnt
++)
431 regmap_write(pchip
->regmap
, icnt
, 0x00);
436 static const struct i2c_device_id lp8755_id
[] = {
441 MODULE_DEVICE_TABLE(i2c
, lp8755_id
);
443 static struct i2c_driver lp8755_i2c_driver
= {
447 .probe
= lp8755_probe
,
448 .remove
= lp8755_remove
,
449 .id_table
= lp8755_id
,
452 static int __init
lp8755_init(void)
454 return i2c_add_driver(&lp8755_i2c_driver
);
457 subsys_initcall(lp8755_init
);
459 static void __exit
lp8755_exit(void)
461 i2c_del_driver(&lp8755_i2c_driver
);
464 module_exit(lp8755_exit
);
466 MODULE_DESCRIPTION("Texas Instruments lp8755 driver");
467 MODULE_AUTHOR("Daniel Jeong <daniel.jeong@ti.com>");
468 MODULE_LICENSE("GPL v2");