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