xref: /OK3568_Linux_fs/kernel/drivers/power/supply/sc8551_charger.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Chrager driver for Sc8551
4  *
5  * Copyright (c) 2022 Rockchip Electronics Co., Ltd.
6  *
7  * Author: Xu Shengfei <xsf@rock-chips.com>
8  */
9 #include <linux/gpio.h>
10 #include <linux/i2c.h>
11 #include <linux/init.h>
12 #include <linux/interrupt.h>
13 #include <linux/module.h>
14 #include <linux/power_supply.h>
15 #include <linux/slab.h>
16 #include <linux/kernel.h>
17 #include <linux/sched.h>
18 #include <linux/kthread.h>
19 #include <linux/delay.h>
20 #include <linux/of.h>
21 #include <linux/of_device.h>
22 #include <linux/of_gpio.h>
23 #include <linux/err.h>
24 #include <linux/debugfs.h>
25 #include <linux/bitops.h>
26 
27 static int dbg_enable;
28 
29 module_param_named(dbg_level, dbg_enable, int, 0644);
30 
31 #define SC_DBG(args...) \
32 	do { \
33 		if (dbg_enable) { \
34 			pr_info(args); \
35 		} \
36 	} while (0)
37 
38 /* Register 00h */
39 #define SC8551_REG_00				0x00
40 #define SC8551_BAT_OVP_DIS_MASK			0x80
41 #define SC8551_BAT_OVP_DIS_SHIFT		7
42 #define SC8551_BAT_OVP_ENABLE			0
43 #define SC8551_BAT_OVP_DISABLE			1
44 
45 #define SC8551_BAT_OVP_MASK			0x3F
46 #define SC8551_BAT_OVP_SHIFT			0
47 #define SC8551_BAT_OVP_BASE			3500
48 #define SC8551_BAT_OVP_LSB			25
49 
50 /* Register 02h */
51 #define SC8551_REG_02				0x02
52 #define SC8551_BAT_OCP_DIS_MASK			0x80
53 #define SC8551_BAT_OCP_DIS_SHIFT		7
54 #define SC8551_BAT_OCP_ENABLE			0
55 #define SC8551_BAT_OCP_DISABLE			1
56 
57 #define SC8551_BAT_OCP_MASK			0x7F
58 #define SC8551_BAT_OCP_SHIFT			0
59 #define SC8551_BAT_OCP_BASE			2000
60 #define SC8551_BAT_OCP_LSB			100
61 
62 /* Register 05h */
63 #define SC8551_REG_05				0x05
64 #define SC8551_AC_OVP_STAT_MASK			0x80
65 #define SC8551_AC_OVP_STAT_SHIFT		7
66 
67 #define SC8551_AC_OVP_FLAG_MASK			0x40
68 #define SC8551_AC_OVP_FLAG_SHIFT		6
69 
70 #define SC8551_AC_OVP_MASK_MASK			0x20
71 #define SC8551_AC_OVP_MASK_SHIFT		5
72 
73 #define SC8551_VDROP_THRESHOLD_SET_MASK		0x10
74 #define SC8551_VDROP_THRESHOLD_SET_SHIFT	4
75 #define SC8551_VDROP_THRESHOLD_300MV		0
76 #define SC8551_VDROP_THRESHOLD_400MV		1
77 
78 #define SC8551_VDROP_DEGLITCH_SET_MASK		0x08
79 #define SC8551_VDROP_DEGLITCH_SET_SHIFT		3
80 #define SC8551_VDROP_DEGLITCH_8US		0
81 #define SC8551_VDROP_DEGLITCH_5MS		1
82 
83 #define SC8551_AC_OVP_MASK			0x07
84 #define SC8551_AC_OVP_SHIFT			0
85 #define SC8551_AC_OVP_BASE			11
86 #define SC8551_AC_OVP_LSB			1
87 #define SC8551_AC_OVP_6P5V			65
88 
89 /* Register 06h */
90 #define SC8551_REG_06				0x06
91 #define SC8551_VBUS_PD_EN_MASK			0x80
92 #define SC8551_VBUS_PD_EN_SHIFT			7
93 #define SC8551_VBUS_PD_ENABLE			1
94 #define SC8551_VBUS_PD_DISABLE			0
95 
96 #define SC8551_BUS_OVP_MASK			0x7F
97 #define SC8551_BUS_OVP_SHIFT			0
98 #define SC8551_BUS_OVP_BASE			6000
99 #define SC8551_BUS_OVP_LSB			50
100 
101 /* Register 08h */
102 #define SC8551_REG_08				0x08
103 #define SC8551_BUS_OCP_DIS_MASK			0x80
104 #define SC8551_BUS_OCP_DIS_SHIFT		7
105 #define SC8551_BUS_OCP_ENABLE			0
106 #define SC8551_BUS_OCP_DISABLE			1
107 
108 #define SC8551_IBUS_UCP_RISE_FLAG_MASK		0x40
109 #define SC8551_IBUS_UCP_RISE_FLAG_SHIFT		6
110 
111 #define SC8551_IBUS_UCP_RISE_MASK_MASK		0x20
112 #define SC8551_IBUS_UCP_RISE_MASK_SHIFT		5
113 #define SC8551_IBUS_UCP_RISE_MASK_ENABLE	1
114 #define SC8551_IBUS_UCP_RISE_MASK_DISABLE	0
115 
116 #define SC8551_IBUS_UCP_FALL_FLAG_MASK		0x10
117 #define SC8551_IBUS_UCP_FALL_FLAG_SHIFT		4
118 
119 #define SC8551_BUS_OCP_MASK			0x0F
120 #define SC8551_BUS_OCP_SHIFT			0
121 #define SC8551_BUS_OCP_BASE			1000
122 #define SC8551_BUS_OCP_LSB			250
123 
124 /* Register 0Ah */
125 #define SC8551_REG_0A				0x0A
126 #define SC8551_TSHUT_FLAG_MASK			0x80
127 #define SC8551_TSHUT_FLAG_SHIFT			7
128 
129 #define SC8551_TSHUT_STAT_MASK			0x40
130 #define SC8551_TSHUT_STAT_SHIFT			6
131 
132 #define SC8551_VBUS_ERRORLO_STAT_MASK		0x20
133 #define SC8551_VBUS_ERRORLO_STAT_SHIFT		5
134 
135 #define SC8551_VBUS_ERRORHI_STAT_MASK		0x10
136 #define SC8551_VBUS_ERRORHI_STAT_SHIFT		4
137 
138 #define SC8551_SS_TIMEOUT_FLAG_MASK		0x08
139 #define SC8551_SS_TIMEOUT_FLAG_SHIFT		3
140 
141 #define SC8551_CONV_SWITCHING_STAT_MASK		0x04
142 #define SC8551_CONV_SWITCHING_STAT_SHIFT	2
143 
144 #define SC8551_CONV_OCP_FLAG_MASK		0x02
145 #define SC8551_CONV_OCP_FLAG_SHIFT		1
146 
147 #define SC8551_PIN_DIAG_FALL_FLAG_MASK		0x01
148 #define SC8551_PIN_DIAG_FALL_FLAG_SHIFT		0
149 
150 /* Register 0Bh */
151 #define SC8551_REG_0B				0x0B
152 #define SC8551_REG_RST_MASK			0x80
153 #define SC8551_REG_RST_SHIFT			7
154 #define SC8551_REG_RST_ENABLE			1
155 #define SC8551_REG_RST_DISABLE			0
156 
157 #define SC8551_FSW_SET_MASK			0x70
158 #define SC8551_FSW_SET_SHIFT			4
159 #define SC8551_FSW_SET_300KHZ			0
160 #define SC8551_FSW_SET_350KHZ			1
161 #define SC8551_FSW_SET_400KHZ			2
162 #define SC8551_FSW_SET_450KHZ			3
163 #define SC8551_FSW_SET_500KHZ			4
164 #define SC8551_FSW_SET_550KHZ			5
165 #define SC8551_FSW_SET_600KHZ			6
166 #define SC8551_FSW_SET_750KHZ			7
167 
168 #define SC8551_WD_TIMEOUT_FLAG_MASK		0x08
169 #define SC8551_WD_TIMEOUT_SHIFT			3
170 
171 #define SC8551_WATCHDOG_DIS_MASK		0x04
172 #define SC8551_WATCHDOG_DIS_SHIFT		2
173 #define SC8551_WATCHDOG_ENABLE			0
174 #define SC8551_WATCHDOG_DISABLE			1
175 
176 #define SC8551_WATCHDOG_MASK			0x03
177 #define SC8551_WATCHDOG_SHIFT			0
178 #define SC8551_WATCHDOG_0P5S			0
179 #define SC8551_WATCHDOG_1S			1
180 #define SC8551_WATCHDOG_5S			2
181 #define SC8551_WATCHDOG_30S			3
182 
183 /* Register 0Ch */
184 #define SC8551_REG_0C				0x0C
185 #define SC8551_CHG_EN_MASK			0x80
186 #define SC8551_CHG_EN_SHIFT			7
187 #define SC8551_CHG_ENABLE			1
188 #define SC8551_CHG_DISABLE			0
189 
190 #define SC8551_MS_MASK				0x60
191 #define SC8551_MS_SHIFT				5
192 #define SC8551_MS_STANDALONE			0
193 #define SC8551_MS_SLAVE				1
194 #define SC8551_MS_MASTER			2
195 #define SC8551_ROLE_STDALONE			0
196 #define SC8551_ROLE_SLAVE			1
197 #define SC8551_ROLE_MASTER			2
198 
199 #define SC8551_FREQ_SHIFT_MASK			0x18
200 #define SC8551_FREQ_SHIFT_SHIFT			3
201 #define SC8551_FREQ_SHIFT_NORMINAL		0
202 #define SC8551_FREQ_SHIFT_POSITIVE10		1
203 #define SC8551_FREQ_SHIFT_NEGATIVE10		2
204 #define SC8551_FREQ_SHIFT_SPREAD_SPECTRUM	3
205 
206 #define SC8551_TSBUS_DIS_MASK			0x04
207 #define SC8551_TSBUS_DIS_SHIFT			2
208 #define SC8551_TSBUS_ENABLE			0
209 #define SC8551_TSBUS_DISABLE			1
210 
211 #define SC8551_TSBAT_DIS_MASK			0x02
212 #define SC8551_TSBAT_DIS_SHIFT			1
213 #define SC8551_TSBAT_ENABLE			0
214 #define SC8551_TSBAT_DISABLE			1
215 
216 /* Register 0Dh */
217 #define SC8551_REG_0D				0x0D
218 #define SC8551_BAT_OVP_ALM_STAT_MASK		0x80
219 #define SC8551_BAT_OVP_ALM_STAT_SHIFT		7
220 
221 #define SC8551_BAT_OCP_ALM_STAT_MASK		0x40
222 #define SC8551_BAT_OCP_ALM_STAT_SHIFT		6
223 
224 #define SC8551_BUS_OVP_ALM_STAT_MASK		0x20
225 #define SC8551_BUS_OVP_ALM_STAT_SHIFT		5
226 
227 #define SC8551_BUS_OCP_ALM_STAT_MASK		0x10
228 #define SC8551_BUS_OCP_ALM_STAT_SHIFT		4
229 
230 #define SC8551_BAT_UCP_ALM_STAT_MASK		0x08
231 #define SC8551_BAT_UCP_ALM_STAT_SHIFT		3
232 
233 #define SC8551_ADAPTER_INSERT_STAT_MASK		0x04
234 #define SC8551_ADAPTER_INSERT_STAT_SHIFT	2
235 
236 #define SC8551_VBAT_INSERT_STAT_MASK		0x02
237 #define SC8551_VBAT_INSERT_STAT_SHIFT		1
238 
239 #define SC8551_ADC_DONE_STAT_MASK		0x01
240 #define SC8551_ADC_DONE_STAT_SHIFT		0
241 #define SC8551_ADC_DONE_STAT_COMPLETE		1
242 #define SC8551_ADC_DONE_STAT_NOTCOMPLETE	0
243 
244 /* Register 0Eh */
245 #define SC8551_REG_0E				0x0E
246 #define SC8551_BAT_OVP_ALM_FLAG_MASK		0x80
247 #define SC8551_BAT_OVP_ALM_FLAG_SHIFT		7
248 
249 #define SC8551_BAT_OCP_ALM_FLAG_MASK		0x40
250 #define SC8551_BAT_OCP_ALM_FLAG_SHIFT		6
251 
252 #define SC8551_BUS_OVP_ALM_FLAG_MASK		0x20
253 #define SC8551_BUS_OVP_ALM_FLAG_SHIFT		5
254 
255 #define SC8551_BUS_OCP_ALM_FLAG_MASK		0x10
256 #define SC8551_BUS_OCP_ALM_FLAG_SHIFT		4
257 
258 #define SC8551_BAT_UCP_ALM_FLAG_MASK		0x08
259 #define SC8551_BAT_UCP_ALM_FLAG_SHIFT		3
260 
261 #define SC8551_ADAPTER_INSERT_FLAG_MASK		0x04
262 #define SC8551_ADAPTER_INSERT_FLAG_SHIFT	2
263 
264 #define SC8551_VBAT_INSERT_FLAG_MASK		0x02
265 #define SC8551_VBAT_INSERT_FLAG_SHIFT		1
266 
267 #define SC8551_ADC_DONE_FLAG_MASK		0x01
268 #define SC8551_ADC_DONE_FLAG_SHIFT		0
269 #define SC8551_ADC_DONE_FLAG_COMPLETE		1
270 #define SC8551_ADC_DONE_FLAG_NOTCOMPLETE	0
271 
272 /* Register 0Fh */
273 #define SC8551_REG_0F				0x0F
274 #define SC8551_BAT_OVP_ALM_MASK_MASK		0x80
275 #define SC8551_BAT_OVP_ALM_MASK_SHIFT		7
276 #define SC8551_BAT_OVP_ALM_MASK_ENABLE		1
277 #define SC8551_BAT_OVP_ALM_MASK_DISABLE		0
278 
279 #define SC8551_BAT_OCP_ALM_MASK_MASK		0x40
280 #define SC8551_BAT_OCP_ALM_MASK_SHIFT		6
281 #define SC8551_BAT_OCP_ALM_MASK_ENABLE		1
282 #define SC8551_BAT_OCP_ALM_MASK_DISABLE		0
283 
284 #define SC8551_BUS_OVP_ALM_MASK_MASK		0x20
285 #define SC8551_BUS_OVP_ALM_MASK_SHIFT		5
286 #define SC8551_BUS_OVP_ALM_MASK_ENABLE		1
287 #define SC8551_BUS_OVP_ALM_MASK_DISABLE		0
288 
289 #define SC8551_BUS_OCP_ALM_MASK_MASK		0x10
290 #define SC8551_BUS_OCP_ALM_MASK_SHIFT		4
291 #define SC8551_BUS_OCP_ALM_MASK_ENABLE		1
292 #define SC8551_BUS_OCP_ALM_MASK_DISABLE		0
293 
294 #define SC8551_BAT_UCP_ALM_MASK_MASK		0x08
295 #define SC8551_BAT_UCP_ALM_MASK_SHIFT		3
296 #define SC8551_BAT_UCP_ALM_MASK_ENABLE		1
297 #define SC8551_BAT_UCP_ALM_MASK_DISABLE		0
298 
299 #define SC8551_ADAPTER_INSERT_MASK_MASK		0x04
300 #define SC8551_ADAPTER_INSERT_MASK_SHIFT	2
301 #define SC8551_ADAPTER_INSERT_MASK_ENABLE	1
302 #define SC8551_ADAPTER_INSERT_MASK_DISABLE	0
303 
304 #define SC8551_VBAT_INSERT_MASK_MASK		0x02
305 #define SC8551_VBAT_INSERT_MASK_SHIFT		1
306 #define SC8551_VBAT_INSERT_MASK_ENABLE		1
307 #define SC8551_VBAT_INSERT_MASK_DISABLE		0
308 
309 #define SC8551_ADC_DONE_MASK_MASK		0x01
310 #define SC8551_ADC_DONE_MASK_SHIFT		0
311 #define SC8551_ADC_DONE_MASK_ENABLE		1
312 #define SC8551_ADC_DONE_MASK_DISABLE		0
313 
314 /* Register 10h */
315 #define SC8551_REG_10				0x10
316 #define SC8551_BAT_OVP_FLT_STAT_MASK		0x80
317 #define SC8551_BAT_OVP_FLT_STAT_SHIFT		7
318 
319 #define SC8551_BAT_OCP_FLT_STAT_MASK		0x40
320 #define SC8551_BAT_OCP_FLT_STAT_SHIFT		6
321 
322 #define SC8551_BUS_OVP_FLT_STAT_MASK		0x20
323 #define SC8551_BUS_OVP_FLT_STAT_SHIFT		5
324 
325 #define SC8551_BUS_OCP_FLT_STAT_MASK		0x10
326 #define SC8551_BUS_OCP_FLT_STAT_SHIFT		4
327 
328 #define SC8551_TSBUS_TSBAT_ALM_STAT_MASK	0x08
329 #define SC8551_TSBUS_TSBAT_ALM_STAT_SHIFT	3
330 
331 #define SC8551_TSBAT_FLT_STAT_MASK		0x04
332 #define SC8551_TSBAT_FLT_STAT_SHIFT		2
333 
334 #define SC8551_TSBUS_FLT_STAT_MASK		0x02
335 #define SC8551_TSBUS_FLT_STAT_SHIFT		1
336 
337 #define SC8551_TDIE_ALM_STAT_MASK		0x01
338 #define SC8551_TDIE_ALM_STAT_SHIFT		0
339 
340 /* Register 11h */
341 #define SC8551_REG_11				0x11
342 #define SC8551_BAT_OVP_FLT_FLAG_MASK		0x80
343 #define SC8551_BAT_OVP_FLT_FLAG_SHIFT		7
344 
345 #define SC8551_BAT_OCP_FLT_FLAG_MASK		0x40
346 #define SC8551_BAT_OCP_FLT_FLAG_SHIFT		6
347 
348 #define SC8551_BUS_OVP_FLT_FLAG_MASK		0x20
349 #define SC8551_BUS_OVP_FLT_FLAG_SHIFT		5
350 
351 #define SC8551_BUS_OCP_FLT_FLAG_MASK		0x10
352 #define SC8551_BUS_OCP_FLT_FLAG_SHIFT		4
353 
354 #define SC8551_TSBUS_TSBAT_ALM_FLAG_MASK	0x08
355 #define SC8551_TSBUS_TSBAT_ALM_FLAG_SHIFT	3
356 
357 #define SC8551_TSBAT_FLT_FLAG_MASK		0x04
358 #define SC8551_TSBAT_FLT_FLAG_SHIFT		2
359 
360 #define SC8551_TSBUS_FLT_FLAG_MASK		0x02
361 #define SC8551_TSBUS_FLT_FLAG_SHIFT		1
362 
363 #define SC8551_TDIE_ALM_FLAG_MASK		0x01
364 #define SC8551_TDIE_ALM_FLAG_SHIFT		0
365 
366 /* Register 12h */
367 #define SC8551_REG_12				0x12
368 #define SC8551_BAT_OVP_FLT_MASK_MASK		0x80
369 #define SC8551_BAT_OVP_FLT_MASK_SHIFT		7
370 #define SC8551_BAT_OVP_FLT_MASK_ENABLE		1
371 #define SC8551_BAT_OVP_FLT_MASK_DISABLE		0
372 
373 #define SC8551_BAT_OCP_FLT_MASK_MASK		0x40
374 #define SC8551_BAT_OCP_FLT_MASK_SHIFT		6
375 #define SC8551_BAT_OCP_FLT_MASK_ENABLE		1
376 #define SC8551_BAT_OCP_FLT_MASK_DISABLE		0
377 
378 #define SC8551_BUS_OVP_FLT_MASK_MASK		0x20
379 #define SC8551_BUS_OVP_FLT_MASK_SHIFT		5
380 #define SC8551_BUS_OVP_FLT_MASK_ENABLE		1
381 #define SC8551_BUS_OVP_FLT_MASK_DISABLE		0
382 
383 #define SC8551_BUS_OCP_FLT_MASK_MASK		0x10
384 #define SC8551_BUS_OCP_FLT_MASK_SHIFT		4
385 #define SC8551_BUS_OCP_FLT_MASK_ENABLE		1
386 #define SC8551_BUS_OCP_FLT_MASK_DISABLE		0
387 
388 #define SC8551_TSBUS_TSBAT_ALM_MASK_MASK	0x08
389 #define SC8551_TSBUS_TSBAT_ALM_MASK_SHIFT	3
390 #define SC8551_TSBUS_TSBAT_ALM_MASK_ENABLE	1
391 #define SC8551_TSBUS_TSBAT_ALM_MASK_DISABLE	0
392 
393 #define SC8551_TSBAT_FLT_MASK_MASK		0x04
394 #define SC8551_TSBAT_FLT_MASK_SHIFT		2
395 #define SC8551_TSBAT_FLT_MASK_ENABLE		1
396 #define SC8551_TSBAT_FLT_MASK_DISABLE		0
397 
398 #define SC8551_TSBUS_FLT_MASK_MASK		0x02
399 #define SC8551_TSBUS_FLT_MASK_SHIFT		1
400 #define SC8551_TSBUS_FLT_MASK_ENABLE		1
401 #define SC8551_TSBUS_FLT_MASK_DISABLE		0
402 
403 #define SC8551_TDIE_ALM_MASK_MASK		0x01
404 #define SC8551_TDIE_ALM_MASK_SHIFT		0
405 #define SC8551_TDIE_ALM_MASK_ENABLE		1
406 #define SC8551_TDIE_ALM_MASK_DISABLE		0
407 
408 /* Register 13h */
409 #define SC8551_REG_13				0x13
410 #define SC8551_DEV_ID_MASK			0xFF
411 #define SC8551_DEV_ID_SHIFT			0
412 
413 /* Register 14h */
414 #define SC8551_REG_14				0x14
415 #define SC8551_ADC_EN_MASK			0x80
416 #define SC8551_ADC_EN_SHIFT			7
417 #define SC8551_ADC_ENABLE			1
418 #define SC8551_ADC_DISABLE			0
419 
420 #define SC8551_ADC_RATE_MASK			0x40
421 #define SC8551_ADC_RATE_SHIFT			6
422 #define SC8551_ADC_RATE_CONTINOUS		0
423 #define SC8551_ADC_RATE_ONESHOT			1
424 
425 #define SC8551_IBUS_ADC_DIS_MASK		0x01
426 #define SC8551_IBUS_ADC_DIS_SHIFT		0
427 #define SC8551_IBUS_ADC_ENABLE			0
428 #define SC8551_IBUS_ADC_DISABLE			1
429 
430 /* Register 15h */
431 #define SC8551_REG_15				0x15
432 #define SC8551_VBUS_ADC_DIS_MASK		0x80
433 #define SC8551_VBUS_ADC_DIS_SHIFT		7
434 #define SC8551_VBUS_ADC_ENABLE			0
435 #define SC8551_VBUS_ADC_DISABLE			1
436 
437 #define SC8551_VAC_ADC_DIS_MASK			0x40
438 #define SC8551_VAC_ADC_DIS_SHIFT		6
439 #define SC8551_VAC_ADC_ENABLE			0
440 #define SC8551_VAC_ADC_DISABLE			1
441 
442 #define SC8551_VOUT_ADC_DIS_MASK		0x20
443 #define SC8551_VOUT_ADC_DIS_SHIFT		5
444 #define SC8551_VOUT_ADC_ENABLE			0
445 #define SC8551_VOUT_ADC_DISABLE			1
446 
447 #define SC8551_VBAT_ADC_DIS_MASK		0x10
448 #define SC8551_VBAT_ADC_DIS_SHIFT		4
449 #define SC8551_VBAT_ADC_ENABLE			0
450 #define SC8551_VBAT_ADC_DISABLE			1
451 
452 #define SC8551_IBAT_ADC_DIS_MASK		0x08
453 #define SC8551_IBAT_ADC_DIS_SHIFT		3
454 #define SC8551_IBAT_ADC_ENABLE			0
455 #define SC8551_IBAT_ADC_DISABLE			1
456 
457 #define SC8551_TSBUS_ADC_DIS_MASK		0x04
458 #define SC8551_TSBUS_ADC_DIS_SHIFT		2
459 #define SC8551_TSBUS_ADC_ENABLE			0
460 #define SC8551_TSBUS_ADC_DISABLE		1
461 
462 #define SC8551_TSBAT_ADC_DIS_MASK		0x02
463 #define SC8551_TSBAT_ADC_DIS_SHIFT		1
464 #define SC8551_TSBAT_ADC_ENABLE			0
465 #define SC8551_TSBAT_ADC_DISABLE		1
466 
467 #define SC8551_TDIE_ADC_DIS_MASK		0x01
468 #define SC8551_TDIE_ADC_DIS_SHIFT		0
469 #define SC8551_TDIE_ADC_ENABLE			0
470 #define SC8551_TDIE_ADC_DISABLE			1
471 
472 /* Register 16h */
473 #define SC8551_REG_16				0x16
474 #define SC8551_IBUS_POL_H_MASK			0x0F
475 
476 /* Register 17h */
477 #define SC8551_REG_17				0x17
478 #define SC8551_IBUS_POL_L_MASK			0xFF
479 
480 /* Register 18h */
481 #define SC8551_REG_18				0x18
482 #define SC8551_VBUS_POL_H_MASK			0x0F
483 
484 /* Register 19h */
485 #define SC8551_REG_19				0x19
486 #define SC8551_VBUS_POL_L_MASK			0xFF
487 
488 /* Register 1Ah */
489 #define SC8551_REG_1A				0x1A
490 #define SC8551_VAC_POL_H_MASK			0x0F
491 
492 /* Register 1Bh */
493 #define SC8551_REG_1B				0x1B
494 #define SC8551_VAC_POL_L_MASK			0xFF
495 
496 /* Register 1Ch */
497 #define SC8551_REG_1C				0x1C
498 #define SC8551_VOUT_POL_H_MASK			0x0F
499 
500 /* Register 1Dh */
501 #define SC8551_REG_1D				0x1D
502 #define SC8551_VOUT_POL_L_MASK			0x0F
503 
504 /* Register 1Eh */
505 #define SC8551_REG_1E				0x1E
506 #define SC8551_VBAT_POL_H_MASK			0x0F
507 
508 /* Register 1Fh */
509 #define SC8551_REG_1F				0x1F
510 #define SC8551_VBAT_POL_L_MASK			0xFF
511 
512 /* Register 20h */
513 #define SC8551_REG_20				0x20
514 #define SC8551_IBAT_POL_H_MASK			0x0F
515 
516 /* Register 21h */
517 #define SC8551_REG_21				0x21
518 #define SC8551_IBAT_POL_L_MASK			0xFF
519 
520 /* Register 26h */
521 #define SC8551_REG_26				0x26
522 #define SC8551_TDIE_POL_H_MASK			0x01
523 
524 /* Register 2Bh */
525 #define SC8551_REG_2B				0x2B
526 #define SC8551_SS_TIMEOUT_SET_MASK		0xE0
527 #define SC8551_SS_TIMEOUT_SET_SHIFT		5
528 #define SC8551_SS_TIMEOUT_DISABLE		0
529 #define SC8551_SS_TIMEOUT_12P5MS		1
530 #define SC8551_SS_TIMEOUT_25MS			2
531 #define SC8551_SS_TIMEOUT_50MS			3
532 #define SC8551_SS_TIMEOUT_100MS			4
533 #define SC8551_SS_TIMEOUT_400MS			5
534 #define SC8551_SS_TIMEOUT_1500MS		6
535 #define SC8551_SS_TIMEOUT_100000MS		7
536 
537 #define SC8551_EN_REGULATION_MASK		0x10
538 #define SC8551_EN_REGULATION_SHIFT		4
539 #define SC8551_EN_REGULATION_ENABLE		1
540 #define SC8551_EN_REGULATION_DISABLE		0
541 
542 #define SC8551_VOUT_OVP_DIS_MASK		0x08
543 #define SC8551_VOUT_OVP_DIS_SHIFT		3
544 #define SC8551_VOUT_OVP_ENABLE			1
545 #define SC8551_VOUT_OVP_DISABLE			0
546 
547 #define SC8551_IBUS_UCP_RISE_TH_MASK		0x04
548 #define SC8551_IBUS_UCP_RISE_TH_SHIFT		2
549 #define SC8551_IBUS_UCP_RISE_150MA		0
550 #define SC8551_IBUS_UCP_RISE_250MA		1
551 
552 #define SC8551_SET_IBAT_SNS_RES_MASK		0x02
553 #define SC8551_SET_IBAT_SNS_RES_SHIFT		1
554 #define SC8551_SET_IBAT_SNS_RES_2MHM		0
555 #define SC8551_SET_IBAT_SNS_RES_5MHM		1
556 
557 #define SC8551_VAC_PD_EN_MASK			0x01
558 #define SC8551_VAC_PD_EN_SHIFT			0
559 #define SC8551_VAC_PD_ENABLE			1
560 #define SC8551_VAC_PD_DISABLE			0
561 
562 /* Register 2Ch */
563 #define SC8551_REG_2C				0x2C
564 #define SC8551_IBAT_REG_MASK			0xC0
565 #define SC8551_IBAT_REG_SHIFT			6
566 #define SC8551_IBAT_REG_200MA			0
567 #define SC8551_IBAT_REG_300MA			1
568 #define SC8551_IBAT_REG_400MA			2
569 #define SC8551_IBAT_REG_500MA			3
570 #define SC8551_VBAT_REG_MASK			0x30
571 #define SC8551_VBAT_REG_SHIFT			4
572 #define SC8551_VBAT_REG_50MV			0
573 #define SC8551_VBAT_REG_100MV			1
574 #define SC8551_VBAT_REG_150MV			2
575 #define SC8551_VBAT_REG_200MV			3
576 
577 #define SC8551_VBAT_REG_ACTIVE_STAT_MASK	0x08
578 #define SC8551_IBAT_REG_ACTIVE_STAT_MASK	0x04
579 #define SC8551_VDROP_OVP_ACTIVE_STAT_MASK	0x02
580 #define SC8551_VOUT_OVP_ACTIVE_STAT_MASK	0x01
581 
582 #define SC8551_REG_2D				0x2D
583 #define SC8551_VBAT_REG_ACTIVE_FLAG_MASK	0x80
584 #define SC8551_IBAT_REG_ACTIVE_FLAG_MASK	0x40
585 #define SC8551_VDROP_OVP_FLAG_MASK		0x20
586 #define SC8551_VOUT_OVP_FLAG_MASK		0x10
587 #define SC8551_VBAT_REG_ACTIVE_MASK_MASK	0x08
588 #define SC8551_IBAT_REG_ACTIVE_MASK_MASK	0x04
589 #define SC8551_VDROP_OVP_MASK_MASK		0x02
590 #define SC8551_VOUT_OVP_MASK_MASK		0x01
591 
592 #define SC8551_REG_2E				0x2E
593 #define SC8551_IBUS_LOW_DG_MASK			0x08
594 #define SC8551_IBUS_LOW_DG_SHIFT		3
595 #define SC8551_IBUS_LOW_DG_10US			0
596 #define SC8551_IBUS_LOW_DG_5MS			1
597 
598 #define SC8551_REG_2F				0x2F
599 #define SC8551_PMID2OUT_UVP_FLAG_MASK		0x08
600 #define SC8551_PMID2OUT_OVP_FLAG_MASK		0x04
601 #define SC8551_PMID2OUT_UVP_STAT_MASK		0x02
602 #define SC8551_PMID2OUT_OVP_STAT_MASK		0x01
603 
604 #define SC8551_REG_30				0x30
605 #define SC8551_IBUS_REG_EN_MASK			0x80
606 #define SC8551_IBUS_REG_EN_SHIFT		7
607 #define SC8551_IBUS_REG_ENABLE			1
608 #define SC8551_IBUS_REG_DISABLE			0
609 #define SC8551_IBUS_REG_ACTIVE_STAT_MASK	0x40
610 #define SC8551_IBUS_REG_ACTIVE_FLAG_MASK	0x20
611 #define SC8551_IBUS_REG_ACTIVE_MASK_MASK	0x10
612 #define SC8551_IBUS_REG_ACTIVE_MASK_SHIFT	4
613 #define SC8551_IBUS_REG_ACTIVE_NOT_MASK		0
614 #define SC8551_IBUS_REG_ACTIVE_MASK		1
615 #define SC8551_IBUS_REG_MASK			0x0F
616 #define SC8551_IBUS_REG_SHIFT			0
617 #define SC8551_IBUS_REG_BASE			1000
618 #define SC8551_IBUS_REG_LSB			250
619 
620 #define SC8551_REG_31				0x31
621 #define SC8551_CHARGE_MODE_MASK			0x01
622 #define SC8551_CHARGE_MODE_SHIFT		0
623 #define SC8551_CHARGE_MODE_2_1			0
624 #define SC8551_CHARGE_MODE_1_1			1
625 
626 #define SC8551_REG_35				0x35
627 #define SC8551_VBUS_IN_RANGE_MASK		0x01
628 #define SC8551_VBUS_IN_RANGE_SHIFT		6
629 #define SC8551_VBUS_IN_RANGE_ENABLE		0
630 #define SC8551_VBUS_IN_RANGE_DISABLE		1
631 
632 
633 #define SC8551_REG_36				0x36
634 #define SC8551_OVPGATE_MASK			0x01
635 #define SC8551_OVPGATE_SHIFT			3
636 #define SC8551_OVPGATE_ENABLE			0
637 #define SC8551_OVPGATE_DISABLE			1
638 
639 #define VBUS_INSERT				BIT(2)
640 #define VBAT_INSERT				BIT(1)
641 #define ADC_DONE				BIT(0)
642 
643 #define BAT_OVP_FAULT				BIT(7)
644 #define BAT_OCP_FAULT				BIT(6)
645 #define BUS_OVP_FAULT				BIT(5)
646 #define BUS_OCP_FAULT				BIT(4)
647 
648 /*below used for comm with other module*/
649 #define BAT_OVP_FAULT_SHIFT			0
650 #define BAT_OCP_FAULT_SHIFT			1
651 #define BUS_OVP_FAULT_SHIFT			2
652 #define BUS_OCP_FAULT_SHIFT			3
653 #define BAT_THERM_FAULT_SHIFT			4
654 #define BUS_THERM_FAULT_SHIFT			5
655 #define DIE_THERM_FAULT_SHIFT			6
656 
657 #define BAT_OVP_FAULT_MASK			(1 << BAT_OVP_FAULT_SHIFT)
658 #define BAT_OCP_FAULT_MASK			(1 << BAT_OCP_FAULT_SHIFT)
659 #define BUS_OVP_FAULT_MASK			(1 << BUS_OVP_FAULT_SHIFT)
660 #define BUS_OCP_FAULT_MASK			(1 << BUS_OCP_FAULT_SHIFT)
661 #define BAT_THERM_FAULT_MASK			(1 << BAT_THERM_FAULT_SHIFT)
662 #define BUS_THERM_FAULT_MASK			(1 << BUS_THERM_FAULT_SHIFT)
663 #define DIE_THERM_FAULT_MASK			(1 << DIE_THERM_FAULT_SHIFT)
664 
665 #define BAT_OVP_ALARM_SHIFT			0
666 #define BAT_OCP_ALARM_SHIFT			1
667 #define BUS_OVP_ALARM_SHIFT			2
668 #define BUS_OCP_ALARM_SHIFT			3
669 #define BAT_THERM_ALARM_SHIFT			4
670 #define BUS_THERM_ALARM_SHIFT			5
671 #define DIE_THERM_ALARM_SHIFT			6
672 #define BAT_UCP_ALARM_SHIFT			7
673 #define BAT_OVP_ALARM_MASK			(1 << BAT_OVP_ALARM_SHIFT)
674 #define BAT_OCP_ALARM_MASK			(1 << BAT_OCP_ALARM_SHIFT)
675 #define BUS_OVP_ALARM_MASK			(1 << BUS_OVP_ALARM_SHIFT)
676 #define BUS_OCP_ALARM_MASK			(1 << BUS_OCP_ALARM_SHIFT)
677 #define BAT_THERM_ALARM_MASK			(1 << BAT_THERM_ALARM_SHIFT)
678 #define BUS_THERM_ALARM_MASK			(1 << BUS_THERM_ALARM_SHIFT)
679 #define DIE_THERM_ALARM_MASK			(1 << DIE_THERM_ALARM_SHIFT)
680 #define BAT_UCP_ALARM_MASK			(1 << BAT_UCP_ALARM_SHIFT)
681 
682 #define VBAT_REG_STATUS_SHIFT			0
683 #define IBAT_REG_STATUS_SHIFT			1
684 
685 #define VBAT_REG_STATUS_MASK			(1 << VBAT_REG_STATUS_SHIFT)
686 #define IBAT_REG_STATUS_MASK			(1 << VBAT_REG_STATUS_SHIFT)
687 
688 #define SC8551_DEBUG_BUF_LEN			30
689 
690 enum {
691 	ADC_IBUS,
692 	ADC_VBUS,
693 	ADC_VAC,
694 	ADC_VOUT,
695 	ADC_VBAT,
696 	ADC_IBAT,
697 	ADC_TBUS,
698 	ADC_TBAT,
699 	ADC_TDIE,
700 	ADC_MAX_NUM,
701 };
702 
703 struct sc8551_cfg {
704 	bool bat_ovp_disable;
705 	bool bat_ocp_disable;
706 
707 	int bat_ovp_th;
708 	int bat_ovp_alm_th;
709 	int bat_ocp_th;
710 
711 	bool bus_ocp_disable;
712 
713 	int bus_ovp_th;
714 	int bus_ocp_th;
715 
716 	int ac_ovp_th;
717 
718 	bool bat_therm_disable;
719 	bool bus_therm_disable;
720 	bool die_therm_disable;
721 
722 	int sense_r_mohm;
723 };
724 
725 struct sc8551 {
726 	struct device *dev;
727 	struct i2c_client *client;
728 
729 	int part_no;
730 	int revision;
731 
732 	int mode;
733 
734 	struct mutex data_lock;
735 	struct mutex i2c_rw_lock;
736 
737 	int irq;
738 
739 	bool batt_present;
740 	bool vbus_present;
741 
742 	bool usb_present;
743 	bool charge_enabled;
744 
745 	int vbus_error;
746 
747 	/* ADC reading */
748 	int vbat_volt;
749 	int vbus_volt;
750 	int vout_volt;
751 	int vac_volt;
752 
753 	int ibat_curr;
754 	int ibus_curr;
755 
756 	int die_temp;
757 
758 	/* alarm/fault status */
759 	bool bat_ovp_fault;
760 	bool bat_ocp_fault;
761 	bool bus_ovp_fault;
762 	bool bus_ocp_fault;
763 
764 	bool vbat_reg;
765 	bool ibat_reg;
766 
767 	int prev_alarm;
768 	int prev_fault;
769 
770 	struct sc8551_cfg *cfg;
771 
772 	struct power_supply_desc psy_desc;
773 	struct power_supply_config psy_cfg;
774 	struct power_supply *fc2_psy;
775 };
776 
__sc8551_read_byte(struct sc8551 * sc,u8 reg,u8 * data)777 static int __sc8551_read_byte(struct sc8551 *sc, u8 reg, u8 *data)
778 {
779 	s32 ret;
780 
781 	ret = i2c_smbus_read_byte_data(sc->client, reg);
782 	if (ret < 0) {
783 		dev_err(sc->dev, "i2c read fail: can't read from reg 0x%02X\n", reg);
784 		return ret;
785 	}
786 
787 	*data = (u8) ret;
788 
789 	return 0;
790 }
791 
__sc8551_write_byte(struct sc8551 * sc,int reg,u8 val)792 static int __sc8551_write_byte(struct sc8551 *sc, int reg, u8 val)
793 {
794 	s32 ret;
795 
796 	ret = i2c_smbus_write_byte_data(sc->client, reg, val);
797 	if (ret < 0) {
798 		dev_err(sc->dev, "i2c write fail: can't write 0x%02X to reg 0x%02X: %d\n",
799 			val, reg, ret);
800 		return ret;
801 	}
802 	return 0;
803 }
804 
sc8551_read_byte(struct sc8551 * sc,u8 reg,u8 * data)805 static int sc8551_read_byte(struct sc8551 *sc, u8 reg, u8 *data)
806 {
807 	int ret;
808 
809 	mutex_lock(&sc->i2c_rw_lock);
810 	ret = __sc8551_read_byte(sc, reg, data);
811 	mutex_unlock(&sc->i2c_rw_lock);
812 
813 	return ret;
814 }
815 
sc8551_write_byte(struct sc8551 * sc,u8 reg,u8 data)816 static int sc8551_write_byte(struct sc8551 *sc, u8 reg, u8 data)
817 {
818 	int ret;
819 
820 	mutex_lock(&sc->i2c_rw_lock);
821 	ret = __sc8551_write_byte(sc, reg, data);
822 	mutex_unlock(&sc->i2c_rw_lock);
823 
824 	return ret;
825 }
826 
sc8551_update_bits(struct sc8551 * sc,u8 reg,u8 mask,u8 data)827 static int sc8551_update_bits(struct sc8551 *sc,
828 			      u8 reg,
829 			      u8 mask,
830 			      u8 data)
831 {
832 	int ret;
833 	u8 tmp;
834 
835 	mutex_lock(&sc->i2c_rw_lock);
836 	ret = __sc8551_read_byte(sc, reg, &tmp);
837 	if (ret) {
838 		dev_err(sc->dev, "Failed: reg=%02X, ret=%d\n", reg, ret);
839 		goto out;
840 	}
841 
842 	tmp &= ~mask;
843 	tmp |= data & mask;
844 
845 	ret = __sc8551_write_byte(sc, reg, tmp);
846 	if (ret)
847 		dev_err(sc->dev, "Failed: reg=%02X, ret=%d\n", reg, ret);
848 
849 out:
850 	mutex_unlock(&sc->i2c_rw_lock);
851 	return ret;
852 }
853 
sc8551_enable_charge(struct sc8551 * sc,bool enable)854 static int sc8551_enable_charge(struct sc8551 *sc, bool enable)
855 {
856 	int ret;
857 	u8 val;
858 
859 	if (enable)
860 		val = SC8551_CHG_ENABLE;
861 	else
862 		val = SC8551_CHG_DISABLE;
863 
864 	val <<= SC8551_CHG_EN_SHIFT;
865 
866 	ret = sc8551_update_bits(sc,
867 				 SC8551_REG_0C,
868 				 SC8551_CHG_EN_MASK,
869 				 val);
870 
871 	return ret;
872 }
873 
sc8551_check_charge_enabled(struct sc8551 * sc,bool * enabled)874 static int sc8551_check_charge_enabled(struct sc8551 *sc, bool *enabled)
875 {
876 	int ret;
877 	u8 val;
878 
879 	ret = sc8551_read_byte(sc, SC8551_REG_0C, &val);
880 
881 	if (!ret)
882 		*enabled = !!(val & SC8551_CHG_EN_MASK);
883 	return ret;
884 }
885 
sc8551_enable_wdt(struct sc8551 * sc,bool enable)886 static int sc8551_enable_wdt(struct sc8551 *sc, bool enable)
887 {
888 	int ret;
889 	u8 val;
890 
891 	if (enable)
892 		val = SC8551_WATCHDOG_ENABLE;
893 	else
894 		val = SC8551_WATCHDOG_DISABLE;
895 
896 	val <<= SC8551_WATCHDOG_DIS_SHIFT;
897 
898 	ret = sc8551_update_bits(sc,
899 				 SC8551_REG_0B,
900 				 SC8551_WATCHDOG_DIS_MASK,
901 				 val);
902 	return ret;
903 }
904 
sc8551_set_wdt(struct sc8551 * sc,int ms)905 static int sc8551_set_wdt(struct sc8551 *sc, int ms)
906 {
907 	int ret;
908 	u8 val;
909 
910 	if (ms == 500)
911 		val = SC8551_WATCHDOG_0P5S;
912 	else if (ms == 1000)
913 		val = SC8551_WATCHDOG_1S;
914 	else if (ms == 5000)
915 		val = SC8551_WATCHDOG_5S;
916 	else if (ms == 30000)
917 		val = SC8551_WATCHDOG_30S;
918 	else
919 		val = SC8551_WATCHDOG_30S;
920 
921 	val <<= SC8551_WATCHDOG_SHIFT;
922 
923 	ret = sc8551_update_bits(sc,
924 				 SC8551_REG_0B,
925 				 SC8551_WATCHDOG_MASK,
926 				 val);
927 	return ret;
928 }
929 
sc8551_enable_batovp(struct sc8551 * sc,bool enable)930 static int sc8551_enable_batovp(struct sc8551 *sc, bool enable)
931 {
932 	int ret;
933 	u8 val;
934 
935 	if (enable)
936 		val = SC8551_BAT_OVP_ENABLE;
937 	else
938 		val = SC8551_BAT_OVP_DISABLE;
939 
940 	val <<= SC8551_BAT_OVP_DIS_SHIFT;
941 
942 	ret = sc8551_update_bits(sc,
943 				 SC8551_REG_00,
944 				 SC8551_BAT_OVP_DIS_MASK,
945 				 val);
946 	return ret;
947 }
948 
sc8551_set_batovp_th(struct sc8551 * sc,int threshold)949 static int sc8551_set_batovp_th(struct sc8551 *sc, int threshold)
950 {
951 	int ret;
952 	u8 val;
953 
954 	if (threshold < SC8551_BAT_OVP_BASE)
955 		threshold = SC8551_BAT_OVP_BASE;
956 
957 	val = (threshold - SC8551_BAT_OVP_BASE) / SC8551_BAT_OVP_LSB;
958 
959 	val <<= SC8551_BAT_OVP_SHIFT;
960 
961 	ret = sc8551_update_bits(sc,
962 				 SC8551_REG_00,
963 				 SC8551_BAT_OVP_MASK,
964 				 val);
965 	return ret;
966 }
967 
sc8551_enable_batocp(struct sc8551 * sc,bool enable)968 static int sc8551_enable_batocp(struct sc8551 *sc, bool enable)
969 {
970 	int ret;
971 	u8 val;
972 
973 	if (enable)
974 		val = SC8551_BAT_OCP_ENABLE;
975 	else
976 		val = SC8551_BAT_OCP_DISABLE;
977 
978 	val <<= SC8551_BAT_OCP_DIS_SHIFT;
979 
980 	ret = sc8551_update_bits(sc,
981 				 SC8551_REG_02,
982 				 SC8551_BAT_OCP_DIS_MASK,
983 				 val);
984 	return ret;
985 }
986 
sc8551_set_batocp_th(struct sc8551 * sc,int threshold)987 static int sc8551_set_batocp_th(struct sc8551 *sc, int threshold)
988 {
989 	int ret;
990 	u8 val;
991 
992 	if (threshold < SC8551_BAT_OCP_BASE)
993 		threshold = SC8551_BAT_OCP_BASE;
994 
995 	val = (threshold - SC8551_BAT_OCP_BASE) / SC8551_BAT_OCP_LSB;
996 
997 	val <<= SC8551_BAT_OCP_SHIFT;
998 
999 	ret = sc8551_update_bits(sc,
1000 				 SC8551_REG_02,
1001 				 SC8551_BAT_OCP_MASK,
1002 				 val);
1003 	return ret;
1004 }
1005 
sc8551_set_busovp_th(struct sc8551 * sc,int threshold)1006 static int sc8551_set_busovp_th(struct sc8551 *sc, int threshold)
1007 {
1008 	int ret;
1009 	u8 val;
1010 
1011 	if (threshold < SC8551_BUS_OVP_BASE)
1012 		threshold = SC8551_BUS_OVP_BASE;
1013 
1014 	val = (threshold - SC8551_BUS_OVP_BASE) / SC8551_BUS_OVP_LSB;
1015 
1016 	val <<= SC8551_BUS_OVP_SHIFT;
1017 
1018 	ret = sc8551_update_bits(sc,
1019 				 SC8551_REG_06,
1020 				 SC8551_BUS_OVP_MASK,
1021 				 val);
1022 	return ret;
1023 }
1024 
sc8551_enable_busocp(struct sc8551 * sc,bool enable)1025 static int sc8551_enable_busocp(struct sc8551 *sc, bool enable)
1026 {
1027 	int ret;
1028 	u8 val;
1029 
1030 	if (enable)
1031 		val = SC8551_BUS_OCP_ENABLE;
1032 	else
1033 		val = SC8551_BUS_OCP_DISABLE;
1034 
1035 	val <<= SC8551_BUS_OCP_DIS_SHIFT;
1036 
1037 	ret = sc8551_update_bits(sc,
1038 				 SC8551_REG_08,
1039 				 SC8551_BUS_OCP_DIS_MASK,
1040 				 val);
1041 	return ret;
1042 }
1043 
sc8551_set_busocp_th(struct sc8551 * sc,int threshold)1044 static int sc8551_set_busocp_th(struct sc8551 *sc, int threshold)
1045 {
1046 	int ret;
1047 	u8 val;
1048 
1049 	if (threshold < SC8551_BUS_OCP_BASE)
1050 		threshold = SC8551_BUS_OCP_BASE;
1051 
1052 	val = (threshold - SC8551_BUS_OCP_BASE) / SC8551_BUS_OCP_LSB;
1053 
1054 	val <<= SC8551_BUS_OCP_SHIFT;
1055 
1056 	ret = sc8551_update_bits(sc,
1057 				 SC8551_REG_08,
1058 				 SC8551_BUS_OCP_MASK,
1059 				 val);
1060 	return ret;
1061 }
1062 
sc8551_set_acovp_th(struct sc8551 * sc,int threshold)1063 static int sc8551_set_acovp_th(struct sc8551 *sc, int threshold)
1064 {
1065 	int ret;
1066 	u8 val;
1067 
1068 	if (threshold < SC8551_AC_OVP_BASE)
1069 		threshold = SC8551_AC_OVP_BASE;
1070 
1071 	if (threshold == SC8551_AC_OVP_6P5V)
1072 		val = 0x07;
1073 	else
1074 		val = (threshold - SC8551_AC_OVP_BASE) / SC8551_AC_OVP_LSB;
1075 
1076 	val <<= SC8551_AC_OVP_SHIFT;
1077 
1078 	ret = sc8551_update_bits(sc, SC8551_REG_05,
1079 				 SC8551_AC_OVP_MASK, val);
1080 
1081 	return ret;
1082 
1083 }
1084 
sc8551_set_vdrop_th(struct sc8551 * sc,int threshold)1085 static int sc8551_set_vdrop_th(struct sc8551 *sc, int threshold)
1086 {
1087 	int ret;
1088 	u8 val;
1089 
1090 	if (threshold == 300)
1091 		val = SC8551_VDROP_THRESHOLD_300MV;
1092 	else
1093 		val = SC8551_VDROP_THRESHOLD_400MV;
1094 
1095 	val <<= SC8551_VDROP_THRESHOLD_SET_SHIFT;
1096 
1097 	ret = sc8551_update_bits(sc, SC8551_REG_05,
1098 				 SC8551_VDROP_THRESHOLD_SET_MASK,
1099 				 val);
1100 
1101 	return ret;
1102 }
1103 
sc8551_set_vdrop_deglitch(struct sc8551 * sc,int us)1104 static int sc8551_set_vdrop_deglitch(struct sc8551 *sc, int us)
1105 {
1106 	int ret;
1107 	u8 val;
1108 
1109 	if (us == 8)
1110 		val = SC8551_VDROP_DEGLITCH_8US;
1111 	else
1112 		val = SC8551_VDROP_DEGLITCH_5MS;
1113 
1114 	val <<= SC8551_VDROP_DEGLITCH_SET_SHIFT;
1115 
1116 	ret = sc8551_update_bits(sc,
1117 				 SC8551_REG_05,
1118 				 SC8551_VDROP_DEGLITCH_SET_MASK,
1119 				 val);
1120 	return ret;
1121 }
1122 
sc8551_enable_bat_therm(struct sc8551 * sc,bool enable)1123 static int sc8551_enable_bat_therm(struct sc8551 *sc, bool enable)
1124 {
1125 	int ret;
1126 	u8 val;
1127 
1128 	if (enable)
1129 		val = SC8551_TSBAT_ENABLE;
1130 	else
1131 		val = SC8551_TSBAT_DISABLE;
1132 
1133 	val <<= SC8551_TSBAT_DIS_SHIFT;
1134 
1135 	ret = sc8551_update_bits(sc, SC8551_REG_0C,
1136 				 SC8551_TSBAT_DIS_MASK, val);
1137 	return ret;
1138 }
1139 
sc8551_enable_bus_therm(struct sc8551 * sc,bool enable)1140 static int sc8551_enable_bus_therm(struct sc8551 *sc, bool enable)
1141 {
1142 	int ret;
1143 	u8 val;
1144 
1145 	if (enable)
1146 		val = SC8551_TSBUS_ENABLE;
1147 	else
1148 		val = SC8551_TSBUS_DISABLE;
1149 
1150 	val <<= SC8551_TSBUS_DIS_SHIFT;
1151 
1152 	ret = sc8551_update_bits(sc, SC8551_REG_0C,
1153 				 SC8551_TSBUS_DIS_MASK, val);
1154 	return ret;
1155 }
1156 
sc8551_enable_adc(struct sc8551 * sc,bool enable)1157 static int sc8551_enable_adc(struct sc8551 *sc, bool enable)
1158 {
1159 	int ret;
1160 	u8 val;
1161 
1162 	if (enable)
1163 		val = SC8551_ADC_ENABLE;
1164 	else
1165 		val = SC8551_ADC_DISABLE;
1166 
1167 	val <<= SC8551_ADC_EN_SHIFT;
1168 
1169 	ret = sc8551_update_bits(sc, SC8551_REG_14,
1170 				 SC8551_ADC_EN_MASK, val);
1171 	return ret;
1172 }
1173 
sc8551_set_adc_scanrate(struct sc8551 * sc,bool oneshot)1174 static int sc8551_set_adc_scanrate(struct sc8551 *sc, bool oneshot)
1175 {
1176 	int ret;
1177 	u8 val;
1178 
1179 	if (oneshot)
1180 		val = SC8551_ADC_RATE_ONESHOT;
1181 	else
1182 		val = SC8551_ADC_RATE_CONTINOUS;
1183 
1184 	val <<= SC8551_ADC_RATE_SHIFT;
1185 
1186 	ret = sc8551_update_bits(sc, SC8551_REG_14,
1187 				 SC8551_ADC_RATE_MASK, val);
1188 	return ret;
1189 }
1190 
sc8551_get_adc_data(struct sc8551 * sc,int channel,int * result)1191 static int sc8551_get_adc_data(struct sc8551 *sc, int channel,  int *result)
1192 {
1193 	u8 val_l = 0, val_h = 0;
1194 	u16 val = 0;
1195 	int ret = 0;
1196 
1197 	if (channel >= ADC_MAX_NUM)
1198 		return 0;
1199 
1200 	ret = sc8551_read_byte(sc, SC8551_REG_16 + (channel << 1), &val_h);
1201 	if (ret < 0)
1202 		return ret;
1203 
1204 	ret = sc8551_read_byte(sc, SC8551_REG_16 + (channel << 1) + 1, &val_l);
1205 	if (ret < 0)
1206 		return ret;
1207 
1208 	val = (val_h << 8) | val_l;
1209 
1210 	if (channel == ADC_IBUS)
1211 		val = val * 15625 / 10000;
1212 	else if (channel == ADC_VBUS)
1213 		val = val * 375 / 100;
1214 	else if (channel == ADC_VAC)
1215 		val = val * 5;
1216 	else if (channel == ADC_VOUT)
1217 		val = val * 125 / 100;
1218 	else if (channel == ADC_VBAT)
1219 		val = val * 125 / 100;
1220 	else if (channel == ADC_IBAT)
1221 		val = val * 3125 / 1000;
1222 	else if (channel == ADC_TDIE)
1223 		val = val * 5 / 10;
1224 
1225 	*result = val;
1226 
1227 	return ret;
1228 }
1229 
sc8551_set_adc_scan(struct sc8551 * sc,int channel,bool enable)1230 static int sc8551_set_adc_scan(struct sc8551 *sc, int channel, bool enable)
1231 {
1232 	int ret;
1233 	u8 reg;
1234 	u8 mask;
1235 	u8 shift;
1236 	u8 val;
1237 
1238 	if (channel > ADC_MAX_NUM)
1239 		return -EINVAL;
1240 
1241 	if (channel == ADC_IBUS) {
1242 		reg = SC8551_REG_14;
1243 		shift = SC8551_IBUS_ADC_DIS_SHIFT;
1244 		mask = SC8551_IBUS_ADC_DIS_MASK;
1245 	} else {
1246 		reg = SC8551_REG_15;
1247 		shift = 8 - channel;
1248 		mask = 1 << shift;
1249 	}
1250 
1251 	if (enable)
1252 		val = 0 << shift;
1253 	else
1254 		val = 1 << shift;
1255 
1256 	ret = sc8551_update_bits(sc, reg, mask, val);
1257 
1258 	return ret;
1259 }
1260 
sc8551_set_alarm_int_mask(struct sc8551 * sc,u8 mask)1261 static int sc8551_set_alarm_int_mask(struct sc8551 *sc, u8 mask)
1262 {
1263 	int ret;
1264 	u8 val;
1265 
1266 	ret = sc8551_read_byte(sc, SC8551_REG_0F, &val);
1267 	if (ret)
1268 		return ret;
1269 
1270 	val |= mask;
1271 
1272 	ret = sc8551_write_byte(sc, SC8551_REG_0F, val);
1273 
1274 	return ret;
1275 }
1276 
sc8551_set_sense_resistor(struct sc8551 * sc,int r_mohm)1277 static int sc8551_set_sense_resistor(struct sc8551 *sc, int r_mohm)
1278 {
1279 	int ret;
1280 	u8 val;
1281 
1282 	if (r_mohm == 2)
1283 		val = SC8551_SET_IBAT_SNS_RES_2MHM;
1284 	else if (r_mohm == 5)
1285 		val = SC8551_SET_IBAT_SNS_RES_5MHM;
1286 	else
1287 		return -EINVAL;
1288 
1289 	val <<= SC8551_SET_IBAT_SNS_RES_SHIFT;
1290 
1291 	ret = sc8551_update_bits(sc,
1292 				 SC8551_REG_2B,
1293 				 SC8551_SET_IBAT_SNS_RES_MASK,
1294 				 val);
1295 	return ret;
1296 }
1297 
sc8551_enable_regulation(struct sc8551 * sc,bool enable)1298 static int sc8551_enable_regulation(struct sc8551 *sc, bool enable)
1299 {
1300 	int ret;
1301 	u8 val;
1302 
1303 	if (enable)
1304 		val = SC8551_EN_REGULATION_ENABLE;
1305 	else
1306 		val = SC8551_EN_REGULATION_DISABLE;
1307 
1308 	val <<= SC8551_EN_REGULATION_SHIFT;
1309 
1310 	ret = sc8551_update_bits(sc,
1311 				 SC8551_REG_2B,
1312 				 SC8551_EN_REGULATION_MASK,
1313 				 val);
1314 
1315 	return ret;
1316 
1317 }
1318 
sc8551_set_ss_timeout(struct sc8551 * sc,int timeout)1319 static int sc8551_set_ss_timeout(struct sc8551 *sc, int timeout)
1320 {
1321 	int ret;
1322 	u8 val;
1323 
1324 	switch (timeout) {
1325 	case 0:
1326 		val = SC8551_SS_TIMEOUT_DISABLE;
1327 		break;
1328 	case 12:
1329 		val = SC8551_SS_TIMEOUT_12P5MS;
1330 		break;
1331 	case 25:
1332 		val = SC8551_SS_TIMEOUT_25MS;
1333 		break;
1334 	case 50:
1335 		val = SC8551_SS_TIMEOUT_50MS;
1336 		break;
1337 	case 100:
1338 		val = SC8551_SS_TIMEOUT_100MS;
1339 		break;
1340 	case 400:
1341 		val = SC8551_SS_TIMEOUT_400MS;
1342 		break;
1343 	case 1500:
1344 		val = SC8551_SS_TIMEOUT_1500MS;
1345 		break;
1346 	case 100000:
1347 		val = SC8551_SS_TIMEOUT_100000MS;
1348 		break;
1349 	default:
1350 		val = SC8551_SS_TIMEOUT_DISABLE;
1351 		break;
1352 	}
1353 
1354 	val <<= SC8551_SS_TIMEOUT_SET_SHIFT;
1355 
1356 	ret = sc8551_update_bits(sc,
1357 				 SC8551_REG_2B,
1358 				 SC8551_SS_TIMEOUT_SET_MASK,
1359 				 val);
1360 
1361 	return ret;
1362 }
1363 
sc8551_set_ibat_reg_th(struct sc8551 * sc,int th_ma)1364 static int sc8551_set_ibat_reg_th(struct sc8551 *sc, int th_ma)
1365 {
1366 	int ret;
1367 	u8 val;
1368 
1369 	if (th_ma == 200)
1370 		val = SC8551_IBAT_REG_200MA;
1371 	else if (th_ma == 300)
1372 		val = SC8551_IBAT_REG_300MA;
1373 	else if (th_ma == 400)
1374 		val = SC8551_IBAT_REG_400MA;
1375 	else if (th_ma == 500)
1376 		val = SC8551_IBAT_REG_500MA;
1377 	else
1378 		val = SC8551_IBAT_REG_500MA;
1379 
1380 	val <<= SC8551_IBAT_REG_SHIFT;
1381 	ret = sc8551_update_bits(sc,
1382 				 SC8551_REG_2C,
1383 				 SC8551_IBAT_REG_MASK,
1384 				 val);
1385 
1386 	return ret;
1387 }
1388 
sc8551_set_vbat_reg_th(struct sc8551 * sc,int th_mv)1389 static int sc8551_set_vbat_reg_th(struct sc8551 *sc, int th_mv)
1390 {
1391 	int ret;
1392 	u8 val;
1393 
1394 	if (th_mv == 50)
1395 		val = SC8551_VBAT_REG_50MV;
1396 	else if (th_mv == 100)
1397 		val = SC8551_VBAT_REG_100MV;
1398 	else if (th_mv == 150)
1399 		val = SC8551_VBAT_REG_150MV;
1400 	else
1401 		val = SC8551_VBAT_REG_200MV;
1402 
1403 	val <<= SC8551_VBAT_REG_SHIFT;
1404 
1405 	ret = sc8551_update_bits(sc, SC8551_REG_2C,
1406 				SC8551_VBAT_REG_MASK,
1407 				val);
1408 
1409 	return ret;
1410 }
1411 
sc8551_get_work_mode(struct sc8551 * sc,int * mode)1412 static int sc8551_get_work_mode(struct sc8551 *sc, int *mode)
1413 {
1414 	int ret;
1415 	u8 val;
1416 
1417 	ret = sc8551_read_byte(sc, SC8551_REG_0C, &val);
1418 
1419 	if (ret) {
1420 		dev_err(sc->dev, "Failed to read operation mode register\n");
1421 		return ret;
1422 	}
1423 
1424 	val = (val & SC8551_MS_MASK) >> SC8551_MS_SHIFT;
1425 	if (val == SC8551_MS_MASTER)
1426 		*mode = SC8551_ROLE_MASTER;
1427 	else if (val == SC8551_MS_SLAVE)
1428 		*mode = SC8551_ROLE_SLAVE;
1429 	else
1430 		*mode = SC8551_ROLE_STDALONE;
1431 
1432 	pr_debug("work mode:%s\n", *mode == SC8551_ROLE_STDALONE ? "Standalone" :
1433 		(*mode == SC8551_ROLE_SLAVE ? "Slave" : "Master"));
1434 	return ret;
1435 }
1436 
sc8551_check_vbus_error_status(struct sc8551 * sc)1437 static int sc8551_check_vbus_error_status(struct sc8551 *sc)
1438 {
1439 	int ret;
1440 	u8 data;
1441 
1442 	ret = sc8551_read_byte(sc, SC8551_REG_0A, &data);
1443 	if (!ret)
1444 		sc->vbus_error = data;
1445 
1446 	return ret;
1447 }
1448 
sc8551_check_alarm_status(struct sc8551 * sc)1449 static void sc8551_check_alarm_status(struct sc8551 *sc)
1450 {
1451 	u8 flag = 0;
1452 	u8 stat = 0;
1453 	int ret;
1454 
1455 	mutex_lock(&sc->data_lock);
1456 
1457 	ret = sc8551_read_byte(sc, SC8551_REG_08, &flag);
1458 	if (!ret && (flag & SC8551_IBUS_UCP_FALL_FLAG_MASK))
1459 		pr_debug("UCP_FLAG =0x%02X\n",
1460 			 !!(flag & SC8551_IBUS_UCP_FALL_FLAG_MASK));
1461 
1462 	ret = sc8551_read_byte(sc, SC8551_REG_2D, &flag);
1463 	if (!ret && (flag & SC8551_VDROP_OVP_FLAG_MASK))
1464 		pr_debug("VDROP_OVP_FLAG =0x%02X\n",
1465 			 !!(flag & SC8551_VDROP_OVP_FLAG_MASK));
1466 
1467 	/*read to clear alarm flag*/
1468 	ret = sc8551_read_byte(sc, SC8551_REG_0E, &flag);
1469 	if (!ret && flag)
1470 		pr_debug("INT_FLAG =0x%02X\n", flag);
1471 
1472 	ret = sc8551_read_byte(sc, SC8551_REG_0D, &stat);
1473 	if (!ret && stat != sc->prev_alarm) {
1474 		pr_debug("INT_STAT = 0X%02x\n", stat);
1475 		sc->prev_alarm = stat;
1476 		sc->batt_present = !!(stat & VBAT_INSERT);
1477 		sc->vbus_present = !!(stat & VBUS_INSERT);
1478 	}
1479 
1480 	ret = sc8551_read_byte(sc, SC8551_REG_08, &stat);
1481 	if (!ret && (stat & 0x50))
1482 		dev_err(sc->dev, "Reg[05]BUS_UCPOVP = 0x%02X\n", stat);
1483 
1484 	ret = sc8551_read_byte(sc, SC8551_REG_0A, &stat);
1485 	if (!ret && (stat & 0x02))
1486 		dev_err(sc->dev, "Reg[0A]CONV_OCP = 0x%02X\n", stat);
1487 
1488 	mutex_unlock(&sc->data_lock);
1489 }
1490 
sc8551_check_fault_status(struct sc8551 * sc)1491 static void sc8551_check_fault_status(struct sc8551 *sc)
1492 {
1493 	u8 flag = 0;
1494 	u8 stat = 0;
1495 	int ret;
1496 
1497 	mutex_lock(&sc->data_lock);
1498 
1499 	ret = sc8551_read_byte(sc, SC8551_REG_10, &stat);
1500 	if (!ret && stat)
1501 		dev_err(sc->dev, "FAULT_STAT = 0x%02X\n", stat);
1502 
1503 	ret = sc8551_read_byte(sc, SC8551_REG_11, &flag);
1504 	if (!ret && flag)
1505 		dev_err(sc->dev, "FAULT_FLAG = 0x%02X\n", flag);
1506 
1507 	if (!ret && flag != sc->prev_fault) {
1508 		sc->prev_fault = flag;
1509 		sc->bat_ovp_fault = !!(flag & BAT_OVP_FAULT);
1510 		sc->bat_ocp_fault = !!(flag & BAT_OCP_FAULT);
1511 		sc->bus_ovp_fault = !!(flag & BUS_OVP_FAULT);
1512 		sc->bus_ocp_fault = !!(flag & BUS_OCP_FAULT);
1513 	}
1514 
1515 	mutex_unlock(&sc->data_lock);
1516 }
1517 
sc8551_detect_device(struct sc8551 * sc)1518 static int sc8551_detect_device(struct sc8551 *sc)
1519 {
1520 	int ret;
1521 	u8 data;
1522 
1523 	ret = sc8551_read_byte(sc, SC8551_REG_13, &data);
1524 	if (ret == 0) {
1525 		sc->part_no = (data & SC8551_DEV_ID_MASK);
1526 		sc->part_no >>= SC8551_DEV_ID_SHIFT;
1527 	}
1528 	return ret;
1529 }
1530 
sc8551_parse_dt(struct sc8551 * sc,struct device * dev)1531 static int sc8551_parse_dt(struct sc8551 *sc, struct device *dev)
1532 {
1533 	int ret;
1534 	struct device_node *np = dev->of_node;
1535 
1536 	sc->cfg = devm_kzalloc(dev,
1537 			       sizeof(struct sc8551_cfg),
1538 			       GFP_KERNEL);
1539 
1540 	if (!sc->cfg)
1541 		return -ENOMEM;
1542 
1543 	sc->cfg->bat_ovp_disable = of_property_read_bool(np,
1544 			"sc,sc8551,bat-ovp-disable");
1545 	sc->cfg->bat_ocp_disable = of_property_read_bool(np,
1546 			"sc,sc8551,bat-ocp-disable");
1547 	sc->cfg->bus_ocp_disable = of_property_read_bool(np,
1548 			"sc,sc8551,bus-ocp-disable");
1549 	sc->cfg->bat_therm_disable = of_property_read_bool(np,
1550 			"sc,sc8551,bat-therm-disable");
1551 	sc->cfg->bus_therm_disable = of_property_read_bool(np,
1552 			"sc,sc8551,bus-therm-disable");
1553 
1554 	ret = of_property_read_u32(np, "sc,sc8551,bat-ovp-threshold",
1555 				   &sc->cfg->bat_ovp_th);
1556 	if (ret) {
1557 		dev_err(sc->dev, "failed to read bat-ovp-threshold\n");
1558 		return ret;
1559 	}
1560 	ret = of_property_read_u32(np, "sc,sc8551,bat-ocp-threshold",
1561 				   &sc->cfg->bat_ocp_th);
1562 	if (ret) {
1563 		dev_err(sc->dev, "failed to read bat-ocp-threshold\n");
1564 		return ret;
1565 	}
1566 	ret = of_property_read_u32(np, "sc,sc8551,bus-ovp-threshold",
1567 				   &sc->cfg->bus_ovp_th);
1568 	if (ret) {
1569 		dev_err(sc->dev, "failed to read bus-ovp-threshold\n");
1570 		return ret;
1571 	}
1572 	ret = of_property_read_u32(np, "sc,sc8551,bus-ocp-threshold",
1573 				   &sc->cfg->bus_ocp_th);
1574 	if (ret) {
1575 		dev_err(sc->dev, "failed to read bus-ocp-threshold\n");
1576 		return ret;
1577 	}
1578 
1579 	ret = of_property_read_u32(np, "sc,sc8551,ac-ovp-threshold",
1580 				   &sc->cfg->ac_ovp_th);
1581 	if (ret) {
1582 		dev_err(sc->dev, "failed to read ac-ovp-threshold\n");
1583 		return ret;
1584 	}
1585 
1586 	ret = of_property_read_u32(np, "sc,sc8551,sense-resistor-mohm",
1587 				   &sc->cfg->sense_r_mohm);
1588 	if (ret) {
1589 		dev_err(sc->dev, "failed to read sense-resistor-mohm\n");
1590 		return ret;
1591 	}
1592 
1593 	return 0;
1594 }
1595 
sc8551_init_protection(struct sc8551 * sc)1596 static int sc8551_init_protection(struct sc8551 *sc)
1597 {
1598 	int ret;
1599 
1600 	ret = sc8551_enable_batovp(sc, !sc->cfg->bat_ovp_disable);
1601 	pr_debug("%s bat ovp %s\n",
1602 		sc->cfg->bat_ovp_disable ? "disable" : "enable",
1603 		!ret ? "successfully" : "failed");
1604 
1605 	ret = sc8551_enable_batocp(sc, !sc->cfg->bat_ocp_disable);
1606 	pr_debug("%s bat ocp %s\n",
1607 		sc->cfg->bat_ocp_disable ? "disable" : "enable",
1608 		!ret ? "successfully" : "failed");
1609 
1610 	ret = sc8551_enable_busocp(sc, !sc->cfg->bus_ocp_disable);
1611 	pr_debug("%s bus ocp %s\n",
1612 		sc->cfg->bus_ocp_disable ? "disable" : "enable",
1613 		!ret ? "successfully" : "failed");
1614 
1615 	ret = sc8551_enable_bat_therm(sc, !sc->cfg->bat_therm_disable);
1616 	pr_debug("%s bat therm %s\n",
1617 		sc->cfg->bat_therm_disable ? "disable" : "enable",
1618 		!ret ? "successfully" : "failed");
1619 
1620 	ret = sc8551_enable_bus_therm(sc, !sc->cfg->bus_therm_disable);
1621 	pr_debug("%s bus therm %s\n",
1622 		sc->cfg->bus_therm_disable ? "disable" : "enable",
1623 		!ret ? "successfully" : "failed");
1624 
1625 	ret = sc8551_set_batovp_th(sc, sc->cfg->bat_ovp_th);
1626 	pr_debug("set bat ovp th %d %s\n", sc->cfg->bat_ovp_th,
1627 		!ret ? "successfully" : "failed");
1628 
1629 	ret = sc8551_set_batocp_th(sc, sc->cfg->bat_ocp_th);
1630 	pr_debug("set bat ocp threshold %d %s\n", sc->cfg->bat_ocp_th,
1631 		!ret ? "successfully" : "failed");
1632 
1633 	ret = sc8551_set_busovp_th(sc, sc->cfg->bus_ovp_th);
1634 	pr_debug("set bus ovp threshold %d %s\n", sc->cfg->bus_ovp_th,
1635 		!ret ? "successfully" : "failed");
1636 
1637 	ret = sc8551_set_busocp_th(sc, sc->cfg->bus_ocp_th);
1638 	pr_debug("set bus ocp threshold %d %s\n", sc->cfg->bus_ocp_th,
1639 		!ret ? "successfully" : "failed");
1640 
1641 	ret = sc8551_set_acovp_th(sc, sc->cfg->ac_ovp_th);
1642 	pr_debug("set ac ovp threshold %d %s\n", sc->cfg->ac_ovp_th,
1643 		!ret ? "successfully" : "failed");
1644 
1645 	return 0;
1646 }
1647 
sc8551_init_adc(struct sc8551 * sc)1648 static int sc8551_init_adc(struct sc8551 *sc)
1649 {
1650 	int ret;
1651 
1652 	ret = sc8551_set_adc_scanrate(sc, false);
1653 	if (ret)
1654 		return ret;
1655 	ret = sc8551_set_adc_scan(sc, ADC_IBUS, true);
1656 	if (ret)
1657 		return ret;
1658 	ret = sc8551_set_adc_scan(sc, ADC_VBUS, true);
1659 	if (ret)
1660 		return ret;
1661 	ret = sc8551_set_adc_scan(sc, ADC_VOUT, true);
1662 	if (ret)
1663 		return ret;
1664 	ret = sc8551_set_adc_scan(sc, ADC_VBAT, true);
1665 	if (ret)
1666 		return ret;
1667 	ret = sc8551_set_adc_scan(sc, ADC_IBAT, true);
1668 	if (ret)
1669 		return ret;
1670 	ret = sc8551_set_adc_scan(sc, ADC_TBUS, true);
1671 	if (ret)
1672 		return ret;
1673 	ret = sc8551_set_adc_scan(sc, ADC_TBAT, true);
1674 	if (ret)
1675 		return ret;
1676 	ret = sc8551_set_adc_scan(sc, ADC_TDIE, true);
1677 	if (ret)
1678 		return ret;
1679 	ret = sc8551_set_adc_scan(sc, ADC_VAC, true);
1680 	if (ret)
1681 		return ret;
1682 
1683 	ret = sc8551_enable_adc(sc, true);
1684 	if (ret)
1685 		return ret;
1686 
1687 	return 0;
1688 }
1689 
sc8551_init_int_src(struct sc8551 * sc)1690 static int sc8551_init_int_src(struct sc8551 *sc)
1691 {
1692 	int ret;
1693 
1694 	/*TODO:be careful ts bus and ts bat alarm bit mask is in
1695 	 *	fault mask register.
1696 	 */
1697 	ret = sc8551_set_alarm_int_mask(sc, ADC_DONE);
1698 	if (ret)
1699 		dev_err(sc->dev, "failed to set alarm mask:%d\n", ret);
1700 
1701 	return ret;
1702 }
1703 
sc8551_init_regulation(struct sc8551 * sc)1704 static int sc8551_init_regulation(struct sc8551 *sc)
1705 {
1706 	int ret;
1707 
1708 	ret = sc8551_set_ibat_reg_th(sc, 300);
1709 	if (ret)
1710 		return ret;
1711 	ret = sc8551_set_vbat_reg_th(sc, 100);
1712 	if (ret)
1713 		return ret;
1714 
1715 	ret = sc8551_set_vdrop_deglitch(sc, 5000);
1716 	if (ret)
1717 		return ret;
1718 	ret = sc8551_set_vdrop_th(sc, 400);
1719 	if (ret)
1720 		return ret;
1721 
1722 	ret = sc8551_enable_regulation(sc, false);
1723 	if (ret)
1724 		return ret;
1725 
1726 	ret = sc8551_write_byte(sc, SC8551_REG_2E, 0x08);
1727 	if (ret)
1728 		return ret;
1729 
1730 	return 0;
1731 }
1732 
sc8551_init_device(struct sc8551 * sc)1733 static int sc8551_init_device(struct sc8551 *sc)
1734 {
1735 	int ret;
1736 
1737 	ret = sc8551_enable_wdt(sc, false);
1738 	if (ret)
1739 		return ret;
1740 	ret = sc8551_set_wdt(sc, 30000);
1741 	if (ret)
1742 		return ret;
1743 	ret = sc8551_set_ss_timeout(sc, 100000);
1744 	if (ret)
1745 		return ret;
1746 	ret = sc8551_set_sense_resistor(sc, sc->cfg->sense_r_mohm);
1747 	if (ret)
1748 		return ret;
1749 	ret = sc8551_init_protection(sc);
1750 	if (ret)
1751 		return ret;
1752 	ret = sc8551_init_adc(sc);
1753 	if (ret)
1754 		return ret;
1755 	ret = sc8551_init_int_src(sc);
1756 	if (ret)
1757 		return ret;
1758 	ret = sc8551_init_regulation(sc);
1759 	if (ret)
1760 		return ret;
1761 
1762 	return 0;
1763 }
1764 
sc8551_set_present(struct sc8551 * sc,bool present)1765 static int sc8551_set_present(struct sc8551 *sc, bool present)
1766 {
1767 	sc->usb_present = present;
1768 
1769 	if (present)
1770 		sc8551_init_device(sc);
1771 	return 0;
1772 }
1773 
registers_show(struct device * dev,struct device_attribute * attr,char * buf)1774 static ssize_t registers_show(struct device *dev,
1775 			      struct device_attribute *attr,
1776 			      char *buf)
1777 {
1778 	struct sc8551 *sc = dev_get_drvdata(dev);
1779 	u8 tmpbuf[SC8551_DEBUG_BUF_LEN];
1780 	int idx = 0;
1781 	int result;
1782 	u8 addr, val;
1783 	int len, ret;
1784 
1785 	ret = sc8551_get_adc_data(sc, ADC_VBAT, &result);
1786 	if (!ret)
1787 		sc->vbat_volt = result;
1788 
1789 	ret = sc8551_get_adc_data(sc, ADC_VAC, &result);
1790 	if (!ret)
1791 		sc->vac_volt = result;
1792 
1793 	ret = sc8551_get_adc_data(sc, ADC_VBUS, &result);
1794 	if (!ret)
1795 		sc->vbus_volt = result;
1796 
1797 	ret = sc8551_get_adc_data(sc, ADC_VOUT, &result);
1798 	if (!ret)
1799 		sc->vout_volt = result;
1800 
1801 	ret = sc8551_get_adc_data(sc, ADC_IBUS, &result);
1802 	if (!ret)
1803 		sc->ibus_curr = result;
1804 
1805 	ret = sc8551_get_adc_data(sc, ADC_TDIE, &result);
1806 	if (!ret)
1807 		sc->die_temp = result;
1808 	ret = sc8551_get_adc_data(sc, ADC_IBAT, &result);
1809 	if (!ret)
1810 		sc->ibat_curr = result;
1811 
1812 	dev_err(sc->dev, "vbus_vol %d vbat_vol(vout) %d vout %d, vac: %d\n",
1813 		sc->vbus_volt, sc->vbat_volt, sc->vout_volt, sc->vac_volt);
1814 	dev_err(sc->dev, "ibus_curr %d ibat_curr %d\n", sc->ibus_curr, sc->ibat_curr);
1815 	dev_err(sc->dev, "die_temp %d\n", sc->die_temp);
1816 
1817 	for (addr = SC8551_REG_00; addr <= SC8551_REG_36; addr++) {
1818 		ret = sc8551_read_byte(sc, addr, &val);
1819 		if (ret == 0) {
1820 			len = snprintf(tmpbuf, SC8551_DEBUG_BUF_LEN,
1821 				       "Reg[%.2X] = 0x%.2x\n",
1822 				       addr,
1823 				       val);
1824 			memcpy(&buf[idx], tmpbuf, len);
1825 			idx += len;
1826 		}
1827 	}
1828 
1829 	return idx;
1830 }
1831 
registers_store(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)1832 static ssize_t registers_store(struct device *dev,
1833 			       struct device_attribute *attr,
1834 			       const char *buf,
1835 			       size_t count)
1836 {
1837 	struct sc8551 *sc = dev_get_drvdata(dev);
1838 	unsigned int reg;
1839 	unsigned int val;
1840 	int ret;
1841 
1842 	ret = sscanf(buf, "%x %x", &reg, &val);
1843 	if ((ret == 2) && (reg >= SC8551_REG_00) && (reg <= SC8551_REG_36))
1844 		sc8551_write_byte(sc,
1845 				  (unsigned char)reg,
1846 				  (unsigned char)val);
1847 
1848 	return count;
1849 }
1850 static DEVICE_ATTR_RW(registers);
1851 
sc8551_create_device_node(struct device * dev)1852 static void sc8551_create_device_node(struct device *dev)
1853 {
1854 	device_create_file(dev, &dev_attr_registers);
1855 }
1856 
1857 static enum power_supply_property sc8551_charger_props[] = {
1858 	POWER_SUPPLY_PROP_PRESENT,
1859 	POWER_SUPPLY_PROP_CP_CHARGING_ENABLED,
1860 	POWER_SUPPLY_PROP_VOLTAGE_NOW,
1861 	POWER_SUPPLY_PROP_CURRENT_NOW,
1862 	POWER_SUPPLY_PROP_INPUT_VOLTAGE_LIMIT,
1863 	POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT,
1864 	POWER_SUPPLY_PROP_CP_DIE_TEMPERATURE,
1865 	POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX,
1866 	POWER_SUPPLY_PROP_CP_BAT_OVP_FAULT,
1867 	POWER_SUPPLY_PROP_CP_BAT_OCP_FAULT,
1868 	POWER_SUPPLY_PROP_CP_BUS_OVP_FAULT,
1869 	POWER_SUPPLY_PROP_CP_BUS_OCP_FAULT,
1870 	POWER_SUPPLY_PROP_CP_VBUS_HERROR_STATUS,
1871 	POWER_SUPPLY_PROP_CP_VBUS_LERROR_STATUS,
1872 };
1873 
sc8551_charger_get_property(struct power_supply * psy,enum power_supply_property psp,union power_supply_propval * val)1874 static int sc8551_charger_get_property(struct power_supply *psy,
1875 				       enum power_supply_property psp,
1876 				       union power_supply_propval *val)
1877 {
1878 	struct sc8551 *sc = power_supply_get_drvdata(psy);
1879 	int result;
1880 	int ret;
1881 
1882 	sc8551_check_alarm_status(sc);
1883 	sc8551_check_fault_status(sc);
1884 	sc8551_check_vbus_error_status(sc);
1885 	switch (psp) {
1886 	case POWER_SUPPLY_PROP_CP_CHARGING_ENABLED:
1887 		sc8551_check_charge_enabled(sc, &sc->charge_enabled);
1888 		val->intval = sc->charge_enabled;
1889 		break;
1890 	case POWER_SUPPLY_PROP_PRESENT:
1891 		val->intval = sc->usb_present;
1892 		break;
1893 	case POWER_SUPPLY_PROP_VOLTAGE_NOW:
1894 		ret = sc8551_get_adc_data(sc, ADC_VBAT, &result);
1895 		if (!ret)
1896 			sc->vbat_volt = result;
1897 		val->intval = sc->vbat_volt * 1000;
1898 		break;
1899 	case POWER_SUPPLY_PROP_CURRENT_NOW:
1900 		ret = sc8551_get_adc_data(sc, ADC_IBAT, &result);
1901 		if (!ret)
1902 			sc->ibat_curr = result;
1903 		val->intval = sc->ibat_curr * 1000;
1904 		break;
1905 	case POWER_SUPPLY_PROP_CP_VBUS: /* BUS_VOLTAGE */
1906 		ret = sc8551_get_adc_data(sc, ADC_VBUS, &result);
1907 		if (!ret)
1908 			sc->vbus_volt = result;
1909 		val->intval = sc->vbus_volt * 1000;
1910 		break;
1911 	case POWER_SUPPLY_PROP_CP_IBUS: /* BUS_CURRENT */
1912 		ret = sc8551_get_adc_data(sc, ADC_IBUS, &result);
1913 		if (!ret)
1914 			sc->ibus_curr = result;
1915 		val->intval = sc->ibus_curr * 1000;
1916 		break;
1917 	case POWER_SUPPLY_PROP_INPUT_VOLTAGE_LIMIT: /* BUS_VOLTAGE */
1918 		val->intval =  12000 * 1000; /* 20V */
1919 		break;
1920 	case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT: /* BUS_CURRENT */
1921 		val->intval =  4500 * 1000; /* 4.75A */
1922 		break;
1923 	case POWER_SUPPLY_PROP_CP_DIE_TEMPERATURE:/* DIE_TEMPERATURE */
1924 		ret = sc8551_get_adc_data(sc, ADC_TDIE, &result);
1925 		if (!ret)
1926 			sc->die_temp = result;
1927 		val->intval = sc->die_temp;
1928 		break;
1929 	case POWER_SUPPLY_PROP_VOLTAGE_MAX:
1930 		val->intval = 4300 * 1000;
1931 		break;
1932 	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX:
1933 		val->intval = 8000 * 1000;
1934 		break;
1935 
1936 	case POWER_SUPPLY_PROP_CP_BAT_OVP_FAULT:
1937 		val->intval = sc->bat_ovp_fault;
1938 		break;
1939 	case POWER_SUPPLY_PROP_CP_BAT_OCP_FAULT:
1940 		val->intval = sc->bat_ocp_fault;
1941 		break;
1942 	case POWER_SUPPLY_PROP_CP_BUS_OVP_FAULT:
1943 		val->intval = sc->bus_ovp_fault;
1944 		break;
1945 	case POWER_SUPPLY_PROP_CP_BUS_OCP_FAULT:
1946 		val->intval = sc->bus_ocp_fault;
1947 		break;
1948 	case POWER_SUPPLY_PROP_CP_VBUS_HERROR_STATUS:
1949 		val->intval = (sc->vbus_error >> 0x04) & 0x01;
1950 		break;
1951 	case POWER_SUPPLY_PROP_CP_VBUS_LERROR_STATUS:
1952 		val->intval = (sc->vbus_error >> 0x05) & 0x01;
1953 		break;
1954 	default:
1955 		return -EINVAL;
1956 	}
1957 	return 0;
1958 }
1959 
sc8551_charger_set_property(struct power_supply * psy,enum power_supply_property prop,const union power_supply_propval * val)1960 static int sc8551_charger_set_property(struct power_supply *psy,
1961 				       enum power_supply_property prop,
1962 				       const union power_supply_propval *val)
1963 {
1964 	struct sc8551 *sc = power_supply_get_drvdata(psy);
1965 
1966 	switch (prop) {
1967 	case POWER_SUPPLY_PROP_CP_CHARGING_ENABLED:
1968 		sc8551_enable_charge(sc, val->intval);
1969 		if (val->intval)
1970 			sc8551_enable_wdt(sc, true);
1971 		else
1972 			sc8551_enable_wdt(sc, false);
1973 		sc8551_check_charge_enabled(sc, &sc->charge_enabled);
1974 		break;
1975 	case POWER_SUPPLY_PROP_PRESENT:
1976 		sc8551_set_present(sc, !!val->intval);
1977 		break;
1978 	default:
1979 		return -EINVAL;
1980 	}
1981 
1982 	return 0;
1983 }
1984 
sc8551_charger_is_writeable(struct power_supply * psy,enum power_supply_property prop)1985 static int sc8551_charger_is_writeable(struct power_supply *psy,
1986 				       enum power_supply_property prop)
1987 {
1988 	int ret;
1989 
1990 	switch (prop) {
1991 	case POWER_SUPPLY_PROP_ONLINE:
1992 		ret = 1;
1993 		break;
1994 	default:
1995 		ret = 0;
1996 		break;
1997 	}
1998 	return ret;
1999 }
2000 
sc8551_psy_register(struct sc8551 * sc)2001 static int sc8551_psy_register(struct sc8551 *sc)
2002 {
2003 	sc->psy_cfg.drv_data = sc;
2004 	sc->psy_cfg.of_node = sc->dev->of_node;
2005 
2006 	sc->psy_desc.name = "sc8551-standalone";
2007 
2008 	sc->psy_desc.type = POWER_SUPPLY_TYPE_USB_PD;
2009 	sc->psy_desc.properties = sc8551_charger_props;
2010 	sc->psy_desc.num_properties = ARRAY_SIZE(sc8551_charger_props);
2011 	sc->psy_desc.get_property = sc8551_charger_get_property;
2012 	sc->psy_desc.set_property = sc8551_charger_set_property;
2013 	sc->psy_desc.property_is_writeable = sc8551_charger_is_writeable;
2014 
2015 	sc->fc2_psy = devm_power_supply_register(sc->dev,
2016 						 &sc->psy_desc,
2017 						 &sc->psy_cfg);
2018 	if (IS_ERR(sc->fc2_psy)) {
2019 		dev_err(sc->dev, "failed to register fc2_psy\n");
2020 		return PTR_ERR(sc->fc2_psy);
2021 	}
2022 
2023 	return 0;
2024 }
2025 
2026 /*
2027  * interrupt does nothing, just info event change, other module could get info
2028  * through power supply interface
2029  */
sc8551_charger_interrupt(int irq,void * dev_id)2030 static irqreturn_t sc8551_charger_interrupt(int irq, void *dev_id)
2031 {
2032 	struct sc8551 *sc = dev_id;
2033 	int ret, value;
2034 
2035 	ret = sc8551_get_adc_data(sc, ADC_VOUT, &value);
2036 	if (!ret)
2037 		sc->vbat_volt = value;
2038 
2039 	ret = sc8551_get_adc_data(sc, ADC_IBAT, &value);
2040 	if (!ret)
2041 		sc->ibat_curr = value;
2042 
2043 	ret = sc8551_get_adc_data(sc, ADC_VBUS, &value);
2044 	if (!ret)
2045 		sc->vbus_volt = value;
2046 
2047 	ret = sc8551_get_adc_data(sc, ADC_IBUS, &value);
2048 	if (!ret)
2049 		sc->ibus_curr = value;
2050 
2051 	ret = sc8551_get_adc_data(sc, ADC_TDIE, &value);
2052 	if (!ret)
2053 		sc->die_temp = value;
2054 	ret = sc8551_get_adc_data(sc, ADC_IBAT, &value);
2055 	if (!ret)
2056 		sc->ibat_curr = value;
2057 
2058 	sc8551_check_alarm_status(sc);
2059 	sc8551_check_fault_status(sc);
2060 	sc8551_check_vbus_error_status(sc);
2061 	power_supply_changed(sc->fc2_psy);
2062 
2063 	return IRQ_HANDLED;
2064 }
2065 
sc8551_init_irq(struct sc8551 * sc)2066 static int sc8551_init_irq(struct sc8551 *sc)
2067 {
2068 	int ret;
2069 
2070 	sc->irq = sc->client->irq;
2071 	if (sc->irq <= 0) {
2072 		dev_err(sc->dev, "irq mapping fail\n");
2073 		return 0;
2074 	}
2075 
2076 	ret = devm_request_threaded_irq(sc->dev,
2077 					sc->irq,
2078 					NULL,
2079 					sc8551_charger_interrupt,
2080 					IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
2081 					"sc8551 standalone irq",
2082 					sc);
2083 	if (ret < 0)
2084 		dev_err(sc->dev, "request irq for irq=%d failed, ret =%d\n",
2085 			sc->irq, ret);
2086 
2087 	enable_irq_wake(sc->irq);
2088 	device_init_wakeup(sc->dev, 1);
2089 
2090 	return 0;
2091 }
2092 
determine_initial_status(struct sc8551 * sc)2093 static void determine_initial_status(struct sc8551 *sc)
2094 {
2095 	if (sc->client->irq)
2096 		sc8551_charger_interrupt(sc->client->irq, sc);
2097 }
2098 
2099 static const struct of_device_id sc8551_charger_match[] = {
2100 	{ .compatible = "sc,sc8551-standalone", },
2101 	{},
2102 };
2103 
sc8551_charger_probe(struct i2c_client * client,const struct i2c_device_id * id)2104 static int sc8551_charger_probe(struct i2c_client *client,
2105 				const struct i2c_device_id *id)
2106 {
2107 	struct sc8551 *sc;
2108 	const struct of_device_id *match;
2109 	struct device_node *node = client->dev.of_node;
2110 	int ret;
2111 
2112 	sc = devm_kzalloc(&client->dev, sizeof(struct sc8551), GFP_KERNEL);
2113 	if (!sc)
2114 		return -ENOMEM;
2115 
2116 	sc->dev = &client->dev;
2117 
2118 	sc->client = client;
2119 
2120 	mutex_init(&sc->i2c_rw_lock);
2121 	mutex_init(&sc->data_lock);
2122 
2123 	ret = sc8551_detect_device(sc);
2124 	if (ret) {
2125 		dev_err(sc->dev, "No sc8551 device found!\n");
2126 		return -ENODEV;
2127 	}
2128 
2129 	i2c_set_clientdata(client, sc);
2130 
2131 	match = of_match_node(sc8551_charger_match, node);
2132 	if (match == NULL) {
2133 		dev_err(sc->dev, "device tree match not found!\n");
2134 		return -ENODEV;
2135 	}
2136 	sc8551_get_work_mode(sc, &sc->mode);
2137 	if (sc->mode !=  SC8551_ROLE_STDALONE) {
2138 		dev_err(sc->dev, "device operation mode mismatch with dts configuration\n");
2139 		return -EINVAL;
2140 	}
2141 
2142 	ret = sc8551_parse_dt(sc, &client->dev);
2143 	if (ret)
2144 		return -EIO;
2145 
2146 	ret = sc8551_init_device(sc);
2147 	if (ret) {
2148 		dev_err(sc->dev, "Failed to init device\n");
2149 		return ret;
2150 	}
2151 
2152 	ret = sc8551_psy_register(sc);
2153 	if (ret)
2154 		return ret;
2155 
2156 	ret = sc8551_init_irq(sc);
2157 	if (ret)
2158 		goto err_1;
2159 
2160 	determine_initial_status(sc);
2161 	sc8551_create_device_node(&(client->dev));
2162 
2163 	return 0;
2164 
2165 err_1:
2166 	power_supply_unregister(sc->fc2_psy);
2167 	return ret;
2168 }
2169 
sc8551_charger_remove(struct i2c_client * client)2170 static int sc8551_charger_remove(struct i2c_client *client)
2171 {
2172 	struct sc8551 *sc = i2c_get_clientdata(client);
2173 
2174 
2175 	sc8551_enable_adc(sc, false);
2176 
2177 	power_supply_unregister(sc->fc2_psy);
2178 
2179 	mutex_destroy(&sc->data_lock);
2180 	mutex_destroy(&sc->i2c_rw_lock);
2181 
2182 	return 0;
2183 }
2184 
sc8551_charger_shutdown(struct i2c_client * client)2185 static void sc8551_charger_shutdown(struct i2c_client *client)
2186 {
2187 	struct sc8551 *sc = i2c_get_clientdata(client);
2188 
2189 	sc8551_enable_adc(sc, false);
2190 }
2191 
2192 static const struct i2c_device_id sc8551_charger_id[] = {
2193 	{"sc8551-standalone", SC8551_ROLE_STDALONE},
2194 	{},
2195 };
2196 
2197 static struct i2c_driver sc8551_charger_driver = {
2198 	.driver		= {
2199 		.name	= "sc8551-charger",
2200 		.owner	= THIS_MODULE,
2201 		.of_match_table = sc8551_charger_match,
2202 	},
2203 	.id_table	= sc8551_charger_id,
2204 
2205 	.probe		= sc8551_charger_probe,
2206 	.remove		= sc8551_charger_remove,
2207 	.shutdown	= sc8551_charger_shutdown,
2208 };
2209 
2210 module_i2c_driver(sc8551_charger_driver);
2211 
2212 MODULE_AUTHOR("Xu Shengfei <xsf@rock-chips.com>");
2213 MODULE_DESCRIPTION("SC SC8551 Charge Pump Driver");
2214 MODULE_LICENSE("GPL");
2215 
2216