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", ®, &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