2 * Driver for the TI bq24190 battery charger.
4 * Author: Mark A. Greer <mgreer@animalcreek.com>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
11 #include <linux/module.h>
12 #include <linux/interrupt.h>
13 #include <linux/delay.h>
14 #include <linux/of_irq.h>
15 #include <linux/of_device.h>
16 #include <linux/pm_runtime.h>
17 #include <linux/power_supply.h>
18 #include <linux/power/bq24190_charger.h>
19 #include <linux/regulator/driver.h>
20 #include <linux/regulator/machine.h>
21 #include <linux/workqueue.h>
22 #include <linux/gpio.h>
23 #include <linux/i2c.h>
25 #define BQ24190_MANUFACTURER "Texas Instruments"
27 #define BQ24190_REG_ISC 0x00 /* Input Source Control */
28 #define BQ24190_REG_ISC_EN_HIZ_MASK BIT(7)
29 #define BQ24190_REG_ISC_EN_HIZ_SHIFT 7
30 #define BQ24190_REG_ISC_VINDPM_MASK (BIT(6) | BIT(5) | BIT(4) | \
32 #define BQ24190_REG_ISC_VINDPM_SHIFT 3
33 #define BQ24190_REG_ISC_IINLIM_MASK (BIT(2) | BIT(1) | BIT(0))
34 #define BQ24190_REG_ISC_IINLIM_SHIFT 0
36 #define BQ24190_REG_POC 0x01 /* Power-On Configuration */
37 #define BQ24190_REG_POC_RESET_MASK BIT(7)
38 #define BQ24190_REG_POC_RESET_SHIFT 7
39 #define BQ24190_REG_POC_WDT_RESET_MASK BIT(6)
40 #define BQ24190_REG_POC_WDT_RESET_SHIFT 6
41 #define BQ24190_REG_POC_CHG_CONFIG_MASK (BIT(5) | BIT(4))
42 #define BQ24190_REG_POC_CHG_CONFIG_SHIFT 4
43 #define BQ24190_REG_POC_CHG_CONFIG_DISABLE 0x0
44 #define BQ24190_REG_POC_CHG_CONFIG_CHARGE 0x1
45 #define BQ24190_REG_POC_CHG_CONFIG_OTG 0x2
46 #define BQ24190_REG_POC_SYS_MIN_MASK (BIT(3) | BIT(2) | BIT(1))
47 #define BQ24190_REG_POC_SYS_MIN_SHIFT 1
48 #define BQ24190_REG_POC_SYS_MIN_MIN 3000
49 #define BQ24190_REG_POC_SYS_MIN_MAX 3700
50 #define BQ24190_REG_POC_BOOST_LIM_MASK BIT(0)
51 #define BQ24190_REG_POC_BOOST_LIM_SHIFT 0
53 #define BQ24190_REG_CCC 0x02 /* Charge Current Control */
54 #define BQ24190_REG_CCC_ICHG_MASK (BIT(7) | BIT(6) | BIT(5) | \
55 BIT(4) | BIT(3) | BIT(2))
56 #define BQ24190_REG_CCC_ICHG_SHIFT 2
57 #define BQ24190_REG_CCC_FORCE_20PCT_MASK BIT(0)
58 #define BQ24190_REG_CCC_FORCE_20PCT_SHIFT 0
60 #define BQ24190_REG_PCTCC 0x03 /* Pre-charge/Termination Current Cntl */
61 #define BQ24190_REG_PCTCC_IPRECHG_MASK (BIT(7) | BIT(6) | BIT(5) | \
63 #define BQ24190_REG_PCTCC_IPRECHG_SHIFT 4
64 #define BQ24190_REG_PCTCC_IPRECHG_MIN 128
65 #define BQ24190_REG_PCTCC_IPRECHG_MAX 2048
66 #define BQ24190_REG_PCTCC_ITERM_MASK (BIT(3) | BIT(2) | BIT(1) | \
68 #define BQ24190_REG_PCTCC_ITERM_SHIFT 0
69 #define BQ24190_REG_PCTCC_ITERM_MIN 128
70 #define BQ24190_REG_PCTCC_ITERM_MAX 2048
72 #define BQ24190_REG_CVC 0x04 /* Charge Voltage Control */
73 #define BQ24190_REG_CVC_VREG_MASK (BIT(7) | BIT(6) | BIT(5) | \
74 BIT(4) | BIT(3) | BIT(2))
75 #define BQ24190_REG_CVC_VREG_SHIFT 2
76 #define BQ24190_REG_CVC_BATLOWV_MASK BIT(1)
77 #define BQ24190_REG_CVC_BATLOWV_SHIFT 1
78 #define BQ24190_REG_CVC_VRECHG_MASK BIT(0)
79 #define BQ24190_REG_CVC_VRECHG_SHIFT 0
81 #define BQ24190_REG_CTTC 0x05 /* Charge Term/Timer Control */
82 #define BQ24190_REG_CTTC_EN_TERM_MASK BIT(7)
83 #define BQ24190_REG_CTTC_EN_TERM_SHIFT 7
84 #define BQ24190_REG_CTTC_TERM_STAT_MASK BIT(6)
85 #define BQ24190_REG_CTTC_TERM_STAT_SHIFT 6
86 #define BQ24190_REG_CTTC_WATCHDOG_MASK (BIT(5) | BIT(4))
87 #define BQ24190_REG_CTTC_WATCHDOG_SHIFT 4
88 #define BQ24190_REG_CTTC_EN_TIMER_MASK BIT(3)
89 #define BQ24190_REG_CTTC_EN_TIMER_SHIFT 3
90 #define BQ24190_REG_CTTC_CHG_TIMER_MASK (BIT(2) | BIT(1))
91 #define BQ24190_REG_CTTC_CHG_TIMER_SHIFT 1
92 #define BQ24190_REG_CTTC_JEITA_ISET_MASK BIT(0)
93 #define BQ24190_REG_CTTC_JEITA_ISET_SHIFT 0
95 #define BQ24190_REG_ICTRC 0x06 /* IR Comp/Thermal Regulation Control */
96 #define BQ24190_REG_ICTRC_BAT_COMP_MASK (BIT(7) | BIT(6) | BIT(5))
97 #define BQ24190_REG_ICTRC_BAT_COMP_SHIFT 5
98 #define BQ24190_REG_ICTRC_VCLAMP_MASK (BIT(4) | BIT(3) | BIT(2))
99 #define BQ24190_REG_ICTRC_VCLAMP_SHIFT 2
100 #define BQ24190_REG_ICTRC_TREG_MASK (BIT(1) | BIT(0))
101 #define BQ24190_REG_ICTRC_TREG_SHIFT 0
103 #define BQ24190_REG_MOC 0x07 /* Misc. Operation Control */
104 #define BQ24190_REG_MOC_DPDM_EN_MASK BIT(7)
105 #define BQ24190_REG_MOC_DPDM_EN_SHIFT 7
106 #define BQ24190_REG_MOC_TMR2X_EN_MASK BIT(6)
107 #define BQ24190_REG_MOC_TMR2X_EN_SHIFT 6
108 #define BQ24190_REG_MOC_BATFET_DISABLE_MASK BIT(5)
109 #define BQ24190_REG_MOC_BATFET_DISABLE_SHIFT 5
110 #define BQ24190_REG_MOC_JEITA_VSET_MASK BIT(4)
111 #define BQ24190_REG_MOC_JEITA_VSET_SHIFT 4
112 #define BQ24190_REG_MOC_INT_MASK_MASK (BIT(1) | BIT(0))
113 #define BQ24190_REG_MOC_INT_MASK_SHIFT 0
115 #define BQ24190_REG_SS 0x08 /* System Status */
116 #define BQ24190_REG_SS_VBUS_STAT_MASK (BIT(7) | BIT(6))
117 #define BQ24190_REG_SS_VBUS_STAT_SHIFT 6
118 #define BQ24190_REG_SS_CHRG_STAT_MASK (BIT(5) | BIT(4))
119 #define BQ24190_REG_SS_CHRG_STAT_SHIFT 4
120 #define BQ24190_REG_SS_DPM_STAT_MASK BIT(3)
121 #define BQ24190_REG_SS_DPM_STAT_SHIFT 3
122 #define BQ24190_REG_SS_PG_STAT_MASK BIT(2)
123 #define BQ24190_REG_SS_PG_STAT_SHIFT 2
124 #define BQ24190_REG_SS_THERM_STAT_MASK BIT(1)
125 #define BQ24190_REG_SS_THERM_STAT_SHIFT 1
126 #define BQ24190_REG_SS_VSYS_STAT_MASK BIT(0)
127 #define BQ24190_REG_SS_VSYS_STAT_SHIFT 0
129 #define BQ24190_REG_F 0x09 /* Fault */
130 #define BQ24190_REG_F_WATCHDOG_FAULT_MASK BIT(7)
131 #define BQ24190_REG_F_WATCHDOG_FAULT_SHIFT 7
132 #define BQ24190_REG_F_BOOST_FAULT_MASK BIT(6)
133 #define BQ24190_REG_F_BOOST_FAULT_SHIFT 6
134 #define BQ24190_REG_F_CHRG_FAULT_MASK (BIT(5) | BIT(4))
135 #define BQ24190_REG_F_CHRG_FAULT_SHIFT 4
136 #define BQ24190_REG_F_BAT_FAULT_MASK BIT(3)
137 #define BQ24190_REG_F_BAT_FAULT_SHIFT 3
138 #define BQ24190_REG_F_NTC_FAULT_MASK (BIT(2) | BIT(1) | BIT(0))
139 #define BQ24190_REG_F_NTC_FAULT_SHIFT 0
141 #define BQ24190_REG_VPRS 0x0A /* Vendor/Part/Revision Status */
142 #define BQ24190_REG_VPRS_PN_MASK (BIT(5) | BIT(4) | BIT(3))
143 #define BQ24190_REG_VPRS_PN_SHIFT 3
144 #define BQ24190_REG_VPRS_PN_24190 0x4
145 #define BQ24190_REG_VPRS_PN_24192 0x5 /* Also 24193 */
146 #define BQ24190_REG_VPRS_PN_24192I 0x3
147 #define BQ24190_REG_VPRS_TS_PROFILE_MASK BIT(2)
148 #define BQ24190_REG_VPRS_TS_PROFILE_SHIFT 2
149 #define BQ24190_REG_VPRS_DEV_REG_MASK (BIT(1) | BIT(0))
150 #define BQ24190_REG_VPRS_DEV_REG_SHIFT 0
153 * The FAULT register is latched by the bq24190 (except for NTC_FAULT)
154 * so the first read after a fault returns the latched value and subsequent
155 * reads return the current value. In order to return the fault status
156 * to the user, have the interrupt handler save the reg's value and retrieve
157 * it in the appropriate health/status routine.
159 struct bq24190_dev_info {
160 struct i2c_client *client;
162 struct power_supply *charger;
163 struct power_supply *battery;
164 struct delayed_work input_current_limit_work;
165 char model_name[I2C_NAME_SIZE];
171 struct mutex f_reg_lock;
178 * The tables below provide a 2-way mapping for the value that goes in
179 * the register field and the real-world value that it represents.
180 * The index of the array is the value that goes in the register; the
181 * number at that index in the array is the real-world value that it
185 /* REG00[2:0] (IINLIM) in uAh */
186 static const int bq24190_isc_iinlim_values[] = {
187 100000, 150000, 500000, 900000, 1200000, 1500000, 2000000, 3000000
190 /* REG02[7:2] (ICHG) in uAh */
191 static const int bq24190_ccc_ichg_values[] = {
192 512000, 576000, 640000, 704000, 768000, 832000, 896000, 960000,
193 1024000, 1088000, 1152000, 1216000, 1280000, 1344000, 1408000, 1472000,
194 1536000, 1600000, 1664000, 1728000, 1792000, 1856000, 1920000, 1984000,
195 2048000, 2112000, 2176000, 2240000, 2304000, 2368000, 2432000, 2496000,
196 2560000, 2624000, 2688000, 2752000, 2816000, 2880000, 2944000, 3008000,
197 3072000, 3136000, 3200000, 3264000, 3328000, 3392000, 3456000, 3520000,
198 3584000, 3648000, 3712000, 3776000, 3840000, 3904000, 3968000, 4032000,
199 4096000, 4160000, 4224000, 4288000, 4352000, 4416000, 4480000, 4544000
202 /* REG04[7:2] (VREG) in uV */
203 static const int bq24190_cvc_vreg_values[] = {
204 3504000, 3520000, 3536000, 3552000, 3568000, 3584000, 3600000, 3616000,
205 3632000, 3648000, 3664000, 3680000, 3696000, 3712000, 3728000, 3744000,
206 3760000, 3776000, 3792000, 3808000, 3824000, 3840000, 3856000, 3872000,
207 3888000, 3904000, 3920000, 3936000, 3952000, 3968000, 3984000, 4000000,
208 4016000, 4032000, 4048000, 4064000, 4080000, 4096000, 4112000, 4128000,
209 4144000, 4160000, 4176000, 4192000, 4208000, 4224000, 4240000, 4256000,
210 4272000, 4288000, 4304000, 4320000, 4336000, 4352000, 4368000, 4384000,
214 /* REG06[1:0] (TREG) in tenths of degrees Celsius */
215 static const int bq24190_ictrc_treg_values[] = {
220 * Return the index in 'tbl' of greatest value that is less than or equal to
221 * 'val'. The index range returned is 0 to 'tbl_size' - 1. Assumes that
222 * the values in 'tbl' are sorted from smallest to largest and 'tbl_size'
225 static u8 bq24190_find_idx(const int tbl[], int tbl_size, int v)
229 for (i = 1; i < tbl_size; i++)
236 /* Basic driver I/O routines */
238 static int bq24190_read(struct bq24190_dev_info *bdi, u8 reg, u8 *data)
242 ret = i2c_smbus_read_byte_data(bdi->client, reg);
250 static int bq24190_write(struct bq24190_dev_info *bdi, u8 reg, u8 data)
252 return i2c_smbus_write_byte_data(bdi->client, reg, data);
255 static int bq24190_read_mask(struct bq24190_dev_info *bdi, u8 reg,
256 u8 mask, u8 shift, u8 *data)
261 ret = bq24190_read(bdi, reg, &v);
272 static int bq24190_write_mask(struct bq24190_dev_info *bdi, u8 reg,
273 u8 mask, u8 shift, u8 data)
278 ret = bq24190_read(bdi, reg, &v);
283 v |= ((data << shift) & mask);
285 return bq24190_write(bdi, reg, v);
288 static int bq24190_get_field_val(struct bq24190_dev_info *bdi,
289 u8 reg, u8 mask, u8 shift,
290 const int tbl[], int tbl_size,
296 ret = bq24190_read_mask(bdi, reg, mask, shift, &v);
300 v = (v >= tbl_size) ? (tbl_size - 1) : v;
306 static int bq24190_set_field_val(struct bq24190_dev_info *bdi,
307 u8 reg, u8 mask, u8 shift,
308 const int tbl[], int tbl_size,
313 idx = bq24190_find_idx(tbl, tbl_size, val);
315 return bq24190_write_mask(bdi, reg, mask, shift, idx);
320 * There are a numerous options that are configurable on the bq24190
321 * that go well beyond what the power_supply properties provide access to.
322 * Provide sysfs access to them so they can be examined and possibly modified
323 * on the fly. They will be provided for the charger power_supply object only
324 * and will be prefixed by 'f_' to make them easier to recognize.
327 #define BQ24190_SYSFS_FIELD(_name, r, f, m, store) \
329 .attr = __ATTR(f_##_name, m, bq24190_sysfs_show, store), \
330 .reg = BQ24190_REG_##r, \
331 .mask = BQ24190_REG_##r##_##f##_MASK, \
332 .shift = BQ24190_REG_##r##_##f##_SHIFT, \
335 #define BQ24190_SYSFS_FIELD_RW(_name, r, f) \
336 BQ24190_SYSFS_FIELD(_name, r, f, S_IWUSR | S_IRUGO, \
339 #define BQ24190_SYSFS_FIELD_RO(_name, r, f) \
340 BQ24190_SYSFS_FIELD(_name, r, f, S_IRUGO, NULL)
342 static ssize_t bq24190_sysfs_show(struct device *dev,
343 struct device_attribute *attr, char *buf);
344 static ssize_t bq24190_sysfs_store(struct device *dev,
345 struct device_attribute *attr, const char *buf, size_t count);
347 struct bq24190_sysfs_field_info {
348 struct device_attribute attr;
354 /* On i386 ptrace-abi.h defines SS that breaks the macro calls below. */
357 static struct bq24190_sysfs_field_info bq24190_sysfs_field_tbl[] = {
358 /* sysfs name reg field in reg */
359 BQ24190_SYSFS_FIELD_RW(en_hiz, ISC, EN_HIZ),
360 BQ24190_SYSFS_FIELD_RW(vindpm, ISC, VINDPM),
361 BQ24190_SYSFS_FIELD_RW(iinlim, ISC, IINLIM),
362 BQ24190_SYSFS_FIELD_RW(chg_config, POC, CHG_CONFIG),
363 BQ24190_SYSFS_FIELD_RW(sys_min, POC, SYS_MIN),
364 BQ24190_SYSFS_FIELD_RW(boost_lim, POC, BOOST_LIM),
365 BQ24190_SYSFS_FIELD_RW(ichg, CCC, ICHG),
366 BQ24190_SYSFS_FIELD_RW(force_20_pct, CCC, FORCE_20PCT),
367 BQ24190_SYSFS_FIELD_RW(iprechg, PCTCC, IPRECHG),
368 BQ24190_SYSFS_FIELD_RW(iterm, PCTCC, ITERM),
369 BQ24190_SYSFS_FIELD_RW(vreg, CVC, VREG),
370 BQ24190_SYSFS_FIELD_RW(batlowv, CVC, BATLOWV),
371 BQ24190_SYSFS_FIELD_RW(vrechg, CVC, VRECHG),
372 BQ24190_SYSFS_FIELD_RW(en_term, CTTC, EN_TERM),
373 BQ24190_SYSFS_FIELD_RW(term_stat, CTTC, TERM_STAT),
374 BQ24190_SYSFS_FIELD_RO(watchdog, CTTC, WATCHDOG),
375 BQ24190_SYSFS_FIELD_RW(en_timer, CTTC, EN_TIMER),
376 BQ24190_SYSFS_FIELD_RW(chg_timer, CTTC, CHG_TIMER),
377 BQ24190_SYSFS_FIELD_RW(jeta_iset, CTTC, JEITA_ISET),
378 BQ24190_SYSFS_FIELD_RW(bat_comp, ICTRC, BAT_COMP),
379 BQ24190_SYSFS_FIELD_RW(vclamp, ICTRC, VCLAMP),
380 BQ24190_SYSFS_FIELD_RW(treg, ICTRC, TREG),
381 BQ24190_SYSFS_FIELD_RW(dpdm_en, MOC, DPDM_EN),
382 BQ24190_SYSFS_FIELD_RW(tmr2x_en, MOC, TMR2X_EN),
383 BQ24190_SYSFS_FIELD_RW(batfet_disable, MOC, BATFET_DISABLE),
384 BQ24190_SYSFS_FIELD_RW(jeita_vset, MOC, JEITA_VSET),
385 BQ24190_SYSFS_FIELD_RO(int_mask, MOC, INT_MASK),
386 BQ24190_SYSFS_FIELD_RO(vbus_stat, SS, VBUS_STAT),
387 BQ24190_SYSFS_FIELD_RO(chrg_stat, SS, CHRG_STAT),
388 BQ24190_SYSFS_FIELD_RO(dpm_stat, SS, DPM_STAT),
389 BQ24190_SYSFS_FIELD_RO(pg_stat, SS, PG_STAT),
390 BQ24190_SYSFS_FIELD_RO(therm_stat, SS, THERM_STAT),
391 BQ24190_SYSFS_FIELD_RO(vsys_stat, SS, VSYS_STAT),
392 BQ24190_SYSFS_FIELD_RO(watchdog_fault, F, WATCHDOG_FAULT),
393 BQ24190_SYSFS_FIELD_RO(boost_fault, F, BOOST_FAULT),
394 BQ24190_SYSFS_FIELD_RO(chrg_fault, F, CHRG_FAULT),
395 BQ24190_SYSFS_FIELD_RO(bat_fault, F, BAT_FAULT),
396 BQ24190_SYSFS_FIELD_RO(ntc_fault, F, NTC_FAULT),
397 BQ24190_SYSFS_FIELD_RO(pn, VPRS, PN),
398 BQ24190_SYSFS_FIELD_RO(ts_profile, VPRS, TS_PROFILE),
399 BQ24190_SYSFS_FIELD_RO(dev_reg, VPRS, DEV_REG),
402 static struct attribute *
403 bq24190_sysfs_attrs[ARRAY_SIZE(bq24190_sysfs_field_tbl) + 1];
405 static const struct attribute_group bq24190_sysfs_attr_group = {
406 .attrs = bq24190_sysfs_attrs,
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);
487 ret = bq24190_write_mask(bdi, info->reg, info->mask, info->shift, v);
491 pm_runtime_mark_last_busy(bdi->dev);
492 pm_runtime_put_autosuspend(bdi->dev);
497 static int bq24190_sysfs_create_group(struct bq24190_dev_info *bdi)
499 bq24190_sysfs_init_attrs();
501 return sysfs_create_group(&bdi->charger->dev.kobj,
502 &bq24190_sysfs_attr_group);
505 static void bq24190_sysfs_remove_group(struct bq24190_dev_info *bdi)
507 sysfs_remove_group(&bdi->charger->dev.kobj, &bq24190_sysfs_attr_group);
510 static int bq24190_sysfs_create_group(struct bq24190_dev_info *bdi)
515 static inline void bq24190_sysfs_remove_group(struct bq24190_dev_info *bdi) {}
518 #ifdef CONFIG_REGULATOR
519 static int bq24190_set_charge_mode(struct regulator_dev *dev, u8 val)
521 struct bq24190_dev_info *bdi = rdev_get_drvdata(dev);
524 ret = pm_runtime_get_sync(bdi->dev);
526 dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", ret);
527 pm_runtime_put_noidle(bdi->dev);
531 ret = bq24190_write_mask(bdi, BQ24190_REG_POC,
532 BQ24190_REG_POC_CHG_CONFIG_MASK,
533 BQ24190_REG_POC_CHG_CONFIG_SHIFT, val);
535 pm_runtime_mark_last_busy(bdi->dev);
536 pm_runtime_put_autosuspend(bdi->dev);
541 static int bq24190_vbus_enable(struct regulator_dev *dev)
543 return bq24190_set_charge_mode(dev, BQ24190_REG_POC_CHG_CONFIG_OTG);
546 static int bq24190_vbus_disable(struct regulator_dev *dev)
548 return bq24190_set_charge_mode(dev, BQ24190_REG_POC_CHG_CONFIG_CHARGE);
551 static int bq24190_vbus_is_enabled(struct regulator_dev *dev)
553 struct bq24190_dev_info *bdi = rdev_get_drvdata(dev);
557 ret = pm_runtime_get_sync(bdi->dev);
559 dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", ret);
560 pm_runtime_put_noidle(bdi->dev);
564 ret = bq24190_read_mask(bdi, BQ24190_REG_POC,
565 BQ24190_REG_POC_CHG_CONFIG_MASK,
566 BQ24190_REG_POC_CHG_CONFIG_SHIFT, &val);
568 pm_runtime_mark_last_busy(bdi->dev);
569 pm_runtime_put_autosuspend(bdi->dev);
571 return ret ? ret : val == BQ24190_REG_POC_CHG_CONFIG_OTG;
574 static const struct regulator_ops bq24190_vbus_ops = {
575 .enable = bq24190_vbus_enable,
576 .disable = bq24190_vbus_disable,
577 .is_enabled = bq24190_vbus_is_enabled,
580 static const struct regulator_desc bq24190_vbus_desc = {
581 .name = "usb_otg_vbus",
582 .type = REGULATOR_VOLTAGE,
583 .owner = THIS_MODULE,
584 .ops = &bq24190_vbus_ops,
589 static const struct regulator_init_data bq24190_vbus_init_data = {
591 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
595 static int bq24190_register_vbus_regulator(struct bq24190_dev_info *bdi)
597 struct bq24190_platform_data *pdata = bdi->dev->platform_data;
598 struct regulator_config cfg = { };
599 struct regulator_dev *reg;
603 if (pdata && pdata->regulator_init_data)
604 cfg.init_data = pdata->regulator_init_data;
606 cfg.init_data = &bq24190_vbus_init_data;
607 cfg.driver_data = bdi;
608 reg = devm_regulator_register(bdi->dev, &bq24190_vbus_desc, &cfg);
611 dev_err(bdi->dev, "Can't register regulator: %d\n", ret);
617 static int bq24190_register_vbus_regulator(struct bq24190_dev_info *bdi)
623 static int bq24190_set_config(struct bq24190_dev_info *bdi)
628 ret = bq24190_read(bdi, BQ24190_REG_CTTC, &v);
632 bdi->watchdog = ((v & BQ24190_REG_CTTC_WATCHDOG_MASK) >>
633 BQ24190_REG_CTTC_WATCHDOG_SHIFT);
636 * According to the "Host Mode and default Mode" section of the
637 * manual, a write to any register causes the bq24190 to switch
638 * from default mode to host mode. It will switch back to default
639 * mode after a WDT timeout unless the WDT is turned off as well.
640 * So, by simply turning off the WDT, we accomplish both with the
643 v &= ~BQ24190_REG_CTTC_WATCHDOG_MASK;
645 ret = bq24190_write(bdi, BQ24190_REG_CTTC, v);
650 v = bdi->sys_min / 100 - 30; // manual section 9.5.1.2, table 9
651 ret = bq24190_write_mask(bdi, BQ24190_REG_POC,
652 BQ24190_REG_POC_SYS_MIN_MASK,
653 BQ24190_REG_POC_SYS_MIN_SHIFT,
660 v = bdi->iprechg / 128 - 1; // manual section 9.5.1.4, table 11
661 ret = bq24190_write_mask(bdi, BQ24190_REG_PCTCC,
662 BQ24190_REG_PCTCC_IPRECHG_MASK,
663 BQ24190_REG_PCTCC_IPRECHG_SHIFT,
670 v = bdi->iterm / 128 - 1; // manual section 9.5.1.4, table 11
671 ret = bq24190_write_mask(bdi, BQ24190_REG_PCTCC,
672 BQ24190_REG_PCTCC_ITERM_MASK,
673 BQ24190_REG_PCTCC_ITERM_SHIFT,
682 static int bq24190_register_reset(struct bq24190_dev_info *bdi)
684 int ret, limit = 100;
688 * This prop. can be passed on device instantiation from platform code:
689 * struct property_entry pe[] =
690 * { PROPERTY_ENTRY_BOOL("disable-reset"), ... };
691 * struct i2c_board_info bi =
692 * { .type = "bq24190", .addr = 0x6b, .properties = pe, .irq = irq };
693 * struct i2c_adapter ad = { ... };
694 * i2c_add_adapter(&ad);
695 * i2c_new_device(&ad, &bi);
697 if (device_property_read_bool(bdi->dev, "disable-reset"))
700 /* Reset the registers */
701 ret = bq24190_write_mask(bdi, BQ24190_REG_POC,
702 BQ24190_REG_POC_RESET_MASK,
703 BQ24190_REG_POC_RESET_SHIFT,
708 /* Reset bit will be cleared by hardware so poll until it is */
710 ret = bq24190_read_mask(bdi, BQ24190_REG_POC,
711 BQ24190_REG_POC_RESET_MASK,
712 BQ24190_REG_POC_RESET_SHIFT,
720 usleep_range(100, 200);
726 /* Charger power supply property routines */
728 static int bq24190_charger_get_charge_type(struct bq24190_dev_info *bdi,
729 union power_supply_propval *val)
734 ret = bq24190_read_mask(bdi, BQ24190_REG_POC,
735 BQ24190_REG_POC_CHG_CONFIG_MASK,
736 BQ24190_REG_POC_CHG_CONFIG_SHIFT,
741 /* If POC[CHG_CONFIG] (REG01[5:4]) == 0, charge is disabled */
743 type = POWER_SUPPLY_CHARGE_TYPE_NONE;
745 ret = bq24190_read_mask(bdi, BQ24190_REG_CCC,
746 BQ24190_REG_CCC_FORCE_20PCT_MASK,
747 BQ24190_REG_CCC_FORCE_20PCT_SHIFT,
752 type = (v) ? POWER_SUPPLY_CHARGE_TYPE_TRICKLE :
753 POWER_SUPPLY_CHARGE_TYPE_FAST;
761 static int bq24190_charger_set_charge_type(struct bq24190_dev_info *bdi,
762 const union power_supply_propval *val)
764 u8 chg_config, force_20pct, en_term;
768 * According to the "Termination when REG02[0] = 1" section of
769 * the bq24190 manual, the trickle charge could be less than the
770 * termination current so it recommends turning off the termination
773 * Note: AFAICT from the datasheet, the user will have to manually
774 * turn off the charging when in 20% mode. If its not turned off,
775 * there could be battery damage. So, use this mode at your own risk.
777 switch (val->intval) {
778 case POWER_SUPPLY_CHARGE_TYPE_NONE:
781 case POWER_SUPPLY_CHARGE_TYPE_TRICKLE:
786 case POWER_SUPPLY_CHARGE_TYPE_FAST:
795 if (chg_config) { /* Enabling the charger */
796 ret = bq24190_write_mask(bdi, BQ24190_REG_CCC,
797 BQ24190_REG_CCC_FORCE_20PCT_MASK,
798 BQ24190_REG_CCC_FORCE_20PCT_SHIFT,
803 ret = bq24190_write_mask(bdi, BQ24190_REG_CTTC,
804 BQ24190_REG_CTTC_EN_TERM_MASK,
805 BQ24190_REG_CTTC_EN_TERM_SHIFT,
811 return bq24190_write_mask(bdi, BQ24190_REG_POC,
812 BQ24190_REG_POC_CHG_CONFIG_MASK,
813 BQ24190_REG_POC_CHG_CONFIG_SHIFT, chg_config);
816 static int bq24190_charger_get_health(struct bq24190_dev_info *bdi,
817 union power_supply_propval *val)
822 mutex_lock(&bdi->f_reg_lock);
824 mutex_unlock(&bdi->f_reg_lock);
826 if (v & BQ24190_REG_F_NTC_FAULT_MASK) {
827 switch (v >> BQ24190_REG_F_NTC_FAULT_SHIFT & 0x7) {
828 case 0x1: /* TS1 Cold */
829 case 0x3: /* TS2 Cold */
830 case 0x5: /* Both Cold */
831 health = POWER_SUPPLY_HEALTH_COLD;
833 case 0x2: /* TS1 Hot */
834 case 0x4: /* TS2 Hot */
835 case 0x6: /* Both Hot */
836 health = POWER_SUPPLY_HEALTH_OVERHEAT;
839 health = POWER_SUPPLY_HEALTH_UNKNOWN;
841 } else if (v & BQ24190_REG_F_BAT_FAULT_MASK) {
842 health = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
843 } else if (v & BQ24190_REG_F_CHRG_FAULT_MASK) {
844 switch (v >> BQ24190_REG_F_CHRG_FAULT_SHIFT & 0x3) {
845 case 0x1: /* Input Fault (VBUS OVP or VBAT<VBUS<3.8V) */
847 * This could be over-voltage or under-voltage
848 * and there's no way to tell which. Instead
849 * of looking foolish and returning 'OVERVOLTAGE'
850 * when its really under-voltage, just return
853 health = POWER_SUPPLY_HEALTH_UNSPEC_FAILURE;
855 case 0x2: /* Thermal Shutdown */
856 health = POWER_SUPPLY_HEALTH_OVERHEAT;
858 case 0x3: /* Charge Safety Timer Expiration */
859 health = POWER_SUPPLY_HEALTH_SAFETY_TIMER_EXPIRE;
861 default: /* prevent compiler warning */
864 } else if (v & BQ24190_REG_F_BOOST_FAULT_MASK) {
866 * This could be over-current or over-voltage but there's
867 * no way to tell which. Return 'OVERVOLTAGE' since there
868 * isn't an 'OVERCURRENT' value defined that we can return
869 * even if it was over-current.
871 health = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
873 health = POWER_SUPPLY_HEALTH_GOOD;
876 val->intval = health;
881 static int bq24190_charger_get_online(struct bq24190_dev_info *bdi,
882 union power_supply_propval *val)
884 u8 pg_stat, batfet_disable;
887 ret = bq24190_read_mask(bdi, BQ24190_REG_SS,
888 BQ24190_REG_SS_PG_STAT_MASK,
889 BQ24190_REG_SS_PG_STAT_SHIFT, &pg_stat);
893 ret = bq24190_read_mask(bdi, BQ24190_REG_MOC,
894 BQ24190_REG_MOC_BATFET_DISABLE_MASK,
895 BQ24190_REG_MOC_BATFET_DISABLE_SHIFT, &batfet_disable);
899 val->intval = pg_stat && !batfet_disable;
904 static int bq24190_battery_set_online(struct bq24190_dev_info *bdi,
905 const union power_supply_propval *val);
906 static int bq24190_battery_get_status(struct bq24190_dev_info *bdi,
907 union power_supply_propval *val);
908 static int bq24190_battery_get_temp_alert_max(struct bq24190_dev_info *bdi,
909 union power_supply_propval *val);
910 static int bq24190_battery_set_temp_alert_max(struct bq24190_dev_info *bdi,
911 const union power_supply_propval *val);
913 static int bq24190_charger_set_online(struct bq24190_dev_info *bdi,
914 const union power_supply_propval *val)
916 return bq24190_battery_set_online(bdi, val);
919 static int bq24190_charger_get_status(struct bq24190_dev_info *bdi,
920 union power_supply_propval *val)
922 return bq24190_battery_get_status(bdi, val);
925 static int bq24190_charger_get_temp_alert_max(struct bq24190_dev_info *bdi,
926 union power_supply_propval *val)
928 return bq24190_battery_get_temp_alert_max(bdi, val);
931 static int bq24190_charger_set_temp_alert_max(struct bq24190_dev_info *bdi,
932 const union power_supply_propval *val)
934 return bq24190_battery_set_temp_alert_max(bdi, val);
937 static int bq24190_charger_get_precharge(struct bq24190_dev_info *bdi,
938 union power_supply_propval *val)
943 ret = bq24190_read_mask(bdi, BQ24190_REG_PCTCC,
944 BQ24190_REG_PCTCC_IPRECHG_MASK,
945 BQ24190_REG_PCTCC_IPRECHG_SHIFT, &v);
949 val->intval = ++v * 128 * 1000;
953 static int bq24190_charger_get_charge_term(struct bq24190_dev_info *bdi,
954 union power_supply_propval *val)
959 ret = bq24190_read_mask(bdi, BQ24190_REG_PCTCC,
960 BQ24190_REG_PCTCC_ITERM_MASK,
961 BQ24190_REG_PCTCC_ITERM_SHIFT, &v);
965 val->intval = ++v * 128 * 1000;
969 static int bq24190_charger_get_current(struct bq24190_dev_info *bdi,
970 union power_supply_propval *val)
975 ret = bq24190_get_field_val(bdi, BQ24190_REG_CCC,
976 BQ24190_REG_CCC_ICHG_MASK, BQ24190_REG_CCC_ICHG_SHIFT,
977 bq24190_ccc_ichg_values,
978 ARRAY_SIZE(bq24190_ccc_ichg_values), &curr);
982 ret = bq24190_read_mask(bdi, BQ24190_REG_CCC,
983 BQ24190_REG_CCC_FORCE_20PCT_MASK,
984 BQ24190_REG_CCC_FORCE_20PCT_SHIFT, &v);
988 /* If FORCE_20PCT is enabled, then current is 20% of ICHG value */
996 static int bq24190_charger_get_current_max(struct bq24190_dev_info *bdi,
997 union power_supply_propval *val)
999 int idx = ARRAY_SIZE(bq24190_ccc_ichg_values) - 1;
1001 val->intval = bq24190_ccc_ichg_values[idx];
1005 static int bq24190_charger_set_current(struct bq24190_dev_info *bdi,
1006 const union power_supply_propval *val)
1009 int ret, curr = val->intval;
1011 ret = bq24190_read_mask(bdi, BQ24190_REG_CCC,
1012 BQ24190_REG_CCC_FORCE_20PCT_MASK,
1013 BQ24190_REG_CCC_FORCE_20PCT_SHIFT, &v);
1017 /* If FORCE_20PCT is enabled, have to multiply value passed in by 5 */
1021 return bq24190_set_field_val(bdi, BQ24190_REG_CCC,
1022 BQ24190_REG_CCC_ICHG_MASK, BQ24190_REG_CCC_ICHG_SHIFT,
1023 bq24190_ccc_ichg_values,
1024 ARRAY_SIZE(bq24190_ccc_ichg_values), curr);
1027 static int bq24190_charger_get_voltage(struct bq24190_dev_info *bdi,
1028 union power_supply_propval *val)
1032 ret = bq24190_get_field_val(bdi, BQ24190_REG_CVC,
1033 BQ24190_REG_CVC_VREG_MASK, BQ24190_REG_CVC_VREG_SHIFT,
1034 bq24190_cvc_vreg_values,
1035 ARRAY_SIZE(bq24190_cvc_vreg_values), &voltage);
1039 val->intval = voltage;
1043 static int bq24190_charger_get_voltage_max(struct bq24190_dev_info *bdi,
1044 union power_supply_propval *val)
1046 int idx = ARRAY_SIZE(bq24190_cvc_vreg_values) - 1;
1048 val->intval = bq24190_cvc_vreg_values[idx];
1052 static int bq24190_charger_set_voltage(struct bq24190_dev_info *bdi,
1053 const union power_supply_propval *val)
1055 return bq24190_set_field_val(bdi, BQ24190_REG_CVC,
1056 BQ24190_REG_CVC_VREG_MASK, BQ24190_REG_CVC_VREG_SHIFT,
1057 bq24190_cvc_vreg_values,
1058 ARRAY_SIZE(bq24190_cvc_vreg_values), val->intval);
1061 static int bq24190_charger_get_iinlimit(struct bq24190_dev_info *bdi,
1062 union power_supply_propval *val)
1066 ret = bq24190_get_field_val(bdi, BQ24190_REG_ISC,
1067 BQ24190_REG_ISC_IINLIM_MASK,
1068 BQ24190_REG_ISC_IINLIM_SHIFT,
1069 bq24190_isc_iinlim_values,
1070 ARRAY_SIZE(bq24190_isc_iinlim_values), &iinlimit);
1074 val->intval = iinlimit;
1078 static int bq24190_charger_set_iinlimit(struct bq24190_dev_info *bdi,
1079 const union power_supply_propval *val)
1081 return bq24190_set_field_val(bdi, BQ24190_REG_ISC,
1082 BQ24190_REG_ISC_IINLIM_MASK,
1083 BQ24190_REG_ISC_IINLIM_SHIFT,
1084 bq24190_isc_iinlim_values,
1085 ARRAY_SIZE(bq24190_isc_iinlim_values), val->intval);
1088 static int bq24190_charger_get_property(struct power_supply *psy,
1089 enum power_supply_property psp, union power_supply_propval *val)
1091 struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
1094 dev_dbg(bdi->dev, "prop: %d\n", psp);
1096 ret = pm_runtime_get_sync(bdi->dev);
1098 pm_runtime_put_noidle(bdi->dev);
1103 case POWER_SUPPLY_PROP_CHARGE_TYPE:
1104 ret = bq24190_charger_get_charge_type(bdi, val);
1106 case POWER_SUPPLY_PROP_HEALTH:
1107 ret = bq24190_charger_get_health(bdi, val);
1109 case POWER_SUPPLY_PROP_ONLINE:
1110 ret = bq24190_charger_get_online(bdi, val);
1112 case POWER_SUPPLY_PROP_STATUS:
1113 ret = bq24190_charger_get_status(bdi, val);
1115 case POWER_SUPPLY_PROP_TEMP_ALERT_MAX:
1116 ret = bq24190_charger_get_temp_alert_max(bdi, val);
1118 case POWER_SUPPLY_PROP_PRECHARGE_CURRENT:
1119 ret = bq24190_charger_get_precharge(bdi, val);
1121 case POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT:
1122 ret = bq24190_charger_get_charge_term(bdi, val);
1124 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
1125 ret = bq24190_charger_get_current(bdi, val);
1127 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX:
1128 ret = bq24190_charger_get_current_max(bdi, val);
1130 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
1131 ret = bq24190_charger_get_voltage(bdi, val);
1133 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX:
1134 ret = bq24190_charger_get_voltage_max(bdi, val);
1136 case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
1137 ret = bq24190_charger_get_iinlimit(bdi, val);
1139 case POWER_SUPPLY_PROP_SCOPE:
1140 val->intval = POWER_SUPPLY_SCOPE_SYSTEM;
1143 case POWER_SUPPLY_PROP_MODEL_NAME:
1144 val->strval = bdi->model_name;
1147 case POWER_SUPPLY_PROP_MANUFACTURER:
1148 val->strval = BQ24190_MANUFACTURER;
1155 pm_runtime_mark_last_busy(bdi->dev);
1156 pm_runtime_put_autosuspend(bdi->dev);
1161 static int bq24190_charger_set_property(struct power_supply *psy,
1162 enum power_supply_property psp,
1163 const union power_supply_propval *val)
1165 struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
1168 dev_dbg(bdi->dev, "prop: %d\n", psp);
1170 ret = pm_runtime_get_sync(bdi->dev);
1172 pm_runtime_put_noidle(bdi->dev);
1177 case POWER_SUPPLY_PROP_ONLINE:
1178 ret = bq24190_charger_set_online(bdi, val);
1180 case POWER_SUPPLY_PROP_TEMP_ALERT_MAX:
1181 ret = bq24190_charger_set_temp_alert_max(bdi, val);
1183 case POWER_SUPPLY_PROP_CHARGE_TYPE:
1184 ret = bq24190_charger_set_charge_type(bdi, val);
1186 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
1187 ret = bq24190_charger_set_current(bdi, val);
1189 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
1190 ret = bq24190_charger_set_voltage(bdi, val);
1192 case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
1193 ret = bq24190_charger_set_iinlimit(bdi, val);
1199 pm_runtime_mark_last_busy(bdi->dev);
1200 pm_runtime_put_autosuspend(bdi->dev);
1205 static int bq24190_charger_property_is_writeable(struct power_supply *psy,
1206 enum power_supply_property psp)
1209 case POWER_SUPPLY_PROP_ONLINE:
1210 case POWER_SUPPLY_PROP_TEMP_ALERT_MAX:
1211 case POWER_SUPPLY_PROP_CHARGE_TYPE:
1212 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
1213 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
1214 case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
1221 static void bq24190_input_current_limit_work(struct work_struct *work)
1223 struct bq24190_dev_info *bdi =
1224 container_of(work, struct bq24190_dev_info,
1225 input_current_limit_work.work);
1227 power_supply_set_input_current_limit_from_supplier(bdi->charger);
1230 /* Sync the input-current-limit with our parent supply (if we have one) */
1231 static void bq24190_charger_external_power_changed(struct power_supply *psy)
1233 struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
1236 * The Power-Good detection may take up to 220ms, sometimes
1237 * the external charger detection is quicker, and the bq24190 will
1238 * reset to iinlim based on its own charger detection (which is not
1239 * hooked up when using external charger detection) resulting in a
1240 * too low default 500mA iinlim. Delay setting the input-current-limit
1241 * for 300ms to avoid this.
1243 queue_delayed_work(system_wq, &bdi->input_current_limit_work,
1244 msecs_to_jiffies(300));
1247 static enum power_supply_property bq24190_charger_properties[] = {
1248 POWER_SUPPLY_PROP_CHARGE_TYPE,
1249 POWER_SUPPLY_PROP_HEALTH,
1250 POWER_SUPPLY_PROP_ONLINE,
1251 POWER_SUPPLY_PROP_STATUS,
1252 POWER_SUPPLY_PROP_TEMP_ALERT_MAX,
1253 POWER_SUPPLY_PROP_PRECHARGE_CURRENT,
1254 POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT,
1255 POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT,
1256 POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX,
1257 POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE,
1258 POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX,
1259 POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT,
1260 POWER_SUPPLY_PROP_SCOPE,
1261 POWER_SUPPLY_PROP_MODEL_NAME,
1262 POWER_SUPPLY_PROP_MANUFACTURER,
1265 static char *bq24190_charger_supplied_to[] = {
1269 static const struct power_supply_desc bq24190_charger_desc = {
1270 .name = "bq24190-charger",
1271 .type = POWER_SUPPLY_TYPE_USB,
1272 .properties = bq24190_charger_properties,
1273 .num_properties = ARRAY_SIZE(bq24190_charger_properties),
1274 .get_property = bq24190_charger_get_property,
1275 .set_property = bq24190_charger_set_property,
1276 .property_is_writeable = bq24190_charger_property_is_writeable,
1277 .external_power_changed = bq24190_charger_external_power_changed,
1280 /* Battery power supply property routines */
1282 static int bq24190_battery_get_status(struct bq24190_dev_info *bdi,
1283 union power_supply_propval *val)
1285 u8 ss_reg, chrg_fault;
1288 mutex_lock(&bdi->f_reg_lock);
1289 chrg_fault = bdi->f_reg;
1290 mutex_unlock(&bdi->f_reg_lock);
1292 chrg_fault &= BQ24190_REG_F_CHRG_FAULT_MASK;
1293 chrg_fault >>= BQ24190_REG_F_CHRG_FAULT_SHIFT;
1295 ret = bq24190_read(bdi, BQ24190_REG_SS, &ss_reg);
1300 * The battery must be discharging when any of these are true:
1301 * - there is no good power source;
1302 * - there is a charge fault.
1303 * Could also be discharging when in "supplement mode" but
1304 * there is no way to tell when its in that mode.
1306 if (!(ss_reg & BQ24190_REG_SS_PG_STAT_MASK) || chrg_fault) {
1307 status = POWER_SUPPLY_STATUS_DISCHARGING;
1309 ss_reg &= BQ24190_REG_SS_CHRG_STAT_MASK;
1310 ss_reg >>= BQ24190_REG_SS_CHRG_STAT_SHIFT;
1313 case 0x0: /* Not Charging */
1314 status = POWER_SUPPLY_STATUS_NOT_CHARGING;
1316 case 0x1: /* Pre-charge */
1317 case 0x2: /* Fast Charging */
1318 status = POWER_SUPPLY_STATUS_CHARGING;
1320 case 0x3: /* Charge Termination Done */
1321 status = POWER_SUPPLY_STATUS_FULL;
1329 val->intval = status;
1334 static int bq24190_battery_get_health(struct bq24190_dev_info *bdi,
1335 union power_supply_propval *val)
1340 mutex_lock(&bdi->f_reg_lock);
1342 mutex_unlock(&bdi->f_reg_lock);
1344 if (v & BQ24190_REG_F_BAT_FAULT_MASK) {
1345 health = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
1347 v &= BQ24190_REG_F_NTC_FAULT_MASK;
1348 v >>= BQ24190_REG_F_NTC_FAULT_SHIFT;
1351 case 0x0: /* Normal */
1352 health = POWER_SUPPLY_HEALTH_GOOD;
1354 case 0x1: /* TS1 Cold */
1355 case 0x3: /* TS2 Cold */
1356 case 0x5: /* Both Cold */
1357 health = POWER_SUPPLY_HEALTH_COLD;
1359 case 0x2: /* TS1 Hot */
1360 case 0x4: /* TS2 Hot */
1361 case 0x6: /* Both Hot */
1362 health = POWER_SUPPLY_HEALTH_OVERHEAT;
1365 health = POWER_SUPPLY_HEALTH_UNKNOWN;
1369 val->intval = health;
1373 static int bq24190_battery_get_online(struct bq24190_dev_info *bdi,
1374 union power_supply_propval *val)
1379 ret = bq24190_read_mask(bdi, BQ24190_REG_MOC,
1380 BQ24190_REG_MOC_BATFET_DISABLE_MASK,
1381 BQ24190_REG_MOC_BATFET_DISABLE_SHIFT, &batfet_disable);
1385 val->intval = !batfet_disable;
1389 static int bq24190_battery_set_online(struct bq24190_dev_info *bdi,
1390 const union power_supply_propval *val)
1392 return bq24190_write_mask(bdi, BQ24190_REG_MOC,
1393 BQ24190_REG_MOC_BATFET_DISABLE_MASK,
1394 BQ24190_REG_MOC_BATFET_DISABLE_SHIFT, !val->intval);
1397 static int bq24190_battery_get_temp_alert_max(struct bq24190_dev_info *bdi,
1398 union power_supply_propval *val)
1402 ret = bq24190_get_field_val(bdi, BQ24190_REG_ICTRC,
1403 BQ24190_REG_ICTRC_TREG_MASK,
1404 BQ24190_REG_ICTRC_TREG_SHIFT,
1405 bq24190_ictrc_treg_values,
1406 ARRAY_SIZE(bq24190_ictrc_treg_values), &temp);
1414 static int bq24190_battery_set_temp_alert_max(struct bq24190_dev_info *bdi,
1415 const union power_supply_propval *val)
1417 return bq24190_set_field_val(bdi, BQ24190_REG_ICTRC,
1418 BQ24190_REG_ICTRC_TREG_MASK,
1419 BQ24190_REG_ICTRC_TREG_SHIFT,
1420 bq24190_ictrc_treg_values,
1421 ARRAY_SIZE(bq24190_ictrc_treg_values), val->intval);
1424 static int bq24190_battery_get_property(struct power_supply *psy,
1425 enum power_supply_property psp, union power_supply_propval *val)
1427 struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
1430 dev_warn(bdi->dev, "warning: /sys/class/power_supply/bq24190-battery is deprecated\n");
1431 dev_dbg(bdi->dev, "prop: %d\n", psp);
1433 ret = pm_runtime_get_sync(bdi->dev);
1435 pm_runtime_put_noidle(bdi->dev);
1440 case POWER_SUPPLY_PROP_STATUS:
1441 ret = bq24190_battery_get_status(bdi, val);
1443 case POWER_SUPPLY_PROP_HEALTH:
1444 ret = bq24190_battery_get_health(bdi, val);
1446 case POWER_SUPPLY_PROP_ONLINE:
1447 ret = bq24190_battery_get_online(bdi, val);
1449 case POWER_SUPPLY_PROP_TECHNOLOGY:
1450 /* Could be Li-on or Li-polymer but no way to tell which */
1451 val->intval = POWER_SUPPLY_TECHNOLOGY_UNKNOWN;
1454 case POWER_SUPPLY_PROP_TEMP_ALERT_MAX:
1455 ret = bq24190_battery_get_temp_alert_max(bdi, val);
1457 case POWER_SUPPLY_PROP_SCOPE:
1458 val->intval = POWER_SUPPLY_SCOPE_SYSTEM;
1465 pm_runtime_mark_last_busy(bdi->dev);
1466 pm_runtime_put_autosuspend(bdi->dev);
1471 static int bq24190_battery_set_property(struct power_supply *psy,
1472 enum power_supply_property psp,
1473 const union power_supply_propval *val)
1475 struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
1478 dev_warn(bdi->dev, "warning: /sys/class/power_supply/bq24190-battery is deprecated\n");
1479 dev_dbg(bdi->dev, "prop: %d\n", psp);
1481 ret = pm_runtime_get_sync(bdi->dev);
1483 pm_runtime_put_noidle(bdi->dev);
1488 case POWER_SUPPLY_PROP_ONLINE:
1489 ret = bq24190_battery_set_online(bdi, val);
1491 case POWER_SUPPLY_PROP_TEMP_ALERT_MAX:
1492 ret = bq24190_battery_set_temp_alert_max(bdi, val);
1498 pm_runtime_mark_last_busy(bdi->dev);
1499 pm_runtime_put_autosuspend(bdi->dev);
1504 static int bq24190_battery_property_is_writeable(struct power_supply *psy,
1505 enum power_supply_property psp)
1510 case POWER_SUPPLY_PROP_ONLINE:
1511 case POWER_SUPPLY_PROP_TEMP_ALERT_MAX:
1521 static enum power_supply_property bq24190_battery_properties[] = {
1522 POWER_SUPPLY_PROP_STATUS,
1523 POWER_SUPPLY_PROP_HEALTH,
1524 POWER_SUPPLY_PROP_ONLINE,
1525 POWER_SUPPLY_PROP_TECHNOLOGY,
1526 POWER_SUPPLY_PROP_TEMP_ALERT_MAX,
1527 POWER_SUPPLY_PROP_SCOPE,
1530 static const struct power_supply_desc bq24190_battery_desc = {
1531 .name = "bq24190-battery",
1532 .type = POWER_SUPPLY_TYPE_BATTERY,
1533 .properties = bq24190_battery_properties,
1534 .num_properties = ARRAY_SIZE(bq24190_battery_properties),
1535 .get_property = bq24190_battery_get_property,
1536 .set_property = bq24190_battery_set_property,
1537 .property_is_writeable = bq24190_battery_property_is_writeable,
1540 static void bq24190_check_status(struct bq24190_dev_info *bdi)
1542 const u8 battery_mask_ss = BQ24190_REG_SS_CHRG_STAT_MASK;
1543 const u8 battery_mask_f = BQ24190_REG_F_BAT_FAULT_MASK
1544 | BQ24190_REG_F_NTC_FAULT_MASK;
1545 bool alert_charger = false, alert_battery = false;
1546 u8 ss_reg = 0, f_reg = 0;
1549 ret = bq24190_read(bdi, BQ24190_REG_SS, &ss_reg);
1551 dev_err(bdi->dev, "Can't read SS reg: %d\n", ret);
1557 ret = bq24190_read(bdi, BQ24190_REG_F, &f_reg);
1559 dev_err(bdi->dev, "Can't read F reg: %d\n", ret);
1562 } while (f_reg && ++i < 2);
1564 /* ignore over/under voltage fault after disconnect */
1565 if (f_reg == (1 << BQ24190_REG_F_CHRG_FAULT_SHIFT) &&
1566 !(ss_reg & BQ24190_REG_SS_PG_STAT_MASK))
1569 if (f_reg != bdi->f_reg) {
1571 "Fault: boost %d, charge %d, battery %d, ntc %d\n",
1572 !!(f_reg & BQ24190_REG_F_BOOST_FAULT_MASK),
1573 !!(f_reg & BQ24190_REG_F_CHRG_FAULT_MASK),
1574 !!(f_reg & BQ24190_REG_F_BAT_FAULT_MASK),
1575 !!(f_reg & BQ24190_REG_F_NTC_FAULT_MASK));
1577 mutex_lock(&bdi->f_reg_lock);
1578 if ((bdi->f_reg & battery_mask_f) != (f_reg & battery_mask_f))
1579 alert_battery = true;
1580 if ((bdi->f_reg & ~battery_mask_f) != (f_reg & ~battery_mask_f))
1581 alert_charger = true;
1583 mutex_unlock(&bdi->f_reg_lock);
1586 if (ss_reg != bdi->ss_reg) {
1588 * The device is in host mode so when PG_STAT goes from 1->0
1589 * (i.e., power removed) HIZ needs to be disabled.
1591 if ((bdi->ss_reg & BQ24190_REG_SS_PG_STAT_MASK) &&
1592 !(ss_reg & BQ24190_REG_SS_PG_STAT_MASK)) {
1593 ret = bq24190_write_mask(bdi, BQ24190_REG_ISC,
1594 BQ24190_REG_ISC_EN_HIZ_MASK,
1595 BQ24190_REG_ISC_EN_HIZ_SHIFT,
1598 dev_err(bdi->dev, "Can't access ISC reg: %d\n",
1602 if ((bdi->ss_reg & battery_mask_ss) != (ss_reg & battery_mask_ss))
1603 alert_battery = true;
1604 if ((bdi->ss_reg & ~battery_mask_ss) != (ss_reg & ~battery_mask_ss))
1605 alert_charger = true;
1606 bdi->ss_reg = ss_reg;
1609 if (alert_charger || alert_battery)
1610 power_supply_changed(bdi->charger);
1611 if (alert_battery && bdi->battery)
1612 power_supply_changed(bdi->battery);
1614 dev_dbg(bdi->dev, "ss_reg: 0x%02x, f_reg: 0x%02x\n", ss_reg, f_reg);
1617 static irqreturn_t bq24190_irq_handler_thread(int irq, void *data)
1619 struct bq24190_dev_info *bdi = data;
1622 bdi->irq_event = true;
1623 error = pm_runtime_get_sync(bdi->dev);
1625 dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", error);
1626 pm_runtime_put_noidle(bdi->dev);
1629 bq24190_check_status(bdi);
1630 pm_runtime_mark_last_busy(bdi->dev);
1631 pm_runtime_put_autosuspend(bdi->dev);
1632 bdi->irq_event = false;
1637 static int bq24190_hw_init(struct bq24190_dev_info *bdi)
1642 /* First check that the device really is what its supposed to be */
1643 ret = bq24190_read_mask(bdi, BQ24190_REG_VPRS,
1644 BQ24190_REG_VPRS_PN_MASK,
1645 BQ24190_REG_VPRS_PN_SHIFT,
1650 if (v != BQ24190_REG_VPRS_PN_24190 &&
1651 v != BQ24190_REG_VPRS_PN_24192I) {
1652 dev_err(bdi->dev, "Error unknown model: 0x%02x\n", v);
1656 ret = bq24190_register_reset(bdi);
1660 ret = bq24190_set_config(bdi);
1664 return bq24190_read(bdi, BQ24190_REG_SS, &bdi->ss_reg);
1667 static int bq24190_get_config(struct bq24190_dev_info *bdi)
1669 const char * const s = "ti,system-minimum-microvolt";
1670 struct power_supply_battery_info info = {};
1673 if (device_property_read_u32(bdi->dev, s, &v) == 0) {
1675 if (v >= BQ24190_REG_POC_SYS_MIN_MIN
1676 && v <= BQ24190_REG_POC_SYS_MIN_MAX)
1679 dev_warn(bdi->dev, "invalid value for %s: %u\n", s, v);
1682 if (bdi->dev->of_node &&
1683 !power_supply_get_battery_info(bdi->charger, &info)) {
1684 v = info.precharge_current_ua / 1000;
1685 if (v >= BQ24190_REG_PCTCC_IPRECHG_MIN
1686 && v <= BQ24190_REG_PCTCC_IPRECHG_MAX)
1689 dev_warn(bdi->dev, "invalid value for battery:precharge-current-microamp: %d\n",
1692 v = info.charge_term_current_ua / 1000;
1693 if (v >= BQ24190_REG_PCTCC_ITERM_MIN
1694 && v <= BQ24190_REG_PCTCC_ITERM_MAX)
1697 dev_warn(bdi->dev, "invalid value for battery:charge-term-current-microamp: %d\n",
1704 static int bq24190_probe(struct i2c_client *client,
1705 const struct i2c_device_id *id)
1707 struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);
1708 struct device *dev = &client->dev;
1709 struct power_supply_config charger_cfg = {}, battery_cfg = {};
1710 struct bq24190_dev_info *bdi;
1713 if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) {
1714 dev_err(dev, "No support for SMBUS_BYTE_DATA\n");
1718 bdi = devm_kzalloc(dev, sizeof(*bdi), GFP_KERNEL);
1720 dev_err(dev, "Can't alloc bdi struct\n");
1724 bdi->client = client;
1726 strncpy(bdi->model_name, id->name, I2C_NAME_SIZE);
1727 mutex_init(&bdi->f_reg_lock);
1729 bdi->ss_reg = BQ24190_REG_SS_VBUS_STAT_MASK; /* impossible state */
1730 INIT_DELAYED_WORK(&bdi->input_current_limit_work,
1731 bq24190_input_current_limit_work);
1733 i2c_set_clientdata(client, bdi);
1735 if (client->irq <= 0) {
1736 dev_err(dev, "Can't get irq info\n");
1740 pm_runtime_enable(dev);
1741 pm_runtime_use_autosuspend(dev);
1742 pm_runtime_set_autosuspend_delay(dev, 600);
1743 ret = pm_runtime_get_sync(dev);
1745 dev_err(dev, "pm_runtime_get failed: %i\n", ret);
1749 charger_cfg.drv_data = bdi;
1750 charger_cfg.of_node = dev->of_node;
1751 charger_cfg.supplied_to = bq24190_charger_supplied_to;
1752 charger_cfg.num_supplicants = ARRAY_SIZE(bq24190_charger_supplied_to),
1753 bdi->charger = power_supply_register(dev, &bq24190_charger_desc,
1755 if (IS_ERR(bdi->charger)) {
1756 dev_err(dev, "Can't register charger\n");
1757 ret = PTR_ERR(bdi->charger);
1761 /* the battery class is deprecated and will be removed. */
1762 /* in the interim, this property hides it. */
1763 if (!device_property_read_bool(dev, "omit-battery-class")) {
1764 battery_cfg.drv_data = bdi;
1765 bdi->battery = power_supply_register(dev, &bq24190_battery_desc,
1767 if (IS_ERR(bdi->battery)) {
1768 dev_err(dev, "Can't register battery\n");
1769 ret = PTR_ERR(bdi->battery);
1774 ret = bq24190_get_config(bdi);
1776 dev_err(dev, "Can't get devicetree config\n");
1780 ret = bq24190_hw_init(bdi);
1782 dev_err(dev, "Hardware init failed\n");
1786 ret = bq24190_sysfs_create_group(bdi);
1788 dev_err(dev, "Can't create sysfs entries\n");
1792 bdi->initialized = true;
1794 ret = devm_request_threaded_irq(dev, client->irq, NULL,
1795 bq24190_irq_handler_thread,
1796 IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
1797 "bq24190-charger", bdi);
1799 dev_err(dev, "Can't set up irq handler\n");
1803 ret = bq24190_register_vbus_regulator(bdi);
1807 enable_irq_wake(client->irq);
1809 pm_runtime_mark_last_busy(dev);
1810 pm_runtime_put_autosuspend(dev);
1815 bq24190_sysfs_remove_group(bdi);
1818 if (!IS_ERR_OR_NULL(bdi->battery))
1819 power_supply_unregister(bdi->battery);
1820 power_supply_unregister(bdi->charger);
1823 pm_runtime_put_sync(dev);
1824 pm_runtime_dont_use_autosuspend(dev);
1825 pm_runtime_disable(dev);
1829 static int bq24190_remove(struct i2c_client *client)
1831 struct bq24190_dev_info *bdi = i2c_get_clientdata(client);
1834 error = pm_runtime_get_sync(bdi->dev);
1836 dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", error);
1837 pm_runtime_put_noidle(bdi->dev);
1840 bq24190_register_reset(bdi);
1841 bq24190_sysfs_remove_group(bdi);
1843 power_supply_unregister(bdi->battery);
1844 power_supply_unregister(bdi->charger);
1846 pm_runtime_put_sync(bdi->dev);
1847 pm_runtime_dont_use_autosuspend(bdi->dev);
1848 pm_runtime_disable(bdi->dev);
1853 static __maybe_unused int bq24190_runtime_suspend(struct device *dev)
1855 struct i2c_client *client = to_i2c_client(dev);
1856 struct bq24190_dev_info *bdi = i2c_get_clientdata(client);
1858 if (!bdi->initialized)
1861 dev_dbg(bdi->dev, "%s\n", __func__);
1866 static __maybe_unused int bq24190_runtime_resume(struct device *dev)
1868 struct i2c_client *client = to_i2c_client(dev);
1869 struct bq24190_dev_info *bdi = i2c_get_clientdata(client);
1871 if (!bdi->initialized)
1874 if (!bdi->irq_event) {
1875 dev_dbg(bdi->dev, "checking events on possible wakeirq\n");
1876 bq24190_check_status(bdi);
1882 static __maybe_unused int bq24190_pm_suspend(struct device *dev)
1884 struct i2c_client *client = to_i2c_client(dev);
1885 struct bq24190_dev_info *bdi = i2c_get_clientdata(client);
1888 error = pm_runtime_get_sync(bdi->dev);
1890 dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", error);
1891 pm_runtime_put_noidle(bdi->dev);
1894 bq24190_register_reset(bdi);
1897 pm_runtime_mark_last_busy(bdi->dev);
1898 pm_runtime_put_autosuspend(bdi->dev);
1904 static __maybe_unused int bq24190_pm_resume(struct device *dev)
1906 struct i2c_client *client = to_i2c_client(dev);
1907 struct bq24190_dev_info *bdi = i2c_get_clientdata(client);
1911 bdi->ss_reg = BQ24190_REG_SS_VBUS_STAT_MASK; /* impossible state */
1913 error = pm_runtime_get_sync(bdi->dev);
1915 dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", error);
1916 pm_runtime_put_noidle(bdi->dev);
1919 bq24190_register_reset(bdi);
1920 bq24190_set_config(bdi);
1921 bq24190_read(bdi, BQ24190_REG_SS, &bdi->ss_reg);
1924 pm_runtime_mark_last_busy(bdi->dev);
1925 pm_runtime_put_autosuspend(bdi->dev);
1928 /* Things may have changed while suspended so alert upper layer */
1929 power_supply_changed(bdi->charger);
1931 power_supply_changed(bdi->battery);
1936 static const struct dev_pm_ops bq24190_pm_ops = {
1937 SET_RUNTIME_PM_OPS(bq24190_runtime_suspend, bq24190_runtime_resume,
1939 SET_SYSTEM_SLEEP_PM_OPS(bq24190_pm_suspend, bq24190_pm_resume)
1942 static const struct i2c_device_id bq24190_i2c_ids[] = {
1947 MODULE_DEVICE_TABLE(i2c, bq24190_i2c_ids);
1950 static const struct of_device_id bq24190_of_match[] = {
1951 { .compatible = "ti,bq24190", },
1952 { .compatible = "ti,bq24192i", },
1955 MODULE_DEVICE_TABLE(of, bq24190_of_match);
1957 static const struct of_device_id bq24190_of_match[] = {
1962 static struct i2c_driver bq24190_driver = {
1963 .probe = bq24190_probe,
1964 .remove = bq24190_remove,
1965 .id_table = bq24190_i2c_ids,
1967 .name = "bq24190-charger",
1968 .pm = &bq24190_pm_ops,
1969 .of_match_table = of_match_ptr(bq24190_of_match),
1972 module_i2c_driver(bq24190_driver);
1974 MODULE_LICENSE("GPL");
1975 MODULE_AUTHOR("Mark A. Greer <mgreer@animalcreek.com>");
1976 MODULE_DESCRIPTION("TI BQ24190 Charger Driver");