1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * TI BQ24257 charger driver
5 * Copyright (C) 2015 Intel Corporation
8 * https://www.ti.com/product/bq24250
9 * https://www.ti.com/product/bq24251
10 * https://www.ti.com/product/bq24257
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>
22 #include <linux/acpi.h>
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
33 #define BQ24257_MANUFACTURER "Texas Instruments"
34 #define BQ24257_PG_GPIO "pg"
36 #define BQ24257_ILIM_SET_DELAY 1000 /* msec */
44 struct bq2425x_chip_info
{
45 const char *const name
;
46 enum bq2425x_chip chip
;
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 */
61 /* initial field values, converted from uV/uA */
62 struct 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 */
71 struct bq24257_state
{
77 struct bq24257_device
{
78 struct i2c_client
*client
;
80 struct power_supply
*charger
;
82 const struct bq2425x_chip_info
*info
;
85 struct regmap_field
*rmap_fields
[F_MAX_FIELDS
];
89 struct delayed_work iilimit_setup_work
;
91 struct bq24257_init_data init_data
;
92 struct bq24257_state state
;
94 struct mutex lock
; /* protect state data */
96 bool iilimit_autoset_enable
;
99 static bool bq24257_is_volatile_reg(struct device
*dev
, unsigned int reg
)
111 static const struct regmap_config bq24257_regmap_config
= {
115 .max_register
= BQ24257_REG_7
,
116 .cache_type
= REGCACHE_RBTREE
,
118 .volatile_reg
= bq24257_is_volatile_reg
,
121 static const struct reg_field bq24257_reg_fields
[] = {
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),
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),
135 [F_VBAT
] = REG_FIELD(BQ24257_REG_3
, 2, 7),
136 [F_USB_DET
] = REG_FIELD(BQ24257_REG_3
, 0, 1),
138 [F_ICHG
] = REG_FIELD(BQ24257_REG_4
, 3, 7),
139 [F_ITERM
] = REG_FIELD(BQ24257_REG_4
, 0, 2),
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),
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),
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)
159 static 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
168 #define BQ24257_VBAT_MAP_SIZE ARRAY_SIZE(bq24257_vbat_map)
170 static 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
177 #define BQ24257_ICHG_MAP_SIZE ARRAY_SIZE(bq24257_ichg_map)
179 static const u32 bq24257_iterm_map
[] = {
180 50000, 75000, 100000, 125000, 150000, 175000, 200000, 225000
183 #define BQ24257_ITERM_MAP_SIZE ARRAY_SIZE(bq24257_iterm_map)
185 static const u32 bq24257_iilimit_map
[] = {
186 100000, 150000, 500000, 900000, 1500000, 2000000
189 #define BQ24257_IILIMIT_MAP_SIZE ARRAY_SIZE(bq24257_iilimit_map)
191 static const u32 bq24257_vovp_map
[] = {
192 6000000, 6500000, 7000000, 8000000, 9000000, 9500000, 10000000,
196 #define BQ24257_VOVP_MAP_SIZE ARRAY_SIZE(bq24257_vovp_map)
198 static const u32 bq24257_vindpm_map
[] = {
199 4200000, 4280000, 4360000, 4440000, 4520000, 4600000, 4680000,
203 #define BQ24257_VINDPM_MAP_SIZE ARRAY_SIZE(bq24257_vindpm_map)
205 static int bq24257_field_read(struct bq24257_device
*bq
,
206 enum bq24257_fields field_id
)
211 ret
= regmap_field_read(bq
->rmap_fields
[field_id
], &val
);
218 static int bq24257_field_write(struct bq24257_device
*bq
,
219 enum bq24257_fields field_id
, u8 val
)
221 return regmap_field_write(bq
->rmap_fields
[field_id
], val
);
224 static u8
bq24257_find_idx(u32 value
, const u32
*map
, u8 map_size
)
228 for (idx
= 1; idx
< map_size
; idx
++)
229 if (value
< map
[idx
])
235 enum bq24257_status
{
237 STATUS_CHARGE_IN_PROGRESS
,
256 static int bq24257_get_input_current_limit(struct bq24257_device
*bq
,
257 union power_supply_propval
*val
)
261 ret
= bq24257_field_read(bq
, F_IILIMIT
);
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
272 if (ret
>= BQ24257_IILIMIT_MAP_SIZE
)
275 val
->intval
= bq24257_iilimit_map
[ret
];
280 static int bq24257_set_input_current_limit(struct bq24257_device
*bq
,
281 const union power_supply_propval
*val
)
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.
288 if (bq
->iilimit_autoset_enable
)
289 cancel_delayed_work_sync(&bq
->iilimit_setup_work
);
291 return bq24257_field_write(bq
, F_IILIMIT
,
292 bq24257_find_idx(val
->intval
,
294 BQ24257_IILIMIT_MAP_SIZE
));
297 static int bq24257_power_supply_get_property(struct power_supply
*psy
,
298 enum power_supply_property psp
,
299 union power_supply_propval
*val
)
301 struct bq24257_device
*bq
= power_supply_get_drvdata(psy
);
302 struct bq24257_state state
;
304 mutex_lock(&bq
->lock
);
306 mutex_unlock(&bq
->lock
);
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
;
319 val
->intval
= POWER_SUPPLY_STATUS_UNKNOWN
;
322 case POWER_SUPPLY_PROP_MANUFACTURER
:
323 val
->strval
= BQ24257_MANUFACTURER
;
326 case POWER_SUPPLY_PROP_MODEL_NAME
:
327 val
->strval
= bq
->info
->name
;
330 case POWER_SUPPLY_PROP_ONLINE
:
331 val
->intval
= state
.power_good
;
334 case POWER_SUPPLY_PROP_HEALTH
:
335 switch (state
.fault
) {
337 val
->intval
= POWER_SUPPLY_HEALTH_GOOD
;
340 case FAULT_INPUT_OVP
:
342 val
->intval
= POWER_SUPPLY_HEALTH_OVERVOLTAGE
;
347 val
->intval
= POWER_SUPPLY_HEALTH_OVERHEAT
;
351 val
->intval
= POWER_SUPPLY_HEALTH_SAFETY_TIMER_EXPIRE
;
355 val
->intval
= POWER_SUPPLY_HEALTH_UNSPEC_FAILURE
;
361 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT
:
362 val
->intval
= bq24257_ichg_map
[bq
->init_data
.ichg
];
365 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX
:
366 val
->intval
= bq24257_ichg_map
[BQ24257_ICHG_MAP_SIZE
- 1];
369 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE
:
370 val
->intval
= bq24257_vbat_map
[bq
->init_data
.vbat
];
373 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX
:
374 val
->intval
= bq24257_vbat_map
[BQ24257_VBAT_MAP_SIZE
- 1];
377 case POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT
:
378 val
->intval
= bq24257_iterm_map
[bq
->init_data
.iterm
];
381 case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT
:
382 return bq24257_get_input_current_limit(bq
, val
);
391 static int bq24257_power_supply_set_property(struct power_supply
*psy
,
392 enum power_supply_property prop
,
393 const union power_supply_propval
*val
)
395 struct bq24257_device
*bq
= power_supply_get_drvdata(psy
);
398 case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT
:
399 return bq24257_set_input_current_limit(bq
, val
);
405 static int bq24257_power_supply_property_is_writeable(struct power_supply
*psy
,
406 enum power_supply_property psp
)
409 case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT
:
416 static int bq24257_get_chip_state(struct bq24257_device
*bq
,
417 struct bq24257_state
*state
)
421 ret
= bq24257_field_read(bq
, F_STAT
);
427 ret
= bq24257_field_read(bq
, F_FAULT
);
434 state
->power_good
= !gpiod_get_value_cansleep(bq
->pg
);
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.
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;
451 state
->power_good
= true;
457 static bool bq24257_state_changed(struct bq24257_device
*bq
,
458 struct bq24257_state
*new_state
)
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(&bq
->lock
);
471 enum bq24257_loop_status
{
474 LOOP_STATUS_IN_CURRENT_LIMIT
,
478 enum bq24257_in_ilimit
{
500 enum bq24257_vindpm
{
511 enum 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
,
518 enum bq24257_safety_timer
{
525 static int bq24257_iilimit_autoset(struct bq24257_device
*bq
)
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
538 ret
= bq24257_field_read(bq
, F_LOOP_STATUS
);
544 ret
= bq24257_field_read(bq
, F_IILIMIT
);
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.
555 if (loop_status
== LOOP_STATUS_IN_DPM
&& iilimit
== IILIMIT_500
)
558 ret
= bq24257_field_read(bq
, F_USB_DET
);
564 ret
= bq24257_field_write(bq
, F_IILIMIT
, new_iilimit
[port_type
]);
568 ret
= bq24257_field_write(bq
, F_TMR
, SAFETY_TIMER_360
);
572 ret
= bq24257_field_write(bq
, F_CLR_VDP
, 1);
576 dev_dbg(bq
->dev
, "port/loop = %d/%d -> iilimit = %d\n",
577 port_type
, loop_status
, new_iilimit
[port_type
]);
582 dev_err(bq
->dev
, "%s: Error communicating with the chip.\n", __func__
);
586 static void bq24257_iilimit_setup_work(struct work_struct
*work
)
588 struct bq24257_device
*bq
= container_of(work
, struct bq24257_device
,
589 iilimit_setup_work
.work
);
591 bq24257_iilimit_autoset(bq
);
594 static void bq24257_handle_state_change(struct bq24257_device
*bq
,
595 struct bq24257_state
*new_state
)
598 struct bq24257_state old_state
;
600 mutex_lock(&bq
->lock
);
601 old_state
= bq
->state
;
602 mutex_unlock(&bq
->lock
);
605 * Handle BQ2425x state changes observing whether the D+/D- based input
606 * current limit autoset functionality is enabled.
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(&bq
->iilimit_setup_work
);
613 /* activate D+/D- port detection algorithm */
614 ret
= bq24257_field_write(bq
, F_DPDM_EN
, 1);
619 * When power is removed always return to the default input
620 * current limit as configured during probe.
622 ret
= bq24257_field_write(bq
, F_IILIMIT
, bq
->init_data
.iilimit
);
625 } else if (!old_state
.power_good
) {
626 dev_dbg(bq
->dev
, "Power inserted\n");
628 if (bq
->iilimit_autoset_enable
)
629 /* configure input current limit */
630 schedule_delayed_work(&bq
->iilimit_setup_work
,
631 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");
641 dev_err(bq
->dev
, "%s: Error communicating with the chip.\n", __func__
);
644 static irqreturn_t
bq24257_irq_handler_thread(int irq
, void *private)
647 struct bq24257_device
*bq
= private;
648 struct bq24257_state state
;
650 ret
= bq24257_get_chip_state(bq
, &state
);
654 if (!bq24257_state_changed(bq
, &state
))
657 dev_dbg(bq
->dev
, "irq(state changed): status/fault/pg = %d/%d/%d\n",
658 state
.status
, state
.fault
, state
.power_good
);
660 bq24257_handle_state_change(bq
, &state
);
662 mutex_lock(&bq
->lock
);
664 mutex_unlock(&bq
->lock
);
666 power_supply_changed(bq
->charger
);
671 static int bq24257_hw_init(struct bq24257_device
*bq
)
675 struct bq24257_state state
;
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
},
689 * Disable the watchdog timer to prevent the IC from going back to
690 * default settings after 50 seconds of I2C inactivity.
692 ret
= bq24257_field_write(bq
, F_WD_EN
, 0);
696 /* configure the charge currents and voltages */
697 for (i
= 0; i
< ARRAY_SIZE(init_data
); i
++) {
698 ret
= bq24257_field_write(bq
, init_data
[i
].field
,
704 ret
= bq24257_get_chip_state(bq
, &state
);
708 mutex_lock(&bq
->lock
);
710 mutex_unlock(&bq
->lock
);
712 if (!bq
->iilimit_autoset_enable
) {
713 dev_dbg(bq
->dev
, "manually setting iilimit = %u\n",
714 bq
->init_data
.iilimit
);
716 /* program fixed input current limit */
717 ret
= bq24257_field_write(bq
, F_IILIMIT
,
718 bq
->init_data
.iilimit
);
721 } else if (!state
.power_good
)
722 /* activate D+/D- detection algorithm */
723 ret
= bq24257_field_write(bq
, F_DPDM_EN
, 1);
724 else if (state
.fault
!= FAULT_NO_BAT
)
725 ret
= bq24257_iilimit_autoset(bq
);
730 static 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
,
744 static char *bq24257_charger_supplied_to
[] = {
748 static 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
,
758 static ssize_t
bq24257_show_ovp_voltage(struct device
*dev
,
759 struct device_attribute
*attr
,
762 struct power_supply
*psy
= dev_get_drvdata(dev
);
763 struct bq24257_device
*bq
= power_supply_get_drvdata(psy
);
765 return sysfs_emit(buf
, "%u\n", bq24257_vovp_map
[bq
->init_data
.vovp
]);
768 static ssize_t
bq24257_show_in_dpm_voltage(struct device
*dev
,
769 struct device_attribute
*attr
,
772 struct power_supply
*psy
= dev_get_drvdata(dev
);
773 struct bq24257_device
*bq
= power_supply_get_drvdata(psy
);
775 return sysfs_emit(buf
, "%u\n", bq24257_vindpm_map
[bq
->init_data
.vindpm
]);
778 static ssize_t
bq24257_sysfs_show_enable(struct device
*dev
,
779 struct device_attribute
*attr
,
782 struct power_supply
*psy
= dev_get_drvdata(dev
);
783 struct bq24257_device
*bq
= power_supply_get_drvdata(psy
);
786 if (strcmp(attr
->attr
.name
, "high_impedance_enable") == 0)
787 ret
= bq24257_field_read(bq
, F_HZ_MODE
);
788 else if (strcmp(attr
->attr
.name
, "sysoff_enable") == 0)
789 ret
= bq24257_field_read(bq
, F_SYSOFF
);
796 return sysfs_emit(buf
, "%d\n", ret
);
799 static ssize_t
bq24257_sysfs_set_enable(struct device
*dev
,
800 struct device_attribute
*attr
,
804 struct power_supply
*psy
= dev_get_drvdata(dev
);
805 struct bq24257_device
*bq
= power_supply_get_drvdata(psy
);
809 if (kstrtol(buf
, 10, &val
) < 0)
812 if (strcmp(attr
->attr
.name
, "high_impedance_enable") == 0)
813 ret
= bq24257_field_write(bq
, F_HZ_MODE
, (bool)val
);
814 else if (strcmp(attr
->attr
.name
, "sysoff_enable") == 0)
815 ret
= bq24257_field_write(bq
, F_SYSOFF
, (bool)val
);
825 static DEVICE_ATTR(ovp_voltage
, S_IRUGO
, bq24257_show_ovp_voltage
, NULL
);
826 static DEVICE_ATTR(in_dpm_voltage
, S_IRUGO
, bq24257_show_in_dpm_voltage
, NULL
);
827 static DEVICE_ATTR(high_impedance_enable
, S_IWUSR
| S_IRUGO
,
828 bq24257_sysfs_show_enable
, bq24257_sysfs_set_enable
);
829 static DEVICE_ATTR(sysoff_enable
, S_IWUSR
| S_IRUGO
,
830 bq24257_sysfs_show_enable
, bq24257_sysfs_set_enable
);
832 static 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
,
840 ATTRIBUTE_GROUPS(bq24257_charger_sysfs
);
842 static int bq24257_power_supply_init(struct bq24257_device
*bq
)
844 struct power_supply_config psy_cfg
= { .drv_data
= bq
, };
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
);
850 bq
->charger
= devm_power_supply_register(bq
->dev
,
851 &bq24257_power_supply_desc
,
854 return PTR_ERR_OR_ZERO(bq
->charger
);
857 static void bq24257_pg_gpio_probe(struct bq24257_device
*bq
)
859 bq
->pg
= devm_gpiod_get_optional(bq
->dev
, BQ24257_PG_GPIO
, GPIOD_IN
);
861 if (PTR_ERR(bq
->pg
) == -EPROBE_DEFER
) {
862 dev_info(bq
->dev
, "probe retry requested for PG pin\n");
864 } else if (IS_ERR(bq
->pg
)) {
865 dev_err(bq
->dev
, "error probing PG pin\n");
871 dev_dbg(bq
->dev
, "probed PG pin = %d\n", desc_to_gpio(bq
->pg
));
874 static int bq24257_fw_probe(struct bq24257_device
*bq
)
879 /* Required properties */
880 ret
= device_property_read_u32(bq
->dev
, "ti,charge-current", &property
);
884 bq
->init_data
.ichg
= bq24257_find_idx(property
, bq24257_ichg_map
,
885 BQ24257_ICHG_MAP_SIZE
);
887 ret
= device_property_read_u32(bq
->dev
, "ti,battery-regulation-voltage",
892 bq
->init_data
.vbat
= bq24257_find_idx(property
, bq24257_vbat_map
,
893 BQ24257_VBAT_MAP_SIZE
);
895 ret
= device_property_read_u32(bq
->dev
, "ti,termination-current",
900 bq
->init_data
.iterm
= bq24257_find_idx(property
, bq24257_iterm_map
,
901 BQ24257_ITERM_MAP_SIZE
);
903 /* Optional properties. If not provided use reasonable default. */
904 ret
= device_property_read_u32(bq
->dev
, "ti,current-limit",
907 bq
->iilimit_autoset_enable
= true;
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.
914 bq
->init_data
.iilimit
= IILIMIT_500
;
916 bq
->init_data
.iilimit
=
917 bq24257_find_idx(property
,
919 BQ24257_IILIMIT_MAP_SIZE
);
921 ret
= device_property_read_u32(bq
->dev
, "ti,ovp-voltage",
924 bq
->init_data
.vovp
= VOVP_6500
;
926 bq
->init_data
.vovp
= bq24257_find_idx(property
,
928 BQ24257_VOVP_MAP_SIZE
);
930 ret
= device_property_read_u32(bq
->dev
, "ti,in-dpm-voltage",
933 bq
->init_data
.vindpm
= VINDPM_4360
;
935 bq
->init_data
.vindpm
=
936 bq24257_find_idx(property
,
938 BQ24257_VINDPM_MAP_SIZE
);
943 static int bq24257_probe(struct i2c_client
*client
)
945 struct i2c_adapter
*adapter
= client
->adapter
;
946 struct device
*dev
= &client
->dev
;
947 struct bq24257_device
*bq
;
951 if (!i2c_check_functionality(adapter
, I2C_FUNC_SMBUS_BYTE_DATA
)) {
952 dev_err(dev
, "No support for SMBUS_BYTE_DATA\n");
956 bq
= devm_kzalloc(dev
, sizeof(*bq
), GFP_KERNEL
);
963 bq
->info
= i2c_get_match_data(client
);
965 return dev_err_probe(dev
, -ENODEV
, "Failed to match device\n");
967 mutex_init(&bq
->lock
);
969 bq
->rmap
= devm_regmap_init_i2c(client
, &bq24257_regmap_config
);
970 if (IS_ERR(bq
->rmap
)) {
971 dev_err(dev
, "failed to allocate register map\n");
972 return PTR_ERR(bq
->rmap
);
975 for (i
= 0; i
< ARRAY_SIZE(bq24257_reg_fields
); i
++) {
976 const struct reg_field
*reg_fields
= bq24257_reg_fields
;
978 bq
->rmap_fields
[i
] = devm_regmap_field_alloc(dev
, bq
->rmap
,
980 if (IS_ERR(bq
->rmap_fields
[i
])) {
981 dev_err(dev
, "cannot allocate regmap field\n");
982 return PTR_ERR(bq
->rmap_fields
[i
]);
986 i2c_set_clientdata(client
, bq
);
988 if (!dev
->platform_data
) {
989 ret
= bq24257_fw_probe(bq
);
991 dev_err(dev
, "Cannot read device properties.\n");
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.
1003 if (bq
->info
->chip
== BQ24250
)
1004 bq
->iilimit_autoset_enable
= false;
1006 if (bq
->iilimit_autoset_enable
)
1007 INIT_DELAYED_WORK(&bq
->iilimit_setup_work
,
1008 bq24257_iilimit_setup_work
);
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.
1016 if (bq
->info
->chip
!= BQ24250
)
1017 bq24257_pg_gpio_probe(bq
);
1019 if (PTR_ERR(bq
->pg
) == -EPROBE_DEFER
)
1020 return PTR_ERR(bq
->pg
);
1022 dev_info(bq
->dev
, "using SW-based power-good detection\n");
1024 /* reset all registers to defaults */
1025 ret
= bq24257_field_write(bq
, F_RESET
, 1);
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.
1034 ret
= bq24257_field_write(bq
, F_RESET
, 0);
1038 ret
= bq24257_hw_init(bq
);
1040 dev_err(dev
, "Cannot initialize the chip.\n");
1044 ret
= bq24257_power_supply_init(bq
);
1046 dev_err(dev
, "Failed to register power supply\n");
1050 ret
= devm_request_threaded_irq(dev
, client
->irq
, NULL
,
1051 bq24257_irq_handler_thread
,
1052 IRQF_TRIGGER_FALLING
|
1053 IRQF_TRIGGER_RISING
| IRQF_ONESHOT
,
1054 bq
->info
->name
, bq
);
1056 dev_err(dev
, "Failed to request IRQ #%d\n", client
->irq
);
1063 static void bq24257_remove(struct i2c_client
*client
)
1065 struct bq24257_device
*bq
= i2c_get_clientdata(client
);
1067 if (bq
->iilimit_autoset_enable
)
1068 cancel_delayed_work_sync(&bq
->iilimit_setup_work
);
1070 bq24257_field_write(bq
, F_RESET
, 1); /* reset to defaults */
1073 #ifdef CONFIG_PM_SLEEP
1074 static int bq24257_suspend(struct device
*dev
)
1076 struct bq24257_device
*bq
= dev_get_drvdata(dev
);
1079 if (bq
->iilimit_autoset_enable
)
1080 cancel_delayed_work_sync(&bq
->iilimit_setup_work
);
1082 /* reset all registers to default (and activate standalone mode) */
1083 ret
= bq24257_field_write(bq
, F_RESET
, 1);
1085 dev_err(bq
->dev
, "Cannot reset chip to standalone mode.\n");
1090 static int bq24257_resume(struct device
*dev
)
1093 struct bq24257_device
*bq
= dev_get_drvdata(dev
);
1095 ret
= regcache_drop_region(bq
->rmap
, BQ24257_REG_1
, BQ24257_REG_7
);
1099 ret
= bq24257_field_write(bq
, F_RESET
, 0);
1103 ret
= bq24257_hw_init(bq
);
1105 dev_err(bq
->dev
, "Cannot init chip after resume.\n");
1109 /* signal userspace, maybe state changed while suspended */
1110 power_supply_changed(bq
->charger
);
1116 static const struct dev_pm_ops bq24257_pm
= {
1117 SET_SYSTEM_SLEEP_PM_OPS(bq24257_suspend
, bq24257_resume
)
1120 static const struct bq2425x_chip_info bq24250_info
= {
1125 static const struct bq2425x_chip_info bq24251_info
= {
1130 static const struct bq2425x_chip_info bq24257_info
= {
1135 static 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
},
1141 MODULE_DEVICE_TABLE(i2c
, bq24257_i2c_ids
);
1143 static 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
},
1149 MODULE_DEVICE_TABLE(of
, bq24257_of_match
);
1152 static 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
},
1158 MODULE_DEVICE_TABLE(acpi
, bq24257_acpi_match
);
1161 static struct i2c_driver bq24257_driver
= {
1163 .name
= "bq24257-charger",
1164 .of_match_table
= of_match_ptr(bq24257_of_match
),
1165 .acpi_match_table
= ACPI_PTR(bq24257_acpi_match
),
1168 .probe
= bq24257_probe
,
1169 .remove
= bq24257_remove
,
1170 .id_table
= bq24257_i2c_ids
,
1172 module_i2c_driver(bq24257_driver
);
1174 MODULE_AUTHOR("Laurentiu Palcu <laurentiu.palcu@intel.com>");
1175 MODULE_DESCRIPTION("bq24257 charger driver");
1176 MODULE_LICENSE("GPL");