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