1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * TI BQ24257 charger driver
5 * Copyright (C) 2015 Intel Corporation
8 * http://www.ti.com/product/bq24250
9 * http://www.ti.com/product/bq24251
10 * http://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 */
39 * When adding support for new devices make sure that enum bq2425x_chip and
40 * bq2425x_chip_name[] always stay in sync!
48 static const char *const bq2425x_chip_name
[] = {
55 F_WD_FAULT
, F_WD_EN
, F_STAT
, F_FAULT
, /* REG 1 */
56 F_RESET
, F_IILIMIT
, F_EN_STAT
, F_EN_TERM
, F_CE
, F_HZ_MODE
, /* REG 2 */
57 F_VBAT
, F_USB_DET
, /* REG 3 */
58 F_ICHG
, F_ITERM
, /* REG 4 */
59 F_LOOP_STATUS
, F_LOW_CHG
, F_DPDM_EN
, F_CE_STATUS
, F_VINDPM
, /* REG 5 */
60 F_X2_TMR_EN
, F_TMR
, F_SYSOFF
, F_TS_EN
, F_TS_STAT
, /* REG 6 */
61 F_VOVP
, F_CLR_VDP
, F_FORCE_BATDET
, F_FORCE_PTM
, /* REG 7 */
66 /* initial field values, converted from uV/uA */
67 struct bq24257_init_data
{
68 u8 ichg
; /* charge current */
69 u8 vbat
; /* regulation voltage */
70 u8 iterm
; /* termination current */
71 u8 iilimit
; /* input current limit */
72 u8 vovp
; /* over voltage protection voltage */
73 u8 vindpm
; /* VDMP input threshold voltage */
76 struct bq24257_state
{
82 struct bq24257_device
{
83 struct i2c_client
*client
;
85 struct power_supply
*charger
;
87 enum bq2425x_chip chip
;
90 struct regmap_field
*rmap_fields
[F_MAX_FIELDS
];
94 struct delayed_work iilimit_setup_work
;
96 struct bq24257_init_data init_data
;
97 struct bq24257_state state
;
99 struct mutex lock
; /* protect state data */
101 bool iilimit_autoset_enable
;
104 static bool bq24257_is_volatile_reg(struct device
*dev
, unsigned int reg
)
116 static const struct regmap_config bq24257_regmap_config
= {
120 .max_register
= BQ24257_REG_7
,
121 .cache_type
= REGCACHE_RBTREE
,
123 .volatile_reg
= bq24257_is_volatile_reg
,
126 static const struct reg_field bq24257_reg_fields
[] = {
128 [F_WD_FAULT
] = REG_FIELD(BQ24257_REG_1
, 7, 7),
129 [F_WD_EN
] = REG_FIELD(BQ24257_REG_1
, 6, 6),
130 [F_STAT
] = REG_FIELD(BQ24257_REG_1
, 4, 5),
131 [F_FAULT
] = REG_FIELD(BQ24257_REG_1
, 0, 3),
133 [F_RESET
] = REG_FIELD(BQ24257_REG_2
, 7, 7),
134 [F_IILIMIT
] = REG_FIELD(BQ24257_REG_2
, 4, 6),
135 [F_EN_STAT
] = REG_FIELD(BQ24257_REG_2
, 3, 3),
136 [F_EN_TERM
] = REG_FIELD(BQ24257_REG_2
, 2, 2),
137 [F_CE
] = REG_FIELD(BQ24257_REG_2
, 1, 1),
138 [F_HZ_MODE
] = REG_FIELD(BQ24257_REG_2
, 0, 0),
140 [F_VBAT
] = REG_FIELD(BQ24257_REG_3
, 2, 7),
141 [F_USB_DET
] = REG_FIELD(BQ24257_REG_3
, 0, 1),
143 [F_ICHG
] = REG_FIELD(BQ24257_REG_4
, 3, 7),
144 [F_ITERM
] = REG_FIELD(BQ24257_REG_4
, 0, 2),
146 [F_LOOP_STATUS
] = REG_FIELD(BQ24257_REG_5
, 6, 7),
147 [F_LOW_CHG
] = REG_FIELD(BQ24257_REG_5
, 5, 5),
148 [F_DPDM_EN
] = REG_FIELD(BQ24257_REG_5
, 4, 4),
149 [F_CE_STATUS
] = REG_FIELD(BQ24257_REG_5
, 3, 3),
150 [F_VINDPM
] = REG_FIELD(BQ24257_REG_5
, 0, 2),
152 [F_X2_TMR_EN
] = REG_FIELD(BQ24257_REG_6
, 7, 7),
153 [F_TMR
] = REG_FIELD(BQ24257_REG_6
, 5, 6),
154 [F_SYSOFF
] = REG_FIELD(BQ24257_REG_6
, 4, 4),
155 [F_TS_EN
] = REG_FIELD(BQ24257_REG_6
, 3, 3),
156 [F_TS_STAT
] = REG_FIELD(BQ24257_REG_6
, 0, 2),
158 [F_VOVP
] = REG_FIELD(BQ24257_REG_7
, 5, 7),
159 [F_CLR_VDP
] = REG_FIELD(BQ24257_REG_7
, 4, 4),
160 [F_FORCE_BATDET
] = REG_FIELD(BQ24257_REG_7
, 3, 3),
161 [F_FORCE_PTM
] = REG_FIELD(BQ24257_REG_7
, 2, 2)
164 static const u32 bq24257_vbat_map
[] = {
165 3500000, 3520000, 3540000, 3560000, 3580000, 3600000, 3620000, 3640000,
166 3660000, 3680000, 3700000, 3720000, 3740000, 3760000, 3780000, 3800000,
167 3820000, 3840000, 3860000, 3880000, 3900000, 3920000, 3940000, 3960000,
168 3980000, 4000000, 4020000, 4040000, 4060000, 4080000, 4100000, 4120000,
169 4140000, 4160000, 4180000, 4200000, 4220000, 4240000, 4260000, 4280000,
170 4300000, 4320000, 4340000, 4360000, 4380000, 4400000, 4420000, 4440000
173 #define BQ24257_VBAT_MAP_SIZE ARRAY_SIZE(bq24257_vbat_map)
175 static const u32 bq24257_ichg_map
[] = {
176 500000, 550000, 600000, 650000, 700000, 750000, 800000, 850000, 900000,
177 950000, 1000000, 1050000, 1100000, 1150000, 1200000, 1250000, 1300000,
178 1350000, 1400000, 1450000, 1500000, 1550000, 1600000, 1650000, 1700000,
179 1750000, 1800000, 1850000, 1900000, 1950000, 2000000
182 #define BQ24257_ICHG_MAP_SIZE ARRAY_SIZE(bq24257_ichg_map)
184 static const u32 bq24257_iterm_map
[] = {
185 50000, 75000, 100000, 125000, 150000, 175000, 200000, 225000
188 #define BQ24257_ITERM_MAP_SIZE ARRAY_SIZE(bq24257_iterm_map)
190 static const u32 bq24257_iilimit_map
[] = {
191 100000, 150000, 500000, 900000, 1500000, 2000000
194 #define BQ24257_IILIMIT_MAP_SIZE ARRAY_SIZE(bq24257_iilimit_map)
196 static const u32 bq24257_vovp_map
[] = {
197 6000000, 6500000, 7000000, 8000000, 9000000, 9500000, 10000000,
201 #define BQ24257_VOVP_MAP_SIZE ARRAY_SIZE(bq24257_vovp_map)
203 static const u32 bq24257_vindpm_map
[] = {
204 4200000, 4280000, 4360000, 4440000, 4520000, 4600000, 4680000,
208 #define BQ24257_VINDPM_MAP_SIZE ARRAY_SIZE(bq24257_vindpm_map)
210 static int bq24257_field_read(struct bq24257_device
*bq
,
211 enum bq24257_fields field_id
)
216 ret
= regmap_field_read(bq
->rmap_fields
[field_id
], &val
);
223 static int bq24257_field_write(struct bq24257_device
*bq
,
224 enum bq24257_fields field_id
, u8 val
)
226 return regmap_field_write(bq
->rmap_fields
[field_id
], val
);
229 static u8
bq24257_find_idx(u32 value
, const u32
*map
, u8 map_size
)
233 for (idx
= 1; idx
< map_size
; idx
++)
234 if (value
< map
[idx
])
240 enum bq24257_status
{
242 STATUS_CHARGE_IN_PROGRESS
,
261 static int bq24257_get_input_current_limit(struct bq24257_device
*bq
,
262 union power_supply_propval
*val
)
266 ret
= bq24257_field_read(bq
, F_IILIMIT
);
271 * The "External ILIM" and "Production & Test" modes are not exposed
272 * through this driver and not being covered by the lookup table.
273 * Should such a mode have become active let's return an error rather
274 * than exceeding the bounds of the lookup table and returning
277 if (ret
>= BQ24257_IILIMIT_MAP_SIZE
)
280 val
->intval
= bq24257_iilimit_map
[ret
];
285 static int bq24257_set_input_current_limit(struct bq24257_device
*bq
,
286 const union power_supply_propval
*val
)
289 * Address the case where the user manually sets an input current limit
290 * while the charger auto-detection mechanism is is active. In this
291 * case we want to abort and go straight to the user-specified value.
293 if (bq
->iilimit_autoset_enable
)
294 cancel_delayed_work_sync(&bq
->iilimit_setup_work
);
296 return bq24257_field_write(bq
, F_IILIMIT
,
297 bq24257_find_idx(val
->intval
,
299 BQ24257_IILIMIT_MAP_SIZE
));
302 static int bq24257_power_supply_get_property(struct power_supply
*psy
,
303 enum power_supply_property psp
,
304 union power_supply_propval
*val
)
306 struct bq24257_device
*bq
= power_supply_get_drvdata(psy
);
307 struct bq24257_state state
;
309 mutex_lock(&bq
->lock
);
311 mutex_unlock(&bq
->lock
);
314 case POWER_SUPPLY_PROP_STATUS
:
315 if (!state
.power_good
)
316 val
->intval
= POWER_SUPPLY_STATUS_DISCHARGING
;
317 else if (state
.status
== STATUS_READY
)
318 val
->intval
= POWER_SUPPLY_STATUS_NOT_CHARGING
;
319 else if (state
.status
== STATUS_CHARGE_IN_PROGRESS
)
320 val
->intval
= POWER_SUPPLY_STATUS_CHARGING
;
321 else if (state
.status
== STATUS_CHARGE_DONE
)
322 val
->intval
= POWER_SUPPLY_STATUS_FULL
;
324 val
->intval
= POWER_SUPPLY_STATUS_UNKNOWN
;
327 case POWER_SUPPLY_PROP_MANUFACTURER
:
328 val
->strval
= BQ24257_MANUFACTURER
;
331 case POWER_SUPPLY_PROP_MODEL_NAME
:
332 val
->strval
= bq2425x_chip_name
[bq
->chip
];
335 case POWER_SUPPLY_PROP_ONLINE
:
336 val
->intval
= state
.power_good
;
339 case POWER_SUPPLY_PROP_HEALTH
:
340 switch (state
.fault
) {
342 val
->intval
= POWER_SUPPLY_HEALTH_GOOD
;
345 case FAULT_INPUT_OVP
:
347 val
->intval
= POWER_SUPPLY_HEALTH_OVERVOLTAGE
;
352 val
->intval
= POWER_SUPPLY_HEALTH_OVERHEAT
;
356 val
->intval
= POWER_SUPPLY_HEALTH_SAFETY_TIMER_EXPIRE
;
360 val
->intval
= POWER_SUPPLY_HEALTH_UNSPEC_FAILURE
;
366 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT
:
367 val
->intval
= bq24257_ichg_map
[bq
->init_data
.ichg
];
370 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX
:
371 val
->intval
= bq24257_ichg_map
[BQ24257_ICHG_MAP_SIZE
- 1];
374 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE
:
375 val
->intval
= bq24257_vbat_map
[bq
->init_data
.vbat
];
378 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX
:
379 val
->intval
= bq24257_vbat_map
[BQ24257_VBAT_MAP_SIZE
- 1];
382 case POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT
:
383 val
->intval
= bq24257_iterm_map
[bq
->init_data
.iterm
];
386 case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT
:
387 return bq24257_get_input_current_limit(bq
, val
);
396 static int bq24257_power_supply_set_property(struct power_supply
*psy
,
397 enum power_supply_property prop
,
398 const union power_supply_propval
*val
)
400 struct bq24257_device
*bq
= power_supply_get_drvdata(psy
);
403 case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT
:
404 return bq24257_set_input_current_limit(bq
, val
);
410 static int bq24257_power_supply_property_is_writeable(struct power_supply
*psy
,
411 enum power_supply_property psp
)
414 case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT
:
421 static int bq24257_get_chip_state(struct bq24257_device
*bq
,
422 struct bq24257_state
*state
)
426 ret
= bq24257_field_read(bq
, F_STAT
);
432 ret
= bq24257_field_read(bq
, F_FAULT
);
439 state
->power_good
= !gpiod_get_value_cansleep(bq
->pg
);
442 * If we have a chip without a dedicated power-good GPIO or
443 * some other explicit bit that would provide this information
444 * assume the power is good if there is no supply related
445 * fault - and not good otherwise. There is a possibility for
446 * other errors to mask that power in fact is not good but this
447 * is probably the best we can do here.
449 switch (state
->fault
) {
450 case FAULT_INPUT_OVP
:
451 case FAULT_INPUT_UVLO
:
452 case FAULT_INPUT_LDO_LOW
:
453 state
->power_good
= false;
456 state
->power_good
= true;
462 static bool bq24257_state_changed(struct bq24257_device
*bq
,
463 struct bq24257_state
*new_state
)
467 mutex_lock(&bq
->lock
);
468 ret
= (bq
->state
.status
!= new_state
->status
||
469 bq
->state
.fault
!= new_state
->fault
||
470 bq
->state
.power_good
!= new_state
->power_good
);
471 mutex_unlock(&bq
->lock
);
476 enum bq24257_loop_status
{
479 LOOP_STATUS_IN_CURRENT_LIMIT
,
483 enum bq24257_in_ilimit
{
505 enum bq24257_vindpm
{
516 enum bq24257_port_type
{
517 PORT_TYPE_DCP
, /* Dedicated Charging Port */
518 PORT_TYPE_CDP
, /* Charging Downstream Port */
519 PORT_TYPE_SDP
, /* Standard Downstream Port */
520 PORT_TYPE_NON_STANDARD
,
523 enum bq24257_safety_timer
{
530 static int bq24257_iilimit_autoset(struct bq24257_device
*bq
)
536 const u8 new_iilimit
[] = {
537 [PORT_TYPE_DCP
] = IILIMIT_2000
,
538 [PORT_TYPE_CDP
] = IILIMIT_2000
,
539 [PORT_TYPE_SDP
] = IILIMIT_500
,
540 [PORT_TYPE_NON_STANDARD
] = IILIMIT_500
543 ret
= bq24257_field_read(bq
, F_LOOP_STATUS
);
549 ret
= bq24257_field_read(bq
, F_IILIMIT
);
556 * All USB ports should be able to handle 500mA. If not, DPM will lower
557 * the charging current to accommodate the power source. No need to set
558 * a lower IILIMIT value.
560 if (loop_status
== LOOP_STATUS_IN_DPM
&& iilimit
== IILIMIT_500
)
563 ret
= bq24257_field_read(bq
, F_USB_DET
);
569 ret
= bq24257_field_write(bq
, F_IILIMIT
, new_iilimit
[port_type
]);
573 ret
= bq24257_field_write(bq
, F_TMR
, SAFETY_TIMER_360
);
577 ret
= bq24257_field_write(bq
, F_CLR_VDP
, 1);
581 dev_dbg(bq
->dev
, "port/loop = %d/%d -> iilimit = %d\n",
582 port_type
, loop_status
, new_iilimit
[port_type
]);
587 dev_err(bq
->dev
, "%s: Error communicating with the chip.\n", __func__
);
591 static void bq24257_iilimit_setup_work(struct work_struct
*work
)
593 struct bq24257_device
*bq
= container_of(work
, struct bq24257_device
,
594 iilimit_setup_work
.work
);
596 bq24257_iilimit_autoset(bq
);
599 static void bq24257_handle_state_change(struct bq24257_device
*bq
,
600 struct bq24257_state
*new_state
)
603 struct bq24257_state old_state
;
605 mutex_lock(&bq
->lock
);
606 old_state
= bq
->state
;
607 mutex_unlock(&bq
->lock
);
610 * Handle BQ2425x state changes observing whether the D+/D- based input
611 * current limit autoset functionality is enabled.
613 if (!new_state
->power_good
) {
614 dev_dbg(bq
->dev
, "Power removed\n");
615 if (bq
->iilimit_autoset_enable
) {
616 cancel_delayed_work_sync(&bq
->iilimit_setup_work
);
618 /* activate D+/D- port detection algorithm */
619 ret
= bq24257_field_write(bq
, F_DPDM_EN
, 1);
624 * When power is removed always return to the default input
625 * current limit as configured during probe.
627 ret
= bq24257_field_write(bq
, F_IILIMIT
, bq
->init_data
.iilimit
);
630 } else if (!old_state
.power_good
) {
631 dev_dbg(bq
->dev
, "Power inserted\n");
633 if (bq
->iilimit_autoset_enable
)
634 /* configure input current limit */
635 schedule_delayed_work(&bq
->iilimit_setup_work
,
636 msecs_to_jiffies(BQ24257_ILIM_SET_DELAY
));
637 } else if (new_state
->fault
== FAULT_NO_BAT
) {
638 dev_warn(bq
->dev
, "Battery removed\n");
639 } else if (new_state
->fault
== FAULT_TIMER
) {
640 dev_err(bq
->dev
, "Safety timer expired! Battery dead?\n");
646 dev_err(bq
->dev
, "%s: Error communicating with the chip.\n", __func__
);
649 static irqreturn_t
bq24257_irq_handler_thread(int irq
, void *private)
652 struct bq24257_device
*bq
= private;
653 struct bq24257_state state
;
655 ret
= bq24257_get_chip_state(bq
, &state
);
659 if (!bq24257_state_changed(bq
, &state
))
662 dev_dbg(bq
->dev
, "irq(state changed): status/fault/pg = %d/%d/%d\n",
663 state
.status
, state
.fault
, state
.power_good
);
665 bq24257_handle_state_change(bq
, &state
);
667 mutex_lock(&bq
->lock
);
669 mutex_unlock(&bq
->lock
);
671 power_supply_changed(bq
->charger
);
676 static int bq24257_hw_init(struct bq24257_device
*bq
)
680 struct bq24257_state state
;
686 {F_ICHG
, bq
->init_data
.ichg
},
687 {F_VBAT
, bq
->init_data
.vbat
},
688 {F_ITERM
, bq
->init_data
.iterm
},
689 {F_VOVP
, bq
->init_data
.vovp
},
690 {F_VINDPM
, bq
->init_data
.vindpm
},
694 * Disable the watchdog timer to prevent the IC from going back to
695 * default settings after 50 seconds of I2C inactivity.
697 ret
= bq24257_field_write(bq
, F_WD_EN
, 0);
701 /* configure the charge currents and voltages */
702 for (i
= 0; i
< ARRAY_SIZE(init_data
); i
++) {
703 ret
= bq24257_field_write(bq
, init_data
[i
].field
,
709 ret
= bq24257_get_chip_state(bq
, &state
);
713 mutex_lock(&bq
->lock
);
715 mutex_unlock(&bq
->lock
);
717 if (!bq
->iilimit_autoset_enable
) {
718 dev_dbg(bq
->dev
, "manually setting iilimit = %u\n",
719 bq
->init_data
.iilimit
);
721 /* program fixed input current limit */
722 ret
= bq24257_field_write(bq
, F_IILIMIT
,
723 bq
->init_data
.iilimit
);
726 } else if (!state
.power_good
)
727 /* activate D+/D- detection algorithm */
728 ret
= bq24257_field_write(bq
, F_DPDM_EN
, 1);
729 else if (state
.fault
!= FAULT_NO_BAT
)
730 ret
= bq24257_iilimit_autoset(bq
);
735 static enum power_supply_property bq24257_power_supply_props
[] = {
736 POWER_SUPPLY_PROP_MANUFACTURER
,
737 POWER_SUPPLY_PROP_MODEL_NAME
,
738 POWER_SUPPLY_PROP_STATUS
,
739 POWER_SUPPLY_PROP_ONLINE
,
740 POWER_SUPPLY_PROP_HEALTH
,
741 POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT
,
742 POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX
,
743 POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE
,
744 POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX
,
745 POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT
,
746 POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT
,
749 static char *bq24257_charger_supplied_to
[] = {
753 static const struct power_supply_desc bq24257_power_supply_desc
= {
754 .name
= "bq24257-charger",
755 .type
= POWER_SUPPLY_TYPE_USB
,
756 .properties
= bq24257_power_supply_props
,
757 .num_properties
= ARRAY_SIZE(bq24257_power_supply_props
),
758 .get_property
= bq24257_power_supply_get_property
,
759 .set_property
= bq24257_power_supply_set_property
,
760 .property_is_writeable
= bq24257_power_supply_property_is_writeable
,
763 static ssize_t
bq24257_show_ovp_voltage(struct device
*dev
,
764 struct device_attribute
*attr
,
767 struct power_supply
*psy
= dev_get_drvdata(dev
);
768 struct bq24257_device
*bq
= power_supply_get_drvdata(psy
);
770 return scnprintf(buf
, PAGE_SIZE
, "%u\n",
771 bq24257_vovp_map
[bq
->init_data
.vovp
]);
774 static ssize_t
bq24257_show_in_dpm_voltage(struct device
*dev
,
775 struct device_attribute
*attr
,
778 struct power_supply
*psy
= dev_get_drvdata(dev
);
779 struct bq24257_device
*bq
= power_supply_get_drvdata(psy
);
781 return scnprintf(buf
, PAGE_SIZE
, "%u\n",
782 bq24257_vindpm_map
[bq
->init_data
.vindpm
]);
785 static ssize_t
bq24257_sysfs_show_enable(struct device
*dev
,
786 struct device_attribute
*attr
,
789 struct power_supply
*psy
= dev_get_drvdata(dev
);
790 struct bq24257_device
*bq
= power_supply_get_drvdata(psy
);
793 if (strcmp(attr
->attr
.name
, "high_impedance_enable") == 0)
794 ret
= bq24257_field_read(bq
, F_HZ_MODE
);
795 else if (strcmp(attr
->attr
.name
, "sysoff_enable") == 0)
796 ret
= bq24257_field_read(bq
, F_SYSOFF
);
803 return scnprintf(buf
, PAGE_SIZE
, "%d\n", ret
);
806 static ssize_t
bq24257_sysfs_set_enable(struct device
*dev
,
807 struct device_attribute
*attr
,
811 struct power_supply
*psy
= dev_get_drvdata(dev
);
812 struct bq24257_device
*bq
= power_supply_get_drvdata(psy
);
816 if (kstrtol(buf
, 10, &val
) < 0)
819 if (strcmp(attr
->attr
.name
, "high_impedance_enable") == 0)
820 ret
= bq24257_field_write(bq
, F_HZ_MODE
, (bool)val
);
821 else if (strcmp(attr
->attr
.name
, "sysoff_enable") == 0)
822 ret
= bq24257_field_write(bq
, F_SYSOFF
, (bool)val
);
832 static DEVICE_ATTR(ovp_voltage
, S_IRUGO
, bq24257_show_ovp_voltage
, NULL
);
833 static DEVICE_ATTR(in_dpm_voltage
, S_IRUGO
, bq24257_show_in_dpm_voltage
, NULL
);
834 static DEVICE_ATTR(high_impedance_enable
, S_IWUSR
| S_IRUGO
,
835 bq24257_sysfs_show_enable
, bq24257_sysfs_set_enable
);
836 static DEVICE_ATTR(sysoff_enable
, S_IWUSR
| S_IRUGO
,
837 bq24257_sysfs_show_enable
, bq24257_sysfs_set_enable
);
839 static struct attribute
*bq24257_charger_sysfs_attrs
[] = {
840 &dev_attr_ovp_voltage
.attr
,
841 &dev_attr_in_dpm_voltage
.attr
,
842 &dev_attr_high_impedance_enable
.attr
,
843 &dev_attr_sysoff_enable
.attr
,
847 ATTRIBUTE_GROUPS(bq24257_charger_sysfs
);
849 static int bq24257_power_supply_init(struct bq24257_device
*bq
)
851 struct power_supply_config psy_cfg
= { .drv_data
= bq
, };
853 psy_cfg
.attr_grp
= bq24257_charger_sysfs_groups
;
854 psy_cfg
.supplied_to
= bq24257_charger_supplied_to
;
855 psy_cfg
.num_supplicants
= ARRAY_SIZE(bq24257_charger_supplied_to
);
857 bq
->charger
= devm_power_supply_register(bq
->dev
,
858 &bq24257_power_supply_desc
,
861 return PTR_ERR_OR_ZERO(bq
->charger
);
864 static void bq24257_pg_gpio_probe(struct bq24257_device
*bq
)
866 bq
->pg
= devm_gpiod_get_optional(bq
->dev
, BQ24257_PG_GPIO
, GPIOD_IN
);
868 if (PTR_ERR(bq
->pg
) == -EPROBE_DEFER
) {
869 dev_info(bq
->dev
, "probe retry requested for PG pin\n");
871 } else if (IS_ERR(bq
->pg
)) {
872 dev_err(bq
->dev
, "error probing PG pin\n");
878 dev_dbg(bq
->dev
, "probed PG pin = %d\n", desc_to_gpio(bq
->pg
));
881 static int bq24257_fw_probe(struct bq24257_device
*bq
)
886 /* Required properties */
887 ret
= device_property_read_u32(bq
->dev
, "ti,charge-current", &property
);
891 bq
->init_data
.ichg
= bq24257_find_idx(property
, bq24257_ichg_map
,
892 BQ24257_ICHG_MAP_SIZE
);
894 ret
= device_property_read_u32(bq
->dev
, "ti,battery-regulation-voltage",
899 bq
->init_data
.vbat
= bq24257_find_idx(property
, bq24257_vbat_map
,
900 BQ24257_VBAT_MAP_SIZE
);
902 ret
= device_property_read_u32(bq
->dev
, "ti,termination-current",
907 bq
->init_data
.iterm
= bq24257_find_idx(property
, bq24257_iterm_map
,
908 BQ24257_ITERM_MAP_SIZE
);
910 /* Optional properties. If not provided use reasonable default. */
911 ret
= device_property_read_u32(bq
->dev
, "ti,current-limit",
914 bq
->iilimit_autoset_enable
= true;
917 * Explicitly set a default value which will be needed for
918 * devices that don't support the automatic setting of the input
919 * current limit through the charger type detection mechanism.
921 bq
->init_data
.iilimit
= IILIMIT_500
;
923 bq
->init_data
.iilimit
=
924 bq24257_find_idx(property
,
926 BQ24257_IILIMIT_MAP_SIZE
);
928 ret
= device_property_read_u32(bq
->dev
, "ti,ovp-voltage",
931 bq
->init_data
.vovp
= VOVP_6500
;
933 bq
->init_data
.vovp
= bq24257_find_idx(property
,
935 BQ24257_VOVP_MAP_SIZE
);
937 ret
= device_property_read_u32(bq
->dev
, "ti,in-dpm-voltage",
940 bq
->init_data
.vindpm
= VINDPM_4360
;
942 bq
->init_data
.vindpm
=
943 bq24257_find_idx(property
,
945 BQ24257_VINDPM_MAP_SIZE
);
950 static int bq24257_probe(struct i2c_client
*client
,
951 const struct i2c_device_id
*id
)
953 struct i2c_adapter
*adapter
= client
->adapter
;
954 struct device
*dev
= &client
->dev
;
955 const struct acpi_device_id
*acpi_id
;
956 struct bq24257_device
*bq
;
960 if (!i2c_check_functionality(adapter
, I2C_FUNC_SMBUS_BYTE_DATA
)) {
961 dev_err(dev
, "No support for SMBUS_BYTE_DATA\n");
965 bq
= devm_kzalloc(dev
, sizeof(*bq
), GFP_KERNEL
);
972 if (ACPI_HANDLE(dev
)) {
973 acpi_id
= acpi_match_device(dev
->driver
->acpi_match_table
,
976 dev_err(dev
, "Failed to match ACPI device\n");
979 bq
->chip
= (enum bq2425x_chip
)acpi_id
->driver_data
;
981 bq
->chip
= (enum bq2425x_chip
)id
->driver_data
;
984 mutex_init(&bq
->lock
);
986 bq
->rmap
= devm_regmap_init_i2c(client
, &bq24257_regmap_config
);
987 if (IS_ERR(bq
->rmap
)) {
988 dev_err(dev
, "failed to allocate register map\n");
989 return PTR_ERR(bq
->rmap
);
992 for (i
= 0; i
< ARRAY_SIZE(bq24257_reg_fields
); i
++) {
993 const struct reg_field
*reg_fields
= bq24257_reg_fields
;
995 bq
->rmap_fields
[i
] = devm_regmap_field_alloc(dev
, bq
->rmap
,
997 if (IS_ERR(bq
->rmap_fields
[i
])) {
998 dev_err(dev
, "cannot allocate regmap field\n");
999 return PTR_ERR(bq
->rmap_fields
[i
]);
1003 i2c_set_clientdata(client
, bq
);
1005 if (!dev
->platform_data
) {
1006 ret
= bq24257_fw_probe(bq
);
1008 dev_err(dev
, "Cannot read device properties.\n");
1016 * The BQ24250 doesn't support the D+/D- based charger type detection
1017 * used for the automatic setting of the input current limit setting so
1018 * explicitly disable that feature.
1020 if (bq
->chip
== BQ24250
)
1021 bq
->iilimit_autoset_enable
= false;
1023 if (bq
->iilimit_autoset_enable
)
1024 INIT_DELAYED_WORK(&bq
->iilimit_setup_work
,
1025 bq24257_iilimit_setup_work
);
1028 * The BQ24250 doesn't have a dedicated Power Good (PG) pin so let's
1029 * not probe for it and instead use a SW-based approach to determine
1030 * the PG state. We also use a SW-based approach for all other devices
1031 * if the PG pin is either not defined or can't be probed.
1033 if (bq
->chip
!= BQ24250
)
1034 bq24257_pg_gpio_probe(bq
);
1036 if (PTR_ERR(bq
->pg
) == -EPROBE_DEFER
)
1037 return PTR_ERR(bq
->pg
);
1039 dev_info(bq
->dev
, "using SW-based power-good detection\n");
1041 /* reset all registers to defaults */
1042 ret
= bq24257_field_write(bq
, F_RESET
, 1);
1047 * Put the RESET bit back to 0, in cache. For some reason the HW always
1048 * returns 1 on this bit, so this is the only way to avoid resetting the
1049 * chip every time we update another field in this register.
1051 ret
= bq24257_field_write(bq
, F_RESET
, 0);
1055 ret
= bq24257_hw_init(bq
);
1057 dev_err(dev
, "Cannot initialize the chip.\n");
1061 ret
= bq24257_power_supply_init(bq
);
1063 dev_err(dev
, "Failed to register power supply\n");
1067 ret
= devm_request_threaded_irq(dev
, client
->irq
, NULL
,
1068 bq24257_irq_handler_thread
,
1069 IRQF_TRIGGER_FALLING
|
1070 IRQF_TRIGGER_RISING
| IRQF_ONESHOT
,
1071 bq2425x_chip_name
[bq
->chip
], bq
);
1073 dev_err(dev
, "Failed to request IRQ #%d\n", client
->irq
);
1080 static int bq24257_remove(struct i2c_client
*client
)
1082 struct bq24257_device
*bq
= i2c_get_clientdata(client
);
1084 if (bq
->iilimit_autoset_enable
)
1085 cancel_delayed_work_sync(&bq
->iilimit_setup_work
);
1087 bq24257_field_write(bq
, F_RESET
, 1); /* reset to defaults */
1092 #ifdef CONFIG_PM_SLEEP
1093 static int bq24257_suspend(struct device
*dev
)
1095 struct bq24257_device
*bq
= dev_get_drvdata(dev
);
1098 if (bq
->iilimit_autoset_enable
)
1099 cancel_delayed_work_sync(&bq
->iilimit_setup_work
);
1101 /* reset all registers to default (and activate standalone mode) */
1102 ret
= bq24257_field_write(bq
, F_RESET
, 1);
1104 dev_err(bq
->dev
, "Cannot reset chip to standalone mode.\n");
1109 static int bq24257_resume(struct device
*dev
)
1112 struct bq24257_device
*bq
= dev_get_drvdata(dev
);
1114 ret
= regcache_drop_region(bq
->rmap
, BQ24257_REG_1
, BQ24257_REG_7
);
1118 ret
= bq24257_field_write(bq
, F_RESET
, 0);
1122 ret
= bq24257_hw_init(bq
);
1124 dev_err(bq
->dev
, "Cannot init chip after resume.\n");
1128 /* signal userspace, maybe state changed while suspended */
1129 power_supply_changed(bq
->charger
);
1135 static const struct dev_pm_ops bq24257_pm
= {
1136 SET_SYSTEM_SLEEP_PM_OPS(bq24257_suspend
, bq24257_resume
)
1139 static const struct i2c_device_id bq24257_i2c_ids
[] = {
1140 { "bq24250", BQ24250
},
1141 { "bq24251", BQ24251
},
1142 { "bq24257", BQ24257
},
1145 MODULE_DEVICE_TABLE(i2c
, bq24257_i2c_ids
);
1147 static const struct of_device_id bq24257_of_match
[] = {
1148 { .compatible
= "ti,bq24250", },
1149 { .compatible
= "ti,bq24251", },
1150 { .compatible
= "ti,bq24257", },
1153 MODULE_DEVICE_TABLE(of
, bq24257_of_match
);
1155 static const struct acpi_device_id bq24257_acpi_match
[] = {
1156 { "BQ242500", BQ24250
},
1157 { "BQ242510", BQ24251
},
1158 { "BQ242570", BQ24257
},
1161 MODULE_DEVICE_TABLE(acpi
, bq24257_acpi_match
);
1163 static struct i2c_driver bq24257_driver
= {
1165 .name
= "bq24257-charger",
1166 .of_match_table
= of_match_ptr(bq24257_of_match
),
1167 .acpi_match_table
= ACPI_PTR(bq24257_acpi_match
),
1170 .probe
= bq24257_probe
,
1171 .remove
= bq24257_remove
,
1172 .id_table
= bq24257_i2c_ids
,
1174 module_i2c_driver(bq24257_driver
);
1176 MODULE_AUTHOR("Laurentiu Palcu <laurentiu.palcu@intel.com>");
1177 MODULE_DESCRIPTION("bq24257 charger driver");
1178 MODULE_LICENSE("GPL");