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/extcon.h>
15 #include <linux/of_irq.h>
16 #include <linux/of_device.h>
17 #include <linux/pm_runtime.h>
18 #include <linux/power_supply.h>
19 #include <linux/power/bq24190_charger.h>
20 #include <linux/regulator/driver.h>
21 #include <linux/regulator/machine.h>
22 #include <linux/workqueue.h>
23 #include <linux/gpio.h>
24 #include <linux/i2c.h>
26 #define BQ24190_MANUFACTURER "Texas Instruments"
28 #define BQ24190_REG_ISC 0x00 /* Input Source Control */
29 #define BQ24190_REG_ISC_EN_HIZ_MASK BIT(7)
30 #define BQ24190_REG_ISC_EN_HIZ_SHIFT 7
31 #define BQ24190_REG_ISC_VINDPM_MASK (BIT(6) | BIT(5) | BIT(4) | \
33 #define BQ24190_REG_ISC_VINDPM_SHIFT 3
34 #define BQ24190_REG_ISC_IINLIM_MASK (BIT(2) | BIT(1) | BIT(0))
35 #define BQ24190_REG_ISC_IINLIM_SHIFT 0
37 #define BQ24190_REG_POC 0x01 /* Power-On Configuration */
38 #define BQ24190_REG_POC_RESET_MASK BIT(7)
39 #define BQ24190_REG_POC_RESET_SHIFT 7
40 #define BQ24190_REG_POC_WDT_RESET_MASK BIT(6)
41 #define BQ24190_REG_POC_WDT_RESET_SHIFT 6
42 #define BQ24190_REG_POC_CHG_CONFIG_MASK (BIT(5) | BIT(4))
43 #define BQ24190_REG_POC_CHG_CONFIG_SHIFT 4
44 #define BQ24190_REG_POC_CHG_CONFIG_DISABLE 0x0
45 #define BQ24190_REG_POC_CHG_CONFIG_CHARGE 0x1
46 #define BQ24190_REG_POC_CHG_CONFIG_OTG 0x2
47 #define BQ24190_REG_POC_SYS_MIN_MASK (BIT(3) | BIT(2) | BIT(1))
48 #define BQ24190_REG_POC_SYS_MIN_SHIFT 1
49 #define BQ24190_REG_POC_SYS_MIN_MIN 3000
50 #define BQ24190_REG_POC_SYS_MIN_MAX 3700
51 #define BQ24190_REG_POC_BOOST_LIM_MASK BIT(0)
52 #define BQ24190_REG_POC_BOOST_LIM_SHIFT 0
54 #define BQ24190_REG_CCC 0x02 /* Charge Current Control */
55 #define BQ24190_REG_CCC_ICHG_MASK (BIT(7) | BIT(6) | BIT(5) | \
56 BIT(4) | BIT(3) | BIT(2))
57 #define BQ24190_REG_CCC_ICHG_SHIFT 2
58 #define BQ24190_REG_CCC_FORCE_20PCT_MASK BIT(0)
59 #define BQ24190_REG_CCC_FORCE_20PCT_SHIFT 0
61 #define BQ24190_REG_PCTCC 0x03 /* Pre-charge/Termination Current Cntl */
62 #define BQ24190_REG_PCTCC_IPRECHG_MASK (BIT(7) | BIT(6) | BIT(5) | \
64 #define BQ24190_REG_PCTCC_IPRECHG_SHIFT 4
65 #define BQ24190_REG_PCTCC_IPRECHG_MIN 128
66 #define BQ24190_REG_PCTCC_IPRECHG_MAX 2048
67 #define BQ24190_REG_PCTCC_ITERM_MASK (BIT(3) | BIT(2) | BIT(1) | \
69 #define BQ24190_REG_PCTCC_ITERM_SHIFT 0
70 #define BQ24190_REG_PCTCC_ITERM_MIN 128
71 #define BQ24190_REG_PCTCC_ITERM_MAX 2048
73 #define BQ24190_REG_CVC 0x04 /* Charge Voltage Control */
74 #define BQ24190_REG_CVC_VREG_MASK (BIT(7) | BIT(6) | BIT(5) | \
75 BIT(4) | BIT(3) | BIT(2))
76 #define BQ24190_REG_CVC_VREG_SHIFT 2
77 #define BQ24190_REG_CVC_BATLOWV_MASK BIT(1)
78 #define BQ24190_REG_CVC_BATLOWV_SHIFT 1
79 #define BQ24190_REG_CVC_VRECHG_MASK BIT(0)
80 #define BQ24190_REG_CVC_VRECHG_SHIFT 0
82 #define BQ24190_REG_CTTC 0x05 /* Charge Term/Timer Control */
83 #define BQ24190_REG_CTTC_EN_TERM_MASK BIT(7)
84 #define BQ24190_REG_CTTC_EN_TERM_SHIFT 7
85 #define BQ24190_REG_CTTC_TERM_STAT_MASK BIT(6)
86 #define BQ24190_REG_CTTC_TERM_STAT_SHIFT 6
87 #define BQ24190_REG_CTTC_WATCHDOG_MASK (BIT(5) | BIT(4))
88 #define BQ24190_REG_CTTC_WATCHDOG_SHIFT 4
89 #define BQ24190_REG_CTTC_EN_TIMER_MASK BIT(3)
90 #define BQ24190_REG_CTTC_EN_TIMER_SHIFT 3
91 #define BQ24190_REG_CTTC_CHG_TIMER_MASK (BIT(2) | BIT(1))
92 #define BQ24190_REG_CTTC_CHG_TIMER_SHIFT 1
93 #define BQ24190_REG_CTTC_JEITA_ISET_MASK BIT(0)
94 #define BQ24190_REG_CTTC_JEITA_ISET_SHIFT 0
96 #define BQ24190_REG_ICTRC 0x06 /* IR Comp/Thermal Regulation Control */
97 #define BQ24190_REG_ICTRC_BAT_COMP_MASK (BIT(7) | BIT(6) | BIT(5))
98 #define BQ24190_REG_ICTRC_BAT_COMP_SHIFT 5
99 #define BQ24190_REG_ICTRC_VCLAMP_MASK (BIT(4) | BIT(3) | BIT(2))
100 #define BQ24190_REG_ICTRC_VCLAMP_SHIFT 2
101 #define BQ24190_REG_ICTRC_TREG_MASK (BIT(1) | BIT(0))
102 #define BQ24190_REG_ICTRC_TREG_SHIFT 0
104 #define BQ24190_REG_MOC 0x07 /* Misc. Operation Control */
105 #define BQ24190_REG_MOC_DPDM_EN_MASK BIT(7)
106 #define BQ24190_REG_MOC_DPDM_EN_SHIFT 7
107 #define BQ24190_REG_MOC_TMR2X_EN_MASK BIT(6)
108 #define BQ24190_REG_MOC_TMR2X_EN_SHIFT 6
109 #define BQ24190_REG_MOC_BATFET_DISABLE_MASK BIT(5)
110 #define BQ24190_REG_MOC_BATFET_DISABLE_SHIFT 5
111 #define BQ24190_REG_MOC_JEITA_VSET_MASK BIT(4)
112 #define BQ24190_REG_MOC_JEITA_VSET_SHIFT 4
113 #define BQ24190_REG_MOC_INT_MASK_MASK (BIT(1) | BIT(0))
114 #define BQ24190_REG_MOC_INT_MASK_SHIFT 0
116 #define BQ24190_REG_SS 0x08 /* System Status */
117 #define BQ24190_REG_SS_VBUS_STAT_MASK (BIT(7) | BIT(6))
118 #define BQ24190_REG_SS_VBUS_STAT_SHIFT 6
119 #define BQ24190_REG_SS_CHRG_STAT_MASK (BIT(5) | BIT(4))
120 #define BQ24190_REG_SS_CHRG_STAT_SHIFT 4
121 #define BQ24190_REG_SS_DPM_STAT_MASK BIT(3)
122 #define BQ24190_REG_SS_DPM_STAT_SHIFT 3
123 #define BQ24190_REG_SS_PG_STAT_MASK BIT(2)
124 #define BQ24190_REG_SS_PG_STAT_SHIFT 2
125 #define BQ24190_REG_SS_THERM_STAT_MASK BIT(1)
126 #define BQ24190_REG_SS_THERM_STAT_SHIFT 1
127 #define BQ24190_REG_SS_VSYS_STAT_MASK BIT(0)
128 #define BQ24190_REG_SS_VSYS_STAT_SHIFT 0
130 #define BQ24190_REG_F 0x09 /* Fault */
131 #define BQ24190_REG_F_WATCHDOG_FAULT_MASK BIT(7)
132 #define BQ24190_REG_F_WATCHDOG_FAULT_SHIFT 7
133 #define BQ24190_REG_F_BOOST_FAULT_MASK BIT(6)
134 #define BQ24190_REG_F_BOOST_FAULT_SHIFT 6
135 #define BQ24190_REG_F_CHRG_FAULT_MASK (BIT(5) | BIT(4))
136 #define BQ24190_REG_F_CHRG_FAULT_SHIFT 4
137 #define BQ24190_REG_F_BAT_FAULT_MASK BIT(3)
138 #define BQ24190_REG_F_BAT_FAULT_SHIFT 3
139 #define BQ24190_REG_F_NTC_FAULT_MASK (BIT(2) | BIT(1) | BIT(0))
140 #define BQ24190_REG_F_NTC_FAULT_SHIFT 0
142 #define BQ24190_REG_VPRS 0x0A /* Vendor/Part/Revision Status */
143 #define BQ24190_REG_VPRS_PN_MASK (BIT(5) | BIT(4) | BIT(3))
144 #define BQ24190_REG_VPRS_PN_SHIFT 3
145 #define BQ24190_REG_VPRS_PN_24190 0x4
146 #define BQ24190_REG_VPRS_PN_24192 0x5 /* Also 24193 */
147 #define BQ24190_REG_VPRS_PN_24192I 0x3
148 #define BQ24190_REG_VPRS_TS_PROFILE_MASK BIT(2)
149 #define BQ24190_REG_VPRS_TS_PROFILE_SHIFT 2
150 #define BQ24190_REG_VPRS_DEV_REG_MASK (BIT(1) | BIT(0))
151 #define BQ24190_REG_VPRS_DEV_REG_SHIFT 0
154 * The FAULT register is latched by the bq24190 (except for NTC_FAULT)
155 * so the first read after a fault returns the latched value and subsequent
156 * reads return the current value. In order to return the fault status
157 * to the user, have the interrupt handler save the reg's value and retrieve
158 * it in the appropriate health/status routine.
160 struct bq24190_dev_info {
161 struct i2c_client *client;
163 struct power_supply *charger;
164 struct power_supply *battery;
165 struct extcon_dev *extcon;
166 struct notifier_block extcon_nb;
167 struct delayed_work extcon_work;
168 struct delayed_work input_current_limit_work;
169 char model_name[I2C_NAME_SIZE];
175 struct mutex f_reg_lock;
182 * The tables below provide a 2-way mapping for the value that goes in
183 * the register field and the real-world value that it represents.
184 * The index of the array is the value that goes in the register; the
185 * number at that index in the array is the real-world value that it
189 /* REG00[2:0] (IINLIM) in uAh */
190 static const int bq24190_isc_iinlim_values[] = {
191 100000, 150000, 500000, 900000, 1200000, 1500000, 2000000, 3000000
194 /* REG02[7:2] (ICHG) in uAh */
195 static const int bq24190_ccc_ichg_values[] = {
196 512000, 576000, 640000, 704000, 768000, 832000, 896000, 960000,
197 1024000, 1088000, 1152000, 1216000, 1280000, 1344000, 1408000, 1472000,
198 1536000, 1600000, 1664000, 1728000, 1792000, 1856000, 1920000, 1984000,
199 2048000, 2112000, 2176000, 2240000, 2304000, 2368000, 2432000, 2496000,
200 2560000, 2624000, 2688000, 2752000, 2816000, 2880000, 2944000, 3008000,
201 3072000, 3136000, 3200000, 3264000, 3328000, 3392000, 3456000, 3520000,
202 3584000, 3648000, 3712000, 3776000, 3840000, 3904000, 3968000, 4032000,
203 4096000, 4160000, 4224000, 4288000, 4352000, 4416000, 4480000, 4544000
206 /* REG04[7:2] (VREG) in uV */
207 static const int bq24190_cvc_vreg_values[] = {
208 3504000, 3520000, 3536000, 3552000, 3568000, 3584000, 3600000, 3616000,
209 3632000, 3648000, 3664000, 3680000, 3696000, 3712000, 3728000, 3744000,
210 3760000, 3776000, 3792000, 3808000, 3824000, 3840000, 3856000, 3872000,
211 3888000, 3904000, 3920000, 3936000, 3952000, 3968000, 3984000, 4000000,
212 4016000, 4032000, 4048000, 4064000, 4080000, 4096000, 4112000, 4128000,
213 4144000, 4160000, 4176000, 4192000, 4208000, 4224000, 4240000, 4256000,
214 4272000, 4288000, 4304000, 4320000, 4336000, 4352000, 4368000, 4384000,
218 /* REG06[1:0] (TREG) in tenths of degrees Celsius */
219 static const int bq24190_ictrc_treg_values[] = {
224 * Return the index in 'tbl' of greatest value that is less than or equal to
225 * 'val'. The index range returned is 0 to 'tbl_size' - 1. Assumes that
226 * the values in 'tbl' are sorted from smallest to largest and 'tbl_size'
229 static u8 bq24190_find_idx(const int tbl[], int tbl_size, int v)
233 for (i = 1; i < tbl_size; i++)
240 /* Basic driver I/O routines */
242 static int bq24190_read(struct bq24190_dev_info *bdi, u8 reg, u8 *data)
246 ret = i2c_smbus_read_byte_data(bdi->client, reg);
254 static int bq24190_write(struct bq24190_dev_info *bdi, u8 reg, u8 data)
256 return i2c_smbus_write_byte_data(bdi->client, reg, data);
259 static int bq24190_read_mask(struct bq24190_dev_info *bdi, u8 reg,
260 u8 mask, u8 shift, u8 *data)
265 ret = bq24190_read(bdi, reg, &v);
276 static int bq24190_write_mask(struct bq24190_dev_info *bdi, u8 reg,
277 u8 mask, u8 shift, u8 data)
282 ret = bq24190_read(bdi, reg, &v);
287 v |= ((data << shift) & mask);
289 return bq24190_write(bdi, reg, v);
292 static int bq24190_get_field_val(struct bq24190_dev_info *bdi,
293 u8 reg, u8 mask, u8 shift,
294 const int tbl[], int tbl_size,
300 ret = bq24190_read_mask(bdi, reg, mask, shift, &v);
304 v = (v >= tbl_size) ? (tbl_size - 1) : v;
310 static int bq24190_set_field_val(struct bq24190_dev_info *bdi,
311 u8 reg, u8 mask, u8 shift,
312 const int tbl[], int tbl_size,
317 idx = bq24190_find_idx(tbl, tbl_size, val);
319 return bq24190_write_mask(bdi, reg, mask, shift, idx);
324 * There are a numerous options that are configurable on the bq24190
325 * that go well beyond what the power_supply properties provide access to.
326 * Provide sysfs access to them so they can be examined and possibly modified
327 * on the fly. They will be provided for the charger power_supply object only
328 * and will be prefixed by 'f_' to make them easier to recognize.
331 #define BQ24190_SYSFS_FIELD(_name, r, f, m, store) \
333 .attr = __ATTR(f_##_name, m, bq24190_sysfs_show, store), \
334 .reg = BQ24190_REG_##r, \
335 .mask = BQ24190_REG_##r##_##f##_MASK, \
336 .shift = BQ24190_REG_##r##_##f##_SHIFT, \
339 #define BQ24190_SYSFS_FIELD_RW(_name, r, f) \
340 BQ24190_SYSFS_FIELD(_name, r, f, S_IWUSR | S_IRUGO, \
343 #define BQ24190_SYSFS_FIELD_RO(_name, r, f) \
344 BQ24190_SYSFS_FIELD(_name, r, f, S_IRUGO, NULL)
346 static ssize_t bq24190_sysfs_show(struct device *dev,
347 struct device_attribute *attr, char *buf);
348 static ssize_t bq24190_sysfs_store(struct device *dev,
349 struct device_attribute *attr, const char *buf, size_t count);
351 struct bq24190_sysfs_field_info {
352 struct device_attribute attr;
358 /* On i386 ptrace-abi.h defines SS that breaks the macro calls below. */
361 static struct bq24190_sysfs_field_info bq24190_sysfs_field_tbl[] = {
362 /* sysfs name reg field in reg */
363 BQ24190_SYSFS_FIELD_RW(en_hiz, ISC, EN_HIZ),
364 BQ24190_SYSFS_FIELD_RW(vindpm, ISC, VINDPM),
365 BQ24190_SYSFS_FIELD_RW(iinlim, ISC, IINLIM),
366 BQ24190_SYSFS_FIELD_RW(chg_config, POC, CHG_CONFIG),
367 BQ24190_SYSFS_FIELD_RW(sys_min, POC, SYS_MIN),
368 BQ24190_SYSFS_FIELD_RW(boost_lim, POC, BOOST_LIM),
369 BQ24190_SYSFS_FIELD_RW(ichg, CCC, ICHG),
370 BQ24190_SYSFS_FIELD_RW(force_20_pct, CCC, FORCE_20PCT),
371 BQ24190_SYSFS_FIELD_RW(iprechg, PCTCC, IPRECHG),
372 BQ24190_SYSFS_FIELD_RW(iterm, PCTCC, ITERM),
373 BQ24190_SYSFS_FIELD_RW(vreg, CVC, VREG),
374 BQ24190_SYSFS_FIELD_RW(batlowv, CVC, BATLOWV),
375 BQ24190_SYSFS_FIELD_RW(vrechg, CVC, VRECHG),
376 BQ24190_SYSFS_FIELD_RW(en_term, CTTC, EN_TERM),
377 BQ24190_SYSFS_FIELD_RW(term_stat, CTTC, TERM_STAT),
378 BQ24190_SYSFS_FIELD_RO(watchdog, CTTC, WATCHDOG),
379 BQ24190_SYSFS_FIELD_RW(en_timer, CTTC, EN_TIMER),
380 BQ24190_SYSFS_FIELD_RW(chg_timer, CTTC, CHG_TIMER),
381 BQ24190_SYSFS_FIELD_RW(jeta_iset, CTTC, JEITA_ISET),
382 BQ24190_SYSFS_FIELD_RW(bat_comp, ICTRC, BAT_COMP),
383 BQ24190_SYSFS_FIELD_RW(vclamp, ICTRC, VCLAMP),
384 BQ24190_SYSFS_FIELD_RW(treg, ICTRC, TREG),
385 BQ24190_SYSFS_FIELD_RW(dpdm_en, MOC, DPDM_EN),
386 BQ24190_SYSFS_FIELD_RW(tmr2x_en, MOC, TMR2X_EN),
387 BQ24190_SYSFS_FIELD_RW(batfet_disable, MOC, BATFET_DISABLE),
388 BQ24190_SYSFS_FIELD_RW(jeita_vset, MOC, JEITA_VSET),
389 BQ24190_SYSFS_FIELD_RO(int_mask, MOC, INT_MASK),
390 BQ24190_SYSFS_FIELD_RO(vbus_stat, SS, VBUS_STAT),
391 BQ24190_SYSFS_FIELD_RO(chrg_stat, SS, CHRG_STAT),
392 BQ24190_SYSFS_FIELD_RO(dpm_stat, SS, DPM_STAT),
393 BQ24190_SYSFS_FIELD_RO(pg_stat, SS, PG_STAT),
394 BQ24190_SYSFS_FIELD_RO(therm_stat, SS, THERM_STAT),
395 BQ24190_SYSFS_FIELD_RO(vsys_stat, SS, VSYS_STAT),
396 BQ24190_SYSFS_FIELD_RO(watchdog_fault, F, WATCHDOG_FAULT),
397 BQ24190_SYSFS_FIELD_RO(boost_fault, F, BOOST_FAULT),
398 BQ24190_SYSFS_FIELD_RO(chrg_fault, F, CHRG_FAULT),
399 BQ24190_SYSFS_FIELD_RO(bat_fault, F, BAT_FAULT),
400 BQ24190_SYSFS_FIELD_RO(ntc_fault, F, NTC_FAULT),
401 BQ24190_SYSFS_FIELD_RO(pn, VPRS, PN),
402 BQ24190_SYSFS_FIELD_RO(ts_profile, VPRS, TS_PROFILE),
403 BQ24190_SYSFS_FIELD_RO(dev_reg, VPRS, DEV_REG),
406 static struct attribute *
407 bq24190_sysfs_attrs[ARRAY_SIZE(bq24190_sysfs_field_tbl) + 1];
409 static const struct attribute_group bq24190_sysfs_attr_group = {
410 .attrs = bq24190_sysfs_attrs,
413 static void bq24190_sysfs_init_attrs(void)
415 int i, limit = ARRAY_SIZE(bq24190_sysfs_field_tbl);
417 for (i = 0; i < limit; i++)
418 bq24190_sysfs_attrs[i] = &bq24190_sysfs_field_tbl[i].attr.attr;
420 bq24190_sysfs_attrs[limit] = NULL; /* Has additional entry for this */
423 static struct bq24190_sysfs_field_info *bq24190_sysfs_field_lookup(
426 int i, limit = ARRAY_SIZE(bq24190_sysfs_field_tbl);
428 for (i = 0; i < limit; i++)
429 if (!strcmp(name, bq24190_sysfs_field_tbl[i].attr.attr.name))
435 return &bq24190_sysfs_field_tbl[i];
438 static ssize_t bq24190_sysfs_show(struct device *dev,
439 struct device_attribute *attr, char *buf)
441 struct power_supply *psy = dev_get_drvdata(dev);
442 struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
443 struct bq24190_sysfs_field_info *info;
448 info = bq24190_sysfs_field_lookup(attr->attr.name);
452 ret = pm_runtime_get_sync(bdi->dev);
454 pm_runtime_put_noidle(bdi->dev);
458 ret = bq24190_read_mask(bdi, info->reg, info->mask, info->shift, &v);
462 count = scnprintf(buf, PAGE_SIZE, "%hhx\n", v);
464 pm_runtime_mark_last_busy(bdi->dev);
465 pm_runtime_put_autosuspend(bdi->dev);
470 static ssize_t bq24190_sysfs_store(struct device *dev,
471 struct device_attribute *attr, const char *buf, size_t count)
473 struct power_supply *psy = dev_get_drvdata(dev);
474 struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
475 struct bq24190_sysfs_field_info *info;
479 info = bq24190_sysfs_field_lookup(attr->attr.name);
483 ret = kstrtou8(buf, 0, &v);
487 ret = pm_runtime_get_sync(bdi->dev);
491 ret = bq24190_write_mask(bdi, info->reg, info->mask, info->shift, v);
495 pm_runtime_mark_last_busy(bdi->dev);
496 pm_runtime_put_autosuspend(bdi->dev);
501 static int bq24190_sysfs_create_group(struct bq24190_dev_info *bdi)
503 bq24190_sysfs_init_attrs();
505 return sysfs_create_group(&bdi->charger->dev.kobj,
506 &bq24190_sysfs_attr_group);
509 static void bq24190_sysfs_remove_group(struct bq24190_dev_info *bdi)
511 sysfs_remove_group(&bdi->charger->dev.kobj, &bq24190_sysfs_attr_group);
514 static int bq24190_sysfs_create_group(struct bq24190_dev_info *bdi)
519 static inline void bq24190_sysfs_remove_group(struct bq24190_dev_info *bdi) {}
522 #ifdef CONFIG_REGULATOR
523 static int bq24190_set_charge_mode(struct regulator_dev *dev, u8 val)
525 struct bq24190_dev_info *bdi = rdev_get_drvdata(dev);
528 ret = pm_runtime_get_sync(bdi->dev);
530 dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", ret);
531 pm_runtime_put_noidle(bdi->dev);
535 ret = bq24190_write_mask(bdi, BQ24190_REG_POC,
536 BQ24190_REG_POC_CHG_CONFIG_MASK,
537 BQ24190_REG_POC_CHG_CONFIG_SHIFT, val);
539 pm_runtime_mark_last_busy(bdi->dev);
540 pm_runtime_put_autosuspend(bdi->dev);
545 static int bq24190_vbus_enable(struct regulator_dev *dev)
547 return bq24190_set_charge_mode(dev, BQ24190_REG_POC_CHG_CONFIG_OTG);
550 static int bq24190_vbus_disable(struct regulator_dev *dev)
552 return bq24190_set_charge_mode(dev, BQ24190_REG_POC_CHG_CONFIG_CHARGE);
555 static int bq24190_vbus_is_enabled(struct regulator_dev *dev)
557 struct bq24190_dev_info *bdi = rdev_get_drvdata(dev);
561 ret = pm_runtime_get_sync(bdi->dev);
563 dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", ret);
564 pm_runtime_put_noidle(bdi->dev);
568 ret = bq24190_read_mask(bdi, BQ24190_REG_POC,
569 BQ24190_REG_POC_CHG_CONFIG_MASK,
570 BQ24190_REG_POC_CHG_CONFIG_SHIFT, &val);
572 pm_runtime_mark_last_busy(bdi->dev);
573 pm_runtime_put_autosuspend(bdi->dev);
575 return ret ? ret : val == BQ24190_REG_POC_CHG_CONFIG_OTG;
578 static const struct regulator_ops bq24190_vbus_ops = {
579 .enable = bq24190_vbus_enable,
580 .disable = bq24190_vbus_disable,
581 .is_enabled = bq24190_vbus_is_enabled,
584 static const struct regulator_desc bq24190_vbus_desc = {
585 .name = "usb_otg_vbus",
586 .type = REGULATOR_VOLTAGE,
587 .owner = THIS_MODULE,
588 .ops = &bq24190_vbus_ops,
593 static const struct regulator_init_data bq24190_vbus_init_data = {
595 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
599 static int bq24190_register_vbus_regulator(struct bq24190_dev_info *bdi)
601 struct bq24190_platform_data *pdata = bdi->dev->platform_data;
602 struct regulator_config cfg = { };
603 struct regulator_dev *reg;
607 if (pdata && pdata->regulator_init_data)
608 cfg.init_data = pdata->regulator_init_data;
610 cfg.init_data = &bq24190_vbus_init_data;
611 cfg.driver_data = bdi;
612 reg = devm_regulator_register(bdi->dev, &bq24190_vbus_desc, &cfg);
615 dev_err(bdi->dev, "Can't register regulator: %d\n", ret);
621 static int bq24190_register_vbus_regulator(struct bq24190_dev_info *bdi)
627 static int bq24190_set_config(struct bq24190_dev_info *bdi)
632 ret = bq24190_read(bdi, BQ24190_REG_CTTC, &v);
636 bdi->watchdog = ((v & BQ24190_REG_CTTC_WATCHDOG_MASK) >>
637 BQ24190_REG_CTTC_WATCHDOG_SHIFT);
640 * According to the "Host Mode and default Mode" section of the
641 * manual, a write to any register causes the bq24190 to switch
642 * from default mode to host mode. It will switch back to default
643 * mode after a WDT timeout unless the WDT is turned off as well.
644 * So, by simply turning off the WDT, we accomplish both with the
647 v &= ~BQ24190_REG_CTTC_WATCHDOG_MASK;
649 ret = bq24190_write(bdi, BQ24190_REG_CTTC, v);
654 v = bdi->sys_min / 100 - 30; // manual section 9.5.1.2, table 9
655 ret = bq24190_write_mask(bdi, BQ24190_REG_POC,
656 BQ24190_REG_POC_SYS_MIN_MASK,
657 BQ24190_REG_POC_SYS_MIN_SHIFT,
664 v = bdi->iprechg / 128 - 1; // manual section 9.5.1.4, table 11
665 ret = bq24190_write_mask(bdi, BQ24190_REG_PCTCC,
666 BQ24190_REG_PCTCC_IPRECHG_MASK,
667 BQ24190_REG_PCTCC_IPRECHG_SHIFT,
674 v = bdi->iterm / 128 - 1; // manual section 9.5.1.4, table 11
675 ret = bq24190_write_mask(bdi, BQ24190_REG_PCTCC,
676 BQ24190_REG_PCTCC_ITERM_MASK,
677 BQ24190_REG_PCTCC_ITERM_SHIFT,
686 static int bq24190_register_reset(struct bq24190_dev_info *bdi)
688 int ret, limit = 100;
691 if (device_property_read_bool(bdi->dev, "disable-reset"))
694 /* Reset the registers */
695 ret = bq24190_write_mask(bdi, BQ24190_REG_POC,
696 BQ24190_REG_POC_RESET_MASK,
697 BQ24190_REG_POC_RESET_SHIFT,
702 /* Reset bit will be cleared by hardware so poll until it is */
704 ret = bq24190_read_mask(bdi, BQ24190_REG_POC,
705 BQ24190_REG_POC_RESET_MASK,
706 BQ24190_REG_POC_RESET_SHIFT,
714 usleep_range(100, 200);
720 /* Charger power supply property routines */
722 static int bq24190_charger_get_charge_type(struct bq24190_dev_info *bdi,
723 union power_supply_propval *val)
728 ret = bq24190_read_mask(bdi, BQ24190_REG_POC,
729 BQ24190_REG_POC_CHG_CONFIG_MASK,
730 BQ24190_REG_POC_CHG_CONFIG_SHIFT,
735 /* If POC[CHG_CONFIG] (REG01[5:4]) == 0, charge is disabled */
737 type = POWER_SUPPLY_CHARGE_TYPE_NONE;
739 ret = bq24190_read_mask(bdi, BQ24190_REG_CCC,
740 BQ24190_REG_CCC_FORCE_20PCT_MASK,
741 BQ24190_REG_CCC_FORCE_20PCT_SHIFT,
746 type = (v) ? POWER_SUPPLY_CHARGE_TYPE_TRICKLE :
747 POWER_SUPPLY_CHARGE_TYPE_FAST;
755 static int bq24190_charger_set_charge_type(struct bq24190_dev_info *bdi,
756 const union power_supply_propval *val)
758 u8 chg_config, force_20pct, en_term;
762 * According to the "Termination when REG02[0] = 1" section of
763 * the bq24190 manual, the trickle charge could be less than the
764 * termination current so it recommends turning off the termination
767 * Note: AFAICT from the datasheet, the user will have to manually
768 * turn off the charging when in 20% mode. If its not turned off,
769 * there could be battery damage. So, use this mode at your own risk.
771 switch (val->intval) {
772 case POWER_SUPPLY_CHARGE_TYPE_NONE:
775 case POWER_SUPPLY_CHARGE_TYPE_TRICKLE:
780 case POWER_SUPPLY_CHARGE_TYPE_FAST:
789 if (chg_config) { /* Enabling the charger */
790 ret = bq24190_write_mask(bdi, BQ24190_REG_CCC,
791 BQ24190_REG_CCC_FORCE_20PCT_MASK,
792 BQ24190_REG_CCC_FORCE_20PCT_SHIFT,
797 ret = bq24190_write_mask(bdi, BQ24190_REG_CTTC,
798 BQ24190_REG_CTTC_EN_TERM_MASK,
799 BQ24190_REG_CTTC_EN_TERM_SHIFT,
805 return bq24190_write_mask(bdi, BQ24190_REG_POC,
806 BQ24190_REG_POC_CHG_CONFIG_MASK,
807 BQ24190_REG_POC_CHG_CONFIG_SHIFT, chg_config);
810 static int bq24190_charger_get_health(struct bq24190_dev_info *bdi,
811 union power_supply_propval *val)
816 mutex_lock(&bdi->f_reg_lock);
818 mutex_unlock(&bdi->f_reg_lock);
820 if (v & BQ24190_REG_F_NTC_FAULT_MASK) {
821 switch (v >> BQ24190_REG_F_NTC_FAULT_SHIFT & 0x7) {
822 case 0x1: /* TS1 Cold */
823 case 0x3: /* TS2 Cold */
824 case 0x5: /* Both Cold */
825 health = POWER_SUPPLY_HEALTH_COLD;
827 case 0x2: /* TS1 Hot */
828 case 0x4: /* TS2 Hot */
829 case 0x6: /* Both Hot */
830 health = POWER_SUPPLY_HEALTH_OVERHEAT;
833 health = POWER_SUPPLY_HEALTH_UNKNOWN;
835 } else if (v & BQ24190_REG_F_BAT_FAULT_MASK) {
836 health = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
837 } else if (v & BQ24190_REG_F_CHRG_FAULT_MASK) {
838 switch (v >> BQ24190_REG_F_CHRG_FAULT_SHIFT & 0x3) {
839 case 0x1: /* Input Fault (VBUS OVP or VBAT<VBUS<3.8V) */
841 * This could be over-voltage or under-voltage
842 * and there's no way to tell which. Instead
843 * of looking foolish and returning 'OVERVOLTAGE'
844 * when its really under-voltage, just return
847 health = POWER_SUPPLY_HEALTH_UNSPEC_FAILURE;
849 case 0x2: /* Thermal Shutdown */
850 health = POWER_SUPPLY_HEALTH_OVERHEAT;
852 case 0x3: /* Charge Safety Timer Expiration */
853 health = POWER_SUPPLY_HEALTH_SAFETY_TIMER_EXPIRE;
855 default: /* prevent compiler warning */
858 } else if (v & BQ24190_REG_F_BOOST_FAULT_MASK) {
860 * This could be over-current or over-voltage but there's
861 * no way to tell which. Return 'OVERVOLTAGE' since there
862 * isn't an 'OVERCURRENT' value defined that we can return
863 * even if it was over-current.
865 health = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
867 health = POWER_SUPPLY_HEALTH_GOOD;
870 val->intval = health;
875 static int bq24190_charger_get_online(struct bq24190_dev_info *bdi,
876 union power_supply_propval *val)
878 u8 pg_stat, batfet_disable;
881 ret = bq24190_read_mask(bdi, BQ24190_REG_SS,
882 BQ24190_REG_SS_PG_STAT_MASK,
883 BQ24190_REG_SS_PG_STAT_SHIFT, &pg_stat);
887 ret = bq24190_read_mask(bdi, BQ24190_REG_MOC,
888 BQ24190_REG_MOC_BATFET_DISABLE_MASK,
889 BQ24190_REG_MOC_BATFET_DISABLE_SHIFT, &batfet_disable);
893 val->intval = pg_stat && !batfet_disable;
898 static int bq24190_battery_set_online(struct bq24190_dev_info *bdi,
899 const union power_supply_propval *val);
900 static int bq24190_battery_get_status(struct bq24190_dev_info *bdi,
901 union power_supply_propval *val);
902 static int bq24190_battery_get_temp_alert_max(struct bq24190_dev_info *bdi,
903 union power_supply_propval *val);
904 static int bq24190_battery_set_temp_alert_max(struct bq24190_dev_info *bdi,
905 const union power_supply_propval *val);
907 static int bq24190_charger_set_online(struct bq24190_dev_info *bdi,
908 const union power_supply_propval *val)
910 return bq24190_battery_set_online(bdi, val);
913 static int bq24190_charger_get_status(struct bq24190_dev_info *bdi,
914 union power_supply_propval *val)
916 return bq24190_battery_get_status(bdi, val);
919 static int bq24190_charger_get_temp_alert_max(struct bq24190_dev_info *bdi,
920 union power_supply_propval *val)
922 return bq24190_battery_get_temp_alert_max(bdi, val);
925 static int bq24190_charger_set_temp_alert_max(struct bq24190_dev_info *bdi,
926 const union power_supply_propval *val)
928 return bq24190_battery_set_temp_alert_max(bdi, val);
931 static int bq24190_charger_get_precharge(struct bq24190_dev_info *bdi,
932 union power_supply_propval *val)
937 ret = bq24190_read_mask(bdi, BQ24190_REG_PCTCC,
938 BQ24190_REG_PCTCC_IPRECHG_MASK,
939 BQ24190_REG_PCTCC_IPRECHG_SHIFT, &v);
943 val->intval = ++v * 128 * 1000;
947 static int bq24190_charger_get_charge_term(struct bq24190_dev_info *bdi,
948 union power_supply_propval *val)
953 ret = bq24190_read_mask(bdi, BQ24190_REG_PCTCC,
954 BQ24190_REG_PCTCC_ITERM_MASK,
955 BQ24190_REG_PCTCC_ITERM_SHIFT, &v);
959 val->intval = ++v * 128 * 1000;
963 static int bq24190_charger_get_current(struct bq24190_dev_info *bdi,
964 union power_supply_propval *val)
969 ret = bq24190_get_field_val(bdi, BQ24190_REG_CCC,
970 BQ24190_REG_CCC_ICHG_MASK, BQ24190_REG_CCC_ICHG_SHIFT,
971 bq24190_ccc_ichg_values,
972 ARRAY_SIZE(bq24190_ccc_ichg_values), &curr);
976 ret = bq24190_read_mask(bdi, BQ24190_REG_CCC,
977 BQ24190_REG_CCC_FORCE_20PCT_MASK,
978 BQ24190_REG_CCC_FORCE_20PCT_SHIFT, &v);
982 /* If FORCE_20PCT is enabled, then current is 20% of ICHG value */
990 static int bq24190_charger_get_current_max(struct bq24190_dev_info *bdi,
991 union power_supply_propval *val)
993 int idx = ARRAY_SIZE(bq24190_ccc_ichg_values) - 1;
995 val->intval = bq24190_ccc_ichg_values[idx];
999 static int bq24190_charger_set_current(struct bq24190_dev_info *bdi,
1000 const union power_supply_propval *val)
1003 int ret, curr = val->intval;
1005 ret = bq24190_read_mask(bdi, BQ24190_REG_CCC,
1006 BQ24190_REG_CCC_FORCE_20PCT_MASK,
1007 BQ24190_REG_CCC_FORCE_20PCT_SHIFT, &v);
1011 /* If FORCE_20PCT is enabled, have to multiply value passed in by 5 */
1015 return bq24190_set_field_val(bdi, BQ24190_REG_CCC,
1016 BQ24190_REG_CCC_ICHG_MASK, BQ24190_REG_CCC_ICHG_SHIFT,
1017 bq24190_ccc_ichg_values,
1018 ARRAY_SIZE(bq24190_ccc_ichg_values), curr);
1021 static int bq24190_charger_get_voltage(struct bq24190_dev_info *bdi,
1022 union power_supply_propval *val)
1026 ret = bq24190_get_field_val(bdi, BQ24190_REG_CVC,
1027 BQ24190_REG_CVC_VREG_MASK, BQ24190_REG_CVC_VREG_SHIFT,
1028 bq24190_cvc_vreg_values,
1029 ARRAY_SIZE(bq24190_cvc_vreg_values), &voltage);
1033 val->intval = voltage;
1037 static int bq24190_charger_get_voltage_max(struct bq24190_dev_info *bdi,
1038 union power_supply_propval *val)
1040 int idx = ARRAY_SIZE(bq24190_cvc_vreg_values) - 1;
1042 val->intval = bq24190_cvc_vreg_values[idx];
1046 static int bq24190_charger_set_voltage(struct bq24190_dev_info *bdi,
1047 const union power_supply_propval *val)
1049 return bq24190_set_field_val(bdi, BQ24190_REG_CVC,
1050 BQ24190_REG_CVC_VREG_MASK, BQ24190_REG_CVC_VREG_SHIFT,
1051 bq24190_cvc_vreg_values,
1052 ARRAY_SIZE(bq24190_cvc_vreg_values), val->intval);
1055 static int bq24190_charger_get_iinlimit(struct bq24190_dev_info *bdi,
1056 union power_supply_propval *val)
1060 ret = bq24190_get_field_val(bdi, BQ24190_REG_ISC,
1061 BQ24190_REG_ISC_IINLIM_MASK,
1062 BQ24190_REG_ISC_IINLIM_SHIFT,
1063 bq24190_isc_iinlim_values,
1064 ARRAY_SIZE(bq24190_isc_iinlim_values), &iinlimit);
1068 val->intval = iinlimit;
1072 static int bq24190_charger_set_iinlimit(struct bq24190_dev_info *bdi,
1073 const union power_supply_propval *val)
1075 return bq24190_set_field_val(bdi, BQ24190_REG_ISC,
1076 BQ24190_REG_ISC_IINLIM_MASK,
1077 BQ24190_REG_ISC_IINLIM_SHIFT,
1078 bq24190_isc_iinlim_values,
1079 ARRAY_SIZE(bq24190_isc_iinlim_values), val->intval);
1082 static int bq24190_charger_get_property(struct power_supply *psy,
1083 enum power_supply_property psp, union power_supply_propval *val)
1085 struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
1088 dev_dbg(bdi->dev, "prop: %d\n", psp);
1090 ret = pm_runtime_get_sync(bdi->dev);
1092 pm_runtime_put_noidle(bdi->dev);
1097 case POWER_SUPPLY_PROP_CHARGE_TYPE:
1098 ret = bq24190_charger_get_charge_type(bdi, val);
1100 case POWER_SUPPLY_PROP_HEALTH:
1101 ret = bq24190_charger_get_health(bdi, val);
1103 case POWER_SUPPLY_PROP_ONLINE:
1104 ret = bq24190_charger_get_online(bdi, val);
1106 case POWER_SUPPLY_PROP_STATUS:
1107 ret = bq24190_charger_get_status(bdi, val);
1109 case POWER_SUPPLY_PROP_TEMP_ALERT_MAX:
1110 ret = bq24190_charger_get_temp_alert_max(bdi, val);
1112 case POWER_SUPPLY_PROP_PRECHARGE_CURRENT:
1113 ret = bq24190_charger_get_precharge(bdi, val);
1115 case POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT:
1116 ret = bq24190_charger_get_charge_term(bdi, val);
1118 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
1119 ret = bq24190_charger_get_current(bdi, val);
1121 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX:
1122 ret = bq24190_charger_get_current_max(bdi, val);
1124 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
1125 ret = bq24190_charger_get_voltage(bdi, val);
1127 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX:
1128 ret = bq24190_charger_get_voltage_max(bdi, val);
1130 case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
1131 ret = bq24190_charger_get_iinlimit(bdi, val);
1133 case POWER_SUPPLY_PROP_SCOPE:
1134 val->intval = POWER_SUPPLY_SCOPE_SYSTEM;
1137 case POWER_SUPPLY_PROP_MODEL_NAME:
1138 val->strval = bdi->model_name;
1141 case POWER_SUPPLY_PROP_MANUFACTURER:
1142 val->strval = BQ24190_MANUFACTURER;
1149 pm_runtime_mark_last_busy(bdi->dev);
1150 pm_runtime_put_autosuspend(bdi->dev);
1155 static int bq24190_charger_set_property(struct power_supply *psy,
1156 enum power_supply_property psp,
1157 const union power_supply_propval *val)
1159 struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
1162 dev_dbg(bdi->dev, "prop: %d\n", psp);
1164 ret = pm_runtime_get_sync(bdi->dev);
1166 pm_runtime_put_noidle(bdi->dev);
1171 case POWER_SUPPLY_PROP_ONLINE:
1172 ret = bq24190_charger_set_online(bdi, val);
1174 case POWER_SUPPLY_PROP_TEMP_ALERT_MAX:
1175 ret = bq24190_charger_set_temp_alert_max(bdi, val);
1177 case POWER_SUPPLY_PROP_CHARGE_TYPE:
1178 ret = bq24190_charger_set_charge_type(bdi, val);
1180 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
1181 ret = bq24190_charger_set_current(bdi, val);
1183 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
1184 ret = bq24190_charger_set_voltage(bdi, val);
1186 case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
1187 ret = bq24190_charger_set_iinlimit(bdi, val);
1193 pm_runtime_mark_last_busy(bdi->dev);
1194 pm_runtime_put_autosuspend(bdi->dev);
1199 static int bq24190_charger_property_is_writeable(struct power_supply *psy,
1200 enum power_supply_property psp)
1205 case POWER_SUPPLY_PROP_ONLINE:
1206 case POWER_SUPPLY_PROP_TEMP_ALERT_MAX:
1207 case POWER_SUPPLY_PROP_CHARGE_TYPE:
1208 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
1209 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
1210 case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
1220 static void bq24190_input_current_limit_work(struct work_struct *work)
1222 struct bq24190_dev_info *bdi =
1223 container_of(work, struct bq24190_dev_info,
1224 input_current_limit_work.work);
1226 power_supply_set_input_current_limit_from_supplier(bdi->charger);
1229 /* Sync the input-current-limit with our parent supply (if we have one) */
1230 static void bq24190_charger_external_power_changed(struct power_supply *psy)
1232 struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
1235 * The Power-Good detection may take up to 220ms, sometimes
1236 * the external charger detection is quicker, and the bq24190 will
1237 * reset to iinlim based on its own charger detection (which is not
1238 * hooked up when using external charger detection) resulting in a
1239 * too low default 500mA iinlim. Delay setting the input-current-limit
1240 * for 300ms to avoid this.
1242 queue_delayed_work(system_wq, &bdi->input_current_limit_work,
1243 msecs_to_jiffies(300));
1246 static enum power_supply_property bq24190_charger_properties[] = {
1247 POWER_SUPPLY_PROP_CHARGE_TYPE,
1248 POWER_SUPPLY_PROP_HEALTH,
1249 POWER_SUPPLY_PROP_ONLINE,
1250 POWER_SUPPLY_PROP_STATUS,
1251 POWER_SUPPLY_PROP_TEMP_ALERT_MAX,
1252 POWER_SUPPLY_PROP_PRECHARGE_CURRENT,
1253 POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT,
1254 POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT,
1255 POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX,
1256 POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE,
1257 POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX,
1258 POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT,
1259 POWER_SUPPLY_PROP_SCOPE,
1260 POWER_SUPPLY_PROP_MODEL_NAME,
1261 POWER_SUPPLY_PROP_MANUFACTURER,
1264 static char *bq24190_charger_supplied_to[] = {
1268 static const struct power_supply_desc bq24190_charger_desc = {
1269 .name = "bq24190-charger",
1270 .type = POWER_SUPPLY_TYPE_USB,
1271 .properties = bq24190_charger_properties,
1272 .num_properties = ARRAY_SIZE(bq24190_charger_properties),
1273 .get_property = bq24190_charger_get_property,
1274 .set_property = bq24190_charger_set_property,
1275 .property_is_writeable = bq24190_charger_property_is_writeable,
1276 .external_power_changed = bq24190_charger_external_power_changed,
1279 /* Battery power supply property routines */
1281 static int bq24190_battery_get_status(struct bq24190_dev_info *bdi,
1282 union power_supply_propval *val)
1284 u8 ss_reg, chrg_fault;
1287 mutex_lock(&bdi->f_reg_lock);
1288 chrg_fault = bdi->f_reg;
1289 mutex_unlock(&bdi->f_reg_lock);
1291 chrg_fault &= BQ24190_REG_F_CHRG_FAULT_MASK;
1292 chrg_fault >>= BQ24190_REG_F_CHRG_FAULT_SHIFT;
1294 ret = bq24190_read(bdi, BQ24190_REG_SS, &ss_reg);
1299 * The battery must be discharging when any of these are true:
1300 * - there is no good power source;
1301 * - there is a charge fault.
1302 * Could also be discharging when in "supplement mode" but
1303 * there is no way to tell when its in that mode.
1305 if (!(ss_reg & BQ24190_REG_SS_PG_STAT_MASK) || chrg_fault) {
1306 status = POWER_SUPPLY_STATUS_DISCHARGING;
1308 ss_reg &= BQ24190_REG_SS_CHRG_STAT_MASK;
1309 ss_reg >>= BQ24190_REG_SS_CHRG_STAT_SHIFT;
1312 case 0x0: /* Not Charging */
1313 status = POWER_SUPPLY_STATUS_NOT_CHARGING;
1315 case 0x1: /* Pre-charge */
1316 case 0x2: /* Fast Charging */
1317 status = POWER_SUPPLY_STATUS_CHARGING;
1319 case 0x3: /* Charge Termination Done */
1320 status = POWER_SUPPLY_STATUS_FULL;
1328 val->intval = status;
1333 static int bq24190_battery_get_health(struct bq24190_dev_info *bdi,
1334 union power_supply_propval *val)
1339 mutex_lock(&bdi->f_reg_lock);
1341 mutex_unlock(&bdi->f_reg_lock);
1343 if (v & BQ24190_REG_F_BAT_FAULT_MASK) {
1344 health = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
1346 v &= BQ24190_REG_F_NTC_FAULT_MASK;
1347 v >>= BQ24190_REG_F_NTC_FAULT_SHIFT;
1350 case 0x0: /* Normal */
1351 health = POWER_SUPPLY_HEALTH_GOOD;
1353 case 0x1: /* TS1 Cold */
1354 case 0x3: /* TS2 Cold */
1355 case 0x5: /* Both Cold */
1356 health = POWER_SUPPLY_HEALTH_COLD;
1358 case 0x2: /* TS1 Hot */
1359 case 0x4: /* TS2 Hot */
1360 case 0x6: /* Both Hot */
1361 health = POWER_SUPPLY_HEALTH_OVERHEAT;
1364 health = POWER_SUPPLY_HEALTH_UNKNOWN;
1368 val->intval = health;
1372 static int bq24190_battery_get_online(struct bq24190_dev_info *bdi,
1373 union power_supply_propval *val)
1378 ret = bq24190_read_mask(bdi, BQ24190_REG_MOC,
1379 BQ24190_REG_MOC_BATFET_DISABLE_MASK,
1380 BQ24190_REG_MOC_BATFET_DISABLE_SHIFT, &batfet_disable);
1384 val->intval = !batfet_disable;
1388 static int bq24190_battery_set_online(struct bq24190_dev_info *bdi,
1389 const union power_supply_propval *val)
1391 return bq24190_write_mask(bdi, BQ24190_REG_MOC,
1392 BQ24190_REG_MOC_BATFET_DISABLE_MASK,
1393 BQ24190_REG_MOC_BATFET_DISABLE_SHIFT, !val->intval);
1396 static int bq24190_battery_get_temp_alert_max(struct bq24190_dev_info *bdi,
1397 union power_supply_propval *val)
1401 ret = bq24190_get_field_val(bdi, BQ24190_REG_ICTRC,
1402 BQ24190_REG_ICTRC_TREG_MASK,
1403 BQ24190_REG_ICTRC_TREG_SHIFT,
1404 bq24190_ictrc_treg_values,
1405 ARRAY_SIZE(bq24190_ictrc_treg_values), &temp);
1413 static int bq24190_battery_set_temp_alert_max(struct bq24190_dev_info *bdi,
1414 const union power_supply_propval *val)
1416 return bq24190_set_field_val(bdi, BQ24190_REG_ICTRC,
1417 BQ24190_REG_ICTRC_TREG_MASK,
1418 BQ24190_REG_ICTRC_TREG_SHIFT,
1419 bq24190_ictrc_treg_values,
1420 ARRAY_SIZE(bq24190_ictrc_treg_values), val->intval);
1423 static int bq24190_battery_get_property(struct power_supply *psy,
1424 enum power_supply_property psp, union power_supply_propval *val)
1426 struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
1429 dev_warn(bdi->dev, "warning: /sys/class/power_supply/bq24190-battery is deprecated\n");
1430 dev_dbg(bdi->dev, "prop: %d\n", psp);
1432 ret = pm_runtime_get_sync(bdi->dev);
1434 pm_runtime_put_noidle(bdi->dev);
1439 case POWER_SUPPLY_PROP_STATUS:
1440 ret = bq24190_battery_get_status(bdi, val);
1442 case POWER_SUPPLY_PROP_HEALTH:
1443 ret = bq24190_battery_get_health(bdi, val);
1445 case POWER_SUPPLY_PROP_ONLINE:
1446 ret = bq24190_battery_get_online(bdi, val);
1448 case POWER_SUPPLY_PROP_TECHNOLOGY:
1449 /* Could be Li-on or Li-polymer but no way to tell which */
1450 val->intval = POWER_SUPPLY_TECHNOLOGY_UNKNOWN;
1453 case POWER_SUPPLY_PROP_TEMP_ALERT_MAX:
1454 ret = bq24190_battery_get_temp_alert_max(bdi, val);
1456 case POWER_SUPPLY_PROP_SCOPE:
1457 val->intval = POWER_SUPPLY_SCOPE_SYSTEM;
1464 pm_runtime_mark_last_busy(bdi->dev);
1465 pm_runtime_put_autosuspend(bdi->dev);
1470 static int bq24190_battery_set_property(struct power_supply *psy,
1471 enum power_supply_property psp,
1472 const union power_supply_propval *val)
1474 struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
1477 dev_warn(bdi->dev, "warning: /sys/class/power_supply/bq24190-battery is deprecated\n");
1478 dev_dbg(bdi->dev, "prop: %d\n", psp);
1480 ret = pm_runtime_get_sync(bdi->dev);
1482 pm_runtime_put_noidle(bdi->dev);
1487 case POWER_SUPPLY_PROP_ONLINE:
1488 ret = bq24190_battery_set_online(bdi, val);
1490 case POWER_SUPPLY_PROP_TEMP_ALERT_MAX:
1491 ret = bq24190_battery_set_temp_alert_max(bdi, val);
1497 pm_runtime_mark_last_busy(bdi->dev);
1498 pm_runtime_put_autosuspend(bdi->dev);
1503 static int bq24190_battery_property_is_writeable(struct power_supply *psy,
1504 enum power_supply_property psp)
1509 case POWER_SUPPLY_PROP_ONLINE:
1510 case POWER_SUPPLY_PROP_TEMP_ALERT_MAX:
1520 static enum power_supply_property bq24190_battery_properties[] = {
1521 POWER_SUPPLY_PROP_STATUS,
1522 POWER_SUPPLY_PROP_HEALTH,
1523 POWER_SUPPLY_PROP_ONLINE,
1524 POWER_SUPPLY_PROP_TECHNOLOGY,
1525 POWER_SUPPLY_PROP_TEMP_ALERT_MAX,
1526 POWER_SUPPLY_PROP_SCOPE,
1529 static const struct power_supply_desc bq24190_battery_desc = {
1530 .name = "bq24190-battery",
1531 .type = POWER_SUPPLY_TYPE_BATTERY,
1532 .properties = bq24190_battery_properties,
1533 .num_properties = ARRAY_SIZE(bq24190_battery_properties),
1534 .get_property = bq24190_battery_get_property,
1535 .set_property = bq24190_battery_set_property,
1536 .property_is_writeable = bq24190_battery_property_is_writeable,
1539 static void bq24190_check_status(struct bq24190_dev_info *bdi)
1541 const u8 battery_mask_ss = BQ24190_REG_SS_CHRG_STAT_MASK;
1542 const u8 battery_mask_f = BQ24190_REG_F_BAT_FAULT_MASK
1543 | BQ24190_REG_F_NTC_FAULT_MASK;
1544 bool alert_charger = false, alert_battery = false;
1545 u8 ss_reg = 0, f_reg = 0;
1548 ret = bq24190_read(bdi, BQ24190_REG_SS, &ss_reg);
1550 dev_err(bdi->dev, "Can't read SS reg: %d\n", ret);
1556 ret = bq24190_read(bdi, BQ24190_REG_F, &f_reg);
1558 dev_err(bdi->dev, "Can't read F reg: %d\n", ret);
1561 } while (f_reg && ++i < 2);
1563 /* ignore over/under voltage fault after disconnect */
1564 if (f_reg == (1 << BQ24190_REG_F_CHRG_FAULT_SHIFT) &&
1565 !(ss_reg & BQ24190_REG_SS_PG_STAT_MASK))
1568 if (f_reg != bdi->f_reg) {
1570 "Fault: boost %d, charge %d, battery %d, ntc %d\n",
1571 !!(f_reg & BQ24190_REG_F_BOOST_FAULT_MASK),
1572 !!(f_reg & BQ24190_REG_F_CHRG_FAULT_MASK),
1573 !!(f_reg & BQ24190_REG_F_BAT_FAULT_MASK),
1574 !!(f_reg & BQ24190_REG_F_NTC_FAULT_MASK));
1576 mutex_lock(&bdi->f_reg_lock);
1577 if ((bdi->f_reg & battery_mask_f) != (f_reg & battery_mask_f))
1578 alert_battery = true;
1579 if ((bdi->f_reg & ~battery_mask_f) != (f_reg & ~battery_mask_f))
1580 alert_charger = true;
1582 mutex_unlock(&bdi->f_reg_lock);
1585 if (ss_reg != bdi->ss_reg) {
1587 * The device is in host mode so when PG_STAT goes from 1->0
1588 * (i.e., power removed) HIZ needs to be disabled.
1590 if ((bdi->ss_reg & BQ24190_REG_SS_PG_STAT_MASK) &&
1591 !(ss_reg & BQ24190_REG_SS_PG_STAT_MASK)) {
1592 ret = bq24190_write_mask(bdi, BQ24190_REG_ISC,
1593 BQ24190_REG_ISC_EN_HIZ_MASK,
1594 BQ24190_REG_ISC_EN_HIZ_SHIFT,
1597 dev_err(bdi->dev, "Can't access ISC reg: %d\n",
1601 if ((bdi->ss_reg & battery_mask_ss) != (ss_reg & battery_mask_ss))
1602 alert_battery = true;
1603 if ((bdi->ss_reg & ~battery_mask_ss) != (ss_reg & ~battery_mask_ss))
1604 alert_charger = true;
1605 bdi->ss_reg = ss_reg;
1608 if (alert_charger || alert_battery)
1609 power_supply_changed(bdi->charger);
1610 if (alert_battery && bdi->battery)
1611 power_supply_changed(bdi->battery);
1613 dev_dbg(bdi->dev, "ss_reg: 0x%02x, f_reg: 0x%02x\n", ss_reg, f_reg);
1616 static irqreturn_t bq24190_irq_handler_thread(int irq, void *data)
1618 struct bq24190_dev_info *bdi = data;
1621 bdi->irq_event = true;
1622 error = pm_runtime_get_sync(bdi->dev);
1624 dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", error);
1625 pm_runtime_put_noidle(bdi->dev);
1628 bq24190_check_status(bdi);
1629 pm_runtime_mark_last_busy(bdi->dev);
1630 pm_runtime_put_autosuspend(bdi->dev);
1631 bdi->irq_event = false;
1636 static void bq24190_extcon_work(struct work_struct *work)
1638 struct bq24190_dev_info *bdi =
1639 container_of(work, struct bq24190_dev_info, extcon_work.work);
1640 int error, iinlim = 0;
1643 error = pm_runtime_get_sync(bdi->dev);
1645 dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", error);
1646 pm_runtime_put_noidle(bdi->dev);
1650 if (extcon_get_state(bdi->extcon, EXTCON_CHG_USB_SDP) == 1)
1652 else if (extcon_get_state(bdi->extcon, EXTCON_CHG_USB_CDP) == 1 ||
1653 extcon_get_state(bdi->extcon, EXTCON_CHG_USB_ACA) == 1)
1655 else if (extcon_get_state(bdi->extcon, EXTCON_CHG_USB_DCP) == 1)
1659 error = bq24190_set_field_val(bdi, BQ24190_REG_ISC,
1660 BQ24190_REG_ISC_IINLIM_MASK,
1661 BQ24190_REG_ISC_IINLIM_SHIFT,
1662 bq24190_isc_iinlim_values,
1663 ARRAY_SIZE(bq24190_isc_iinlim_values),
1666 dev_err(bdi->dev, "Can't set IINLIM: %d\n", error);
1669 /* if no charger found and in USB host mode, set OTG 5V boost, else normal */
1670 if (!iinlim && extcon_get_state(bdi->extcon, EXTCON_USB_HOST) == 1)
1671 v = BQ24190_REG_POC_CHG_CONFIG_OTG;
1673 v = BQ24190_REG_POC_CHG_CONFIG_CHARGE;
1675 error = bq24190_write_mask(bdi, BQ24190_REG_POC,
1676 BQ24190_REG_POC_CHG_CONFIG_MASK,
1677 BQ24190_REG_POC_CHG_CONFIG_SHIFT,
1680 dev_err(bdi->dev, "Can't set CHG_CONFIG: %d\n", error);
1682 pm_runtime_mark_last_busy(bdi->dev);
1683 pm_runtime_put_autosuspend(bdi->dev);
1686 static int bq24190_extcon_event(struct notifier_block *nb, unsigned long event,
1689 struct bq24190_dev_info *bdi =
1690 container_of(nb, struct bq24190_dev_info, extcon_nb);
1693 * The Power-Good detection may take up to 220ms, sometimes
1694 * the external charger detection is quicker, and the bq24190 will
1695 * reset to iinlim based on its own charger detection (which is not
1696 * hooked up when using external charger detection) resulting in
1697 * a too low default 500mA iinlim. Delay applying the extcon value
1698 * for 300ms to avoid this.
1700 queue_delayed_work(system_wq, &bdi->extcon_work, msecs_to_jiffies(300));
1705 static int bq24190_hw_init(struct bq24190_dev_info *bdi)
1710 /* First check that the device really is what its supposed to be */
1711 ret = bq24190_read_mask(bdi, BQ24190_REG_VPRS,
1712 BQ24190_REG_VPRS_PN_MASK,
1713 BQ24190_REG_VPRS_PN_SHIFT,
1718 if (v != BQ24190_REG_VPRS_PN_24190 &&
1719 v != BQ24190_REG_VPRS_PN_24192I) {
1720 dev_err(bdi->dev, "Error unknown model: 0x%02x\n", v);
1724 ret = bq24190_register_reset(bdi);
1728 ret = bq24190_set_config(bdi);
1732 return bq24190_read(bdi, BQ24190_REG_SS, &bdi->ss_reg);
1735 static int bq24190_get_config(struct bq24190_dev_info *bdi)
1737 const char * const s = "ti,system-minimum-microvolt";
1738 struct power_supply_battery_info info = {};
1741 if (device_property_read_u32(bdi->dev, s, &v) == 0) {
1743 if (v >= BQ24190_REG_POC_SYS_MIN_MIN
1744 && v <= BQ24190_REG_POC_SYS_MIN_MAX)
1747 dev_warn(bdi->dev, "invalid value for %s: %u\n", s, v);
1750 if (bdi->dev->of_node &&
1751 !power_supply_get_battery_info(bdi->charger, &info)) {
1752 v = info.precharge_current_ua / 1000;
1753 if (v >= BQ24190_REG_PCTCC_IPRECHG_MIN
1754 && v <= BQ24190_REG_PCTCC_IPRECHG_MAX)
1757 dev_warn(bdi->dev, "invalid value for battery:precharge-current-microamp: %d\n",
1760 v = info.charge_term_current_ua / 1000;
1761 if (v >= BQ24190_REG_PCTCC_ITERM_MIN
1762 && v <= BQ24190_REG_PCTCC_ITERM_MAX)
1765 dev_warn(bdi->dev, "invalid value for battery:charge-term-current-microamp: %d\n",
1772 static int bq24190_probe(struct i2c_client *client,
1773 const struct i2c_device_id *id)
1775 struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);
1776 struct device *dev = &client->dev;
1777 struct power_supply_config charger_cfg = {}, battery_cfg = {};
1778 struct bq24190_dev_info *bdi;
1782 if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) {
1783 dev_err(dev, "No support for SMBUS_BYTE_DATA\n");
1787 bdi = devm_kzalloc(dev, sizeof(*bdi), GFP_KERNEL);
1789 dev_err(dev, "Can't alloc bdi struct\n");
1793 bdi->client = client;
1795 strncpy(bdi->model_name, id->name, I2C_NAME_SIZE);
1796 mutex_init(&bdi->f_reg_lock);
1798 bdi->ss_reg = BQ24190_REG_SS_VBUS_STAT_MASK; /* impossible state */
1799 INIT_DELAYED_WORK(&bdi->input_current_limit_work,
1800 bq24190_input_current_limit_work);
1802 i2c_set_clientdata(client, bdi);
1804 if (client->irq <= 0) {
1805 dev_err(dev, "Can't get irq info\n");
1810 * Devicetree platforms should get extcon via phandle (not yet supported).
1811 * On ACPI platforms, extcon clients may invoke us with:
1812 * struct property_entry pe[] =
1813 * { PROPERTY_ENTRY_STRING("extcon-name", client_name), ... };
1814 * struct i2c_board_info bi =
1815 * { .type = "bq24190", .addr = 0x6b, .properties = pe, .irq = irq };
1816 * struct i2c_adapter ad = { ... };
1817 * i2c_add_adapter(&ad);
1818 * i2c_new_device(&ad, &bi);
1820 if (device_property_read_string(dev, "extcon-name", &name) == 0) {
1821 bdi->extcon = extcon_get_extcon_dev(name);
1823 return -EPROBE_DEFER;
1825 dev_info(bdi->dev, "using extcon device %s\n", name);
1828 pm_runtime_enable(dev);
1829 pm_runtime_use_autosuspend(dev);
1830 pm_runtime_set_autosuspend_delay(dev, 600);
1831 ret = pm_runtime_get_sync(dev);
1833 dev_err(dev, "pm_runtime_get failed: %i\n", ret);
1837 charger_cfg.drv_data = bdi;
1838 charger_cfg.of_node = dev->of_node;
1839 charger_cfg.supplied_to = bq24190_charger_supplied_to;
1840 charger_cfg.num_supplicants = ARRAY_SIZE(bq24190_charger_supplied_to),
1841 bdi->charger = power_supply_register(dev, &bq24190_charger_desc,
1843 if (IS_ERR(bdi->charger)) {
1844 dev_err(dev, "Can't register charger\n");
1845 ret = PTR_ERR(bdi->charger);
1849 /* the battery class is deprecated and will be removed. */
1850 /* in the interim, this property hides it. */
1851 if (!device_property_read_bool(dev, "omit-battery-class")) {
1852 battery_cfg.drv_data = bdi;
1853 bdi->battery = power_supply_register(dev, &bq24190_battery_desc,
1855 if (IS_ERR(bdi->battery)) {
1856 dev_err(dev, "Can't register battery\n");
1857 ret = PTR_ERR(bdi->battery);
1862 ret = bq24190_get_config(bdi);
1864 dev_err(dev, "Can't get devicetree config\n");
1868 ret = bq24190_hw_init(bdi);
1870 dev_err(dev, "Hardware init failed\n");
1874 ret = bq24190_sysfs_create_group(bdi);
1876 dev_err(dev, "Can't create sysfs entries\n");
1880 bdi->initialized = true;
1882 ret = devm_request_threaded_irq(dev, client->irq, NULL,
1883 bq24190_irq_handler_thread,
1884 IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
1885 "bq24190-charger", bdi);
1887 dev_err(dev, "Can't set up irq handler\n");
1891 ret = bq24190_register_vbus_regulator(bdi);
1896 INIT_DELAYED_WORK(&bdi->extcon_work, bq24190_extcon_work);
1897 bdi->extcon_nb.notifier_call = bq24190_extcon_event;
1898 ret = devm_extcon_register_notifier_all(dev, bdi->extcon,
1901 dev_err(dev, "Can't register extcon\n");
1905 /* Sync initial cable state */
1906 queue_delayed_work(system_wq, &bdi->extcon_work, 0);
1909 enable_irq_wake(client->irq);
1911 pm_runtime_mark_last_busy(dev);
1912 pm_runtime_put_autosuspend(dev);
1917 bq24190_sysfs_remove_group(bdi);
1920 if (!IS_ERR_OR_NULL(bdi->battery))
1921 power_supply_unregister(bdi->battery);
1922 power_supply_unregister(bdi->charger);
1925 pm_runtime_put_sync(dev);
1926 pm_runtime_dont_use_autosuspend(dev);
1927 pm_runtime_disable(dev);
1931 static int bq24190_remove(struct i2c_client *client)
1933 struct bq24190_dev_info *bdi = i2c_get_clientdata(client);
1936 error = pm_runtime_get_sync(bdi->dev);
1938 dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", error);
1939 pm_runtime_put_noidle(bdi->dev);
1942 bq24190_register_reset(bdi);
1943 bq24190_sysfs_remove_group(bdi);
1945 power_supply_unregister(bdi->battery);
1946 power_supply_unregister(bdi->charger);
1948 pm_runtime_put_sync(bdi->dev);
1949 pm_runtime_dont_use_autosuspend(bdi->dev);
1950 pm_runtime_disable(bdi->dev);
1955 static __maybe_unused int bq24190_runtime_suspend(struct device *dev)
1957 struct i2c_client *client = to_i2c_client(dev);
1958 struct bq24190_dev_info *bdi = i2c_get_clientdata(client);
1960 if (!bdi->initialized)
1963 dev_dbg(bdi->dev, "%s\n", __func__);
1968 static __maybe_unused int bq24190_runtime_resume(struct device *dev)
1970 struct i2c_client *client = to_i2c_client(dev);
1971 struct bq24190_dev_info *bdi = i2c_get_clientdata(client);
1973 if (!bdi->initialized)
1976 if (!bdi->irq_event) {
1977 dev_dbg(bdi->dev, "checking events on possible wakeirq\n");
1978 bq24190_check_status(bdi);
1984 static __maybe_unused int bq24190_pm_suspend(struct device *dev)
1986 struct i2c_client *client = to_i2c_client(dev);
1987 struct bq24190_dev_info *bdi = i2c_get_clientdata(client);
1990 error = pm_runtime_get_sync(bdi->dev);
1992 dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", error);
1993 pm_runtime_put_noidle(bdi->dev);
1996 bq24190_register_reset(bdi);
1999 pm_runtime_mark_last_busy(bdi->dev);
2000 pm_runtime_put_autosuspend(bdi->dev);
2006 static __maybe_unused int bq24190_pm_resume(struct device *dev)
2008 struct i2c_client *client = to_i2c_client(dev);
2009 struct bq24190_dev_info *bdi = i2c_get_clientdata(client);
2013 bdi->ss_reg = BQ24190_REG_SS_VBUS_STAT_MASK; /* impossible state */
2015 error = pm_runtime_get_sync(bdi->dev);
2017 dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", error);
2018 pm_runtime_put_noidle(bdi->dev);
2021 bq24190_register_reset(bdi);
2022 bq24190_set_config(bdi);
2023 bq24190_read(bdi, BQ24190_REG_SS, &bdi->ss_reg);
2026 pm_runtime_mark_last_busy(bdi->dev);
2027 pm_runtime_put_autosuspend(bdi->dev);
2030 /* Things may have changed while suspended so alert upper layer */
2031 power_supply_changed(bdi->charger);
2033 power_supply_changed(bdi->battery);
2038 static const struct dev_pm_ops bq24190_pm_ops = {
2039 SET_RUNTIME_PM_OPS(bq24190_runtime_suspend, bq24190_runtime_resume,
2041 SET_SYSTEM_SLEEP_PM_OPS(bq24190_pm_suspend, bq24190_pm_resume)
2044 static const struct i2c_device_id bq24190_i2c_ids[] = {
2049 MODULE_DEVICE_TABLE(i2c, bq24190_i2c_ids);
2052 static const struct of_device_id bq24190_of_match[] = {
2053 { .compatible = "ti,bq24190", },
2054 { .compatible = "ti,bq24192i", },
2057 MODULE_DEVICE_TABLE(of, bq24190_of_match);
2059 static const struct of_device_id bq24190_of_match[] = {
2064 static struct i2c_driver bq24190_driver = {
2065 .probe = bq24190_probe,
2066 .remove = bq24190_remove,
2067 .id_table = bq24190_i2c_ids,
2069 .name = "bq24190-charger",
2070 .pm = &bq24190_pm_ops,
2071 .of_match_table = of_match_ptr(bq24190_of_match),
2074 module_i2c_driver(bq24190_driver);
2076 MODULE_LICENSE("GPL");
2077 MODULE_AUTHOR("Mark A. Greer <mgreer@animalcreek.com>");
2078 MODULE_DESCRIPTION("TI BQ24190 Charger Driver");