1 // SPDX-License-Identifier: GPL-2.0-only
3 * Driver for the TI bq24190 battery charger.
5 * Author: Mark A. Greer <mgreer@animalcreek.com>
8 #include <linux/mod_devicetable.h>
9 #include <linux/module.h>
10 #include <linux/interrupt.h>
11 #include <linux/delay.h>
12 #include <linux/pm_runtime.h>
13 #include <linux/power_supply.h>
14 #include <linux/power/bq24190_charger.h>
15 #include <linux/regulator/driver.h>
16 #include <linux/regulator/machine.h>
17 #include <linux/workqueue.h>
18 #include <linux/i2c.h>
19 #include <linux/extcon-provider.h>
21 #define BQ24190_MANUFACTURER "Texas Instruments"
23 #define BQ24190_REG_ISC 0x00 /* Input Source Control */
24 #define BQ24190_REG_ISC_EN_HIZ_MASK BIT(7)
25 #define BQ24190_REG_ISC_EN_HIZ_SHIFT 7
26 #define BQ24190_REG_ISC_VINDPM_MASK (BIT(6) | BIT(5) | BIT(4) | \
28 #define BQ24190_REG_ISC_VINDPM_SHIFT 3
29 #define BQ24190_REG_ISC_IINLIM_MASK (BIT(2) | BIT(1) | BIT(0))
30 #define BQ24190_REG_ISC_IINLIM_SHIFT 0
32 #define BQ24190_REG_POC 0x01 /* Power-On Configuration */
33 #define BQ24190_REG_POC_RESET_MASK BIT(7)
34 #define BQ24190_REG_POC_RESET_SHIFT 7
35 #define BQ24190_REG_POC_WDT_RESET_MASK BIT(6)
36 #define BQ24190_REG_POC_WDT_RESET_SHIFT 6
37 #define BQ24190_REG_POC_CHG_CONFIG_MASK (BIT(5) | BIT(4))
38 #define BQ24190_REG_POC_CHG_CONFIG_SHIFT 4
39 #define BQ24190_REG_POC_CHG_CONFIG_DISABLE 0x0
40 #define BQ24190_REG_POC_CHG_CONFIG_CHARGE 0x1
41 #define BQ24190_REG_POC_CHG_CONFIG_OTG 0x2
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_SYS_MIN_MIN 3000
45 #define BQ24190_REG_POC_SYS_MIN_MAX 3700
46 #define BQ24190_REG_POC_BOOST_LIM_MASK BIT(0)
47 #define BQ24190_REG_POC_BOOST_LIM_SHIFT 0
49 #define BQ24190_REG_CCC 0x02 /* Charge Current Control */
50 #define BQ24190_REG_CCC_ICHG_MASK (BIT(7) | BIT(6) | BIT(5) | \
51 BIT(4) | BIT(3) | BIT(2))
52 #define BQ24190_REG_CCC_ICHG_SHIFT 2
53 #define BQ24190_REG_CCC_FORCE_20PCT_MASK BIT(0)
54 #define BQ24190_REG_CCC_FORCE_20PCT_SHIFT 0
56 #define BQ24190_REG_PCTCC 0x03 /* Pre-charge/Termination Current Cntl */
57 #define BQ24190_REG_PCTCC_IPRECHG_MASK (BIT(7) | BIT(6) | BIT(5) | \
59 #define BQ24190_REG_PCTCC_IPRECHG_SHIFT 4
60 #define BQ24190_REG_PCTCC_IPRECHG_MIN 128
61 #define BQ24190_REG_PCTCC_IPRECHG_MAX 2048
62 #define BQ24190_REG_PCTCC_ITERM_MASK (BIT(3) | BIT(2) | BIT(1) | \
64 #define BQ24190_REG_PCTCC_ITERM_SHIFT 0
65 #define BQ24190_REG_PCTCC_ITERM_MIN 128
66 #define BQ24190_REG_PCTCC_ITERM_MAX 2048
68 #define BQ24190_REG_CVC 0x04 /* Charge Voltage Control */
69 #define BQ24190_REG_CVC_VREG_MASK (BIT(7) | BIT(6) | BIT(5) | \
70 BIT(4) | BIT(3) | BIT(2))
71 #define BQ24190_REG_CVC_VREG_SHIFT 2
72 #define BQ24190_REG_CVC_BATLOWV_MASK BIT(1)
73 #define BQ24190_REG_CVC_BATLOWV_SHIFT 1
74 #define BQ24190_REG_CVC_VRECHG_MASK BIT(0)
75 #define BQ24190_REG_CVC_VRECHG_SHIFT 0
77 #define BQ24190_REG_CTTC 0x05 /* Charge Term/Timer Control */
78 #define BQ24190_REG_CTTC_EN_TERM_MASK BIT(7)
79 #define BQ24190_REG_CTTC_EN_TERM_SHIFT 7
80 #define BQ24190_REG_CTTC_TERM_STAT_MASK BIT(6)
81 #define BQ24190_REG_CTTC_TERM_STAT_SHIFT 6
82 #define BQ24190_REG_CTTC_WATCHDOG_MASK (BIT(5) | BIT(4))
83 #define BQ24190_REG_CTTC_WATCHDOG_SHIFT 4
84 #define BQ24190_REG_CTTC_EN_TIMER_MASK BIT(3)
85 #define BQ24190_REG_CTTC_EN_TIMER_SHIFT 3
86 #define BQ24190_REG_CTTC_CHG_TIMER_MASK (BIT(2) | BIT(1))
87 #define BQ24190_REG_CTTC_CHG_TIMER_SHIFT 1
88 #define BQ24190_REG_CTTC_JEITA_ISET_MASK BIT(0)
89 #define BQ24190_REG_CTTC_JEITA_ISET_SHIFT 0
91 #define BQ24190_REG_ICTRC 0x06 /* IR Comp/Thermal Regulation Control */
92 #define BQ24190_REG_ICTRC_BAT_COMP_MASK (BIT(7) | BIT(6) | BIT(5))
93 #define BQ24190_REG_ICTRC_BAT_COMP_SHIFT 5
94 #define BQ24190_REG_ICTRC_VCLAMP_MASK (BIT(4) | BIT(3) | BIT(2))
95 #define BQ24190_REG_ICTRC_VCLAMP_SHIFT 2
96 #define BQ24190_REG_ICTRC_TREG_MASK (BIT(1) | BIT(0))
97 #define BQ24190_REG_ICTRC_TREG_SHIFT 0
99 #define BQ24190_REG_MOC 0x07 /* Misc. Operation Control */
100 #define BQ24190_REG_MOC_DPDM_EN_MASK BIT(7)
101 #define BQ24190_REG_MOC_DPDM_EN_SHIFT 7
102 #define BQ24190_REG_MOC_TMR2X_EN_MASK BIT(6)
103 #define BQ24190_REG_MOC_TMR2X_EN_SHIFT 6
104 #define BQ24190_REG_MOC_BATFET_DISABLE_MASK BIT(5)
105 #define BQ24190_REG_MOC_BATFET_DISABLE_SHIFT 5
106 #define BQ24190_REG_MOC_JEITA_VSET_MASK BIT(4)
107 #define BQ24190_REG_MOC_JEITA_VSET_SHIFT 4
108 #define BQ24190_REG_MOC_INT_MASK_MASK (BIT(1) | BIT(0))
109 #define BQ24190_REG_MOC_INT_MASK_SHIFT 0
111 #define BQ24190_REG_SS 0x08 /* System Status */
112 #define BQ24190_REG_SS_VBUS_STAT_MASK (BIT(7) | BIT(6))
113 #define BQ24190_REG_SS_VBUS_STAT_SHIFT 6
114 #define BQ24190_REG_SS_CHRG_STAT_MASK (BIT(5) | BIT(4))
115 #define BQ24190_REG_SS_CHRG_STAT_SHIFT 4
116 #define BQ24190_REG_SS_DPM_STAT_MASK BIT(3)
117 #define BQ24190_REG_SS_DPM_STAT_SHIFT 3
118 #define BQ24190_REG_SS_PG_STAT_MASK BIT(2)
119 #define BQ24190_REG_SS_PG_STAT_SHIFT 2
120 #define BQ24190_REG_SS_THERM_STAT_MASK BIT(1)
121 #define BQ24190_REG_SS_THERM_STAT_SHIFT 1
122 #define BQ24190_REG_SS_VSYS_STAT_MASK BIT(0)
123 #define BQ24190_REG_SS_VSYS_STAT_SHIFT 0
125 #define BQ24190_REG_F 0x09 /* Fault */
126 #define BQ24190_REG_F_WATCHDOG_FAULT_MASK BIT(7)
127 #define BQ24190_REG_F_WATCHDOG_FAULT_SHIFT 7
128 #define BQ24190_REG_F_BOOST_FAULT_MASK BIT(6)
129 #define BQ24190_REG_F_BOOST_FAULT_SHIFT 6
130 #define BQ24190_REG_F_CHRG_FAULT_MASK (BIT(5) | BIT(4))
131 #define BQ24190_REG_F_CHRG_FAULT_SHIFT 4
132 #define BQ24190_REG_F_BAT_FAULT_MASK BIT(3)
133 #define BQ24190_REG_F_BAT_FAULT_SHIFT 3
134 #define BQ24190_REG_F_NTC_FAULT_MASK (BIT(2) | BIT(1) | BIT(0))
135 #define BQ24190_REG_F_NTC_FAULT_SHIFT 0
137 #define BQ24190_REG_VPRS 0x0A /* Vendor/Part/Revision Status */
138 #define BQ24190_REG_VPRS_PN_MASK (BIT(5) | BIT(4) | BIT(3))
139 #define BQ24190_REG_VPRS_PN_SHIFT 3
140 #define BQ24190_REG_VPRS_PN_24190 0x4
141 #define BQ24190_REG_VPRS_PN_24192 0x5 /* Also 24193, 24196 */
142 #define BQ24190_REG_VPRS_PN_24192I 0x3
143 #define BQ24190_REG_VPRS_TS_PROFILE_MASK BIT(2)
144 #define BQ24190_REG_VPRS_TS_PROFILE_SHIFT 2
145 #define BQ24190_REG_VPRS_DEV_REG_MASK (BIT(1) | BIT(0))
146 #define BQ24190_REG_VPRS_DEV_REG_SHIFT 0
149 * The FAULT register is latched by the bq24190 (except for NTC_FAULT)
150 * so the first read after a fault returns the latched value and subsequent
151 * reads return the current value. In order to return the fault status
152 * to the user, have the interrupt handler save the reg's value and retrieve
153 * it in the appropriate health/status routine.
155 struct bq24190_dev_info {
156 struct i2c_client *client;
158 struct extcon_dev *edev;
159 struct power_supply *charger;
160 struct power_supply *battery;
161 struct delayed_work input_current_limit_work;
162 char model_name[I2C_NAME_SIZE];
168 struct mutex f_reg_lock;
174 static const unsigned int bq24190_usb_extcon_cable[] = {
180 * The tables below provide a 2-way mapping for the value that goes in
181 * the register field and the real-world value that it represents.
182 * The index of the array is the value that goes in the register; the
183 * number at that index in the array is the real-world value that it
187 /* REG00[2:0] (IINLIM) in uAh */
188 static const int bq24190_isc_iinlim_values[] = {
189 100000, 150000, 500000, 900000, 1200000, 1500000, 2000000, 3000000
192 /* REG02[7:2] (ICHG) in uAh */
193 static const int bq24190_ccc_ichg_values[] = {
194 512000, 576000, 640000, 704000, 768000, 832000, 896000, 960000,
195 1024000, 1088000, 1152000, 1216000, 1280000, 1344000, 1408000, 1472000,
196 1536000, 1600000, 1664000, 1728000, 1792000, 1856000, 1920000, 1984000,
197 2048000, 2112000, 2176000, 2240000, 2304000, 2368000, 2432000, 2496000,
198 2560000, 2624000, 2688000, 2752000, 2816000, 2880000, 2944000, 3008000,
199 3072000, 3136000, 3200000, 3264000, 3328000, 3392000, 3456000, 3520000,
200 3584000, 3648000, 3712000, 3776000, 3840000, 3904000, 3968000, 4032000,
201 4096000, 4160000, 4224000, 4288000, 4352000, 4416000, 4480000, 4544000
204 /* REG04[7:2] (VREG) in uV */
205 static const int bq24190_cvc_vreg_values[] = {
206 3504000, 3520000, 3536000, 3552000, 3568000, 3584000, 3600000, 3616000,
207 3632000, 3648000, 3664000, 3680000, 3696000, 3712000, 3728000, 3744000,
208 3760000, 3776000, 3792000, 3808000, 3824000, 3840000, 3856000, 3872000,
209 3888000, 3904000, 3920000, 3936000, 3952000, 3968000, 3984000, 4000000,
210 4016000, 4032000, 4048000, 4064000, 4080000, 4096000, 4112000, 4128000,
211 4144000, 4160000, 4176000, 4192000, 4208000, 4224000, 4240000, 4256000,
212 4272000, 4288000, 4304000, 4320000, 4336000, 4352000, 4368000, 4384000,
216 /* REG06[1:0] (TREG) in tenths of degrees Celsius */
217 static const int bq24190_ictrc_treg_values[] = {
222 * Return the index in 'tbl' of greatest value that is less than or equal to
223 * 'val'. The index range returned is 0 to 'tbl_size' - 1. Assumes that
224 * the values in 'tbl' are sorted from smallest to largest and 'tbl_size'
227 static u8 bq24190_find_idx(const int tbl[], int tbl_size, int v)
231 for (i = 1; i < tbl_size; i++)
238 /* Basic driver I/O routines */
240 static int bq24190_read(struct bq24190_dev_info *bdi, u8 reg, u8 *data)
244 ret = i2c_smbus_read_byte_data(bdi->client, reg);
252 static int bq24190_write(struct bq24190_dev_info *bdi, u8 reg, u8 data)
254 return i2c_smbus_write_byte_data(bdi->client, reg, data);
257 static int bq24190_read_mask(struct bq24190_dev_info *bdi, u8 reg,
258 u8 mask, u8 shift, u8 *data)
263 ret = bq24190_read(bdi, reg, &v);
274 static int bq24190_write_mask(struct bq24190_dev_info *bdi, u8 reg,
275 u8 mask, u8 shift, u8 data)
280 ret = bq24190_read(bdi, reg, &v);
285 v |= ((data << shift) & mask);
287 return bq24190_write(bdi, reg, v);
290 static int bq24190_get_field_val(struct bq24190_dev_info *bdi,
291 u8 reg, u8 mask, u8 shift,
292 const int tbl[], int tbl_size,
298 ret = bq24190_read_mask(bdi, reg, mask, shift, &v);
302 v = (v >= tbl_size) ? (tbl_size - 1) : v;
308 static int bq24190_set_field_val(struct bq24190_dev_info *bdi,
309 u8 reg, u8 mask, u8 shift,
310 const int tbl[], int tbl_size,
315 idx = bq24190_find_idx(tbl, tbl_size, val);
317 return bq24190_write_mask(bdi, reg, mask, shift, idx);
322 * There are a numerous options that are configurable on the bq24190
323 * that go well beyond what the power_supply properties provide access to.
324 * Provide sysfs access to them so they can be examined and possibly modified
325 * on the fly. They will be provided for the charger power_supply object only
326 * and will be prefixed by 'f_' to make them easier to recognize.
329 #define BQ24190_SYSFS_FIELD(_name, r, f, m, store) \
331 .attr = __ATTR(f_##_name, m, bq24190_sysfs_show, store), \
332 .reg = BQ24190_REG_##r, \
333 .mask = BQ24190_REG_##r##_##f##_MASK, \
334 .shift = BQ24190_REG_##r##_##f##_SHIFT, \
337 #define BQ24190_SYSFS_FIELD_RW(_name, r, f) \
338 BQ24190_SYSFS_FIELD(_name, r, f, S_IWUSR | S_IRUGO, \
341 #define BQ24190_SYSFS_FIELD_RO(_name, r, f) \
342 BQ24190_SYSFS_FIELD(_name, r, f, S_IRUGO, NULL)
344 static ssize_t bq24190_sysfs_show(struct device *dev,
345 struct device_attribute *attr, char *buf);
346 static ssize_t bq24190_sysfs_store(struct device *dev,
347 struct device_attribute *attr, const char *buf, size_t count);
349 struct bq24190_sysfs_field_info {
350 struct device_attribute attr;
356 /* On i386 ptrace-abi.h defines SS that breaks the macro calls below. */
359 static struct bq24190_sysfs_field_info bq24190_sysfs_field_tbl[] = {
360 /* sysfs name reg field in reg */
361 BQ24190_SYSFS_FIELD_RW(en_hiz, ISC, EN_HIZ),
362 BQ24190_SYSFS_FIELD_RW(vindpm, ISC, VINDPM),
363 BQ24190_SYSFS_FIELD_RW(iinlim, ISC, IINLIM),
364 BQ24190_SYSFS_FIELD_RW(chg_config, POC, CHG_CONFIG),
365 BQ24190_SYSFS_FIELD_RW(sys_min, POC, SYS_MIN),
366 BQ24190_SYSFS_FIELD_RW(boost_lim, POC, BOOST_LIM),
367 BQ24190_SYSFS_FIELD_RW(ichg, CCC, ICHG),
368 BQ24190_SYSFS_FIELD_RW(force_20_pct, CCC, FORCE_20PCT),
369 BQ24190_SYSFS_FIELD_RW(iprechg, PCTCC, IPRECHG),
370 BQ24190_SYSFS_FIELD_RW(iterm, PCTCC, ITERM),
371 BQ24190_SYSFS_FIELD_RW(vreg, CVC, VREG),
372 BQ24190_SYSFS_FIELD_RW(batlowv, CVC, BATLOWV),
373 BQ24190_SYSFS_FIELD_RW(vrechg, CVC, VRECHG),
374 BQ24190_SYSFS_FIELD_RW(en_term, CTTC, EN_TERM),
375 BQ24190_SYSFS_FIELD_RW(term_stat, CTTC, TERM_STAT),
376 BQ24190_SYSFS_FIELD_RO(watchdog, CTTC, WATCHDOG),
377 BQ24190_SYSFS_FIELD_RW(en_timer, CTTC, EN_TIMER),
378 BQ24190_SYSFS_FIELD_RW(chg_timer, CTTC, CHG_TIMER),
379 BQ24190_SYSFS_FIELD_RW(jeta_iset, CTTC, JEITA_ISET),
380 BQ24190_SYSFS_FIELD_RW(bat_comp, ICTRC, BAT_COMP),
381 BQ24190_SYSFS_FIELD_RW(vclamp, ICTRC, VCLAMP),
382 BQ24190_SYSFS_FIELD_RW(treg, ICTRC, TREG),
383 BQ24190_SYSFS_FIELD_RW(dpdm_en, MOC, DPDM_EN),
384 BQ24190_SYSFS_FIELD_RW(tmr2x_en, MOC, TMR2X_EN),
385 BQ24190_SYSFS_FIELD_RW(batfet_disable, MOC, BATFET_DISABLE),
386 BQ24190_SYSFS_FIELD_RW(jeita_vset, MOC, JEITA_VSET),
387 BQ24190_SYSFS_FIELD_RO(int_mask, MOC, INT_MASK),
388 BQ24190_SYSFS_FIELD_RO(vbus_stat, SS, VBUS_STAT),
389 BQ24190_SYSFS_FIELD_RO(chrg_stat, SS, CHRG_STAT),
390 BQ24190_SYSFS_FIELD_RO(dpm_stat, SS, DPM_STAT),
391 BQ24190_SYSFS_FIELD_RO(pg_stat, SS, PG_STAT),
392 BQ24190_SYSFS_FIELD_RO(therm_stat, SS, THERM_STAT),
393 BQ24190_SYSFS_FIELD_RO(vsys_stat, SS, VSYS_STAT),
394 BQ24190_SYSFS_FIELD_RO(watchdog_fault, F, WATCHDOG_FAULT),
395 BQ24190_SYSFS_FIELD_RO(boost_fault, F, BOOST_FAULT),
396 BQ24190_SYSFS_FIELD_RO(chrg_fault, F, CHRG_FAULT),
397 BQ24190_SYSFS_FIELD_RO(bat_fault, F, BAT_FAULT),
398 BQ24190_SYSFS_FIELD_RO(ntc_fault, F, NTC_FAULT),
399 BQ24190_SYSFS_FIELD_RO(pn, VPRS, PN),
400 BQ24190_SYSFS_FIELD_RO(ts_profile, VPRS, TS_PROFILE),
401 BQ24190_SYSFS_FIELD_RO(dev_reg, VPRS, DEV_REG),
404 static struct attribute *
405 bq24190_sysfs_attrs[ARRAY_SIZE(bq24190_sysfs_field_tbl) + 1];
407 ATTRIBUTE_GROUPS(bq24190_sysfs);
409 static void bq24190_sysfs_init_attrs(void)
411 int i, limit = ARRAY_SIZE(bq24190_sysfs_field_tbl);
413 for (i = 0; i < limit; i++)
414 bq24190_sysfs_attrs[i] = &bq24190_sysfs_field_tbl[i].attr.attr;
416 bq24190_sysfs_attrs[limit] = NULL; /* Has additional entry for this */
419 static struct bq24190_sysfs_field_info *bq24190_sysfs_field_lookup(
422 int i, limit = ARRAY_SIZE(bq24190_sysfs_field_tbl);
424 for (i = 0; i < limit; i++)
425 if (!strcmp(name, bq24190_sysfs_field_tbl[i].attr.attr.name))
431 return &bq24190_sysfs_field_tbl[i];
434 static ssize_t bq24190_sysfs_show(struct device *dev,
435 struct device_attribute *attr, char *buf)
437 struct power_supply *psy = dev_get_drvdata(dev);
438 struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
439 struct bq24190_sysfs_field_info *info;
444 info = bq24190_sysfs_field_lookup(attr->attr.name);
448 ret = pm_runtime_get_sync(bdi->dev);
450 pm_runtime_put_noidle(bdi->dev);
454 ret = bq24190_read_mask(bdi, info->reg, info->mask, info->shift, &v);
458 count = scnprintf(buf, PAGE_SIZE, "%hhx\n", v);
460 pm_runtime_mark_last_busy(bdi->dev);
461 pm_runtime_put_autosuspend(bdi->dev);
466 static ssize_t bq24190_sysfs_store(struct device *dev,
467 struct device_attribute *attr, const char *buf, size_t count)
469 struct power_supply *psy = dev_get_drvdata(dev);
470 struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
471 struct bq24190_sysfs_field_info *info;
475 info = bq24190_sysfs_field_lookup(attr->attr.name);
479 ret = kstrtou8(buf, 0, &v);
483 ret = pm_runtime_get_sync(bdi->dev);
485 pm_runtime_put_noidle(bdi->dev);
489 ret = bq24190_write_mask(bdi, info->reg, info->mask, info->shift, v);
493 pm_runtime_mark_last_busy(bdi->dev);
494 pm_runtime_put_autosuspend(bdi->dev);
500 #ifdef CONFIG_REGULATOR
501 static int bq24190_set_charge_mode(struct regulator_dev *dev, u8 val)
503 struct bq24190_dev_info *bdi = rdev_get_drvdata(dev);
506 ret = pm_runtime_get_sync(bdi->dev);
508 dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", ret);
509 pm_runtime_put_noidle(bdi->dev);
513 ret = bq24190_write_mask(bdi, BQ24190_REG_POC,
514 BQ24190_REG_POC_CHG_CONFIG_MASK,
515 BQ24190_REG_POC_CHG_CONFIG_SHIFT, val);
517 pm_runtime_mark_last_busy(bdi->dev);
518 pm_runtime_put_autosuspend(bdi->dev);
523 static int bq24190_vbus_enable(struct regulator_dev *dev)
525 return bq24190_set_charge_mode(dev, BQ24190_REG_POC_CHG_CONFIG_OTG);
528 static int bq24190_vbus_disable(struct regulator_dev *dev)
530 return bq24190_set_charge_mode(dev, BQ24190_REG_POC_CHG_CONFIG_CHARGE);
533 static int bq24190_vbus_is_enabled(struct regulator_dev *dev)
535 struct bq24190_dev_info *bdi = rdev_get_drvdata(dev);
539 ret = pm_runtime_get_sync(bdi->dev);
541 dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", ret);
542 pm_runtime_put_noidle(bdi->dev);
546 ret = bq24190_read_mask(bdi, BQ24190_REG_POC,
547 BQ24190_REG_POC_CHG_CONFIG_MASK,
548 BQ24190_REG_POC_CHG_CONFIG_SHIFT, &val);
550 pm_runtime_mark_last_busy(bdi->dev);
551 pm_runtime_put_autosuspend(bdi->dev);
553 return ret ? ret : val == BQ24190_REG_POC_CHG_CONFIG_OTG;
556 static const struct regulator_ops bq24190_vbus_ops = {
557 .enable = bq24190_vbus_enable,
558 .disable = bq24190_vbus_disable,
559 .is_enabled = bq24190_vbus_is_enabled,
562 static const struct regulator_desc bq24190_vbus_desc = {
563 .name = "usb_otg_vbus",
564 .of_match = "usb-otg-vbus",
565 .type = REGULATOR_VOLTAGE,
566 .owner = THIS_MODULE,
567 .ops = &bq24190_vbus_ops,
572 static const struct regulator_init_data bq24190_vbus_init_data = {
574 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
578 static int bq24190_register_vbus_regulator(struct bq24190_dev_info *bdi)
580 struct bq24190_platform_data *pdata = bdi->dev->platform_data;
581 struct regulator_config cfg = { };
582 struct regulator_dev *reg;
586 if (pdata && pdata->regulator_init_data)
587 cfg.init_data = pdata->regulator_init_data;
589 cfg.init_data = &bq24190_vbus_init_data;
590 cfg.driver_data = bdi;
591 reg = devm_regulator_register(bdi->dev, &bq24190_vbus_desc, &cfg);
594 dev_err(bdi->dev, "Can't register regulator: %d\n", ret);
600 static int bq24190_register_vbus_regulator(struct bq24190_dev_info *bdi)
606 static int bq24190_set_config(struct bq24190_dev_info *bdi)
611 ret = bq24190_read(bdi, BQ24190_REG_CTTC, &v);
615 bdi->watchdog = ((v & BQ24190_REG_CTTC_WATCHDOG_MASK) >>
616 BQ24190_REG_CTTC_WATCHDOG_SHIFT);
619 * According to the "Host Mode and default Mode" section of the
620 * manual, a write to any register causes the bq24190 to switch
621 * from default mode to host mode. It will switch back to default
622 * mode after a WDT timeout unless the WDT is turned off as well.
623 * So, by simply turning off the WDT, we accomplish both with the
626 v &= ~BQ24190_REG_CTTC_WATCHDOG_MASK;
628 ret = bq24190_write(bdi, BQ24190_REG_CTTC, v);
633 v = bdi->sys_min / 100 - 30; // manual section 9.5.1.2, table 9
634 ret = bq24190_write_mask(bdi, BQ24190_REG_POC,
635 BQ24190_REG_POC_SYS_MIN_MASK,
636 BQ24190_REG_POC_SYS_MIN_SHIFT,
643 v = bdi->iprechg / 128 - 1; // manual section 9.5.1.4, table 11
644 ret = bq24190_write_mask(bdi, BQ24190_REG_PCTCC,
645 BQ24190_REG_PCTCC_IPRECHG_MASK,
646 BQ24190_REG_PCTCC_IPRECHG_SHIFT,
653 v = bdi->iterm / 128 - 1; // manual section 9.5.1.4, table 11
654 ret = bq24190_write_mask(bdi, BQ24190_REG_PCTCC,
655 BQ24190_REG_PCTCC_ITERM_MASK,
656 BQ24190_REG_PCTCC_ITERM_SHIFT,
665 static int bq24190_register_reset(struct bq24190_dev_info *bdi)
667 int ret, limit = 100;
671 * This prop. can be passed on device instantiation from platform code:
672 * struct property_entry pe[] =
673 * { PROPERTY_ENTRY_BOOL("disable-reset"), ... };
674 * struct i2c_board_info bi =
675 * { .type = "bq24190", .addr = 0x6b, .properties = pe, .irq = irq };
676 * struct i2c_adapter ad = { ... };
677 * i2c_add_adapter(&ad);
678 * i2c_new_client_device(&ad, &bi);
680 if (device_property_read_bool(bdi->dev, "disable-reset"))
683 /* Reset the registers */
684 ret = bq24190_write_mask(bdi, BQ24190_REG_POC,
685 BQ24190_REG_POC_RESET_MASK,
686 BQ24190_REG_POC_RESET_SHIFT,
691 /* Reset bit will be cleared by hardware so poll until it is */
693 ret = bq24190_read_mask(bdi, BQ24190_REG_POC,
694 BQ24190_REG_POC_RESET_MASK,
695 BQ24190_REG_POC_RESET_SHIFT,
703 usleep_range(100, 200);
709 /* Charger power supply property routines */
711 static int bq24190_charger_get_charge_type(struct bq24190_dev_info *bdi,
712 union power_supply_propval *val)
717 ret = bq24190_read_mask(bdi, BQ24190_REG_POC,
718 BQ24190_REG_POC_CHG_CONFIG_MASK,
719 BQ24190_REG_POC_CHG_CONFIG_SHIFT,
724 /* If POC[CHG_CONFIG] (REG01[5:4]) == 0, charge is disabled */
726 type = POWER_SUPPLY_CHARGE_TYPE_NONE;
728 ret = bq24190_read_mask(bdi, BQ24190_REG_CCC,
729 BQ24190_REG_CCC_FORCE_20PCT_MASK,
730 BQ24190_REG_CCC_FORCE_20PCT_SHIFT,
735 type = (v) ? POWER_SUPPLY_CHARGE_TYPE_TRICKLE :
736 POWER_SUPPLY_CHARGE_TYPE_FAST;
744 static int bq24190_charger_set_charge_type(struct bq24190_dev_info *bdi,
745 const union power_supply_propval *val)
747 u8 chg_config, force_20pct, en_term;
751 * According to the "Termination when REG02[0] = 1" section of
752 * the bq24190 manual, the trickle charge could be less than the
753 * termination current so it recommends turning off the termination
756 * Note: AFAICT from the datasheet, the user will have to manually
757 * turn off the charging when in 20% mode. If its not turned off,
758 * there could be battery damage. So, use this mode at your own risk.
760 switch (val->intval) {
761 case POWER_SUPPLY_CHARGE_TYPE_NONE:
764 case POWER_SUPPLY_CHARGE_TYPE_TRICKLE:
769 case POWER_SUPPLY_CHARGE_TYPE_FAST:
778 if (chg_config) { /* Enabling the charger */
779 ret = bq24190_write_mask(bdi, BQ24190_REG_CCC,
780 BQ24190_REG_CCC_FORCE_20PCT_MASK,
781 BQ24190_REG_CCC_FORCE_20PCT_SHIFT,
786 ret = bq24190_write_mask(bdi, BQ24190_REG_CTTC,
787 BQ24190_REG_CTTC_EN_TERM_MASK,
788 BQ24190_REG_CTTC_EN_TERM_SHIFT,
794 return bq24190_write_mask(bdi, BQ24190_REG_POC,
795 BQ24190_REG_POC_CHG_CONFIG_MASK,
796 BQ24190_REG_POC_CHG_CONFIG_SHIFT, chg_config);
799 static int bq24190_charger_get_health(struct bq24190_dev_info *bdi,
800 union power_supply_propval *val)
805 mutex_lock(&bdi->f_reg_lock);
807 mutex_unlock(&bdi->f_reg_lock);
809 if (v & BQ24190_REG_F_NTC_FAULT_MASK) {
810 switch (v >> BQ24190_REG_F_NTC_FAULT_SHIFT & 0x7) {
811 case 0x1: /* TS1 Cold */
812 case 0x3: /* TS2 Cold */
813 case 0x5: /* Both Cold */
814 health = POWER_SUPPLY_HEALTH_COLD;
816 case 0x2: /* TS1 Hot */
817 case 0x4: /* TS2 Hot */
818 case 0x6: /* Both Hot */
819 health = POWER_SUPPLY_HEALTH_OVERHEAT;
822 health = POWER_SUPPLY_HEALTH_UNKNOWN;
824 } else if (v & BQ24190_REG_F_BAT_FAULT_MASK) {
825 health = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
826 } else if (v & BQ24190_REG_F_CHRG_FAULT_MASK) {
827 switch (v >> BQ24190_REG_F_CHRG_FAULT_SHIFT & 0x3) {
828 case 0x1: /* Input Fault (VBUS OVP or VBAT<VBUS<3.8V) */
830 * This could be over-voltage or under-voltage
831 * and there's no way to tell which. Instead
832 * of looking foolish and returning 'OVERVOLTAGE'
833 * when its really under-voltage, just return
836 health = POWER_SUPPLY_HEALTH_UNSPEC_FAILURE;
838 case 0x2: /* Thermal Shutdown */
839 health = POWER_SUPPLY_HEALTH_OVERHEAT;
841 case 0x3: /* Charge Safety Timer Expiration */
842 health = POWER_SUPPLY_HEALTH_SAFETY_TIMER_EXPIRE;
844 default: /* prevent compiler warning */
847 } else if (v & BQ24190_REG_F_BOOST_FAULT_MASK) {
849 * This could be over-current or over-voltage but there's
850 * no way to tell which. Return 'OVERVOLTAGE' since there
851 * isn't an 'OVERCURRENT' value defined that we can return
852 * even if it was over-current.
854 health = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
856 health = POWER_SUPPLY_HEALTH_GOOD;
859 val->intval = health;
864 static int bq24190_charger_get_online(struct bq24190_dev_info *bdi,
865 union power_supply_propval *val)
867 u8 pg_stat, batfet_disable;
870 ret = bq24190_read_mask(bdi, BQ24190_REG_SS,
871 BQ24190_REG_SS_PG_STAT_MASK,
872 BQ24190_REG_SS_PG_STAT_SHIFT, &pg_stat);
876 ret = bq24190_read_mask(bdi, BQ24190_REG_MOC,
877 BQ24190_REG_MOC_BATFET_DISABLE_MASK,
878 BQ24190_REG_MOC_BATFET_DISABLE_SHIFT, &batfet_disable);
882 val->intval = pg_stat && !batfet_disable;
887 static int bq24190_battery_set_online(struct bq24190_dev_info *bdi,
888 const union power_supply_propval *val);
889 static int bq24190_battery_get_status(struct bq24190_dev_info *bdi,
890 union power_supply_propval *val);
891 static int bq24190_battery_get_temp_alert_max(struct bq24190_dev_info *bdi,
892 union power_supply_propval *val);
893 static int bq24190_battery_set_temp_alert_max(struct bq24190_dev_info *bdi,
894 const union power_supply_propval *val);
896 static int bq24190_charger_set_online(struct bq24190_dev_info *bdi,
897 const union power_supply_propval *val)
899 return bq24190_battery_set_online(bdi, val);
902 static int bq24190_charger_get_status(struct bq24190_dev_info *bdi,
903 union power_supply_propval *val)
905 return bq24190_battery_get_status(bdi, val);
908 static int bq24190_charger_get_temp_alert_max(struct bq24190_dev_info *bdi,
909 union power_supply_propval *val)
911 return bq24190_battery_get_temp_alert_max(bdi, val);
914 static int bq24190_charger_set_temp_alert_max(struct bq24190_dev_info *bdi,
915 const union power_supply_propval *val)
917 return bq24190_battery_set_temp_alert_max(bdi, val);
920 static int bq24190_charger_get_precharge(struct bq24190_dev_info *bdi,
921 union power_supply_propval *val)
926 ret = bq24190_read_mask(bdi, BQ24190_REG_PCTCC,
927 BQ24190_REG_PCTCC_IPRECHG_MASK,
928 BQ24190_REG_PCTCC_IPRECHG_SHIFT, &v);
932 val->intval = ++v * 128 * 1000;
936 static int bq24190_charger_get_charge_term(struct bq24190_dev_info *bdi,
937 union power_supply_propval *val)
942 ret = bq24190_read_mask(bdi, BQ24190_REG_PCTCC,
943 BQ24190_REG_PCTCC_ITERM_MASK,
944 BQ24190_REG_PCTCC_ITERM_SHIFT, &v);
948 val->intval = ++v * 128 * 1000;
952 static int bq24190_charger_get_current(struct bq24190_dev_info *bdi,
953 union power_supply_propval *val)
958 ret = bq24190_get_field_val(bdi, BQ24190_REG_CCC,
959 BQ24190_REG_CCC_ICHG_MASK, BQ24190_REG_CCC_ICHG_SHIFT,
960 bq24190_ccc_ichg_values,
961 ARRAY_SIZE(bq24190_ccc_ichg_values), &curr);
965 ret = bq24190_read_mask(bdi, BQ24190_REG_CCC,
966 BQ24190_REG_CCC_FORCE_20PCT_MASK,
967 BQ24190_REG_CCC_FORCE_20PCT_SHIFT, &v);
971 /* If FORCE_20PCT is enabled, then current is 20% of ICHG value */
979 static int bq24190_charger_get_current_max(struct bq24190_dev_info *bdi,
980 union power_supply_propval *val)
982 int idx = ARRAY_SIZE(bq24190_ccc_ichg_values) - 1;
984 val->intval = bq24190_ccc_ichg_values[idx];
988 static int bq24190_charger_set_current(struct bq24190_dev_info *bdi,
989 const union power_supply_propval *val)
992 int ret, curr = val->intval;
994 ret = bq24190_read_mask(bdi, BQ24190_REG_CCC,
995 BQ24190_REG_CCC_FORCE_20PCT_MASK,
996 BQ24190_REG_CCC_FORCE_20PCT_SHIFT, &v);
1000 /* If FORCE_20PCT is enabled, have to multiply value passed in by 5 */
1004 return bq24190_set_field_val(bdi, BQ24190_REG_CCC,
1005 BQ24190_REG_CCC_ICHG_MASK, BQ24190_REG_CCC_ICHG_SHIFT,
1006 bq24190_ccc_ichg_values,
1007 ARRAY_SIZE(bq24190_ccc_ichg_values), curr);
1010 static int bq24190_charger_get_voltage(struct bq24190_dev_info *bdi,
1011 union power_supply_propval *val)
1015 ret = bq24190_get_field_val(bdi, BQ24190_REG_CVC,
1016 BQ24190_REG_CVC_VREG_MASK, BQ24190_REG_CVC_VREG_SHIFT,
1017 bq24190_cvc_vreg_values,
1018 ARRAY_SIZE(bq24190_cvc_vreg_values), &voltage);
1022 val->intval = voltage;
1026 static int bq24190_charger_get_voltage_max(struct bq24190_dev_info *bdi,
1027 union power_supply_propval *val)
1029 int idx = ARRAY_SIZE(bq24190_cvc_vreg_values) - 1;
1031 val->intval = bq24190_cvc_vreg_values[idx];
1035 static int bq24190_charger_set_voltage(struct bq24190_dev_info *bdi,
1036 const union power_supply_propval *val)
1038 return bq24190_set_field_val(bdi, BQ24190_REG_CVC,
1039 BQ24190_REG_CVC_VREG_MASK, BQ24190_REG_CVC_VREG_SHIFT,
1040 bq24190_cvc_vreg_values,
1041 ARRAY_SIZE(bq24190_cvc_vreg_values), val->intval);
1044 static int bq24190_charger_get_iinlimit(struct bq24190_dev_info *bdi,
1045 union power_supply_propval *val)
1049 ret = bq24190_get_field_val(bdi, BQ24190_REG_ISC,
1050 BQ24190_REG_ISC_IINLIM_MASK,
1051 BQ24190_REG_ISC_IINLIM_SHIFT,
1052 bq24190_isc_iinlim_values,
1053 ARRAY_SIZE(bq24190_isc_iinlim_values), &iinlimit);
1057 val->intval = iinlimit;
1061 static int bq24190_charger_set_iinlimit(struct bq24190_dev_info *bdi,
1062 const union power_supply_propval *val)
1064 return bq24190_set_field_val(bdi, BQ24190_REG_ISC,
1065 BQ24190_REG_ISC_IINLIM_MASK,
1066 BQ24190_REG_ISC_IINLIM_SHIFT,
1067 bq24190_isc_iinlim_values,
1068 ARRAY_SIZE(bq24190_isc_iinlim_values), val->intval);
1071 static int bq24190_charger_get_property(struct power_supply *psy,
1072 enum power_supply_property psp, union power_supply_propval *val)
1074 struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
1077 dev_dbg(bdi->dev, "prop: %d\n", psp);
1079 ret = pm_runtime_get_sync(bdi->dev);
1081 pm_runtime_put_noidle(bdi->dev);
1086 case POWER_SUPPLY_PROP_CHARGE_TYPE:
1087 ret = bq24190_charger_get_charge_type(bdi, val);
1089 case POWER_SUPPLY_PROP_HEALTH:
1090 ret = bq24190_charger_get_health(bdi, val);
1092 case POWER_SUPPLY_PROP_ONLINE:
1093 ret = bq24190_charger_get_online(bdi, val);
1095 case POWER_SUPPLY_PROP_STATUS:
1096 ret = bq24190_charger_get_status(bdi, val);
1098 case POWER_SUPPLY_PROP_TEMP_ALERT_MAX:
1099 ret = bq24190_charger_get_temp_alert_max(bdi, val);
1101 case POWER_SUPPLY_PROP_PRECHARGE_CURRENT:
1102 ret = bq24190_charger_get_precharge(bdi, val);
1104 case POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT:
1105 ret = bq24190_charger_get_charge_term(bdi, val);
1107 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
1108 ret = bq24190_charger_get_current(bdi, val);
1110 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX:
1111 ret = bq24190_charger_get_current_max(bdi, val);
1113 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
1114 ret = bq24190_charger_get_voltage(bdi, val);
1116 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX:
1117 ret = bq24190_charger_get_voltage_max(bdi, val);
1119 case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
1120 ret = bq24190_charger_get_iinlimit(bdi, val);
1122 case POWER_SUPPLY_PROP_SCOPE:
1123 val->intval = POWER_SUPPLY_SCOPE_SYSTEM;
1126 case POWER_SUPPLY_PROP_MODEL_NAME:
1127 val->strval = bdi->model_name;
1130 case POWER_SUPPLY_PROP_MANUFACTURER:
1131 val->strval = BQ24190_MANUFACTURER;
1138 pm_runtime_mark_last_busy(bdi->dev);
1139 pm_runtime_put_autosuspend(bdi->dev);
1144 static int bq24190_charger_set_property(struct power_supply *psy,
1145 enum power_supply_property psp,
1146 const union power_supply_propval *val)
1148 struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
1151 dev_dbg(bdi->dev, "prop: %d\n", psp);
1153 ret = pm_runtime_get_sync(bdi->dev);
1155 pm_runtime_put_noidle(bdi->dev);
1160 case POWER_SUPPLY_PROP_ONLINE:
1161 ret = bq24190_charger_set_online(bdi, val);
1163 case POWER_SUPPLY_PROP_TEMP_ALERT_MAX:
1164 ret = bq24190_charger_set_temp_alert_max(bdi, val);
1166 case POWER_SUPPLY_PROP_CHARGE_TYPE:
1167 ret = bq24190_charger_set_charge_type(bdi, val);
1169 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
1170 ret = bq24190_charger_set_current(bdi, val);
1172 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
1173 ret = bq24190_charger_set_voltage(bdi, val);
1175 case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
1176 ret = bq24190_charger_set_iinlimit(bdi, val);
1182 pm_runtime_mark_last_busy(bdi->dev);
1183 pm_runtime_put_autosuspend(bdi->dev);
1188 static int bq24190_charger_property_is_writeable(struct power_supply *psy,
1189 enum power_supply_property psp)
1192 case POWER_SUPPLY_PROP_ONLINE:
1193 case POWER_SUPPLY_PROP_TEMP_ALERT_MAX:
1194 case POWER_SUPPLY_PROP_CHARGE_TYPE:
1195 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
1196 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
1197 case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
1204 static void bq24190_input_current_limit_work(struct work_struct *work)
1206 struct bq24190_dev_info *bdi =
1207 container_of(work, struct bq24190_dev_info,
1208 input_current_limit_work.work);
1210 power_supply_set_input_current_limit_from_supplier(bdi->charger);
1213 /* Sync the input-current-limit with our parent supply (if we have one) */
1214 static void bq24190_charger_external_power_changed(struct power_supply *psy)
1216 struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
1219 * The Power-Good detection may take up to 220ms, sometimes
1220 * the external charger detection is quicker, and the bq24190 will
1221 * reset to iinlim based on its own charger detection (which is not
1222 * hooked up when using external charger detection) resulting in a
1223 * too low default 500mA iinlim. Delay setting the input-current-limit
1224 * for 300ms to avoid this.
1226 queue_delayed_work(system_wq, &bdi->input_current_limit_work,
1227 msecs_to_jiffies(300));
1230 static enum power_supply_property bq24190_charger_properties[] = {
1231 POWER_SUPPLY_PROP_CHARGE_TYPE,
1232 POWER_SUPPLY_PROP_HEALTH,
1233 POWER_SUPPLY_PROP_ONLINE,
1234 POWER_SUPPLY_PROP_STATUS,
1235 POWER_SUPPLY_PROP_TEMP_ALERT_MAX,
1236 POWER_SUPPLY_PROP_PRECHARGE_CURRENT,
1237 POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT,
1238 POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT,
1239 POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX,
1240 POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE,
1241 POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX,
1242 POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT,
1243 POWER_SUPPLY_PROP_SCOPE,
1244 POWER_SUPPLY_PROP_MODEL_NAME,
1245 POWER_SUPPLY_PROP_MANUFACTURER,
1248 static char *bq24190_charger_supplied_to[] = {
1252 static const struct power_supply_desc bq24190_charger_desc = {
1253 .name = "bq24190-charger",
1254 .type = POWER_SUPPLY_TYPE_USB,
1255 .properties = bq24190_charger_properties,
1256 .num_properties = ARRAY_SIZE(bq24190_charger_properties),
1257 .get_property = bq24190_charger_get_property,
1258 .set_property = bq24190_charger_set_property,
1259 .property_is_writeable = bq24190_charger_property_is_writeable,
1260 .external_power_changed = bq24190_charger_external_power_changed,
1263 /* Battery power supply property routines */
1265 static int bq24190_battery_get_status(struct bq24190_dev_info *bdi,
1266 union power_supply_propval *val)
1268 u8 ss_reg, chrg_fault;
1271 mutex_lock(&bdi->f_reg_lock);
1272 chrg_fault = bdi->f_reg;
1273 mutex_unlock(&bdi->f_reg_lock);
1275 chrg_fault &= BQ24190_REG_F_CHRG_FAULT_MASK;
1276 chrg_fault >>= BQ24190_REG_F_CHRG_FAULT_SHIFT;
1278 ret = bq24190_read(bdi, BQ24190_REG_SS, &ss_reg);
1283 * The battery must be discharging when any of these are true:
1284 * - there is no good power source;
1285 * - there is a charge fault.
1286 * Could also be discharging when in "supplement mode" but
1287 * there is no way to tell when its in that mode.
1289 if (!(ss_reg & BQ24190_REG_SS_PG_STAT_MASK) || chrg_fault) {
1290 status = POWER_SUPPLY_STATUS_DISCHARGING;
1292 ss_reg &= BQ24190_REG_SS_CHRG_STAT_MASK;
1293 ss_reg >>= BQ24190_REG_SS_CHRG_STAT_SHIFT;
1296 case 0x0: /* Not Charging */
1297 status = POWER_SUPPLY_STATUS_NOT_CHARGING;
1299 case 0x1: /* Pre-charge */
1300 case 0x2: /* Fast Charging */
1301 status = POWER_SUPPLY_STATUS_CHARGING;
1303 case 0x3: /* Charge Termination Done */
1304 status = POWER_SUPPLY_STATUS_FULL;
1312 val->intval = status;
1317 static int bq24190_battery_get_health(struct bq24190_dev_info *bdi,
1318 union power_supply_propval *val)
1323 mutex_lock(&bdi->f_reg_lock);
1325 mutex_unlock(&bdi->f_reg_lock);
1327 if (v & BQ24190_REG_F_BAT_FAULT_MASK) {
1328 health = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
1330 v &= BQ24190_REG_F_NTC_FAULT_MASK;
1331 v >>= BQ24190_REG_F_NTC_FAULT_SHIFT;
1334 case 0x0: /* Normal */
1335 health = POWER_SUPPLY_HEALTH_GOOD;
1337 case 0x1: /* TS1 Cold */
1338 case 0x3: /* TS2 Cold */
1339 case 0x5: /* Both Cold */
1340 health = POWER_SUPPLY_HEALTH_COLD;
1342 case 0x2: /* TS1 Hot */
1343 case 0x4: /* TS2 Hot */
1344 case 0x6: /* Both Hot */
1345 health = POWER_SUPPLY_HEALTH_OVERHEAT;
1348 health = POWER_SUPPLY_HEALTH_UNKNOWN;
1352 val->intval = health;
1356 static int bq24190_battery_get_online(struct bq24190_dev_info *bdi,
1357 union power_supply_propval *val)
1362 ret = bq24190_read_mask(bdi, BQ24190_REG_MOC,
1363 BQ24190_REG_MOC_BATFET_DISABLE_MASK,
1364 BQ24190_REG_MOC_BATFET_DISABLE_SHIFT, &batfet_disable);
1368 val->intval = !batfet_disable;
1372 static int bq24190_battery_set_online(struct bq24190_dev_info *bdi,
1373 const union power_supply_propval *val)
1375 return bq24190_write_mask(bdi, BQ24190_REG_MOC,
1376 BQ24190_REG_MOC_BATFET_DISABLE_MASK,
1377 BQ24190_REG_MOC_BATFET_DISABLE_SHIFT, !val->intval);
1380 static int bq24190_battery_get_temp_alert_max(struct bq24190_dev_info *bdi,
1381 union power_supply_propval *val)
1385 ret = bq24190_get_field_val(bdi, BQ24190_REG_ICTRC,
1386 BQ24190_REG_ICTRC_TREG_MASK,
1387 BQ24190_REG_ICTRC_TREG_SHIFT,
1388 bq24190_ictrc_treg_values,
1389 ARRAY_SIZE(bq24190_ictrc_treg_values), &temp);
1397 static int bq24190_battery_set_temp_alert_max(struct bq24190_dev_info *bdi,
1398 const union power_supply_propval *val)
1400 return bq24190_set_field_val(bdi, BQ24190_REG_ICTRC,
1401 BQ24190_REG_ICTRC_TREG_MASK,
1402 BQ24190_REG_ICTRC_TREG_SHIFT,
1403 bq24190_ictrc_treg_values,
1404 ARRAY_SIZE(bq24190_ictrc_treg_values), val->intval);
1407 static int bq24190_battery_get_property(struct power_supply *psy,
1408 enum power_supply_property psp, union power_supply_propval *val)
1410 struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
1413 dev_warn(bdi->dev, "warning: /sys/class/power_supply/bq24190-battery is deprecated\n");
1414 dev_dbg(bdi->dev, "prop: %d\n", psp);
1416 ret = pm_runtime_get_sync(bdi->dev);
1418 pm_runtime_put_noidle(bdi->dev);
1423 case POWER_SUPPLY_PROP_STATUS:
1424 ret = bq24190_battery_get_status(bdi, val);
1426 case POWER_SUPPLY_PROP_HEALTH:
1427 ret = bq24190_battery_get_health(bdi, val);
1429 case POWER_SUPPLY_PROP_ONLINE:
1430 ret = bq24190_battery_get_online(bdi, val);
1432 case POWER_SUPPLY_PROP_TECHNOLOGY:
1433 /* Could be Li-on or Li-polymer but no way to tell which */
1434 val->intval = POWER_SUPPLY_TECHNOLOGY_UNKNOWN;
1437 case POWER_SUPPLY_PROP_TEMP_ALERT_MAX:
1438 ret = bq24190_battery_get_temp_alert_max(bdi, val);
1440 case POWER_SUPPLY_PROP_SCOPE:
1441 val->intval = POWER_SUPPLY_SCOPE_SYSTEM;
1448 pm_runtime_mark_last_busy(bdi->dev);
1449 pm_runtime_put_autosuspend(bdi->dev);
1454 static int bq24190_battery_set_property(struct power_supply *psy,
1455 enum power_supply_property psp,
1456 const union power_supply_propval *val)
1458 struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
1461 dev_warn(bdi->dev, "warning: /sys/class/power_supply/bq24190-battery is deprecated\n");
1462 dev_dbg(bdi->dev, "prop: %d\n", psp);
1464 ret = pm_runtime_get_sync(bdi->dev);
1466 pm_runtime_put_noidle(bdi->dev);
1471 case POWER_SUPPLY_PROP_ONLINE:
1472 ret = bq24190_battery_set_online(bdi, val);
1474 case POWER_SUPPLY_PROP_TEMP_ALERT_MAX:
1475 ret = bq24190_battery_set_temp_alert_max(bdi, val);
1481 pm_runtime_mark_last_busy(bdi->dev);
1482 pm_runtime_put_autosuspend(bdi->dev);
1487 static int bq24190_battery_property_is_writeable(struct power_supply *psy,
1488 enum power_supply_property psp)
1493 case POWER_SUPPLY_PROP_ONLINE:
1494 case POWER_SUPPLY_PROP_TEMP_ALERT_MAX:
1504 static enum power_supply_property bq24190_battery_properties[] = {
1505 POWER_SUPPLY_PROP_STATUS,
1506 POWER_SUPPLY_PROP_HEALTH,
1507 POWER_SUPPLY_PROP_ONLINE,
1508 POWER_SUPPLY_PROP_TECHNOLOGY,
1509 POWER_SUPPLY_PROP_TEMP_ALERT_MAX,
1510 POWER_SUPPLY_PROP_SCOPE,
1513 static const struct power_supply_desc bq24190_battery_desc = {
1514 .name = "bq24190-battery",
1515 .type = POWER_SUPPLY_TYPE_BATTERY,
1516 .properties = bq24190_battery_properties,
1517 .num_properties = ARRAY_SIZE(bq24190_battery_properties),
1518 .get_property = bq24190_battery_get_property,
1519 .set_property = bq24190_battery_set_property,
1520 .property_is_writeable = bq24190_battery_property_is_writeable,
1523 static int bq24190_configure_usb_otg(struct bq24190_dev_info *bdi, u8 ss_reg)
1528 otg_enabled = !!(ss_reg & BQ24190_REG_SS_VBUS_STAT_MASK);
1529 ret = extcon_set_state_sync(bdi->edev, EXTCON_USB, otg_enabled);
1531 dev_err(bdi->dev, "Can't set extcon state to %d: %d\n",
1537 static void bq24190_check_status(struct bq24190_dev_info *bdi)
1539 const u8 battery_mask_ss = BQ24190_REG_SS_CHRG_STAT_MASK;
1540 const u8 battery_mask_f = BQ24190_REG_F_BAT_FAULT_MASK
1541 | BQ24190_REG_F_NTC_FAULT_MASK;
1542 bool alert_charger = false, alert_battery = false;
1543 u8 ss_reg = 0, f_reg = 0;
1546 ret = bq24190_read(bdi, BQ24190_REG_SS, &ss_reg);
1548 dev_err(bdi->dev, "Can't read SS reg: %d\n", ret);
1554 ret = bq24190_read(bdi, BQ24190_REG_F, &f_reg);
1556 dev_err(bdi->dev, "Can't read F reg: %d\n", ret);
1559 } while (f_reg && ++i < 2);
1561 /* ignore over/under voltage fault after disconnect */
1562 if (f_reg == (1 << BQ24190_REG_F_CHRG_FAULT_SHIFT) &&
1563 !(ss_reg & BQ24190_REG_SS_PG_STAT_MASK))
1566 if (f_reg != bdi->f_reg) {
1568 "Fault: boost %d, charge %d, battery %d, ntc %d\n",
1569 !!(f_reg & BQ24190_REG_F_BOOST_FAULT_MASK),
1570 !!(f_reg & BQ24190_REG_F_CHRG_FAULT_MASK),
1571 !!(f_reg & BQ24190_REG_F_BAT_FAULT_MASK),
1572 !!(f_reg & BQ24190_REG_F_NTC_FAULT_MASK));
1574 mutex_lock(&bdi->f_reg_lock);
1575 if ((bdi->f_reg & battery_mask_f) != (f_reg & battery_mask_f))
1576 alert_battery = true;
1577 if ((bdi->f_reg & ~battery_mask_f) != (f_reg & ~battery_mask_f))
1578 alert_charger = true;
1580 mutex_unlock(&bdi->f_reg_lock);
1583 if (ss_reg != bdi->ss_reg) {
1585 * The device is in host mode so when PG_STAT goes from 1->0
1586 * (i.e., power removed) HIZ needs to be disabled.
1588 if ((bdi->ss_reg & BQ24190_REG_SS_PG_STAT_MASK) &&
1589 !(ss_reg & BQ24190_REG_SS_PG_STAT_MASK)) {
1590 ret = bq24190_write_mask(bdi, BQ24190_REG_ISC,
1591 BQ24190_REG_ISC_EN_HIZ_MASK,
1592 BQ24190_REG_ISC_EN_HIZ_SHIFT,
1595 dev_err(bdi->dev, "Can't access ISC reg: %d\n",
1599 if ((bdi->ss_reg & battery_mask_ss) != (ss_reg & battery_mask_ss))
1600 alert_battery = true;
1601 if ((bdi->ss_reg & ~battery_mask_ss) != (ss_reg & ~battery_mask_ss))
1602 alert_charger = true;
1603 bdi->ss_reg = ss_reg;
1606 if (alert_charger || alert_battery) {
1607 power_supply_changed(bdi->charger);
1608 bq24190_configure_usb_otg(bdi, ss_reg);
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 int bq24190_hw_init(struct bq24190_dev_info *bdi)
1641 /* First check that the device really is what its supposed to be */
1642 ret = bq24190_read_mask(bdi, BQ24190_REG_VPRS,
1643 BQ24190_REG_VPRS_PN_MASK,
1644 BQ24190_REG_VPRS_PN_SHIFT,
1650 case BQ24190_REG_VPRS_PN_24190:
1651 case BQ24190_REG_VPRS_PN_24192:
1652 case BQ24190_REG_VPRS_PN_24192I:
1655 dev_err(bdi->dev, "Error unknown model: 0x%02x\n", v);
1659 ret = bq24190_register_reset(bdi);
1663 ret = bq24190_set_config(bdi);
1667 return bq24190_read(bdi, BQ24190_REG_SS, &bdi->ss_reg);
1670 static int bq24190_get_config(struct bq24190_dev_info *bdi)
1672 const char * const s = "ti,system-minimum-microvolt";
1673 struct power_supply_battery_info info = {};
1676 if (device_property_read_u32(bdi->dev, s, &v) == 0) {
1678 if (v >= BQ24190_REG_POC_SYS_MIN_MIN
1679 && v <= BQ24190_REG_POC_SYS_MIN_MAX)
1682 dev_warn(bdi->dev, "invalid value for %s: %u\n", s, v);
1685 if (bdi->dev->of_node &&
1686 !power_supply_get_battery_info(bdi->charger, &info)) {
1687 v = info.precharge_current_ua / 1000;
1688 if (v >= BQ24190_REG_PCTCC_IPRECHG_MIN
1689 && v <= BQ24190_REG_PCTCC_IPRECHG_MAX)
1692 dev_warn(bdi->dev, "invalid value for battery:precharge-current-microamp: %d\n",
1695 v = info.charge_term_current_ua / 1000;
1696 if (v >= BQ24190_REG_PCTCC_ITERM_MIN
1697 && v <= BQ24190_REG_PCTCC_ITERM_MAX)
1700 dev_warn(bdi->dev, "invalid value for battery:charge-term-current-microamp: %d\n",
1707 static int bq24190_probe(struct i2c_client *client,
1708 const struct i2c_device_id *id)
1710 struct i2c_adapter *adapter = client->adapter;
1711 struct device *dev = &client->dev;
1712 struct power_supply_config charger_cfg = {}, battery_cfg = {};
1713 struct bq24190_dev_info *bdi;
1716 if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) {
1717 dev_err(dev, "No support for SMBUS_BYTE_DATA\n");
1721 bdi = devm_kzalloc(dev, sizeof(*bdi), GFP_KERNEL);
1723 dev_err(dev, "Can't alloc bdi struct\n");
1727 bdi->client = client;
1729 strncpy(bdi->model_name, id->name, I2C_NAME_SIZE);
1730 mutex_init(&bdi->f_reg_lock);
1732 bdi->ss_reg = BQ24190_REG_SS_VBUS_STAT_MASK; /* impossible state */
1733 INIT_DELAYED_WORK(&bdi->input_current_limit_work,
1734 bq24190_input_current_limit_work);
1736 i2c_set_clientdata(client, bdi);
1738 if (client->irq <= 0) {
1739 dev_err(dev, "Can't get irq info\n");
1743 bdi->edev = devm_extcon_dev_allocate(dev, bq24190_usb_extcon_cable);
1744 if (IS_ERR(bdi->edev))
1745 return PTR_ERR(bdi->edev);
1747 ret = devm_extcon_dev_register(dev, bdi->edev);
1751 pm_runtime_enable(dev);
1752 pm_runtime_use_autosuspend(dev);
1753 pm_runtime_set_autosuspend_delay(dev, 600);
1754 ret = pm_runtime_get_sync(dev);
1756 dev_err(dev, "pm_runtime_get failed: %i\n", ret);
1761 bq24190_sysfs_init_attrs();
1762 charger_cfg.attr_grp = bq24190_sysfs_groups;
1765 charger_cfg.drv_data = bdi;
1766 charger_cfg.of_node = dev->of_node;
1767 charger_cfg.supplied_to = bq24190_charger_supplied_to;
1768 charger_cfg.num_supplicants = ARRAY_SIZE(bq24190_charger_supplied_to);
1769 bdi->charger = power_supply_register(dev, &bq24190_charger_desc,
1771 if (IS_ERR(bdi->charger)) {
1772 dev_err(dev, "Can't register charger\n");
1773 ret = PTR_ERR(bdi->charger);
1777 /* the battery class is deprecated and will be removed. */
1778 /* in the interim, this property hides it. */
1779 if (!device_property_read_bool(dev, "omit-battery-class")) {
1780 battery_cfg.drv_data = bdi;
1781 bdi->battery = power_supply_register(dev, &bq24190_battery_desc,
1783 if (IS_ERR(bdi->battery)) {
1784 dev_err(dev, "Can't register battery\n");
1785 ret = PTR_ERR(bdi->battery);
1790 ret = bq24190_get_config(bdi);
1792 dev_err(dev, "Can't get devicetree config\n");
1796 ret = bq24190_hw_init(bdi);
1798 dev_err(dev, "Hardware init failed\n");
1802 ret = bq24190_configure_usb_otg(bdi, bdi->ss_reg);
1806 bdi->initialized = true;
1808 ret = devm_request_threaded_irq(dev, client->irq, NULL,
1809 bq24190_irq_handler_thread,
1810 IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
1811 "bq24190-charger", bdi);
1813 dev_err(dev, "Can't set up irq handler\n");
1817 ret = bq24190_register_vbus_regulator(bdi);
1821 enable_irq_wake(client->irq);
1823 pm_runtime_mark_last_busy(dev);
1824 pm_runtime_put_autosuspend(dev);
1829 if (!IS_ERR_OR_NULL(bdi->battery))
1830 power_supply_unregister(bdi->battery);
1831 power_supply_unregister(bdi->charger);
1834 pm_runtime_put_sync(dev);
1835 pm_runtime_dont_use_autosuspend(dev);
1836 pm_runtime_disable(dev);
1840 static int bq24190_remove(struct i2c_client *client)
1842 struct bq24190_dev_info *bdi = i2c_get_clientdata(client);
1845 error = pm_runtime_get_sync(bdi->dev);
1847 dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", error);
1848 pm_runtime_put_noidle(bdi->dev);
1851 bq24190_register_reset(bdi);
1853 power_supply_unregister(bdi->battery);
1854 power_supply_unregister(bdi->charger);
1856 pm_runtime_put_sync(bdi->dev);
1857 pm_runtime_dont_use_autosuspend(bdi->dev);
1858 pm_runtime_disable(bdi->dev);
1863 static __maybe_unused int bq24190_runtime_suspend(struct device *dev)
1865 struct i2c_client *client = to_i2c_client(dev);
1866 struct bq24190_dev_info *bdi = i2c_get_clientdata(client);
1868 if (!bdi->initialized)
1871 dev_dbg(bdi->dev, "%s\n", __func__);
1876 static __maybe_unused int bq24190_runtime_resume(struct device *dev)
1878 struct i2c_client *client = to_i2c_client(dev);
1879 struct bq24190_dev_info *bdi = i2c_get_clientdata(client);
1881 if (!bdi->initialized)
1884 if (!bdi->irq_event) {
1885 dev_dbg(bdi->dev, "checking events on possible wakeirq\n");
1886 bq24190_check_status(bdi);
1892 static __maybe_unused int bq24190_pm_suspend(struct device *dev)
1894 struct i2c_client *client = to_i2c_client(dev);
1895 struct bq24190_dev_info *bdi = i2c_get_clientdata(client);
1898 error = pm_runtime_get_sync(bdi->dev);
1900 dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", error);
1901 pm_runtime_put_noidle(bdi->dev);
1904 bq24190_register_reset(bdi);
1907 pm_runtime_mark_last_busy(bdi->dev);
1908 pm_runtime_put_autosuspend(bdi->dev);
1914 static __maybe_unused int bq24190_pm_resume(struct device *dev)
1916 struct i2c_client *client = to_i2c_client(dev);
1917 struct bq24190_dev_info *bdi = i2c_get_clientdata(client);
1921 bdi->ss_reg = BQ24190_REG_SS_VBUS_STAT_MASK; /* impossible state */
1923 error = pm_runtime_get_sync(bdi->dev);
1925 dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", error);
1926 pm_runtime_put_noidle(bdi->dev);
1929 bq24190_register_reset(bdi);
1930 bq24190_set_config(bdi);
1931 bq24190_read(bdi, BQ24190_REG_SS, &bdi->ss_reg);
1934 pm_runtime_mark_last_busy(bdi->dev);
1935 pm_runtime_put_autosuspend(bdi->dev);
1938 /* Things may have changed while suspended so alert upper layer */
1939 power_supply_changed(bdi->charger);
1941 power_supply_changed(bdi->battery);
1946 static const struct dev_pm_ops bq24190_pm_ops = {
1947 SET_RUNTIME_PM_OPS(bq24190_runtime_suspend, bq24190_runtime_resume,
1949 SET_SYSTEM_SLEEP_PM_OPS(bq24190_pm_suspend, bq24190_pm_resume)
1952 static const struct i2c_device_id bq24190_i2c_ids[] = {
1959 MODULE_DEVICE_TABLE(i2c, bq24190_i2c_ids);
1961 static const struct of_device_id bq24190_of_match[] = {
1962 { .compatible = "ti,bq24190", },
1963 { .compatible = "ti,bq24192", },
1964 { .compatible = "ti,bq24192i", },
1965 { .compatible = "ti,bq24196", },
1968 MODULE_DEVICE_TABLE(of, bq24190_of_match);
1970 static struct i2c_driver bq24190_driver = {
1971 .probe = bq24190_probe,
1972 .remove = bq24190_remove,
1973 .id_table = bq24190_i2c_ids,
1975 .name = "bq24190-charger",
1976 .pm = &bq24190_pm_ops,
1977 .of_match_table = bq24190_of_match,
1980 module_i2c_driver(bq24190_driver);
1982 MODULE_LICENSE("GPL");
1983 MODULE_AUTHOR("Mark A. Greer <mgreer@animalcreek.com>");
1984 MODULE_DESCRIPTION("TI BQ24190 Charger Driver");