xref: /linux/drivers/power/supply/bq24190_charger.c (revision 07b43820437bd96f31f5d7f9baf4453fcb7dedbf)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Driver for the TI bq24190 battery charger.
4  *
5  * Author: Mark A. Greer <mgreer@animalcreek.com>
6  */
7 
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>
20 
21 #define	BQ24190_MANUFACTURER	"Texas Instruments"
22 
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) | \
27 						 BIT(3))
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
31 
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_CHG_CONFIG_OTG_ALT	0x3
43 #define BQ24296_REG_POC_OTG_CONFIG_MASK		BIT(5)
44 #define BQ24296_REG_POC_OTG_CONFIG_SHIFT	5
45 #define BQ24296_REG_POC_CHG_CONFIG_MASK		BIT(4)
46 #define BQ24296_REG_POC_CHG_CONFIG_SHIFT	4
47 #define BQ24296_REG_POC_OTG_CONFIG_DISABLE	0x0
48 #define BQ24296_REG_POC_OTG_CONFIG_OTG		0x1
49 #define BQ24190_REG_POC_SYS_MIN_MASK		(BIT(3) | BIT(2) | BIT(1))
50 #define BQ24190_REG_POC_SYS_MIN_SHIFT		1
51 #define BQ24190_REG_POC_SYS_MIN_MIN			3000
52 #define BQ24190_REG_POC_SYS_MIN_MAX			3700
53 #define BQ24190_REG_POC_BOOST_LIM_MASK		BIT(0)
54 #define BQ24190_REG_POC_BOOST_LIM_SHIFT		0
55 
56 #define BQ24190_REG_CCC		0x02 /* Charge Current Control */
57 #define BQ24190_REG_CCC_ICHG_MASK		(BIT(7) | BIT(6) | BIT(5) | \
58 						 BIT(4) | BIT(3) | BIT(2))
59 #define BQ24190_REG_CCC_ICHG_SHIFT		2
60 #define BQ24190_REG_CCC_FORCE_20PCT_MASK	BIT(0)
61 #define BQ24190_REG_CCC_FORCE_20PCT_SHIFT	0
62 
63 #define BQ24190_REG_PCTCC	0x03 /* Pre-charge/Termination Current Cntl */
64 #define BQ24190_REG_PCTCC_IPRECHG_MASK		(BIT(7) | BIT(6) | BIT(5) | \
65 						 BIT(4))
66 #define BQ24190_REG_PCTCC_IPRECHG_SHIFT		4
67 #define BQ24190_REG_PCTCC_IPRECHG_MIN			128
68 #define BQ24190_REG_PCTCC_IPRECHG_MAX			2048
69 #define BQ24190_REG_PCTCC_ITERM_MASK		(BIT(3) | BIT(2) | BIT(1) | \
70 						 BIT(0))
71 #define BQ24190_REG_PCTCC_ITERM_SHIFT		0
72 #define BQ24190_REG_PCTCC_ITERM_MIN			128
73 #define BQ24190_REG_PCTCC_ITERM_MAX			2048
74 
75 #define BQ24190_REG_CVC		0x04 /* Charge Voltage Control */
76 #define BQ24190_REG_CVC_VREG_MASK		(BIT(7) | BIT(6) | BIT(5) | \
77 						 BIT(4) | BIT(3) | BIT(2))
78 #define BQ24190_REG_CVC_VREG_SHIFT		2
79 #define BQ24190_REG_CVC_BATLOWV_MASK		BIT(1)
80 #define BQ24190_REG_CVC_BATLOWV_SHIFT		1
81 #define BQ24190_REG_CVC_VRECHG_MASK		BIT(0)
82 #define BQ24190_REG_CVC_VRECHG_SHIFT		0
83 
84 #define BQ24190_REG_CTTC	0x05 /* Charge Term/Timer Control */
85 #define BQ24190_REG_CTTC_EN_TERM_MASK		BIT(7)
86 #define BQ24190_REG_CTTC_EN_TERM_SHIFT		7
87 #define BQ24190_REG_CTTC_TERM_STAT_MASK		BIT(6)
88 #define BQ24190_REG_CTTC_TERM_STAT_SHIFT	6
89 #define BQ24190_REG_CTTC_WATCHDOG_MASK		(BIT(5) | BIT(4))
90 #define BQ24190_REG_CTTC_WATCHDOG_SHIFT		4
91 #define BQ24190_REG_CTTC_EN_TIMER_MASK		BIT(3)
92 #define BQ24190_REG_CTTC_EN_TIMER_SHIFT		3
93 #define BQ24190_REG_CTTC_CHG_TIMER_MASK		(BIT(2) | BIT(1))
94 #define BQ24190_REG_CTTC_CHG_TIMER_SHIFT	1
95 #define BQ24190_REG_CTTC_JEITA_ISET_MASK	BIT(0)
96 #define BQ24190_REG_CTTC_JEITA_ISET_SHIFT	0
97 
98 #define BQ24190_REG_ICTRC	0x06 /* IR Comp/Thermal Regulation Control */
99 #define BQ24190_REG_ICTRC_BAT_COMP_MASK		(BIT(7) | BIT(6) | BIT(5))
100 #define BQ24190_REG_ICTRC_BAT_COMP_SHIFT	5
101 #define BQ24190_REG_ICTRC_VCLAMP_MASK		(BIT(4) | BIT(3) | BIT(2))
102 #define BQ24190_REG_ICTRC_VCLAMP_SHIFT		2
103 #define BQ24190_REG_ICTRC_TREG_MASK		(BIT(1) | BIT(0))
104 #define BQ24190_REG_ICTRC_TREG_SHIFT		0
105 
106 #define BQ24190_REG_MOC		0x07 /* Misc. Operation Control */
107 #define BQ24190_REG_MOC_DPDM_EN_MASK		BIT(7)
108 #define BQ24190_REG_MOC_DPDM_EN_SHIFT		7
109 #define BQ24190_REG_MOC_TMR2X_EN_MASK		BIT(6)
110 #define BQ24190_REG_MOC_TMR2X_EN_SHIFT		6
111 #define BQ24190_REG_MOC_BATFET_DISABLE_MASK	BIT(5)
112 #define BQ24190_REG_MOC_BATFET_DISABLE_SHIFT	5
113 #define BQ24190_REG_MOC_JEITA_VSET_MASK		BIT(4)
114 #define BQ24190_REG_MOC_JEITA_VSET_SHIFT	4
115 #define BQ24190_REG_MOC_INT_MASK_MASK		(BIT(1) | BIT(0))
116 #define BQ24190_REG_MOC_INT_MASK_SHIFT		0
117 
118 #define BQ24190_REG_SS		0x08 /* System Status */
119 #define BQ24190_REG_SS_VBUS_STAT_MASK		(BIT(7) | BIT(6))
120 #define BQ24190_REG_SS_VBUS_STAT_SHIFT		6
121 #define BQ24190_REG_SS_CHRG_STAT_MASK		(BIT(5) | BIT(4))
122 #define BQ24190_REG_SS_CHRG_STAT_SHIFT		4
123 #define BQ24190_REG_SS_DPM_STAT_MASK		BIT(3)
124 #define BQ24190_REG_SS_DPM_STAT_SHIFT		3
125 #define BQ24190_REG_SS_PG_STAT_MASK		BIT(2)
126 #define BQ24190_REG_SS_PG_STAT_SHIFT		2
127 #define BQ24190_REG_SS_THERM_STAT_MASK		BIT(1)
128 #define BQ24190_REG_SS_THERM_STAT_SHIFT		1
129 #define BQ24190_REG_SS_VSYS_STAT_MASK		BIT(0)
130 #define BQ24190_REG_SS_VSYS_STAT_SHIFT		0
131 
132 #define BQ24190_REG_F		0x09 /* Fault */
133 #define BQ24190_REG_F_WATCHDOG_FAULT_MASK	BIT(7)
134 #define BQ24190_REG_F_WATCHDOG_FAULT_SHIFT	7
135 #define BQ24190_REG_F_BOOST_FAULT_MASK		BIT(6)
136 #define BQ24190_REG_F_BOOST_FAULT_SHIFT		6
137 #define BQ24190_REG_F_CHRG_FAULT_MASK		(BIT(5) | BIT(4))
138 #define BQ24190_REG_F_CHRG_FAULT_SHIFT		4
139 #define BQ24190_REG_F_BAT_FAULT_MASK		BIT(3)
140 #define BQ24190_REG_F_BAT_FAULT_SHIFT		3
141 #define BQ24190_REG_F_NTC_FAULT_MASK		(BIT(2) | BIT(1) | BIT(0))
142 #define BQ24190_REG_F_NTC_FAULT_SHIFT		0
143 #define BQ24296_REG_F_NTC_FAULT_MASK		(BIT(1) | BIT(0))
144 #define BQ24296_REG_F_NTC_FAULT_SHIFT		0
145 
146 #define BQ24190_REG_VPRS	0x0A /* Vendor/Part/Revision Status */
147 #define BQ24190_REG_VPRS_PN_MASK		(BIT(5) | BIT(4) | BIT(3))
148 #define BQ24190_REG_VPRS_PN_SHIFT		3
149 #define BQ24190_REG_VPRS_PN_24190		0x4
150 #define BQ24190_REG_VPRS_PN_24192		0x5 /* Also 24193, 24196 */
151 #define BQ24190_REG_VPRS_PN_24192I		0x3
152 #define BQ24296_REG_VPRS_PN_MASK		(BIT(7) | BIT(6) | BIT(5))
153 #define BQ24296_REG_VPRS_PN_SHIFT		5
154 #define BQ24296_REG_VPRS_PN_24296		0x1
155 #define BQ24296_REG_VPRS_PN_24297		0x3
156 #define BQ24190_REG_VPRS_TS_PROFILE_MASK	BIT(2)
157 #define BQ24190_REG_VPRS_TS_PROFILE_SHIFT	2
158 #define BQ24190_REG_VPRS_DEV_REG_MASK		(BIT(1) | BIT(0))
159 #define BQ24190_REG_VPRS_DEV_REG_SHIFT		0
160 
161 /*
162  * The tables below provide a 2-way mapping for the value that goes in
163  * the register field and the real-world value that it represents.
164  * The index of the array is the value that goes in the register; the
165  * number at that index in the array is the real-world value that it
166  * represents.
167  */
168 
169 /* REG00[2:0] (IINLIM) in uAh */
170 static const int bq24190_isc_iinlim_values[] = {
171 	 100000,  150000,  500000,  900000, 1200000, 1500000, 2000000, 3000000
172 };
173 
174 /* REG02[7:2] (ICHG) in uAh */
175 static const int bq24190_ccc_ichg_values[] = {
176 	 512000,  576000,  640000,  704000,  768000,  832000,  896000,  960000,
177 	1024000, 1088000, 1152000, 1216000, 1280000, 1344000, 1408000, 1472000,
178 	1536000, 1600000, 1664000, 1728000, 1792000, 1856000, 1920000, 1984000,
179 	2048000, 2112000, 2176000, 2240000, 2304000, 2368000, 2432000, 2496000,
180 	2560000, 2624000, 2688000, 2752000, 2816000, 2880000, 2944000, 3008000,
181 	3072000, 3136000, 3200000, 3264000, 3328000, 3392000, 3456000, 3520000,
182 	3584000, 3648000, 3712000, 3776000, 3840000, 3904000, 3968000, 4032000,
183 	4096000, 4160000, 4224000, 4288000, 4352000, 4416000, 4480000, 4544000
184 };
185 
186 /* ICHG higher than 3008mA is not supported in BQ24296 */
187 #define BQ24296_CCC_ICHG_VALUES_LEN	40
188 
189 /* REG04[7:2] (VREG) in uV */
190 static const int bq24190_cvc_vreg_values[] = {
191 	3504000, 3520000, 3536000, 3552000, 3568000, 3584000, 3600000, 3616000,
192 	3632000, 3648000, 3664000, 3680000, 3696000, 3712000, 3728000, 3744000,
193 	3760000, 3776000, 3792000, 3808000, 3824000, 3840000, 3856000, 3872000,
194 	3888000, 3904000, 3920000, 3936000, 3952000, 3968000, 3984000, 4000000,
195 	4016000, 4032000, 4048000, 4064000, 4080000, 4096000, 4112000, 4128000,
196 	4144000, 4160000, 4176000, 4192000, 4208000, 4224000, 4240000, 4256000,
197 	4272000, 4288000, 4304000, 4320000, 4336000, 4352000, 4368000, 4384000,
198 	4400000
199 };
200 
201 /* REG06[1:0] (TREG) in tenths of degrees Celsius */
202 static const int bq24190_ictrc_treg_values[] = {
203 	600, 800, 1000, 1200
204 };
205 
206 enum bq24190_chip {
207 	BQ24190,
208 	BQ24192,
209 	BQ24192i,
210 	BQ24193,
211 	BQ24196,
212 	BQ24296,
213 	BQ24297,
214 };
215 
216 /*
217  * The FAULT register is latched by the bq24190 (except for NTC_FAULT)
218  * so the first read after a fault returns the latched value and subsequent
219  * reads return the current value.  In order to return the fault status
220  * to the user, have the interrupt handler save the reg's value and retrieve
221  * it in the appropriate health/status routine.
222  */
223 struct bq24190_dev_info {
224 	struct i2c_client		*client;
225 	struct device			*dev;
226 	struct extcon_dev		*edev;
227 	struct power_supply		*charger;
228 	struct power_supply		*battery;
229 	struct delayed_work		input_current_limit_work;
230 	char				model_name[I2C_NAME_SIZE];
231 	bool				initialized;
232 	bool				irq_event;
233 	bool				otg_vbus_enabled;
234 	int				charge_type;
235 	u16				sys_min;
236 	u16				iprechg;
237 	u16				iterm;
238 	u32				ichg;
239 	u32				ichg_max;
240 	u32				vreg;
241 	u32				vreg_max;
242 	struct mutex			f_reg_lock;
243 	u8				f_reg;
244 	u8				ss_reg;
245 	u8				watchdog;
246 	const struct bq24190_chip_info	*info;
247 };
248 
249 struct bq24190_chip_info {
250 	int ichg_array_size;
251 #ifdef CONFIG_REGULATOR
252 	const struct regulator_desc *vbus_desc;
253 #endif
254 	int (*check_chip)(struct bq24190_dev_info *bdi);
255 	int (*set_chg_config)(struct bq24190_dev_info *bdi, const u8 chg_config);
256 	int (*set_otg_vbus)(struct bq24190_dev_info *bdi, bool enable);
257 	u8 ntc_fault_mask;
258 	int (*get_ntc_status)(const u8 value);
259 };
260 
261 static int bq24190_charger_set_charge_type(struct bq24190_dev_info *bdi,
262 					   const union power_supply_propval *val);
263 
264 static const unsigned int bq24190_usb_extcon_cable[] = {
265 	EXTCON_USB,
266 	EXTCON_NONE,
267 };
268 
269 
270 /*
271  * Return the index in 'tbl' of greatest value that is less than or equal to
272  * 'val'.  The index range returned is 0 to 'tbl_size' - 1.  Assumes that
273  * the values in 'tbl' are sorted from smallest to largest and 'tbl_size'
274  * is less than 2^8.
275  */
bq24190_find_idx(const int tbl[],int tbl_size,int v)276 static u8 bq24190_find_idx(const int tbl[], int tbl_size, int v)
277 {
278 	int i;
279 
280 	for (i = 1; i < tbl_size; i++)
281 		if (v < tbl[i])
282 			break;
283 
284 	return i - 1;
285 }
286 
287 /* Basic driver I/O routines */
288 
bq24190_read(struct bq24190_dev_info * bdi,u8 reg,u8 * data)289 static int bq24190_read(struct bq24190_dev_info *bdi, u8 reg, u8 *data)
290 {
291 	int ret;
292 
293 	ret = i2c_smbus_read_byte_data(bdi->client, reg);
294 	if (ret < 0)
295 		return ret;
296 
297 	*data = ret;
298 	return 0;
299 }
300 
bq24190_write(struct bq24190_dev_info * bdi,u8 reg,u8 data)301 static int bq24190_write(struct bq24190_dev_info *bdi, u8 reg, u8 data)
302 {
303 	return i2c_smbus_write_byte_data(bdi->client, reg, data);
304 }
305 
bq24190_read_mask(struct bq24190_dev_info * bdi,u8 reg,u8 mask,u8 shift,u8 * data)306 static int bq24190_read_mask(struct bq24190_dev_info *bdi, u8 reg,
307 		u8 mask, u8 shift, u8 *data)
308 {
309 	u8 v;
310 	int ret;
311 
312 	ret = bq24190_read(bdi, reg, &v);
313 	if (ret < 0)
314 		return ret;
315 
316 	v &= mask;
317 	v >>= shift;
318 	*data = v;
319 
320 	return 0;
321 }
322 
bq24190_write_mask(struct bq24190_dev_info * bdi,u8 reg,u8 mask,u8 shift,u8 data)323 static int bq24190_write_mask(struct bq24190_dev_info *bdi, u8 reg,
324 		u8 mask, u8 shift, u8 data)
325 {
326 	u8 v;
327 	int ret;
328 
329 	ret = bq24190_read(bdi, reg, &v);
330 	if (ret < 0)
331 		return ret;
332 
333 	v &= ~mask;
334 	v |= ((data << shift) & mask);
335 
336 	return bq24190_write(bdi, reg, v);
337 }
338 
bq24190_get_field_val(struct bq24190_dev_info * bdi,u8 reg,u8 mask,u8 shift,const int tbl[],int tbl_size,int * val)339 static int bq24190_get_field_val(struct bq24190_dev_info *bdi,
340 		u8 reg, u8 mask, u8 shift,
341 		const int tbl[], int tbl_size,
342 		int *val)
343 {
344 	u8 v;
345 	int ret;
346 
347 	ret = bq24190_read_mask(bdi, reg, mask, shift, &v);
348 	if (ret < 0)
349 		return ret;
350 
351 	v = (v >= tbl_size) ? (tbl_size - 1) : v;
352 	*val = tbl[v];
353 
354 	return 0;
355 }
356 
bq24190_set_field_val(struct bq24190_dev_info * bdi,u8 reg,u8 mask,u8 shift,const int tbl[],int tbl_size,int val)357 static int bq24190_set_field_val(struct bq24190_dev_info *bdi,
358 		u8 reg, u8 mask, u8 shift,
359 		const int tbl[], int tbl_size,
360 		int val)
361 {
362 	u8 idx;
363 
364 	idx = bq24190_find_idx(tbl, tbl_size, val);
365 
366 	return bq24190_write_mask(bdi, reg, mask, shift, idx);
367 }
368 
369 #ifdef CONFIG_SYSFS
370 /*
371  * There are a numerous options that are configurable on the bq24190
372  * that go well beyond what the power_supply properties provide access to.
373  * Provide sysfs access to them so they can be examined and possibly modified
374  * on the fly.  They will be provided for the charger power_supply object only
375  * and will be prefixed by 'f_' to make them easier to recognize.
376  */
377 
378 #define BQ24190_SYSFS_FIELD(_name, r, f, m, store)			\
379 {									\
380 	.attr	= __ATTR(f_##_name, m, bq24190_sysfs_show, store),	\
381 	.reg	= BQ24190_REG_##r,					\
382 	.mask	= BQ24190_REG_##r##_##f##_MASK,				\
383 	.shift	= BQ24190_REG_##r##_##f##_SHIFT,			\
384 }
385 
386 #define BQ24190_SYSFS_FIELD_RW(_name, r, f)				\
387 		BQ24190_SYSFS_FIELD(_name, r, f, S_IWUSR | S_IRUGO,	\
388 				bq24190_sysfs_store)
389 
390 #define BQ24190_SYSFS_FIELD_RO(_name, r, f)				\
391 		BQ24190_SYSFS_FIELD(_name, r, f, S_IRUGO, NULL)
392 
393 static ssize_t bq24190_sysfs_show(struct device *dev,
394 		struct device_attribute *attr, char *buf);
395 static ssize_t bq24190_sysfs_store(struct device *dev,
396 		struct device_attribute *attr, const char *buf, size_t count);
397 
398 struct bq24190_sysfs_field_info {
399 	struct device_attribute	attr;
400 	u8	reg;
401 	u8	mask;
402 	u8	shift;
403 };
404 
405 /* On i386 ptrace-abi.h defines SS that breaks the macro calls below. */
406 #undef SS
407 
408 static struct bq24190_sysfs_field_info bq24190_sysfs_field_tbl[] = {
409 			/*	sysfs name	reg	field in reg */
410 	BQ24190_SYSFS_FIELD_RW(en_hiz,		ISC,	EN_HIZ),
411 	BQ24190_SYSFS_FIELD_RW(vindpm,		ISC,	VINDPM),
412 	BQ24190_SYSFS_FIELD_RW(iinlim,		ISC,	IINLIM),
413 	BQ24190_SYSFS_FIELD_RW(chg_config,	POC,	CHG_CONFIG),
414 	BQ24190_SYSFS_FIELD_RW(sys_min,		POC,	SYS_MIN),
415 	BQ24190_SYSFS_FIELD_RW(boost_lim,	POC,	BOOST_LIM),
416 	BQ24190_SYSFS_FIELD_RW(ichg,		CCC,	ICHG),
417 	BQ24190_SYSFS_FIELD_RW(force_20_pct,	CCC,	FORCE_20PCT),
418 	BQ24190_SYSFS_FIELD_RW(iprechg,		PCTCC,	IPRECHG),
419 	BQ24190_SYSFS_FIELD_RW(iterm,		PCTCC,	ITERM),
420 	BQ24190_SYSFS_FIELD_RW(vreg,		CVC,	VREG),
421 	BQ24190_SYSFS_FIELD_RW(batlowv,		CVC,	BATLOWV),
422 	BQ24190_SYSFS_FIELD_RW(vrechg,		CVC,	VRECHG),
423 	BQ24190_SYSFS_FIELD_RW(en_term,		CTTC,	EN_TERM),
424 	BQ24190_SYSFS_FIELD_RW(term_stat,	CTTC,	TERM_STAT),
425 	BQ24190_SYSFS_FIELD_RO(watchdog,	CTTC,	WATCHDOG),
426 	BQ24190_SYSFS_FIELD_RW(en_timer,	CTTC,	EN_TIMER),
427 	BQ24190_SYSFS_FIELD_RW(chg_timer,	CTTC,	CHG_TIMER),
428 	BQ24190_SYSFS_FIELD_RW(jeita_iset,	CTTC,	JEITA_ISET),
429 	BQ24190_SYSFS_FIELD_RW(bat_comp,	ICTRC,	BAT_COMP),
430 	BQ24190_SYSFS_FIELD_RW(vclamp,		ICTRC,	VCLAMP),
431 	BQ24190_SYSFS_FIELD_RW(treg,		ICTRC,	TREG),
432 	BQ24190_SYSFS_FIELD_RW(dpdm_en,		MOC,	DPDM_EN),
433 	BQ24190_SYSFS_FIELD_RW(tmr2x_en,	MOC,	TMR2X_EN),
434 	BQ24190_SYSFS_FIELD_RW(batfet_disable,	MOC,	BATFET_DISABLE),
435 	BQ24190_SYSFS_FIELD_RW(jeita_vset,	MOC,	JEITA_VSET),
436 	BQ24190_SYSFS_FIELD_RO(int_mask,	MOC,	INT_MASK),
437 	BQ24190_SYSFS_FIELD_RO(vbus_stat,	SS,	VBUS_STAT),
438 	BQ24190_SYSFS_FIELD_RO(chrg_stat,	SS,	CHRG_STAT),
439 	BQ24190_SYSFS_FIELD_RO(dpm_stat,	SS,	DPM_STAT),
440 	BQ24190_SYSFS_FIELD_RO(pg_stat,		SS,	PG_STAT),
441 	BQ24190_SYSFS_FIELD_RO(therm_stat,	SS,	THERM_STAT),
442 	BQ24190_SYSFS_FIELD_RO(vsys_stat,	SS,	VSYS_STAT),
443 	BQ24190_SYSFS_FIELD_RO(watchdog_fault,	F,	WATCHDOG_FAULT),
444 	BQ24190_SYSFS_FIELD_RO(boost_fault,	F,	BOOST_FAULT),
445 	BQ24190_SYSFS_FIELD_RO(chrg_fault,	F,	CHRG_FAULT),
446 	BQ24190_SYSFS_FIELD_RO(bat_fault,	F,	BAT_FAULT),
447 	BQ24190_SYSFS_FIELD_RO(ntc_fault,	F,	NTC_FAULT),
448 	BQ24190_SYSFS_FIELD_RO(pn,		VPRS,	PN),
449 	BQ24190_SYSFS_FIELD_RO(ts_profile,	VPRS,	TS_PROFILE),
450 	BQ24190_SYSFS_FIELD_RO(dev_reg,		VPRS,	DEV_REG),
451 };
452 
453 static struct attribute *
454 	bq24190_sysfs_attrs[ARRAY_SIZE(bq24190_sysfs_field_tbl) + 1];
455 
456 ATTRIBUTE_GROUPS(bq24190_sysfs);
457 
bq24190_sysfs_init_attrs(void)458 static void bq24190_sysfs_init_attrs(void)
459 {
460 	int i, limit = ARRAY_SIZE(bq24190_sysfs_field_tbl);
461 
462 	for (i = 0; i < limit; i++)
463 		bq24190_sysfs_attrs[i] = &bq24190_sysfs_field_tbl[i].attr.attr;
464 
465 	bq24190_sysfs_attrs[limit] = NULL; /* Has additional entry for this */
466 }
467 
bq24190_sysfs_field_lookup(const char * name)468 static struct bq24190_sysfs_field_info *bq24190_sysfs_field_lookup(
469 		const char *name)
470 {
471 	int i, limit = ARRAY_SIZE(bq24190_sysfs_field_tbl);
472 
473 	for (i = 0; i < limit; i++)
474 		if (!strcmp(name, bq24190_sysfs_field_tbl[i].attr.attr.name))
475 			break;
476 
477 	if (i >= limit)
478 		return NULL;
479 
480 	return &bq24190_sysfs_field_tbl[i];
481 }
482 
bq24190_sysfs_show(struct device * dev,struct device_attribute * attr,char * buf)483 static ssize_t bq24190_sysfs_show(struct device *dev,
484 		struct device_attribute *attr, char *buf)
485 {
486 	struct power_supply *psy = dev_to_psy(dev);
487 	struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
488 	struct bq24190_sysfs_field_info *info;
489 	ssize_t count;
490 	int ret;
491 	u8 v;
492 
493 	info = bq24190_sysfs_field_lookup(attr->attr.name);
494 	if (!info)
495 		return -EINVAL;
496 
497 	ret = pm_runtime_resume_and_get(bdi->dev);
498 	if (ret < 0)
499 		return ret;
500 
501 	ret = bq24190_read_mask(bdi, info->reg, info->mask, info->shift, &v);
502 	if (ret)
503 		count = ret;
504 	else
505 		count = sysfs_emit(buf, "%hhx\n", v);
506 
507 	pm_runtime_put_autosuspend(bdi->dev);
508 
509 	return count;
510 }
511 
bq24190_sysfs_store(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)512 static ssize_t bq24190_sysfs_store(struct device *dev,
513 		struct device_attribute *attr, const char *buf, size_t count)
514 {
515 	struct power_supply *psy = dev_to_psy(dev);
516 	struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
517 	struct bq24190_sysfs_field_info *info;
518 	int ret;
519 	u8 v;
520 
521 	info = bq24190_sysfs_field_lookup(attr->attr.name);
522 	if (!info)
523 		return -EINVAL;
524 
525 	ret = kstrtou8(buf, 0, &v);
526 	if (ret < 0)
527 		return ret;
528 
529 	ret = pm_runtime_resume_and_get(bdi->dev);
530 	if (ret < 0)
531 		return ret;
532 
533 	ret = bq24190_write_mask(bdi, info->reg, info->mask, info->shift, v);
534 	if (ret)
535 		count = ret;
536 
537 	pm_runtime_put_autosuspend(bdi->dev);
538 
539 	return count;
540 }
541 #endif
542 
bq24190_set_otg_vbus(struct bq24190_dev_info * bdi,bool enable)543 static int bq24190_set_otg_vbus(struct bq24190_dev_info *bdi, bool enable)
544 {
545 	union power_supply_propval val = { .intval = bdi->charge_type };
546 	int ret;
547 
548 	ret = pm_runtime_resume_and_get(bdi->dev);
549 	if (ret < 0) {
550 		dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", ret);
551 		return ret;
552 	}
553 
554 	bdi->otg_vbus_enabled = enable;
555 	if (enable)
556 		ret = bq24190_write_mask(bdi, BQ24190_REG_POC,
557 					 BQ24190_REG_POC_CHG_CONFIG_MASK,
558 					 BQ24190_REG_POC_CHG_CONFIG_SHIFT,
559 					 BQ24190_REG_POC_CHG_CONFIG_OTG);
560 	else
561 		ret = bq24190_charger_set_charge_type(bdi, &val);
562 
563 	pm_runtime_put_autosuspend(bdi->dev);
564 
565 	return ret;
566 }
567 
bq24296_set_otg_vbus(struct bq24190_dev_info * bdi,bool enable)568 static int bq24296_set_otg_vbus(struct bq24190_dev_info *bdi, bool enable)
569 {
570 	union power_supply_propval val = { .intval = bdi->charge_type };
571 	int ret;
572 
573 	ret = pm_runtime_resume_and_get(bdi->dev);
574 	if (ret < 0) {
575 		dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", ret);
576 		return ret;
577 	}
578 
579 	bdi->otg_vbus_enabled = enable;
580 	if (enable) {
581 		ret = bq24190_write_mask(bdi, BQ24190_REG_POC,
582 					 BQ24296_REG_POC_CHG_CONFIG_MASK,
583 					 BQ24296_REG_POC_CHG_CONFIG_SHIFT,
584 					 BQ24190_REG_POC_CHG_CONFIG_DISABLE);
585 
586 		if (ret < 0)
587 			goto out;
588 
589 		ret = bq24190_write_mask(bdi, BQ24190_REG_POC,
590 					 BQ24296_REG_POC_OTG_CONFIG_MASK,
591 					 BQ24296_REG_POC_OTG_CONFIG_SHIFT,
592 					 BQ24296_REG_POC_OTG_CONFIG_OTG);
593 	} else {
594 		ret = bq24190_write_mask(bdi, BQ24190_REG_POC,
595 					 BQ24296_REG_POC_OTG_CONFIG_MASK,
596 					 BQ24296_REG_POC_OTG_CONFIG_SHIFT,
597 					 BQ24296_REG_POC_OTG_CONFIG_DISABLE);
598 		if (ret < 0)
599 			goto out;
600 
601 		ret = bq24190_charger_set_charge_type(bdi, &val);
602 	}
603 
604 out:
605 	pm_runtime_put_autosuspend(bdi->dev);
606 
607 	return ret;
608 }
609 
610 #ifdef CONFIG_REGULATOR
bq24190_vbus_enable(struct regulator_dev * dev)611 static int bq24190_vbus_enable(struct regulator_dev *dev)
612 {
613 	return bq24190_set_otg_vbus(rdev_get_drvdata(dev), true);
614 }
615 
bq24190_vbus_disable(struct regulator_dev * dev)616 static int bq24190_vbus_disable(struct regulator_dev *dev)
617 {
618 	return bq24190_set_otg_vbus(rdev_get_drvdata(dev), false);
619 }
620 
bq24190_vbus_is_enabled(struct regulator_dev * dev)621 static int bq24190_vbus_is_enabled(struct regulator_dev *dev)
622 {
623 	struct bq24190_dev_info *bdi = rdev_get_drvdata(dev);
624 	int ret;
625 	u8 val;
626 
627 	ret = pm_runtime_resume_and_get(bdi->dev);
628 	if (ret < 0) {
629 		dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", ret);
630 		return ret;
631 	}
632 
633 	ret = bq24190_read_mask(bdi, BQ24190_REG_POC,
634 				BQ24190_REG_POC_CHG_CONFIG_MASK,
635 				BQ24190_REG_POC_CHG_CONFIG_SHIFT, &val);
636 
637 	pm_runtime_put_autosuspend(bdi->dev);
638 
639 	if (ret)
640 		return ret;
641 
642 	bdi->otg_vbus_enabled = (val == BQ24190_REG_POC_CHG_CONFIG_OTG ||
643 				 val == BQ24190_REG_POC_CHG_CONFIG_OTG_ALT);
644 	return bdi->otg_vbus_enabled;
645 }
646 
bq24296_vbus_enable(struct regulator_dev * dev)647 static int bq24296_vbus_enable(struct regulator_dev *dev)
648 {
649 	return bq24296_set_otg_vbus(rdev_get_drvdata(dev), true);
650 }
651 
bq24296_vbus_disable(struct regulator_dev * dev)652 static int bq24296_vbus_disable(struct regulator_dev *dev)
653 {
654 	return bq24296_set_otg_vbus(rdev_get_drvdata(dev), false);
655 }
656 
bq24296_vbus_is_enabled(struct regulator_dev * dev)657 static int bq24296_vbus_is_enabled(struct regulator_dev *dev)
658 {
659 	struct bq24190_dev_info *bdi = rdev_get_drvdata(dev);
660 	int ret;
661 	u8 val;
662 
663 	ret = pm_runtime_resume_and_get(bdi->dev);
664 	if (ret < 0) {
665 		dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", ret);
666 		return ret;
667 	}
668 
669 	ret = bq24190_read_mask(bdi, BQ24190_REG_POC,
670 				BQ24296_REG_POC_OTG_CONFIG_MASK,
671 				BQ24296_REG_POC_OTG_CONFIG_SHIFT, &val);
672 
673 	pm_runtime_put_autosuspend(bdi->dev);
674 
675 	if (ret)
676 		return ret;
677 
678 	bdi->otg_vbus_enabled = (val == BQ24296_REG_POC_OTG_CONFIG_OTG);
679 
680 	return bdi->otg_vbus_enabled;
681 }
682 
683 static const struct regulator_ops bq24190_vbus_ops = {
684 	.enable = bq24190_vbus_enable,
685 	.disable = bq24190_vbus_disable,
686 	.is_enabled = bq24190_vbus_is_enabled,
687 };
688 
689 static const struct regulator_desc bq24190_vbus_desc = {
690 	.name = "usb_otg_vbus",
691 	.of_match = "usb-otg-vbus",
692 	.type = REGULATOR_VOLTAGE,
693 	.owner = THIS_MODULE,
694 	.ops = &bq24190_vbus_ops,
695 	.fixed_uV = 5000000,
696 	.n_voltages = 1,
697 };
698 
699 static const struct regulator_ops bq24296_vbus_ops = {
700 	.enable = bq24296_vbus_enable,
701 	.disable = bq24296_vbus_disable,
702 	.is_enabled = bq24296_vbus_is_enabled,
703 };
704 
705 static const struct regulator_desc bq24296_vbus_desc = {
706 	.name = "usb_otg_vbus",
707 	.of_match = "usb-otg-vbus",
708 	.type = REGULATOR_VOLTAGE,
709 	.owner = THIS_MODULE,
710 	.ops = &bq24296_vbus_ops,
711 	.fixed_uV = 5000000,
712 	.n_voltages = 1,
713 };
714 
715 static const struct regulator_init_data bq24190_vbus_init_data = {
716 	.constraints = {
717 		.valid_ops_mask = REGULATOR_CHANGE_STATUS,
718 	},
719 };
720 
bq24190_register_vbus_regulator(struct bq24190_dev_info * bdi)721 static int bq24190_register_vbus_regulator(struct bq24190_dev_info *bdi)
722 {
723 	struct bq24190_platform_data *pdata = bdi->dev->platform_data;
724 	struct regulator_config cfg = { };
725 	struct regulator_dev *reg;
726 	int ret = 0;
727 
728 	cfg.dev = bdi->dev;
729 	if (pdata && pdata->regulator_init_data)
730 		cfg.init_data = pdata->regulator_init_data;
731 	else
732 		cfg.init_data = &bq24190_vbus_init_data;
733 	cfg.driver_data = bdi;
734 	reg = devm_regulator_register(bdi->dev, bdi->info->vbus_desc, &cfg);
735 	if (IS_ERR(reg)) {
736 		ret = PTR_ERR(reg);
737 		dev_err(bdi->dev, "Can't register regulator: %d\n", ret);
738 	}
739 
740 	return ret;
741 }
742 #else
bq24190_register_vbus_regulator(struct bq24190_dev_info * bdi)743 static int bq24190_register_vbus_regulator(struct bq24190_dev_info *bdi)
744 {
745 	return 0;
746 }
747 #endif
748 
bq24190_set_config(struct bq24190_dev_info * bdi)749 static int bq24190_set_config(struct bq24190_dev_info *bdi)
750 {
751 	int ret;
752 	u8 v;
753 
754 	ret = bq24190_read(bdi, BQ24190_REG_CTTC, &v);
755 	if (ret < 0)
756 		return ret;
757 
758 	bdi->watchdog = ((v & BQ24190_REG_CTTC_WATCHDOG_MASK) >>
759 					BQ24190_REG_CTTC_WATCHDOG_SHIFT);
760 
761 	/*
762 	 * According to the "Host Mode and default Mode" section of the
763 	 * manual, a write to any register causes the bq24190 to switch
764 	 * from default mode to host mode.  It will switch back to default
765 	 * mode after a WDT timeout unless the WDT is turned off as well.
766 	 * So, by simply turning off the WDT, we accomplish both with the
767 	 * same write.
768 	 */
769 	v &= ~BQ24190_REG_CTTC_WATCHDOG_MASK;
770 
771 	ret = bq24190_write(bdi, BQ24190_REG_CTTC, v);
772 	if (ret < 0)
773 		return ret;
774 
775 	if (bdi->sys_min) {
776 		v = bdi->sys_min / 100 - 30; // manual section 9.5.1.2, table 9
777 		ret = bq24190_write_mask(bdi, BQ24190_REG_POC,
778 					 BQ24190_REG_POC_SYS_MIN_MASK,
779 					 BQ24190_REG_POC_SYS_MIN_SHIFT,
780 					 v);
781 		if (ret < 0)
782 			return ret;
783 	}
784 
785 	if (bdi->iprechg) {
786 		v = bdi->iprechg / 128 - 1; // manual section 9.5.1.4, table 11
787 		ret = bq24190_write_mask(bdi, BQ24190_REG_PCTCC,
788 					 BQ24190_REG_PCTCC_IPRECHG_MASK,
789 					 BQ24190_REG_PCTCC_IPRECHG_SHIFT,
790 					 v);
791 		if (ret < 0)
792 			return ret;
793 	}
794 
795 	if (bdi->iterm) {
796 		v = bdi->iterm / 128 - 1; // manual section 9.5.1.4, table 11
797 		ret = bq24190_write_mask(bdi, BQ24190_REG_PCTCC,
798 					 BQ24190_REG_PCTCC_ITERM_MASK,
799 					 BQ24190_REG_PCTCC_ITERM_SHIFT,
800 					 v);
801 		if (ret < 0)
802 			return ret;
803 	}
804 
805 	if (bdi->ichg) {
806 		ret = bq24190_set_field_val(bdi, BQ24190_REG_CCC,
807 					    BQ24190_REG_CCC_ICHG_MASK,
808 					    BQ24190_REG_CCC_ICHG_SHIFT,
809 					    bq24190_ccc_ichg_values,
810 					    bdi->info->ichg_array_size,
811 					    bdi->ichg);
812 		if (ret < 0)
813 			return ret;
814 	}
815 
816 	if (bdi->vreg) {
817 		ret = bq24190_set_field_val(bdi, BQ24190_REG_CVC,
818 					    BQ24190_REG_CVC_VREG_MASK,
819 					    BQ24190_REG_CVC_VREG_SHIFT,
820 					    bq24190_cvc_vreg_values,
821 					    ARRAY_SIZE(bq24190_cvc_vreg_values),
822 					    bdi->vreg);
823 		if (ret < 0)
824 			return ret;
825 	}
826 
827 	return 0;
828 }
829 
bq24190_register_reset(struct bq24190_dev_info * bdi)830 static int bq24190_register_reset(struct bq24190_dev_info *bdi)
831 {
832 	int ret, limit = 100;
833 	u8 v;
834 
835 	/*
836 	 * This prop. can be passed on device instantiation from platform code:
837 	 * struct property_entry pe[] =
838 	 *   { PROPERTY_ENTRY_BOOL("disable-reset"), ... };
839 	 * struct i2c_board_info bi =
840 	 *   { .type = "bq24190", .addr = 0x6b, .properties = pe, .irq = irq };
841 	 * struct i2c_adapter ad = { ... };
842 	 * i2c_add_adapter(&ad);
843 	 * i2c_new_client_device(&ad, &bi);
844 	 */
845 	if (device_property_read_bool(bdi->dev, "disable-reset"))
846 		return 0;
847 
848 	/* Reset the registers */
849 	ret = bq24190_write_mask(bdi, BQ24190_REG_POC,
850 			BQ24190_REG_POC_RESET_MASK,
851 			BQ24190_REG_POC_RESET_SHIFT,
852 			0x1);
853 	if (ret < 0)
854 		return ret;
855 
856 	/* Reset bit will be cleared by hardware so poll until it is */
857 	do {
858 		ret = bq24190_read_mask(bdi, BQ24190_REG_POC,
859 				BQ24190_REG_POC_RESET_MASK,
860 				BQ24190_REG_POC_RESET_SHIFT,
861 				&v);
862 		if (ret < 0)
863 			return ret;
864 
865 		if (v == 0)
866 			return 0;
867 
868 		usleep_range(100, 200);
869 	} while (--limit);
870 
871 	return -EIO;
872 }
873 
874 /* Charger power supply property routines */
875 
bq24190_charger_get_charge_type(struct bq24190_dev_info * bdi,union power_supply_propval * val)876 static int bq24190_charger_get_charge_type(struct bq24190_dev_info *bdi,
877 		union power_supply_propval *val)
878 {
879 	u8 v;
880 	int type, ret;
881 
882 	ret = bq24190_read_mask(bdi, BQ24190_REG_POC,
883 			BQ24190_REG_POC_CHG_CONFIG_MASK,
884 			BQ24190_REG_POC_CHG_CONFIG_SHIFT,
885 			&v);
886 	if (ret < 0)
887 		return ret;
888 
889 	/* If POC[CHG_CONFIG] (REG01[5:4]) == 0, charge is disabled */
890 	if (!v) {
891 		type = POWER_SUPPLY_CHARGE_TYPE_NONE;
892 	} else {
893 		ret = bq24190_read_mask(bdi, BQ24190_REG_CCC,
894 				BQ24190_REG_CCC_FORCE_20PCT_MASK,
895 				BQ24190_REG_CCC_FORCE_20PCT_SHIFT,
896 				&v);
897 		if (ret < 0)
898 			return ret;
899 
900 		type = (v) ? POWER_SUPPLY_CHARGE_TYPE_TRICKLE :
901 			     POWER_SUPPLY_CHARGE_TYPE_FAST;
902 	}
903 
904 	val->intval = type;
905 
906 	return 0;
907 }
908 
bq24190_battery_set_chg_config(struct bq24190_dev_info * bdi,const u8 chg_config)909 static int bq24190_battery_set_chg_config(struct bq24190_dev_info *bdi,
910 		const u8 chg_config)
911 {
912 	return bq24190_write_mask(bdi, BQ24190_REG_POC,
913 			BQ24190_REG_POC_CHG_CONFIG_MASK,
914 			BQ24190_REG_POC_CHG_CONFIG_SHIFT,
915 			chg_config);
916 }
917 
bq24296_battery_set_chg_config(struct bq24190_dev_info * bdi,const u8 chg_config)918 static int bq24296_battery_set_chg_config(struct bq24190_dev_info *bdi,
919 		const u8 chg_config)
920 {
921 	return bq24190_write_mask(bdi, BQ24190_REG_POC,
922 			BQ24296_REG_POC_CHG_CONFIG_MASK,
923 			BQ24296_REG_POC_CHG_CONFIG_SHIFT,
924 			chg_config);
925 }
926 
bq24190_charger_set_charge_type(struct bq24190_dev_info * bdi,const union power_supply_propval * val)927 static int bq24190_charger_set_charge_type(struct bq24190_dev_info *bdi,
928 		const union power_supply_propval *val)
929 {
930 	u8 chg_config, force_20pct, en_term;
931 	int ret;
932 
933 	/*
934 	 * According to the "Termination when REG02[0] = 1" section of
935 	 * the bq24190 manual, the trickle charge could be less than the
936 	 * termination current so it recommends turning off the termination
937 	 * function.
938 	 *
939 	 * Note: AFAICT from the datasheet, the user will have to manually
940 	 * turn off the charging when in 20% mode.  If its not turned off,
941 	 * there could be battery damage.  So, use this mode at your own risk.
942 	 */
943 	switch (val->intval) {
944 	case POWER_SUPPLY_CHARGE_TYPE_NONE:
945 		chg_config = 0x0;
946 		break;
947 	case POWER_SUPPLY_CHARGE_TYPE_TRICKLE:
948 		chg_config = 0x1;
949 		force_20pct = 0x1;
950 		en_term = 0x0;
951 		break;
952 	case POWER_SUPPLY_CHARGE_TYPE_FAST:
953 		chg_config = 0x1;
954 		force_20pct = 0x0;
955 		en_term = 0x1;
956 		break;
957 	default:
958 		return -EINVAL;
959 	}
960 
961 	bdi->charge_type = val->intval;
962 	/*
963 	 * If the 5V Vbus boost regulator is enabled delay setting
964 	 * the charge-type until its gets disabled.
965 	 */
966 	if (bdi->otg_vbus_enabled)
967 		return 0;
968 
969 	if (chg_config) { /* Enabling the charger */
970 		ret = bq24190_write_mask(bdi, BQ24190_REG_CCC,
971 				BQ24190_REG_CCC_FORCE_20PCT_MASK,
972 				BQ24190_REG_CCC_FORCE_20PCT_SHIFT,
973 				force_20pct);
974 		if (ret < 0)
975 			return ret;
976 
977 		ret = bq24190_write_mask(bdi, BQ24190_REG_CTTC,
978 				BQ24190_REG_CTTC_EN_TERM_MASK,
979 				BQ24190_REG_CTTC_EN_TERM_SHIFT,
980 				en_term);
981 		if (ret < 0)
982 			return ret;
983 	}
984 
985 	return bdi->info->set_chg_config(bdi, chg_config);
986 }
987 
bq24190_charger_get_ntc_status(u8 value)988 static int bq24190_charger_get_ntc_status(u8 value)
989 {
990 	int health;
991 
992 	switch (value >> BQ24190_REG_F_NTC_FAULT_SHIFT & 0x7) {
993 	case 0x1: /* TS1  Cold */
994 	case 0x3: /* TS2  Cold */
995 	case 0x5: /* Both Cold */
996 		health = POWER_SUPPLY_HEALTH_COLD;
997 		break;
998 	case 0x2: /* TS1  Hot */
999 	case 0x4: /* TS2  Hot */
1000 	case 0x6: /* Both Hot */
1001 		health = POWER_SUPPLY_HEALTH_OVERHEAT;
1002 		break;
1003 	default:
1004 		health = POWER_SUPPLY_HEALTH_UNKNOWN;
1005 	}
1006 
1007 	return health;
1008 }
1009 
bq24296_charger_get_ntc_status(u8 value)1010 static int bq24296_charger_get_ntc_status(u8 value)
1011 {
1012 	int health;
1013 
1014 	switch (value >> BQ24296_REG_F_NTC_FAULT_SHIFT & 0x3) {
1015 	case 0x0: /* Normal */
1016 		health = POWER_SUPPLY_HEALTH_GOOD;
1017 		break;
1018 	case 0x1: /* Hot */
1019 		health = POWER_SUPPLY_HEALTH_OVERHEAT;
1020 		break;
1021 	case 0x2: /* Cold */
1022 		health = POWER_SUPPLY_HEALTH_COLD;
1023 		break;
1024 	default:
1025 		health = POWER_SUPPLY_HEALTH_UNKNOWN;
1026 	}
1027 
1028 	return health;
1029 }
1030 
bq24190_charger_get_health(struct bq24190_dev_info * bdi,union power_supply_propval * val)1031 static int bq24190_charger_get_health(struct bq24190_dev_info *bdi,
1032 		union power_supply_propval *val)
1033 {
1034 	u8 v;
1035 	int health;
1036 
1037 	mutex_lock(&bdi->f_reg_lock);
1038 	v = bdi->f_reg;
1039 	mutex_unlock(&bdi->f_reg_lock);
1040 
1041 	if (v & bdi->info->ntc_fault_mask) {
1042 		health = bdi->info->get_ntc_status(v);
1043 	} else if (v & BQ24190_REG_F_BAT_FAULT_MASK) {
1044 		health = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
1045 	} else if (v & BQ24190_REG_F_CHRG_FAULT_MASK) {
1046 		switch (v >> BQ24190_REG_F_CHRG_FAULT_SHIFT & 0x3) {
1047 		case 0x1: /* Input Fault (VBUS OVP or VBAT<VBUS<3.8V) */
1048 			/*
1049 			 * This could be over-voltage or under-voltage
1050 			 * and there's no way to tell which.  Instead
1051 			 * of looking foolish and returning 'OVERVOLTAGE'
1052 			 * when its really under-voltage, just return
1053 			 * 'UNSPEC_FAILURE'.
1054 			 */
1055 			health = POWER_SUPPLY_HEALTH_UNSPEC_FAILURE;
1056 			break;
1057 		case 0x2: /* Thermal Shutdown */
1058 			health = POWER_SUPPLY_HEALTH_OVERHEAT;
1059 			break;
1060 		case 0x3: /* Charge Safety Timer Expiration */
1061 			health = POWER_SUPPLY_HEALTH_SAFETY_TIMER_EXPIRE;
1062 			break;
1063 		default:  /* prevent compiler warning */
1064 			health = -1;
1065 		}
1066 	} else if (v & BQ24190_REG_F_BOOST_FAULT_MASK) {
1067 		/*
1068 		 * This could be over-current or over-voltage but there's
1069 		 * no way to tell which.  Return 'OVERVOLTAGE' since there
1070 		 * isn't an 'OVERCURRENT' value defined that we can return
1071 		 * even if it was over-current.
1072 		 */
1073 		health = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
1074 	} else {
1075 		health = POWER_SUPPLY_HEALTH_GOOD;
1076 	}
1077 
1078 	val->intval = health;
1079 
1080 	return 0;
1081 }
1082 
bq24190_charger_get_online(struct bq24190_dev_info * bdi,union power_supply_propval * val)1083 static int bq24190_charger_get_online(struct bq24190_dev_info *bdi,
1084 		union power_supply_propval *val)
1085 {
1086 	u8 pg_stat, batfet_disable;
1087 	int ret;
1088 
1089 	ret = bq24190_read_mask(bdi, BQ24190_REG_SS,
1090 			BQ24190_REG_SS_PG_STAT_MASK,
1091 			BQ24190_REG_SS_PG_STAT_SHIFT, &pg_stat);
1092 	if (ret < 0)
1093 		return ret;
1094 
1095 	ret = bq24190_read_mask(bdi, BQ24190_REG_MOC,
1096 			BQ24190_REG_MOC_BATFET_DISABLE_MASK,
1097 			BQ24190_REG_MOC_BATFET_DISABLE_SHIFT, &batfet_disable);
1098 	if (ret < 0)
1099 		return ret;
1100 
1101 	val->intval = pg_stat && !batfet_disable;
1102 
1103 	return 0;
1104 }
1105 
1106 static int bq24190_battery_set_online(struct bq24190_dev_info *bdi,
1107 				      const union power_supply_propval *val);
1108 static int bq24190_battery_get_status(struct bq24190_dev_info *bdi,
1109 				      union power_supply_propval *val);
1110 static int bq24190_battery_get_temp_alert_max(struct bq24190_dev_info *bdi,
1111 					      union power_supply_propval *val);
1112 static int bq24190_battery_set_temp_alert_max(struct bq24190_dev_info *bdi,
1113 					      const union power_supply_propval *val);
1114 
bq24190_charger_set_online(struct bq24190_dev_info * bdi,const union power_supply_propval * val)1115 static int bq24190_charger_set_online(struct bq24190_dev_info *bdi,
1116 				      const union power_supply_propval *val)
1117 {
1118 	return bq24190_battery_set_online(bdi, val);
1119 }
1120 
bq24190_charger_get_status(struct bq24190_dev_info * bdi,union power_supply_propval * val)1121 static int bq24190_charger_get_status(struct bq24190_dev_info *bdi,
1122 				      union power_supply_propval *val)
1123 {
1124 	return bq24190_battery_get_status(bdi, val);
1125 }
1126 
bq24190_charger_get_temp_alert_max(struct bq24190_dev_info * bdi,union power_supply_propval * val)1127 static int bq24190_charger_get_temp_alert_max(struct bq24190_dev_info *bdi,
1128 					      union power_supply_propval *val)
1129 {
1130 	return bq24190_battery_get_temp_alert_max(bdi, val);
1131 }
1132 
bq24190_charger_set_temp_alert_max(struct bq24190_dev_info * bdi,const union power_supply_propval * val)1133 static int bq24190_charger_set_temp_alert_max(struct bq24190_dev_info *bdi,
1134 					      const union power_supply_propval *val)
1135 {
1136 	return bq24190_battery_set_temp_alert_max(bdi, val);
1137 }
1138 
bq24190_charger_get_precharge(struct bq24190_dev_info * bdi,union power_supply_propval * val)1139 static int bq24190_charger_get_precharge(struct bq24190_dev_info *bdi,
1140 		union power_supply_propval *val)
1141 {
1142 	u8 v;
1143 	int curr, ret;
1144 
1145 	ret = bq24190_read_mask(bdi, BQ24190_REG_PCTCC,
1146 			BQ24190_REG_PCTCC_IPRECHG_MASK,
1147 			BQ24190_REG_PCTCC_IPRECHG_SHIFT, &v);
1148 	if (ret < 0)
1149 		return ret;
1150 
1151 	curr = ++v * 128 * 1000;
1152 
1153 	ret = bq24190_read_mask(bdi, BQ24190_REG_CCC,
1154 			BQ24190_REG_CCC_FORCE_20PCT_MASK,
1155 			BQ24190_REG_CCC_FORCE_20PCT_SHIFT, &v);
1156 	if (ret < 0)
1157 		return ret;
1158 
1159 	/* If FORCE_20PCT is enabled, then current is 50% of IPRECHG value */
1160 	if (v)
1161 		curr /= 2;
1162 
1163 	val->intval = curr;
1164 
1165 	return 0;
1166 }
1167 
bq24190_charger_get_charge_term(struct bq24190_dev_info * bdi,union power_supply_propval * val)1168 static int bq24190_charger_get_charge_term(struct bq24190_dev_info *bdi,
1169 		union power_supply_propval *val)
1170 {
1171 	u8 v;
1172 	int ret;
1173 
1174 	ret = bq24190_read_mask(bdi, BQ24190_REG_PCTCC,
1175 			BQ24190_REG_PCTCC_ITERM_MASK,
1176 			BQ24190_REG_PCTCC_ITERM_SHIFT, &v);
1177 	if (ret < 0)
1178 		return ret;
1179 
1180 	val->intval = ++v * 128 * 1000;
1181 	return 0;
1182 }
1183 
bq24190_charger_get_current(struct bq24190_dev_info * bdi,union power_supply_propval * val)1184 static int bq24190_charger_get_current(struct bq24190_dev_info *bdi,
1185 		union power_supply_propval *val)
1186 {
1187 	u8 v;
1188 	int curr, ret;
1189 
1190 	ret = bq24190_get_field_val(bdi, BQ24190_REG_CCC,
1191 			BQ24190_REG_CCC_ICHG_MASK, BQ24190_REG_CCC_ICHG_SHIFT,
1192 			bq24190_ccc_ichg_values,
1193 			bdi->info->ichg_array_size, &curr);
1194 	if (ret < 0)
1195 		return ret;
1196 
1197 	ret = bq24190_read_mask(bdi, BQ24190_REG_CCC,
1198 			BQ24190_REG_CCC_FORCE_20PCT_MASK,
1199 			BQ24190_REG_CCC_FORCE_20PCT_SHIFT, &v);
1200 	if (ret < 0)
1201 		return ret;
1202 
1203 	/* If FORCE_20PCT is enabled, then current is 20% of ICHG value */
1204 	if (v)
1205 		curr /= 5;
1206 
1207 	val->intval = curr;
1208 	return 0;
1209 }
1210 
bq24190_charger_set_current(struct bq24190_dev_info * bdi,const union power_supply_propval * val)1211 static int bq24190_charger_set_current(struct bq24190_dev_info *bdi,
1212 		const union power_supply_propval *val)
1213 {
1214 	u8 v;
1215 	int ret, curr = val->intval;
1216 
1217 	ret = bq24190_read_mask(bdi, BQ24190_REG_CCC,
1218 			BQ24190_REG_CCC_FORCE_20PCT_MASK,
1219 			BQ24190_REG_CCC_FORCE_20PCT_SHIFT, &v);
1220 	if (ret < 0)
1221 		return ret;
1222 
1223 	/* If FORCE_20PCT is enabled, have to multiply value passed in by 5 */
1224 	if (v)
1225 		curr *= 5;
1226 
1227 	if (curr > bdi->ichg_max)
1228 		return -EINVAL;
1229 
1230 	ret = bq24190_set_field_val(bdi, BQ24190_REG_CCC,
1231 			BQ24190_REG_CCC_ICHG_MASK, BQ24190_REG_CCC_ICHG_SHIFT,
1232 			bq24190_ccc_ichg_values,
1233 			bdi->info->ichg_array_size, curr);
1234 	if (ret < 0)
1235 		return ret;
1236 
1237 	bdi->ichg = curr;
1238 
1239 	return 0;
1240 }
1241 
bq24190_charger_get_voltage(struct bq24190_dev_info * bdi,union power_supply_propval * val)1242 static int bq24190_charger_get_voltage(struct bq24190_dev_info *bdi,
1243 		union power_supply_propval *val)
1244 {
1245 	int voltage, ret;
1246 
1247 	ret = bq24190_get_field_val(bdi, BQ24190_REG_CVC,
1248 			BQ24190_REG_CVC_VREG_MASK, BQ24190_REG_CVC_VREG_SHIFT,
1249 			bq24190_cvc_vreg_values,
1250 			ARRAY_SIZE(bq24190_cvc_vreg_values), &voltage);
1251 	if (ret < 0)
1252 		return ret;
1253 
1254 	val->intval = voltage;
1255 	return 0;
1256 }
1257 
bq24190_charger_set_voltage(struct bq24190_dev_info * bdi,const union power_supply_propval * val)1258 static int bq24190_charger_set_voltage(struct bq24190_dev_info *bdi,
1259 		const union power_supply_propval *val)
1260 {
1261 	int ret;
1262 
1263 	if (val->intval > bdi->vreg_max)
1264 		return -EINVAL;
1265 
1266 	ret = bq24190_set_field_val(bdi, BQ24190_REG_CVC,
1267 			BQ24190_REG_CVC_VREG_MASK, BQ24190_REG_CVC_VREG_SHIFT,
1268 			bq24190_cvc_vreg_values,
1269 			ARRAY_SIZE(bq24190_cvc_vreg_values), val->intval);
1270 	if (ret < 0)
1271 		return ret;
1272 
1273 	bdi->vreg = val->intval;
1274 
1275 	return 0;
1276 }
1277 
bq24190_charger_get_iinlimit(struct bq24190_dev_info * bdi,union power_supply_propval * val)1278 static int bq24190_charger_get_iinlimit(struct bq24190_dev_info *bdi,
1279 		union power_supply_propval *val)
1280 {
1281 	int iinlimit, ret;
1282 
1283 	ret = bq24190_get_field_val(bdi, BQ24190_REG_ISC,
1284 			BQ24190_REG_ISC_IINLIM_MASK,
1285 			BQ24190_REG_ISC_IINLIM_SHIFT,
1286 			bq24190_isc_iinlim_values,
1287 			ARRAY_SIZE(bq24190_isc_iinlim_values), &iinlimit);
1288 	if (ret < 0)
1289 		return ret;
1290 
1291 	val->intval = iinlimit;
1292 	return 0;
1293 }
1294 
bq24190_charger_set_iinlimit(struct bq24190_dev_info * bdi,const union power_supply_propval * val)1295 static int bq24190_charger_set_iinlimit(struct bq24190_dev_info *bdi,
1296 		const union power_supply_propval *val)
1297 {
1298 	return bq24190_set_field_val(bdi, BQ24190_REG_ISC,
1299 			BQ24190_REG_ISC_IINLIM_MASK,
1300 			BQ24190_REG_ISC_IINLIM_SHIFT,
1301 			bq24190_isc_iinlim_values,
1302 			ARRAY_SIZE(bq24190_isc_iinlim_values), val->intval);
1303 }
1304 
bq24190_charger_get_property(struct power_supply * psy,enum power_supply_property psp,union power_supply_propval * val)1305 static int bq24190_charger_get_property(struct power_supply *psy,
1306 		enum power_supply_property psp, union power_supply_propval *val)
1307 {
1308 	struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
1309 	int ret;
1310 
1311 	dev_dbg(bdi->dev, "prop: %d\n", psp);
1312 
1313 	ret = pm_runtime_resume_and_get(bdi->dev);
1314 	if (ret < 0)
1315 		return ret;
1316 
1317 	switch (psp) {
1318 	case POWER_SUPPLY_PROP_CHARGE_TYPE:
1319 	case POWER_SUPPLY_PROP_CHARGE_TYPES:
1320 		ret = bq24190_charger_get_charge_type(bdi, val);
1321 		break;
1322 	case POWER_SUPPLY_PROP_HEALTH:
1323 		ret = bq24190_charger_get_health(bdi, val);
1324 		break;
1325 	case POWER_SUPPLY_PROP_ONLINE:
1326 		ret = bq24190_charger_get_online(bdi, val);
1327 		break;
1328 	case POWER_SUPPLY_PROP_STATUS:
1329 		ret = bq24190_charger_get_status(bdi, val);
1330 		break;
1331 	case POWER_SUPPLY_PROP_TEMP_ALERT_MAX:
1332 		ret =  bq24190_charger_get_temp_alert_max(bdi, val);
1333 		break;
1334 	case POWER_SUPPLY_PROP_PRECHARGE_CURRENT:
1335 		ret = bq24190_charger_get_precharge(bdi, val);
1336 		break;
1337 	case POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT:
1338 		ret = bq24190_charger_get_charge_term(bdi, val);
1339 		break;
1340 	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
1341 		ret = bq24190_charger_get_current(bdi, val);
1342 		break;
1343 	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX:
1344 		val->intval = bdi->ichg_max;
1345 		ret = 0;
1346 		break;
1347 	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
1348 		ret = bq24190_charger_get_voltage(bdi, val);
1349 		break;
1350 	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX:
1351 		val->intval = bdi->vreg_max;
1352 		ret = 0;
1353 		break;
1354 	case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
1355 		ret = bq24190_charger_get_iinlimit(bdi, val);
1356 		break;
1357 	case POWER_SUPPLY_PROP_SCOPE:
1358 		val->intval = POWER_SUPPLY_SCOPE_SYSTEM;
1359 		ret = 0;
1360 		break;
1361 	case POWER_SUPPLY_PROP_MODEL_NAME:
1362 		val->strval = bdi->model_name;
1363 		ret = 0;
1364 		break;
1365 	case POWER_SUPPLY_PROP_MANUFACTURER:
1366 		val->strval = BQ24190_MANUFACTURER;
1367 		ret = 0;
1368 		break;
1369 	default:
1370 		ret = -ENODATA;
1371 	}
1372 
1373 	pm_runtime_put_autosuspend(bdi->dev);
1374 
1375 	return ret;
1376 }
1377 
bq24190_charger_set_property(struct power_supply * psy,enum power_supply_property psp,const union power_supply_propval * val)1378 static int bq24190_charger_set_property(struct power_supply *psy,
1379 		enum power_supply_property psp,
1380 		const union power_supply_propval *val)
1381 {
1382 	struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
1383 	int ret;
1384 
1385 	dev_dbg(bdi->dev, "prop: %d\n", psp);
1386 
1387 	ret = pm_runtime_resume_and_get(bdi->dev);
1388 	if (ret < 0)
1389 		return ret;
1390 
1391 	switch (psp) {
1392 	case POWER_SUPPLY_PROP_ONLINE:
1393 		ret = bq24190_charger_set_online(bdi, val);
1394 		break;
1395 	case POWER_SUPPLY_PROP_TEMP_ALERT_MAX:
1396 		ret = bq24190_charger_set_temp_alert_max(bdi, val);
1397 		break;
1398 	case POWER_SUPPLY_PROP_CHARGE_TYPE:
1399 	case POWER_SUPPLY_PROP_CHARGE_TYPES:
1400 		ret = bq24190_charger_set_charge_type(bdi, val);
1401 		break;
1402 	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
1403 		ret = bq24190_charger_set_current(bdi, val);
1404 		break;
1405 	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
1406 		ret = bq24190_charger_set_voltage(bdi, val);
1407 		break;
1408 	case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
1409 		ret = bq24190_charger_set_iinlimit(bdi, val);
1410 		break;
1411 	default:
1412 		ret = -EINVAL;
1413 	}
1414 
1415 	pm_runtime_put_autosuspend(bdi->dev);
1416 
1417 	return ret;
1418 }
1419 
bq24190_charger_property_is_writeable(struct power_supply * psy,enum power_supply_property psp)1420 static int bq24190_charger_property_is_writeable(struct power_supply *psy,
1421 		enum power_supply_property psp)
1422 {
1423 	switch (psp) {
1424 	case POWER_SUPPLY_PROP_ONLINE:
1425 	case POWER_SUPPLY_PROP_TEMP_ALERT_MAX:
1426 	case POWER_SUPPLY_PROP_CHARGE_TYPE:
1427 	case POWER_SUPPLY_PROP_CHARGE_TYPES:
1428 	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
1429 	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
1430 	case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
1431 		return 1;
1432 	default:
1433 		return 0;
1434 	}
1435 }
1436 
bq24190_input_current_limit_work(struct work_struct * work)1437 static void bq24190_input_current_limit_work(struct work_struct *work)
1438 {
1439 	struct bq24190_dev_info *bdi =
1440 		container_of(work, struct bq24190_dev_info,
1441 			     input_current_limit_work.work);
1442 	union power_supply_propval val;
1443 	int ret;
1444 
1445 	ret = power_supply_get_property_from_supplier(bdi->charger,
1446 						      POWER_SUPPLY_PROP_CURRENT_MAX,
1447 						      &val);
1448 	if (ret)
1449 		return;
1450 
1451 	bq24190_charger_set_property(bdi->charger,
1452 				     POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT,
1453 				     &val);
1454 	power_supply_changed(bdi->charger);
1455 }
1456 
1457 /* Sync the input-current-limit with our parent supply (if we have one) */
bq24190_charger_external_power_changed(struct power_supply * psy)1458 static void bq24190_charger_external_power_changed(struct power_supply *psy)
1459 {
1460 	struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
1461 
1462 	/*
1463 	 * The Power-Good detection may take up to 220ms, sometimes
1464 	 * the external charger detection is quicker, and the bq24190 will
1465 	 * reset to iinlim based on its own charger detection (which is not
1466 	 * hooked up when using external charger detection) resulting in a
1467 	 * too low default 500mA iinlim. Delay setting the input-current-limit
1468 	 * for 300ms to avoid this.
1469 	 */
1470 	queue_delayed_work(system_wq, &bdi->input_current_limit_work,
1471 			   msecs_to_jiffies(300));
1472 }
1473 
1474 static enum power_supply_property bq24190_charger_properties[] = {
1475 	POWER_SUPPLY_PROP_CHARGE_TYPE,
1476 	POWER_SUPPLY_PROP_CHARGE_TYPES,
1477 	POWER_SUPPLY_PROP_HEALTH,
1478 	POWER_SUPPLY_PROP_ONLINE,
1479 	POWER_SUPPLY_PROP_STATUS,
1480 	POWER_SUPPLY_PROP_TEMP_ALERT_MAX,
1481 	POWER_SUPPLY_PROP_PRECHARGE_CURRENT,
1482 	POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT,
1483 	POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT,
1484 	POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX,
1485 	POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE,
1486 	POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX,
1487 	POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT,
1488 	POWER_SUPPLY_PROP_SCOPE,
1489 	POWER_SUPPLY_PROP_MODEL_NAME,
1490 	POWER_SUPPLY_PROP_MANUFACTURER,
1491 };
1492 
1493 static char *bq24190_charger_supplied_to[] = {
1494 	"main-battery",
1495 };
1496 
1497 static const struct power_supply_desc bq24190_charger_desc = {
1498 	.name			= "bq24190-charger",
1499 	.type			= POWER_SUPPLY_TYPE_USB,
1500 	.properties		= bq24190_charger_properties,
1501 	.num_properties		= ARRAY_SIZE(bq24190_charger_properties),
1502 	.get_property		= bq24190_charger_get_property,
1503 	.set_property		= bq24190_charger_set_property,
1504 	.property_is_writeable	= bq24190_charger_property_is_writeable,
1505 	.external_power_changed	= bq24190_charger_external_power_changed,
1506 	.charge_types		= BIT(POWER_SUPPLY_CHARGE_TYPE_NONE)    |
1507 				  BIT(POWER_SUPPLY_CHARGE_TYPE_TRICKLE) |
1508 				  BIT(POWER_SUPPLY_CHARGE_TYPE_FAST),
1509 };
1510 
1511 /* Battery power supply property routines */
1512 
bq24190_battery_get_status(struct bq24190_dev_info * bdi,union power_supply_propval * val)1513 static int bq24190_battery_get_status(struct bq24190_dev_info *bdi,
1514 		union power_supply_propval *val)
1515 {
1516 	u8 ss_reg, chrg_fault;
1517 	int status, ret;
1518 
1519 	mutex_lock(&bdi->f_reg_lock);
1520 	chrg_fault = bdi->f_reg;
1521 	mutex_unlock(&bdi->f_reg_lock);
1522 
1523 	chrg_fault &= BQ24190_REG_F_CHRG_FAULT_MASK;
1524 	chrg_fault >>= BQ24190_REG_F_CHRG_FAULT_SHIFT;
1525 
1526 	ret = bq24190_read(bdi, BQ24190_REG_SS, &ss_reg);
1527 	if (ret < 0)
1528 		return ret;
1529 
1530 	/*
1531 	 * The battery must be discharging when any of these are true:
1532 	 * - there is no good power source;
1533 	 * - there is a charge fault.
1534 	 * Could also be discharging when in "supplement mode" but
1535 	 * there is no way to tell when its in that mode.
1536 	 */
1537 	if (!(ss_reg & BQ24190_REG_SS_PG_STAT_MASK) || chrg_fault) {
1538 		status = POWER_SUPPLY_STATUS_DISCHARGING;
1539 	} else {
1540 		ss_reg &= BQ24190_REG_SS_CHRG_STAT_MASK;
1541 		ss_reg >>= BQ24190_REG_SS_CHRG_STAT_SHIFT;
1542 
1543 		switch (ss_reg) {
1544 		case 0x0: /* Not Charging */
1545 			status = POWER_SUPPLY_STATUS_NOT_CHARGING;
1546 			break;
1547 		case 0x1: /* Pre-charge */
1548 		case 0x2: /* Fast Charging */
1549 			status = POWER_SUPPLY_STATUS_CHARGING;
1550 			break;
1551 		case 0x3: /* Charge Termination Done */
1552 			status = POWER_SUPPLY_STATUS_FULL;
1553 			break;
1554 		default:
1555 			ret = -EIO;
1556 		}
1557 	}
1558 
1559 	if (!ret)
1560 		val->intval = status;
1561 
1562 	return ret;
1563 }
1564 
bq24190_battery_get_health(struct bq24190_dev_info * bdi,union power_supply_propval * val)1565 static int bq24190_battery_get_health(struct bq24190_dev_info *bdi,
1566 		union power_supply_propval *val)
1567 {
1568 	u8 v;
1569 	int health;
1570 
1571 	mutex_lock(&bdi->f_reg_lock);
1572 	v = bdi->f_reg;
1573 	mutex_unlock(&bdi->f_reg_lock);
1574 
1575 	if (v & BQ24190_REG_F_BAT_FAULT_MASK) {
1576 		health = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
1577 	} else {
1578 		v &= bdi->info->ntc_fault_mask;
1579 
1580 		health = v ? bdi->info->get_ntc_status(v) : POWER_SUPPLY_HEALTH_GOOD;
1581 	}
1582 
1583 	val->intval = health;
1584 	return 0;
1585 }
1586 
bq24190_battery_get_online(struct bq24190_dev_info * bdi,union power_supply_propval * val)1587 static int bq24190_battery_get_online(struct bq24190_dev_info *bdi,
1588 		union power_supply_propval *val)
1589 {
1590 	u8 batfet_disable;
1591 	int ret;
1592 
1593 	ret = bq24190_read_mask(bdi, BQ24190_REG_MOC,
1594 			BQ24190_REG_MOC_BATFET_DISABLE_MASK,
1595 			BQ24190_REG_MOC_BATFET_DISABLE_SHIFT, &batfet_disable);
1596 	if (ret < 0)
1597 		return ret;
1598 
1599 	val->intval = !batfet_disable;
1600 	return 0;
1601 }
1602 
bq24190_battery_set_online(struct bq24190_dev_info * bdi,const union power_supply_propval * val)1603 static int bq24190_battery_set_online(struct bq24190_dev_info *bdi,
1604 		const union power_supply_propval *val)
1605 {
1606 	return bq24190_write_mask(bdi, BQ24190_REG_MOC,
1607 			BQ24190_REG_MOC_BATFET_DISABLE_MASK,
1608 			BQ24190_REG_MOC_BATFET_DISABLE_SHIFT, !val->intval);
1609 }
1610 
bq24190_battery_get_temp_alert_max(struct bq24190_dev_info * bdi,union power_supply_propval * val)1611 static int bq24190_battery_get_temp_alert_max(struct bq24190_dev_info *bdi,
1612 		union power_supply_propval *val)
1613 {
1614 	int temp, ret;
1615 
1616 	ret = bq24190_get_field_val(bdi, BQ24190_REG_ICTRC,
1617 			BQ24190_REG_ICTRC_TREG_MASK,
1618 			BQ24190_REG_ICTRC_TREG_SHIFT,
1619 			bq24190_ictrc_treg_values,
1620 			ARRAY_SIZE(bq24190_ictrc_treg_values), &temp);
1621 	if (ret < 0)
1622 		return ret;
1623 
1624 	val->intval = temp;
1625 	return 0;
1626 }
1627 
bq24190_battery_set_temp_alert_max(struct bq24190_dev_info * bdi,const union power_supply_propval * val)1628 static int bq24190_battery_set_temp_alert_max(struct bq24190_dev_info *bdi,
1629 		const union power_supply_propval *val)
1630 {
1631 	return bq24190_set_field_val(bdi, BQ24190_REG_ICTRC,
1632 			BQ24190_REG_ICTRC_TREG_MASK,
1633 			BQ24190_REG_ICTRC_TREG_SHIFT,
1634 			bq24190_ictrc_treg_values,
1635 			ARRAY_SIZE(bq24190_ictrc_treg_values), val->intval);
1636 }
1637 
bq24190_battery_get_property(struct power_supply * psy,enum power_supply_property psp,union power_supply_propval * val)1638 static int bq24190_battery_get_property(struct power_supply *psy,
1639 		enum power_supply_property psp, union power_supply_propval *val)
1640 {
1641 	struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
1642 	int ret;
1643 
1644 	dev_warn(bdi->dev, "warning: /sys/class/power_supply/bq24190-battery is deprecated\n");
1645 	dev_dbg(bdi->dev, "prop: %d\n", psp);
1646 
1647 	ret = pm_runtime_resume_and_get(bdi->dev);
1648 	if (ret < 0)
1649 		return ret;
1650 
1651 	switch (psp) {
1652 	case POWER_SUPPLY_PROP_STATUS:
1653 		ret = bq24190_battery_get_status(bdi, val);
1654 		break;
1655 	case POWER_SUPPLY_PROP_HEALTH:
1656 		ret = bq24190_battery_get_health(bdi, val);
1657 		break;
1658 	case POWER_SUPPLY_PROP_ONLINE:
1659 		ret = bq24190_battery_get_online(bdi, val);
1660 		break;
1661 	case POWER_SUPPLY_PROP_TECHNOLOGY:
1662 		/* Could be Li-on or Li-polymer but no way to tell which */
1663 		val->intval = POWER_SUPPLY_TECHNOLOGY_UNKNOWN;
1664 		ret = 0;
1665 		break;
1666 	case POWER_SUPPLY_PROP_TEMP_ALERT_MAX:
1667 		ret = bq24190_battery_get_temp_alert_max(bdi, val);
1668 		break;
1669 	case POWER_SUPPLY_PROP_SCOPE:
1670 		val->intval = POWER_SUPPLY_SCOPE_SYSTEM;
1671 		ret = 0;
1672 		break;
1673 	default:
1674 		ret = -ENODATA;
1675 	}
1676 
1677 	pm_runtime_put_autosuspend(bdi->dev);
1678 
1679 	return ret;
1680 }
1681 
bq24190_battery_set_property(struct power_supply * psy,enum power_supply_property psp,const union power_supply_propval * val)1682 static int bq24190_battery_set_property(struct power_supply *psy,
1683 		enum power_supply_property psp,
1684 		const union power_supply_propval *val)
1685 {
1686 	struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
1687 	int ret;
1688 
1689 	dev_warn(bdi->dev, "warning: /sys/class/power_supply/bq24190-battery is deprecated\n");
1690 	dev_dbg(bdi->dev, "prop: %d\n", psp);
1691 
1692 	ret = pm_runtime_resume_and_get(bdi->dev);
1693 	if (ret < 0)
1694 		return ret;
1695 
1696 	switch (psp) {
1697 	case POWER_SUPPLY_PROP_ONLINE:
1698 		ret = bq24190_battery_set_online(bdi, val);
1699 		break;
1700 	case POWER_SUPPLY_PROP_TEMP_ALERT_MAX:
1701 		ret = bq24190_battery_set_temp_alert_max(bdi, val);
1702 		break;
1703 	default:
1704 		ret = -EINVAL;
1705 	}
1706 
1707 	pm_runtime_put_autosuspend(bdi->dev);
1708 
1709 	return ret;
1710 }
1711 
bq24190_battery_property_is_writeable(struct power_supply * psy,enum power_supply_property psp)1712 static int bq24190_battery_property_is_writeable(struct power_supply *psy,
1713 		enum power_supply_property psp)
1714 {
1715 	int ret;
1716 
1717 	switch (psp) {
1718 	case POWER_SUPPLY_PROP_ONLINE:
1719 	case POWER_SUPPLY_PROP_TEMP_ALERT_MAX:
1720 		ret = 1;
1721 		break;
1722 	default:
1723 		ret = 0;
1724 	}
1725 
1726 	return ret;
1727 }
1728 
1729 static enum power_supply_property bq24190_battery_properties[] = {
1730 	POWER_SUPPLY_PROP_STATUS,
1731 	POWER_SUPPLY_PROP_HEALTH,
1732 	POWER_SUPPLY_PROP_ONLINE,
1733 	POWER_SUPPLY_PROP_TECHNOLOGY,
1734 	POWER_SUPPLY_PROP_TEMP_ALERT_MAX,
1735 	POWER_SUPPLY_PROP_SCOPE,
1736 };
1737 
1738 static const struct power_supply_desc bq24190_battery_desc = {
1739 	.name			= "bq24190-battery",
1740 	.type			= POWER_SUPPLY_TYPE_BATTERY,
1741 	.properties		= bq24190_battery_properties,
1742 	.num_properties		= ARRAY_SIZE(bq24190_battery_properties),
1743 	.get_property		= bq24190_battery_get_property,
1744 	.set_property		= bq24190_battery_set_property,
1745 	.property_is_writeable	= bq24190_battery_property_is_writeable,
1746 };
1747 
bq24190_configure_usb_otg(struct bq24190_dev_info * bdi,u8 ss_reg)1748 static int bq24190_configure_usb_otg(struct bq24190_dev_info *bdi, u8 ss_reg)
1749 {
1750 	bool otg_enabled;
1751 	int ret;
1752 
1753 	otg_enabled = !!(ss_reg & BQ24190_REG_SS_VBUS_STAT_MASK);
1754 	ret = extcon_set_state_sync(bdi->edev, EXTCON_USB, otg_enabled);
1755 	if (ret < 0)
1756 		dev_err(bdi->dev, "Can't set extcon state to %d: %d\n",
1757 			otg_enabled, ret);
1758 
1759 	return ret;
1760 }
1761 
bq24190_check_status(struct bq24190_dev_info * bdi)1762 static void bq24190_check_status(struct bq24190_dev_info *bdi)
1763 {
1764 	const u8 battery_mask_ss = BQ24190_REG_SS_CHRG_STAT_MASK;
1765 	u8 battery_mask_f = BQ24190_REG_F_BAT_FAULT_MASK;
1766 	bool alert_charger = false, alert_battery = false;
1767 	u8 ss_reg = 0, f_reg = 0;
1768 	int i, ret;
1769 
1770 	battery_mask_f |= bdi->info->ntc_fault_mask;
1771 
1772 	ret = bq24190_read(bdi, BQ24190_REG_SS, &ss_reg);
1773 	if (ret < 0) {
1774 		dev_err(bdi->dev, "Can't read SS reg: %d\n", ret);
1775 		return;
1776 	}
1777 
1778 	i = 0;
1779 	do {
1780 		ret = bq24190_read(bdi, BQ24190_REG_F, &f_reg);
1781 		if (ret < 0) {
1782 			dev_err(bdi->dev, "Can't read F reg: %d\n", ret);
1783 			return;
1784 		}
1785 	} while (f_reg && ++i < 2);
1786 
1787 	/* ignore over/under voltage fault after disconnect */
1788 	if (f_reg == (1 << BQ24190_REG_F_CHRG_FAULT_SHIFT) &&
1789 	    !(ss_reg & BQ24190_REG_SS_PG_STAT_MASK))
1790 		f_reg = 0;
1791 
1792 	if (f_reg != bdi->f_reg) {
1793 		dev_warn(bdi->dev,
1794 			"Fault: boost %d, charge %d, battery %d, ntc %d\n",
1795 			!!(f_reg & BQ24190_REG_F_BOOST_FAULT_MASK),
1796 			!!(f_reg & BQ24190_REG_F_CHRG_FAULT_MASK),
1797 			!!(f_reg & BQ24190_REG_F_BAT_FAULT_MASK),
1798 			!!(f_reg & bdi->info->ntc_fault_mask));
1799 
1800 		mutex_lock(&bdi->f_reg_lock);
1801 		if ((bdi->f_reg & battery_mask_f) != (f_reg & battery_mask_f))
1802 			alert_battery = true;
1803 		if ((bdi->f_reg & ~battery_mask_f) != (f_reg & ~battery_mask_f))
1804 			alert_charger = true;
1805 		bdi->f_reg = f_reg;
1806 		mutex_unlock(&bdi->f_reg_lock);
1807 	}
1808 
1809 	if (ss_reg != bdi->ss_reg) {
1810 		/*
1811 		 * The device is in host mode so when PG_STAT goes from 1->0
1812 		 * (i.e., power removed) HIZ needs to be disabled.
1813 		 */
1814 		if ((bdi->ss_reg & BQ24190_REG_SS_PG_STAT_MASK) &&
1815 				!(ss_reg & BQ24190_REG_SS_PG_STAT_MASK)) {
1816 			ret = bq24190_write_mask(bdi, BQ24190_REG_ISC,
1817 					BQ24190_REG_ISC_EN_HIZ_MASK,
1818 					BQ24190_REG_ISC_EN_HIZ_SHIFT,
1819 					0);
1820 			if (ret < 0)
1821 				dev_err(bdi->dev, "Can't access ISC reg: %d\n",
1822 					ret);
1823 		}
1824 
1825 		if ((bdi->ss_reg & battery_mask_ss) != (ss_reg & battery_mask_ss))
1826 			alert_battery = true;
1827 		if ((bdi->ss_reg & ~battery_mask_ss) != (ss_reg & ~battery_mask_ss))
1828 			alert_charger = true;
1829 		bdi->ss_reg = ss_reg;
1830 	}
1831 
1832 	if (alert_charger || alert_battery) {
1833 		power_supply_changed(bdi->charger);
1834 		bq24190_configure_usb_otg(bdi, ss_reg);
1835 	}
1836 	if (alert_battery && bdi->battery)
1837 		power_supply_changed(bdi->battery);
1838 
1839 	dev_dbg(bdi->dev, "ss_reg: 0x%02x, f_reg: 0x%02x\n", ss_reg, f_reg);
1840 }
1841 
bq24190_irq_handler_thread(int irq,void * data)1842 static irqreturn_t bq24190_irq_handler_thread(int irq, void *data)
1843 {
1844 	struct bq24190_dev_info *bdi = data;
1845 	int error;
1846 
1847 	bdi->irq_event = true;
1848 	error = pm_runtime_resume_and_get(bdi->dev);
1849 	if (error < 0) {
1850 		dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", error);
1851 		return IRQ_NONE;
1852 	}
1853 	bq24190_check_status(bdi);
1854 	pm_runtime_put_autosuspend(bdi->dev);
1855 	bdi->irq_event = false;
1856 
1857 	return IRQ_HANDLED;
1858 }
1859 
bq24190_check_chip(struct bq24190_dev_info * bdi)1860 static int bq24190_check_chip(struct bq24190_dev_info *bdi)
1861 {
1862 	u8 v;
1863 	int ret;
1864 
1865 	ret = bq24190_read_mask(bdi, BQ24190_REG_VPRS,
1866 			BQ24190_REG_VPRS_PN_MASK,
1867 			BQ24190_REG_VPRS_PN_SHIFT,
1868 			&v);
1869 	if (ret < 0)
1870 		return ret;
1871 
1872 	switch (v) {
1873 	case BQ24190_REG_VPRS_PN_24190:
1874 	case BQ24190_REG_VPRS_PN_24192:
1875 	case BQ24190_REG_VPRS_PN_24192I:
1876 		break;
1877 	default:
1878 		dev_err(bdi->dev, "Error unknown model: 0x%02x\n", v);
1879 		return -ENODEV;
1880 	}
1881 
1882 	return 0;
1883 }
1884 
bq24296_check_chip(struct bq24190_dev_info * bdi)1885 static int bq24296_check_chip(struct bq24190_dev_info *bdi)
1886 {
1887 	u8 v;
1888 	int ret;
1889 
1890 	ret = bq24190_read_mask(bdi, BQ24190_REG_VPRS,
1891 			BQ24296_REG_VPRS_PN_MASK,
1892 			BQ24296_REG_VPRS_PN_SHIFT,
1893 			&v);
1894 	if (ret < 0)
1895 		return ret;
1896 
1897 	switch (v) {
1898 	case BQ24296_REG_VPRS_PN_24296:
1899 	case BQ24296_REG_VPRS_PN_24297:
1900 		break;
1901 	default:
1902 		dev_err(bdi->dev, "Error unknown model: 0x%02x\n", v);
1903 		return -ENODEV;
1904 	}
1905 
1906 	return 0;
1907 }
1908 
bq24190_hw_init(struct bq24190_dev_info * bdi)1909 static int bq24190_hw_init(struct bq24190_dev_info *bdi)
1910 {
1911 	int ret;
1912 
1913 	ret = bdi->info->check_chip(bdi);
1914 	if (ret < 0)
1915 		return ret;
1916 
1917 	ret = bq24190_register_reset(bdi);
1918 	if (ret < 0)
1919 		return ret;
1920 
1921 	ret = bq24190_set_config(bdi);
1922 	if (ret < 0)
1923 		return ret;
1924 
1925 	return bq24190_read(bdi, BQ24190_REG_SS, &bdi->ss_reg);
1926 }
1927 
bq24190_get_config(struct bq24190_dev_info * bdi)1928 static int bq24190_get_config(struct bq24190_dev_info *bdi)
1929 {
1930 	const char * const s = "ti,system-minimum-microvolt";
1931 	struct power_supply_battery_info *info;
1932 	int v, idx;
1933 
1934 	idx = bdi->info->ichg_array_size - 1;
1935 
1936 	bdi->ichg_max = bq24190_ccc_ichg_values[idx];
1937 
1938 	idx = ARRAY_SIZE(bq24190_cvc_vreg_values) - 1;
1939 	bdi->vreg_max = bq24190_cvc_vreg_values[idx];
1940 
1941 	if (device_property_read_u32(bdi->dev, s, &v) == 0) {
1942 		v /= 1000;
1943 		if (v >= BQ24190_REG_POC_SYS_MIN_MIN
1944 		 && v <= BQ24190_REG_POC_SYS_MIN_MAX)
1945 			bdi->sys_min = v;
1946 		else
1947 			dev_warn(bdi->dev, "invalid value for %s: %u\n", s, v);
1948 	}
1949 
1950 	if (!power_supply_get_battery_info(bdi->charger, &info)) {
1951 		v = info->precharge_current_ua / 1000;
1952 		if (v >= BQ24190_REG_PCTCC_IPRECHG_MIN
1953 		 && v <= BQ24190_REG_PCTCC_IPRECHG_MAX)
1954 			bdi->iprechg = v;
1955 		else
1956 			dev_warn(bdi->dev, "invalid value for battery:precharge-current-microamp: %d\n",
1957 				 v);
1958 
1959 		v = info->charge_term_current_ua / 1000;
1960 		if (v >= BQ24190_REG_PCTCC_ITERM_MIN
1961 		 && v <= BQ24190_REG_PCTCC_ITERM_MAX)
1962 			bdi->iterm = v;
1963 		else
1964 			dev_warn(bdi->dev, "invalid value for battery:charge-term-current-microamp: %d\n",
1965 				 v);
1966 
1967 		/* These are optional, so no warning when not set */
1968 		v = info->constant_charge_current_max_ua;
1969 		if (v >= bq24190_ccc_ichg_values[0] && v <= bdi->ichg_max)
1970 			bdi->ichg = bdi->ichg_max = v;
1971 
1972 		v = info->constant_charge_voltage_max_uv;
1973 		if (v >= bq24190_cvc_vreg_values[0] && v <= bdi->vreg_max)
1974 			bdi->vreg = bdi->vreg_max = v;
1975 
1976 		power_supply_put_battery_info(bdi->charger, info);
1977 	}
1978 
1979 	return 0;
1980 }
1981 
1982 static const struct bq24190_chip_info bq24190_chip_info_tbl[] = {
1983 	[BQ24190] = {
1984 		.ichg_array_size = ARRAY_SIZE(bq24190_ccc_ichg_values),
1985 #ifdef CONFIG_REGULATOR
1986 		.vbus_desc = &bq24190_vbus_desc,
1987 #endif
1988 		.check_chip = bq24190_check_chip,
1989 		.set_chg_config = bq24190_battery_set_chg_config,
1990 		.ntc_fault_mask = BQ24190_REG_F_NTC_FAULT_MASK,
1991 		.get_ntc_status = bq24190_charger_get_ntc_status,
1992 		.set_otg_vbus = bq24190_set_otg_vbus,
1993 	},
1994 	[BQ24192] = {
1995 		.ichg_array_size = ARRAY_SIZE(bq24190_ccc_ichg_values),
1996 #ifdef CONFIG_REGULATOR
1997 		.vbus_desc = &bq24190_vbus_desc,
1998 #endif
1999 		.check_chip = bq24190_check_chip,
2000 		.set_chg_config = bq24190_battery_set_chg_config,
2001 		.ntc_fault_mask = BQ24190_REG_F_NTC_FAULT_MASK,
2002 		.get_ntc_status = bq24190_charger_get_ntc_status,
2003 		.set_otg_vbus = bq24190_set_otg_vbus,
2004 	},
2005 	[BQ24192i] = {
2006 		.ichg_array_size = ARRAY_SIZE(bq24190_ccc_ichg_values),
2007 #ifdef CONFIG_REGULATOR
2008 		.vbus_desc = &bq24190_vbus_desc,
2009 #endif
2010 		.check_chip = bq24190_check_chip,
2011 		.set_chg_config = bq24190_battery_set_chg_config,
2012 		.ntc_fault_mask = BQ24190_REG_F_NTC_FAULT_MASK,
2013 		.get_ntc_status = bq24190_charger_get_ntc_status,
2014 		.set_otg_vbus = bq24190_set_otg_vbus,
2015 	},
2016 	[BQ24193] = {
2017 		.ichg_array_size = ARRAY_SIZE(bq24190_ccc_ichg_values),
2018 #ifdef CONFIG_REGULATOR
2019 		.vbus_desc = &bq24190_vbus_desc,
2020 #endif
2021 		.check_chip = bq24190_check_chip,
2022 		.set_chg_config = bq24190_battery_set_chg_config,
2023 		.ntc_fault_mask = BQ24190_REG_F_NTC_FAULT_MASK,
2024 		.get_ntc_status = bq24190_charger_get_ntc_status,
2025 		.set_otg_vbus = bq24190_set_otg_vbus,
2026 	},
2027 	[BQ24196] = {
2028 		.ichg_array_size = ARRAY_SIZE(bq24190_ccc_ichg_values),
2029 #ifdef CONFIG_REGULATOR
2030 		.vbus_desc = &bq24190_vbus_desc,
2031 #endif
2032 		.check_chip = bq24190_check_chip,
2033 		.set_chg_config = bq24190_battery_set_chg_config,
2034 		.ntc_fault_mask = BQ24190_REG_F_NTC_FAULT_MASK,
2035 		.get_ntc_status = bq24190_charger_get_ntc_status,
2036 		.set_otg_vbus = bq24190_set_otg_vbus,
2037 	},
2038 	[BQ24296] = {
2039 		.ichg_array_size = BQ24296_CCC_ICHG_VALUES_LEN,
2040 #ifdef CONFIG_REGULATOR
2041 		.vbus_desc = &bq24296_vbus_desc,
2042 #endif
2043 		.check_chip = bq24296_check_chip,
2044 		.set_chg_config = bq24296_battery_set_chg_config,
2045 		.ntc_fault_mask = BQ24296_REG_F_NTC_FAULT_MASK,
2046 		.get_ntc_status = bq24296_charger_get_ntc_status,
2047 		.set_otg_vbus = bq24296_set_otg_vbus,
2048 	},
2049 	[BQ24297] = {
2050 		.ichg_array_size = BQ24296_CCC_ICHG_VALUES_LEN,
2051 #ifdef CONFIG_REGULATOR
2052 		.vbus_desc = &bq24296_vbus_desc,
2053 #endif
2054 		.check_chip = bq24296_check_chip,
2055 		.set_chg_config = bq24296_battery_set_chg_config,
2056 		.ntc_fault_mask = BQ24296_REG_F_NTC_FAULT_MASK,
2057 		.get_ntc_status = bq24296_charger_get_ntc_status,
2058 		.set_otg_vbus = bq24296_set_otg_vbus,
2059 	},
2060 };
2061 
bq24190_probe(struct i2c_client * client)2062 static int bq24190_probe(struct i2c_client *client)
2063 {
2064 	const struct i2c_device_id *id = i2c_client_get_device_id(client);
2065 	struct i2c_adapter *adapter = client->adapter;
2066 	struct device *dev = &client->dev;
2067 	struct power_supply_config charger_cfg = {}, battery_cfg = {};
2068 	struct bq24190_dev_info *bdi;
2069 	int ret;
2070 
2071 	if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) {
2072 		dev_err(dev, "No support for SMBUS_BYTE_DATA\n");
2073 		return -ENODEV;
2074 	}
2075 
2076 	bdi = devm_kzalloc(dev, sizeof(*bdi), GFP_KERNEL);
2077 	if (!bdi) {
2078 		dev_err(dev, "Can't alloc bdi struct\n");
2079 		return -ENOMEM;
2080 	}
2081 
2082 	bdi->client = client;
2083 	bdi->dev = dev;
2084 	strscpy(bdi->model_name, id->name, sizeof(bdi->model_name));
2085 	bdi->info = i2c_get_match_data(client);
2086 	mutex_init(&bdi->f_reg_lock);
2087 	bdi->charge_type = POWER_SUPPLY_CHARGE_TYPE_FAST;
2088 	bdi->f_reg = 0;
2089 	bdi->ss_reg = BQ24190_REG_SS_VBUS_STAT_MASK; /* impossible state */
2090 	INIT_DELAYED_WORK(&bdi->input_current_limit_work,
2091 			  bq24190_input_current_limit_work);
2092 
2093 	i2c_set_clientdata(client, bdi);
2094 
2095 	if (client->irq <= 0) {
2096 		dev_err(dev, "Can't get irq info\n");
2097 		return -EINVAL;
2098 	}
2099 
2100 	bdi->edev = devm_extcon_dev_allocate(dev, bq24190_usb_extcon_cable);
2101 	if (IS_ERR(bdi->edev))
2102 		return PTR_ERR(bdi->edev);
2103 
2104 	ret = devm_extcon_dev_register(dev, bdi->edev);
2105 	if (ret < 0)
2106 		return ret;
2107 
2108 	pm_runtime_enable(dev);
2109 	pm_runtime_use_autosuspend(dev);
2110 	pm_runtime_set_autosuspend_delay(dev, 600);
2111 	ret = pm_runtime_get_sync(dev);
2112 	if (ret < 0) {
2113 		dev_err(dev, "pm_runtime_get failed: %i\n", ret);
2114 		goto out_pmrt;
2115 	}
2116 
2117 #ifdef CONFIG_SYSFS
2118 	bq24190_sysfs_init_attrs();
2119 	charger_cfg.attr_grp = bq24190_sysfs_groups;
2120 #endif
2121 
2122 	charger_cfg.drv_data = bdi;
2123 	charger_cfg.fwnode = dev_fwnode(dev);
2124 	charger_cfg.supplied_to = bq24190_charger_supplied_to;
2125 	charger_cfg.num_supplicants = ARRAY_SIZE(bq24190_charger_supplied_to);
2126 	bdi->charger = power_supply_register(dev, &bq24190_charger_desc,
2127 						&charger_cfg);
2128 	if (IS_ERR(bdi->charger)) {
2129 		dev_err(dev, "Can't register charger\n");
2130 		ret = PTR_ERR(bdi->charger);
2131 		goto out_pmrt;
2132 	}
2133 
2134 	/* the battery class is deprecated and will be removed. */
2135 	/* in the interim, this property hides it.              */
2136 	if (!device_property_read_bool(dev, "omit-battery-class")) {
2137 		battery_cfg.drv_data = bdi;
2138 		bdi->battery = power_supply_register(dev, &bq24190_battery_desc,
2139 						     &battery_cfg);
2140 		if (IS_ERR(bdi->battery)) {
2141 			dev_err(dev, "Can't register battery\n");
2142 			ret = PTR_ERR(bdi->battery);
2143 			goto out_charger;
2144 		}
2145 	}
2146 
2147 	ret = bq24190_get_config(bdi);
2148 	if (ret < 0) {
2149 		dev_err(dev, "Can't get devicetree config\n");
2150 		goto out_charger;
2151 	}
2152 
2153 	ret = bq24190_hw_init(bdi);
2154 	if (ret < 0) {
2155 		dev_err(dev, "Hardware init failed\n");
2156 		goto out_charger;
2157 	}
2158 
2159 	ret = bq24190_configure_usb_otg(bdi, bdi->ss_reg);
2160 	if (ret < 0)
2161 		goto out_charger;
2162 
2163 	bdi->initialized = true;
2164 
2165 	ret = devm_request_threaded_irq(dev, client->irq, NULL,
2166 			bq24190_irq_handler_thread,
2167 			IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
2168 			"bq24190-charger", bdi);
2169 	if (ret < 0) {
2170 		dev_err(dev, "Can't set up irq handler\n");
2171 		goto out_charger;
2172 	}
2173 
2174 	ret = bq24190_register_vbus_regulator(bdi);
2175 	if (ret < 0)
2176 		goto out_charger;
2177 
2178 	enable_irq_wake(client->irq);
2179 
2180 	pm_runtime_put_autosuspend(dev);
2181 
2182 	return 0;
2183 
2184 out_charger:
2185 	if (!IS_ERR_OR_NULL(bdi->battery))
2186 		power_supply_unregister(bdi->battery);
2187 	power_supply_unregister(bdi->charger);
2188 
2189 out_pmrt:
2190 	pm_runtime_put_sync(dev);
2191 	pm_runtime_dont_use_autosuspend(dev);
2192 	pm_runtime_disable(dev);
2193 	return ret;
2194 }
2195 
bq24190_remove(struct i2c_client * client)2196 static void bq24190_remove(struct i2c_client *client)
2197 {
2198 	struct bq24190_dev_info *bdi = i2c_get_clientdata(client);
2199 	int error;
2200 
2201 	cancel_delayed_work_sync(&bdi->input_current_limit_work);
2202 	error = pm_runtime_resume_and_get(bdi->dev);
2203 	if (error < 0)
2204 		dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", error);
2205 
2206 	bq24190_register_reset(bdi);
2207 	if (bdi->battery)
2208 		power_supply_unregister(bdi->battery);
2209 	power_supply_unregister(bdi->charger);
2210 	if (error >= 0)
2211 		pm_runtime_put_sync(bdi->dev);
2212 	pm_runtime_dont_use_autosuspend(bdi->dev);
2213 	pm_runtime_disable(bdi->dev);
2214 }
2215 
bq24190_shutdown(struct i2c_client * client)2216 static void bq24190_shutdown(struct i2c_client *client)
2217 {
2218 	struct bq24190_dev_info *bdi = i2c_get_clientdata(client);
2219 
2220 	/* Turn off 5V boost regulator on shutdown */
2221 	bdi->info->set_otg_vbus(bdi, false);
2222 }
2223 
bq24190_runtime_suspend(struct device * dev)2224 static __maybe_unused int bq24190_runtime_suspend(struct device *dev)
2225 {
2226 	struct i2c_client *client = to_i2c_client(dev);
2227 	struct bq24190_dev_info *bdi = i2c_get_clientdata(client);
2228 
2229 	if (!bdi->initialized)
2230 		return 0;
2231 
2232 	dev_dbg(bdi->dev, "%s\n", __func__);
2233 
2234 	return 0;
2235 }
2236 
bq24190_runtime_resume(struct device * dev)2237 static __maybe_unused int bq24190_runtime_resume(struct device *dev)
2238 {
2239 	struct i2c_client *client = to_i2c_client(dev);
2240 	struct bq24190_dev_info *bdi = i2c_get_clientdata(client);
2241 
2242 	if (!bdi->initialized)
2243 		return 0;
2244 
2245 	if (!bdi->irq_event) {
2246 		dev_dbg(bdi->dev, "checking events on possible wakeirq\n");
2247 		bq24190_check_status(bdi);
2248 	}
2249 
2250 	return 0;
2251 }
2252 
bq24190_pm_suspend(struct device * dev)2253 static __maybe_unused int bq24190_pm_suspend(struct device *dev)
2254 {
2255 	struct i2c_client *client = to_i2c_client(dev);
2256 	struct bq24190_dev_info *bdi = i2c_get_clientdata(client);
2257 	int error;
2258 
2259 	error = pm_runtime_resume_and_get(bdi->dev);
2260 	if (error < 0)
2261 		dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", error);
2262 
2263 	bq24190_register_reset(bdi);
2264 
2265 	if (error >= 0) {
2266 		pm_runtime_put_autosuspend(bdi->dev);
2267 	}
2268 
2269 	return 0;
2270 }
2271 
bq24190_pm_resume(struct device * dev)2272 static __maybe_unused int bq24190_pm_resume(struct device *dev)
2273 {
2274 	struct i2c_client *client = to_i2c_client(dev);
2275 	struct bq24190_dev_info *bdi = i2c_get_clientdata(client);
2276 	int error;
2277 
2278 	bdi->f_reg = 0;
2279 	bdi->ss_reg = BQ24190_REG_SS_VBUS_STAT_MASK; /* impossible state */
2280 
2281 	error = pm_runtime_resume_and_get(bdi->dev);
2282 	if (error < 0)
2283 		dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", error);
2284 
2285 	bq24190_register_reset(bdi);
2286 	bq24190_set_config(bdi);
2287 	bq24190_read(bdi, BQ24190_REG_SS, &bdi->ss_reg);
2288 
2289 	if (error >= 0) {
2290 		pm_runtime_put_autosuspend(bdi->dev);
2291 	}
2292 
2293 	/* Things may have changed while suspended so alert upper layer */
2294 	power_supply_changed(bdi->charger);
2295 	if (bdi->battery)
2296 		power_supply_changed(bdi->battery);
2297 
2298 	return 0;
2299 }
2300 
2301 static const struct dev_pm_ops bq24190_pm_ops = {
2302 	SET_RUNTIME_PM_OPS(bq24190_runtime_suspend, bq24190_runtime_resume,
2303 			   NULL)
2304 	SET_SYSTEM_SLEEP_PM_OPS(bq24190_pm_suspend, bq24190_pm_resume)
2305 };
2306 
2307 static const struct i2c_device_id bq24190_i2c_ids[] = {
2308 	{ "bq24190", (kernel_ulong_t)&bq24190_chip_info_tbl[BQ24190] },
2309 	{ "bq24192", (kernel_ulong_t)&bq24190_chip_info_tbl[BQ24192] },
2310 	{ "bq24192i", (kernel_ulong_t)&bq24190_chip_info_tbl[BQ24192i] },
2311 	{ "bq24193", (kernel_ulong_t)&bq24190_chip_info_tbl[BQ24193] },
2312 	{ "bq24196", (kernel_ulong_t)&bq24190_chip_info_tbl[BQ24196] },
2313 	{ "bq24296", (kernel_ulong_t)&bq24190_chip_info_tbl[BQ24296] },
2314 	{ "bq24297", (kernel_ulong_t)&bq24190_chip_info_tbl[BQ24297] },
2315 	{ },
2316 };
2317 MODULE_DEVICE_TABLE(i2c, bq24190_i2c_ids);
2318 
2319 static const struct of_device_id bq24190_of_match[] = {
2320 	{ .compatible = "ti,bq24190", .data = &bq24190_chip_info_tbl[BQ24190] },
2321 	{ .compatible = "ti,bq24192", .data = &bq24190_chip_info_tbl[BQ24192] },
2322 	{ .compatible = "ti,bq24192i", .data = &bq24190_chip_info_tbl[BQ24192i] },
2323 	{ .compatible = "ti,bq24193", .data = &bq24190_chip_info_tbl[BQ24193] },
2324 	{ .compatible = "ti,bq24196", .data = &bq24190_chip_info_tbl[BQ24196] },
2325 	{ .compatible = "ti,bq24296", .data = &bq24190_chip_info_tbl[BQ24296] },
2326 	{ .compatible = "ti,bq24297", .data = &bq24190_chip_info_tbl[BQ24297] },
2327 	{ },
2328 };
2329 MODULE_DEVICE_TABLE(of, bq24190_of_match);
2330 
2331 static struct i2c_driver bq24190_driver = {
2332 	.probe		= bq24190_probe,
2333 	.remove		= bq24190_remove,
2334 	.shutdown	= bq24190_shutdown,
2335 	.id_table	= bq24190_i2c_ids,
2336 	.driver = {
2337 		.name		= "bq24190-charger",
2338 		.pm		= &bq24190_pm_ops,
2339 		.of_match_table	= bq24190_of_match,
2340 	},
2341 };
2342 module_i2c_driver(bq24190_driver);
2343 
2344 MODULE_LICENSE("GPL");
2345 MODULE_AUTHOR("Mark A. Greer <mgreer@animalcreek.com>");
2346 MODULE_DESCRIPTION("TI BQ24190 Charger Driver");
2347