2 * TI BQ24257 charger driver
4 * Copyright (C) 2015 Intel Corporation
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
18 #include <linux/module.h>
19 #include <linux/i2c.h>
20 #include <linux/power_supply.h>
21 #include <linux/regmap.h>
22 #include <linux/types.h>
23 #include <linux/gpio/consumer.h>
24 #include <linux/interrupt.h>
25 #include <linux/delay.h>
27 #include <linux/acpi.h>
30 #define BQ24257_REG_1 0x00
31 #define BQ24257_REG_2 0x01
32 #define BQ24257_REG_3 0x02
33 #define BQ24257_REG_4 0x03
34 #define BQ24257_REG_5 0x04
35 #define BQ24257_REG_6 0x05
36 #define BQ24257_REG_7 0x06
38 #define BQ24257_MANUFACTURER "Texas Instruments"
39 #define BQ24257_PG_GPIO "pg"
41 #define BQ24257_ILIM_SET_DELAY 1000 /* msec */
44 F_WD_FAULT, F_WD_EN, F_STAT, F_FAULT, /* REG 1 */
45 F_RESET, F_IILIMIT, F_EN_STAT, F_EN_TERM, F_CE, F_HZ_MODE, /* REG 2 */
46 F_VBAT, F_USB_DET, /* REG 3 */
47 F_ICHG, F_ITERM, /* REG 4 */
48 F_LOOP_STATUS, F_LOW_CHG, F_DPDM_EN, F_CE_STATUS, F_VINDPM, /* REG 5 */
49 F_X2_TMR_EN, F_TMR, F_SYSOFF, F_TS_STAT, /* REG 6 */
50 F_VOVP, F_CLR_VDP, F_FORCE_BATDET, F_FORCE_PTM, /* REG 7 */
55 /* initial field values, converted from uV/uA */
56 struct bq24257_init_data {
57 u8 ichg; /* charge current */
58 u8 vbat; /* regulation voltage */
59 u8 iterm; /* termination current */
62 struct bq24257_state {
68 struct bq24257_device {
69 struct i2c_client *client;
71 struct power_supply *charger;
74 struct regmap_field *rmap_fields[F_MAX_FIELDS];
78 struct delayed_work iilimit_setup_work;
80 struct bq24257_init_data init_data;
81 struct bq24257_state state;
83 struct mutex lock; /* protect state data */
86 static bool bq24257_is_volatile_reg(struct device *dev, unsigned int reg)
98 static const struct regmap_config bq24257_regmap_config = {
102 .max_register = BQ24257_REG_7,
103 .cache_type = REGCACHE_RBTREE,
105 .volatile_reg = bq24257_is_volatile_reg,
108 static const struct reg_field bq24257_reg_fields[] = {
110 [F_WD_FAULT] = REG_FIELD(BQ24257_REG_1, 7, 7),
111 [F_WD_EN] = REG_FIELD(BQ24257_REG_1, 6, 6),
112 [F_STAT] = REG_FIELD(BQ24257_REG_1, 4, 5),
113 [F_FAULT] = REG_FIELD(BQ24257_REG_1, 0, 3),
115 [F_RESET] = REG_FIELD(BQ24257_REG_2, 7, 7),
116 [F_IILIMIT] = REG_FIELD(BQ24257_REG_2, 4, 6),
117 [F_EN_STAT] = REG_FIELD(BQ24257_REG_2, 3, 3),
118 [F_EN_TERM] = REG_FIELD(BQ24257_REG_2, 2, 2),
119 [F_CE] = REG_FIELD(BQ24257_REG_2, 1, 1),
120 [F_HZ_MODE] = REG_FIELD(BQ24257_REG_2, 0, 0),
122 [F_VBAT] = REG_FIELD(BQ24257_REG_3, 2, 7),
123 [F_USB_DET] = REG_FIELD(BQ24257_REG_3, 0, 1),
125 [F_ICHG] = REG_FIELD(BQ24257_REG_4, 3, 7),
126 [F_ITERM] = REG_FIELD(BQ24257_REG_4, 0, 2),
128 [F_LOOP_STATUS] = REG_FIELD(BQ24257_REG_5, 6, 7),
129 [F_LOW_CHG] = REG_FIELD(BQ24257_REG_5, 5, 5),
130 [F_DPDM_EN] = REG_FIELD(BQ24257_REG_5, 4, 4),
131 [F_CE_STATUS] = REG_FIELD(BQ24257_REG_5, 3, 3),
132 [F_VINDPM] = REG_FIELD(BQ24257_REG_5, 0, 2),
134 [F_X2_TMR_EN] = REG_FIELD(BQ24257_REG_6, 7, 7),
135 [F_TMR] = REG_FIELD(BQ24257_REG_6, 5, 6),
136 [F_SYSOFF] = REG_FIELD(BQ24257_REG_6, 4, 4),
137 [F_TS_STAT] = REG_FIELD(BQ24257_REG_6, 0, 2),
139 [F_VOVP] = REG_FIELD(BQ24257_REG_7, 5, 7),
140 [F_CLR_VDP] = REG_FIELD(BQ24257_REG_7, 4, 4),
141 [F_FORCE_BATDET] = REG_FIELD(BQ24257_REG_7, 3, 3),
142 [F_FORCE_PTM] = REG_FIELD(BQ24257_REG_7, 2, 2)
145 static const u32 bq24257_vbat_map[] = {
146 3500000, 3520000, 3540000, 3560000, 3580000, 3600000, 3620000, 3640000,
147 3660000, 3680000, 3700000, 3720000, 3740000, 3760000, 3780000, 3800000,
148 3820000, 3840000, 3860000, 3880000, 3900000, 3920000, 3940000, 3960000,
149 3980000, 4000000, 4020000, 4040000, 4060000, 4080000, 4100000, 4120000,
150 4140000, 4160000, 4180000, 4200000, 4220000, 4240000, 4260000, 4280000,
151 4300000, 4320000, 4340000, 4360000, 4380000, 4400000, 4420000, 4440000
154 #define BQ24257_VBAT_MAP_SIZE ARRAY_SIZE(bq24257_vbat_map)
156 static const u32 bq24257_ichg_map[] = {
157 500000, 550000, 600000, 650000, 700000, 750000, 800000, 850000, 900000,
158 950000, 1000000, 1050000, 1100000, 1150000, 1200000, 1250000, 1300000,
159 1350000, 1400000, 1450000, 1500000, 1550000, 1600000, 1650000, 1700000,
160 1750000, 1800000, 1850000, 1900000, 1950000, 2000000
163 #define BQ24257_ICHG_MAP_SIZE ARRAY_SIZE(bq24257_ichg_map)
165 static const u32 bq24257_iterm_map[] = {
166 50000, 75000, 100000, 125000, 150000, 175000, 200000, 225000
169 #define BQ24257_ITERM_MAP_SIZE ARRAY_SIZE(bq24257_iterm_map)
171 static int bq24257_field_read(struct bq24257_device *bq,
172 enum bq24257_fields field_id)
177 ret = regmap_field_read(bq->rmap_fields[field_id], &val);
184 static int bq24257_field_write(struct bq24257_device *bq,
185 enum bq24257_fields field_id, u8 val)
187 return regmap_field_write(bq->rmap_fields[field_id], val);
190 static u8 bq24257_find_idx(u32 value, const u32 *map, u8 map_size)
194 for (idx = 1; idx < map_size; idx++)
195 if (value < map[idx])
201 enum bq24257_status {
203 STATUS_CHARGE_IN_PROGRESS,
222 static int bq24257_power_supply_get_property(struct power_supply *psy,
223 enum power_supply_property psp,
224 union power_supply_propval *val)
226 struct bq24257_device *bq = power_supply_get_drvdata(psy);
227 struct bq24257_state state;
229 mutex_lock(&bq->lock);
231 mutex_unlock(&bq->lock);
234 case POWER_SUPPLY_PROP_STATUS:
235 if (!state.power_good)
236 val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
237 else if (state.status == STATUS_READY)
238 val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING;
239 else if (state.status == STATUS_CHARGE_IN_PROGRESS)
240 val->intval = POWER_SUPPLY_STATUS_CHARGING;
241 else if (state.status == STATUS_CHARGE_DONE)
242 val->intval = POWER_SUPPLY_STATUS_FULL;
244 val->intval = POWER_SUPPLY_STATUS_UNKNOWN;
247 case POWER_SUPPLY_PROP_MANUFACTURER:
248 val->strval = BQ24257_MANUFACTURER;
251 case POWER_SUPPLY_PROP_ONLINE:
252 val->intval = state.power_good;
255 case POWER_SUPPLY_PROP_HEALTH:
256 switch (state.fault) {
258 val->intval = POWER_SUPPLY_HEALTH_GOOD;
261 case FAULT_INPUT_OVP:
263 val->intval = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
268 val->intval = POWER_SUPPLY_HEALTH_OVERHEAT;
272 val->intval = POWER_SUPPLY_HEALTH_SAFETY_TIMER_EXPIRE;
276 val->intval = POWER_SUPPLY_HEALTH_UNSPEC_FAILURE;
282 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
283 val->intval = bq24257_ichg_map[bq->init_data.ichg];
286 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX:
287 val->intval = bq24257_ichg_map[BQ24257_ICHG_MAP_SIZE - 1];
290 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
291 val->intval = bq24257_vbat_map[bq->init_data.vbat];
294 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX:
295 val->intval = bq24257_vbat_map[BQ24257_VBAT_MAP_SIZE - 1];
298 case POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT:
299 val->intval = bq24257_iterm_map[bq->init_data.iterm];
309 static int bq24257_get_chip_state(struct bq24257_device *bq,
310 struct bq24257_state *state)
314 ret = bq24257_field_read(bq, F_STAT);
320 ret = bq24257_field_read(bq, F_FAULT);
326 state->power_good = !gpiod_get_value_cansleep(bq->pg);
331 static bool bq24257_state_changed(struct bq24257_device *bq,
332 struct bq24257_state *new_state)
336 mutex_lock(&bq->lock);
337 ret = (bq->state.status != new_state->status ||
338 bq->state.fault != new_state->fault ||
339 bq->state.power_good != new_state->power_good);
340 mutex_unlock(&bq->lock);
345 enum bq24257_loop_status {
348 LOOP_STATUS_IN_CURRENT_LIMIT,
352 enum bq24257_in_ilimit {
363 enum bq24257_port_type {
364 PORT_TYPE_DCP, /* Dedicated Charging Port */
365 PORT_TYPE_CDP, /* Charging Downstream Port */
366 PORT_TYPE_SDP, /* Standard Downstream Port */
367 PORT_TYPE_NON_STANDARD,
370 enum bq24257_safety_timer {
377 static int bq24257_iilimit_autoset(struct bq24257_device *bq)
383 const u8 new_iilimit[] = {
384 [PORT_TYPE_DCP] = IILIMIT_2000,
385 [PORT_TYPE_CDP] = IILIMIT_2000,
386 [PORT_TYPE_SDP] = IILIMIT_500,
387 [PORT_TYPE_NON_STANDARD] = IILIMIT_500
390 ret = bq24257_field_read(bq, F_LOOP_STATUS);
396 ret = bq24257_field_read(bq, F_IILIMIT);
403 * All USB ports should be able to handle 500mA. If not, DPM will lower
404 * the charging current to accommodate the power source. No need to set
405 * a lower IILIMIT value.
407 if (loop_status == LOOP_STATUS_IN_DPM && iilimit == IILIMIT_500)
410 ret = bq24257_field_read(bq, F_USB_DET);
416 ret = bq24257_field_write(bq, F_IILIMIT, new_iilimit[port_type]);
420 ret = bq24257_field_write(bq, F_TMR, SAFETY_TIMER_360);
424 ret = bq24257_field_write(bq, F_CLR_VDP, 1);
428 dev_dbg(bq->dev, "port/loop = %d/%d -> iilimit = %d\n",
429 port_type, loop_status, new_iilimit[port_type]);
434 dev_err(bq->dev, "%s: Error communicating with the chip.\n", __func__);
438 static void bq24257_iilimit_setup_work(struct work_struct *work)
440 struct bq24257_device *bq = container_of(work, struct bq24257_device,
441 iilimit_setup_work.work);
443 bq24257_iilimit_autoset(bq);
446 static void bq24257_handle_state_change(struct bq24257_device *bq,
447 struct bq24257_state *new_state)
450 struct bq24257_state old_state;
452 mutex_lock(&bq->lock);
453 old_state = bq->state;
454 mutex_unlock(&bq->lock);
456 if (!new_state->power_good) {
457 dev_dbg(bq->dev, "Power removed\n");
458 cancel_delayed_work_sync(&bq->iilimit_setup_work);
460 /* activate D+/D- port detection algorithm */
461 ret = bq24257_field_write(bq, F_DPDM_EN, 1);
465 /* reset input current limit */
466 ret = bq24257_field_write(bq, F_IILIMIT, IILIMIT_500);
469 } else if (!old_state.power_good) {
470 dev_dbg(bq->dev, "Power inserted\n");
472 /* configure input current limit */
473 schedule_delayed_work(&bq->iilimit_setup_work,
474 msecs_to_jiffies(BQ24257_ILIM_SET_DELAY));
475 } else if (new_state->fault == FAULT_NO_BAT) {
476 dev_warn(bq->dev, "Battery removed\n");
477 } else if (new_state->fault == FAULT_TIMER) {
478 dev_err(bq->dev, "Safety timer expired! Battery dead?\n");
484 dev_err(bq->dev, "%s: Error communicating with the chip.\n", __func__);
487 static irqreturn_t bq24257_irq_handler_thread(int irq, void *private)
490 struct bq24257_device *bq = private;
491 struct bq24257_state state;
493 ret = bq24257_get_chip_state(bq, &state);
497 if (!bq24257_state_changed(bq, &state))
500 dev_dbg(bq->dev, "irq(state changed): status/fault/pg = %d/%d/%d\n",
501 state.status, state.fault, state.power_good);
503 bq24257_handle_state_change(bq, &state);
505 mutex_lock(&bq->lock);
507 mutex_unlock(&bq->lock);
509 power_supply_changed(bq->charger);
514 static int bq24257_hw_init(struct bq24257_device *bq)
518 struct bq24257_state state;
524 {F_ICHG, bq->init_data.ichg},
525 {F_VBAT, bq->init_data.vbat},
526 {F_ITERM, bq->init_data.iterm}
530 * Disable the watchdog timer to prevent the IC from going back to
531 * default settings after 50 seconds of I2C inactivity.
533 ret = bq24257_field_write(bq, F_WD_EN, 0);
537 /* configure the charge currents and voltages */
538 for (i = 0; i < ARRAY_SIZE(init_data); i++) {
539 ret = bq24257_field_write(bq, init_data[i].field,
545 ret = bq24257_get_chip_state(bq, &state);
549 mutex_lock(&bq->lock);
551 mutex_unlock(&bq->lock);
553 if (!state.power_good)
554 /* activate D+/D- detection algorithm */
555 ret = bq24257_field_write(bq, F_DPDM_EN, 1);
556 else if (state.fault != FAULT_NO_BAT)
557 ret = bq24257_iilimit_autoset(bq);
562 static enum power_supply_property bq24257_power_supply_props[] = {
563 POWER_SUPPLY_PROP_MANUFACTURER,
564 POWER_SUPPLY_PROP_STATUS,
565 POWER_SUPPLY_PROP_ONLINE,
566 POWER_SUPPLY_PROP_HEALTH,
567 POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT,
568 POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX,
569 POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE,
570 POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX,
571 POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT,
574 static char *bq24257_charger_supplied_to[] = {
578 static const struct power_supply_desc bq24257_power_supply_desc = {
579 .name = "bq24257-charger",
580 .type = POWER_SUPPLY_TYPE_USB,
581 .properties = bq24257_power_supply_props,
582 .num_properties = ARRAY_SIZE(bq24257_power_supply_props),
583 .get_property = bq24257_power_supply_get_property,
586 static int bq24257_power_supply_init(struct bq24257_device *bq)
588 struct power_supply_config psy_cfg = { .drv_data = bq, };
590 psy_cfg.supplied_to = bq24257_charger_supplied_to;
591 psy_cfg.num_supplicants = ARRAY_SIZE(bq24257_charger_supplied_to);
593 bq->charger = devm_power_supply_register(bq->dev,
594 &bq24257_power_supply_desc,
597 return PTR_ERR_OR_ZERO(bq->charger);
600 static int bq24257_pg_gpio_probe(struct bq24257_device *bq)
602 bq->pg = devm_gpiod_get_index(bq->dev, BQ24257_PG_GPIO, 0, GPIOD_IN);
603 if (IS_ERR(bq->pg)) {
604 dev_err(bq->dev, "could not probe PG pin\n");
605 return PTR_ERR(bq->pg);
611 static int bq24257_fw_probe(struct bq24257_device *bq)
616 ret = device_property_read_u32(bq->dev, "ti,charge-current", &property);
620 bq->init_data.ichg = bq24257_find_idx(property, bq24257_ichg_map,
621 BQ24257_ICHG_MAP_SIZE);
623 ret = device_property_read_u32(bq->dev, "ti,battery-regulation-voltage",
628 bq->init_data.vbat = bq24257_find_idx(property, bq24257_vbat_map,
629 BQ24257_VBAT_MAP_SIZE);
631 ret = device_property_read_u32(bq->dev, "ti,termination-current",
636 bq->init_data.iterm = bq24257_find_idx(property, bq24257_iterm_map,
637 BQ24257_ITERM_MAP_SIZE);
642 static int bq24257_probe(struct i2c_client *client,
643 const struct i2c_device_id *id)
645 struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);
646 struct device *dev = &client->dev;
647 struct bq24257_device *bq;
651 if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) {
652 dev_err(dev, "No support for SMBUS_BYTE_DATA\n");
656 bq = devm_kzalloc(dev, sizeof(*bq), GFP_KERNEL);
663 mutex_init(&bq->lock);
665 bq->rmap = devm_regmap_init_i2c(client, &bq24257_regmap_config);
666 if (IS_ERR(bq->rmap)) {
667 dev_err(dev, "failed to allocate register map\n");
668 return PTR_ERR(bq->rmap);
671 for (i = 0; i < ARRAY_SIZE(bq24257_reg_fields); i++) {
672 const struct reg_field *reg_fields = bq24257_reg_fields;
674 bq->rmap_fields[i] = devm_regmap_field_alloc(dev, bq->rmap,
676 if (IS_ERR(bq->rmap_fields[i])) {
677 dev_err(dev, "cannot allocate regmap field\n");
678 return PTR_ERR(bq->rmap_fields[i]);
682 i2c_set_clientdata(client, bq);
684 INIT_DELAYED_WORK(&bq->iilimit_setup_work, bq24257_iilimit_setup_work);
686 if (!dev->platform_data) {
687 ret = bq24257_fw_probe(bq);
689 dev_err(dev, "Cannot read device properties.\n");
696 /* we can only check Power Good status by probing the PG pin */
697 ret = bq24257_pg_gpio_probe(bq);
701 /* reset all registers to defaults */
702 ret = bq24257_field_write(bq, F_RESET, 1);
707 * Put the RESET bit back to 0, in cache. For some reason the HW always
708 * returns 1 on this bit, so this is the only way to avoid resetting the
709 * chip every time we update another field in this register.
711 ret = bq24257_field_write(bq, F_RESET, 0);
715 ret = bq24257_hw_init(bq);
717 dev_err(dev, "Cannot initialize the chip.\n");
721 ret = devm_request_threaded_irq(dev, client->irq, NULL,
722 bq24257_irq_handler_thread,
723 IRQF_TRIGGER_FALLING |
724 IRQF_TRIGGER_RISING | IRQF_ONESHOT,
727 dev_err(dev, "Failed to request IRQ #%d\n", client->irq);
731 ret = bq24257_power_supply_init(bq);
733 dev_err(dev, "Failed to register power supply\n");
738 static int bq24257_remove(struct i2c_client *client)
740 struct bq24257_device *bq = i2c_get_clientdata(client);
742 cancel_delayed_work_sync(&bq->iilimit_setup_work);
744 bq24257_field_write(bq, F_RESET, 1); /* reset to defaults */
749 #ifdef CONFIG_PM_SLEEP
750 static int bq24257_suspend(struct device *dev)
752 struct bq24257_device *bq = dev_get_drvdata(dev);
755 cancel_delayed_work_sync(&bq->iilimit_setup_work);
757 /* reset all registers to default (and activate standalone mode) */
758 ret = bq24257_field_write(bq, F_RESET, 1);
760 dev_err(bq->dev, "Cannot reset chip to standalone mode.\n");
765 static int bq24257_resume(struct device *dev)
768 struct bq24257_device *bq = dev_get_drvdata(dev);
770 ret = regcache_drop_region(bq->rmap, BQ24257_REG_1, BQ24257_REG_7);
774 ret = bq24257_field_write(bq, F_RESET, 0);
778 ret = bq24257_hw_init(bq);
780 dev_err(bq->dev, "Cannot init chip after resume.\n");
784 /* signal userspace, maybe state changed while suspended */
785 power_supply_changed(bq->charger);
791 static const struct dev_pm_ops bq24257_pm = {
792 SET_SYSTEM_SLEEP_PM_OPS(bq24257_suspend, bq24257_resume)
795 static const struct i2c_device_id bq24257_i2c_ids[] = {
799 MODULE_DEVICE_TABLE(i2c, bq24257_i2c_ids);
801 static const struct of_device_id bq24257_of_match[] = {
802 { .compatible = "ti,bq24257", },
805 MODULE_DEVICE_TABLE(of, bq24257_of_match);
807 static const struct acpi_device_id bq24257_acpi_match[] = {
811 MODULE_DEVICE_TABLE(acpi, bq24257_acpi_match);
813 static struct i2c_driver bq24257_driver = {
815 .name = "bq24257-charger",
816 .of_match_table = of_match_ptr(bq24257_of_match),
817 .acpi_match_table = ACPI_PTR(bq24257_acpi_match),
820 .probe = bq24257_probe,
821 .remove = bq24257_remove,
822 .id_table = bq24257_i2c_ids,
824 module_i2c_driver(bq24257_driver);
826 MODULE_AUTHOR("Laurentiu Palcu <laurentiu.palcu@intel.com>");
827 MODULE_DESCRIPTION("bq24257 charger driver");
828 MODULE_LICENSE("GPL");