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