2 * Driver for the TI bq24190 battery charger.
4 * Author: Mark A. Greer <mgreer@animalcreek.com>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
11 #include <linux/module.h>
12 #include <linux/interrupt.h>
13 #include <linux/delay.h>
14 #include <linux/of_irq.h>
15 #include <linux/of_device.h>
16 #include <linux/pm_runtime.h>
17 #include <linux/power_supply.h>
18 #include <linux/gpio.h>
19 #include <linux/i2c.h>
21 #include <linux/power/bq24190_charger.h>
24 #define BQ24190_MANUFACTURER "Texas Instruments"
26 #define BQ24190_REG_ISC 0x00 /* Input Source Control */
27 #define BQ24190_REG_ISC_EN_HIZ_MASK BIT(7)
28 #define BQ24190_REG_ISC_EN_HIZ_SHIFT 7
29 #define BQ24190_REG_ISC_VINDPM_MASK (BIT(6) | BIT(5) | BIT(4) | \
31 #define BQ24190_REG_ISC_VINDPM_SHIFT 3
32 #define BQ24190_REG_ISC_IINLIM_MASK (BIT(2) | BIT(1) | BIT(0))
33 #define BQ24190_REG_ISC_IINLIM_SHIFT 0
35 #define BQ24190_REG_POC 0x01 /* Power-On Configuration */
36 #define BQ24190_REG_POC_RESET_MASK BIT(7)
37 #define BQ24190_REG_POC_RESET_SHIFT 7
38 #define BQ24190_REG_POC_WDT_RESET_MASK BIT(6)
39 #define BQ24190_REG_POC_WDT_RESET_SHIFT 6
40 #define BQ24190_REG_POC_CHG_CONFIG_MASK (BIT(5) | BIT(4))
41 #define BQ24190_REG_POC_CHG_CONFIG_SHIFT 4
42 #define BQ24190_REG_POC_SYS_MIN_MASK (BIT(3) | BIT(2) | BIT(1))
43 #define BQ24190_REG_POC_SYS_MIN_SHIFT 1
44 #define BQ24190_REG_POC_BOOST_LIM_MASK BIT(0)
45 #define BQ24190_REG_POC_BOOST_LIM_SHIFT 0
47 #define BQ24190_REG_CCC 0x02 /* Charge Current Control */
48 #define BQ24190_REG_CCC_ICHG_MASK (BIT(7) | BIT(6) | BIT(5) | \
49 BIT(4) | BIT(3) | BIT(2))
50 #define BQ24190_REG_CCC_ICHG_SHIFT 2
51 #define BQ24190_REG_CCC_FORCE_20PCT_MASK BIT(0)
52 #define BQ24190_REG_CCC_FORCE_20PCT_SHIFT 0
54 #define BQ24190_REG_PCTCC 0x03 /* Pre-charge/Termination Current Cntl */
55 #define BQ24190_REG_PCTCC_IPRECHG_MASK (BIT(7) | BIT(6) | BIT(5) | \
57 #define BQ24190_REG_PCTCC_IPRECHG_SHIFT 4
58 #define BQ24190_REG_PCTCC_ITERM_MASK (BIT(3) | BIT(2) | BIT(1) | \
60 #define BQ24190_REG_PCTCC_ITERM_SHIFT 0
62 #define BQ24190_REG_CVC 0x04 /* Charge Voltage Control */
63 #define BQ24190_REG_CVC_VREG_MASK (BIT(7) | BIT(6) | BIT(5) | \
64 BIT(4) | BIT(3) | BIT(2))
65 #define BQ24190_REG_CVC_VREG_SHIFT 2
66 #define BQ24190_REG_CVC_BATLOWV_MASK BIT(1)
67 #define BQ24190_REG_CVC_BATLOWV_SHIFT 1
68 #define BQ24190_REG_CVC_VRECHG_MASK BIT(0)
69 #define BQ24190_REG_CVC_VRECHG_SHIFT 0
71 #define BQ24190_REG_CTTC 0x05 /* Charge Term/Timer Control */
72 #define BQ24190_REG_CTTC_EN_TERM_MASK BIT(7)
73 #define BQ24190_REG_CTTC_EN_TERM_SHIFT 7
74 #define BQ24190_REG_CTTC_TERM_STAT_MASK BIT(6)
75 #define BQ24190_REG_CTTC_TERM_STAT_SHIFT 6
76 #define BQ24190_REG_CTTC_WATCHDOG_MASK (BIT(5) | BIT(4))
77 #define BQ24190_REG_CTTC_WATCHDOG_SHIFT 4
78 #define BQ24190_REG_CTTC_EN_TIMER_MASK BIT(3)
79 #define BQ24190_REG_CTTC_EN_TIMER_SHIFT 3
80 #define BQ24190_REG_CTTC_CHG_TIMER_MASK (BIT(2) | BIT(1))
81 #define BQ24190_REG_CTTC_CHG_TIMER_SHIFT 1
82 #define BQ24190_REG_CTTC_JEITA_ISET_MASK BIT(0)
83 #define BQ24190_REG_CTTC_JEITA_ISET_SHIFT 0
85 #define BQ24190_REG_ICTRC 0x06 /* IR Comp/Thermal Regulation Control */
86 #define BQ24190_REG_ICTRC_BAT_COMP_MASK (BIT(7) | BIT(6) | BIT(5))
87 #define BQ24190_REG_ICTRC_BAT_COMP_SHIFT 5
88 #define BQ24190_REG_ICTRC_VCLAMP_MASK (BIT(4) | BIT(3) | BIT(2))
89 #define BQ24190_REG_ICTRC_VCLAMP_SHIFT 2
90 #define BQ24190_REG_ICTRC_TREG_MASK (BIT(1) | BIT(0))
91 #define BQ24190_REG_ICTRC_TREG_SHIFT 0
93 #define BQ24190_REG_MOC 0x07 /* Misc. Operation Control */
94 #define BQ24190_REG_MOC_DPDM_EN_MASK BIT(7)
95 #define BQ24190_REG_MOC_DPDM_EN_SHIFT 7
96 #define BQ24190_REG_MOC_TMR2X_EN_MASK BIT(6)
97 #define BQ24190_REG_MOC_TMR2X_EN_SHIFT 6
98 #define BQ24190_REG_MOC_BATFET_DISABLE_MASK BIT(5)
99 #define BQ24190_REG_MOC_BATFET_DISABLE_SHIFT 5
100 #define BQ24190_REG_MOC_JEITA_VSET_MASK BIT(4)
101 #define BQ24190_REG_MOC_JEITA_VSET_SHIFT 4
102 #define BQ24190_REG_MOC_INT_MASK_MASK (BIT(1) | BIT(0))
103 #define BQ24190_REG_MOC_INT_MASK_SHIFT 0
105 #define BQ24190_REG_SS 0x08 /* System Status */
106 #define BQ24190_REG_SS_VBUS_STAT_MASK (BIT(7) | BIT(6))
107 #define BQ24190_REG_SS_VBUS_STAT_SHIFT 6
108 #define BQ24190_REG_SS_CHRG_STAT_MASK (BIT(5) | BIT(4))
109 #define BQ24190_REG_SS_CHRG_STAT_SHIFT 4
110 #define BQ24190_REG_SS_DPM_STAT_MASK BIT(3)
111 #define BQ24190_REG_SS_DPM_STAT_SHIFT 3
112 #define BQ24190_REG_SS_PG_STAT_MASK BIT(2)
113 #define BQ24190_REG_SS_PG_STAT_SHIFT 2
114 #define BQ24190_REG_SS_THERM_STAT_MASK BIT(1)
115 #define BQ24190_REG_SS_THERM_STAT_SHIFT 1
116 #define BQ24190_REG_SS_VSYS_STAT_MASK BIT(0)
117 #define BQ24190_REG_SS_VSYS_STAT_SHIFT 0
119 #define BQ24190_REG_F 0x09 /* Fault */
120 #define BQ24190_REG_F_WATCHDOG_FAULT_MASK BIT(7)
121 #define BQ24190_REG_F_WATCHDOG_FAULT_SHIFT 7
122 #define BQ24190_REG_F_BOOST_FAULT_MASK BIT(6)
123 #define BQ24190_REG_F_BOOST_FAULT_SHIFT 6
124 #define BQ24190_REG_F_CHRG_FAULT_MASK (BIT(5) | BIT(4))
125 #define BQ24190_REG_F_CHRG_FAULT_SHIFT 4
126 #define BQ24190_REG_F_BAT_FAULT_MASK BIT(3)
127 #define BQ24190_REG_F_BAT_FAULT_SHIFT 3
128 #define BQ24190_REG_F_NTC_FAULT_MASK (BIT(2) | BIT(1) | BIT(0))
129 #define BQ24190_REG_F_NTC_FAULT_SHIFT 0
131 #define BQ24190_REG_VPRS 0x0A /* Vendor/Part/Revision Status */
132 #define BQ24190_REG_VPRS_PN_MASK (BIT(5) | BIT(4) | BIT(3))
133 #define BQ24190_REG_VPRS_PN_SHIFT 3
134 #define BQ24190_REG_VPRS_PN_24190 0x4
135 #define BQ24190_REG_VPRS_PN_24192 0x5 /* Also 24193 */
136 #define BQ24190_REG_VPRS_PN_24192I 0x3
137 #define BQ24190_REG_VPRS_TS_PROFILE_MASK BIT(2)
138 #define BQ24190_REG_VPRS_TS_PROFILE_SHIFT 2
139 #define BQ24190_REG_VPRS_DEV_REG_MASK (BIT(1) | BIT(0))
140 #define BQ24190_REG_VPRS_DEV_REG_SHIFT 0
143 * The FAULT register is latched by the bq24190 (except for NTC_FAULT)
144 * so the first read after a fault returns the latched value and subsequent
145 * reads return the current value. In order to return the fault status
146 * to the user, have the interrupt handler save the reg's value and retrieve
147 * it in the appropriate health/status routine. Each routine has its own
148 * flag indicating whether it should use the value stored by the last run
149 * of the interrupt handler or do an actual reg read. That way each routine
150 * can report back whatever fault may have occured.
152 struct bq24190_dev_info {
153 struct i2c_client *client;
155 struct power_supply *charger;
156 struct power_supply *battery;
157 char model_name[I2C_NAME_SIZE];
158 kernel_ulong_t model;
159 unsigned int gpio_int;
161 struct mutex f_reg_lock;
162 bool charger_health_valid;
163 bool battery_health_valid;
164 bool battery_status_valid;
171 * The tables below provide a 2-way mapping for the value that goes in
172 * the register field and the real-world value that it represents.
173 * The index of the array is the value that goes in the register; the
174 * number at that index in the array is the real-world value that it
177 /* REG02[7:2] (ICHG) in uAh */
178 static const int bq24190_ccc_ichg_values[] = {
179 512000, 576000, 640000, 704000, 768000, 832000, 896000, 960000,
180 1024000, 1088000, 1152000, 1216000, 1280000, 1344000, 1408000, 1472000,
181 1536000, 1600000, 1664000, 1728000, 1792000, 1856000, 1920000, 1984000,
182 2048000, 2112000, 2176000, 2240000, 2304000, 2368000, 2432000, 2496000,
183 2560000, 2624000, 2688000, 2752000, 2816000, 2880000, 2944000, 3008000,
184 3072000, 3136000, 3200000, 3264000, 3328000, 3392000, 3456000, 3520000,
185 3584000, 3648000, 3712000, 3776000, 3840000, 3904000, 3968000, 4032000,
186 4096000, 4160000, 4224000, 4288000, 4352000, 4416000, 4480000, 4544000
189 /* REG04[7:2] (VREG) in uV */
190 static const int bq24190_cvc_vreg_values[] = {
191 3504000, 3520000, 3536000, 3552000, 3568000, 3584000, 3600000, 3616000,
192 3632000, 3648000, 3664000, 3680000, 3696000, 3712000, 3728000, 3744000,
193 3760000, 3776000, 3792000, 3808000, 3824000, 3840000, 3856000, 3872000,
194 3888000, 3904000, 3920000, 3936000, 3952000, 3968000, 3984000, 4000000,
195 4016000, 4032000, 4048000, 4064000, 4080000, 4096000, 4112000, 4128000,
196 4144000, 4160000, 4176000, 4192000, 4208000, 4224000, 4240000, 4256000,
197 4272000, 4288000, 4304000, 4320000, 4336000, 4352000, 4368000, 4384000,
201 /* REG06[1:0] (TREG) in tenths of degrees Celsius */
202 static const int bq24190_ictrc_treg_values[] = {
207 * Return the index in 'tbl' of greatest value that is less than or equal to
208 * 'val'. The index range returned is 0 to 'tbl_size' - 1. Assumes that
209 * the values in 'tbl' are sorted from smallest to largest and 'tbl_size'
212 static u8 bq24190_find_idx(const int tbl[], int tbl_size, int v)
216 for (i = 1; i < tbl_size; i++)
223 /* Basic driver I/O routines */
225 static int bq24190_read(struct bq24190_dev_info *bdi, u8 reg, u8 *data)
229 ret = i2c_smbus_read_byte_data(bdi->client, reg);
237 static int bq24190_write(struct bq24190_dev_info *bdi, u8 reg, u8 data)
239 return i2c_smbus_write_byte_data(bdi->client, reg, data);
242 static int bq24190_read_mask(struct bq24190_dev_info *bdi, u8 reg,
243 u8 mask, u8 shift, u8 *data)
248 ret = bq24190_read(bdi, reg, &v);
259 static int bq24190_write_mask(struct bq24190_dev_info *bdi, u8 reg,
260 u8 mask, u8 shift, u8 data)
265 ret = bq24190_read(bdi, reg, &v);
270 v |= ((data << shift) & mask);
272 return bq24190_write(bdi, reg, v);
275 static int bq24190_get_field_val(struct bq24190_dev_info *bdi,
276 u8 reg, u8 mask, u8 shift,
277 const int tbl[], int tbl_size,
283 ret = bq24190_read_mask(bdi, reg, mask, shift, &v);
287 v = (v >= tbl_size) ? (tbl_size - 1) : v;
293 static int bq24190_set_field_val(struct bq24190_dev_info *bdi,
294 u8 reg, u8 mask, u8 shift,
295 const int tbl[], int tbl_size,
300 idx = bq24190_find_idx(tbl, tbl_size, val);
302 return bq24190_write_mask(bdi, reg, mask, shift, idx);
307 * There are a numerous options that are configurable on the bq24190
308 * that go well beyond what the power_supply properties provide access to.
309 * Provide sysfs access to them so they can be examined and possibly modified
310 * on the fly. They will be provided for the charger power_supply object only
311 * and will be prefixed by 'f_' to make them easier to recognize.
314 #define BQ24190_SYSFS_FIELD(_name, r, f, m, store) \
316 .attr = __ATTR(f_##_name, m, bq24190_sysfs_show, store), \
317 .reg = BQ24190_REG_##r, \
318 .mask = BQ24190_REG_##r##_##f##_MASK, \
319 .shift = BQ24190_REG_##r##_##f##_SHIFT, \
322 #define BQ24190_SYSFS_FIELD_RW(_name, r, f) \
323 BQ24190_SYSFS_FIELD(_name, r, f, S_IWUSR | S_IRUGO, \
326 #define BQ24190_SYSFS_FIELD_RO(_name, r, f) \
327 BQ24190_SYSFS_FIELD(_name, r, f, S_IRUGO, NULL)
329 static ssize_t bq24190_sysfs_show(struct device *dev,
330 struct device_attribute *attr, char *buf);
331 static ssize_t bq24190_sysfs_store(struct device *dev,
332 struct device_attribute *attr, const char *buf, size_t count);
334 struct bq24190_sysfs_field_info {
335 struct device_attribute attr;
341 /* On i386 ptrace-abi.h defines SS that breaks the macro calls below. */
344 static struct bq24190_sysfs_field_info bq24190_sysfs_field_tbl[] = {
345 /* sysfs name reg field in reg */
346 BQ24190_SYSFS_FIELD_RW(en_hiz, ISC, EN_HIZ),
347 BQ24190_SYSFS_FIELD_RW(vindpm, ISC, VINDPM),
348 BQ24190_SYSFS_FIELD_RW(iinlim, ISC, IINLIM),
349 BQ24190_SYSFS_FIELD_RW(chg_config, POC, CHG_CONFIG),
350 BQ24190_SYSFS_FIELD_RW(sys_min, POC, SYS_MIN),
351 BQ24190_SYSFS_FIELD_RW(boost_lim, POC, BOOST_LIM),
352 BQ24190_SYSFS_FIELD_RW(ichg, CCC, ICHG),
353 BQ24190_SYSFS_FIELD_RW(force_20_pct, CCC, FORCE_20PCT),
354 BQ24190_SYSFS_FIELD_RW(iprechg, PCTCC, IPRECHG),
355 BQ24190_SYSFS_FIELD_RW(iterm, PCTCC, ITERM),
356 BQ24190_SYSFS_FIELD_RW(vreg, CVC, VREG),
357 BQ24190_SYSFS_FIELD_RW(batlowv, CVC, BATLOWV),
358 BQ24190_SYSFS_FIELD_RW(vrechg, CVC, VRECHG),
359 BQ24190_SYSFS_FIELD_RW(en_term, CTTC, EN_TERM),
360 BQ24190_SYSFS_FIELD_RW(term_stat, CTTC, TERM_STAT),
361 BQ24190_SYSFS_FIELD_RO(watchdog, CTTC, WATCHDOG),
362 BQ24190_SYSFS_FIELD_RW(en_timer, CTTC, EN_TIMER),
363 BQ24190_SYSFS_FIELD_RW(chg_timer, CTTC, CHG_TIMER),
364 BQ24190_SYSFS_FIELD_RW(jeta_iset, CTTC, JEITA_ISET),
365 BQ24190_SYSFS_FIELD_RW(bat_comp, ICTRC, BAT_COMP),
366 BQ24190_SYSFS_FIELD_RW(vclamp, ICTRC, VCLAMP),
367 BQ24190_SYSFS_FIELD_RW(treg, ICTRC, TREG),
368 BQ24190_SYSFS_FIELD_RW(dpdm_en, MOC, DPDM_EN),
369 BQ24190_SYSFS_FIELD_RW(tmr2x_en, MOC, TMR2X_EN),
370 BQ24190_SYSFS_FIELD_RW(batfet_disable, MOC, BATFET_DISABLE),
371 BQ24190_SYSFS_FIELD_RW(jeita_vset, MOC, JEITA_VSET),
372 BQ24190_SYSFS_FIELD_RO(int_mask, MOC, INT_MASK),
373 BQ24190_SYSFS_FIELD_RO(vbus_stat, SS, VBUS_STAT),
374 BQ24190_SYSFS_FIELD_RO(chrg_stat, SS, CHRG_STAT),
375 BQ24190_SYSFS_FIELD_RO(dpm_stat, SS, DPM_STAT),
376 BQ24190_SYSFS_FIELD_RO(pg_stat, SS, PG_STAT),
377 BQ24190_SYSFS_FIELD_RO(therm_stat, SS, THERM_STAT),
378 BQ24190_SYSFS_FIELD_RO(vsys_stat, SS, VSYS_STAT),
379 BQ24190_SYSFS_FIELD_RO(watchdog_fault, F, WATCHDOG_FAULT),
380 BQ24190_SYSFS_FIELD_RO(boost_fault, F, BOOST_FAULT),
381 BQ24190_SYSFS_FIELD_RO(chrg_fault, F, CHRG_FAULT),
382 BQ24190_SYSFS_FIELD_RO(bat_fault, F, BAT_FAULT),
383 BQ24190_SYSFS_FIELD_RO(ntc_fault, F, NTC_FAULT),
384 BQ24190_SYSFS_FIELD_RO(pn, VPRS, PN),
385 BQ24190_SYSFS_FIELD_RO(ts_profile, VPRS, TS_PROFILE),
386 BQ24190_SYSFS_FIELD_RO(dev_reg, VPRS, DEV_REG),
389 static struct attribute *
390 bq24190_sysfs_attrs[ARRAY_SIZE(bq24190_sysfs_field_tbl) + 1];
392 static const struct attribute_group bq24190_sysfs_attr_group = {
393 .attrs = bq24190_sysfs_attrs,
396 static void bq24190_sysfs_init_attrs(void)
398 int i, limit = ARRAY_SIZE(bq24190_sysfs_field_tbl);
400 for (i = 0; i < limit; i++)
401 bq24190_sysfs_attrs[i] = &bq24190_sysfs_field_tbl[i].attr.attr;
403 bq24190_sysfs_attrs[limit] = NULL; /* Has additional entry for this */
406 static struct bq24190_sysfs_field_info *bq24190_sysfs_field_lookup(
409 int i, limit = ARRAY_SIZE(bq24190_sysfs_field_tbl);
411 for (i = 0; i < limit; i++)
412 if (!strcmp(name, bq24190_sysfs_field_tbl[i].attr.attr.name))
418 return &bq24190_sysfs_field_tbl[i];
421 static ssize_t bq24190_sysfs_show(struct device *dev,
422 struct device_attribute *attr, char *buf)
424 struct power_supply *psy = dev_get_drvdata(dev);
425 struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
426 struct bq24190_sysfs_field_info *info;
430 info = bq24190_sysfs_field_lookup(attr->attr.name);
434 ret = bq24190_read_mask(bdi, info->reg, info->mask, info->shift, &v);
438 return scnprintf(buf, PAGE_SIZE, "%hhx\n", v);
441 static ssize_t bq24190_sysfs_store(struct device *dev,
442 struct device_attribute *attr, const char *buf, size_t count)
444 struct power_supply *psy = dev_get_drvdata(dev);
445 struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
446 struct bq24190_sysfs_field_info *info;
450 info = bq24190_sysfs_field_lookup(attr->attr.name);
454 ret = kstrtou8(buf, 0, &v);
458 ret = bq24190_write_mask(bdi, info->reg, info->mask, info->shift, v);
465 static int bq24190_sysfs_create_group(struct bq24190_dev_info *bdi)
467 bq24190_sysfs_init_attrs();
469 return sysfs_create_group(&bdi->charger->dev.kobj,
470 &bq24190_sysfs_attr_group);
473 static void bq24190_sysfs_remove_group(struct bq24190_dev_info *bdi)
475 sysfs_remove_group(&bdi->charger->dev.kobj, &bq24190_sysfs_attr_group);
478 static int bq24190_sysfs_create_group(struct bq24190_dev_info *bdi)
483 static inline void bq24190_sysfs_remove_group(struct bq24190_dev_info *bdi) {}
487 * According to the "Host Mode and default Mode" section of the
488 * manual, a write to any register causes the bq24190 to switch
489 * from default mode to host mode. It will switch back to default
490 * mode after a WDT timeout unless the WDT is turned off as well.
491 * So, by simply turning off the WDT, we accomplish both with the
494 static int bq24190_set_mode_host(struct bq24190_dev_info *bdi)
499 ret = bq24190_read(bdi, BQ24190_REG_CTTC, &v);
503 bdi->watchdog = ((v & BQ24190_REG_CTTC_WATCHDOG_MASK) >>
504 BQ24190_REG_CTTC_WATCHDOG_SHIFT);
505 v &= ~BQ24190_REG_CTTC_WATCHDOG_MASK;
507 return bq24190_write(bdi, BQ24190_REG_CTTC, v);
510 static int bq24190_register_reset(struct bq24190_dev_info *bdi)
512 int ret, limit = 100;
515 /* Reset the registers */
516 ret = bq24190_write_mask(bdi, BQ24190_REG_POC,
517 BQ24190_REG_POC_RESET_MASK,
518 BQ24190_REG_POC_RESET_SHIFT,
523 /* Reset bit will be cleared by hardware so poll until it is */
525 ret = bq24190_read_mask(bdi, BQ24190_REG_POC,
526 BQ24190_REG_POC_RESET_MASK,
527 BQ24190_REG_POC_RESET_SHIFT,
544 /* Charger power supply property routines */
546 static int bq24190_charger_get_charge_type(struct bq24190_dev_info *bdi,
547 union power_supply_propval *val)
552 ret = bq24190_read_mask(bdi, BQ24190_REG_POC,
553 BQ24190_REG_POC_CHG_CONFIG_MASK,
554 BQ24190_REG_POC_CHG_CONFIG_SHIFT,
559 /* If POC[CHG_CONFIG] (REG01[5:4]) == 0, charge is disabled */
561 type = POWER_SUPPLY_CHARGE_TYPE_NONE;
563 ret = bq24190_read_mask(bdi, BQ24190_REG_CCC,
564 BQ24190_REG_CCC_FORCE_20PCT_MASK,
565 BQ24190_REG_CCC_FORCE_20PCT_SHIFT,
570 type = (v) ? POWER_SUPPLY_CHARGE_TYPE_TRICKLE :
571 POWER_SUPPLY_CHARGE_TYPE_FAST;
579 static int bq24190_charger_set_charge_type(struct bq24190_dev_info *bdi,
580 const union power_supply_propval *val)
582 u8 chg_config, force_20pct, en_term;
586 * According to the "Termination when REG02[0] = 1" section of
587 * the bq24190 manual, the trickle charge could be less than the
588 * termination current so it recommends turning off the termination
591 * Note: AFAICT from the datasheet, the user will have to manually
592 * turn off the charging when in 20% mode. If its not turned off,
593 * there could be battery damage. So, use this mode at your own risk.
595 switch (val->intval) {
596 case POWER_SUPPLY_CHARGE_TYPE_NONE:
599 case POWER_SUPPLY_CHARGE_TYPE_TRICKLE:
604 case POWER_SUPPLY_CHARGE_TYPE_FAST:
613 if (chg_config) { /* Enabling the charger */
614 ret = bq24190_write_mask(bdi, BQ24190_REG_CCC,
615 BQ24190_REG_CCC_FORCE_20PCT_MASK,
616 BQ24190_REG_CCC_FORCE_20PCT_SHIFT,
621 ret = bq24190_write_mask(bdi, BQ24190_REG_CTTC,
622 BQ24190_REG_CTTC_EN_TERM_MASK,
623 BQ24190_REG_CTTC_EN_TERM_SHIFT,
629 return bq24190_write_mask(bdi, BQ24190_REG_POC,
630 BQ24190_REG_POC_CHG_CONFIG_MASK,
631 BQ24190_REG_POC_CHG_CONFIG_SHIFT, chg_config);
634 static int bq24190_charger_get_health(struct bq24190_dev_info *bdi,
635 union power_supply_propval *val)
640 mutex_lock(&bdi->f_reg_lock);
642 if (bdi->charger_health_valid) {
644 bdi->charger_health_valid = false;
645 mutex_unlock(&bdi->f_reg_lock);
647 mutex_unlock(&bdi->f_reg_lock);
649 ret = bq24190_read(bdi, BQ24190_REG_F, &v);
654 if (v & BQ24190_REG_F_BOOST_FAULT_MASK) {
656 * This could be over-current or over-voltage but there's
657 * no way to tell which. Return 'OVERVOLTAGE' since there
658 * isn't an 'OVERCURRENT' value defined that we can return
659 * even if it was over-current.
661 health = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
663 v &= BQ24190_REG_F_CHRG_FAULT_MASK;
664 v >>= BQ24190_REG_F_CHRG_FAULT_SHIFT;
667 case 0x0: /* Normal */
668 health = POWER_SUPPLY_HEALTH_GOOD;
670 case 0x1: /* Input Fault (VBUS OVP or VBAT<VBUS<3.8V) */
672 * This could be over-voltage or under-voltage
673 * and there's no way to tell which. Instead
674 * of looking foolish and returning 'OVERVOLTAGE'
675 * when its really under-voltage, just return
678 health = POWER_SUPPLY_HEALTH_UNSPEC_FAILURE;
680 case 0x2: /* Thermal Shutdown */
681 health = POWER_SUPPLY_HEALTH_OVERHEAT;
683 case 0x3: /* Charge Safety Timer Expiration */
684 health = POWER_SUPPLY_HEALTH_SAFETY_TIMER_EXPIRE;
687 health = POWER_SUPPLY_HEALTH_UNKNOWN;
691 val->intval = health;
696 static int bq24190_charger_get_online(struct bq24190_dev_info *bdi,
697 union power_supply_propval *val)
702 ret = bq24190_read_mask(bdi, BQ24190_REG_SS,
703 BQ24190_REG_SS_PG_STAT_MASK,
704 BQ24190_REG_SS_PG_STAT_SHIFT, &v);
712 static int bq24190_charger_get_current(struct bq24190_dev_info *bdi,
713 union power_supply_propval *val)
718 ret = bq24190_get_field_val(bdi, BQ24190_REG_CCC,
719 BQ24190_REG_CCC_ICHG_MASK, BQ24190_REG_CCC_ICHG_SHIFT,
720 bq24190_ccc_ichg_values,
721 ARRAY_SIZE(bq24190_ccc_ichg_values), &curr);
725 ret = bq24190_read_mask(bdi, BQ24190_REG_CCC,
726 BQ24190_REG_CCC_FORCE_20PCT_MASK,
727 BQ24190_REG_CCC_FORCE_20PCT_SHIFT, &v);
731 /* If FORCE_20PCT is enabled, then current is 20% of ICHG value */
739 static int bq24190_charger_get_current_max(struct bq24190_dev_info *bdi,
740 union power_supply_propval *val)
742 int idx = ARRAY_SIZE(bq24190_ccc_ichg_values) - 1;
744 val->intval = bq24190_ccc_ichg_values[idx];
748 static int bq24190_charger_set_current(struct bq24190_dev_info *bdi,
749 const union power_supply_propval *val)
752 int ret, curr = val->intval;
754 ret = bq24190_read_mask(bdi, BQ24190_REG_CCC,
755 BQ24190_REG_CCC_FORCE_20PCT_MASK,
756 BQ24190_REG_CCC_FORCE_20PCT_SHIFT, &v);
760 /* If FORCE_20PCT is enabled, have to multiply value passed in by 5 */
764 return bq24190_set_field_val(bdi, BQ24190_REG_CCC,
765 BQ24190_REG_CCC_ICHG_MASK, BQ24190_REG_CCC_ICHG_SHIFT,
766 bq24190_ccc_ichg_values,
767 ARRAY_SIZE(bq24190_ccc_ichg_values), curr);
770 static int bq24190_charger_get_voltage(struct bq24190_dev_info *bdi,
771 union power_supply_propval *val)
775 ret = bq24190_get_field_val(bdi, BQ24190_REG_CVC,
776 BQ24190_REG_CVC_VREG_MASK, BQ24190_REG_CVC_VREG_SHIFT,
777 bq24190_cvc_vreg_values,
778 ARRAY_SIZE(bq24190_cvc_vreg_values), &voltage);
782 val->intval = voltage;
786 static int bq24190_charger_get_voltage_max(struct bq24190_dev_info *bdi,
787 union power_supply_propval *val)
789 int idx = ARRAY_SIZE(bq24190_cvc_vreg_values) - 1;
791 val->intval = bq24190_cvc_vreg_values[idx];
795 static int bq24190_charger_set_voltage(struct bq24190_dev_info *bdi,
796 const union power_supply_propval *val)
798 return bq24190_set_field_val(bdi, BQ24190_REG_CVC,
799 BQ24190_REG_CVC_VREG_MASK, BQ24190_REG_CVC_VREG_SHIFT,
800 bq24190_cvc_vreg_values,
801 ARRAY_SIZE(bq24190_cvc_vreg_values), val->intval);
804 static int bq24190_charger_get_property(struct power_supply *psy,
805 enum power_supply_property psp, union power_supply_propval *val)
807 struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
810 dev_dbg(bdi->dev, "prop: %d\n", psp);
812 pm_runtime_get_sync(bdi->dev);
815 case POWER_SUPPLY_PROP_CHARGE_TYPE:
816 ret = bq24190_charger_get_charge_type(bdi, val);
818 case POWER_SUPPLY_PROP_HEALTH:
819 ret = bq24190_charger_get_health(bdi, val);
821 case POWER_SUPPLY_PROP_ONLINE:
822 ret = bq24190_charger_get_online(bdi, val);
824 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
825 ret = bq24190_charger_get_current(bdi, val);
827 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX:
828 ret = bq24190_charger_get_current_max(bdi, val);
830 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
831 ret = bq24190_charger_get_voltage(bdi, val);
833 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX:
834 ret = bq24190_charger_get_voltage_max(bdi, val);
836 case POWER_SUPPLY_PROP_SCOPE:
837 val->intval = POWER_SUPPLY_SCOPE_SYSTEM;
840 case POWER_SUPPLY_PROP_MODEL_NAME:
841 val->strval = bdi->model_name;
844 case POWER_SUPPLY_PROP_MANUFACTURER:
845 val->strval = BQ24190_MANUFACTURER;
852 pm_runtime_put_sync(bdi->dev);
856 static int bq24190_charger_set_property(struct power_supply *psy,
857 enum power_supply_property psp,
858 const union power_supply_propval *val)
860 struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
863 dev_dbg(bdi->dev, "prop: %d\n", psp);
865 pm_runtime_get_sync(bdi->dev);
868 case POWER_SUPPLY_PROP_CHARGE_TYPE:
869 ret = bq24190_charger_set_charge_type(bdi, val);
871 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
872 ret = bq24190_charger_set_current(bdi, val);
874 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
875 ret = bq24190_charger_set_voltage(bdi, val);
881 pm_runtime_put_sync(bdi->dev);
885 static int bq24190_charger_property_is_writeable(struct power_supply *psy,
886 enum power_supply_property psp)
891 case POWER_SUPPLY_PROP_CHARGE_TYPE:
892 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
893 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
903 static enum power_supply_property bq24190_charger_properties[] = {
904 POWER_SUPPLY_PROP_CHARGE_TYPE,
905 POWER_SUPPLY_PROP_HEALTH,
906 POWER_SUPPLY_PROP_ONLINE,
907 POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT,
908 POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX,
909 POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE,
910 POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX,
911 POWER_SUPPLY_PROP_SCOPE,
912 POWER_SUPPLY_PROP_MODEL_NAME,
913 POWER_SUPPLY_PROP_MANUFACTURER,
916 static char *bq24190_charger_supplied_to[] = {
920 static const struct power_supply_desc bq24190_charger_desc = {
921 .name = "bq24190-charger",
922 .type = POWER_SUPPLY_TYPE_USB,
923 .properties = bq24190_charger_properties,
924 .num_properties = ARRAY_SIZE(bq24190_charger_properties),
925 .get_property = bq24190_charger_get_property,
926 .set_property = bq24190_charger_set_property,
927 .property_is_writeable = bq24190_charger_property_is_writeable,
930 /* Battery power supply property routines */
932 static int bq24190_battery_get_status(struct bq24190_dev_info *bdi,
933 union power_supply_propval *val)
935 u8 ss_reg, chrg_fault;
938 mutex_lock(&bdi->f_reg_lock);
940 if (bdi->battery_status_valid) {
941 chrg_fault = bdi->f_reg;
942 bdi->battery_status_valid = false;
943 mutex_unlock(&bdi->f_reg_lock);
945 mutex_unlock(&bdi->f_reg_lock);
947 ret = bq24190_read(bdi, BQ24190_REG_F, &chrg_fault);
952 chrg_fault &= BQ24190_REG_F_CHRG_FAULT_MASK;
953 chrg_fault >>= BQ24190_REG_F_CHRG_FAULT_SHIFT;
955 ret = bq24190_read(bdi, BQ24190_REG_SS, &ss_reg);
960 * The battery must be discharging when any of these are true:
961 * - there is no good power source;
962 * - there is a charge fault.
963 * Could also be discharging when in "supplement mode" but
964 * there is no way to tell when its in that mode.
966 if (!(ss_reg & BQ24190_REG_SS_PG_STAT_MASK) || chrg_fault) {
967 status = POWER_SUPPLY_STATUS_DISCHARGING;
969 ss_reg &= BQ24190_REG_SS_CHRG_STAT_MASK;
970 ss_reg >>= BQ24190_REG_SS_CHRG_STAT_SHIFT;
973 case 0x0: /* Not Charging */
974 status = POWER_SUPPLY_STATUS_NOT_CHARGING;
976 case 0x1: /* Pre-charge */
977 case 0x2: /* Fast Charging */
978 status = POWER_SUPPLY_STATUS_CHARGING;
980 case 0x3: /* Charge Termination Done */
981 status = POWER_SUPPLY_STATUS_FULL;
989 val->intval = status;
994 static int bq24190_battery_get_health(struct bq24190_dev_info *bdi,
995 union power_supply_propval *val)
1000 mutex_lock(&bdi->f_reg_lock);
1002 if (bdi->battery_health_valid) {
1004 bdi->battery_health_valid = false;
1005 mutex_unlock(&bdi->f_reg_lock);
1007 mutex_unlock(&bdi->f_reg_lock);
1009 ret = bq24190_read(bdi, BQ24190_REG_F, &v);
1014 if (v & BQ24190_REG_F_BAT_FAULT_MASK) {
1015 health = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
1017 v &= BQ24190_REG_F_NTC_FAULT_MASK;
1018 v >>= BQ24190_REG_F_NTC_FAULT_SHIFT;
1021 case 0x0: /* Normal */
1022 health = POWER_SUPPLY_HEALTH_GOOD;
1024 case 0x1: /* TS1 Cold */
1025 case 0x3: /* TS2 Cold */
1026 case 0x5: /* Both Cold */
1027 health = POWER_SUPPLY_HEALTH_COLD;
1029 case 0x2: /* TS1 Hot */
1030 case 0x4: /* TS2 Hot */
1031 case 0x6: /* Both Hot */
1032 health = POWER_SUPPLY_HEALTH_OVERHEAT;
1035 health = POWER_SUPPLY_HEALTH_UNKNOWN;
1039 val->intval = health;
1043 static int bq24190_battery_get_online(struct bq24190_dev_info *bdi,
1044 union power_supply_propval *val)
1049 ret = bq24190_read_mask(bdi, BQ24190_REG_MOC,
1050 BQ24190_REG_MOC_BATFET_DISABLE_MASK,
1051 BQ24190_REG_MOC_BATFET_DISABLE_SHIFT, &batfet_disable);
1055 val->intval = !batfet_disable;
1059 static int bq24190_battery_set_online(struct bq24190_dev_info *bdi,
1060 const union power_supply_propval *val)
1062 return bq24190_write_mask(bdi, BQ24190_REG_MOC,
1063 BQ24190_REG_MOC_BATFET_DISABLE_MASK,
1064 BQ24190_REG_MOC_BATFET_DISABLE_SHIFT, !val->intval);
1067 static int bq24190_battery_get_temp_alert_max(struct bq24190_dev_info *bdi,
1068 union power_supply_propval *val)
1072 ret = bq24190_get_field_val(bdi, BQ24190_REG_ICTRC,
1073 BQ24190_REG_ICTRC_TREG_MASK,
1074 BQ24190_REG_ICTRC_TREG_SHIFT,
1075 bq24190_ictrc_treg_values,
1076 ARRAY_SIZE(bq24190_ictrc_treg_values), &temp);
1084 static int bq24190_battery_set_temp_alert_max(struct bq24190_dev_info *bdi,
1085 const union power_supply_propval *val)
1087 return bq24190_set_field_val(bdi, BQ24190_REG_ICTRC,
1088 BQ24190_REG_ICTRC_TREG_MASK,
1089 BQ24190_REG_ICTRC_TREG_SHIFT,
1090 bq24190_ictrc_treg_values,
1091 ARRAY_SIZE(bq24190_ictrc_treg_values), val->intval);
1094 static int bq24190_battery_get_property(struct power_supply *psy,
1095 enum power_supply_property psp, union power_supply_propval *val)
1097 struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
1100 dev_dbg(bdi->dev, "prop: %d\n", psp);
1102 pm_runtime_get_sync(bdi->dev);
1105 case POWER_SUPPLY_PROP_STATUS:
1106 ret = bq24190_battery_get_status(bdi, val);
1108 case POWER_SUPPLY_PROP_HEALTH:
1109 ret = bq24190_battery_get_health(bdi, val);
1111 case POWER_SUPPLY_PROP_ONLINE:
1112 ret = bq24190_battery_get_online(bdi, val);
1114 case POWER_SUPPLY_PROP_TECHNOLOGY:
1115 /* Could be Li-on or Li-polymer but no way to tell which */
1116 val->intval = POWER_SUPPLY_TECHNOLOGY_UNKNOWN;
1119 case POWER_SUPPLY_PROP_TEMP_ALERT_MAX:
1120 ret = bq24190_battery_get_temp_alert_max(bdi, val);
1122 case POWER_SUPPLY_PROP_SCOPE:
1123 val->intval = POWER_SUPPLY_SCOPE_SYSTEM;
1130 pm_runtime_put_sync(bdi->dev);
1134 static int bq24190_battery_set_property(struct power_supply *psy,
1135 enum power_supply_property psp,
1136 const union power_supply_propval *val)
1138 struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
1141 dev_dbg(bdi->dev, "prop: %d\n", psp);
1143 pm_runtime_get_sync(bdi->dev);
1146 case POWER_SUPPLY_PROP_ONLINE:
1147 ret = bq24190_battery_set_online(bdi, val);
1149 case POWER_SUPPLY_PROP_TEMP_ALERT_MAX:
1150 ret = bq24190_battery_set_temp_alert_max(bdi, val);
1156 pm_runtime_put_sync(bdi->dev);
1160 static int bq24190_battery_property_is_writeable(struct power_supply *psy,
1161 enum power_supply_property psp)
1166 case POWER_SUPPLY_PROP_ONLINE:
1167 case POWER_SUPPLY_PROP_TEMP_ALERT_MAX:
1177 static enum power_supply_property bq24190_battery_properties[] = {
1178 POWER_SUPPLY_PROP_STATUS,
1179 POWER_SUPPLY_PROP_HEALTH,
1180 POWER_SUPPLY_PROP_ONLINE,
1181 POWER_SUPPLY_PROP_TECHNOLOGY,
1182 POWER_SUPPLY_PROP_TEMP_ALERT_MAX,
1183 POWER_SUPPLY_PROP_SCOPE,
1186 static const struct power_supply_desc bq24190_battery_desc = {
1187 .name = "bq24190-battery",
1188 .type = POWER_SUPPLY_TYPE_BATTERY,
1189 .properties = bq24190_battery_properties,
1190 .num_properties = ARRAY_SIZE(bq24190_battery_properties),
1191 .get_property = bq24190_battery_get_property,
1192 .set_property = bq24190_battery_set_property,
1193 .property_is_writeable = bq24190_battery_property_is_writeable,
1196 static irqreturn_t bq24190_irq_handler_thread(int irq, void *data)
1198 struct bq24190_dev_info *bdi = data;
1199 const u8 battery_mask_ss = BQ24190_REG_SS_CHRG_STAT_MASK;
1200 const u8 battery_mask_f = BQ24190_REG_F_BAT_FAULT_MASK
1201 | BQ24190_REG_F_NTC_FAULT_MASK;
1202 bool alert_charger = false, alert_battery = false;
1203 u8 ss_reg = 0, f_reg = 0;
1206 pm_runtime_get_sync(bdi->dev);
1208 ret = bq24190_read(bdi, BQ24190_REG_SS, &ss_reg);
1210 dev_err(bdi->dev, "Can't read SS reg: %d\n", ret);
1214 if (ss_reg != bdi->ss_reg) {
1216 * The device is in host mode so when PG_STAT goes from 1->0
1217 * (i.e., power removed) HIZ needs to be disabled.
1219 if ((bdi->ss_reg & BQ24190_REG_SS_PG_STAT_MASK) &&
1220 !(ss_reg & BQ24190_REG_SS_PG_STAT_MASK)) {
1221 ret = bq24190_write_mask(bdi, BQ24190_REG_ISC,
1222 BQ24190_REG_ISC_EN_HIZ_MASK,
1223 BQ24190_REG_ISC_EN_HIZ_SHIFT,
1226 dev_err(bdi->dev, "Can't access ISC reg: %d\n",
1230 if ((bdi->ss_reg & battery_mask_ss) != (ss_reg & battery_mask_ss))
1231 alert_battery = true;
1232 if ((bdi->ss_reg & ~battery_mask_ss) != (ss_reg & ~battery_mask_ss))
1233 alert_charger = true;
1235 bdi->ss_reg = ss_reg;
1238 mutex_lock(&bdi->f_reg_lock);
1240 ret = bq24190_read(bdi, BQ24190_REG_F, &f_reg);
1242 mutex_unlock(&bdi->f_reg_lock);
1243 dev_err(bdi->dev, "Can't read F reg: %d\n", ret);
1247 if (f_reg != bdi->f_reg) {
1248 if ((bdi->f_reg & battery_mask_f) != (f_reg & battery_mask_f))
1249 alert_battery = true;
1250 if ((bdi->f_reg & ~battery_mask_f) != (f_reg & ~battery_mask_f))
1251 alert_charger = true;
1254 bdi->charger_health_valid = true;
1255 bdi->battery_health_valid = true;
1256 bdi->battery_status_valid = true;
1259 mutex_unlock(&bdi->f_reg_lock);
1262 power_supply_changed(bdi->charger);
1264 power_supply_changed(bdi->battery);
1267 pm_runtime_put_sync(bdi->dev);
1269 dev_dbg(bdi->dev, "ss_reg: 0x%02x, f_reg: 0x%02x\n", ss_reg, f_reg);
1274 static int bq24190_hw_init(struct bq24190_dev_info *bdi)
1279 pm_runtime_get_sync(bdi->dev);
1281 /* First check that the device really is what its supposed to be */
1282 ret = bq24190_read_mask(bdi, BQ24190_REG_VPRS,
1283 BQ24190_REG_VPRS_PN_MASK,
1284 BQ24190_REG_VPRS_PN_SHIFT,
1289 if (v != bdi->model) {
1294 ret = bq24190_register_reset(bdi);
1298 ret = bq24190_set_mode_host(bdi);
1302 ret = bq24190_read(bdi, BQ24190_REG_SS, &bdi->ss_reg);
1304 pm_runtime_put_sync(bdi->dev);
1309 static int bq24190_setup_dt(struct bq24190_dev_info *bdi)
1311 bdi->irq = irq_of_parse_and_map(bdi->dev->of_node, 0);
1318 static int bq24190_setup_dt(struct bq24190_dev_info *bdi)
1324 static int bq24190_setup_pdata(struct bq24190_dev_info *bdi,
1325 struct bq24190_platform_data *pdata)
1329 if (!gpio_is_valid(pdata->gpio_int))
1332 ret = gpio_request(pdata->gpio_int, dev_name(bdi->dev));
1336 ret = gpio_direction_input(pdata->gpio_int);
1340 bdi->irq = gpio_to_irq(pdata->gpio_int);
1344 bdi->gpio_int = pdata->gpio_int;
1348 gpio_free(pdata->gpio_int);
1352 static int bq24190_probe(struct i2c_client *client,
1353 const struct i2c_device_id *id)
1355 struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);
1356 struct device *dev = &client->dev;
1357 struct bq24190_platform_data *pdata = client->dev.platform_data;
1358 struct power_supply_config charger_cfg = {}, battery_cfg = {};
1359 struct bq24190_dev_info *bdi;
1362 if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) {
1363 dev_err(dev, "No support for SMBUS_BYTE_DATA\n");
1367 bdi = devm_kzalloc(dev, sizeof(*bdi), GFP_KERNEL);
1369 dev_err(dev, "Can't alloc bdi struct\n");
1373 bdi->client = client;
1375 bdi->model = id->driver_data;
1376 strncpy(bdi->model_name, id->name, I2C_NAME_SIZE);
1377 mutex_init(&bdi->f_reg_lock);
1379 bdi->ss_reg = BQ24190_REG_SS_VBUS_STAT_MASK; /* impossible state */
1380 bdi->charger_health_valid = false;
1381 bdi->battery_health_valid = false;
1382 bdi->battery_status_valid = false;
1384 i2c_set_clientdata(client, bdi);
1387 ret = bq24190_setup_dt(bdi);
1389 ret = bq24190_setup_pdata(bdi, pdata);
1392 dev_err(dev, "Can't get irq info\n");
1396 pm_runtime_enable(dev);
1397 pm_runtime_resume(dev);
1399 ret = bq24190_hw_init(bdi);
1401 dev_err(dev, "Hardware init failed\n");
1405 charger_cfg.drv_data = bdi;
1406 charger_cfg.supplied_to = bq24190_charger_supplied_to;
1407 charger_cfg.num_supplicants = ARRAY_SIZE(bq24190_charger_supplied_to),
1408 bdi->charger = power_supply_register(dev, &bq24190_charger_desc,
1410 if (IS_ERR(bdi->charger)) {
1411 dev_err(dev, "Can't register charger\n");
1412 ret = PTR_ERR(bdi->charger);
1416 battery_cfg.drv_data = bdi;
1417 bdi->battery = power_supply_register(dev, &bq24190_battery_desc,
1419 if (IS_ERR(bdi->battery)) {
1420 dev_err(dev, "Can't register battery\n");
1421 ret = PTR_ERR(bdi->battery);
1425 ret = bq24190_sysfs_create_group(bdi);
1427 dev_err(dev, "Can't create sysfs entries\n");
1431 ret = devm_request_threaded_irq(dev, bdi->irq, NULL,
1432 bq24190_irq_handler_thread,
1433 IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
1434 "bq24190-charger", bdi);
1436 dev_err(dev, "Can't set up irq handler\n");
1443 bq24190_sysfs_remove_group(bdi);
1445 power_supply_unregister(bdi->battery);
1447 power_supply_unregister(bdi->charger);
1449 pm_runtime_disable(dev);
1451 gpio_free(bdi->gpio_int);
1456 static int bq24190_remove(struct i2c_client *client)
1458 struct bq24190_dev_info *bdi = i2c_get_clientdata(client);
1460 pm_runtime_get_sync(bdi->dev);
1461 bq24190_register_reset(bdi);
1462 pm_runtime_put_sync(bdi->dev);
1464 bq24190_sysfs_remove_group(bdi);
1465 power_supply_unregister(bdi->battery);
1466 power_supply_unregister(bdi->charger);
1467 pm_runtime_disable(bdi->dev);
1470 gpio_free(bdi->gpio_int);
1475 #ifdef CONFIG_PM_SLEEP
1476 static int bq24190_pm_suspend(struct device *dev)
1478 struct i2c_client *client = to_i2c_client(dev);
1479 struct bq24190_dev_info *bdi = i2c_get_clientdata(client);
1481 pm_runtime_get_sync(bdi->dev);
1482 bq24190_register_reset(bdi);
1483 pm_runtime_put_sync(bdi->dev);
1488 static int bq24190_pm_resume(struct device *dev)
1490 struct i2c_client *client = to_i2c_client(dev);
1491 struct bq24190_dev_info *bdi = i2c_get_clientdata(client);
1494 bdi->ss_reg = BQ24190_REG_SS_VBUS_STAT_MASK; /* impossible state */
1495 bdi->charger_health_valid = false;
1496 bdi->battery_health_valid = false;
1497 bdi->battery_status_valid = false;
1499 pm_runtime_get_sync(bdi->dev);
1500 bq24190_register_reset(bdi);
1501 bq24190_set_mode_host(bdi);
1502 bq24190_read(bdi, BQ24190_REG_SS, &bdi->ss_reg);
1503 pm_runtime_put_sync(bdi->dev);
1505 /* Things may have changed while suspended so alert upper layer */
1506 power_supply_changed(bdi->charger);
1507 power_supply_changed(bdi->battery);
1513 static SIMPLE_DEV_PM_OPS(bq24190_pm_ops, bq24190_pm_suspend, bq24190_pm_resume);
1516 * Only support the bq24190 right now. The bq24192, bq24192i, and bq24193
1517 * are similar but not identical so the driver needs to be extended to
1520 static const struct i2c_device_id bq24190_i2c_ids[] = {
1521 { "bq24190", BQ24190_REG_VPRS_PN_24190 },
1524 MODULE_DEVICE_TABLE(i2c, bq24190_i2c_ids);
1527 static const struct of_device_id bq24190_of_match[] = {
1528 { .compatible = "ti,bq24190", },
1531 MODULE_DEVICE_TABLE(of, bq24190_of_match);
1533 static const struct of_device_id bq24190_of_match[] = {
1538 static struct i2c_driver bq24190_driver = {
1539 .probe = bq24190_probe,
1540 .remove = bq24190_remove,
1541 .id_table = bq24190_i2c_ids,
1543 .name = "bq24190-charger",
1544 .pm = &bq24190_pm_ops,
1545 .of_match_table = of_match_ptr(bq24190_of_match),
1548 module_i2c_driver(bq24190_driver);
1550 MODULE_LICENSE("GPL");
1551 MODULE_AUTHOR("Mark A. Greer <mgreer@animalcreek.com>");
1552 MODULE_DESCRIPTION("TI BQ24190 Charger Driver");