1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * TI BQ24257 charger driver
4 *
5 * Copyright (C) 2015 Intel Corporation
6 *
7 * Datasheets:
8 * https://www.ti.com/product/bq24250
9 * https://www.ti.com/product/bq24251
10 * https://www.ti.com/product/bq24257
11 */
12
13#include <linux/module.h>
14#include <linux/i2c.h>
15#include <linux/power_supply.h>
16#include <linux/regmap.h>
17#include <linux/types.h>
18#include <linux/gpio/consumer.h>
19#include <linux/interrupt.h>
20#include <linux/delay.h>
21
22#include <linux/acpi.h>
23#include <linux/of.h>
24
25#define BQ24257_REG_1 0x00
26#define BQ24257_REG_2 0x01
27#define BQ24257_REG_3 0x02
28#define BQ24257_REG_4 0x03
29#define BQ24257_REG_5 0x04
30#define BQ24257_REG_6 0x05
31#define BQ24257_REG_7 0x06
32
33#define BQ24257_MANUFACTURER "Texas Instruments"
34#define BQ24257_PG_GPIO "pg"
35
36#define BQ24257_ILIM_SET_DELAY 1000 /* msec */
37
38enum bq2425x_chip {
39 BQ24250,
40 BQ24251,
41 BQ24257,
42};
43
44struct bq2425x_chip_info {
45 const char *const name;
46 enum bq2425x_chip chip;
47};
48
49enum bq24257_fields {
50 F_WD_FAULT, F_WD_EN, F_STAT, F_FAULT, /* REG 1 */
51 F_RESET, F_IILIMIT, F_EN_STAT, F_EN_TERM, F_CE, F_HZ_MODE, /* REG 2 */
52 F_VBAT, F_USB_DET, /* REG 3 */
53 F_ICHG, F_ITERM, /* REG 4 */
54 F_LOOP_STATUS, F_LOW_CHG, F_DPDM_EN, F_CE_STATUS, F_VINDPM, /* REG 5 */
55 F_X2_TMR_EN, F_TMR, F_SYSOFF, F_TS_EN, F_TS_STAT, /* REG 6 */
56 F_VOVP, F_CLR_VDP, F_FORCE_BATDET, F_FORCE_PTM, /* REG 7 */
57
58 F_MAX_FIELDS
59};
60
61/* initial field values, converted from uV/uA */
62struct bq24257_init_data {
63 u8 ichg; /* charge current */
64 u8 vbat; /* regulation voltage */
65 u8 iterm; /* termination current */
66 u8 iilimit; /* input current limit */
67 u8 vovp; /* over voltage protection voltage */
68 u8 vindpm; /* VDMP input threshold voltage */
69};
70
71struct bq24257_state {
72 u8 status;
73 u8 fault;
74 bool power_good;
75};
76
77struct bq24257_device {
78 struct i2c_client *client;
79 struct device *dev;
80 struct power_supply *charger;
81
82 const struct bq2425x_chip_info *info;
83
84 struct regmap *rmap;
85 struct regmap_field *rmap_fields[F_MAX_FIELDS];
86
87 struct gpio_desc *pg;
88
89 struct delayed_work iilimit_setup_work;
90
91 struct bq24257_init_data init_data;
92 struct bq24257_state state;
93
94 struct mutex lock; /* protect state data */
95
96 bool iilimit_autoset_enable;
97};
98
99static bool bq24257_is_volatile_reg(struct device *dev, unsigned int reg)
100{
101 switch (reg) {
102 case BQ24257_REG_2:
103 case BQ24257_REG_4:
104 return false;
105
106 default:
107 return true;
108 }
109}
110
111static const struct regmap_config bq24257_regmap_config = {
112 .reg_bits = 8,
113 .val_bits = 8,
114
115 .max_register = BQ24257_REG_7,
116 .cache_type = REGCACHE_RBTREE,
117
118 .volatile_reg = bq24257_is_volatile_reg,
119};
120
121static const struct reg_field bq24257_reg_fields[] = {
122 /* REG 1 */
123 [F_WD_FAULT] = REG_FIELD(BQ24257_REG_1, 7, 7),
124 [F_WD_EN] = REG_FIELD(BQ24257_REG_1, 6, 6),
125 [F_STAT] = REG_FIELD(BQ24257_REG_1, 4, 5),
126 [F_FAULT] = REG_FIELD(BQ24257_REG_1, 0, 3),
127 /* REG 2 */
128 [F_RESET] = REG_FIELD(BQ24257_REG_2, 7, 7),
129 [F_IILIMIT] = REG_FIELD(BQ24257_REG_2, 4, 6),
130 [F_EN_STAT] = REG_FIELD(BQ24257_REG_2, 3, 3),
131 [F_EN_TERM] = REG_FIELD(BQ24257_REG_2, 2, 2),
132 [F_CE] = REG_FIELD(BQ24257_REG_2, 1, 1),
133 [F_HZ_MODE] = REG_FIELD(BQ24257_REG_2, 0, 0),
134 /* REG 3 */
135 [F_VBAT] = REG_FIELD(BQ24257_REG_3, 2, 7),
136 [F_USB_DET] = REG_FIELD(BQ24257_REG_3, 0, 1),
137 /* REG 4 */
138 [F_ICHG] = REG_FIELD(BQ24257_REG_4, 3, 7),
139 [F_ITERM] = REG_FIELD(BQ24257_REG_4, 0, 2),
140 /* REG 5 */
141 [F_LOOP_STATUS] = REG_FIELD(BQ24257_REG_5, 6, 7),
142 [F_LOW_CHG] = REG_FIELD(BQ24257_REG_5, 5, 5),
143 [F_DPDM_EN] = REG_FIELD(BQ24257_REG_5, 4, 4),
144 [F_CE_STATUS] = REG_FIELD(BQ24257_REG_5, 3, 3),
145 [F_VINDPM] = REG_FIELD(BQ24257_REG_5, 0, 2),
146 /* REG 6 */
147 [F_X2_TMR_EN] = REG_FIELD(BQ24257_REG_6, 7, 7),
148 [F_TMR] = REG_FIELD(BQ24257_REG_6, 5, 6),
149 [F_SYSOFF] = REG_FIELD(BQ24257_REG_6, 4, 4),
150 [F_TS_EN] = REG_FIELD(BQ24257_REG_6, 3, 3),
151 [F_TS_STAT] = REG_FIELD(BQ24257_REG_6, 0, 2),
152 /* REG 7 */
153 [F_VOVP] = REG_FIELD(BQ24257_REG_7, 5, 7),
154 [F_CLR_VDP] = REG_FIELD(BQ24257_REG_7, 4, 4),
155 [F_FORCE_BATDET] = REG_FIELD(BQ24257_REG_7, 3, 3),
156 [F_FORCE_PTM] = REG_FIELD(BQ24257_REG_7, 2, 2)
157};
158
159static const u32 bq24257_vbat_map[] = {
160 3500000, 3520000, 3540000, 3560000, 3580000, 3600000, 3620000, 3640000,
161 3660000, 3680000, 3700000, 3720000, 3740000, 3760000, 3780000, 3800000,
162 3820000, 3840000, 3860000, 3880000, 3900000, 3920000, 3940000, 3960000,
163 3980000, 4000000, 4020000, 4040000, 4060000, 4080000, 4100000, 4120000,
164 4140000, 4160000, 4180000, 4200000, 4220000, 4240000, 4260000, 4280000,
165 4300000, 4320000, 4340000, 4360000, 4380000, 4400000, 4420000, 4440000
166};
167
168#define BQ24257_VBAT_MAP_SIZE ARRAY_SIZE(bq24257_vbat_map)
169
170static const u32 bq24257_ichg_map[] = {
171 500000, 550000, 600000, 650000, 700000, 750000, 800000, 850000, 900000,
172 950000, 1000000, 1050000, 1100000, 1150000, 1200000, 1250000, 1300000,
173 1350000, 1400000, 1450000, 1500000, 1550000, 1600000, 1650000, 1700000,
174 1750000, 1800000, 1850000, 1900000, 1950000, 2000000
175};
176
177#define BQ24257_ICHG_MAP_SIZE ARRAY_SIZE(bq24257_ichg_map)
178
179static const u32 bq24257_iterm_map[] = {
180 50000, 75000, 100000, 125000, 150000, 175000, 200000, 225000
181};
182
183#define BQ24257_ITERM_MAP_SIZE ARRAY_SIZE(bq24257_iterm_map)
184
185static const u32 bq24257_iilimit_map[] = {
186 100000, 150000, 500000, 900000, 1500000, 2000000
187};
188
189#define BQ24257_IILIMIT_MAP_SIZE ARRAY_SIZE(bq24257_iilimit_map)
190
191static const u32 bq24257_vovp_map[] = {
192 6000000, 6500000, 7000000, 8000000, 9000000, 9500000, 10000000,
193 10500000
194};
195
196#define BQ24257_VOVP_MAP_SIZE ARRAY_SIZE(bq24257_vovp_map)
197
198static const u32 bq24257_vindpm_map[] = {
199 4200000, 4280000, 4360000, 4440000, 4520000, 4600000, 4680000,
200 4760000
201};
202
203#define BQ24257_VINDPM_MAP_SIZE ARRAY_SIZE(bq24257_vindpm_map)
204
205static int bq24257_field_read(struct bq24257_device *bq,
206 enum bq24257_fields field_id)
207{
208 int ret;
209 int val;
210
211 ret = regmap_field_read(field: bq->rmap_fields[field_id], val: &val);
212 if (ret < 0)
213 return ret;
214
215 return val;
216}
217
218static int bq24257_field_write(struct bq24257_device *bq,
219 enum bq24257_fields field_id, u8 val)
220{
221 return regmap_field_write(field: bq->rmap_fields[field_id], val);
222}
223
224static u8 bq24257_find_idx(u32 value, const u32 *map, u8 map_size)
225{
226 u8 idx;
227
228 for (idx = 1; idx < map_size; idx++)
229 if (value < map[idx])
230 break;
231
232 return idx - 1;
233}
234
235enum bq24257_status {
236 STATUS_READY,
237 STATUS_CHARGE_IN_PROGRESS,
238 STATUS_CHARGE_DONE,
239 STATUS_FAULT,
240};
241
242enum bq24257_fault {
243 FAULT_NORMAL,
244 FAULT_INPUT_OVP,
245 FAULT_INPUT_UVLO,
246 FAULT_SLEEP,
247 FAULT_BAT_TS,
248 FAULT_BAT_OVP,
249 FAULT_TS,
250 FAULT_TIMER,
251 FAULT_NO_BAT,
252 FAULT_ISET,
253 FAULT_INPUT_LDO_LOW,
254};
255
256static int bq24257_get_input_current_limit(struct bq24257_device *bq,
257 union power_supply_propval *val)
258{
259 int ret;
260
261 ret = bq24257_field_read(bq, field_id: F_IILIMIT);
262 if (ret < 0)
263 return ret;
264
265 /*
266 * The "External ILIM" and "Production & Test" modes are not exposed
267 * through this driver and not being covered by the lookup table.
268 * Should such a mode have become active let's return an error rather
269 * than exceeding the bounds of the lookup table and returning
270 * garbage.
271 */
272 if (ret >= BQ24257_IILIMIT_MAP_SIZE)
273 return -ENODATA;
274
275 val->intval = bq24257_iilimit_map[ret];
276
277 return 0;
278}
279
280static int bq24257_set_input_current_limit(struct bq24257_device *bq,
281 const union power_supply_propval *val)
282{
283 /*
284 * Address the case where the user manually sets an input current limit
285 * while the charger auto-detection mechanism is active. In this
286 * case we want to abort and go straight to the user-specified value.
287 */
288 if (bq->iilimit_autoset_enable)
289 cancel_delayed_work_sync(dwork: &bq->iilimit_setup_work);
290
291 return bq24257_field_write(bq, field_id: F_IILIMIT,
292 val: bq24257_find_idx(value: val->intval,
293 map: bq24257_iilimit_map,
294 BQ24257_IILIMIT_MAP_SIZE));
295}
296
297static int bq24257_power_supply_get_property(struct power_supply *psy,
298 enum power_supply_property psp,
299 union power_supply_propval *val)
300{
301 struct bq24257_device *bq = power_supply_get_drvdata(psy);
302 struct bq24257_state state;
303
304 mutex_lock(&bq->lock);
305 state = bq->state;
306 mutex_unlock(lock: &bq->lock);
307
308 switch (psp) {
309 case POWER_SUPPLY_PROP_STATUS:
310 if (!state.power_good)
311 val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
312 else if (state.status == STATUS_READY)
313 val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING;
314 else if (state.status == STATUS_CHARGE_IN_PROGRESS)
315 val->intval = POWER_SUPPLY_STATUS_CHARGING;
316 else if (state.status == STATUS_CHARGE_DONE)
317 val->intval = POWER_SUPPLY_STATUS_FULL;
318 else
319 val->intval = POWER_SUPPLY_STATUS_UNKNOWN;
320 break;
321
322 case POWER_SUPPLY_PROP_MANUFACTURER:
323 val->strval = BQ24257_MANUFACTURER;
324 break;
325
326 case POWER_SUPPLY_PROP_MODEL_NAME:
327 val->strval = bq->info->name;
328 break;
329
330 case POWER_SUPPLY_PROP_ONLINE:
331 val->intval = state.power_good;
332 break;
333
334 case POWER_SUPPLY_PROP_HEALTH:
335 switch (state.fault) {
336 case FAULT_NORMAL:
337 val->intval = POWER_SUPPLY_HEALTH_GOOD;
338 break;
339
340 case FAULT_INPUT_OVP:
341 case FAULT_BAT_OVP:
342 val->intval = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
343 break;
344
345 case FAULT_TS:
346 case FAULT_BAT_TS:
347 val->intval = POWER_SUPPLY_HEALTH_OVERHEAT;
348 break;
349
350 case FAULT_TIMER:
351 val->intval = POWER_SUPPLY_HEALTH_SAFETY_TIMER_EXPIRE;
352 break;
353
354 default:
355 val->intval = POWER_SUPPLY_HEALTH_UNSPEC_FAILURE;
356 break;
357 }
358
359 break;
360
361 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
362 val->intval = bq24257_ichg_map[bq->init_data.ichg];
363 break;
364
365 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX:
366 val->intval = bq24257_ichg_map[BQ24257_ICHG_MAP_SIZE - 1];
367 break;
368
369 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
370 val->intval = bq24257_vbat_map[bq->init_data.vbat];
371 break;
372
373 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX:
374 val->intval = bq24257_vbat_map[BQ24257_VBAT_MAP_SIZE - 1];
375 break;
376
377 case POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT:
378 val->intval = bq24257_iterm_map[bq->init_data.iterm];
379 break;
380
381 case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
382 return bq24257_get_input_current_limit(bq, val);
383
384 default:
385 return -EINVAL;
386 }
387
388 return 0;
389}
390
391static int bq24257_power_supply_set_property(struct power_supply *psy,
392 enum power_supply_property prop,
393 const union power_supply_propval *val)
394{
395 struct bq24257_device *bq = power_supply_get_drvdata(psy);
396
397 switch (prop) {
398 case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
399 return bq24257_set_input_current_limit(bq, val);
400 default:
401 return -EINVAL;
402 }
403}
404
405static int bq24257_power_supply_property_is_writeable(struct power_supply *psy,
406 enum power_supply_property psp)
407{
408 switch (psp) {
409 case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
410 return true;
411 default:
412 return false;
413 }
414}
415
416static int bq24257_get_chip_state(struct bq24257_device *bq,
417 struct bq24257_state *state)
418{
419 int ret;
420
421 ret = bq24257_field_read(bq, field_id: F_STAT);
422 if (ret < 0)
423 return ret;
424
425 state->status = ret;
426
427 ret = bq24257_field_read(bq, field_id: F_FAULT);
428 if (ret < 0)
429 return ret;
430
431 state->fault = ret;
432
433 if (bq->pg)
434 state->power_good = !gpiod_get_value_cansleep(desc: bq->pg);
435 else
436 /*
437 * If we have a chip without a dedicated power-good GPIO or
438 * some other explicit bit that would provide this information
439 * assume the power is good if there is no supply related
440 * fault - and not good otherwise. There is a possibility for
441 * other errors to mask that power in fact is not good but this
442 * is probably the best we can do here.
443 */
444 switch (state->fault) {
445 case FAULT_INPUT_OVP:
446 case FAULT_INPUT_UVLO:
447 case FAULT_INPUT_LDO_LOW:
448 state->power_good = false;
449 break;
450 default:
451 state->power_good = true;
452 }
453
454 return 0;
455}
456
457static bool bq24257_state_changed(struct bq24257_device *bq,
458 struct bq24257_state *new_state)
459{
460 int ret;
461
462 mutex_lock(&bq->lock);
463 ret = (bq->state.status != new_state->status ||
464 bq->state.fault != new_state->fault ||
465 bq->state.power_good != new_state->power_good);
466 mutex_unlock(lock: &bq->lock);
467
468 return ret;
469}
470
471enum bq24257_loop_status {
472 LOOP_STATUS_NONE,
473 LOOP_STATUS_IN_DPM,
474 LOOP_STATUS_IN_CURRENT_LIMIT,
475 LOOP_STATUS_THERMAL,
476};
477
478enum bq24257_in_ilimit {
479 IILIMIT_100,
480 IILIMIT_150,
481 IILIMIT_500,
482 IILIMIT_900,
483 IILIMIT_1500,
484 IILIMIT_2000,
485 IILIMIT_EXT,
486 IILIMIT_NONE,
487};
488
489enum bq24257_vovp {
490 VOVP_6000,
491 VOVP_6500,
492 VOVP_7000,
493 VOVP_8000,
494 VOVP_9000,
495 VOVP_9500,
496 VOVP_10000,
497 VOVP_10500
498};
499
500enum bq24257_vindpm {
501 VINDPM_4200,
502 VINDPM_4280,
503 VINDPM_4360,
504 VINDPM_4440,
505 VINDPM_4520,
506 VINDPM_4600,
507 VINDPM_4680,
508 VINDPM_4760
509};
510
511enum bq24257_port_type {
512 PORT_TYPE_DCP, /* Dedicated Charging Port */
513 PORT_TYPE_CDP, /* Charging Downstream Port */
514 PORT_TYPE_SDP, /* Standard Downstream Port */
515 PORT_TYPE_NON_STANDARD,
516};
517
518enum bq24257_safety_timer {
519 SAFETY_TIMER_45,
520 SAFETY_TIMER_360,
521 SAFETY_TIMER_540,
522 SAFETY_TIMER_NONE,
523};
524
525static int bq24257_iilimit_autoset(struct bq24257_device *bq)
526{
527 int loop_status;
528 int iilimit;
529 int port_type;
530 int ret;
531 const u8 new_iilimit[] = {
532 [PORT_TYPE_DCP] = IILIMIT_2000,
533 [PORT_TYPE_CDP] = IILIMIT_2000,
534 [PORT_TYPE_SDP] = IILIMIT_500,
535 [PORT_TYPE_NON_STANDARD] = IILIMIT_500
536 };
537
538 ret = bq24257_field_read(bq, field_id: F_LOOP_STATUS);
539 if (ret < 0)
540 goto error;
541
542 loop_status = ret;
543
544 ret = bq24257_field_read(bq, field_id: F_IILIMIT);
545 if (ret < 0)
546 goto error;
547
548 iilimit = ret;
549
550 /*
551 * All USB ports should be able to handle 500mA. If not, DPM will lower
552 * the charging current to accommodate the power source. No need to set
553 * a lower IILIMIT value.
554 */
555 if (loop_status == LOOP_STATUS_IN_DPM && iilimit == IILIMIT_500)
556 return 0;
557
558 ret = bq24257_field_read(bq, field_id: F_USB_DET);
559 if (ret < 0)
560 goto error;
561
562 port_type = ret;
563
564 ret = bq24257_field_write(bq, field_id: F_IILIMIT, val: new_iilimit[port_type]);
565 if (ret < 0)
566 goto error;
567
568 ret = bq24257_field_write(bq, field_id: F_TMR, val: SAFETY_TIMER_360);
569 if (ret < 0)
570 goto error;
571
572 ret = bq24257_field_write(bq, field_id: F_CLR_VDP, val: 1);
573 if (ret < 0)
574 goto error;
575
576 dev_dbg(bq->dev, "port/loop = %d/%d -> iilimit = %d\n",
577 port_type, loop_status, new_iilimit[port_type]);
578
579 return 0;
580
581error:
582 dev_err(bq->dev, "%s: Error communicating with the chip.\n", __func__);
583 return ret;
584}
585
586static void bq24257_iilimit_setup_work(struct work_struct *work)
587{
588 struct bq24257_device *bq = container_of(work, struct bq24257_device,
589 iilimit_setup_work.work);
590
591 bq24257_iilimit_autoset(bq);
592}
593
594static void bq24257_handle_state_change(struct bq24257_device *bq,
595 struct bq24257_state *new_state)
596{
597 int ret;
598 struct bq24257_state old_state;
599
600 mutex_lock(&bq->lock);
601 old_state = bq->state;
602 mutex_unlock(lock: &bq->lock);
603
604 /*
605 * Handle BQ2425x state changes observing whether the D+/D- based input
606 * current limit autoset functionality is enabled.
607 */
608 if (!new_state->power_good) {
609 dev_dbg(bq->dev, "Power removed\n");
610 if (bq->iilimit_autoset_enable) {
611 cancel_delayed_work_sync(dwork: &bq->iilimit_setup_work);
612
613 /* activate D+/D- port detection algorithm */
614 ret = bq24257_field_write(bq, field_id: F_DPDM_EN, val: 1);
615 if (ret < 0)
616 goto error;
617 }
618 /*
619 * When power is removed always return to the default input
620 * current limit as configured during probe.
621 */
622 ret = bq24257_field_write(bq, field_id: F_IILIMIT, val: bq->init_data.iilimit);
623 if (ret < 0)
624 goto error;
625 } else if (!old_state.power_good) {
626 dev_dbg(bq->dev, "Power inserted\n");
627
628 if (bq->iilimit_autoset_enable)
629 /* configure input current limit */
630 schedule_delayed_work(dwork: &bq->iilimit_setup_work,
631 delay: msecs_to_jiffies(BQ24257_ILIM_SET_DELAY));
632 } else if (new_state->fault == FAULT_NO_BAT) {
633 dev_warn(bq->dev, "Battery removed\n");
634 } else if (new_state->fault == FAULT_TIMER) {
635 dev_err(bq->dev, "Safety timer expired! Battery dead?\n");
636 }
637
638 return;
639
640error:
641 dev_err(bq->dev, "%s: Error communicating with the chip.\n", __func__);
642}
643
644static irqreturn_t bq24257_irq_handler_thread(int irq, void *private)
645{
646 int ret;
647 struct bq24257_device *bq = private;
648 struct bq24257_state state;
649
650 ret = bq24257_get_chip_state(bq, state: &state);
651 if (ret < 0)
652 return IRQ_HANDLED;
653
654 if (!bq24257_state_changed(bq, new_state: &state))
655 return IRQ_HANDLED;
656
657 dev_dbg(bq->dev, "irq(state changed): status/fault/pg = %d/%d/%d\n",
658 state.status, state.fault, state.power_good);
659
660 bq24257_handle_state_change(bq, new_state: &state);
661
662 mutex_lock(&bq->lock);
663 bq->state = state;
664 mutex_unlock(lock: &bq->lock);
665
666 power_supply_changed(psy: bq->charger);
667
668 return IRQ_HANDLED;
669}
670
671static int bq24257_hw_init(struct bq24257_device *bq)
672{
673 int ret;
674 int i;
675 struct bq24257_state state;
676
677 const struct {
678 int field;
679 u32 value;
680 } init_data[] = {
681 {F_ICHG, bq->init_data.ichg},
682 {F_VBAT, bq->init_data.vbat},
683 {F_ITERM, bq->init_data.iterm},
684 {F_VOVP, bq->init_data.vovp},
685 {F_VINDPM, bq->init_data.vindpm},
686 };
687
688 /*
689 * Disable the watchdog timer to prevent the IC from going back to
690 * default settings after 50 seconds of I2C inactivity.
691 */
692 ret = bq24257_field_write(bq, field_id: F_WD_EN, val: 0);
693 if (ret < 0)
694 return ret;
695
696 /* configure the charge currents and voltages */
697 for (i = 0; i < ARRAY_SIZE(init_data); i++) {
698 ret = bq24257_field_write(bq, field_id: init_data[i].field,
699 val: init_data[i].value);
700 if (ret < 0)
701 return ret;
702 }
703
704 ret = bq24257_get_chip_state(bq, state: &state);
705 if (ret < 0)
706 return ret;
707
708 mutex_lock(&bq->lock);
709 bq->state = state;
710 mutex_unlock(lock: &bq->lock);
711
712 if (!bq->iilimit_autoset_enable) {
713 dev_dbg(bq->dev, "manually setting iilimit = %u\n",
714 bq->init_data.iilimit);
715
716 /* program fixed input current limit */
717 ret = bq24257_field_write(bq, field_id: F_IILIMIT,
718 val: bq->init_data.iilimit);
719 if (ret < 0)
720 return ret;
721 } else if (!state.power_good)
722 /* activate D+/D- detection algorithm */
723 ret = bq24257_field_write(bq, field_id: F_DPDM_EN, val: 1);
724 else if (state.fault != FAULT_NO_BAT)
725 ret = bq24257_iilimit_autoset(bq);
726
727 return ret;
728}
729
730static enum power_supply_property bq24257_power_supply_props[] = {
731 POWER_SUPPLY_PROP_MANUFACTURER,
732 POWER_SUPPLY_PROP_MODEL_NAME,
733 POWER_SUPPLY_PROP_STATUS,
734 POWER_SUPPLY_PROP_ONLINE,
735 POWER_SUPPLY_PROP_HEALTH,
736 POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT,
737 POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX,
738 POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE,
739 POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX,
740 POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT,
741 POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT,
742};
743
744static char *bq24257_charger_supplied_to[] = {
745 "main-battery",
746};
747
748static const struct power_supply_desc bq24257_power_supply_desc = {
749 .name = "bq24257-charger",
750 .type = POWER_SUPPLY_TYPE_USB,
751 .properties = bq24257_power_supply_props,
752 .num_properties = ARRAY_SIZE(bq24257_power_supply_props),
753 .get_property = bq24257_power_supply_get_property,
754 .set_property = bq24257_power_supply_set_property,
755 .property_is_writeable = bq24257_power_supply_property_is_writeable,
756};
757
758static ssize_t bq24257_show_ovp_voltage(struct device *dev,
759 struct device_attribute *attr,
760 char *buf)
761{
762 struct power_supply *psy = dev_get_drvdata(dev);
763 struct bq24257_device *bq = power_supply_get_drvdata(psy);
764
765 return sysfs_emit(buf, fmt: "%u\n", bq24257_vovp_map[bq->init_data.vovp]);
766}
767
768static ssize_t bq24257_show_in_dpm_voltage(struct device *dev,
769 struct device_attribute *attr,
770 char *buf)
771{
772 struct power_supply *psy = dev_get_drvdata(dev);
773 struct bq24257_device *bq = power_supply_get_drvdata(psy);
774
775 return sysfs_emit(buf, fmt: "%u\n", bq24257_vindpm_map[bq->init_data.vindpm]);
776}
777
778static ssize_t bq24257_sysfs_show_enable(struct device *dev,
779 struct device_attribute *attr,
780 char *buf)
781{
782 struct power_supply *psy = dev_get_drvdata(dev);
783 struct bq24257_device *bq = power_supply_get_drvdata(psy);
784 int ret;
785
786 if (strcmp(attr->attr.name, "high_impedance_enable") == 0)
787 ret = bq24257_field_read(bq, field_id: F_HZ_MODE);
788 else if (strcmp(attr->attr.name, "sysoff_enable") == 0)
789 ret = bq24257_field_read(bq, field_id: F_SYSOFF);
790 else
791 return -EINVAL;
792
793 if (ret < 0)
794 return ret;
795
796 return sysfs_emit(buf, fmt: "%d\n", ret);
797}
798
799static ssize_t bq24257_sysfs_set_enable(struct device *dev,
800 struct device_attribute *attr,
801 const char *buf,
802 size_t count)
803{
804 struct power_supply *psy = dev_get_drvdata(dev);
805 struct bq24257_device *bq = power_supply_get_drvdata(psy);
806 long val;
807 int ret;
808
809 if (kstrtol(s: buf, base: 10, res: &val) < 0)
810 return -EINVAL;
811
812 if (strcmp(attr->attr.name, "high_impedance_enable") == 0)
813 ret = bq24257_field_write(bq, field_id: F_HZ_MODE, val: (bool)val);
814 else if (strcmp(attr->attr.name, "sysoff_enable") == 0)
815 ret = bq24257_field_write(bq, field_id: F_SYSOFF, val: (bool)val);
816 else
817 return -EINVAL;
818
819 if (ret < 0)
820 return ret;
821
822 return count;
823}
824
825static DEVICE_ATTR(ovp_voltage, S_IRUGO, bq24257_show_ovp_voltage, NULL);
826static DEVICE_ATTR(in_dpm_voltage, S_IRUGO, bq24257_show_in_dpm_voltage, NULL);
827static DEVICE_ATTR(high_impedance_enable, S_IWUSR | S_IRUGO,
828 bq24257_sysfs_show_enable, bq24257_sysfs_set_enable);
829static DEVICE_ATTR(sysoff_enable, S_IWUSR | S_IRUGO,
830 bq24257_sysfs_show_enable, bq24257_sysfs_set_enable);
831
832static struct attribute *bq24257_charger_sysfs_attrs[] = {
833 &dev_attr_ovp_voltage.attr,
834 &dev_attr_in_dpm_voltage.attr,
835 &dev_attr_high_impedance_enable.attr,
836 &dev_attr_sysoff_enable.attr,
837 NULL,
838};
839
840ATTRIBUTE_GROUPS(bq24257_charger_sysfs);
841
842static int bq24257_power_supply_init(struct bq24257_device *bq)
843{
844 struct power_supply_config psy_cfg = { .drv_data = bq, };
845
846 psy_cfg.attr_grp = bq24257_charger_sysfs_groups;
847 psy_cfg.supplied_to = bq24257_charger_supplied_to;
848 psy_cfg.num_supplicants = ARRAY_SIZE(bq24257_charger_supplied_to);
849
850 bq->charger = devm_power_supply_register(parent: bq->dev,
851 desc: &bq24257_power_supply_desc,
852 cfg: &psy_cfg);
853
854 return PTR_ERR_OR_ZERO(ptr: bq->charger);
855}
856
857static void bq24257_pg_gpio_probe(struct bq24257_device *bq)
858{
859 bq->pg = devm_gpiod_get_optional(dev: bq->dev, BQ24257_PG_GPIO, flags: GPIOD_IN);
860
861 if (PTR_ERR(ptr: bq->pg) == -EPROBE_DEFER) {
862 dev_info(bq->dev, "probe retry requested for PG pin\n");
863 return;
864 } else if (IS_ERR(ptr: bq->pg)) {
865 dev_err(bq->dev, "error probing PG pin\n");
866 bq->pg = NULL;
867 return;
868 }
869
870 if (bq->pg)
871 dev_dbg(bq->dev, "probed PG pin = %d\n", desc_to_gpio(bq->pg));
872}
873
874static int bq24257_fw_probe(struct bq24257_device *bq)
875{
876 int ret;
877 u32 property;
878
879 /* Required properties */
880 ret = device_property_read_u32(dev: bq->dev, propname: "ti,charge-current", val: &property);
881 if (ret < 0)
882 return ret;
883
884 bq->init_data.ichg = bq24257_find_idx(value: property, map: bq24257_ichg_map,
885 BQ24257_ICHG_MAP_SIZE);
886
887 ret = device_property_read_u32(dev: bq->dev, propname: "ti,battery-regulation-voltage",
888 val: &property);
889 if (ret < 0)
890 return ret;
891
892 bq->init_data.vbat = bq24257_find_idx(value: property, map: bq24257_vbat_map,
893 BQ24257_VBAT_MAP_SIZE);
894
895 ret = device_property_read_u32(dev: bq->dev, propname: "ti,termination-current",
896 val: &property);
897 if (ret < 0)
898 return ret;
899
900 bq->init_data.iterm = bq24257_find_idx(value: property, map: bq24257_iterm_map,
901 BQ24257_ITERM_MAP_SIZE);
902
903 /* Optional properties. If not provided use reasonable default. */
904 ret = device_property_read_u32(dev: bq->dev, propname: "ti,current-limit",
905 val: &property);
906 if (ret < 0) {
907 bq->iilimit_autoset_enable = true;
908
909 /*
910 * Explicitly set a default value which will be needed for
911 * devices that don't support the automatic setting of the input
912 * current limit through the charger type detection mechanism.
913 */
914 bq->init_data.iilimit = IILIMIT_500;
915 } else
916 bq->init_data.iilimit =
917 bq24257_find_idx(value: property,
918 map: bq24257_iilimit_map,
919 BQ24257_IILIMIT_MAP_SIZE);
920
921 ret = device_property_read_u32(dev: bq->dev, propname: "ti,ovp-voltage",
922 val: &property);
923 if (ret < 0)
924 bq->init_data.vovp = VOVP_6500;
925 else
926 bq->init_data.vovp = bq24257_find_idx(value: property,
927 map: bq24257_vovp_map,
928 BQ24257_VOVP_MAP_SIZE);
929
930 ret = device_property_read_u32(dev: bq->dev, propname: "ti,in-dpm-voltage",
931 val: &property);
932 if (ret < 0)
933 bq->init_data.vindpm = VINDPM_4360;
934 else
935 bq->init_data.vindpm =
936 bq24257_find_idx(value: property,
937 map: bq24257_vindpm_map,
938 BQ24257_VINDPM_MAP_SIZE);
939
940 return 0;
941}
942
943static int bq24257_probe(struct i2c_client *client)
944{
945 struct i2c_adapter *adapter = client->adapter;
946 struct device *dev = &client->dev;
947 struct bq24257_device *bq;
948 int ret;
949 int i;
950
951 if (!i2c_check_functionality(adap: adapter, I2C_FUNC_SMBUS_BYTE_DATA)) {
952 dev_err(dev, "No support for SMBUS_BYTE_DATA\n");
953 return -ENODEV;
954 }
955
956 bq = devm_kzalloc(dev, size: sizeof(*bq), GFP_KERNEL);
957 if (!bq)
958 return -ENOMEM;
959
960 bq->client = client;
961 bq->dev = dev;
962
963 bq->info = i2c_get_match_data(client);
964 if (!bq->info)
965 return dev_err_probe(dev, err: -ENODEV, fmt: "Failed to match device\n");
966
967 mutex_init(&bq->lock);
968
969 bq->rmap = devm_regmap_init_i2c(client, &bq24257_regmap_config);
970 if (IS_ERR(ptr: bq->rmap)) {
971 dev_err(dev, "failed to allocate register map\n");
972 return PTR_ERR(ptr: bq->rmap);
973 }
974
975 for (i = 0; i < ARRAY_SIZE(bq24257_reg_fields); i++) {
976 const struct reg_field *reg_fields = bq24257_reg_fields;
977
978 bq->rmap_fields[i] = devm_regmap_field_alloc(dev, regmap: bq->rmap,
979 reg_field: reg_fields[i]);
980 if (IS_ERR(ptr: bq->rmap_fields[i])) {
981 dev_err(dev, "cannot allocate regmap field\n");
982 return PTR_ERR(ptr: bq->rmap_fields[i]);
983 }
984 }
985
986 i2c_set_clientdata(client, data: bq);
987
988 if (!dev->platform_data) {
989 ret = bq24257_fw_probe(bq);
990 if (ret < 0) {
991 dev_err(dev, "Cannot read device properties.\n");
992 return ret;
993 }
994 } else {
995 return -ENODEV;
996 }
997
998 /*
999 * The BQ24250 doesn't support the D+/D- based charger type detection
1000 * used for the automatic setting of the input current limit setting so
1001 * explicitly disable that feature.
1002 */
1003 if (bq->info->chip == BQ24250)
1004 bq->iilimit_autoset_enable = false;
1005
1006 if (bq->iilimit_autoset_enable)
1007 INIT_DELAYED_WORK(&bq->iilimit_setup_work,
1008 bq24257_iilimit_setup_work);
1009
1010 /*
1011 * The BQ24250 doesn't have a dedicated Power Good (PG) pin so let's
1012 * not probe for it and instead use a SW-based approach to determine
1013 * the PG state. We also use a SW-based approach for all other devices
1014 * if the PG pin is either not defined or can't be probed.
1015 */
1016 if (bq->info->chip != BQ24250)
1017 bq24257_pg_gpio_probe(bq);
1018
1019 if (PTR_ERR(ptr: bq->pg) == -EPROBE_DEFER)
1020 return PTR_ERR(ptr: bq->pg);
1021 else if (!bq->pg)
1022 dev_info(bq->dev, "using SW-based power-good detection\n");
1023
1024 /* reset all registers to defaults */
1025 ret = bq24257_field_write(bq, field_id: F_RESET, val: 1);
1026 if (ret < 0)
1027 return ret;
1028
1029 /*
1030 * Put the RESET bit back to 0, in cache. For some reason the HW always
1031 * returns 1 on this bit, so this is the only way to avoid resetting the
1032 * chip every time we update another field in this register.
1033 */
1034 ret = bq24257_field_write(bq, field_id: F_RESET, val: 0);
1035 if (ret < 0)
1036 return ret;
1037
1038 ret = bq24257_hw_init(bq);
1039 if (ret < 0) {
1040 dev_err(dev, "Cannot initialize the chip.\n");
1041 return ret;
1042 }
1043
1044 ret = bq24257_power_supply_init(bq);
1045 if (ret < 0) {
1046 dev_err(dev, "Failed to register power supply\n");
1047 return ret;
1048 }
1049
1050 ret = devm_request_threaded_irq(dev, irq: client->irq, NULL,
1051 thread_fn: bq24257_irq_handler_thread,
1052 IRQF_TRIGGER_FALLING |
1053 IRQF_TRIGGER_RISING | IRQF_ONESHOT,
1054 devname: bq->info->name, dev_id: bq);
1055 if (ret) {
1056 dev_err(dev, "Failed to request IRQ #%d\n", client->irq);
1057 return ret;
1058 }
1059
1060 return 0;
1061}
1062
1063static void bq24257_remove(struct i2c_client *client)
1064{
1065 struct bq24257_device *bq = i2c_get_clientdata(client);
1066
1067 if (bq->iilimit_autoset_enable)
1068 cancel_delayed_work_sync(dwork: &bq->iilimit_setup_work);
1069
1070 bq24257_field_write(bq, field_id: F_RESET, val: 1); /* reset to defaults */
1071}
1072
1073#ifdef CONFIG_PM_SLEEP
1074static int bq24257_suspend(struct device *dev)
1075{
1076 struct bq24257_device *bq = dev_get_drvdata(dev);
1077 int ret = 0;
1078
1079 if (bq->iilimit_autoset_enable)
1080 cancel_delayed_work_sync(dwork: &bq->iilimit_setup_work);
1081
1082 /* reset all registers to default (and activate standalone mode) */
1083 ret = bq24257_field_write(bq, field_id: F_RESET, val: 1);
1084 if (ret < 0)
1085 dev_err(bq->dev, "Cannot reset chip to standalone mode.\n");
1086
1087 return ret;
1088}
1089
1090static int bq24257_resume(struct device *dev)
1091{
1092 int ret;
1093 struct bq24257_device *bq = dev_get_drvdata(dev);
1094
1095 ret = regcache_drop_region(map: bq->rmap, BQ24257_REG_1, BQ24257_REG_7);
1096 if (ret < 0)
1097 return ret;
1098
1099 ret = bq24257_field_write(bq, field_id: F_RESET, val: 0);
1100 if (ret < 0)
1101 return ret;
1102
1103 ret = bq24257_hw_init(bq);
1104 if (ret < 0) {
1105 dev_err(bq->dev, "Cannot init chip after resume.\n");
1106 return ret;
1107 }
1108
1109 /* signal userspace, maybe state changed while suspended */
1110 power_supply_changed(psy: bq->charger);
1111
1112 return 0;
1113}
1114#endif
1115
1116static const struct dev_pm_ops bq24257_pm = {
1117 SET_SYSTEM_SLEEP_PM_OPS(bq24257_suspend, bq24257_resume)
1118};
1119
1120static const struct bq2425x_chip_info bq24250_info = {
1121 .name = "bq24250",
1122 .chip = BQ24250,
1123};
1124
1125static const struct bq2425x_chip_info bq24251_info = {
1126 .name = "bq24251",
1127 .chip = BQ24251,
1128};
1129
1130static const struct bq2425x_chip_info bq24257_info = {
1131 .name = "bq24257",
1132 .chip = BQ24257,
1133};
1134
1135static const struct i2c_device_id bq24257_i2c_ids[] = {
1136 { "bq24250", (kernel_ulong_t)&bq24250_info },
1137 { "bq24251", (kernel_ulong_t)&bq24251_info },
1138 { "bq24257", (kernel_ulong_t)&bq24257_info },
1139 {}
1140};
1141MODULE_DEVICE_TABLE(i2c, bq24257_i2c_ids);
1142
1143static const struct of_device_id bq24257_of_match[] __maybe_unused = {
1144 { .compatible = "ti,bq24250", &bq24250_info },
1145 { .compatible = "ti,bq24251", &bq24251_info },
1146 { .compatible = "ti,bq24257", &bq24257_info },
1147 {}
1148};
1149MODULE_DEVICE_TABLE(of, bq24257_of_match);
1150
1151#ifdef CONFIG_ACPI
1152static const struct acpi_device_id bq24257_acpi_match[] = {
1153 { "BQ242500", (kernel_ulong_t)&bq24250_info },
1154 { "BQ242510", (kernel_ulong_t)&bq24251_info },
1155 { "BQ242570", (kernel_ulong_t)&bq24257_info },
1156 {}
1157};
1158MODULE_DEVICE_TABLE(acpi, bq24257_acpi_match);
1159#endif
1160
1161static struct i2c_driver bq24257_driver = {
1162 .driver = {
1163 .name = "bq24257-charger",
1164 .of_match_table = of_match_ptr(bq24257_of_match),
1165 .acpi_match_table = ACPI_PTR(bq24257_acpi_match),
1166 .pm = &bq24257_pm,
1167 },
1168 .probe = bq24257_probe,
1169 .remove = bq24257_remove,
1170 .id_table = bq24257_i2c_ids,
1171};
1172module_i2c_driver(bq24257_driver);
1173
1174MODULE_AUTHOR("Laurentiu Palcu <laurentiu.palcu@intel.com>");
1175MODULE_DESCRIPTION("bq24257 charger driver");
1176MODULE_LICENSE("GPL");
1177

source code of linux/drivers/power/supply/bq24257_charger.c