1 // SPDX-License-Identifier: GPL-2.0
2 // BQ256XX Battery Charger Driver
3 // Copyright (C) 2020 Texas Instruments Incorporated - http://www.ti.com/
7 #include <linux/init.h>
8 #include <linux/interrupt.h>
9 #include <linux/kernel.h>
10 #include <linux/module.h>
11 #include <linux/gpio/consumer.h>
12 #include <linux/power_supply.h>
13 #include <linux/regmap.h>
14 #include <linux/types.h>
15 #include <linux/usb/phy.h>
16 #include <linux/device.h>
17 #include <linux/moduleparam.h>
18 #include <linux/slab.h>
19 #include <linux/acpi.h>
21 #define BQ256XX_MANUFACTURER "Texas Instruments"
23 #define BQ256XX_INPUT_CURRENT_LIMIT 0x00
24 #define BQ256XX_CHARGER_CONTROL_0 0x01
25 #define BQ256XX_CHARGE_CURRENT_LIMIT 0x02
26 #define BQ256XX_PRECHG_AND_TERM_CURR_LIM 0x03
27 #define BQ256XX_BATTERY_VOLTAGE_LIMIT 0x04
28 #define BQ256XX_CHARGER_CONTROL_1 0x05
29 #define BQ256XX_CHARGER_CONTROL_2 0x06
30 #define BQ256XX_CHARGER_CONTROL_3 0x07
31 #define BQ256XX_CHARGER_STATUS_0 0x08
32 #define BQ256XX_CHARGER_STATUS_1 0x09
33 #define BQ256XX_CHARGER_STATUS_2 0x0a
34 #define BQ256XX_PART_INFORMATION 0x0b
35 #define BQ256XX_CHARGER_CONTROL_4 0x0c
37 #define BQ256XX_IINDPM_MASK GENMASK(4, 0)
38 #define BQ256XX_IINDPM_STEP_uA 100000
39 #define BQ256XX_IINDPM_OFFSET_uA 100000
40 #define BQ256XX_IINDPM_MIN_uA 100000
41 #define BQ256XX_IINDPM_MAX_uA 3200000
42 #define BQ256XX_IINDPM_DEF_uA 2400000
44 #define BQ256XX_VINDPM_MASK GENMASK(3, 0)
45 #define BQ256XX_VINDPM_STEP_uV 100000
46 #define BQ256XX_VINDPM_OFFSET_uV 3900000
47 #define BQ256XX_VINDPM_MIN_uV 3900000
48 #define BQ256XX_VINDPM_MAX_uV 5400000
49 #define BQ256XX_VINDPM_DEF_uV 4500000
51 #define BQ256XX_VBATREG_MASK GENMASK(7, 3)
52 #define BQ2560X_VBATREG_STEP_uV 32000
53 #define BQ2560X_VBATREG_OFFSET_uV 3856000
54 #define BQ2560X_VBATREG_MIN_uV 3856000
55 #define BQ2560X_VBATREG_MAX_uV 4624000
56 #define BQ2560X_VBATREG_DEF_uV 4208000
57 #define BQ25601D_VBATREG_OFFSET_uV 3847000
58 #define BQ25601D_VBATREG_MIN_uV 3847000
59 #define BQ25601D_VBATREG_MAX_uV 4615000
60 #define BQ25601D_VBATREG_DEF_uV 4199000
61 #define BQ2561X_VBATREG_STEP_uV 10000
62 #define BQ25611D_VBATREG_MIN_uV 3494000
63 #define BQ25611D_VBATREG_MAX_uV 4510000
64 #define BQ25611D_VBATREG_DEF_uV 4190000
65 #define BQ25618_VBATREG_MIN_uV 3504000
66 #define BQ25618_VBATREG_MAX_uV 4500000
67 #define BQ25618_VBATREG_DEF_uV 4200000
68 #define BQ256XX_VBATREG_BIT_SHIFT 3
69 #define BQ2561X_VBATREG_THRESH 0x8
70 #define BQ25611D_VBATREG_THRESH_uV 4290000
71 #define BQ25618_VBATREG_THRESH_uV 4300000
73 #define BQ256XX_CHG_CONFIG_MASK BIT(4)
74 #define BQ256XX_CHG_CONFIG_BIT_SHIFT 4
76 #define BQ256XX_ITERM_MASK GENMASK(3, 0)
77 #define BQ256XX_ITERM_STEP_uA 60000
78 #define BQ256XX_ITERM_OFFSET_uA 60000
79 #define BQ256XX_ITERM_MIN_uA 60000
80 #define BQ256XX_ITERM_MAX_uA 780000
81 #define BQ256XX_ITERM_DEF_uA 180000
82 #define BQ25618_ITERM_STEP_uA 20000
83 #define BQ25618_ITERM_OFFSET_uA 20000
84 #define BQ25618_ITERM_MIN_uA 20000
85 #define BQ25618_ITERM_MAX_uA 260000
86 #define BQ25618_ITERM_DEF_uA 60000
88 #define BQ256XX_IPRECHG_MASK GENMASK(7, 4)
89 #define BQ256XX_IPRECHG_STEP_uA 60000
90 #define BQ256XX_IPRECHG_OFFSET_uA 60000
91 #define BQ256XX_IPRECHG_MIN_uA 60000
92 #define BQ256XX_IPRECHG_MAX_uA 780000
93 #define BQ256XX_IPRECHG_DEF_uA 180000
94 #define BQ25618_IPRECHG_STEP_uA 20000
95 #define BQ25618_IPRECHG_OFFSET_uA 20000
96 #define BQ25618_IPRECHG_MIN_uA 20000
97 #define BQ25618_IPRECHG_MAX_uA 260000
98 #define BQ25618_IPRECHG_DEF_uA 40000
99 #define BQ256XX_IPRECHG_BIT_SHIFT 4
101 #define BQ256XX_ICHG_MASK GENMASK(5, 0)
102 #define BQ256XX_ICHG_STEP_uA 60000
103 #define BQ256XX_ICHG_MIN_uA 0
104 #define BQ256XX_ICHG_MAX_uA 3000000
105 #define BQ2560X_ICHG_DEF_uA 2040000
106 #define BQ25611D_ICHG_DEF_uA 1020000
107 #define BQ25618_ICHG_STEP_uA 20000
108 #define BQ25618_ICHG_MIN_uA 0
109 #define BQ25618_ICHG_MAX_uA 1500000
110 #define BQ25618_ICHG_DEF_uA 340000
111 #define BQ25618_ICHG_THRESH 0x3c
112 #define BQ25618_ICHG_THRESH_uA 1180000
114 #define BQ256XX_VBUS_STAT_MASK GENMASK(7, 5)
115 #define BQ256XX_VBUS_STAT_NO_INPUT 0
116 #define BQ256XX_VBUS_STAT_USB_SDP BIT(5)
117 #define BQ256XX_VBUS_STAT_USB_CDP BIT(6)
118 #define BQ256XX_VBUS_STAT_USB_DCP (BIT(6) | BIT(5))
119 #define BQ256XX_VBUS_STAT_USB_OTG (BIT(7) | BIT(6) | BIT(5))
121 #define BQ256XX_CHRG_STAT_MASK GENMASK(4, 3)
122 #define BQ256XX_CHRG_STAT_NOT_CHRGING 0
123 #define BQ256XX_CHRG_STAT_PRECHRGING BIT(3)
124 #define BQ256XX_CHRG_STAT_FAST_CHRGING BIT(4)
125 #define BQ256XX_CHRG_STAT_CHRG_TERM (BIT(4) | BIT(3))
127 #define BQ256XX_PG_STAT_MASK BIT(2)
128 #define BQ256XX_WDT_FAULT_MASK BIT(7)
129 #define BQ256XX_CHRG_FAULT_MASK GENMASK(5, 4)
130 #define BQ256XX_CHRG_FAULT_NORMAL 0
131 #define BQ256XX_CHRG_FAULT_INPUT BIT(4)
132 #define BQ256XX_CHRG_FAULT_THERM BIT(5)
133 #define BQ256XX_CHRG_FAULT_CST_EXPIRE (BIT(5) | BIT(4))
134 #define BQ256XX_BAT_FAULT_MASK BIT(3)
135 #define BQ256XX_NTC_FAULT_MASK GENMASK(2, 0)
136 #define BQ256XX_NTC_FAULT_WARM BIT(1)
137 #define BQ256XX_NTC_FAULT_COOL (BIT(1) | BIT(0))
138 #define BQ256XX_NTC_FAULT_COLD (BIT(2) | BIT(0))
139 #define BQ256XX_NTC_FAULT_HOT (BIT(2) | BIT(1))
141 #define BQ256XX_NUM_WD_VAL 4
142 #define BQ256XX_WATCHDOG_MASK GENMASK(5, 4)
143 #define BQ256XX_WATCHDOG_MAX 1600000
144 #define BQ256XX_WATCHDOG_DIS 0
145 #define BQ256XX_WDT_BIT_SHIFT 4
147 #define BQ256XX_REG_RST BIT(7)
150 * struct bq256xx_init_data -
151 * @ichg: fast charge current
152 * @iindpm: input current limit
153 * @vbatreg: charge voltage
154 * @iterm: termination current
155 * @iprechg: precharge current
156 * @vindpm: input voltage limit
157 * @ichg_max: maximum fast charge current
158 * @vbatreg_max: maximum charge voltage
160 struct bq256xx_init_data {
172 * struct bq256xx_state -
173 * @vbus_stat: VBUS status according to BQ256XX_CHARGER_STATUS_0
174 * @chrg_stat: charging status according to BQ256XX_CHARGER_STATUS_0
175 * @online: PG status according to BQ256XX_CHARGER_STATUS_0
177 * @wdt_fault: watchdog fault according to BQ256XX_CHARGER_STATUS_1
178 * @bat_fault: battery fault according to BQ256XX_CHARGER_STATUS_1
179 * @chrg_fault: charging fault according to BQ256XX_CHARGER_STATUS_1
180 * @ntc_fault: TS fault according to BQ256XX_CHARGER_STATUS_1
182 struct bq256xx_state {
204 * struct bq256xx_device -
205 * @client: i2c client structure
206 * @regmap: register map structure
207 * @dev: device structure
208 * @charger: power supply registered for the charger
209 * @battery: power supply registered for the battery
210 * @lock: mutex lock structure
212 * @usb2_phy: usb_phy identifier
213 * @usb3_phy: usb_phy identifier
214 * @usb_nb: notifier block
215 * @usb_work: usb work queue
216 * @usb_event: usb_event code
218 * @model_name: i2c name string
220 * @init_data: initialization data
221 * @chip_info: device variant information
222 * @state: device status and faults
223 * @watchdog_timer: watchdog timer value in milliseconds
225 struct bq256xx_device {
226 struct i2c_client *client;
228 struct power_supply *charger;
229 struct power_supply *battery;
231 struct regmap *regmap;
233 struct usb_phy *usb2_phy;
234 struct usb_phy *usb3_phy;
235 struct notifier_block usb_nb;
236 struct work_struct usb_work;
237 unsigned long usb_event;
239 char model_name[I2C_NAME_SIZE];
241 struct bq256xx_init_data init_data;
242 const struct bq256xx_chip_info *chip_info;
243 struct bq256xx_state state;
248 * struct bq256xx_chip_info -
249 * @model_id: device instance
251 * @bq256xx_regmap_config: regmap configuration struct
252 * @bq256xx_get_ichg: pointer to instance specific get_ichg function
253 * @bq256xx_get_iindpm: pointer to instance specific get_iindpm function
254 * @bq256xx_get_vbatreg: pointer to instance specific get_vbatreg function
255 * @bq256xx_get_iterm: pointer to instance specific get_iterm function
256 * @bq256xx_get_iprechg: pointer to instance specific get_iprechg function
257 * @bq256xx_get_vindpm: pointer to instance specific get_vindpm function
259 * @bq256xx_set_ichg: pointer to instance specific set_ichg function
260 * @bq256xx_set_iindpm: pointer to instance specific set_iindpm function
261 * @bq256xx_set_vbatreg: pointer to instance specific set_vbatreg function
262 * @bq256xx_set_iterm: pointer to instance specific set_iterm function
263 * @bq256xx_set_iprechg: pointer to instance specific set_iprechg function
264 * @bq256xx_set_vindpm: pointer to instance specific set_vindpm function
265 * @bq256xx_set_charge_type: pointer to instance specific set_charge_type function
267 * @bq256xx_def_ichg: default ichg value in microamps
268 * @bq256xx_def_iindpm: default iindpm value in microamps
269 * @bq256xx_def_vbatreg: default vbatreg value in microvolts
270 * @bq256xx_def_iterm: default iterm value in microamps
271 * @bq256xx_def_iprechg: default iprechg value in microamps
272 * @bq256xx_def_vindpm: default vindpm value in microvolts
274 * @bq256xx_max_ichg: maximum charge current in microamps
275 * @bq256xx_max_vbatreg: maximum battery regulation voltage in microvolts
277 * @has_usb_detect: indicates whether device has BC1.2 detection
279 struct bq256xx_chip_info {
282 const struct regmap_config *bq256xx_regmap_config;
284 int (*bq256xx_get_ichg)(struct bq256xx_device *bq);
285 int (*bq256xx_get_iindpm)(struct bq256xx_device *bq);
286 int (*bq256xx_get_vbatreg)(struct bq256xx_device *bq);
287 int (*bq256xx_get_iterm)(struct bq256xx_device *bq);
288 int (*bq256xx_get_iprechg)(struct bq256xx_device *bq);
289 int (*bq256xx_get_vindpm)(struct bq256xx_device *bq);
291 int (*bq256xx_set_ichg)(struct bq256xx_device *bq, int ichg);
292 int (*bq256xx_set_iindpm)(struct bq256xx_device *bq, int iindpm);
293 int (*bq256xx_set_vbatreg)(struct bq256xx_device *bq, int vbatreg);
294 int (*bq256xx_set_iterm)(struct bq256xx_device *bq, int iterm);
295 int (*bq256xx_set_iprechg)(struct bq256xx_device *bq, int iprechg);
296 int (*bq256xx_set_vindpm)(struct bq256xx_device *bq, int vindpm);
297 int (*bq256xx_set_charge_type)(struct bq256xx_device *bq, int type);
299 int bq256xx_def_ichg;
300 int bq256xx_def_iindpm;
301 int bq256xx_def_vbatreg;
302 int bq256xx_def_iterm;
303 int bq256xx_def_iprechg;
304 int bq256xx_def_vindpm;
306 int bq256xx_max_ichg;
307 int bq256xx_max_vbatreg;
312 static int bq256xx_watchdog_time[BQ256XX_NUM_WD_VAL] = {
313 0, 40000, 80000, 1600000
316 static const int bq25611d_vbatreg_values[] = {
317 3494000, 3590000, 3686000, 3790000, 3894000, 3990000, 4090000, 4140000,
321 static const int bq25618_619_vbatreg_values[] = {
322 3504000, 3600000, 3696000, 3800000, 3904000, 4000000, 4100000, 4150000,
326 static const int bq25618_619_ichg_values[] = {
327 1290000, 1360000, 1430000, 1500000
330 static enum power_supply_usb_type bq256xx_usb_type[] = {
331 POWER_SUPPLY_USB_TYPE_SDP,
332 POWER_SUPPLY_USB_TYPE_CDP,
333 POWER_SUPPLY_USB_TYPE_DCP,
334 POWER_SUPPLY_USB_TYPE_UNKNOWN,
335 POWER_SUPPLY_USB_TYPE_ACA,
338 static int bq256xx_array_parse(int array_size, int val, const int array[])
345 if (val >= array[array_size - 1])
346 return array_size - 1;
348 for (i = 1; i < array_size; i++) {
352 if (val > array[i - 1] && val < array[i]) {
362 static int bq256xx_usb_notifier(struct notifier_block *nb, unsigned long val,
365 struct bq256xx_device *bq =
366 container_of(nb, struct bq256xx_device, usb_nb);
369 queue_work(system_power_efficient_wq, &bq->usb_work);
374 static void bq256xx_usb_work(struct work_struct *data)
376 struct bq256xx_device *bq =
377 container_of(data, struct bq256xx_device, usb_work);
379 switch (bq->usb_event) {
383 power_supply_changed(bq->charger);
386 dev_err(bq->dev, "Error switching to charger mode.\n");
391 static struct reg_default bq2560x_reg_defs[] = {
392 {BQ256XX_INPUT_CURRENT_LIMIT, 0x17},
393 {BQ256XX_CHARGER_CONTROL_0, 0x1a},
394 {BQ256XX_CHARGE_CURRENT_LIMIT, 0xa2},
395 {BQ256XX_PRECHG_AND_TERM_CURR_LIM, 0x22},
396 {BQ256XX_BATTERY_VOLTAGE_LIMIT, 0x58},
397 {BQ256XX_CHARGER_CONTROL_1, 0x9f},
398 {BQ256XX_CHARGER_CONTROL_2, 0x66},
399 {BQ256XX_CHARGER_CONTROL_3, 0x4c},
402 static struct reg_default bq25611d_reg_defs[] = {
403 {BQ256XX_INPUT_CURRENT_LIMIT, 0x17},
404 {BQ256XX_CHARGER_CONTROL_0, 0x1a},
405 {BQ256XX_CHARGE_CURRENT_LIMIT, 0x91},
406 {BQ256XX_PRECHG_AND_TERM_CURR_LIM, 0x12},
407 {BQ256XX_BATTERY_VOLTAGE_LIMIT, 0x40},
408 {BQ256XX_CHARGER_CONTROL_1, 0x9e},
409 {BQ256XX_CHARGER_CONTROL_2, 0xe6},
410 {BQ256XX_CHARGER_CONTROL_3, 0x4c},
411 {BQ256XX_PART_INFORMATION, 0x54},
412 {BQ256XX_CHARGER_CONTROL_4, 0x75},
415 static struct reg_default bq25618_619_reg_defs[] = {
416 {BQ256XX_INPUT_CURRENT_LIMIT, 0x17},
417 {BQ256XX_CHARGER_CONTROL_0, 0x1a},
418 {BQ256XX_CHARGE_CURRENT_LIMIT, 0x91},
419 {BQ256XX_PRECHG_AND_TERM_CURR_LIM, 0x12},
420 {BQ256XX_BATTERY_VOLTAGE_LIMIT, 0x40},
421 {BQ256XX_CHARGER_CONTROL_1, 0x9e},
422 {BQ256XX_CHARGER_CONTROL_2, 0xe6},
423 {BQ256XX_CHARGER_CONTROL_3, 0x4c},
424 {BQ256XX_PART_INFORMATION, 0x2c},
425 {BQ256XX_CHARGER_CONTROL_4, 0x75},
428 static int bq256xx_get_state(struct bq256xx_device *bq,
429 struct bq256xx_state *state)
431 unsigned int charger_status_0;
432 unsigned int charger_status_1;
435 ret = regmap_read(bq->regmap, BQ256XX_CHARGER_STATUS_0,
440 ret = regmap_read(bq->regmap, BQ256XX_CHARGER_STATUS_1,
445 state->vbus_stat = charger_status_0 & BQ256XX_VBUS_STAT_MASK;
446 state->chrg_stat = charger_status_0 & BQ256XX_CHRG_STAT_MASK;
447 state->online = charger_status_0 & BQ256XX_PG_STAT_MASK;
449 state->wdt_fault = charger_status_1 & BQ256XX_WDT_FAULT_MASK;
450 state->bat_fault = charger_status_1 & BQ256XX_BAT_FAULT_MASK;
451 state->chrg_fault = charger_status_1 & BQ256XX_CHRG_FAULT_MASK;
452 state->ntc_fault = charger_status_1 & BQ256XX_NTC_FAULT_MASK;
457 static int bq256xx_set_charge_type(struct bq256xx_device *bq, int type)
462 case POWER_SUPPLY_CHARGE_TYPE_NONE:
465 case POWER_SUPPLY_CHARGE_TYPE_TRICKLE:
466 case POWER_SUPPLY_CHARGE_TYPE_FAST:
473 return regmap_update_bits(bq->regmap, BQ256XX_CHARGER_CONTROL_0,
474 BQ256XX_CHG_CONFIG_MASK,
475 (chg_config ? 1 : 0) << BQ256XX_CHG_CONFIG_BIT_SHIFT);
478 static int bq256xx_get_ichg_curr(struct bq256xx_device *bq)
480 unsigned int charge_current_limit;
481 unsigned int ichg_reg_code;
484 ret = regmap_read(bq->regmap, BQ256XX_CHARGE_CURRENT_LIMIT,
485 &charge_current_limit);
489 ichg_reg_code = charge_current_limit & BQ256XX_ICHG_MASK;
491 return ichg_reg_code * BQ256XX_ICHG_STEP_uA;
494 static int bq25618_619_get_ichg_curr(struct bq256xx_device *bq)
496 unsigned int charge_current_limit;
497 unsigned int ichg_reg_code;
500 ret = regmap_read(bq->regmap, BQ256XX_CHARGE_CURRENT_LIMIT,
501 &charge_current_limit);
505 ichg_reg_code = charge_current_limit & BQ256XX_ICHG_MASK;
507 if (ichg_reg_code < BQ25618_ICHG_THRESH)
508 return ichg_reg_code * BQ25618_ICHG_STEP_uA;
510 return bq25618_619_ichg_values[ichg_reg_code - BQ25618_ICHG_THRESH];
513 static int bq256xx_set_ichg_curr(struct bq256xx_device *bq, int ichg)
515 unsigned int ichg_reg_code;
516 int ichg_max = bq->init_data.ichg_max;
518 ichg = clamp(ichg, BQ256XX_ICHG_MIN_uA, ichg_max);
519 ichg_reg_code = ichg / BQ256XX_ICHG_STEP_uA;
521 return regmap_update_bits(bq->regmap, BQ256XX_CHARGE_CURRENT_LIMIT,
522 BQ256XX_ICHG_MASK, ichg_reg_code);
525 static int bq25618_619_set_ichg_curr(struct bq256xx_device *bq, int ichg)
527 int array_size = ARRAY_SIZE(bq25618_619_ichg_values);
528 unsigned int ichg_reg_code;
529 int ichg_max = bq->init_data.ichg_max;
531 ichg = clamp(ichg, BQ25618_ICHG_MIN_uA, ichg_max);
533 if (ichg <= BQ25618_ICHG_THRESH_uA) {
534 ichg_reg_code = ichg / BQ25618_ICHG_STEP_uA;
536 ichg_reg_code = bq256xx_array_parse(array_size, ichg,
537 bq25618_619_ichg_values) + BQ25618_ICHG_THRESH;
540 return regmap_update_bits(bq->regmap, BQ256XX_CHARGE_CURRENT_LIMIT,
541 BQ256XX_ICHG_MASK, ichg_reg_code);
544 static int bq25618_619_get_chrg_volt(struct bq256xx_device *bq)
546 unsigned int battery_volt_lim;
547 unsigned int vbatreg_reg_code;
550 ret = regmap_read(bq->regmap, BQ256XX_BATTERY_VOLTAGE_LIMIT,
556 vbatreg_reg_code = (battery_volt_lim & BQ256XX_VBATREG_MASK) >>
557 BQ256XX_VBATREG_BIT_SHIFT;
559 if (vbatreg_reg_code > BQ2561X_VBATREG_THRESH)
560 return ((vbatreg_reg_code - BQ2561X_VBATREG_THRESH) *
561 BQ2561X_VBATREG_STEP_uV) +
562 BQ25618_VBATREG_THRESH_uV;
564 return bq25618_619_vbatreg_values[vbatreg_reg_code];
567 static int bq25611d_get_chrg_volt(struct bq256xx_device *bq)
569 unsigned int battery_volt_lim;
570 unsigned int vbatreg_reg_code;
573 ret = regmap_read(bq->regmap, BQ256XX_BATTERY_VOLTAGE_LIMIT,
578 vbatreg_reg_code = (battery_volt_lim & BQ256XX_VBATREG_MASK) >>
579 BQ256XX_VBATREG_BIT_SHIFT;
581 if (vbatreg_reg_code > BQ2561X_VBATREG_THRESH)
582 return ((vbatreg_reg_code - BQ2561X_VBATREG_THRESH) *
583 BQ2561X_VBATREG_STEP_uV) +
584 BQ25611D_VBATREG_THRESH_uV;
586 return bq25611d_vbatreg_values[vbatreg_reg_code];
589 static int bq2560x_get_chrg_volt(struct bq256xx_device *bq)
591 unsigned int battery_volt_lim;
592 unsigned int vbatreg_reg_code;
595 ret = regmap_read(bq->regmap, BQ256XX_BATTERY_VOLTAGE_LIMIT,
600 vbatreg_reg_code = (battery_volt_lim & BQ256XX_VBATREG_MASK) >>
601 BQ256XX_VBATREG_BIT_SHIFT;
603 return (vbatreg_reg_code * BQ2560X_VBATREG_STEP_uV)
604 + BQ2560X_VBATREG_OFFSET_uV;
607 static int bq25601d_get_chrg_volt(struct bq256xx_device *bq)
609 unsigned int battery_volt_lim;
610 unsigned int vbatreg_reg_code;
613 ret = regmap_read(bq->regmap, BQ256XX_BATTERY_VOLTAGE_LIMIT,
618 vbatreg_reg_code = (battery_volt_lim & BQ256XX_VBATREG_MASK) >>
619 BQ256XX_VBATREG_BIT_SHIFT;
621 return (vbatreg_reg_code * BQ2560X_VBATREG_STEP_uV)
622 + BQ25601D_VBATREG_OFFSET_uV;
625 static int bq25618_619_set_chrg_volt(struct bq256xx_device *bq, int vbatreg)
627 int array_size = ARRAY_SIZE(bq25618_619_vbatreg_values);
628 unsigned int vbatreg_reg_code;
629 int vbatreg_max = bq->init_data.vbatreg_max;
631 vbatreg = clamp(vbatreg, BQ25618_VBATREG_MIN_uV, vbatreg_max);
633 if (vbatreg > BQ25618_VBATREG_THRESH_uV)
634 vbatreg_reg_code = ((vbatreg -
635 BQ25618_VBATREG_THRESH_uV) /
636 (BQ2561X_VBATREG_STEP_uV)) + BQ2561X_VBATREG_THRESH;
638 vbatreg_reg_code = bq256xx_array_parse(array_size, vbatreg,
639 bq25618_619_vbatreg_values);
642 return regmap_update_bits(bq->regmap, BQ256XX_BATTERY_VOLTAGE_LIMIT,
643 BQ256XX_VBATREG_MASK, vbatreg_reg_code <<
644 BQ256XX_VBATREG_BIT_SHIFT);
647 static int bq25611d_set_chrg_volt(struct bq256xx_device *bq, int vbatreg)
649 int array_size = ARRAY_SIZE(bq25611d_vbatreg_values);
650 unsigned int vbatreg_reg_code;
651 int vbatreg_max = bq->init_data.vbatreg_max;
653 vbatreg = clamp(vbatreg, BQ25611D_VBATREG_MIN_uV, vbatreg_max);
655 if (vbatreg > BQ25611D_VBATREG_THRESH_uV)
656 vbatreg_reg_code = ((vbatreg -
657 BQ25611D_VBATREG_THRESH_uV) /
658 (BQ2561X_VBATREG_STEP_uV)) + BQ2561X_VBATREG_THRESH;
660 vbatreg_reg_code = bq256xx_array_parse(array_size, vbatreg,
661 bq25611d_vbatreg_values);
664 return regmap_update_bits(bq->regmap, BQ256XX_BATTERY_VOLTAGE_LIMIT,
665 BQ256XX_VBATREG_MASK, vbatreg_reg_code <<
666 BQ256XX_VBATREG_BIT_SHIFT);
669 static int bq2560x_set_chrg_volt(struct bq256xx_device *bq, int vbatreg)
671 unsigned int vbatreg_reg_code;
672 int vbatreg_max = bq->init_data.vbatreg_max;
674 vbatreg = clamp(vbatreg, BQ2560X_VBATREG_MIN_uV, vbatreg_max);
676 vbatreg_reg_code = (vbatreg - BQ2560X_VBATREG_OFFSET_uV) /
677 BQ2560X_VBATREG_STEP_uV;
679 return regmap_update_bits(bq->regmap, BQ256XX_BATTERY_VOLTAGE_LIMIT,
680 BQ256XX_VBATREG_MASK, vbatreg_reg_code <<
681 BQ256XX_VBATREG_BIT_SHIFT);
684 static int bq25601d_set_chrg_volt(struct bq256xx_device *bq, int vbatreg)
686 unsigned int vbatreg_reg_code;
687 int vbatreg_max = bq->init_data.vbatreg_max;
689 vbatreg = clamp(vbatreg, BQ25601D_VBATREG_MIN_uV, vbatreg_max);
691 vbatreg_reg_code = (vbatreg - BQ25601D_VBATREG_OFFSET_uV) /
692 BQ2560X_VBATREG_STEP_uV;
694 return regmap_update_bits(bq->regmap, BQ256XX_BATTERY_VOLTAGE_LIMIT,
695 BQ256XX_VBATREG_MASK, vbatreg_reg_code <<
696 BQ256XX_VBATREG_BIT_SHIFT);
699 static int bq256xx_get_prechrg_curr(struct bq256xx_device *bq)
701 unsigned int prechg_and_term_curr_lim;
702 unsigned int iprechg_reg_code;
705 ret = regmap_read(bq->regmap, BQ256XX_PRECHG_AND_TERM_CURR_LIM,
706 &prechg_and_term_curr_lim);
710 iprechg_reg_code = (prechg_and_term_curr_lim & BQ256XX_IPRECHG_MASK)
711 >> BQ256XX_IPRECHG_BIT_SHIFT;
713 return (iprechg_reg_code * BQ256XX_IPRECHG_STEP_uA) +
714 BQ256XX_IPRECHG_OFFSET_uA;
717 static int bq256xx_set_prechrg_curr(struct bq256xx_device *bq, int iprechg)
719 unsigned int iprechg_reg_code;
721 iprechg = clamp(iprechg, BQ256XX_IPRECHG_MIN_uA,
722 BQ256XX_IPRECHG_MAX_uA);
724 iprechg_reg_code = ((iprechg - BQ256XX_IPRECHG_OFFSET_uA) /
725 BQ256XX_IPRECHG_STEP_uA) << BQ256XX_IPRECHG_BIT_SHIFT;
727 return regmap_update_bits(bq->regmap, BQ256XX_PRECHG_AND_TERM_CURR_LIM,
728 BQ256XX_IPRECHG_MASK, iprechg_reg_code);
731 static int bq25618_619_get_prechrg_curr(struct bq256xx_device *bq)
733 unsigned int prechg_and_term_curr_lim;
734 unsigned int iprechg_reg_code;
737 ret = regmap_read(bq->regmap, BQ256XX_PRECHG_AND_TERM_CURR_LIM,
738 &prechg_and_term_curr_lim);
742 iprechg_reg_code = (prechg_and_term_curr_lim & BQ256XX_IPRECHG_MASK)
743 >> BQ256XX_IPRECHG_BIT_SHIFT;
745 return (iprechg_reg_code * BQ25618_IPRECHG_STEP_uA) +
746 BQ25618_IPRECHG_OFFSET_uA;
749 static int bq25618_619_set_prechrg_curr(struct bq256xx_device *bq, int iprechg)
751 unsigned int iprechg_reg_code;
753 iprechg = clamp(iprechg, BQ25618_IPRECHG_MIN_uA,
754 BQ25618_IPRECHG_MAX_uA);
756 iprechg_reg_code = ((iprechg - BQ25618_IPRECHG_OFFSET_uA) /
757 BQ25618_IPRECHG_STEP_uA) << BQ256XX_IPRECHG_BIT_SHIFT;
759 return regmap_update_bits(bq->regmap, BQ256XX_PRECHG_AND_TERM_CURR_LIM,
760 BQ256XX_IPRECHG_MASK, iprechg_reg_code);
763 static int bq256xx_get_term_curr(struct bq256xx_device *bq)
765 unsigned int prechg_and_term_curr_lim;
766 unsigned int iterm_reg_code;
769 ret = regmap_read(bq->regmap, BQ256XX_PRECHG_AND_TERM_CURR_LIM,
770 &prechg_and_term_curr_lim);
774 iterm_reg_code = prechg_and_term_curr_lim & BQ256XX_ITERM_MASK;
776 return (iterm_reg_code * BQ256XX_ITERM_STEP_uA) +
777 BQ256XX_ITERM_OFFSET_uA;
780 static int bq256xx_set_term_curr(struct bq256xx_device *bq, int iterm)
782 unsigned int iterm_reg_code;
784 iterm = clamp(iterm, BQ256XX_ITERM_MIN_uA, BQ256XX_ITERM_MAX_uA);
786 iterm_reg_code = (iterm - BQ256XX_ITERM_OFFSET_uA) /
787 BQ256XX_ITERM_STEP_uA;
789 return regmap_update_bits(bq->regmap, BQ256XX_PRECHG_AND_TERM_CURR_LIM,
790 BQ256XX_ITERM_MASK, iterm_reg_code);
793 static int bq25618_619_get_term_curr(struct bq256xx_device *bq)
795 unsigned int prechg_and_term_curr_lim;
796 unsigned int iterm_reg_code;
799 ret = regmap_read(bq->regmap, BQ256XX_PRECHG_AND_TERM_CURR_LIM,
800 &prechg_and_term_curr_lim);
804 iterm_reg_code = prechg_and_term_curr_lim & BQ256XX_ITERM_MASK;
806 return (iterm_reg_code * BQ25618_ITERM_STEP_uA) +
807 BQ25618_ITERM_OFFSET_uA;
810 static int bq25618_619_set_term_curr(struct bq256xx_device *bq, int iterm)
812 unsigned int iterm_reg_code;
814 iterm = clamp(iterm, BQ25618_ITERM_MIN_uA, BQ25618_ITERM_MAX_uA);
816 iterm_reg_code = (iterm - BQ25618_ITERM_OFFSET_uA) /
817 BQ25618_ITERM_STEP_uA;
819 return regmap_update_bits(bq->regmap, BQ256XX_PRECHG_AND_TERM_CURR_LIM,
820 BQ256XX_ITERM_MASK, iterm_reg_code);
823 static int bq256xx_get_input_volt_lim(struct bq256xx_device *bq)
825 unsigned int charger_control_2;
826 unsigned int vindpm_reg_code;
829 ret = regmap_read(bq->regmap, BQ256XX_CHARGER_CONTROL_2,
834 vindpm_reg_code = charger_control_2 & BQ256XX_VINDPM_MASK;
836 return (vindpm_reg_code * BQ256XX_VINDPM_STEP_uV) +
837 BQ256XX_VINDPM_OFFSET_uV;
840 static int bq256xx_set_input_volt_lim(struct bq256xx_device *bq, int vindpm)
842 unsigned int vindpm_reg_code;
844 vindpm = clamp(vindpm, BQ256XX_VINDPM_MIN_uV, BQ256XX_VINDPM_MAX_uV);
846 vindpm_reg_code = (vindpm - BQ256XX_VINDPM_OFFSET_uV) /
847 BQ256XX_VINDPM_STEP_uV;
849 return regmap_update_bits(bq->regmap, BQ256XX_CHARGER_CONTROL_2,
850 BQ256XX_VINDPM_MASK, vindpm_reg_code);
853 static int bq256xx_get_input_curr_lim(struct bq256xx_device *bq)
855 unsigned int input_current_limit;
856 unsigned int iindpm_reg_code;
859 ret = regmap_read(bq->regmap, BQ256XX_INPUT_CURRENT_LIMIT,
860 &input_current_limit);
864 iindpm_reg_code = input_current_limit & BQ256XX_IINDPM_MASK;
866 return (iindpm_reg_code * BQ256XX_IINDPM_STEP_uA) +
867 BQ256XX_IINDPM_OFFSET_uA;
870 static int bq256xx_set_input_curr_lim(struct bq256xx_device *bq, int iindpm)
872 unsigned int iindpm_reg_code;
874 iindpm = clamp(iindpm, BQ256XX_IINDPM_MIN_uA, BQ256XX_IINDPM_MAX_uA);
876 iindpm_reg_code = (iindpm - BQ256XX_IINDPM_OFFSET_uA) /
877 BQ256XX_IINDPM_STEP_uA;
879 return regmap_update_bits(bq->regmap, BQ256XX_INPUT_CURRENT_LIMIT,
880 BQ256XX_IINDPM_MASK, iindpm_reg_code);
883 static void bq256xx_charger_reset(void *data)
885 struct bq256xx_device *bq = data;
887 regmap_update_bits(bq->regmap, BQ256XX_PART_INFORMATION,
888 BQ256XX_REG_RST, BQ256XX_REG_RST);
890 if (!IS_ERR_OR_NULL(bq->usb2_phy))
891 usb_unregister_notifier(bq->usb2_phy, &bq->usb_nb);
893 if (!IS_ERR_OR_NULL(bq->usb3_phy))
894 usb_unregister_notifier(bq->usb3_phy, &bq->usb_nb);
897 static int bq256xx_set_charger_property(struct power_supply *psy,
898 enum power_supply_property prop,
899 const union power_supply_propval *val)
901 struct bq256xx_device *bq = power_supply_get_drvdata(psy);
905 case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
906 ret = bq->chip_info->bq256xx_set_iindpm(bq, val->intval);
911 case POWER_SUPPLY_PROP_STATUS:
914 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
915 ret = bq->chip_info->bq256xx_set_vbatreg(bq, val->intval);
920 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
921 ret = bq->chip_info->bq256xx_set_ichg(bq, val->intval);
926 case POWER_SUPPLY_PROP_PRECHARGE_CURRENT:
927 ret = bq->chip_info->bq256xx_set_iprechg(bq, val->intval);
932 case POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT:
933 ret = bq->chip_info->bq256xx_set_iterm(bq, val->intval);
938 case POWER_SUPPLY_PROP_INPUT_VOLTAGE_LIMIT:
939 ret = bq->chip_info->bq256xx_set_vindpm(bq, val->intval);
944 case POWER_SUPPLY_PROP_CHARGE_TYPE:
945 ret = bq->chip_info->bq256xx_set_charge_type(bq, val->intval);
958 static int bq256xx_get_battery_property(struct power_supply *psy,
959 enum power_supply_property psp,
960 union power_supply_propval *val)
962 struct bq256xx_device *bq = power_supply_get_drvdata(psy);
965 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX:
966 val->intval = bq->init_data.ichg_max;
969 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX:
970 val->intval = bq->init_data.vbatreg_max;
980 static int bq256xx_get_charger_property(struct power_supply *psy,
981 enum power_supply_property psp,
982 union power_supply_propval *val)
984 struct bq256xx_device *bq = power_supply_get_drvdata(psy);
985 struct bq256xx_state state;
988 mutex_lock(&bq->lock);
989 ret = bq256xx_get_state(bq, &state);
990 mutex_unlock(&bq->lock);
995 case POWER_SUPPLY_PROP_STATUS:
996 if (state.vbus_stat == BQ256XX_VBUS_STAT_NO_INPUT ||
997 state.vbus_stat == BQ256XX_VBUS_STAT_USB_OTG)
998 val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
999 else if (state.chrg_stat == BQ256XX_CHRG_STAT_NOT_CHRGING)
1000 val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING;
1001 else if (state.chrg_stat == BQ256XX_CHRG_STAT_CHRG_TERM)
1002 val->intval = POWER_SUPPLY_STATUS_FULL;
1004 val->intval = POWER_SUPPLY_STATUS_CHARGING;
1007 case POWER_SUPPLY_PROP_HEALTH:
1008 val->intval = POWER_SUPPLY_HEALTH_UNKNOWN;
1009 if (state.wdt_fault) {
1011 POWER_SUPPLY_HEALTH_WATCHDOG_TIMER_EXPIRE;
1012 } else if (state.bat_fault) {
1013 val->intval = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
1015 switch (state.chrg_stat) {
1016 case BQ256XX_CHRG_FAULT_INPUT:
1018 POWER_SUPPLY_HEALTH_UNSPEC_FAILURE;
1020 case BQ256XX_CHRG_FAULT_THERM:
1021 val->intval = POWER_SUPPLY_HEALTH_OVERHEAT;
1023 case BQ256XX_CHRG_FAULT_CST_EXPIRE:
1025 POWER_SUPPLY_HEALTH_SAFETY_TIMER_EXPIRE;
1031 switch (state.ntc_fault) {
1032 case BQ256XX_NTC_FAULT_WARM:
1033 val->intval = POWER_SUPPLY_HEALTH_WARM;
1035 case BQ256XX_NTC_FAULT_COOL:
1036 val->intval = POWER_SUPPLY_HEALTH_COOL;
1038 case BQ256XX_NTC_FAULT_COLD:
1039 val->intval = POWER_SUPPLY_HEALTH_COLD;
1041 case BQ256XX_NTC_FAULT_HOT:
1042 val->intval = POWER_SUPPLY_HEALTH_HOT;
1045 val->intval = POWER_SUPPLY_HEALTH_GOOD;
1051 case POWER_SUPPLY_PROP_USB_TYPE:
1052 if (bq->chip_info->has_usb_detect) {
1053 switch (state.vbus_stat) {
1054 case BQ256XX_VBUS_STAT_USB_SDP:
1055 val->intval = POWER_SUPPLY_USB_TYPE_SDP;
1057 case BQ256XX_VBUS_STAT_USB_CDP:
1058 val->intval = POWER_SUPPLY_USB_TYPE_CDP;
1060 case BQ256XX_VBUS_STAT_USB_DCP:
1061 val->intval = POWER_SUPPLY_USB_TYPE_DCP;
1063 case BQ256XX_VBUS_STAT_USB_OTG:
1064 val->intval = POWER_SUPPLY_USB_TYPE_ACA;
1067 val->intval = POWER_SUPPLY_USB_TYPE_UNKNOWN;
1071 switch (state.vbus_stat) {
1072 case BQ256XX_VBUS_STAT_USB_SDP:
1073 val->intval = POWER_SUPPLY_USB_TYPE_SDP;
1075 case BQ256XX_VBUS_STAT_USB_OTG:
1076 val->intval = POWER_SUPPLY_USB_TYPE_ACA;
1079 val->intval = POWER_SUPPLY_USB_TYPE_UNKNOWN;
1085 case POWER_SUPPLY_PROP_CHARGE_TYPE:
1086 switch (state.chrg_stat) {
1087 case BQ256XX_CHRG_STAT_NOT_CHRGING:
1088 val->intval = POWER_SUPPLY_CHARGE_TYPE_NONE;
1090 case BQ256XX_CHRG_STAT_PRECHRGING:
1091 val->intval = POWER_SUPPLY_CHARGE_TYPE_TRICKLE;
1093 case BQ256XX_CHRG_STAT_FAST_CHRGING:
1094 val->intval = POWER_SUPPLY_CHARGE_TYPE_FAST;
1096 case BQ256XX_CHRG_STAT_CHRG_TERM:
1097 val->intval = POWER_SUPPLY_CHARGE_TYPE_TRICKLE;
1100 val->intval = POWER_SUPPLY_CHARGE_TYPE_UNKNOWN;
1104 case POWER_SUPPLY_PROP_MANUFACTURER:
1105 val->strval = BQ256XX_MANUFACTURER;
1108 case POWER_SUPPLY_PROP_MODEL_NAME:
1109 val->strval = bq->model_name;
1112 case POWER_SUPPLY_PROP_ONLINE:
1113 val->intval = state.online;
1116 case POWER_SUPPLY_PROP_INPUT_VOLTAGE_LIMIT:
1117 ret = bq->chip_info->bq256xx_get_vindpm(bq);
1123 case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
1124 ret = bq->chip_info->bq256xx_get_iindpm(bq);
1130 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
1131 ret = bq->chip_info->bq256xx_get_vbatreg(bq);
1137 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
1138 ret = bq->chip_info->bq256xx_get_ichg(bq);
1144 case POWER_SUPPLY_PROP_PRECHARGE_CURRENT:
1145 ret = bq->chip_info->bq256xx_get_iprechg(bq);
1151 case POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT:
1152 ret = bq->chip_info->bq256xx_get_iterm(bq);
1165 static bool bq256xx_state_changed(struct bq256xx_device *bq,
1166 struct bq256xx_state *new_state)
1168 struct bq256xx_state old_state;
1170 mutex_lock(&bq->lock);
1171 old_state = bq->state;
1172 mutex_unlock(&bq->lock);
1174 return memcmp(&old_state, new_state, sizeof(struct bq256xx_state)) != 0;
1177 static irqreturn_t bq256xx_irq_handler_thread(int irq, void *private)
1179 struct bq256xx_device *bq = private;
1180 struct bq256xx_state state;
1183 ret = bq256xx_get_state(bq, &state);
1187 if (!bq256xx_state_changed(bq, &state))
1190 mutex_lock(&bq->lock);
1192 mutex_unlock(&bq->lock);
1194 power_supply_changed(bq->charger);
1200 static enum power_supply_property bq256xx_power_supply_props[] = {
1201 POWER_SUPPLY_PROP_MANUFACTURER,
1202 POWER_SUPPLY_PROP_MODEL_NAME,
1203 POWER_SUPPLY_PROP_STATUS,
1204 POWER_SUPPLY_PROP_ONLINE,
1205 POWER_SUPPLY_PROP_HEALTH,
1206 POWER_SUPPLY_PROP_INPUT_VOLTAGE_LIMIT,
1207 POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT,
1208 POWER_SUPPLY_PROP_CHARGE_TYPE,
1209 POWER_SUPPLY_PROP_USB_TYPE,
1210 POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT,
1211 POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE,
1212 POWER_SUPPLY_PROP_PRECHARGE_CURRENT,
1213 POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT,
1216 static enum power_supply_property bq256xx_battery_props[] = {
1217 POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX,
1218 POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX,
1221 static int bq256xx_property_is_writeable(struct power_supply *psy,
1222 enum power_supply_property prop)
1225 case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
1226 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
1227 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
1228 case POWER_SUPPLY_PROP_PRECHARGE_CURRENT:
1229 case POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT:
1230 case POWER_SUPPLY_PROP_STATUS:
1231 case POWER_SUPPLY_PROP_INPUT_VOLTAGE_LIMIT:
1232 case POWER_SUPPLY_PROP_CHARGE_TYPE:
1239 static const struct power_supply_desc bq256xx_power_supply_desc = {
1240 .name = "bq256xx-charger",
1241 .type = POWER_SUPPLY_TYPE_USB,
1242 .usb_types = bq256xx_usb_type,
1243 .num_usb_types = ARRAY_SIZE(bq256xx_usb_type),
1244 .properties = bq256xx_power_supply_props,
1245 .num_properties = ARRAY_SIZE(bq256xx_power_supply_props),
1246 .get_property = bq256xx_get_charger_property,
1247 .set_property = bq256xx_set_charger_property,
1248 .property_is_writeable = bq256xx_property_is_writeable,
1251 static struct power_supply_desc bq256xx_battery_desc = {
1252 .name = "bq256xx-battery",
1253 .type = POWER_SUPPLY_TYPE_BATTERY,
1254 .get_property = bq256xx_get_battery_property,
1255 .properties = bq256xx_battery_props,
1256 .num_properties = ARRAY_SIZE(bq256xx_battery_props),
1257 .property_is_writeable = bq256xx_property_is_writeable,
1261 static bool bq256xx_is_volatile_reg(struct device *dev, unsigned int reg)
1264 case BQ256XX_INPUT_CURRENT_LIMIT:
1265 case BQ256XX_CHARGER_STATUS_0...BQ256XX_CHARGER_STATUS_2:
1272 static const struct regmap_config bq25600_regmap_config = {
1276 .max_register = BQ256XX_PART_INFORMATION,
1277 .reg_defaults = bq2560x_reg_defs,
1278 .num_reg_defaults = ARRAY_SIZE(bq2560x_reg_defs),
1279 .cache_type = REGCACHE_FLAT,
1280 .volatile_reg = bq256xx_is_volatile_reg,
1283 static const struct regmap_config bq25611d_regmap_config = {
1287 .max_register = BQ256XX_CHARGER_CONTROL_4,
1288 .reg_defaults = bq25611d_reg_defs,
1289 .num_reg_defaults = ARRAY_SIZE(bq25611d_reg_defs),
1290 .cache_type = REGCACHE_FLAT,
1291 .volatile_reg = bq256xx_is_volatile_reg,
1294 static const struct regmap_config bq25618_619_regmap_config = {
1298 .max_register = BQ256XX_CHARGER_CONTROL_4,
1299 .reg_defaults = bq25618_619_reg_defs,
1300 .num_reg_defaults = ARRAY_SIZE(bq25618_619_reg_defs),
1301 .cache_type = REGCACHE_FLAT,
1302 .volatile_reg = bq256xx_is_volatile_reg,
1305 static const struct bq256xx_chip_info bq256xx_chip_info_tbl[] = {
1307 .model_id = BQ25600,
1308 .bq256xx_regmap_config = &bq25600_regmap_config,
1309 .bq256xx_get_ichg = bq256xx_get_ichg_curr,
1310 .bq256xx_get_iindpm = bq256xx_get_input_curr_lim,
1311 .bq256xx_get_vbatreg = bq2560x_get_chrg_volt,
1312 .bq256xx_get_iterm = bq256xx_get_term_curr,
1313 .bq256xx_get_iprechg = bq256xx_get_prechrg_curr,
1314 .bq256xx_get_vindpm = bq256xx_get_input_volt_lim,
1316 .bq256xx_set_ichg = bq256xx_set_ichg_curr,
1317 .bq256xx_set_iindpm = bq256xx_set_input_curr_lim,
1318 .bq256xx_set_vbatreg = bq2560x_set_chrg_volt,
1319 .bq256xx_set_iterm = bq256xx_set_term_curr,
1320 .bq256xx_set_iprechg = bq256xx_set_prechrg_curr,
1321 .bq256xx_set_vindpm = bq256xx_set_input_volt_lim,
1322 .bq256xx_set_charge_type = bq256xx_set_charge_type,
1324 .bq256xx_def_ichg = BQ2560X_ICHG_DEF_uA,
1325 .bq256xx_def_iindpm = BQ256XX_IINDPM_DEF_uA,
1326 .bq256xx_def_vbatreg = BQ2560X_VBATREG_DEF_uV,
1327 .bq256xx_def_iterm = BQ256XX_ITERM_DEF_uA,
1328 .bq256xx_def_iprechg = BQ256XX_IPRECHG_DEF_uA,
1329 .bq256xx_def_vindpm = BQ256XX_VINDPM_DEF_uV,
1331 .bq256xx_max_ichg = BQ256XX_ICHG_MAX_uA,
1332 .bq256xx_max_vbatreg = BQ2560X_VBATREG_MAX_uV,
1334 .has_usb_detect = false,
1338 .model_id = BQ25600D,
1339 .bq256xx_regmap_config = &bq25600_regmap_config,
1340 .bq256xx_get_ichg = bq256xx_get_ichg_curr,
1341 .bq256xx_get_iindpm = bq256xx_get_input_curr_lim,
1342 .bq256xx_get_vbatreg = bq2560x_get_chrg_volt,
1343 .bq256xx_get_iterm = bq256xx_get_term_curr,
1344 .bq256xx_get_iprechg = bq256xx_get_prechrg_curr,
1345 .bq256xx_get_vindpm = bq256xx_get_input_volt_lim,
1347 .bq256xx_set_ichg = bq256xx_set_ichg_curr,
1348 .bq256xx_set_iindpm = bq256xx_set_input_curr_lim,
1349 .bq256xx_set_vbatreg = bq2560x_set_chrg_volt,
1350 .bq256xx_set_iterm = bq256xx_set_term_curr,
1351 .bq256xx_set_iprechg = bq256xx_set_prechrg_curr,
1352 .bq256xx_set_vindpm = bq256xx_set_input_volt_lim,
1353 .bq256xx_set_charge_type = bq256xx_set_charge_type,
1355 .bq256xx_def_ichg = BQ2560X_ICHG_DEF_uA,
1356 .bq256xx_def_iindpm = BQ256XX_IINDPM_DEF_uA,
1357 .bq256xx_def_vbatreg = BQ2560X_VBATREG_DEF_uV,
1358 .bq256xx_def_iterm = BQ256XX_ITERM_DEF_uA,
1359 .bq256xx_def_iprechg = BQ256XX_IPRECHG_DEF_uA,
1360 .bq256xx_def_vindpm = BQ256XX_VINDPM_DEF_uV,
1362 .bq256xx_max_ichg = BQ256XX_ICHG_MAX_uA,
1363 .bq256xx_max_vbatreg = BQ2560X_VBATREG_MAX_uV,
1365 .has_usb_detect = true,
1369 .model_id = BQ25601,
1370 .bq256xx_regmap_config = &bq25600_regmap_config,
1371 .bq256xx_get_ichg = bq256xx_get_ichg_curr,
1372 .bq256xx_get_iindpm = bq256xx_get_input_curr_lim,
1373 .bq256xx_get_vbatreg = bq2560x_get_chrg_volt,
1374 .bq256xx_get_iterm = bq256xx_get_term_curr,
1375 .bq256xx_get_iprechg = bq256xx_get_prechrg_curr,
1376 .bq256xx_get_vindpm = bq256xx_get_input_volt_lim,
1378 .bq256xx_set_ichg = bq256xx_set_ichg_curr,
1379 .bq256xx_set_iindpm = bq256xx_set_input_curr_lim,
1380 .bq256xx_set_vbatreg = bq2560x_set_chrg_volt,
1381 .bq256xx_set_iterm = bq256xx_set_term_curr,
1382 .bq256xx_set_iprechg = bq256xx_set_prechrg_curr,
1383 .bq256xx_set_vindpm = bq256xx_set_input_volt_lim,
1384 .bq256xx_set_charge_type = bq256xx_set_charge_type,
1386 .bq256xx_def_ichg = BQ2560X_ICHG_DEF_uA,
1387 .bq256xx_def_iindpm = BQ256XX_IINDPM_DEF_uA,
1388 .bq256xx_def_vbatreg = BQ2560X_VBATREG_DEF_uV,
1389 .bq256xx_def_iterm = BQ256XX_ITERM_DEF_uA,
1390 .bq256xx_def_iprechg = BQ256XX_IPRECHG_DEF_uA,
1391 .bq256xx_def_vindpm = BQ256XX_VINDPM_DEF_uV,
1393 .bq256xx_max_ichg = BQ256XX_ICHG_MAX_uA,
1394 .bq256xx_max_vbatreg = BQ2560X_VBATREG_MAX_uV,
1396 .has_usb_detect = false,
1400 .model_id = BQ25601D,
1401 .bq256xx_regmap_config = &bq25600_regmap_config,
1402 .bq256xx_get_ichg = bq256xx_get_ichg_curr,
1403 .bq256xx_get_iindpm = bq256xx_get_input_curr_lim,
1404 .bq256xx_get_vbatreg = bq25601d_get_chrg_volt,
1405 .bq256xx_get_iterm = bq256xx_get_term_curr,
1406 .bq256xx_get_iprechg = bq256xx_get_prechrg_curr,
1407 .bq256xx_get_vindpm = bq256xx_get_input_volt_lim,
1409 .bq256xx_set_ichg = bq256xx_set_ichg_curr,
1410 .bq256xx_set_iindpm = bq256xx_set_input_curr_lim,
1411 .bq256xx_set_vbatreg = bq25601d_set_chrg_volt,
1412 .bq256xx_set_iterm = bq256xx_set_term_curr,
1413 .bq256xx_set_iprechg = bq256xx_set_prechrg_curr,
1414 .bq256xx_set_vindpm = bq256xx_set_input_volt_lim,
1415 .bq256xx_set_charge_type = bq256xx_set_charge_type,
1417 .bq256xx_def_ichg = BQ2560X_ICHG_DEF_uA,
1418 .bq256xx_def_iindpm = BQ256XX_IINDPM_DEF_uA,
1419 .bq256xx_def_vbatreg = BQ2560X_VBATREG_DEF_uV,
1420 .bq256xx_def_iterm = BQ256XX_ITERM_DEF_uA,
1421 .bq256xx_def_iprechg = BQ256XX_IPRECHG_DEF_uA,
1422 .bq256xx_def_vindpm = BQ256XX_VINDPM_DEF_uV,
1424 .bq256xx_max_ichg = BQ256XX_ICHG_MAX_uA,
1425 .bq256xx_max_vbatreg = BQ2560X_VBATREG_MAX_uV,
1427 .has_usb_detect = true,
1431 .model_id = BQ25611D,
1432 .bq256xx_regmap_config = &bq25611d_regmap_config,
1433 .bq256xx_get_ichg = bq256xx_get_ichg_curr,
1434 .bq256xx_get_iindpm = bq256xx_get_input_curr_lim,
1435 .bq256xx_get_vbatreg = bq25611d_get_chrg_volt,
1436 .bq256xx_get_iterm = bq256xx_get_term_curr,
1437 .bq256xx_get_iprechg = bq256xx_get_prechrg_curr,
1438 .bq256xx_get_vindpm = bq256xx_get_input_volt_lim,
1440 .bq256xx_set_ichg = bq256xx_set_ichg_curr,
1441 .bq256xx_set_iindpm = bq256xx_set_input_curr_lim,
1442 .bq256xx_set_vbatreg = bq25611d_set_chrg_volt,
1443 .bq256xx_set_iterm = bq256xx_set_term_curr,
1444 .bq256xx_set_iprechg = bq256xx_set_prechrg_curr,
1445 .bq256xx_set_vindpm = bq256xx_set_input_volt_lim,
1446 .bq256xx_set_charge_type = bq256xx_set_charge_type,
1448 .bq256xx_def_ichg = BQ25611D_ICHG_DEF_uA,
1449 .bq256xx_def_iindpm = BQ256XX_IINDPM_DEF_uA,
1450 .bq256xx_def_vbatreg = BQ25611D_VBATREG_DEF_uV,
1451 .bq256xx_def_iterm = BQ256XX_ITERM_DEF_uA,
1452 .bq256xx_def_iprechg = BQ256XX_IPRECHG_DEF_uA,
1453 .bq256xx_def_vindpm = BQ256XX_VINDPM_DEF_uV,
1455 .bq256xx_max_ichg = BQ256XX_ICHG_MAX_uA,
1456 .bq256xx_max_vbatreg = BQ25611D_VBATREG_MAX_uV,
1458 .has_usb_detect = true,
1462 .model_id = BQ25618,
1463 .bq256xx_regmap_config = &bq25618_619_regmap_config,
1464 .bq256xx_get_ichg = bq25618_619_get_ichg_curr,
1465 .bq256xx_get_iindpm = bq256xx_get_input_curr_lim,
1466 .bq256xx_get_vbatreg = bq25618_619_get_chrg_volt,
1467 .bq256xx_get_iterm = bq25618_619_get_term_curr,
1468 .bq256xx_get_iprechg = bq25618_619_get_prechrg_curr,
1469 .bq256xx_get_vindpm = bq256xx_get_input_volt_lim,
1471 .bq256xx_set_ichg = bq25618_619_set_ichg_curr,
1472 .bq256xx_set_iindpm = bq256xx_set_input_curr_lim,
1473 .bq256xx_set_vbatreg = bq25618_619_set_chrg_volt,
1474 .bq256xx_set_iterm = bq25618_619_set_term_curr,
1475 .bq256xx_set_iprechg = bq25618_619_set_prechrg_curr,
1476 .bq256xx_set_vindpm = bq256xx_set_input_volt_lim,
1477 .bq256xx_set_charge_type = bq256xx_set_charge_type,
1479 .bq256xx_def_ichg = BQ25618_ICHG_DEF_uA,
1480 .bq256xx_def_iindpm = BQ256XX_IINDPM_DEF_uA,
1481 .bq256xx_def_vbatreg = BQ25618_VBATREG_DEF_uV,
1482 .bq256xx_def_iterm = BQ25618_ITERM_DEF_uA,
1483 .bq256xx_def_iprechg = BQ25618_IPRECHG_DEF_uA,
1484 .bq256xx_def_vindpm = BQ256XX_VINDPM_DEF_uV,
1486 .bq256xx_max_ichg = BQ25618_ICHG_MAX_uA,
1487 .bq256xx_max_vbatreg = BQ25618_VBATREG_MAX_uV,
1489 .has_usb_detect = false,
1493 .model_id = BQ25619,
1494 .bq256xx_regmap_config = &bq25618_619_regmap_config,
1495 .bq256xx_get_ichg = bq25618_619_get_ichg_curr,
1496 .bq256xx_get_iindpm = bq256xx_get_input_curr_lim,
1497 .bq256xx_get_vbatreg = bq25618_619_get_chrg_volt,
1498 .bq256xx_get_iterm = bq25618_619_get_term_curr,
1499 .bq256xx_get_iprechg = bq25618_619_get_prechrg_curr,
1500 .bq256xx_get_vindpm = bq256xx_get_input_volt_lim,
1502 .bq256xx_set_ichg = bq25618_619_set_ichg_curr,
1503 .bq256xx_set_iindpm = bq256xx_set_input_curr_lim,
1504 .bq256xx_set_vbatreg = bq25618_619_set_chrg_volt,
1505 .bq256xx_set_iterm = bq25618_619_set_term_curr,
1506 .bq256xx_set_iprechg = bq25618_619_set_prechrg_curr,
1507 .bq256xx_set_vindpm = bq256xx_set_input_volt_lim,
1508 .bq256xx_set_charge_type = bq256xx_set_charge_type,
1510 .bq256xx_def_ichg = BQ25618_ICHG_DEF_uA,
1511 .bq256xx_def_iindpm = BQ256XX_IINDPM_DEF_uA,
1512 .bq256xx_def_vbatreg = BQ25618_VBATREG_DEF_uV,
1513 .bq256xx_def_iterm = BQ25618_ITERM_DEF_uA,
1514 .bq256xx_def_iprechg = BQ25618_IPRECHG_DEF_uA,
1515 .bq256xx_def_vindpm = BQ256XX_VINDPM_DEF_uV,
1517 .bq256xx_max_ichg = BQ25618_ICHG_MAX_uA,
1518 .bq256xx_max_vbatreg = BQ25618_VBATREG_MAX_uV,
1520 .has_usb_detect = false,
1524 static int bq256xx_power_supply_init(struct bq256xx_device *bq,
1525 struct power_supply_config *psy_cfg, struct device *dev)
1527 bq->charger = devm_power_supply_register(bq->dev,
1528 &bq256xx_power_supply_desc,
1530 if (IS_ERR(bq->charger)) {
1531 dev_err(dev, "power supply register charger failed\n");
1532 return PTR_ERR(bq->charger);
1535 bq->battery = devm_power_supply_register(bq->dev,
1536 &bq256xx_battery_desc,
1538 if (IS_ERR(bq->battery)) {
1539 dev_err(dev, "power supply register battery failed\n");
1540 return PTR_ERR(bq->battery);
1545 static int bq256xx_hw_init(struct bq256xx_device *bq)
1547 struct power_supply_battery_info *bat_info;
1548 int wd_reg_val = BQ256XX_WATCHDOG_DIS;
1552 for (i = 0; i < BQ256XX_NUM_WD_VAL; i++) {
1553 if (bq->watchdog_timer == bq256xx_watchdog_time[i]) {
1557 if (bq->watchdog_timer > bq256xx_watchdog_time[i] &&
1558 bq->watchdog_timer < bq256xx_watchdog_time[i + 1])
1561 ret = regmap_update_bits(bq->regmap, BQ256XX_CHARGER_CONTROL_1,
1562 BQ256XX_WATCHDOG_MASK, wd_reg_val <<
1563 BQ256XX_WDT_BIT_SHIFT);
1565 ret = power_supply_get_battery_info(bq->charger, &bat_info);
1570 dev_warn(bq->dev, "battery info missing, default values will be applied\n");
1572 bat_info->constant_charge_current_max_ua =
1573 bq->chip_info->bq256xx_def_ichg;
1575 bat_info->constant_charge_voltage_max_uv =
1576 bq->chip_info->bq256xx_def_vbatreg;
1578 bat_info->precharge_current_ua =
1579 bq->chip_info->bq256xx_def_iprechg;
1581 bat_info->charge_term_current_ua =
1582 bq->chip_info->bq256xx_def_iterm;
1584 bq->init_data.ichg_max =
1585 bq->chip_info->bq256xx_max_ichg;
1587 bq->init_data.vbatreg_max =
1588 bq->chip_info->bq256xx_max_vbatreg;
1590 bq->init_data.ichg_max =
1591 bat_info->constant_charge_current_max_ua;
1593 bq->init_data.vbatreg_max =
1594 bat_info->constant_charge_voltage_max_uv;
1597 ret = bq->chip_info->bq256xx_set_vindpm(bq, bq->init_data.vindpm);
1601 ret = bq->chip_info->bq256xx_set_iindpm(bq, bq->init_data.iindpm);
1605 ret = bq->chip_info->bq256xx_set_ichg(bq,
1606 bq->chip_info->bq256xx_def_ichg);
1610 ret = bq->chip_info->bq256xx_set_iprechg(bq,
1611 bat_info->precharge_current_ua);
1615 ret = bq->chip_info->bq256xx_set_vbatreg(bq,
1616 bq->chip_info->bq256xx_def_vbatreg);
1620 ret = bq->chip_info->bq256xx_set_iterm(bq,
1621 bat_info->charge_term_current_ua);
1625 power_supply_put_battery_info(bq->charger, bat_info);
1630 static int bq256xx_parse_dt(struct bq256xx_device *bq,
1631 struct power_supply_config *psy_cfg, struct device *dev)
1635 psy_cfg->drv_data = bq;
1636 psy_cfg->of_node = dev->of_node;
1638 ret = device_property_read_u32(bq->dev, "ti,watchdog-timeout-ms",
1639 &bq->watchdog_timer);
1641 bq->watchdog_timer = BQ256XX_WATCHDOG_DIS;
1643 if (bq->watchdog_timer > BQ256XX_WATCHDOG_MAX ||
1644 bq->watchdog_timer < BQ256XX_WATCHDOG_DIS)
1647 ret = device_property_read_u32(bq->dev,
1648 "input-voltage-limit-microvolt",
1649 &bq->init_data.vindpm);
1651 bq->init_data.vindpm = bq->chip_info->bq256xx_def_vindpm;
1653 ret = device_property_read_u32(bq->dev,
1654 "input-current-limit-microamp",
1655 &bq->init_data.iindpm);
1657 bq->init_data.iindpm = bq->chip_info->bq256xx_def_iindpm;
1662 static int bq256xx_probe(struct i2c_client *client)
1664 const struct i2c_device_id *id = i2c_client_get_device_id(client);
1665 struct device *dev = &client->dev;
1666 struct bq256xx_device *bq;
1667 struct power_supply_config psy_cfg = { };
1671 bq = devm_kzalloc(dev, sizeof(*bq), GFP_KERNEL);
1675 bq->client = client;
1677 bq->chip_info = &bq256xx_chip_info_tbl[id->driver_data];
1679 mutex_init(&bq->lock);
1681 strncpy(bq->model_name, id->name, I2C_NAME_SIZE);
1683 bq->regmap = devm_regmap_init_i2c(client,
1684 bq->chip_info->bq256xx_regmap_config);
1686 if (IS_ERR(bq->regmap)) {
1687 dev_err(dev, "Failed to allocate register map\n");
1688 return PTR_ERR(bq->regmap);
1691 i2c_set_clientdata(client, bq);
1693 ret = bq256xx_parse_dt(bq, &psy_cfg, dev);
1695 dev_err(dev, "Failed to read device tree properties%d\n", ret);
1699 ret = devm_add_action_or_reset(dev, bq256xx_charger_reset, bq);
1704 bq->usb2_phy = devm_usb_get_phy(dev, USB_PHY_TYPE_USB2);
1705 if (!IS_ERR_OR_NULL(bq->usb2_phy)) {
1706 INIT_WORK(&bq->usb_work, bq256xx_usb_work);
1707 bq->usb_nb.notifier_call = bq256xx_usb_notifier;
1708 usb_register_notifier(bq->usb2_phy, &bq->usb_nb);
1711 bq->usb3_phy = devm_usb_get_phy(dev, USB_PHY_TYPE_USB3);
1712 if (!IS_ERR_OR_NULL(bq->usb3_phy)) {
1713 INIT_WORK(&bq->usb_work, bq256xx_usb_work);
1714 bq->usb_nb.notifier_call = bq256xx_usb_notifier;
1715 usb_register_notifier(bq->usb3_phy, &bq->usb_nb);
1719 ret = devm_request_threaded_irq(dev, client->irq, NULL,
1720 bq256xx_irq_handler_thread,
1721 IRQF_TRIGGER_FALLING |
1723 dev_name(&client->dev), bq);
1725 dev_err(dev, "get irq fail: %d\n", ret);
1730 ret = bq256xx_power_supply_init(bq, &psy_cfg, dev);
1732 dev_err(dev, "Failed to register power supply\n");
1736 ret = bq256xx_hw_init(bq);
1738 dev_err(dev, "Cannot initialize the chip.\n");
1745 static const struct i2c_device_id bq256xx_i2c_ids[] = {
1746 { "bq25600", BQ25600 },
1747 { "bq25600d", BQ25600D },
1748 { "bq25601", BQ25601 },
1749 { "bq25601d", BQ25601D },
1750 { "bq25611d", BQ25611D },
1751 { "bq25618", BQ25618 },
1752 { "bq25619", BQ25619 },
1755 MODULE_DEVICE_TABLE(i2c, bq256xx_i2c_ids);
1757 static const struct of_device_id bq256xx_of_match[] = {
1758 { .compatible = "ti,bq25600", .data = (void *)BQ25600 },
1759 { .compatible = "ti,bq25600d", .data = (void *)BQ25600D },
1760 { .compatible = "ti,bq25601", .data = (void *)BQ25601 },
1761 { .compatible = "ti,bq25601d", .data = (void *)BQ25601D },
1762 { .compatible = "ti,bq25611d", .data = (void *)BQ25611D },
1763 { .compatible = "ti,bq25618", .data = (void *)BQ25618 },
1764 { .compatible = "ti,bq25619", .data = (void *)BQ25619 },
1767 MODULE_DEVICE_TABLE(of, bq256xx_of_match);
1769 static const struct acpi_device_id bq256xx_acpi_match[] = {
1770 { "bq25600", BQ25600 },
1771 { "bq25600d", BQ25600D },
1772 { "bq25601", BQ25601 },
1773 { "bq25601d", BQ25601D },
1774 { "bq25611d", BQ25611D },
1775 { "bq25618", BQ25618 },
1776 { "bq25619", BQ25619 },
1779 MODULE_DEVICE_TABLE(acpi, bq256xx_acpi_match);
1781 static struct i2c_driver bq256xx_driver = {
1783 .name = "bq256xx-charger",
1784 .of_match_table = bq256xx_of_match,
1785 .acpi_match_table = bq256xx_acpi_match,
1787 .probe_new = bq256xx_probe,
1788 .id_table = bq256xx_i2c_ids,
1790 module_i2c_driver(bq256xx_driver);
1792 MODULE_AUTHOR("Ricardo Rivera-Matos <r-rivera-matos@ti.com>");
1793 MODULE_DESCRIPTION("bq256xx charger driver");
1794 MODULE_LICENSE("GPL v2");