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;
163 bool charger_health_valid;
164 bool battery_health_valid;
165 bool battery_status_valid;
172 * The tables below provide a 2-way mapping for the value that goes in
173 * the register field and the real-world value that it represents.
174 * The index of the array is the value that goes in the register; the
175 * number at that index in the array is the real-world value that it
178 /* REG02[7:2] (ICHG) in uAh */
179 static const int bq24190_ccc_ichg_values[] = {
180 512000, 576000, 640000, 704000, 768000, 832000, 896000, 960000,
181 1024000, 1088000, 1152000, 1216000, 1280000, 1344000, 1408000, 1472000,
182 1536000, 1600000, 1664000, 1728000, 1792000, 1856000, 1920000, 1984000,
183 2048000, 2112000, 2176000, 2240000, 2304000, 2368000, 2432000, 2496000,
184 2560000, 2624000, 2688000, 2752000, 2816000, 2880000, 2944000, 3008000,
185 3072000, 3136000, 3200000, 3264000, 3328000, 3392000, 3456000, 3520000,
186 3584000, 3648000, 3712000, 3776000, 3840000, 3904000, 3968000, 4032000,
187 4096000, 4160000, 4224000, 4288000, 4352000, 4416000, 4480000, 4544000
190 /* REG04[7:2] (VREG) in uV */
191 static const int bq24190_cvc_vreg_values[] = {
192 3504000, 3520000, 3536000, 3552000, 3568000, 3584000, 3600000, 3616000,
193 3632000, 3648000, 3664000, 3680000, 3696000, 3712000, 3728000, 3744000,
194 3760000, 3776000, 3792000, 3808000, 3824000, 3840000, 3856000, 3872000,
195 3888000, 3904000, 3920000, 3936000, 3952000, 3968000, 3984000, 4000000,
196 4016000, 4032000, 4048000, 4064000, 4080000, 4096000, 4112000, 4128000,
197 4144000, 4160000, 4176000, 4192000, 4208000, 4224000, 4240000, 4256000,
198 4272000, 4288000, 4304000, 4320000, 4336000, 4352000, 4368000, 4384000,
202 /* REG06[1:0] (TREG) in tenths of degrees Celcius */
203 static const int bq24190_ictrc_treg_values[] = {
208 * Return the index in 'tbl' of greatest value that is less than or equal to
209 * 'val'. The index range returned is 0 to 'tbl_size' - 1. Assumes that
210 * the values in 'tbl' are sorted from smallest to largest and 'tbl_size'
213 static u8 bq24190_find_idx(const int tbl[], int tbl_size, int v)
217 for (i = 1; i < tbl_size; i++)
224 /* Basic driver I/O routines */
226 static int bq24190_read(struct bq24190_dev_info *bdi, u8 reg, u8 *data)
230 ret = i2c_smbus_read_byte_data(bdi->client, reg);
238 static int bq24190_write(struct bq24190_dev_info *bdi, u8 reg, u8 data)
240 return i2c_smbus_write_byte_data(bdi->client, reg, data);
243 static int bq24190_read_mask(struct bq24190_dev_info *bdi, u8 reg,
244 u8 mask, u8 shift, u8 *data)
249 ret = bq24190_read(bdi, reg, &v);
260 static int bq24190_write_mask(struct bq24190_dev_info *bdi, u8 reg,
261 u8 mask, u8 shift, u8 data)
266 ret = bq24190_read(bdi, reg, &v);
271 v |= ((data << shift) & mask);
273 return bq24190_write(bdi, reg, v);
276 static int bq24190_get_field_val(struct bq24190_dev_info *bdi,
277 u8 reg, u8 mask, u8 shift,
278 const int tbl[], int tbl_size,
284 ret = bq24190_read_mask(bdi, reg, mask, shift, &v);
288 v = (v >= tbl_size) ? (tbl_size - 1) : v;
294 static int bq24190_set_field_val(struct bq24190_dev_info *bdi,
295 u8 reg, u8 mask, u8 shift,
296 const int tbl[], int tbl_size,
301 idx = bq24190_find_idx(tbl, tbl_size, val);
303 return bq24190_write_mask(bdi, reg, mask, shift, idx);
308 * There are a numerous options that are configurable on the bq24190
309 * that go well beyond what the power_supply properties provide access to.
310 * Provide sysfs access to them so they can be examined and possibly modified
311 * on the fly. They will be provided for the charger power_supply object only
312 * and will be prefixed by 'f_' to make them easier to recognize.
315 #define BQ24190_SYSFS_FIELD(_name, r, f, m, store) \
317 .attr = __ATTR(f_##_name, m, bq24190_sysfs_show, store), \
318 .reg = BQ24190_REG_##r, \
319 .mask = BQ24190_REG_##r##_##f##_MASK, \
320 .shift = BQ24190_REG_##r##_##f##_SHIFT, \
323 #define BQ24190_SYSFS_FIELD_RW(_name, r, f) \
324 BQ24190_SYSFS_FIELD(_name, r, f, S_IWUSR | S_IRUGO, \
327 #define BQ24190_SYSFS_FIELD_RO(_name, r, f) \
328 BQ24190_SYSFS_FIELD(_name, r, f, S_IRUGO, NULL)
330 static ssize_t bq24190_sysfs_show(struct device *dev,
331 struct device_attribute *attr, char *buf);
332 static ssize_t bq24190_sysfs_store(struct device *dev,
333 struct device_attribute *attr, const char *buf, size_t count);
335 struct bq24190_sysfs_field_info {
336 struct device_attribute attr;
342 static struct bq24190_sysfs_field_info bq24190_sysfs_field_tbl[] = {
343 /* sysfs name reg field in reg */
344 BQ24190_SYSFS_FIELD_RW(en_hiz, ISC, EN_HIZ),
345 BQ24190_SYSFS_FIELD_RW(vindpm, ISC, VINDPM),
346 BQ24190_SYSFS_FIELD_RW(iinlim, ISC, IINLIM),
347 BQ24190_SYSFS_FIELD_RW(chg_config, POC, CHG_CONFIG),
348 BQ24190_SYSFS_FIELD_RW(sys_min, POC, SYS_MIN),
349 BQ24190_SYSFS_FIELD_RW(boost_lim, POC, BOOST_LIM),
350 BQ24190_SYSFS_FIELD_RW(ichg, CCC, ICHG),
351 BQ24190_SYSFS_FIELD_RW(force_20_pct, CCC, FORCE_20PCT),
352 BQ24190_SYSFS_FIELD_RW(iprechg, PCTCC, IPRECHG),
353 BQ24190_SYSFS_FIELD_RW(iterm, PCTCC, ITERM),
354 BQ24190_SYSFS_FIELD_RW(vreg, CVC, VREG),
355 BQ24190_SYSFS_FIELD_RW(batlowv, CVC, BATLOWV),
356 BQ24190_SYSFS_FIELD_RW(vrechg, CVC, VRECHG),
357 BQ24190_SYSFS_FIELD_RW(en_term, CTTC, EN_TERM),
358 BQ24190_SYSFS_FIELD_RW(term_stat, CTTC, TERM_STAT),
359 BQ24190_SYSFS_FIELD_RO(watchdog, CTTC, WATCHDOG),
360 BQ24190_SYSFS_FIELD_RW(en_timer, CTTC, EN_TIMER),
361 BQ24190_SYSFS_FIELD_RW(chg_timer, CTTC, CHG_TIMER),
362 BQ24190_SYSFS_FIELD_RW(jeta_iset, CTTC, JEITA_ISET),
363 BQ24190_SYSFS_FIELD_RW(bat_comp, ICTRC, BAT_COMP),
364 BQ24190_SYSFS_FIELD_RW(vclamp, ICTRC, VCLAMP),
365 BQ24190_SYSFS_FIELD_RW(treg, ICTRC, TREG),
366 BQ24190_SYSFS_FIELD_RW(dpdm_en, MOC, DPDM_EN),
367 BQ24190_SYSFS_FIELD_RW(tmr2x_en, MOC, TMR2X_EN),
368 BQ24190_SYSFS_FIELD_RW(batfet_disable, MOC, BATFET_DISABLE),
369 BQ24190_SYSFS_FIELD_RW(jeita_vset, MOC, JEITA_VSET),
370 BQ24190_SYSFS_FIELD_RO(int_mask, MOC, INT_MASK),
371 BQ24190_SYSFS_FIELD_RO(vbus_stat, SS, VBUS_STAT),
372 BQ24190_SYSFS_FIELD_RO(chrg_stat, SS, CHRG_STAT),
373 BQ24190_SYSFS_FIELD_RO(dpm_stat, SS, DPM_STAT),
374 BQ24190_SYSFS_FIELD_RO(pg_stat, SS, PG_STAT),
375 BQ24190_SYSFS_FIELD_RO(therm_stat, SS, THERM_STAT),
376 BQ24190_SYSFS_FIELD_RO(vsys_stat, SS, VSYS_STAT),
377 BQ24190_SYSFS_FIELD_RO(watchdog_fault, F, WATCHDOG_FAULT),
378 BQ24190_SYSFS_FIELD_RO(boost_fault, F, BOOST_FAULT),
379 BQ24190_SYSFS_FIELD_RO(chrg_fault, F, CHRG_FAULT),
380 BQ24190_SYSFS_FIELD_RO(bat_fault, F, BAT_FAULT),
381 BQ24190_SYSFS_FIELD_RO(ntc_fault, F, NTC_FAULT),
382 BQ24190_SYSFS_FIELD_RO(pn, VPRS, PN),
383 BQ24190_SYSFS_FIELD_RO(ts_profile, VPRS, TS_PROFILE),
384 BQ24190_SYSFS_FIELD_RO(dev_reg, VPRS, DEV_REG),
387 static struct attribute *
388 bq24190_sysfs_attrs[ARRAY_SIZE(bq24190_sysfs_field_tbl) + 1];
390 static const struct attribute_group bq24190_sysfs_attr_group = {
391 .attrs = bq24190_sysfs_attrs,
394 static void bq24190_sysfs_init_attrs(void)
396 int i, limit = ARRAY_SIZE(bq24190_sysfs_field_tbl);
398 for (i = 0; i < limit; i++)
399 bq24190_sysfs_attrs[i] = &bq24190_sysfs_field_tbl[i].attr.attr;
401 bq24190_sysfs_attrs[limit] = NULL; /* Has additional entry for this */
404 static struct bq24190_sysfs_field_info *bq24190_sysfs_field_lookup(
407 int i, limit = ARRAY_SIZE(bq24190_sysfs_field_tbl);
409 for (i = 0; i < limit; i++)
410 if (!strcmp(name, bq24190_sysfs_field_tbl[i].attr.attr.name))
416 return &bq24190_sysfs_field_tbl[i];
419 static ssize_t bq24190_sysfs_show(struct device *dev,
420 struct device_attribute *attr, char *buf)
422 struct power_supply *psy = dev_get_drvdata(dev);
423 struct bq24190_dev_info *bdi =
424 container_of(psy, struct bq24190_dev_info, charger);
425 struct bq24190_sysfs_field_info *info;
429 info = bq24190_sysfs_field_lookup(attr->attr.name);
433 ret = bq24190_read_mask(bdi, info->reg, info->mask, info->shift, &v);
437 return scnprintf(buf, PAGE_SIZE, "%hhx\n", v);
440 static ssize_t bq24190_sysfs_store(struct device *dev,
441 struct device_attribute *attr, const char *buf, size_t count)
443 struct power_supply *psy = dev_get_drvdata(dev);
444 struct bq24190_dev_info *bdi =
445 container_of(psy, struct bq24190_dev_info, charger);
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 =
808 container_of(psy, struct bq24190_dev_info, charger);
811 dev_dbg(bdi->dev, "prop: %d\n", psp);
813 pm_runtime_get_sync(bdi->dev);
816 case POWER_SUPPLY_PROP_CHARGE_TYPE:
817 ret = bq24190_charger_get_charge_type(bdi, val);
819 case POWER_SUPPLY_PROP_HEALTH:
820 ret = bq24190_charger_get_health(bdi, val);
822 case POWER_SUPPLY_PROP_ONLINE:
823 ret = bq24190_charger_get_online(bdi, val);
825 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
826 ret = bq24190_charger_get_current(bdi, val);
828 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX:
829 ret = bq24190_charger_get_current_max(bdi, val);
831 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
832 ret = bq24190_charger_get_voltage(bdi, val);
834 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX:
835 ret = bq24190_charger_get_voltage_max(bdi, val);
837 case POWER_SUPPLY_PROP_SCOPE:
838 val->intval = POWER_SUPPLY_SCOPE_SYSTEM;
841 case POWER_SUPPLY_PROP_MODEL_NAME:
842 val->strval = bdi->model_name;
845 case POWER_SUPPLY_PROP_MANUFACTURER:
846 val->strval = BQ24190_MANUFACTURER;
853 pm_runtime_put_sync(bdi->dev);
857 static int bq24190_charger_set_property(struct power_supply *psy,
858 enum power_supply_property psp,
859 const union power_supply_propval *val)
861 struct bq24190_dev_info *bdi =
862 container_of(psy, struct bq24190_dev_info, charger);
865 dev_dbg(bdi->dev, "prop: %d\n", psp);
867 pm_runtime_get_sync(bdi->dev);
870 case POWER_SUPPLY_PROP_CHARGE_TYPE:
871 ret = bq24190_charger_set_charge_type(bdi, val);
873 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
874 ret = bq24190_charger_set_current(bdi, val);
876 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
877 ret = bq24190_charger_set_voltage(bdi, val);
883 pm_runtime_put_sync(bdi->dev);
887 static int bq24190_charger_property_is_writeable(struct power_supply *psy,
888 enum power_supply_property psp)
893 case POWER_SUPPLY_PROP_CHARGE_TYPE:
894 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
895 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
905 static enum power_supply_property bq24190_charger_properties[] = {
906 POWER_SUPPLY_PROP_TYPE,
907 POWER_SUPPLY_PROP_HEALTH,
908 POWER_SUPPLY_PROP_ONLINE,
909 POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT,
910 POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX,
911 POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE,
912 POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX,
913 POWER_SUPPLY_PROP_SCOPE,
914 POWER_SUPPLY_PROP_MODEL_NAME,
915 POWER_SUPPLY_PROP_MANUFACTURER,
918 static char *bq24190_charger_supplied_to[] = {
922 static void bq24190_charger_init(struct power_supply *charger)
924 charger->name = "bq24190-charger";
925 charger->type = POWER_SUPPLY_TYPE_USB;
926 charger->properties = bq24190_charger_properties;
927 charger->num_properties = ARRAY_SIZE(bq24190_charger_properties);
928 charger->supplied_to = bq24190_charger_supplied_to;
929 charger->num_supplies = ARRAY_SIZE(bq24190_charger_supplied_to);
930 charger->get_property = bq24190_charger_get_property;
931 charger->set_property = bq24190_charger_set_property;
932 charger->property_is_writeable = bq24190_charger_property_is_writeable;
935 /* Battery power supply property routines */
937 static int bq24190_battery_get_status(struct bq24190_dev_info *bdi,
938 union power_supply_propval *val)
940 u8 ss_reg, chrg_fault;
943 mutex_lock(&bdi->f_reg_lock);
945 if (bdi->battery_status_valid) {
946 chrg_fault = bdi->f_reg;
947 bdi->battery_status_valid = false;
948 mutex_unlock(&bdi->f_reg_lock);
950 mutex_unlock(&bdi->f_reg_lock);
952 ret = bq24190_read(bdi, BQ24190_REG_F, &chrg_fault);
957 chrg_fault &= BQ24190_REG_F_CHRG_FAULT_MASK;
958 chrg_fault >>= BQ24190_REG_F_CHRG_FAULT_SHIFT;
960 ret = bq24190_read(bdi, BQ24190_REG_SS, &ss_reg);
965 * The battery must be discharging when any of these are true:
966 * - there is no good power source;
967 * - there is a charge fault.
968 * Could also be discharging when in "supplement mode" but
969 * there is no way to tell when its in that mode.
971 if (!(ss_reg & BQ24190_REG_SS_PG_STAT_MASK) || chrg_fault) {
972 status = POWER_SUPPLY_STATUS_DISCHARGING;
974 ss_reg &= BQ24190_REG_SS_CHRG_STAT_MASK;
975 ss_reg >>= BQ24190_REG_SS_CHRG_STAT_SHIFT;
978 case 0x0: /* Not Charging */
979 status = POWER_SUPPLY_STATUS_NOT_CHARGING;
981 case 0x1: /* Pre-charge */
982 case 0x2: /* Fast Charging */
983 status = POWER_SUPPLY_STATUS_CHARGING;
985 case 0x3: /* Charge Termination Done */
986 status = POWER_SUPPLY_STATUS_FULL;
994 val->intval = status;
999 static int bq24190_battery_get_health(struct bq24190_dev_info *bdi,
1000 union power_supply_propval *val)
1005 mutex_lock(&bdi->f_reg_lock);
1007 if (bdi->battery_health_valid) {
1009 bdi->battery_health_valid = false;
1010 mutex_unlock(&bdi->f_reg_lock);
1012 mutex_unlock(&bdi->f_reg_lock);
1014 ret = bq24190_read(bdi, BQ24190_REG_F, &v);
1019 if (v & BQ24190_REG_F_BAT_FAULT_MASK) {
1020 health = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
1022 v &= BQ24190_REG_F_NTC_FAULT_MASK;
1023 v >>= BQ24190_REG_F_NTC_FAULT_SHIFT;
1026 case 0x0: /* Normal */
1027 health = POWER_SUPPLY_HEALTH_GOOD;
1029 case 0x1: /* TS1 Cold */
1030 case 0x3: /* TS2 Cold */
1031 case 0x5: /* Both Cold */
1032 health = POWER_SUPPLY_HEALTH_COLD;
1034 case 0x2: /* TS1 Hot */
1035 case 0x4: /* TS2 Hot */
1036 case 0x6: /* Both Hot */
1037 health = POWER_SUPPLY_HEALTH_OVERHEAT;
1040 health = POWER_SUPPLY_HEALTH_UNKNOWN;
1044 val->intval = health;
1048 static int bq24190_battery_get_online(struct bq24190_dev_info *bdi,
1049 union power_supply_propval *val)
1054 ret = bq24190_read_mask(bdi, BQ24190_REG_MOC,
1055 BQ24190_REG_MOC_BATFET_DISABLE_MASK,
1056 BQ24190_REG_MOC_BATFET_DISABLE_SHIFT, &batfet_disable);
1060 val->intval = !batfet_disable;
1064 static int bq24190_battery_set_online(struct bq24190_dev_info *bdi,
1065 const union power_supply_propval *val)
1067 return bq24190_write_mask(bdi, BQ24190_REG_MOC,
1068 BQ24190_REG_MOC_BATFET_DISABLE_MASK,
1069 BQ24190_REG_MOC_BATFET_DISABLE_SHIFT, !val->intval);
1072 static int bq24190_battery_get_temp_alert_max(struct bq24190_dev_info *bdi,
1073 union power_supply_propval *val)
1077 ret = bq24190_get_field_val(bdi, BQ24190_REG_ICTRC,
1078 BQ24190_REG_ICTRC_TREG_MASK,
1079 BQ24190_REG_ICTRC_TREG_SHIFT,
1080 bq24190_ictrc_treg_values,
1081 ARRAY_SIZE(bq24190_ictrc_treg_values), &temp);
1089 static int bq24190_battery_set_temp_alert_max(struct bq24190_dev_info *bdi,
1090 const union power_supply_propval *val)
1092 return bq24190_set_field_val(bdi, BQ24190_REG_ICTRC,
1093 BQ24190_REG_ICTRC_TREG_MASK,
1094 BQ24190_REG_ICTRC_TREG_SHIFT,
1095 bq24190_ictrc_treg_values,
1096 ARRAY_SIZE(bq24190_ictrc_treg_values), val->intval);
1099 static int bq24190_battery_get_property(struct power_supply *psy,
1100 enum power_supply_property psp, union power_supply_propval *val)
1102 struct bq24190_dev_info *bdi =
1103 container_of(psy, struct bq24190_dev_info, battery);
1106 dev_dbg(bdi->dev, "prop: %d\n", psp);
1108 pm_runtime_get_sync(bdi->dev);
1111 case POWER_SUPPLY_PROP_STATUS:
1112 ret = bq24190_battery_get_status(bdi, val);
1114 case POWER_SUPPLY_PROP_HEALTH:
1115 ret = bq24190_battery_get_health(bdi, val);
1117 case POWER_SUPPLY_PROP_ONLINE:
1118 ret = bq24190_battery_get_online(bdi, val);
1120 case POWER_SUPPLY_PROP_TECHNOLOGY:
1121 /* Could be Li-on or Li-polymer but no way to tell which */
1122 val->intval = POWER_SUPPLY_TECHNOLOGY_UNKNOWN;
1125 case POWER_SUPPLY_PROP_TEMP_ALERT_MAX:
1126 ret = bq24190_battery_get_temp_alert_max(bdi, val);
1128 case POWER_SUPPLY_PROP_SCOPE:
1129 val->intval = POWER_SUPPLY_SCOPE_SYSTEM;
1136 pm_runtime_put_sync(bdi->dev);
1140 static int bq24190_battery_set_property(struct power_supply *psy,
1141 enum power_supply_property psp,
1142 const union power_supply_propval *val)
1144 struct bq24190_dev_info *bdi =
1145 container_of(psy, struct bq24190_dev_info, battery);
1148 dev_dbg(bdi->dev, "prop: %d\n", psp);
1150 pm_runtime_put_sync(bdi->dev);
1153 case POWER_SUPPLY_PROP_ONLINE:
1154 ret = bq24190_battery_set_online(bdi, val);
1156 case POWER_SUPPLY_PROP_TEMP_ALERT_MAX:
1157 ret = bq24190_battery_set_temp_alert_max(bdi, val);
1163 pm_runtime_put_sync(bdi->dev);
1167 static int bq24190_battery_property_is_writeable(struct power_supply *psy,
1168 enum power_supply_property psp)
1173 case POWER_SUPPLY_PROP_ONLINE:
1174 case POWER_SUPPLY_PROP_TEMP_ALERT_MAX:
1184 static enum power_supply_property bq24190_battery_properties[] = {
1185 POWER_SUPPLY_PROP_STATUS,
1186 POWER_SUPPLY_PROP_HEALTH,
1187 POWER_SUPPLY_PROP_ONLINE,
1188 POWER_SUPPLY_PROP_TECHNOLOGY,
1189 POWER_SUPPLY_PROP_TEMP_ALERT_MAX,
1190 POWER_SUPPLY_PROP_SCOPE,
1193 static void bq24190_battery_init(struct power_supply *battery)
1195 battery->name = "bq24190-battery";
1196 battery->type = POWER_SUPPLY_TYPE_BATTERY;
1197 battery->properties = bq24190_battery_properties;
1198 battery->num_properties = ARRAY_SIZE(bq24190_battery_properties);
1199 battery->get_property = bq24190_battery_get_property;
1200 battery->set_property = bq24190_battery_set_property;
1201 battery->property_is_writeable = bq24190_battery_property_is_writeable;
1204 static irqreturn_t bq24190_irq_handler_thread(int irq, void *data)
1206 struct bq24190_dev_info *bdi = data;
1207 bool alert_userspace = false;
1211 pm_runtime_get_sync(bdi->dev);
1213 ret = bq24190_read(bdi, BQ24190_REG_SS, &ss_reg);
1215 dev_err(bdi->dev, "Can't read SS reg: %d\n", ret);
1219 if (ss_reg != bdi->ss_reg) {
1221 * The device is in host mode so when PG_STAT goes from 1->0
1222 * (i.e., power removed) HIZ needs to be disabled.
1224 if ((bdi->ss_reg & BQ24190_REG_SS_PG_STAT_MASK) &&
1225 !(ss_reg & BQ24190_REG_SS_PG_STAT_MASK)) {
1226 ret = bq24190_write_mask(bdi, BQ24190_REG_ISC,
1227 BQ24190_REG_ISC_EN_HIZ_MASK,
1228 BQ24190_REG_ISC_EN_HIZ_SHIFT,
1231 dev_err(bdi->dev, "Can't access ISC reg: %d\n",
1235 bdi->ss_reg = ss_reg;
1236 alert_userspace = true;
1239 mutex_lock(&bdi->f_reg_lock);
1241 ret = bq24190_read(bdi, BQ24190_REG_F, &f_reg);
1243 mutex_unlock(&bdi->f_reg_lock);
1244 dev_err(bdi->dev, "Can't read F reg: %d\n", ret);
1248 if (f_reg != bdi->f_reg) {
1250 bdi->charger_health_valid = true;
1251 bdi->battery_health_valid = true;
1252 bdi->battery_status_valid = true;
1254 alert_userspace = true;
1257 mutex_unlock(&bdi->f_reg_lock);
1260 * Sometimes bq24190 gives a steady trickle of interrupts even
1261 * though the watchdog timer is turned off and neither the STATUS
1262 * nor FAULT registers have changed. Weed out these sprurious
1263 * interrupts so userspace isn't alerted for no reason.
1264 * In addition, the chip always generates an interrupt after
1265 * register reset so we should ignore that one (the very first
1266 * interrupt received).
1268 if (alert_userspace && !bdi->first_time) {
1269 power_supply_changed(&bdi->charger);
1270 power_supply_changed(&bdi->battery);
1271 bdi->first_time = false;
1275 pm_runtime_put_sync(bdi->dev);
1277 dev_dbg(bdi->dev, "ss_reg: 0x%02x, f_reg: 0x%02x\n", ss_reg, f_reg);
1282 static int bq24190_hw_init(struct bq24190_dev_info *bdi)
1287 pm_runtime_get_sync(bdi->dev);
1289 /* First check that the device really is what its supposed to be */
1290 ret = bq24190_read_mask(bdi, BQ24190_REG_VPRS,
1291 BQ24190_REG_VPRS_PN_MASK,
1292 BQ24190_REG_VPRS_PN_SHIFT,
1297 if (v != bdi->model) {
1302 ret = bq24190_register_reset(bdi);
1306 ret = bq24190_set_mode_host(bdi);
1308 pm_runtime_put_sync(bdi->dev);
1313 static int bq24190_setup_dt(struct bq24190_dev_info *bdi)
1315 bdi->irq = irq_of_parse_and_map(bdi->dev->of_node, 0);
1322 static int bq24190_setup_dt(struct bq24190_dev_info *bdi)
1328 static int bq24190_setup_pdata(struct bq24190_dev_info *bdi,
1329 struct bq24190_platform_data *pdata)
1333 if (!gpio_is_valid(pdata->gpio_int))
1336 ret = gpio_request(pdata->gpio_int, dev_name(bdi->dev));
1340 ret = gpio_direction_input(pdata->gpio_int);
1344 bdi->irq = gpio_to_irq(pdata->gpio_int);
1348 bdi->gpio_int = pdata->gpio_int;
1352 gpio_free(pdata->gpio_int);
1356 static int bq24190_probe(struct i2c_client *client,
1357 const struct i2c_device_id *id)
1359 struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);
1360 struct device *dev = &client->dev;
1361 struct bq24190_platform_data *pdata = client->dev.platform_data;
1362 struct bq24190_dev_info *bdi;
1365 if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) {
1366 dev_err(dev, "No support for SMBUS_BYTE_DATA\n");
1370 bdi = devm_kzalloc(dev, sizeof(*bdi), GFP_KERNEL);
1372 dev_err(dev, "Can't alloc bdi struct\n");
1376 bdi->client = client;
1378 bdi->model = id->driver_data;
1379 strncpy(bdi->model_name, id->name, I2C_NAME_SIZE);
1380 mutex_init(&bdi->f_reg_lock);
1381 bdi->first_time = true;
1382 bdi->charger_health_valid = false;
1383 bdi->battery_health_valid = false;
1384 bdi->battery_status_valid = false;
1386 i2c_set_clientdata(client, bdi);
1389 ret = bq24190_setup_dt(bdi);
1391 ret = bq24190_setup_pdata(bdi, pdata);
1394 dev_err(dev, "Can't get irq info\n");
1398 ret = devm_request_threaded_irq(dev, bdi->irq, NULL,
1399 bq24190_irq_handler_thread,
1400 IRQF_TRIGGER_RISING | IRQF_ONESHOT,
1401 "bq24190-charger", bdi);
1403 dev_err(dev, "Can't set up irq handler\n");
1407 pm_runtime_enable(dev);
1408 pm_runtime_resume(dev);
1410 ret = bq24190_hw_init(bdi);
1412 dev_err(dev, "Hardware init failed\n");
1416 bq24190_charger_init(&bdi->charger);
1418 ret = power_supply_register(dev, &bdi->charger);
1420 dev_err(dev, "Can't register charger\n");
1424 bq24190_battery_init(&bdi->battery);
1426 ret = power_supply_register(dev, &bdi->battery);
1428 dev_err(dev, "Can't register battery\n");
1432 ret = bq24190_sysfs_create_group(bdi);
1434 dev_err(dev, "Can't create sysfs entries\n");
1441 power_supply_unregister(&bdi->battery);
1443 power_supply_unregister(&bdi->charger);
1445 pm_runtime_disable(dev);
1448 gpio_free(bdi->gpio_int);
1453 static int bq24190_remove(struct i2c_client *client)
1455 struct bq24190_dev_info *bdi = i2c_get_clientdata(client);
1457 pm_runtime_get_sync(bdi->dev);
1458 bq24190_register_reset(bdi);
1459 pm_runtime_put_sync(bdi->dev);
1461 bq24190_sysfs_remove_group(bdi);
1462 power_supply_unregister(&bdi->battery);
1463 power_supply_unregister(&bdi->charger);
1464 pm_runtime_disable(bdi->dev);
1467 gpio_free(bdi->gpio_int);
1472 #ifdef CONFIG_PM_SLEEP
1473 static int bq24190_pm_suspend(struct device *dev)
1475 struct i2c_client *client = to_i2c_client(dev);
1476 struct bq24190_dev_info *bdi = i2c_get_clientdata(client);
1478 pm_runtime_get_sync(bdi->dev);
1479 bq24190_register_reset(bdi);
1480 pm_runtime_put_sync(bdi->dev);
1485 static int bq24190_pm_resume(struct device *dev)
1487 struct i2c_client *client = to_i2c_client(dev);
1488 struct bq24190_dev_info *bdi = i2c_get_clientdata(client);
1490 bdi->charger_health_valid = false;
1491 bdi->battery_health_valid = false;
1492 bdi->battery_status_valid = false;
1494 pm_runtime_get_sync(bdi->dev);
1495 bq24190_register_reset(bdi);
1496 pm_runtime_put_sync(bdi->dev);
1498 /* Things may have changed while suspended so alert upper layer */
1499 power_supply_changed(&bdi->charger);
1500 power_supply_changed(&bdi->battery);
1506 static SIMPLE_DEV_PM_OPS(bq24190_pm_ops, bq24190_pm_suspend, bq24190_pm_resume);
1509 * Only support the bq24190 right now. The bq24192, bq24192i, and bq24193
1510 * are similar but not identical so the driver needs to be extended to
1513 static const struct i2c_device_id bq24190_i2c_ids[] = {
1514 { "bq24190", BQ24190_REG_VPRS_PN_24190 },
1519 static const struct of_device_id bq24190_of_match[] = {
1520 { .compatible = "ti,bq24190", },
1523 MODULE_DEVICE_TABLE(of, bq24190_of_match);
1525 static const struct of_device_id bq24190_of_match[] = {
1530 static struct i2c_driver bq24190_driver = {
1531 .probe = bq24190_probe,
1532 .remove = bq24190_remove,
1533 .id_table = bq24190_i2c_ids,
1535 .name = "bq24190-charger",
1536 .owner = THIS_MODULE,
1537 .pm = &bq24190_pm_ops,
1538 .of_match_table = of_match_ptr(bq24190_of_match),
1541 module_i2c_driver(bq24190_driver);
1543 MODULE_LICENSE("GPL");
1544 MODULE_AUTHOR("Mark A. Greer <mgreer@animalcreek.com>");
1545 MODULE_ALIAS("i2c:bq24190-charger");
1546 MODULE_DESCRIPTION("TI BQ24190 Charger Driver");