2 * ADP5061 I2C Programmable Linear Battery Charger
4 * Copyright 2018 Analog Devices Inc.
6 * Licensed under the GPL-2.
9 #include <linux/init.h>
10 #include <linux/module.h>
11 #include <linux/slab.h>
12 #include <linux/i2c.h>
13 #include <linux/delay.h>
15 #include <linux/mod_devicetable.h>
16 #include <linux/power_supply.h>
17 #include <linux/platform_device.h>
19 #include <linux/regmap.h>
21 /* ADP5061 registers definition */
22 #define ADP5061_ID 0x00
23 #define ADP5061_REV 0x01
24 #define ADP5061_VINX_SET 0x02
25 #define ADP5061_TERM_SET 0x03
26 #define ADP5061_CHG_CURR 0x04
27 #define ADP5061_VOLTAGE_TH 0x05
28 #define ADP5061_TIMER_SET 0x06
29 #define ADP5061_FUNC_SET_1 0x07
30 #define ADP5061_FUNC_SET_2 0x08
31 #define ADP5061_INT_EN 0x09
32 #define ADP5061_INT_ACT 0x0A
33 #define ADP5061_CHG_STATUS_1 0x0B
34 #define ADP5061_CHG_STATUS_2 0x0C
35 #define ADP5061_FAULT 0x0D
36 #define ADP5061_BATTERY_SHORT 0x10
37 #define ADP5061_IEND 0x11
39 /* ADP5061_VINX_SET */
40 #define ADP5061_VINX_SET_ILIM_MSK GENMASK(3, 0)
41 #define ADP5061_VINX_SET_ILIM_MODE(x) (((x) & 0x0F) << 0)
43 /* ADP5061_TERM_SET */
44 #define ADP5061_TERM_SET_VTRM_MSK GENMASK(7, 2)
45 #define ADP5061_TERM_SET_VTRM_MODE(x) (((x) & 0x3F) << 2)
46 #define ADP5061_TERM_SET_CHG_VLIM_MSK GENMASK(1, 0)
47 #define ADP5061_TERM_SET_CHG_VLIM_MODE(x) (((x) & 0x03) << 0)
49 /* ADP5061_CHG_CURR */
50 #define ADP5061_CHG_CURR_ICHG_MSK GENMASK(6, 2)
51 #define ADP5061_CHG_CURR_ICHG_MODE(x) (((x) & 0x1F) << 2)
52 #define ADP5061_CHG_CURR_ITRK_DEAD_MSK GENMASK(1, 0)
53 #define ADP5061_CHG_CURR_ITRK_DEAD_MODE(x) (((x) & 0x03) << 0)
55 /* ADP5061_VOLTAGE_TH */
56 #define ADP5061_VOLTAGE_TH_DIS_RCH_MSK BIT(7)
57 #define ADP5061_VOLTAGE_TH_DIS_RCH_MODE(x) (((x) & 0x01) << 7)
58 #define ADP5061_VOLTAGE_TH_VRCH_MSK GENMASK(6, 5)
59 #define ADP5061_VOLTAGE_TH_VRCH_MODE(x) (((x) & 0x03) << 5)
60 #define ADP5061_VOLTAGE_TH_VTRK_DEAD_MSK GENMASK(4, 3)
61 #define ADP5061_VOLTAGE_TH_VTRK_DEAD_MODE(x) (((x) & 0x03) << 3)
62 #define ADP5061_VOLTAGE_TH_VWEAK_MSK GENMASK(2, 0)
63 #define ADP5061_VOLTAGE_TH_VWEAK_MODE(x) (((x) & 0x07) << 0)
65 /* ADP5061_CHG_STATUS_1 */
66 #define ADP5061_CHG_STATUS_1_VIN_OV(x) (((x) >> 7) & 0x1)
67 #define ADP5061_CHG_STATUS_1_VIN_OK(x) (((x) >> 6) & 0x1)
68 #define ADP5061_CHG_STATUS_1_VIN_ILIM(x) (((x) >> 5) & 0x1)
69 #define ADP5061_CHG_STATUS_1_THERM_LIM(x) (((x) >> 4) & 0x1)
70 #define ADP5061_CHG_STATUS_1_CHDONE(x) (((x) >> 3) & 0x1)
71 #define ADP5061_CHG_STATUS_1_CHG_STATUS(x) (((x) >> 0) & 0x7)
73 /* ADP5061_CHG_STATUS_2 */
74 #define ADP5061_CHG_STATUS_2_THR_STATUS(x) (((x) >> 5) & 0x7)
75 #define ADP5061_CHG_STATUS_2_RCH_LIM_INFO(x) (((x) >> 3) & 0x1)
76 #define ADP5061_CHG_STATUS_2_BAT_STATUS(x) (((x) >> 0) & 0x7)
79 #define ADP5061_IEND_IEND_MSK GENMASK(7, 5)
80 #define ADP5061_IEND_IEND_MODE(x) (((x) & 0x07) << 5)
82 #define ADP5061_NO_BATTERY 0x01
83 #define ADP5061_ICHG_MAX 1300 // mA
85 enum adp5061_chg_status {
92 ADP5061_CHG_TIMER_EXP,
96 static const int adp5061_chg_type[4] = {
97 [ADP5061_CHG_OFF] = POWER_SUPPLY_CHARGE_TYPE_NONE,
98 [ADP5061_CHG_TRICKLE] = POWER_SUPPLY_CHARGE_TYPE_TRICKLE,
99 [ADP5061_CHG_FAST_CC] = POWER_SUPPLY_CHARGE_TYPE_FAST,
100 [ADP5061_CHG_FAST_CV] = POWER_SUPPLY_CHARGE_TYPE_FAST,
103 static const int adp5061_vweak_th[8] = {
104 2700, 2800, 2900, 3000, 3100, 3200, 3300, 3400,
107 static const int adp5061_prechg_current[4] = {
111 static const int adp5061_vmin[4] = {
112 2000, 2500, 2600, 2900,
115 static const int adp5061_const_chg_vmax[4] = {
116 3200, 3400, 3700, 3800,
119 static const int adp5061_const_ichg[24] = {
120 50, 100, 150, 200, 250, 300, 350, 400, 450, 500, 550, 600, 650,
121 700, 750, 800, 850, 900, 950, 1000, 1050, 1100, 1200, 1300,
124 static const int adp5061_vmax[36] = {
125 3800, 3820, 3840, 3860, 3880, 3900, 3920, 3940, 3960, 3980,
126 4000, 4020, 4040, 4060, 4080, 4100, 4120, 4140, 4160, 4180,
127 4200, 4220, 4240, 4260, 4280, 4300, 4320, 4340, 4360, 4380,
128 4400, 4420, 4440, 4460, 4480, 4500,
131 static const int adp5061_in_current_lim[16] = {
132 100, 150, 200, 250, 300, 400, 500, 600, 700,
133 800, 900, 1000, 1200, 1500, 1800, 2100,
136 static const int adp5061_iend[8] = {
137 12500, 32500, 52500, 72500, 92500, 117500, 142500, 170000,
140 struct adp5061_state {
141 struct i2c_client *client;
142 struct regmap *regmap;
143 struct power_supply *psy;
146 static int adp5061_get_array_index(const int *array, u8 size, int val)
150 for (i = 1; i < size; i++) {
158 static int adp5061_get_status(struct adp5061_state *st,
159 u8 *status1, u8 *status2)
164 /* CHG_STATUS1 and CHG_STATUS2 are adjacent regs */
165 ret = regmap_bulk_read(st->regmap, ADP5061_CHG_STATUS_1,
176 static int adp5061_get_input_current_limit(struct adp5061_state *st,
177 union power_supply_propval *val)
182 ret = regmap_read(st->regmap, ADP5061_VINX_SET, ®val);
186 mode = ADP5061_VINX_SET_ILIM_MODE(regval);
187 val->intval = adp5061_in_current_lim[mode] * 1000;
192 static int adp5061_set_input_current_limit(struct adp5061_state *st, int val)
196 /* Convert from uA to mA */
198 index = adp5061_get_array_index(adp5061_in_current_lim,
199 ARRAY_SIZE(adp5061_in_current_lim),
204 return regmap_update_bits(st->regmap, ADP5061_VINX_SET,
205 ADP5061_VINX_SET_ILIM_MSK,
206 ADP5061_VINX_SET_ILIM_MODE(index));
209 static int adp5061_set_min_voltage(struct adp5061_state *st, int val)
213 /* Convert from uV to mV */
215 index = adp5061_get_array_index(adp5061_vmin,
216 ARRAY_SIZE(adp5061_vmin),
221 return regmap_update_bits(st->regmap, ADP5061_VOLTAGE_TH,
222 ADP5061_VOLTAGE_TH_VTRK_DEAD_MSK,
223 ADP5061_VOLTAGE_TH_VTRK_DEAD_MODE(index));
226 static int adp5061_get_min_voltage(struct adp5061_state *st,
227 union power_supply_propval *val)
232 ret = regmap_read(st->regmap, ADP5061_VOLTAGE_TH, ®val);
236 regval = ((regval & ADP5061_VOLTAGE_TH_VTRK_DEAD_MSK) >> 3);
237 val->intval = adp5061_vmin[regval] * 1000;
242 static int adp5061_get_chg_volt_lim(struct adp5061_state *st,
243 union power_supply_propval *val)
248 ret = regmap_read(st->regmap, ADP5061_TERM_SET, ®val);
252 mode = ADP5061_TERM_SET_CHG_VLIM_MODE(regval);
253 val->intval = adp5061_const_chg_vmax[mode] * 1000;
258 static int adp5061_get_max_voltage(struct adp5061_state *st,
259 union power_supply_propval *val)
264 ret = regmap_read(st->regmap, ADP5061_TERM_SET, ®val);
268 regval = ((regval & ADP5061_TERM_SET_VTRM_MSK) >> 2) - 0x0F;
269 if (regval >= ARRAY_SIZE(adp5061_vmax))
270 regval = ARRAY_SIZE(adp5061_vmax) - 1;
272 val->intval = adp5061_vmax[regval] * 1000;
277 static int adp5061_set_max_voltage(struct adp5061_state *st, int val)
281 /* Convert from uV to mV */
286 vmax_index = adp5061_get_array_index(adp5061_vmax,
287 ARRAY_SIZE(adp5061_vmax), val);
293 return regmap_update_bits(st->regmap, ADP5061_TERM_SET,
294 ADP5061_TERM_SET_VTRM_MSK,
295 ADP5061_TERM_SET_VTRM_MODE(vmax_index));
298 static int adp5061_set_const_chg_vmax(struct adp5061_state *st, int val)
302 /* Convert from uV to mV */
304 index = adp5061_get_array_index(adp5061_const_chg_vmax,
305 ARRAY_SIZE(adp5061_const_chg_vmax),
310 return regmap_update_bits(st->regmap, ADP5061_TERM_SET,
311 ADP5061_TERM_SET_CHG_VLIM_MSK,
312 ADP5061_TERM_SET_CHG_VLIM_MODE(index));
315 static int adp5061_set_const_chg_current(struct adp5061_state *st, int val)
320 /* Convert from uA to mA */
322 if (val > ADP5061_ICHG_MAX)
323 val = ADP5061_ICHG_MAX;
325 index = adp5061_get_array_index(adp5061_const_ichg,
326 ARRAY_SIZE(adp5061_const_ichg),
331 return regmap_update_bits(st->regmap, ADP5061_CHG_CURR,
332 ADP5061_CHG_CURR_ICHG_MSK,
333 ADP5061_CHG_CURR_ICHG_MODE(index));
336 static int adp5061_get_const_chg_current(struct adp5061_state *st,
337 union power_supply_propval *val)
342 ret = regmap_read(st->regmap, ADP5061_CHG_CURR, ®val);
346 regval = ((regval & ADP5061_CHG_CURR_ICHG_MSK) >> 2);
347 if (regval >= ARRAY_SIZE(adp5061_const_ichg))
348 regval = ARRAY_SIZE(adp5061_const_ichg) - 1;
350 val->intval = adp5061_const_ichg[regval] * 1000;
355 static int adp5061_get_prechg_current(struct adp5061_state *st,
356 union power_supply_propval *val)
361 ret = regmap_read(st->regmap, ADP5061_CHG_CURR, ®val);
365 regval &= ADP5061_CHG_CURR_ITRK_DEAD_MSK;
366 val->intval = adp5061_prechg_current[regval] * 1000;
371 static int adp5061_set_prechg_current(struct adp5061_state *st, int val)
375 /* Convert from uA to mA */
377 index = adp5061_get_array_index(adp5061_prechg_current,
378 ARRAY_SIZE(adp5061_prechg_current),
383 return regmap_update_bits(st->regmap, ADP5061_CHG_CURR,
384 ADP5061_CHG_CURR_ITRK_DEAD_MSK,
385 ADP5061_CHG_CURR_ITRK_DEAD_MODE(index));
388 static int adp5061_get_vweak_th(struct adp5061_state *st,
389 union power_supply_propval *val)
394 ret = regmap_read(st->regmap, ADP5061_VOLTAGE_TH, ®val);
398 regval &= ADP5061_VOLTAGE_TH_VWEAK_MSK;
399 val->intval = adp5061_vweak_th[regval] * 1000;
404 static int adp5061_set_vweak_th(struct adp5061_state *st, int val)
408 /* Convert from uV to mV */
410 index = adp5061_get_array_index(adp5061_vweak_th,
411 ARRAY_SIZE(adp5061_vweak_th),
416 return regmap_update_bits(st->regmap, ADP5061_VOLTAGE_TH,
417 ADP5061_VOLTAGE_TH_VWEAK_MSK,
418 ADP5061_VOLTAGE_TH_VWEAK_MODE(index));
421 static int adp5061_get_chg_type(struct adp5061_state *st,
422 union power_supply_propval *val)
427 ret = adp5061_get_status(st, &status1, &status2);
431 chg_type = adp5061_chg_type[ADP5061_CHG_STATUS_1_CHG_STATUS(status1)];
432 if (chg_type > ADP5061_CHG_FAST_CV)
433 val->intval = POWER_SUPPLY_STATUS_UNKNOWN;
435 val->intval = chg_type;
440 static int adp5061_get_charger_status(struct adp5061_state *st,
441 union power_supply_propval *val)
446 ret = adp5061_get_status(st, &status1, &status2);
450 switch (ADP5061_CHG_STATUS_1_CHG_STATUS(status1)) {
451 case ADP5061_CHG_OFF:
452 val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING;
454 case ADP5061_CHG_TRICKLE:
455 case ADP5061_CHG_FAST_CC:
456 case ADP5061_CHG_FAST_CV:
457 val->intval = POWER_SUPPLY_STATUS_CHARGING;
459 case ADP5061_CHG_COMPLETE:
460 val->intval = POWER_SUPPLY_STATUS_FULL;
462 case ADP5061_CHG_TIMER_EXP:
463 /* The battery must be discharging if there is a charge fault */
464 val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
467 val->intval = POWER_SUPPLY_STATUS_UNKNOWN;
473 static int adp5061_get_battery_status(struct adp5061_state *st,
474 union power_supply_propval *val)
479 ret = adp5061_get_status(st, &status1, &status2);
483 switch (ADP5061_CHG_STATUS_2_BAT_STATUS(status2)) {
484 case 0x0: /* Battery monitor off */
485 case 0x1: /* No battery */
486 val->intval = POWER_SUPPLY_CAPACITY_LEVEL_UNKNOWN;
488 case 0x2: /* VBAT < VTRK */
489 val->intval = POWER_SUPPLY_CAPACITY_LEVEL_CRITICAL;
491 case 0x3: /* VTRK < VBAT_SNS < VWEAK */
492 val->intval = POWER_SUPPLY_CAPACITY_LEVEL_LOW;
494 case 0x4: /* VBAT_SNS > VWEAK */
495 val->intval = POWER_SUPPLY_CAPACITY_LEVEL_NORMAL;
502 static int adp5061_get_termination_current(struct adp5061_state *st,
503 union power_supply_propval *val)
508 ret = regmap_read(st->regmap, ADP5061_IEND, ®val);
512 regval = (regval & ADP5061_IEND_IEND_MSK) >> 5;
513 val->intval = adp5061_iend[regval];
518 static int adp5061_set_termination_current(struct adp5061_state *st, int val)
522 index = adp5061_get_array_index(adp5061_iend,
523 ARRAY_SIZE(adp5061_iend),
528 return regmap_update_bits(st->regmap, ADP5061_IEND,
529 ADP5061_IEND_IEND_MSK,
530 ADP5061_IEND_IEND_MODE(index));
533 static int adp5061_get_property(struct power_supply *psy,
534 enum power_supply_property psp,
535 union power_supply_propval *val)
537 struct adp5061_state *st = power_supply_get_drvdata(psy);
542 case POWER_SUPPLY_PROP_PRESENT:
543 ret = adp5061_get_status(st, &status1, &status2);
547 mode = ADP5061_CHG_STATUS_2_BAT_STATUS(status2);
548 if (mode == ADP5061_NO_BATTERY)
553 case POWER_SUPPLY_PROP_CHARGE_TYPE:
554 return adp5061_get_chg_type(st, val);
555 case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
556 /* This property is used to indicate the input current
557 * limit into VINx (ILIM)
559 return adp5061_get_input_current_limit(st, val);
560 case POWER_SUPPLY_PROP_VOLTAGE_MAX:
561 /* This property is used to indicate the termination
564 return adp5061_get_max_voltage(st, val);
565 case POWER_SUPPLY_PROP_VOLTAGE_MIN:
567 * This property is used to indicate the trickle to fast
568 * charge threshold (VTRK_DEAD)
570 return adp5061_get_min_voltage(st, val);
571 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX:
572 /* This property is used to indicate the charging
573 * voltage limit (CHG_VLIM)
575 return adp5061_get_chg_volt_lim(st, val);
576 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
578 * This property is used to indicate the value of the constant
579 * current charge (ICHG)
581 return adp5061_get_const_chg_current(st, val);
582 case POWER_SUPPLY_PROP_PRECHARGE_CURRENT:
584 * This property is used to indicate the value of the trickle
585 * and weak charge currents (ITRK_DEAD)
587 return adp5061_get_prechg_current(st, val);
588 case POWER_SUPPLY_PROP_VOLTAGE_AVG:
590 * This property is used to set the VWEAK threshold
591 * bellow this value, weak charge mode is entered
592 * above this value, fast chargerge mode is entered
594 return adp5061_get_vweak_th(st, val);
595 case POWER_SUPPLY_PROP_STATUS:
597 * Indicate the charger status in relation to power
598 * supply status property
600 return adp5061_get_charger_status(st, val);
601 case POWER_SUPPLY_PROP_CAPACITY_LEVEL:
603 * Indicate the battery status in relation to power
604 * supply capacity level property
606 return adp5061_get_battery_status(st, val);
607 case POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT:
608 /* Indicate the values of the termination current */
609 return adp5061_get_termination_current(st, val);
617 static int adp5061_set_property(struct power_supply *psy,
618 enum power_supply_property psp,
619 const union power_supply_propval *val)
621 struct adp5061_state *st = power_supply_get_drvdata(psy);
624 case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
625 return adp5061_set_input_current_limit(st, val->intval);
626 case POWER_SUPPLY_PROP_VOLTAGE_MAX:
627 return adp5061_set_max_voltage(st, val->intval);
628 case POWER_SUPPLY_PROP_VOLTAGE_MIN:
629 return adp5061_set_min_voltage(st, val->intval);
630 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX:
631 return adp5061_set_const_chg_vmax(st, val->intval);
632 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
633 return adp5061_set_const_chg_current(st, val->intval);
634 case POWER_SUPPLY_PROP_PRECHARGE_CURRENT:
635 return adp5061_set_prechg_current(st, val->intval);
636 case POWER_SUPPLY_PROP_VOLTAGE_AVG:
637 return adp5061_set_vweak_th(st, val->intval);
638 case POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT:
639 return adp5061_set_termination_current(st, val->intval);
647 static int adp5061_prop_writeable(struct power_supply *psy,
648 enum power_supply_property psp)
651 case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
652 case POWER_SUPPLY_PROP_VOLTAGE_MAX:
653 case POWER_SUPPLY_PROP_VOLTAGE_MIN:
654 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX:
655 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
656 case POWER_SUPPLY_PROP_PRECHARGE_CURRENT:
657 case POWER_SUPPLY_PROP_VOLTAGE_AVG:
658 case POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT:
665 static enum power_supply_property adp5061_props[] = {
666 POWER_SUPPLY_PROP_PRESENT,
667 POWER_SUPPLY_PROP_CHARGE_TYPE,
668 POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT,
669 POWER_SUPPLY_PROP_VOLTAGE_MAX,
670 POWER_SUPPLY_PROP_VOLTAGE_MIN,
671 POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX,
672 POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT,
673 POWER_SUPPLY_PROP_PRECHARGE_CURRENT,
674 POWER_SUPPLY_PROP_VOLTAGE_AVG,
675 POWER_SUPPLY_PROP_STATUS,
676 POWER_SUPPLY_PROP_CAPACITY_LEVEL,
677 POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT,
680 static const struct regmap_config adp5061_regmap_config = {
685 static const struct power_supply_desc adp5061_desc = {
687 .type = POWER_SUPPLY_TYPE_USB,
688 .get_property = adp5061_get_property,
689 .set_property = adp5061_set_property,
690 .property_is_writeable = adp5061_prop_writeable,
691 .properties = adp5061_props,
692 .num_properties = ARRAY_SIZE(adp5061_props),
695 static int adp5061_probe(struct i2c_client *client,
696 const struct i2c_device_id *id)
698 struct power_supply_config psy_cfg = {};
699 struct adp5061_state *st;
701 st = devm_kzalloc(&client->dev, sizeof(*st), GFP_KERNEL);
706 st->regmap = devm_regmap_init_i2c(client,
707 &adp5061_regmap_config);
708 if (IS_ERR(st->regmap)) {
709 dev_err(&client->dev, "Failed to initialize register map\n");
713 i2c_set_clientdata(client, st);
714 psy_cfg.drv_data = st;
716 st->psy = devm_power_supply_register(&client->dev,
720 if (IS_ERR(st->psy)) {
721 dev_err(&client->dev, "Failed to register power supply\n");
722 return PTR_ERR(st->psy);
728 static const struct i2c_device_id adp5061_id[] = {
732 MODULE_DEVICE_TABLE(i2c, adp5061_id);
734 static struct i2c_driver adp5061_driver = {
736 .name = KBUILD_MODNAME,
738 .probe = adp5061_probe,
739 .id_table = adp5061_id,
741 module_i2c_driver(adp5061_driver);
743 MODULE_DESCRIPTION("Analog Devices adp5061 battery charger driver");
744 MODULE_AUTHOR("Stefan Popa <stefan.popa@analog.com>");
745 MODULE_LICENSE("GPL v2");