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/gpio.h>
20 #include <linux/i2c.h>
21 #include <linux/extcon-provider.h>
22 
23 #define	BQ24190_MANUFACTURER	"Texas Instruments"
24 
25 #define BQ24190_REG_ISC		0x00 /* Input Source Control */
26 #define BQ24190_REG_ISC_EN_HIZ_MASK		BIT(7)
27 #define BQ24190_REG_ISC_EN_HIZ_SHIFT		7
28 #define BQ24190_REG_ISC_VINDPM_MASK		(BIT(6) | BIT(5) | BIT(4) | \
29 						 BIT(3))
30 #define BQ24190_REG_ISC_VINDPM_SHIFT		3
31 #define BQ24190_REG_ISC_IINLIM_MASK		(BIT(2) | BIT(1) | BIT(0))
32 #define BQ24190_REG_ISC_IINLIM_SHIFT		0
33 
34 #define BQ24190_REG_POC		0x01 /* Power-On Configuration */
35 #define BQ24190_REG_POC_RESET_MASK		BIT(7)
36 #define BQ24190_REG_POC_RESET_SHIFT		7
37 #define BQ24190_REG_POC_WDT_RESET_MASK		BIT(6)
38 #define BQ24190_REG_POC_WDT_RESET_SHIFT		6
39 #define BQ24190_REG_POC_CHG_CONFIG_MASK		(BIT(5) | BIT(4))
40 #define BQ24190_REG_POC_CHG_CONFIG_SHIFT	4
41 #define BQ24190_REG_POC_CHG_CONFIG_DISABLE		0x0
42 #define BQ24190_REG_POC_CHG_CONFIG_CHARGE		0x1
43 #define BQ24190_REG_POC_CHG_CONFIG_OTG			0x2
44 #define BQ24190_REG_POC_CHG_CONFIG_OTG_ALT		0x3
45 #define BQ24190_REG_POC_SYS_MIN_MASK		(BIT(3) | BIT(2) | BIT(1))
46 #define BQ24190_REG_POC_SYS_MIN_SHIFT		1
47 #define BQ24190_REG_POC_SYS_MIN_MIN			3000
48 #define BQ24190_REG_POC_SYS_MIN_MAX			3700
49 #define BQ24190_REG_POC_BOOST_LIM_MASK		BIT(0)
50 #define BQ24190_REG_POC_BOOST_LIM_SHIFT		0
51 
52 #define BQ24190_REG_CCC		0x02 /* Charge Current Control */
53 #define BQ24190_REG_CCC_ICHG_MASK		(BIT(7) | BIT(6) | BIT(5) | \
54 						 BIT(4) | BIT(3) | BIT(2))
55 #define BQ24190_REG_CCC_ICHG_SHIFT		2
56 #define BQ24190_REG_CCC_FORCE_20PCT_MASK	BIT(0)
57 #define BQ24190_REG_CCC_FORCE_20PCT_SHIFT	0
58 
59 #define BQ24190_REG_PCTCC	0x03 /* Pre-charge/Termination Current Cntl */
60 #define BQ24190_REG_PCTCC_IPRECHG_MASK		(BIT(7) | BIT(6) | BIT(5) | \
61 						 BIT(4))
62 #define BQ24190_REG_PCTCC_IPRECHG_SHIFT		4
63 #define BQ24190_REG_PCTCC_IPRECHG_MIN			128
64 #define BQ24190_REG_PCTCC_IPRECHG_MAX			2048
65 #define BQ24190_REG_PCTCC_ITERM_MASK		(BIT(3) | BIT(2) | BIT(1) | \
66 						 BIT(0))
67 #define BQ24190_REG_PCTCC_ITERM_SHIFT		0
68 #define BQ24190_REG_PCTCC_ITERM_MIN			128
69 #define BQ24190_REG_PCTCC_ITERM_MAX			2048
70 
71 #define BQ24190_REG_CVC		0x04 /* Charge Voltage Control */
72 #define BQ24190_REG_CVC_VREG_MASK		(BIT(7) | BIT(6) | BIT(5) | \
73 						 BIT(4) | BIT(3) | BIT(2))
74 #define BQ24190_REG_CVC_VREG_SHIFT		2
75 #define BQ24190_REG_CVC_BATLOWV_MASK		BIT(1)
76 #define BQ24190_REG_CVC_BATLOWV_SHIFT		1
77 #define BQ24190_REG_CVC_VRECHG_MASK		BIT(0)
78 #define BQ24190_REG_CVC_VRECHG_SHIFT		0
79 
80 #define BQ24190_REG_CTTC	0x05 /* Charge Term/Timer Control */
81 #define BQ24190_REG_CTTC_EN_TERM_MASK		BIT(7)
82 #define BQ24190_REG_CTTC_EN_TERM_SHIFT		7
83 #define BQ24190_REG_CTTC_TERM_STAT_MASK		BIT(6)
84 #define BQ24190_REG_CTTC_TERM_STAT_SHIFT	6
85 #define BQ24190_REG_CTTC_WATCHDOG_MASK		(BIT(5) | BIT(4))
86 #define BQ24190_REG_CTTC_WATCHDOG_SHIFT		4
87 #define BQ24190_REG_CTTC_EN_TIMER_MASK		BIT(3)
88 #define BQ24190_REG_CTTC_EN_TIMER_SHIFT		3
89 #define BQ24190_REG_CTTC_CHG_TIMER_MASK		(BIT(2) | BIT(1))
90 #define BQ24190_REG_CTTC_CHG_TIMER_SHIFT	1
91 #define BQ24190_REG_CTTC_JEITA_ISET_MASK	BIT(0)
92 #define BQ24190_REG_CTTC_JEITA_ISET_SHIFT	0
93 
94 #define BQ24190_REG_ICTRC	0x06 /* IR Comp/Thermal Regulation Control */
95 #define BQ24190_REG_ICTRC_BAT_COMP_MASK		(BIT(7) | BIT(6) | BIT(5))
96 #define BQ24190_REG_ICTRC_BAT_COMP_SHIFT	5
97 #define BQ24190_REG_ICTRC_VCLAMP_MASK		(BIT(4) | BIT(3) | BIT(2))
98 #define BQ24190_REG_ICTRC_VCLAMP_SHIFT		2
99 #define BQ24190_REG_ICTRC_TREG_MASK		(BIT(1) | BIT(0))
100 #define BQ24190_REG_ICTRC_TREG_SHIFT		0
101 
102 #define BQ24190_REG_MOC		0x07 /* Misc. Operation Control */
103 #define BQ24190_REG_MOC_DPDM_EN_MASK		BIT(7)
104 #define BQ24190_REG_MOC_DPDM_EN_SHIFT		7
105 #define BQ24190_REG_MOC_TMR2X_EN_MASK		BIT(6)
106 #define BQ24190_REG_MOC_TMR2X_EN_SHIFT		6
107 #define BQ24190_REG_MOC_BATFET_DISABLE_MASK	BIT(5)
108 #define BQ24190_REG_MOC_BATFET_DISABLE_SHIFT	5
109 #define BQ24190_REG_MOC_JEITA_VSET_MASK		BIT(4)
110 #define BQ24190_REG_MOC_JEITA_VSET_SHIFT	4
111 #define BQ24190_REG_MOC_INT_MASK_MASK		(BIT(1) | BIT(0))
112 #define BQ24190_REG_MOC_INT_MASK_SHIFT		0
113 
114 #define BQ24190_REG_SS		0x08 /* System Status */
115 #define BQ24190_REG_SS_VBUS_STAT_MASK		(BIT(7) | BIT(6))
116 #define BQ24190_REG_SS_VBUS_STAT_SHIFT		6
117 #define BQ24190_REG_SS_CHRG_STAT_MASK		(BIT(5) | BIT(4))
118 #define BQ24190_REG_SS_CHRG_STAT_SHIFT		4
119 #define BQ24190_REG_SS_DPM_STAT_MASK		BIT(3)
120 #define BQ24190_REG_SS_DPM_STAT_SHIFT		3
121 #define BQ24190_REG_SS_PG_STAT_MASK		BIT(2)
122 #define BQ24190_REG_SS_PG_STAT_SHIFT		2
123 #define BQ24190_REG_SS_THERM_STAT_MASK		BIT(1)
124 #define BQ24190_REG_SS_THERM_STAT_SHIFT		1
125 #define BQ24190_REG_SS_VSYS_STAT_MASK		BIT(0)
126 #define BQ24190_REG_SS_VSYS_STAT_SHIFT		0
127 
128 #define BQ24190_REG_F		0x09 /* Fault */
129 #define BQ24190_REG_F_WATCHDOG_FAULT_MASK	BIT(7)
130 #define BQ24190_REG_F_WATCHDOG_FAULT_SHIFT	7
131 #define BQ24190_REG_F_BOOST_FAULT_MASK		BIT(6)
132 #define BQ24190_REG_F_BOOST_FAULT_SHIFT		6
133 #define BQ24190_REG_F_CHRG_FAULT_MASK		(BIT(5) | BIT(4))
134 #define BQ24190_REG_F_CHRG_FAULT_SHIFT		4
135 #define BQ24190_REG_F_BAT_FAULT_MASK		BIT(3)
136 #define BQ24190_REG_F_BAT_FAULT_SHIFT		3
137 #define BQ24190_REG_F_NTC_FAULT_MASK		(BIT(2) | BIT(1) | BIT(0))
138 #define BQ24190_REG_F_NTC_FAULT_SHIFT		0
139 
140 #define BQ24190_REG_VPRS	0x0A /* Vendor/Part/Revision Status */
141 #define BQ24190_REG_VPRS_PN_MASK		(BIT(5) | BIT(4) | BIT(3))
142 #define BQ24190_REG_VPRS_PN_SHIFT		3
143 #define BQ24190_REG_VPRS_PN_24190			0x4
144 #define BQ24190_REG_VPRS_PN_24192			0x5 /* Also 24193, 24196 */
145 #define BQ24190_REG_VPRS_PN_24192I			0x3
146 #define BQ24190_REG_VPRS_TS_PROFILE_MASK	BIT(2)
147 #define BQ24190_REG_VPRS_TS_PROFILE_SHIFT	2
148 #define BQ24190_REG_VPRS_DEV_REG_MASK		(BIT(1) | BIT(0))
149 #define BQ24190_REG_VPRS_DEV_REG_SHIFT		0
150 
151 /*
152  * The FAULT register is latched by the bq24190 (except for NTC_FAULT)
153  * so the first read after a fault returns the latched value and subsequent
154  * reads return the current value.  In order to return the fault status
155  * to the user, have the interrupt handler save the reg's value and retrieve
156  * it in the appropriate health/status routine.
157  */
158 struct bq24190_dev_info {
159 	struct i2c_client		*client;
160 	struct device			*dev;
161 	struct extcon_dev		*edev;
162 	struct power_supply		*charger;
163 	struct power_supply		*battery;
164 	struct delayed_work		input_current_limit_work;
165 	char				model_name[I2C_NAME_SIZE];
166 	bool				initialized;
167 	bool				irq_event;
168 	u16				sys_min;
169 	u16				iprechg;
170 	u16				iterm;
171 	struct mutex			f_reg_lock;
172 	u8				f_reg;
173 	u8				ss_reg;
174 	u8				watchdog;
175 };
176 
177 static const unsigned int bq24190_usb_extcon_cable[] = {
178 	EXTCON_USB,
179 	EXTCON_NONE,
180 };
181 
182 /*
183  * The tables below provide a 2-way mapping for the value that goes in
184  * the register field and the real-world value that it represents.
185  * The index of the array is the value that goes in the register; the
186  * number at that index in the array is the real-world value that it
187  * represents.
188  */
189 
190 /* REG00[2:0] (IINLIM) in uAh */
191 static const int bq24190_isc_iinlim_values[] = {
192 	 100000,  150000,  500000,  900000, 1200000, 1500000, 2000000, 3000000
193 };
194 
195 /* REG02[7:2] (ICHG) in uAh */
196 static const int bq24190_ccc_ichg_values[] = {
197 	 512000,  576000,  640000,  704000,  768000,  832000,  896000,  960000,
198 	1024000, 1088000, 1152000, 1216000, 1280000, 1344000, 1408000, 1472000,
199 	1536000, 1600000, 1664000, 1728000, 1792000, 1856000, 1920000, 1984000,
200 	2048000, 2112000, 2176000, 2240000, 2304000, 2368000, 2432000, 2496000,
201 	2560000, 2624000, 2688000, 2752000, 2816000, 2880000, 2944000, 3008000,
202 	3072000, 3136000, 3200000, 3264000, 3328000, 3392000, 3456000, 3520000,
203 	3584000, 3648000, 3712000, 3776000, 3840000, 3904000, 3968000, 4032000,
204 	4096000, 4160000, 4224000, 4288000, 4352000, 4416000, 4480000, 4544000
205 };
206 
207 /* REG04[7:2] (VREG) in uV */
208 static const int bq24190_cvc_vreg_values[] = {
209 	3504000, 3520000, 3536000, 3552000, 3568000, 3584000, 3600000, 3616000,
210 	3632000, 3648000, 3664000, 3680000, 3696000, 3712000, 3728000, 3744000,
211 	3760000, 3776000, 3792000, 3808000, 3824000, 3840000, 3856000, 3872000,
212 	3888000, 3904000, 3920000, 3936000, 3952000, 3968000, 3984000, 4000000,
213 	4016000, 4032000, 4048000, 4064000, 4080000, 4096000, 4112000, 4128000,
214 	4144000, 4160000, 4176000, 4192000, 4208000, 4224000, 4240000, 4256000,
215 	4272000, 4288000, 4304000, 4320000, 4336000, 4352000, 4368000, 4384000,
216 	4400000
217 };
218 
219 /* REG06[1:0] (TREG) in tenths of degrees Celsius */
220 static const int bq24190_ictrc_treg_values[] = {
221 	600, 800, 1000, 1200
222 };
223 
224 /*
225  * Return the index in 'tbl' of greatest value that is less than or equal to
226  * 'val'.  The index range returned is 0 to 'tbl_size' - 1.  Assumes that
227  * the values in 'tbl' are sorted from smallest to largest and 'tbl_size'
228  * is less than 2^8.
229  */
bq24190_find_idx(const int tbl[], int tbl_size, int v)230 static u8 bq24190_find_idx(const int tbl[], int tbl_size, int v)
231 {
232 	int i;
233 
234 	for (i = 1; i < tbl_size; i++)
235 		if (v < tbl[i])
236 			break;
237 
238 	return i - 1;
239 }
240 
241 /* Basic driver I/O routines */
242 
bq24190_read(struct bq24190_dev_info *bdi, u8 reg, u8 *data)243 static int bq24190_read(struct bq24190_dev_info *bdi, u8 reg, u8 *data)
244 {
245 	int ret;
246 
247 	ret = i2c_smbus_read_byte_data(bdi->client, reg);
248 	if (ret < 0)
249 		return ret;
250 
251 	*data = ret;
252 	return 0;
253 }
254 
bq24190_write(struct bq24190_dev_info *bdi, u8 reg, u8 data)255 static int bq24190_write(struct bq24190_dev_info *bdi, u8 reg, u8 data)
256 {
257 	return i2c_smbus_write_byte_data(bdi->client, reg, data);
258 }
259 
bq24190_read_mask(struct bq24190_dev_info *bdi, u8 reg, u8 mask, u8 shift, u8 *data)260 static int bq24190_read_mask(struct bq24190_dev_info *bdi, u8 reg,
261 		u8 mask, u8 shift, u8 *data)
262 {
263 	u8 v;
264 	int ret;
265 
266 	ret = bq24190_read(bdi, reg, &v);
267 	if (ret < 0)
268 		return ret;
269 
270 	v &= mask;
271 	v >>= shift;
272 	*data = v;
273 
274 	return 0;
275 }
276 
bq24190_write_mask(struct bq24190_dev_info *bdi, u8 reg, u8 mask, u8 shift, u8 data)277 static int bq24190_write_mask(struct bq24190_dev_info *bdi, u8 reg,
278 		u8 mask, u8 shift, u8 data)
279 {
280 	u8 v;
281 	int ret;
282 
283 	ret = bq24190_read(bdi, reg, &v);
284 	if (ret < 0)
285 		return ret;
286 
287 	v &= ~mask;
288 	v |= ((data << shift) & mask);
289 
290 	return bq24190_write(bdi, reg, v);
291 }
292 
bq24190_get_field_val(struct bq24190_dev_info *bdi, u8 reg, u8 mask, u8 shift, const int tbl[], int tbl_size, int *val)293 static int bq24190_get_field_val(struct bq24190_dev_info *bdi,
294 		u8 reg, u8 mask, u8 shift,
295 		const int tbl[], int tbl_size,
296 		int *val)
297 {
298 	u8 v;
299 	int ret;
300 
301 	ret = bq24190_read_mask(bdi, reg, mask, shift, &v);
302 	if (ret < 0)
303 		return ret;
304 
305 	v = (v >= tbl_size) ? (tbl_size - 1) : v;
306 	*val = tbl[v];
307 
308 	return 0;
309 }
310 
bq24190_set_field_val(struct bq24190_dev_info *bdi, u8 reg, u8 mask, u8 shift, const int tbl[], int tbl_size, int val)311 static int bq24190_set_field_val(struct bq24190_dev_info *bdi,
312 		u8 reg, u8 mask, u8 shift,
313 		const int tbl[], int tbl_size,
314 		int val)
315 {
316 	u8 idx;
317 
318 	idx = bq24190_find_idx(tbl, tbl_size, val);
319 
320 	return bq24190_write_mask(bdi, reg, mask, shift, idx);
321 }
322 
323 #ifdef CONFIG_SYSFS
324 /*
325  * There are a numerous options that are configurable on the bq24190
326  * that go well beyond what the power_supply properties provide access to.
327  * Provide sysfs access to them so they can be examined and possibly modified
328  * on the fly.  They will be provided for the charger power_supply object only
329  * and will be prefixed by 'f_' to make them easier to recognize.
330  */
331 
332 #define BQ24190_SYSFS_FIELD(_name, r, f, m, store)			\
333 {									\
334 	.attr	= __ATTR(f_##_name, m, bq24190_sysfs_show, store),	\
335 	.reg	= BQ24190_REG_##r,					\
336 	.mask	= BQ24190_REG_##r##_##f##_MASK,				\
337 	.shift	= BQ24190_REG_##r##_##f##_SHIFT,			\
338 }
339 
340 #define BQ24190_SYSFS_FIELD_RW(_name, r, f)				\
341 		BQ24190_SYSFS_FIELD(_name, r, f, S_IWUSR | S_IRUGO,	\
342 				bq24190_sysfs_store)
343 
344 #define BQ24190_SYSFS_FIELD_RO(_name, r, f)				\
345 		BQ24190_SYSFS_FIELD(_name, r, f, S_IRUGO, NULL)
346 
347 static ssize_t bq24190_sysfs_show(struct device *dev,
348 		struct device_attribute *attr, char *buf);
349 static ssize_t bq24190_sysfs_store(struct device *dev,
350 		struct device_attribute *attr, const char *buf, size_t count);
351 
352 struct bq24190_sysfs_field_info {
353 	struct device_attribute	attr;
354 	u8	reg;
355 	u8	mask;
356 	u8	shift;
357 };
358 
359 /* On i386 ptrace-abi.h defines SS that breaks the macro calls below. */
360 #undef SS
361 
362 static struct bq24190_sysfs_field_info bq24190_sysfs_field_tbl[] = {
363 			/*	sysfs name	reg	field in reg */
364 	BQ24190_SYSFS_FIELD_RW(en_hiz,		ISC,	EN_HIZ),
365 	BQ24190_SYSFS_FIELD_RW(vindpm,		ISC,	VINDPM),
366 	BQ24190_SYSFS_FIELD_RW(iinlim,		ISC,	IINLIM),
367 	BQ24190_SYSFS_FIELD_RW(chg_config,	POC,	CHG_CONFIG),
368 	BQ24190_SYSFS_FIELD_RW(sys_min,		POC,	SYS_MIN),
369 	BQ24190_SYSFS_FIELD_RW(boost_lim,	POC,	BOOST_LIM),
370 	BQ24190_SYSFS_FIELD_RW(ichg,		CCC,	ICHG),
371 	BQ24190_SYSFS_FIELD_RW(force_20_pct,	CCC,	FORCE_20PCT),
372 	BQ24190_SYSFS_FIELD_RW(iprechg,		PCTCC,	IPRECHG),
373 	BQ24190_SYSFS_FIELD_RW(iterm,		PCTCC,	ITERM),
374 	BQ24190_SYSFS_FIELD_RW(vreg,		CVC,	VREG),
375 	BQ24190_SYSFS_FIELD_RW(batlowv,		CVC,	BATLOWV),
376 	BQ24190_SYSFS_FIELD_RW(vrechg,		CVC,	VRECHG),
377 	BQ24190_SYSFS_FIELD_RW(en_term,		CTTC,	EN_TERM),
378 	BQ24190_SYSFS_FIELD_RW(term_stat,	CTTC,	TERM_STAT),
379 	BQ24190_SYSFS_FIELD_RO(watchdog,	CTTC,	WATCHDOG),
380 	BQ24190_SYSFS_FIELD_RW(en_timer,	CTTC,	EN_TIMER),
381 	BQ24190_SYSFS_FIELD_RW(chg_timer,	CTTC,	CHG_TIMER),
382 	BQ24190_SYSFS_FIELD_RW(jeta_iset,	CTTC,	JEITA_ISET),
383 	BQ24190_SYSFS_FIELD_RW(bat_comp,	ICTRC,	BAT_COMP),
384 	BQ24190_SYSFS_FIELD_RW(vclamp,		ICTRC,	VCLAMP),
385 	BQ24190_SYSFS_FIELD_RW(treg,		ICTRC,	TREG),
386 	BQ24190_SYSFS_FIELD_RW(dpdm_en,		MOC,	DPDM_EN),
387 	BQ24190_SYSFS_FIELD_RW(tmr2x_en,	MOC,	TMR2X_EN),
388 	BQ24190_SYSFS_FIELD_RW(batfet_disable,	MOC,	BATFET_DISABLE),
389 	BQ24190_SYSFS_FIELD_RW(jeita_vset,	MOC,	JEITA_VSET),
390 	BQ24190_SYSFS_FIELD_RO(int_mask,	MOC,	INT_MASK),
391 	BQ24190_SYSFS_FIELD_RO(vbus_stat,	SS,	VBUS_STAT),
392 	BQ24190_SYSFS_FIELD_RO(chrg_stat,	SS,	CHRG_STAT),
393 	BQ24190_SYSFS_FIELD_RO(dpm_stat,	SS,	DPM_STAT),
394 	BQ24190_SYSFS_FIELD_RO(pg_stat,		SS,	PG_STAT),
395 	BQ24190_SYSFS_FIELD_RO(therm_stat,	SS,	THERM_STAT),
396 	BQ24190_SYSFS_FIELD_RO(vsys_stat,	SS,	VSYS_STAT),
397 	BQ24190_SYSFS_FIELD_RO(watchdog_fault,	F,	WATCHDOG_FAULT),
398 	BQ24190_SYSFS_FIELD_RO(boost_fault,	F,	BOOST_FAULT),
399 	BQ24190_SYSFS_FIELD_RO(chrg_fault,	F,	CHRG_FAULT),
400 	BQ24190_SYSFS_FIELD_RO(bat_fault,	F,	BAT_FAULT),
401 	BQ24190_SYSFS_FIELD_RO(ntc_fault,	F,	NTC_FAULT),
402 	BQ24190_SYSFS_FIELD_RO(pn,		VPRS,	PN),
403 	BQ24190_SYSFS_FIELD_RO(ts_profile,	VPRS,	TS_PROFILE),
404 	BQ24190_SYSFS_FIELD_RO(dev_reg,		VPRS,	DEV_REG),
405 };
406 
407 static struct attribute *
408 	bq24190_sysfs_attrs[ARRAY_SIZE(bq24190_sysfs_field_tbl) + 1];
409 
410 ATTRIBUTE_GROUPS(bq24190_sysfs);
411 
bq24190_sysfs_init_attrs(void)412 static void bq24190_sysfs_init_attrs(void)
413 {
414 	int i, limit = ARRAY_SIZE(bq24190_sysfs_field_tbl);
415 
416 	for (i = 0; i < limit; i++)
417 		bq24190_sysfs_attrs[i] = &bq24190_sysfs_field_tbl[i].attr.attr;
418 
419 	bq24190_sysfs_attrs[limit] = NULL; /* Has additional entry for this */
420 }
421 
bq24190_sysfs_field_lookup( const char *name)422 static struct bq24190_sysfs_field_info *bq24190_sysfs_field_lookup(
423 		const char *name)
424 {
425 	int i, limit = ARRAY_SIZE(bq24190_sysfs_field_tbl);
426 
427 	for (i = 0; i < limit; i++)
428 		if (!strcmp(name, bq24190_sysfs_field_tbl[i].attr.attr.name))
429 			break;
430 
431 	if (i >= limit)
432 		return NULL;
433 
434 	return &bq24190_sysfs_field_tbl[i];
435 }
436 
bq24190_sysfs_show(struct device *dev, struct device_attribute *attr, char *buf)437 static ssize_t bq24190_sysfs_show(struct device *dev,
438 		struct device_attribute *attr, char *buf)
439 {
440 	struct power_supply *psy = dev_get_drvdata(dev);
441 	struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
442 	struct bq24190_sysfs_field_info *info;
443 	ssize_t count;
444 	int ret;
445 	u8 v;
446 
447 	info = bq24190_sysfs_field_lookup(attr->attr.name);
448 	if (!info)
449 		return -EINVAL;
450 
451 	ret = pm_runtime_resume_and_get(bdi->dev);
452 	if (ret < 0)
453 		return ret;
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 
bq24190_sysfs_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)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_resume_and_get(bdi->dev);
485 	if (ret < 0)
486 		return ret;
487 
488 	ret = bq24190_write_mask(bdi, info->reg, info->mask, info->shift, v);
489 	if (ret)
490 		count = ret;
491 
492 	pm_runtime_mark_last_busy(bdi->dev);
493 	pm_runtime_put_autosuspend(bdi->dev);
494 
495 	return count;
496 }
497 #endif
498 
499 #ifdef CONFIG_REGULATOR
bq24190_set_charge_mode(struct regulator_dev *dev, u8 val)500 static int bq24190_set_charge_mode(struct regulator_dev *dev, u8 val)
501 {
502 	struct bq24190_dev_info *bdi = rdev_get_drvdata(dev);
503 	int ret;
504 
505 	ret = pm_runtime_resume_and_get(bdi->dev);
506 	if (ret < 0) {
507 		dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", ret);
508 		return ret;
509 	}
510 
511 	ret = bq24190_write_mask(bdi, BQ24190_REG_POC,
512 				 BQ24190_REG_POC_CHG_CONFIG_MASK,
513 				 BQ24190_REG_POC_CHG_CONFIG_SHIFT, val);
514 
515 	pm_runtime_mark_last_busy(bdi->dev);
516 	pm_runtime_put_autosuspend(bdi->dev);
517 
518 	return ret;
519 }
520 
bq24190_vbus_enable(struct regulator_dev *dev)521 static int bq24190_vbus_enable(struct regulator_dev *dev)
522 {
523 	return bq24190_set_charge_mode(dev, BQ24190_REG_POC_CHG_CONFIG_OTG);
524 }
525 
bq24190_vbus_disable(struct regulator_dev *dev)526 static int bq24190_vbus_disable(struct regulator_dev *dev)
527 {
528 	return bq24190_set_charge_mode(dev, BQ24190_REG_POC_CHG_CONFIG_CHARGE);
529 }
530 
bq24190_vbus_is_enabled(struct regulator_dev *dev)531 static int bq24190_vbus_is_enabled(struct regulator_dev *dev)
532 {
533 	struct bq24190_dev_info *bdi = rdev_get_drvdata(dev);
534 	int ret;
535 	u8 val;
536 
537 	ret = pm_runtime_resume_and_get(bdi->dev);
538 	if (ret < 0) {
539 		dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", ret);
540 		return ret;
541 	}
542 
543 	ret = bq24190_read_mask(bdi, BQ24190_REG_POC,
544 				BQ24190_REG_POC_CHG_CONFIG_MASK,
545 				BQ24190_REG_POC_CHG_CONFIG_SHIFT, &val);
546 
547 	pm_runtime_mark_last_busy(bdi->dev);
548 	pm_runtime_put_autosuspend(bdi->dev);
549 
550 	if (ret)
551 		return ret;
552 
553 	return (val == BQ24190_REG_POC_CHG_CONFIG_OTG ||
554 		val == BQ24190_REG_POC_CHG_CONFIG_OTG_ALT);
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 
bq24190_register_vbus_regulator(struct bq24190_dev_info *bdi)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
bq24190_register_vbus_regulator(struct bq24190_dev_info *bdi)601 static int bq24190_register_vbus_regulator(struct bq24190_dev_info *bdi)
602 {
603 	return 0;
604 }
605 #endif
606 
bq24190_set_config(struct bq24190_dev_info *bdi)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 
bq24190_register_reset(struct bq24190_dev_info *bdi)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 
bq24190_charger_get_charge_type(struct bq24190_dev_info *bdi, union power_supply_propval *val)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 
bq24190_charger_set_charge_type(struct bq24190_dev_info *bdi, const union power_supply_propval *val)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 
bq24190_charger_get_health(struct bq24190_dev_info *bdi, union power_supply_propval *val)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 
bq24190_charger_get_online(struct bq24190_dev_info *bdi, union power_supply_propval *val)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 
bq24190_charger_set_online(struct bq24190_dev_info *bdi, const union power_supply_propval *val)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 
bq24190_charger_get_status(struct bq24190_dev_info *bdi, union power_supply_propval *val)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 
bq24190_charger_get_temp_alert_max(struct bq24190_dev_info *bdi, union power_supply_propval *val)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 
bq24190_charger_set_temp_alert_max(struct bq24190_dev_info *bdi, const union power_supply_propval *val)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 
bq24190_charger_get_precharge(struct bq24190_dev_info *bdi, union power_supply_propval *val)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 
bq24190_charger_get_charge_term(struct bq24190_dev_info *bdi, union power_supply_propval *val)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 
bq24190_charger_get_current(struct bq24190_dev_info *bdi, union power_supply_propval *val)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 
bq24190_charger_get_current_max(struct bq24190_dev_info *bdi, union power_supply_propval *val)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 
bq24190_charger_set_current(struct bq24190_dev_info *bdi, const union power_supply_propval *val)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 
bq24190_charger_get_voltage(struct bq24190_dev_info *bdi, union power_supply_propval *val)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 
bq24190_charger_get_voltage_max(struct bq24190_dev_info *bdi, union power_supply_propval *val)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 
bq24190_charger_set_voltage(struct bq24190_dev_info *bdi, const union power_supply_propval *val)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 
bq24190_charger_get_iinlimit(struct bq24190_dev_info *bdi, union power_supply_propval *val)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 
bq24190_charger_set_iinlimit(struct bq24190_dev_info *bdi, const union power_supply_propval *val)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 
bq24190_charger_get_property(struct power_supply *psy, enum power_supply_property psp, union power_supply_propval *val)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_resume_and_get(bdi->dev);
1081 	if (ret < 0)
1082 		return ret;
1083 
1084 	switch (psp) {
1085 	case POWER_SUPPLY_PROP_CHARGE_TYPE:
1086 		ret = bq24190_charger_get_charge_type(bdi, val);
1087 		break;
1088 	case POWER_SUPPLY_PROP_HEALTH:
1089 		ret = bq24190_charger_get_health(bdi, val);
1090 		break;
1091 	case POWER_SUPPLY_PROP_ONLINE:
1092 		ret = bq24190_charger_get_online(bdi, val);
1093 		break;
1094 	case POWER_SUPPLY_PROP_STATUS:
1095 		ret = bq24190_charger_get_status(bdi, val);
1096 		break;
1097 	case POWER_SUPPLY_PROP_TEMP_ALERT_MAX:
1098 		ret =  bq24190_charger_get_temp_alert_max(bdi, val);
1099 		break;
1100 	case POWER_SUPPLY_PROP_PRECHARGE_CURRENT:
1101 		ret = bq24190_charger_get_precharge(bdi, val);
1102 		break;
1103 	case POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT:
1104 		ret = bq24190_charger_get_charge_term(bdi, val);
1105 		break;
1106 	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
1107 		ret = bq24190_charger_get_current(bdi, val);
1108 		break;
1109 	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX:
1110 		ret = bq24190_charger_get_current_max(bdi, val);
1111 		break;
1112 	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
1113 		ret = bq24190_charger_get_voltage(bdi, val);
1114 		break;
1115 	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX:
1116 		ret = bq24190_charger_get_voltage_max(bdi, val);
1117 		break;
1118 	case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
1119 		ret = bq24190_charger_get_iinlimit(bdi, val);
1120 		break;
1121 	case POWER_SUPPLY_PROP_SCOPE:
1122 		val->intval = POWER_SUPPLY_SCOPE_SYSTEM;
1123 		ret = 0;
1124 		break;
1125 	case POWER_SUPPLY_PROP_MODEL_NAME:
1126 		val->strval = bdi->model_name;
1127 		ret = 0;
1128 		break;
1129 	case POWER_SUPPLY_PROP_MANUFACTURER:
1130 		val->strval = BQ24190_MANUFACTURER;
1131 		ret = 0;
1132 		break;
1133 	default:
1134 		ret = -ENODATA;
1135 	}
1136 
1137 	pm_runtime_mark_last_busy(bdi->dev);
1138 	pm_runtime_put_autosuspend(bdi->dev);
1139 
1140 	return ret;
1141 }
1142 
bq24190_charger_set_property(struct power_supply *psy, enum power_supply_property psp, const union power_supply_propval *val)1143 static int bq24190_charger_set_property(struct power_supply *psy,
1144 		enum power_supply_property psp,
1145 		const union power_supply_propval *val)
1146 {
1147 	struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
1148 	int ret;
1149 
1150 	dev_dbg(bdi->dev, "prop: %d\n", psp);
1151 
1152 	ret = pm_runtime_resume_and_get(bdi->dev);
1153 	if (ret < 0)
1154 		return ret;
1155 
1156 	switch (psp) {
1157 	case POWER_SUPPLY_PROP_ONLINE:
1158 		ret = bq24190_charger_set_online(bdi, val);
1159 		break;
1160 	case POWER_SUPPLY_PROP_TEMP_ALERT_MAX:
1161 		ret = bq24190_charger_set_temp_alert_max(bdi, val);
1162 		break;
1163 	case POWER_SUPPLY_PROP_CHARGE_TYPE:
1164 		ret = bq24190_charger_set_charge_type(bdi, val);
1165 		break;
1166 	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
1167 		ret = bq24190_charger_set_current(bdi, val);
1168 		break;
1169 	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
1170 		ret = bq24190_charger_set_voltage(bdi, val);
1171 		break;
1172 	case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
1173 		ret = bq24190_charger_set_iinlimit(bdi, val);
1174 		break;
1175 	default:
1176 		ret = -EINVAL;
1177 	}
1178 
1179 	pm_runtime_mark_last_busy(bdi->dev);
1180 	pm_runtime_put_autosuspend(bdi->dev);
1181 
1182 	return ret;
1183 }
1184 
bq24190_charger_property_is_writeable(struct power_supply *psy, enum power_supply_property psp)1185 static int bq24190_charger_property_is_writeable(struct power_supply *psy,
1186 		enum power_supply_property psp)
1187 {
1188 	switch (psp) {
1189 	case POWER_SUPPLY_PROP_ONLINE:
1190 	case POWER_SUPPLY_PROP_TEMP_ALERT_MAX:
1191 	case POWER_SUPPLY_PROP_CHARGE_TYPE:
1192 	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
1193 	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
1194 	case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
1195 		return 1;
1196 	default:
1197 		return 0;
1198 	}
1199 }
1200 
bq24190_input_current_limit_work(struct work_struct *work)1201 static void bq24190_input_current_limit_work(struct work_struct *work)
1202 {
1203 	struct bq24190_dev_info *bdi =
1204 		container_of(work, struct bq24190_dev_info,
1205 			     input_current_limit_work.work);
1206 	union power_supply_propval val;
1207 	int ret;
1208 
1209 	ret = power_supply_get_property_from_supplier(bdi->charger,
1210 						      POWER_SUPPLY_PROP_CURRENT_MAX,
1211 						      &val);
1212 	if (ret)
1213 		return;
1214 
1215 	bq24190_charger_set_property(bdi->charger,
1216 				     POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT,
1217 				     &val);
1218 	power_supply_changed(bdi->charger);
1219 }
1220 
1221 /* Sync the input-current-limit with our parent supply (if we have one) */
bq24190_charger_external_power_changed(struct power_supply *psy)1222 static void bq24190_charger_external_power_changed(struct power_supply *psy)
1223 {
1224 	struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
1225 
1226 	/*
1227 	 * The Power-Good detection may take up to 220ms, sometimes
1228 	 * the external charger detection is quicker, and the bq24190 will
1229 	 * reset to iinlim based on its own charger detection (which is not
1230 	 * hooked up when using external charger detection) resulting in a
1231 	 * too low default 500mA iinlim. Delay setting the input-current-limit
1232 	 * for 300ms to avoid this.
1233 	 */
1234 	queue_delayed_work(system_wq, &bdi->input_current_limit_work,
1235 			   msecs_to_jiffies(300));
1236 }
1237 
1238 static enum power_supply_property bq24190_charger_properties[] = {
1239 	POWER_SUPPLY_PROP_CHARGE_TYPE,
1240 	POWER_SUPPLY_PROP_HEALTH,
1241 	POWER_SUPPLY_PROP_ONLINE,
1242 	POWER_SUPPLY_PROP_STATUS,
1243 	POWER_SUPPLY_PROP_TEMP_ALERT_MAX,
1244 	POWER_SUPPLY_PROP_PRECHARGE_CURRENT,
1245 	POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT,
1246 	POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT,
1247 	POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX,
1248 	POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE,
1249 	POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX,
1250 	POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT,
1251 	POWER_SUPPLY_PROP_SCOPE,
1252 	POWER_SUPPLY_PROP_MODEL_NAME,
1253 	POWER_SUPPLY_PROP_MANUFACTURER,
1254 };
1255 
1256 static char *bq24190_charger_supplied_to[] = {
1257 	"main-battery",
1258 };
1259 
1260 static const struct power_supply_desc bq24190_charger_desc = {
1261 	.name			= "bq24190-charger",
1262 	.type			= POWER_SUPPLY_TYPE_USB,
1263 	.properties		= bq24190_charger_properties,
1264 	.num_properties		= ARRAY_SIZE(bq24190_charger_properties),
1265 	.get_property		= bq24190_charger_get_property,
1266 	.set_property		= bq24190_charger_set_property,
1267 	.property_is_writeable	= bq24190_charger_property_is_writeable,
1268 	.external_power_changed	= bq24190_charger_external_power_changed,
1269 };
1270 
1271 /* Battery power supply property routines */
1272 
bq24190_battery_get_status(struct bq24190_dev_info *bdi, union power_supply_propval *val)1273 static int bq24190_battery_get_status(struct bq24190_dev_info *bdi,
1274 		union power_supply_propval *val)
1275 {
1276 	u8 ss_reg, chrg_fault;
1277 	int status, ret;
1278 
1279 	mutex_lock(&bdi->f_reg_lock);
1280 	chrg_fault = bdi->f_reg;
1281 	mutex_unlock(&bdi->f_reg_lock);
1282 
1283 	chrg_fault &= BQ24190_REG_F_CHRG_FAULT_MASK;
1284 	chrg_fault >>= BQ24190_REG_F_CHRG_FAULT_SHIFT;
1285 
1286 	ret = bq24190_read(bdi, BQ24190_REG_SS, &ss_reg);
1287 	if (ret < 0)
1288 		return ret;
1289 
1290 	/*
1291 	 * The battery must be discharging when any of these are true:
1292 	 * - there is no good power source;
1293 	 * - there is a charge fault.
1294 	 * Could also be discharging when in "supplement mode" but
1295 	 * there is no way to tell when its in that mode.
1296 	 */
1297 	if (!(ss_reg & BQ24190_REG_SS_PG_STAT_MASK) || chrg_fault) {
1298 		status = POWER_SUPPLY_STATUS_DISCHARGING;
1299 	} else {
1300 		ss_reg &= BQ24190_REG_SS_CHRG_STAT_MASK;
1301 		ss_reg >>= BQ24190_REG_SS_CHRG_STAT_SHIFT;
1302 
1303 		switch (ss_reg) {
1304 		case 0x0: /* Not Charging */
1305 			status = POWER_SUPPLY_STATUS_NOT_CHARGING;
1306 			break;
1307 		case 0x1: /* Pre-charge */
1308 		case 0x2: /* Fast Charging */
1309 			status = POWER_SUPPLY_STATUS_CHARGING;
1310 			break;
1311 		case 0x3: /* Charge Termination Done */
1312 			status = POWER_SUPPLY_STATUS_FULL;
1313 			break;
1314 		default:
1315 			ret = -EIO;
1316 		}
1317 	}
1318 
1319 	if (!ret)
1320 		val->intval = status;
1321 
1322 	return ret;
1323 }
1324 
bq24190_battery_get_health(struct bq24190_dev_info *bdi, union power_supply_propval *val)1325 static int bq24190_battery_get_health(struct bq24190_dev_info *bdi,
1326 		union power_supply_propval *val)
1327 {
1328 	u8 v;
1329 	int health;
1330 
1331 	mutex_lock(&bdi->f_reg_lock);
1332 	v = bdi->f_reg;
1333 	mutex_unlock(&bdi->f_reg_lock);
1334 
1335 	if (v & BQ24190_REG_F_BAT_FAULT_MASK) {
1336 		health = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
1337 	} else {
1338 		v &= BQ24190_REG_F_NTC_FAULT_MASK;
1339 		v >>= BQ24190_REG_F_NTC_FAULT_SHIFT;
1340 
1341 		switch (v) {
1342 		case 0x0: /* Normal */
1343 			health = POWER_SUPPLY_HEALTH_GOOD;
1344 			break;
1345 		case 0x1: /* TS1 Cold */
1346 		case 0x3: /* TS2 Cold */
1347 		case 0x5: /* Both Cold */
1348 			health = POWER_SUPPLY_HEALTH_COLD;
1349 			break;
1350 		case 0x2: /* TS1 Hot */
1351 		case 0x4: /* TS2 Hot */
1352 		case 0x6: /* Both Hot */
1353 			health = POWER_SUPPLY_HEALTH_OVERHEAT;
1354 			break;
1355 		default:
1356 			health = POWER_SUPPLY_HEALTH_UNKNOWN;
1357 		}
1358 	}
1359 
1360 	val->intval = health;
1361 	return 0;
1362 }
1363 
bq24190_battery_get_online(struct bq24190_dev_info *bdi, union power_supply_propval *val)1364 static int bq24190_battery_get_online(struct bq24190_dev_info *bdi,
1365 		union power_supply_propval *val)
1366 {
1367 	u8 batfet_disable;
1368 	int ret;
1369 
1370 	ret = bq24190_read_mask(bdi, BQ24190_REG_MOC,
1371 			BQ24190_REG_MOC_BATFET_DISABLE_MASK,
1372 			BQ24190_REG_MOC_BATFET_DISABLE_SHIFT, &batfet_disable);
1373 	if (ret < 0)
1374 		return ret;
1375 
1376 	val->intval = !batfet_disable;
1377 	return 0;
1378 }
1379 
bq24190_battery_set_online(struct bq24190_dev_info *bdi, const union power_supply_propval *val)1380 static int bq24190_battery_set_online(struct bq24190_dev_info *bdi,
1381 		const union power_supply_propval *val)
1382 {
1383 	return bq24190_write_mask(bdi, BQ24190_REG_MOC,
1384 			BQ24190_REG_MOC_BATFET_DISABLE_MASK,
1385 			BQ24190_REG_MOC_BATFET_DISABLE_SHIFT, !val->intval);
1386 }
1387 
bq24190_battery_get_temp_alert_max(struct bq24190_dev_info *bdi, union power_supply_propval *val)1388 static int bq24190_battery_get_temp_alert_max(struct bq24190_dev_info *bdi,
1389 		union power_supply_propval *val)
1390 {
1391 	int temp, ret;
1392 
1393 	ret = bq24190_get_field_val(bdi, BQ24190_REG_ICTRC,
1394 			BQ24190_REG_ICTRC_TREG_MASK,
1395 			BQ24190_REG_ICTRC_TREG_SHIFT,
1396 			bq24190_ictrc_treg_values,
1397 			ARRAY_SIZE(bq24190_ictrc_treg_values), &temp);
1398 	if (ret < 0)
1399 		return ret;
1400 
1401 	val->intval = temp;
1402 	return 0;
1403 }
1404 
bq24190_battery_set_temp_alert_max(struct bq24190_dev_info *bdi, const union power_supply_propval *val)1405 static int bq24190_battery_set_temp_alert_max(struct bq24190_dev_info *bdi,
1406 		const union power_supply_propval *val)
1407 {
1408 	return bq24190_set_field_val(bdi, BQ24190_REG_ICTRC,
1409 			BQ24190_REG_ICTRC_TREG_MASK,
1410 			BQ24190_REG_ICTRC_TREG_SHIFT,
1411 			bq24190_ictrc_treg_values,
1412 			ARRAY_SIZE(bq24190_ictrc_treg_values), val->intval);
1413 }
1414 
bq24190_battery_get_property(struct power_supply *psy, enum power_supply_property psp, union power_supply_propval *val)1415 static int bq24190_battery_get_property(struct power_supply *psy,
1416 		enum power_supply_property psp, union power_supply_propval *val)
1417 {
1418 	struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
1419 	int ret;
1420 
1421 	dev_warn(bdi->dev, "warning: /sys/class/power_supply/bq24190-battery is deprecated\n");
1422 	dev_dbg(bdi->dev, "prop: %d\n", psp);
1423 
1424 	ret = pm_runtime_resume_and_get(bdi->dev);
1425 	if (ret < 0)
1426 		return ret;
1427 
1428 	switch (psp) {
1429 	case POWER_SUPPLY_PROP_STATUS:
1430 		ret = bq24190_battery_get_status(bdi, val);
1431 		break;
1432 	case POWER_SUPPLY_PROP_HEALTH:
1433 		ret = bq24190_battery_get_health(bdi, val);
1434 		break;
1435 	case POWER_SUPPLY_PROP_ONLINE:
1436 		ret = bq24190_battery_get_online(bdi, val);
1437 		break;
1438 	case POWER_SUPPLY_PROP_TECHNOLOGY:
1439 		/* Could be Li-on or Li-polymer but no way to tell which */
1440 		val->intval = POWER_SUPPLY_TECHNOLOGY_UNKNOWN;
1441 		ret = 0;
1442 		break;
1443 	case POWER_SUPPLY_PROP_TEMP_ALERT_MAX:
1444 		ret = bq24190_battery_get_temp_alert_max(bdi, val);
1445 		break;
1446 	case POWER_SUPPLY_PROP_SCOPE:
1447 		val->intval = POWER_SUPPLY_SCOPE_SYSTEM;
1448 		ret = 0;
1449 		break;
1450 	default:
1451 		ret = -ENODATA;
1452 	}
1453 
1454 	pm_runtime_mark_last_busy(bdi->dev);
1455 	pm_runtime_put_autosuspend(bdi->dev);
1456 
1457 	return ret;
1458 }
1459 
bq24190_battery_set_property(struct power_supply *psy, enum power_supply_property psp, const union power_supply_propval *val)1460 static int bq24190_battery_set_property(struct power_supply *psy,
1461 		enum power_supply_property psp,
1462 		const union power_supply_propval *val)
1463 {
1464 	struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
1465 	int ret;
1466 
1467 	dev_warn(bdi->dev, "warning: /sys/class/power_supply/bq24190-battery is deprecated\n");
1468 	dev_dbg(bdi->dev, "prop: %d\n", psp);
1469 
1470 	ret = pm_runtime_resume_and_get(bdi->dev);
1471 	if (ret < 0)
1472 		return ret;
1473 
1474 	switch (psp) {
1475 	case POWER_SUPPLY_PROP_ONLINE:
1476 		ret = bq24190_battery_set_online(bdi, val);
1477 		break;
1478 	case POWER_SUPPLY_PROP_TEMP_ALERT_MAX:
1479 		ret = bq24190_battery_set_temp_alert_max(bdi, val);
1480 		break;
1481 	default:
1482 		ret = -EINVAL;
1483 	}
1484 
1485 	pm_runtime_mark_last_busy(bdi->dev);
1486 	pm_runtime_put_autosuspend(bdi->dev);
1487 
1488 	return ret;
1489 }
1490 
bq24190_battery_property_is_writeable(struct power_supply *psy, enum power_supply_property psp)1491 static int bq24190_battery_property_is_writeable(struct power_supply *psy,
1492 		enum power_supply_property psp)
1493 {
1494 	int ret;
1495 
1496 	switch (psp) {
1497 	case POWER_SUPPLY_PROP_ONLINE:
1498 	case POWER_SUPPLY_PROP_TEMP_ALERT_MAX:
1499 		ret = 1;
1500 		break;
1501 	default:
1502 		ret = 0;
1503 	}
1504 
1505 	return ret;
1506 }
1507 
1508 static enum power_supply_property bq24190_battery_properties[] = {
1509 	POWER_SUPPLY_PROP_STATUS,
1510 	POWER_SUPPLY_PROP_HEALTH,
1511 	POWER_SUPPLY_PROP_ONLINE,
1512 	POWER_SUPPLY_PROP_TECHNOLOGY,
1513 	POWER_SUPPLY_PROP_TEMP_ALERT_MAX,
1514 	POWER_SUPPLY_PROP_SCOPE,
1515 };
1516 
1517 static const struct power_supply_desc bq24190_battery_desc = {
1518 	.name			= "bq24190-battery",
1519 	.type			= POWER_SUPPLY_TYPE_BATTERY,
1520 	.properties		= bq24190_battery_properties,
1521 	.num_properties		= ARRAY_SIZE(bq24190_battery_properties),
1522 	.get_property		= bq24190_battery_get_property,
1523 	.set_property		= bq24190_battery_set_property,
1524 	.property_is_writeable	= bq24190_battery_property_is_writeable,
1525 };
1526 
bq24190_configure_usb_otg(struct bq24190_dev_info *bdi, u8 ss_reg)1527 static int bq24190_configure_usb_otg(struct bq24190_dev_info *bdi, u8 ss_reg)
1528 {
1529 	bool otg_enabled;
1530 	int ret;
1531 
1532 	otg_enabled = !!(ss_reg & BQ24190_REG_SS_VBUS_STAT_MASK);
1533 	ret = extcon_set_state_sync(bdi->edev, EXTCON_USB, otg_enabled);
1534 	if (ret < 0)
1535 		dev_err(bdi->dev, "Can't set extcon state to %d: %d\n",
1536 			otg_enabled, ret);
1537 
1538 	return ret;
1539 }
1540 
bq24190_check_status(struct bq24190_dev_info *bdi)1541 static void bq24190_check_status(struct bq24190_dev_info *bdi)
1542 {
1543 	const u8 battery_mask_ss = BQ24190_REG_SS_CHRG_STAT_MASK;
1544 	const u8 battery_mask_f = BQ24190_REG_F_BAT_FAULT_MASK
1545 				| BQ24190_REG_F_NTC_FAULT_MASK;
1546 	bool alert_charger = false, alert_battery = false;
1547 	u8 ss_reg = 0, f_reg = 0;
1548 	int i, ret;
1549 
1550 	ret = bq24190_read(bdi, BQ24190_REG_SS, &ss_reg);
1551 	if (ret < 0) {
1552 		dev_err(bdi->dev, "Can't read SS reg: %d\n", ret);
1553 		return;
1554 	}
1555 
1556 	i = 0;
1557 	do {
1558 		ret = bq24190_read(bdi, BQ24190_REG_F, &f_reg);
1559 		if (ret < 0) {
1560 			dev_err(bdi->dev, "Can't read F reg: %d\n", ret);
1561 			return;
1562 		}
1563 	} while (f_reg && ++i < 2);
1564 
1565 	/* ignore over/under voltage fault after disconnect */
1566 	if (f_reg == (1 << BQ24190_REG_F_CHRG_FAULT_SHIFT) &&
1567 	    !(ss_reg & BQ24190_REG_SS_PG_STAT_MASK))
1568 		f_reg = 0;
1569 
1570 	if (f_reg != bdi->f_reg) {
1571 		dev_warn(bdi->dev,
1572 			"Fault: boost %d, charge %d, battery %d, ntc %d\n",
1573 			!!(f_reg & BQ24190_REG_F_BOOST_FAULT_MASK),
1574 			!!(f_reg & BQ24190_REG_F_CHRG_FAULT_MASK),
1575 			!!(f_reg & BQ24190_REG_F_BAT_FAULT_MASK),
1576 			!!(f_reg & BQ24190_REG_F_NTC_FAULT_MASK));
1577 
1578 		mutex_lock(&bdi->f_reg_lock);
1579 		if ((bdi->f_reg & battery_mask_f) != (f_reg & battery_mask_f))
1580 			alert_battery = true;
1581 		if ((bdi->f_reg & ~battery_mask_f) != (f_reg & ~battery_mask_f))
1582 			alert_charger = true;
1583 		bdi->f_reg = f_reg;
1584 		mutex_unlock(&bdi->f_reg_lock);
1585 	}
1586 
1587 	if (ss_reg != bdi->ss_reg) {
1588 		/*
1589 		 * The device is in host mode so when PG_STAT goes from 1->0
1590 		 * (i.e., power removed) HIZ needs to be disabled.
1591 		 */
1592 		if ((bdi->ss_reg & BQ24190_REG_SS_PG_STAT_MASK) &&
1593 				!(ss_reg & BQ24190_REG_SS_PG_STAT_MASK)) {
1594 			ret = bq24190_write_mask(bdi, BQ24190_REG_ISC,
1595 					BQ24190_REG_ISC_EN_HIZ_MASK,
1596 					BQ24190_REG_ISC_EN_HIZ_SHIFT,
1597 					0);
1598 			if (ret < 0)
1599 				dev_err(bdi->dev, "Can't access ISC reg: %d\n",
1600 					ret);
1601 		}
1602 
1603 		if ((bdi->ss_reg & battery_mask_ss) != (ss_reg & battery_mask_ss))
1604 			alert_battery = true;
1605 		if ((bdi->ss_reg & ~battery_mask_ss) != (ss_reg & ~battery_mask_ss))
1606 			alert_charger = true;
1607 		bdi->ss_reg = ss_reg;
1608 	}
1609 
1610 	if (alert_charger || alert_battery) {
1611 		power_supply_changed(bdi->charger);
1612 		bq24190_configure_usb_otg(bdi, ss_reg);
1613 	}
1614 	if (alert_battery && bdi->battery)
1615 		power_supply_changed(bdi->battery);
1616 
1617 	dev_dbg(bdi->dev, "ss_reg: 0x%02x, f_reg: 0x%02x\n", ss_reg, f_reg);
1618 }
1619 
bq24190_irq_handler_thread(int irq, void *data)1620 static irqreturn_t bq24190_irq_handler_thread(int irq, void *data)
1621 {
1622 	struct bq24190_dev_info *bdi = data;
1623 	int error;
1624 
1625 	bdi->irq_event = true;
1626 	error = pm_runtime_resume_and_get(bdi->dev);
1627 	if (error < 0) {
1628 		dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", error);
1629 		return IRQ_NONE;
1630 	}
1631 	bq24190_check_status(bdi);
1632 	pm_runtime_mark_last_busy(bdi->dev);
1633 	pm_runtime_put_autosuspend(bdi->dev);
1634 	bdi->irq_event = false;
1635 
1636 	return IRQ_HANDLED;
1637 }
1638 
bq24190_hw_init(struct bq24190_dev_info *bdi)1639 static int bq24190_hw_init(struct bq24190_dev_info *bdi)
1640 {
1641 	u8 v;
1642 	int ret;
1643 
1644 	/* First check that the device really is what its supposed to be */
1645 	ret = bq24190_read_mask(bdi, BQ24190_REG_VPRS,
1646 			BQ24190_REG_VPRS_PN_MASK,
1647 			BQ24190_REG_VPRS_PN_SHIFT,
1648 			&v);
1649 	if (ret < 0)
1650 		return ret;
1651 
1652 	switch (v) {
1653 	case BQ24190_REG_VPRS_PN_24190:
1654 	case BQ24190_REG_VPRS_PN_24192:
1655 	case BQ24190_REG_VPRS_PN_24192I:
1656 		break;
1657 	default:
1658 		dev_err(bdi->dev, "Error unknown model: 0x%02x\n", v);
1659 		return -ENODEV;
1660 	}
1661 
1662 	ret = bq24190_register_reset(bdi);
1663 	if (ret < 0)
1664 		return ret;
1665 
1666 	ret = bq24190_set_config(bdi);
1667 	if (ret < 0)
1668 		return ret;
1669 
1670 	return bq24190_read(bdi, BQ24190_REG_SS, &bdi->ss_reg);
1671 }
1672 
bq24190_get_config(struct bq24190_dev_info *bdi)1673 static int bq24190_get_config(struct bq24190_dev_info *bdi)
1674 {
1675 	const char * const s = "ti,system-minimum-microvolt";
1676 	struct power_supply_battery_info info = {};
1677 	int v;
1678 
1679 	if (device_property_read_u32(bdi->dev, s, &v) == 0) {
1680 		v /= 1000;
1681 		if (v >= BQ24190_REG_POC_SYS_MIN_MIN
1682 		 && v <= BQ24190_REG_POC_SYS_MIN_MAX)
1683 			bdi->sys_min = v;
1684 		else
1685 			dev_warn(bdi->dev, "invalid value for %s: %u\n", s, v);
1686 	}
1687 
1688 	if (bdi->dev->of_node &&
1689 	    !power_supply_get_battery_info(bdi->charger, &info)) {
1690 		v = info.precharge_current_ua / 1000;
1691 		if (v >= BQ24190_REG_PCTCC_IPRECHG_MIN
1692 		 && v <= BQ24190_REG_PCTCC_IPRECHG_MAX)
1693 			bdi->iprechg = v;
1694 		else
1695 			dev_warn(bdi->dev, "invalid value for battery:precharge-current-microamp: %d\n",
1696 				 v);
1697 
1698 		v = info.charge_term_current_ua / 1000;
1699 		if (v >= BQ24190_REG_PCTCC_ITERM_MIN
1700 		 && v <= BQ24190_REG_PCTCC_ITERM_MAX)
1701 			bdi->iterm = v;
1702 		else
1703 			dev_warn(bdi->dev, "invalid value for battery:charge-term-current-microamp: %d\n",
1704 				 v);
1705 	}
1706 
1707 	return 0;
1708 }
1709 
bq24190_probe(struct i2c_client *client, const struct i2c_device_id *id)1710 static int bq24190_probe(struct i2c_client *client,
1711 		const struct i2c_device_id *id)
1712 {
1713 	struct i2c_adapter *adapter = client->adapter;
1714 	struct device *dev = &client->dev;
1715 	struct power_supply_config charger_cfg = {}, battery_cfg = {};
1716 	struct bq24190_dev_info *bdi;
1717 	int ret;
1718 
1719 	if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) {
1720 		dev_err(dev, "No support for SMBUS_BYTE_DATA\n");
1721 		return -ENODEV;
1722 	}
1723 
1724 	bdi = devm_kzalloc(dev, sizeof(*bdi), GFP_KERNEL);
1725 	if (!bdi) {
1726 		dev_err(dev, "Can't alloc bdi struct\n");
1727 		return -ENOMEM;
1728 	}
1729 
1730 	bdi->client = client;
1731 	bdi->dev = dev;
1732 	strncpy(bdi->model_name, id->name, I2C_NAME_SIZE);
1733 	mutex_init(&bdi->f_reg_lock);
1734 	bdi->f_reg = 0;
1735 	bdi->ss_reg = BQ24190_REG_SS_VBUS_STAT_MASK; /* impossible state */
1736 	INIT_DELAYED_WORK(&bdi->input_current_limit_work,
1737 			  bq24190_input_current_limit_work);
1738 
1739 	i2c_set_clientdata(client, bdi);
1740 
1741 	if (client->irq <= 0) {
1742 		dev_err(dev, "Can't get irq info\n");
1743 		return -EINVAL;
1744 	}
1745 
1746 	bdi->edev = devm_extcon_dev_allocate(dev, bq24190_usb_extcon_cable);
1747 	if (IS_ERR(bdi->edev))
1748 		return PTR_ERR(bdi->edev);
1749 
1750 	ret = devm_extcon_dev_register(dev, bdi->edev);
1751 	if (ret < 0)
1752 		return ret;
1753 
1754 	pm_runtime_enable(dev);
1755 	pm_runtime_use_autosuspend(dev);
1756 	pm_runtime_set_autosuspend_delay(dev, 600);
1757 	ret = pm_runtime_get_sync(dev);
1758 	if (ret < 0) {
1759 		dev_err(dev, "pm_runtime_get failed: %i\n", ret);
1760 		goto out_pmrt;
1761 	}
1762 
1763 #ifdef CONFIG_SYSFS
1764 	bq24190_sysfs_init_attrs();
1765 	charger_cfg.attr_grp = bq24190_sysfs_groups;
1766 #endif
1767 
1768 	charger_cfg.drv_data = bdi;
1769 	charger_cfg.of_node = dev->of_node;
1770 	charger_cfg.supplied_to = bq24190_charger_supplied_to;
1771 	charger_cfg.num_supplicants = ARRAY_SIZE(bq24190_charger_supplied_to),
1772 	bdi->charger = power_supply_register(dev, &bq24190_charger_desc,
1773 						&charger_cfg);
1774 	if (IS_ERR(bdi->charger)) {
1775 		dev_err(dev, "Can't register charger\n");
1776 		ret = PTR_ERR(bdi->charger);
1777 		goto out_pmrt;
1778 	}
1779 
1780 	/* the battery class is deprecated and will be removed. */
1781 	/* in the interim, this property hides it.              */
1782 	if (!device_property_read_bool(dev, "omit-battery-class")) {
1783 		battery_cfg.drv_data = bdi;
1784 		bdi->battery = power_supply_register(dev, &bq24190_battery_desc,
1785 						     &battery_cfg);
1786 		if (IS_ERR(bdi->battery)) {
1787 			dev_err(dev, "Can't register battery\n");
1788 			ret = PTR_ERR(bdi->battery);
1789 			goto out_charger;
1790 		}
1791 	}
1792 
1793 	ret = bq24190_get_config(bdi);
1794 	if (ret < 0) {
1795 		dev_err(dev, "Can't get devicetree config\n");
1796 		goto out_charger;
1797 	}
1798 
1799 	ret = bq24190_hw_init(bdi);
1800 	if (ret < 0) {
1801 		dev_err(dev, "Hardware init failed\n");
1802 		goto out_charger;
1803 	}
1804 
1805 	ret = bq24190_configure_usb_otg(bdi, bdi->ss_reg);
1806 	if (ret < 0)
1807 		goto out_charger;
1808 
1809 	bdi->initialized = true;
1810 
1811 	ret = devm_request_threaded_irq(dev, client->irq, NULL,
1812 			bq24190_irq_handler_thread,
1813 			IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
1814 			"bq24190-charger", bdi);
1815 	if (ret < 0) {
1816 		dev_err(dev, "Can't set up irq handler\n");
1817 		goto out_charger;
1818 	}
1819 
1820 	ret = bq24190_register_vbus_regulator(bdi);
1821 	if (ret < 0)
1822 		goto out_charger;
1823 
1824 	enable_irq_wake(client->irq);
1825 
1826 	pm_runtime_mark_last_busy(dev);
1827 	pm_runtime_put_autosuspend(dev);
1828 
1829 	return 0;
1830 
1831 out_charger:
1832 	if (!IS_ERR_OR_NULL(bdi->battery))
1833 		power_supply_unregister(bdi->battery);
1834 	power_supply_unregister(bdi->charger);
1835 
1836 out_pmrt:
1837 	pm_runtime_put_sync(dev);
1838 	pm_runtime_dont_use_autosuspend(dev);
1839 	pm_runtime_disable(dev);
1840 	return ret;
1841 }
1842 
bq24190_remove(struct i2c_client *client)1843 static int bq24190_remove(struct i2c_client *client)
1844 {
1845 	struct bq24190_dev_info *bdi = i2c_get_clientdata(client);
1846 	int error;
1847 
1848 	cancel_delayed_work_sync(&bdi->input_current_limit_work);
1849 	error = pm_runtime_resume_and_get(bdi->dev);
1850 	if (error < 0)
1851 		dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", error);
1852 
1853 	bq24190_register_reset(bdi);
1854 	if (bdi->battery)
1855 		power_supply_unregister(bdi->battery);
1856 	power_supply_unregister(bdi->charger);
1857 	if (error >= 0)
1858 		pm_runtime_put_sync(bdi->dev);
1859 	pm_runtime_dont_use_autosuspend(bdi->dev);
1860 	pm_runtime_disable(bdi->dev);
1861 
1862 	return 0;
1863 }
1864 
bq24190_runtime_suspend(struct device *dev)1865 static __maybe_unused int bq24190_runtime_suspend(struct device *dev)
1866 {
1867 	struct i2c_client *client = to_i2c_client(dev);
1868 	struct bq24190_dev_info *bdi = i2c_get_clientdata(client);
1869 
1870 	if (!bdi->initialized)
1871 		return 0;
1872 
1873 	dev_dbg(bdi->dev, "%s\n", __func__);
1874 
1875 	return 0;
1876 }
1877 
bq24190_runtime_resume(struct device *dev)1878 static __maybe_unused int bq24190_runtime_resume(struct device *dev)
1879 {
1880 	struct i2c_client *client = to_i2c_client(dev);
1881 	struct bq24190_dev_info *bdi = i2c_get_clientdata(client);
1882 
1883 	if (!bdi->initialized)
1884 		return 0;
1885 
1886 	if (!bdi->irq_event) {
1887 		dev_dbg(bdi->dev, "checking events on possible wakeirq\n");
1888 		bq24190_check_status(bdi);
1889 	}
1890 
1891 	return 0;
1892 }
1893 
bq24190_pm_suspend(struct device *dev)1894 static __maybe_unused int bq24190_pm_suspend(struct device *dev)
1895 {
1896 	struct i2c_client *client = to_i2c_client(dev);
1897 	struct bq24190_dev_info *bdi = i2c_get_clientdata(client);
1898 	int error;
1899 
1900 	error = pm_runtime_resume_and_get(bdi->dev);
1901 	if (error < 0)
1902 		dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", error);
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 
bq24190_pm_resume(struct device *dev)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_resume_and_get(bdi->dev);
1924 	if (error < 0)
1925 		dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", error);
1926 
1927 	bq24190_register_reset(bdi);
1928 	bq24190_set_config(bdi);
1929 	bq24190_read(bdi, BQ24190_REG_SS, &bdi->ss_reg);
1930 
1931 	if (error >= 0) {
1932 		pm_runtime_mark_last_busy(bdi->dev);
1933 		pm_runtime_put_autosuspend(bdi->dev);
1934 	}
1935 
1936 	/* Things may have changed while suspended so alert upper layer */
1937 	power_supply_changed(bdi->charger);
1938 	if (bdi->battery)
1939 		power_supply_changed(bdi->battery);
1940 
1941 	return 0;
1942 }
1943 
1944 static const struct dev_pm_ops bq24190_pm_ops = {
1945 	SET_RUNTIME_PM_OPS(bq24190_runtime_suspend, bq24190_runtime_resume,
1946 			   NULL)
1947 	SET_SYSTEM_SLEEP_PM_OPS(bq24190_pm_suspend, bq24190_pm_resume)
1948 };
1949 
1950 static const struct i2c_device_id bq24190_i2c_ids[] = {
1951 	{ "bq24190" },
1952 	{ "bq24192" },
1953 	{ "bq24192i" },
1954 	{ "bq24196" },
1955 	{ },
1956 };
1957 MODULE_DEVICE_TABLE(i2c, bq24190_i2c_ids);
1958 
1959 #ifdef CONFIG_OF
1960 static const struct of_device_id bq24190_of_match[] = {
1961 	{ .compatible = "ti,bq24190", },
1962 	{ .compatible = "ti,bq24192", },
1963 	{ .compatible = "ti,bq24192i", },
1964 	{ .compatible = "ti,bq24196", },
1965 	{ },
1966 };
1967 MODULE_DEVICE_TABLE(of, bq24190_of_match);
1968 #else
1969 static const struct of_device_id bq24190_of_match[] = {
1970 	{ },
1971 };
1972 #endif
1973 
1974 static struct i2c_driver bq24190_driver = {
1975 	.probe		= bq24190_probe,
1976 	.remove		= bq24190_remove,
1977 	.id_table	= bq24190_i2c_ids,
1978 	.driver = {
1979 		.name		= "bq24190-charger",
1980 		.pm		= &bq24190_pm_ops,
1981 		.of_match_table	= of_match_ptr(bq24190_of_match),
1982 	},
1983 };
1984 module_i2c_driver(bq24190_driver);
1985 
1986 MODULE_LICENSE("GPL");
1987 MODULE_AUTHOR("Mark A. Greer <mgreer@animalcreek.com>");
1988 MODULE_DESCRIPTION("TI BQ24190 Charger Driver");
1989