xref: /OK3568_Linux_fs/kernel/drivers/power/supply/rk818_battery.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 /*
2  * rk818 battery driver
3  *
4  * Copyright (C) 2016 Rockchip Electronics Co., Ltd
5  * chenjh <chenjh@rock-chips.com>
6  *
7  * This program is free software; you can redistribute it and/or modify it
8  * under the terms and conditions of the GNU General Public License,
9  * version 2, as published by the Free Software Foundation.
10  *
11  * This program is distributed in the hope it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
14  * more details.
15  *
16  */
17 
18 #include <linux/delay.h>
19 #include <linux/fb.h>
20 #include <linux/gpio.h>
21 #include <linux/iio/consumer.h>
22 #include <linux/iio/iio.h>
23 #include <linux/irq.h>
24 #include <linux/irqdomain.h>
25 #include <linux/jiffies.h>
26 #include <linux/mfd/rk808.h>
27 #include <linux/module.h>
28 #include <linux/of_device.h>
29 #include <linux/of_gpio.h>
30 #include <linux/platform_device.h>
31 #include <linux/power_supply.h>
32 #include <linux/power/rk_usbbc.h>
33 #include <linux/regmap.h>
34 #include <linux/rk_keys.h>
35 #include <linux/rtc.h>
36 #include <linux/timer.h>
37 #include <linux/wakelock.h>
38 #include <linux/workqueue.h>
39 #include "rk818_battery.h"
40 
41 static int dbg_enable = 0;
42 module_param_named(dbg_level, dbg_enable, int, 0644);
43 
44 #define DBG(args...) \
45 	do { \
46 		if (dbg_enable) { \
47 			pr_info(args); \
48 		} \
49 	} while (0)
50 
51 #define BAT_INFO(fmt, args...) pr_info("rk818-bat: "fmt, ##args)
52 
53 /* default param */
54 #define DEFAULT_BAT_RES			135
55 #define DEFAULT_SLP_ENTER_CUR		300
56 #define DEFAULT_SLP_EXIT_CUR		300
57 #define DEFAULT_SLP_FILTER_CUR		100
58 #define DEFAULT_PWROFF_VOL_THRESD	3400
59 #define DEFAULT_MONITOR_SEC		5
60 #define DEFAULT_ALGR_VOL_THRESD1	3850
61 #define DEFAULT_ALGR_VOL_THRESD2	3950
62 #define DEFAULT_MAX_SOC_OFFSET		60
63 #define DEFAULT_FB_TEMP			TEMP_105C
64 #define DEFAULT_ZERO_RESERVE_DSOC	10
65 #define DEFAULT_POFFSET			42
66 #define DEFAULT_COFFSET			0x832
67 #define DEFAULT_SAMPLE_RES		20
68 #define DEFAULT_ENERGY_MODE		0
69 #define INVALID_COFFSET_MIN		0x780
70 #define INVALID_COFFSET_MAX		0x980
71 #define INVALID_VOL_THRESD		2500
72 
73 /* sample resistor and division */
74 #define SAMPLE_RES_10MR			10
75 #define SAMPLE_RES_20MR			20
76 #define SAMPLE_RES_DIV1			1
77 #define SAMPLE_RES_DIV2			2
78 
79 /* virtual params */
80 #define VIRTUAL_CURRENT			1000
81 #define VIRTUAL_VOLTAGE			3888
82 #define VIRTUAL_SOC			66
83 #define VIRTUAL_PRESET			1
84 #define VIRTUAL_TEMPERATURE		188
85 #define VIRTUAL_STATUS			POWER_SUPPLY_STATUS_CHARGING
86 
87 /* charge */
88 #define FINISH_CHRG_CUR1			1000
89 #define FINISH_CHRG_CUR2		1500
90 #define FINISH_MAX_SOC_DELAY		20
91 #define TERM_CHRG_DSOC			88
92 #define TERM_CHRG_CURR			600
93 #define TERM_CHRG_K			650
94 #define SIMULATE_CHRG_INTV		8
95 #define SIMULATE_CHRG_CURR		400
96 #define SIMULATE_CHRG_K			1500
97 #define FULL_CHRG_K			400
98 
99 /* zero algorithm */
100 #define PWROFF_THRESD			3400
101 #define MIN_ZERO_DSOC_ACCURACY		10	/*0.01%*/
102 #define MIN_ZERO_OVERCNT		100
103 #define MIN_ACCURACY			1
104 #define DEF_PWRPATH_RES			50
105 #define	WAIT_DSOC_DROP_SEC		15
106 #define	WAIT_SHTD_DROP_SEC		30
107 #define ZERO_GAP_XSOC1			10
108 #define ZERO_GAP_XSOC2			5
109 #define ZERO_GAP_XSOC3			3
110 #define ZERO_LOAD_LVL1			1400
111 #define ZERO_LOAD_LVL2			600
112 #define ZERO_GAP_CALIB			5
113 
114 #define ADC_CALIB_THRESHOLD		4
115 #define ADC_CALIB_LMT_MIN		3
116 #define ADC_CALIB_CNT			5
117 #define NTC_CALC_FACTOR			7
118 
119 /* time */
120 #define	POWER_ON_SEC_BASE		1
121 #define MINUTE(x)			((x) * 60)
122 
123 /* sleep */
124 #define SLP_CURR_MAX			40
125 #define SLP_CURR_MIN			6
126 #define DISCHRG_TIME_STEP1		MINUTE(10)
127 #define DISCHRG_TIME_STEP2		MINUTE(60)
128 #define SLP_DSOC_VOL_THRESD		3600
129 #define REBOOT_PERIOD_SEC		180
130 #define REBOOT_MAX_CNT			80
131 
132 /* fcc */
133 #define MIN_FCC				500
134 
135 /* TS detect battery temperature */
136 #define ADC_CUR_MSK			0x03
137 #define ADC_CUR_20UA			0x00
138 #define ADC_CUR_40UA			0x01
139 #define ADC_CUR_60UA			0x02
140 #define ADC_CUR_80UA			0x03
141 
142 #define NTC_CALC_FACTOR_80UA		7
143 #define NTC_CALC_FACTOR_60UA		9
144 #define NTC_CALC_FACTOR_40UA		13
145 #define NTC_CALC_FACTOR_20UA		27
146 #define NTC_80UA_MAX_MEASURE		27500
147 #define NTC_60UA_MAX_MEASURE		36666
148 #define NTC_40UA_MAX_MEASURE		55000
149 #define NTC_20UA_MAX_MEASURE		110000
150 
151 #define INPUT_CUR80MA			(0x01)
152 
153 static const char *bat_status[] = {
154 	"charge off", "dead charge", "trickle charge", "cc cv",
155 	"finish", "usb over vol", "bat temp error", "timer error",
156 };
157 
158 struct rk818_battery {
159 	struct platform_device		*pdev;
160 	struct rk808			*rk818;
161 	struct regmap			*regmap;
162 	struct device			*dev;
163 	struct power_supply		*bat;
164 	struct power_supply		*usb_psy;
165 	struct power_supply		*ac_psy;
166 	struct battery_platform_data	*pdata;
167 	struct workqueue_struct		*bat_monitor_wq;
168 	struct delayed_work		bat_delay_work;
169 	struct delayed_work		calib_delay_work;
170 	struct wake_lock		wake_lock;
171 	struct notifier_block           fb_nb;
172 	struct timer_list		caltimer;
173 	time64_t			rtc_base;
174 	int				bat_res;
175 	int				chrg_status;
176 	bool				is_initialized;
177 	bool				is_first_power_on;
178 	u8				res_div;
179 	int				current_max;
180 	int				voltage_max;
181 	int				current_avg;
182 	int				voltage_avg;
183 	int				voltage_ocv;
184 	int				voltage_relax;
185 	int				voltage_k;
186 	int				voltage_b;
187 	int				remain_cap;
188 	int				design_cap;
189 	int				nac;
190 	int				fcc;
191 	int				qmax;
192 	int				dsoc;
193 	int				rsoc;
194 	int				poffset;
195 	int				age_ocv_soc;
196 	bool				age_allow_update;
197 	int				age_level;
198 	int				age_ocv_cap;
199 	int				age_voltage;
200 	int				age_adjust_cap;
201 	unsigned long			age_keep_sec;
202 	int				zero_timeout_cnt;
203 	int				zero_remain_cap;
204 	int				zero_dsoc;
205 	int				zero_linek;
206 	u64				zero_drop_sec;
207 	u64				shtd_drop_sec;
208 	int				sm_remain_cap;
209 	int				sm_linek;
210 	int				sm_chrg_dsoc;
211 	int				sm_dischrg_dsoc;
212 	int				algo_rest_val;
213 	int				algo_rest_mode;
214 	int				sleep_sum_cap;
215 	int				sleep_remain_cap;
216 	unsigned long			sleep_dischrg_sec;
217 	unsigned long			sleep_sum_sec;
218 	bool				sleep_chrg_online;
219 	u8				sleep_chrg_status;
220 	bool				adc_allow_update;
221 	int                             fb_blank;
222 	bool				s2r; /*suspend to resume*/
223 	u32				work_mode;
224 	int				temperature;
225 	u32				monitor_ms;
226 	u32				pwroff_min;
227 	u32				adc_calib_cnt;
228 	unsigned long			finish_base;
229 	unsigned long			boot_base;
230 	unsigned long			flat_match_sec;
231 	unsigned long			plug_in_base;
232 	unsigned long			plug_out_base;
233 	u8				halt_cnt;
234 	bool				is_halt;
235 	bool				is_max_soc_offset;
236 	bool				is_sw_reset;
237 	bool				is_ocv_calib;
238 	bool				is_first_on;
239 	bool				is_force_calib;
240 	int				last_dsoc;
241 	int				ocv_pre_dsoc;
242 	int				ocv_new_dsoc;
243 	int				max_pre_dsoc;
244 	int				max_new_dsoc;
245 	int				force_pre_dsoc;
246 	int				force_new_dsoc;
247 	int				dbg_cap_low0;
248 	int				dbg_pwr_dsoc;
249 	int				dbg_pwr_rsoc;
250 	int				dbg_pwr_vol;
251 	int				dbg_chrg_min[10];
252 	int				dbg_meet_soc;
253 	int				dbg_calc_dsoc;
254 	int				dbg_calc_rsoc;
255 	u8				ac_in;
256 	u8				usb_in;
257 	int				is_charging;
258 	unsigned long			charge_count;
259 };
260 
261 #define DIV(x)	((x) ? (x) : 1)
262 
get_boot_sec(void)263 static u64 get_boot_sec(void)
264 {
265 	struct timespec64 ts;
266 
267 	ktime_get_boottime_ts64(&ts);
268 
269 	return ts.tv_sec;
270 }
271 
base2sec(unsigned long x)272 static unsigned long base2sec(unsigned long x)
273 {
274 	if (x)
275 		return (get_boot_sec() > x) ? (get_boot_sec() - x) : 0;
276 	else
277 		return 0;
278 }
279 
base2min(unsigned long x)280 static unsigned long base2min(unsigned long x)
281 {
282 	return base2sec(x) / 60;
283 }
284 
interpolate(int value,u32 * table,int size)285 static u32 interpolate(int value, u32 *table, int size)
286 {
287 	u8 i;
288 	u16 d;
289 
290 	for (i = 0; i < size; i++) {
291 		if (value < table[i])
292 			break;
293 	}
294 
295 	if ((i > 0) && (i < size)) {
296 		d = (value - table[i - 1]) * (MAX_INTERPOLATE / (size - 1));
297 		d /= table[i] - table[i - 1];
298 		d = d + (i - 1) * (MAX_INTERPOLATE / (size - 1));
299 	} else {
300 		d = i * ((MAX_INTERPOLATE + size / 2) / size);
301 	}
302 
303 	if (d > 1000)
304 		d = 1000;
305 
306 	return d;
307 }
308 
309 /* (a*b)/c */
ab_div_c(u32 a,u32 b,u32 c)310 static int32_t ab_div_c(u32 a, u32 b, u32 c)
311 {
312 	bool sign;
313 	u32 ans = MAX_INT;
314 	int tmp;
315 
316 	sign = ((((a ^ b) ^ c) & 0x80000000) != 0);
317 	if (c != 0) {
318 		if (sign)
319 			c = -c;
320 		tmp = (a * b + (c >> 1)) / c;
321 		if (tmp < MAX_INT)
322 			ans = tmp;
323 	}
324 
325 	if (sign)
326 		ans = -ans;
327 
328 	return ans;
329 }
330 
rk818_bat_read(struct rk818_battery * di,u8 reg)331 static int rk818_bat_read(struct rk818_battery *di, u8 reg)
332 {
333 	int ret, val;
334 
335 	ret = regmap_read(di->regmap, reg, &val);
336 	if (ret)
337 		dev_err(di->dev, "read reg:0x%x failed\n", reg);
338 
339 	return val;
340 }
341 
rk818_bat_write(struct rk818_battery * di,u8 reg,u8 buf)342 static int rk818_bat_write(struct rk818_battery *di, u8 reg, u8 buf)
343 {
344 	int ret;
345 
346 	ret = regmap_write(di->regmap, reg, buf);
347 	if (ret)
348 		dev_err(di->dev, "i2c write reg: 0x%2x error\n", reg);
349 
350 	return ret;
351 }
352 
rk818_bat_set_bits(struct rk818_battery * di,u8 reg,u8 mask,u8 buf)353 static int rk818_bat_set_bits(struct rk818_battery *di, u8 reg, u8 mask, u8 buf)
354 {
355 	int ret;
356 
357 	ret = regmap_update_bits(di->regmap, reg, mask, buf);
358 	if (ret)
359 		dev_err(di->dev, "write reg:0x%x failed\n", reg);
360 
361 	return ret;
362 }
363 
rk818_bat_clear_bits(struct rk818_battery * di,u8 reg,u8 mask)364 static int rk818_bat_clear_bits(struct rk818_battery *di, u8 reg, u8 mask)
365 {
366 	int ret;
367 
368 	ret = regmap_update_bits(di->regmap, reg, mask, 0);
369 	if (ret)
370 		dev_err(di->dev, "clr reg:0x%02x failed\n", reg);
371 
372 	return ret;
373 }
374 
rk818_bat_dump_regs(struct rk818_battery * di,u8 start,u8 end)375 static void rk818_bat_dump_regs(struct rk818_battery *di, u8 start, u8 end)
376 {
377 	int i;
378 
379 	if (!dbg_enable)
380 		return;
381 
382 	DBG("dump regs from: 0x%x-->0x%x\n", start, end);
383 	for (i = start; i < end; i++)
384 		DBG("0x%x: 0x%0x\n", i, rk818_bat_read(di, i));
385 }
386 
rk818_bat_chrg_online(struct rk818_battery * di)387 static bool rk818_bat_chrg_online(struct rk818_battery *di)
388 {
389 	u8 buf;
390 
391 	buf = rk818_bat_read(di, RK818_VB_MON_REG);
392 
393 	return (buf & PLUG_IN_STS) ? true : false;
394 }
395 
rk818_bat_get_coulomb_cap(struct rk818_battery * di)396 static int rk818_bat_get_coulomb_cap(struct rk818_battery *di)
397 {
398 	int val = 0;
399 
400 	val |= rk818_bat_read(di, RK818_GASCNT3_REG) << 24;
401 	val |= rk818_bat_read(di, RK818_GASCNT2_REG) << 16;
402 	val |= rk818_bat_read(di, RK818_GASCNT1_REG) << 8;
403 	val |= rk818_bat_read(di, RK818_GASCNT0_REG) << 0;
404 
405 	return (val / 2390) * di->res_div;
406 }
407 
rk818_bat_get_rsoc(struct rk818_battery * di)408 static int rk818_bat_get_rsoc(struct rk818_battery *di)
409 {
410 	int remain_cap;
411 
412 	remain_cap = rk818_bat_get_coulomb_cap(di);
413 	return (remain_cap + di->fcc / 200) * 100 / DIV(di->fcc);
414 }
415 
bat_info_store(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)416 static ssize_t bat_info_store(struct device *dev, struct device_attribute *attr,
417 			      const char *buf, size_t count)
418 {
419 	char cmd;
420 	struct rk818_battery *di = dev_get_drvdata(dev);
421 
422 	sscanf(buf, "%c", &cmd);
423 
424 	if (cmd == 'n')
425 		rk818_bat_set_bits(di, RK818_MISC_MARK_REG,
426 				   FG_RESET_NOW, FG_RESET_NOW);
427 	else if (cmd == 'm')
428 		rk818_bat_set_bits(di, RK818_MISC_MARK_REG,
429 				   FG_RESET_LATE, FG_RESET_LATE);
430 	else if (cmd == 'c')
431 		rk818_bat_clear_bits(di, RK818_MISC_MARK_REG,
432 				     FG_RESET_LATE | FG_RESET_NOW);
433 	else if (cmd == 'r')
434 		BAT_INFO("0x%2x\n", rk818_bat_read(di, RK818_MISC_MARK_REG));
435 	else
436 		BAT_INFO("command error\n");
437 
438 	return count;
439 }
440 
441 static struct device_attribute rk818_bat_attr[] = {
442 	__ATTR(bat, 0664, NULL, bat_info_store),
443 };
444 
rk818_bat_enable_gauge(struct rk818_battery * di)445 static void rk818_bat_enable_gauge(struct rk818_battery *di)
446 {
447 	u8 buf;
448 
449 	buf = rk818_bat_read(di, RK818_TS_CTRL_REG);
450 	buf |= GG_EN;
451 	rk818_bat_write(di, RK818_TS_CTRL_REG, buf);
452 }
453 
rk818_bat_save_age_level(struct rk818_battery * di,u8 level)454 static void rk818_bat_save_age_level(struct rk818_battery *di, u8 level)
455 {
456 	rk818_bat_write(di, RK818_UPDAT_LEVE_REG, level);
457 }
458 
rk818_bat_get_age_level(struct rk818_battery * di)459 static u8 rk818_bat_get_age_level(struct  rk818_battery *di)
460 {
461 	return rk818_bat_read(di, RK818_UPDAT_LEVE_REG);
462 }
463 
rk818_bat_get_vcalib0(struct rk818_battery * di)464 static int rk818_bat_get_vcalib0(struct rk818_battery *di)
465 {
466 	int val = 0;
467 
468 	val |= rk818_bat_read(di, RK818_VCALIB0_REGL) << 0;
469 	val |= rk818_bat_read(di, RK818_VCALIB0_REGH) << 8;
470 
471 	DBG("<%s>. voffset0: 0x%x\n", __func__, val);
472 	return val;
473 }
474 
rk818_bat_get_vcalib1(struct rk818_battery * di)475 static int rk818_bat_get_vcalib1(struct rk818_battery *di)
476 {
477 	int val = 0;
478 
479 	val |= rk818_bat_read(di, RK818_VCALIB1_REGL) << 0;
480 	val |= rk818_bat_read(di, RK818_VCALIB1_REGH) << 8;
481 
482 	DBG("<%s>. voffset1: 0x%x\n", __func__, val);
483 	return val;
484 }
485 
rk818_bat_get_ioffset(struct rk818_battery * di)486 static int rk818_bat_get_ioffset(struct rk818_battery *di)
487 {
488 	int val = 0;
489 
490 	val |= rk818_bat_read(di, RK818_IOFFSET_REGL) << 0;
491 	val |= rk818_bat_read(di, RK818_IOFFSET_REGH) << 8;
492 
493 	DBG("<%s>. ioffset: 0x%x\n", __func__, val);
494 	return val;
495 }
496 
rk818_bat_get_coffset(struct rk818_battery * di)497 static int rk818_bat_get_coffset(struct rk818_battery *di)
498 {
499 	int val = 0;
500 
501 	val |= rk818_bat_read(di, RK818_CAL_OFFSET_REGL) << 0;
502 	val |= rk818_bat_read(di, RK818_CAL_OFFSET_REGH) << 8;
503 
504 	DBG("<%s>. coffset: 0x%x\n", __func__, val);
505 	return val;
506 }
507 
rk818_bat_set_coffset(struct rk818_battery * di,int val)508 static void rk818_bat_set_coffset(struct rk818_battery *di, int val)
509 {
510 	u8 buf;
511 
512 	if ((val < INVALID_COFFSET_MIN) || (val > INVALID_COFFSET_MAX)) {
513 		BAT_INFO("set invalid coffset=0x%x\n", val);
514 		return;
515 	}
516 
517 	buf = (val >> 8) & 0xff;
518 	rk818_bat_write(di, RK818_CAL_OFFSET_REGH, buf);
519 	buf = (val >> 0) & 0xff;
520 	rk818_bat_write(di, RK818_CAL_OFFSET_REGL, buf);
521 	DBG("<%s>. coffset: 0x%x\n", __func__, val);
522 }
523 
rk818_bat_init_voltage_kb(struct rk818_battery * di)524 static void rk818_bat_init_voltage_kb(struct rk818_battery *di)
525 {
526 	int vcalib0, vcalib1;
527 
528 	vcalib0 = rk818_bat_get_vcalib0(di);
529 	vcalib1 = rk818_bat_get_vcalib1(di);
530 	di->voltage_k = (4200 - 3000) * 1000 / DIV(vcalib1 - vcalib0);
531 	di->voltage_b = 4200 - (di->voltage_k * vcalib1) / 1000;
532 
533 	DBG("voltage_k=%d(*1000),voltage_b=%d\n", di->voltage_k, di->voltage_b);
534 }
535 
rk818_bat_get_ocv_voltage(struct rk818_battery * di)536 static int rk818_bat_get_ocv_voltage(struct rk818_battery *di)
537 {
538 	int vol, val = 0;
539 
540 	val |= rk818_bat_read(di, RK818_BAT_OCV_REGL) << 0;
541 	val |= rk818_bat_read(di, RK818_BAT_OCV_REGH) << 8;
542 
543 	vol = di->voltage_k * val / 1000 + di->voltage_b;
544 
545 	return vol;
546 }
547 
rk818_bat_get_avg_voltage(struct rk818_battery * di)548 static int rk818_bat_get_avg_voltage(struct rk818_battery *di)
549 {
550 	int vol, val = 0;
551 
552 	val |= rk818_bat_read(di, RK818_BAT_VOL_REGL) << 0;
553 	val |= rk818_bat_read(di, RK818_BAT_VOL_REGH) << 8;
554 
555 	vol = di->voltage_k * val / 1000 + di->voltage_b;
556 
557 	return vol;
558 }
559 
is_rk818_bat_relax_mode(struct rk818_battery * di)560 static bool is_rk818_bat_relax_mode(struct rk818_battery *di)
561 {
562 	u8 status;
563 
564 	status = rk818_bat_read(di, RK818_GGSTS_REG);
565 	if (!(status & RELAX_VOL1_UPD) || !(status & RELAX_VOL2_UPD))
566 		return false;
567 	else
568 		return true;
569 }
570 
rk818_bat_get_relax_vol1(struct rk818_battery * di)571 static u16 rk818_bat_get_relax_vol1(struct rk818_battery *di)
572 {
573 	u16 vol, val = 0;
574 
575 	val |= rk818_bat_read(di, RK818_RELAX_VOL1_REGL) << 0;
576 	val |= rk818_bat_read(di, RK818_RELAX_VOL1_REGH) << 8;
577 	vol = di->voltage_k * val / 1000 + di->voltage_b;
578 
579 	return vol;
580 }
581 
rk818_bat_get_relax_vol2(struct rk818_battery * di)582 static u16 rk818_bat_get_relax_vol2(struct rk818_battery *di)
583 {
584 	u16 vol, val = 0;
585 
586 	val |= rk818_bat_read(di, RK818_RELAX_VOL2_REGL) << 0;
587 	val |= rk818_bat_read(di, RK818_RELAX_VOL2_REGH) << 8;
588 	vol = di->voltage_k * val / 1000 + di->voltage_b;
589 
590 	return vol;
591 }
592 
rk818_bat_get_relax_voltage(struct rk818_battery * di)593 static u16 rk818_bat_get_relax_voltage(struct rk818_battery *di)
594 {
595 	u16 relax_vol1, relax_vol2;
596 
597 	if (!is_rk818_bat_relax_mode(di))
598 		return 0;
599 
600 	relax_vol1 = rk818_bat_get_relax_vol1(di);
601 	relax_vol2 = rk818_bat_get_relax_vol2(di);
602 
603 	return relax_vol1 > relax_vol2 ? relax_vol1 : relax_vol2;
604 }
605 
rk818_bat_get_avg_current(struct rk818_battery * di)606 static int rk818_bat_get_avg_current(struct rk818_battery *di)
607 {
608 	int cur, val = 0;
609 
610 	val |= rk818_bat_read(di, RK818_BAT_CUR_AVG_REGL) << 0;
611 	val |= rk818_bat_read(di, RK818_BAT_CUR_AVG_REGH) << 8;
612 
613 	if (val & 0x800)
614 		val -= 4096;
615 	cur = val * di->res_div * 1506 / 1000;
616 
617 	return cur;
618 }
619 
rk818_bat_vol_to_ocvsoc(struct rk818_battery * di,int voltage)620 static int rk818_bat_vol_to_ocvsoc(struct rk818_battery *di, int voltage)
621 {
622 	u32 *ocv_table, temp;
623 	int ocv_size, ocv_soc;
624 
625 	ocv_table = di->pdata->ocv_table;
626 	ocv_size = di->pdata->ocv_size;
627 	temp = interpolate(voltage, ocv_table, ocv_size);
628 	ocv_soc = ab_div_c(temp, MAX_PERCENTAGE, MAX_INTERPOLATE);
629 
630 	return ocv_soc;
631 }
632 
rk818_bat_vol_to_ocvcap(struct rk818_battery * di,int voltage)633 static int rk818_bat_vol_to_ocvcap(struct rk818_battery *di, int voltage)
634 {
635 	u32 *ocv_table, temp;
636 	int ocv_size, cap;
637 
638 	ocv_table = di->pdata->ocv_table;
639 	ocv_size = di->pdata->ocv_size;
640 	temp = interpolate(voltage, ocv_table, ocv_size);
641 	cap = ab_div_c(temp, di->fcc, MAX_INTERPOLATE);
642 
643 	return cap;
644 }
645 
rk818_bat_vol_to_zerosoc(struct rk818_battery * di,int voltage)646 static int rk818_bat_vol_to_zerosoc(struct rk818_battery *di, int voltage)
647 {
648 	u32 *ocv_table, temp;
649 	int ocv_size, ocv_soc;
650 
651 	ocv_table = di->pdata->zero_table;
652 	ocv_size = di->pdata->ocv_size;
653 	temp = interpolate(voltage, ocv_table, ocv_size);
654 	ocv_soc = ab_div_c(temp, MAX_PERCENTAGE, MAX_INTERPOLATE);
655 
656 	return ocv_soc;
657 }
658 
rk818_bat_vol_to_zerocap(struct rk818_battery * di,int voltage)659 static int rk818_bat_vol_to_zerocap(struct rk818_battery *di, int voltage)
660 {
661 	u32 *ocv_table, temp;
662 	int ocv_size, cap;
663 
664 	ocv_table = di->pdata->zero_table;
665 	ocv_size = di->pdata->ocv_size;
666 	temp = interpolate(voltage, ocv_table, ocv_size);
667 	cap = ab_div_c(temp, di->fcc, MAX_INTERPOLATE);
668 
669 	return cap;
670 }
671 
rk818_bat_get_iadc(struct rk818_battery * di)672 static int rk818_bat_get_iadc(struct rk818_battery *di)
673 {
674 	int val = 0;
675 
676 	val |= rk818_bat_read(di, RK818_BAT_CUR_AVG_REGL) << 0;
677 	val |= rk818_bat_read(di, RK818_BAT_CUR_AVG_REGH) << 8;
678 	if (val > 2047)
679 		val -= 4096;
680 
681 	return val;
682 }
683 
rk818_bat_adc_calib(struct rk818_battery * di)684 static bool rk818_bat_adc_calib(struct rk818_battery *di)
685 {
686 	int i, ioffset, coffset, adc, save_coffset;
687 
688 	if ((di->chrg_status != CHARGE_FINISH) ||
689 	    (di->adc_calib_cnt > ADC_CALIB_CNT) ||
690 	    (base2min(di->boot_base) < ADC_CALIB_LMT_MIN) ||
691 	    (abs(di->current_avg) < ADC_CALIB_THRESHOLD))
692 		return false;
693 
694 	di->adc_calib_cnt++;
695 	save_coffset = rk818_bat_get_coffset(di);
696 	for (i = 0; i < 5; i++) {
697 		adc = rk818_bat_get_iadc(di);
698 		if (!rk818_bat_chrg_online(di)) {
699 			rk818_bat_set_coffset(di, save_coffset);
700 			BAT_INFO("quit, charger plugout when calib adc\n");
701 			return false;
702 		}
703 		coffset = rk818_bat_get_coffset(di);
704 		rk818_bat_set_coffset(di, coffset + adc);
705 		msleep(2000);
706 		adc = rk818_bat_get_iadc(di);
707 		if (abs(adc) < ADC_CALIB_THRESHOLD) {
708 			coffset = rk818_bat_get_coffset(di);
709 			ioffset = rk818_bat_get_ioffset(di);
710 			di->poffset = coffset - ioffset;
711 			rk818_bat_write(di, RK818_POFFSET_REG, di->poffset);
712 			BAT_INFO("new offset:c=0x%x, i=0x%x, p=0x%x\n",
713 				 coffset, ioffset, di->poffset);
714 			return true;
715 		} else {
716 			BAT_INFO("coffset calib again %d.., max_cnt=%d\n",
717 				 i, di->adc_calib_cnt);
718 			rk818_bat_set_coffset(di, coffset);
719 			msleep(2000);
720 		}
721 	}
722 
723 	rk818_bat_set_coffset(di, save_coffset);
724 
725 	return false;
726 }
727 
rk818_bat_set_ioffset_sample(struct rk818_battery * di)728 static void rk818_bat_set_ioffset_sample(struct rk818_battery *di)
729 {
730 	u8 ggcon;
731 
732 	ggcon = rk818_bat_read(di, RK818_GGCON_REG);
733 	ggcon &= ~ADC_CAL_MIN_MSK;
734 	ggcon |= ADC_CAL_8MIN;
735 	rk818_bat_write(di, RK818_GGCON_REG, ggcon);
736 }
737 
rk818_bat_set_ocv_sample(struct rk818_battery * di)738 static void rk818_bat_set_ocv_sample(struct rk818_battery *di)
739 {
740 	u8 ggcon;
741 
742 	ggcon = rk818_bat_read(di, RK818_GGCON_REG);
743 	ggcon &= ~OCV_SAMP_MIN_MSK;
744 	ggcon |= OCV_SAMP_8MIN;
745 	rk818_bat_write(di, RK818_GGCON_REG, ggcon);
746 }
747 
rk818_bat_restart_relax(struct rk818_battery * di)748 static void rk818_bat_restart_relax(struct rk818_battery *di)
749 {
750 	u8 ggsts;
751 
752 	ggsts = rk818_bat_read(di, RK818_GGSTS_REG);
753 	ggsts &= ~RELAX_VOL12_UPD_MSK;
754 	rk818_bat_write(di, RK818_GGSTS_REG, ggsts);
755 }
756 
rk818_bat_set_relax_sample(struct rk818_battery * di)757 static void rk818_bat_set_relax_sample(struct rk818_battery *di)
758 {
759 	u8 buf;
760 	int enter_thres, exit_thres;
761 	struct battery_platform_data *pdata = di->pdata;
762 
763 	enter_thres = pdata->sleep_enter_current * 1000 / 1506 / DIV(di->res_div);
764 	exit_thres = pdata->sleep_exit_current * 1000 / 1506 / DIV(di->res_div);
765 
766 	/* set relax enter and exit threshold */
767 	buf = enter_thres & 0xff;
768 	rk818_bat_write(di, RK818_RELAX_ENTRY_THRES_REGL, buf);
769 	buf = (enter_thres >> 8) & 0xff;
770 	rk818_bat_write(di, RK818_RELAX_ENTRY_THRES_REGH, buf);
771 
772 	buf = exit_thres & 0xff;
773 	rk818_bat_write(di, RK818_RELAX_EXIT_THRES_REGL, buf);
774 	buf = (exit_thres >> 8) & 0xff;
775 	rk818_bat_write(di, RK818_RELAX_EXIT_THRES_REGH, buf);
776 
777 	/* reset relax update state */
778 	rk818_bat_restart_relax(di);
779 	DBG("<%s>. sleep_enter_current = %d, sleep_exit_current = %d\n",
780 	    __func__, pdata->sleep_enter_current, pdata->sleep_exit_current);
781 }
782 
is_rk818_bat_exist(struct rk818_battery * di)783 static bool is_rk818_bat_exist(struct rk818_battery *di)
784 {
785 	return (rk818_bat_read(di, RK818_SUP_STS_REG) & BAT_EXS) ? true : false;
786 }
787 
is_rk818_bat_first_pwron(struct rk818_battery * di)788 static bool is_rk818_bat_first_pwron(struct rk818_battery *di)
789 {
790 	u8 buf;
791 
792 	buf = rk818_bat_read(di, RK818_GGSTS_REG);
793 	if (buf & BAT_CON) {
794 		buf &= ~BAT_CON;
795 		rk818_bat_write(di, RK818_GGSTS_REG, buf);
796 		return true;
797 	}
798 
799 	return false;
800 }
801 
rk818_bat_get_pwroff_min(struct rk818_battery * di)802 static u8 rk818_bat_get_pwroff_min(struct rk818_battery *di)
803 {
804 	u8 cur, last;
805 
806 	cur = rk818_bat_read(di, RK818_NON_ACT_TIMER_CNT_REG);
807 	last = rk818_bat_read(di, RK818_NON_ACT_TIMER_CNT_SAVE_REG);
808 	rk818_bat_write(di, RK818_NON_ACT_TIMER_CNT_SAVE_REG, cur);
809 
810 	return (cur != last) ? cur : 0;
811 }
812 
is_rk818_bat_initialized(struct rk818_battery * di)813 static u8 is_rk818_bat_initialized(struct rk818_battery *di)
814 {
815 	u8 val = rk818_bat_read(di, RK818_MISC_MARK_REG);
816 
817 	if (val & FG_INIT) {
818 		val &= ~FG_INIT;
819 		rk818_bat_write(di, RK818_MISC_MARK_REG, val);
820 		return true;
821 	} else {
822 		return false;
823 	}
824 }
825 
is_rk818_bat_ocv_valid(struct rk818_battery * di)826 static bool is_rk818_bat_ocv_valid(struct rk818_battery *di)
827 {
828 	return (!di->is_initialized && di->pwroff_min >= 30) ? true : false;
829 }
830 
rk818_bat_init_age_algorithm(struct rk818_battery * di)831 static void rk818_bat_init_age_algorithm(struct rk818_battery *di)
832 {
833 	int age_level, ocv_soc, ocv_cap, ocv_vol;
834 
835 	if (di->is_first_power_on || is_rk818_bat_ocv_valid(di)) {
836 		DBG("<%s> enter.\n", __func__);
837 		ocv_vol = rk818_bat_get_ocv_voltage(di);
838 		ocv_soc = rk818_bat_vol_to_ocvsoc(di, ocv_vol);
839 		ocv_cap = rk818_bat_vol_to_ocvcap(di, ocv_vol);
840 		if (ocv_soc < 20) {
841 			di->age_voltage = ocv_vol;
842 			di->age_ocv_cap = ocv_cap;
843 			di->age_ocv_soc = ocv_soc;
844 			di->age_adjust_cap = 0;
845 
846 			if (ocv_soc <= 0)
847 				di->age_level = 100;
848 			else if (ocv_soc < 5)
849 				di->age_level = 95;
850 			else if (ocv_soc < 10)
851 				di->age_level = 90;
852 			else
853 				di->age_level = 80;
854 
855 			age_level = rk818_bat_get_age_level(di);
856 			if (age_level > di->age_level) {
857 				di->age_allow_update = false;
858 				age_level -= 5;
859 				if (age_level <= 80)
860 					age_level = 80;
861 				rk818_bat_save_age_level(di, age_level);
862 			} else {
863 				di->age_allow_update = true;
864 				di->age_keep_sec = get_boot_sec();
865 			}
866 
867 			BAT_INFO("init_age_algorithm: "
868 				 "age_vol:%d, age_ocv_cap:%d, "
869 				 "age_ocv_soc:%d, old_age_level:%d, "
870 				 "age_allow_update:%d, new_age_level:%d\n",
871 				 di->age_voltage, di->age_ocv_cap,
872 				 ocv_soc, age_level, di->age_allow_update,
873 				 di->age_level);
874 		}
875 	}
876 }
877 
878 static enum power_supply_property rk818_bat_props[] = {
879 	POWER_SUPPLY_PROP_CURRENT_NOW,
880 	POWER_SUPPLY_PROP_VOLTAGE_NOW,
881 	POWER_SUPPLY_PROP_PRESENT,
882 	POWER_SUPPLY_PROP_HEALTH,
883 	POWER_SUPPLY_PROP_CAPACITY,
884 	POWER_SUPPLY_PROP_CAPACITY_LEVEL,
885 	POWER_SUPPLY_PROP_TEMP,
886 	POWER_SUPPLY_PROP_STATUS,
887 	POWER_SUPPLY_PROP_CHARGE_COUNTER,
888 	POWER_SUPPLY_PROP_CHARGE_FULL,
889 	POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,
890 	POWER_SUPPLY_PROP_TIME_TO_FULL_NOW,
891 	POWER_SUPPLY_PROP_VOLTAGE_MAX,
892 	POWER_SUPPLY_PROP_CURRENT_MAX,
893 };
894 
rk818_bat_get_usb_psy(struct device * dev,void * data)895 static int rk818_bat_get_usb_psy(struct device *dev, void *data)
896 {
897 	struct rk818_battery *di = data;
898 	struct power_supply *psy = dev_get_drvdata(dev);
899 
900 	if (psy->desc->type == POWER_SUPPLY_TYPE_USB) {
901 		di->usb_psy = psy;
902 		return 1;
903 	}
904 
905 	return 0;
906 }
907 
rk818_bat_get_ac_psy(struct device * dev,void * data)908 static int rk818_bat_get_ac_psy(struct device *dev, void *data)
909 {
910 	struct rk818_battery *di = data;
911 	struct power_supply *psy = dev_get_drvdata(dev);
912 
913 	if (psy->desc->type == POWER_SUPPLY_TYPE_MAINS) {
914 		di->ac_psy = psy;
915 		return 1;
916 	}
917 
918 	return 0;
919 }
920 
rk818_bat_get_chrg_psy(struct rk818_battery * di)921 static void rk818_bat_get_chrg_psy(struct rk818_battery *di)
922 {
923 	if (!di->usb_psy)
924 		class_for_each_device(power_supply_class, NULL, (void *)di,
925 				      rk818_bat_get_usb_psy);
926 	if (!di->ac_psy)
927 		class_for_each_device(power_supply_class, NULL, (void *)di,
928 				      rk818_bat_get_ac_psy);
929 }
930 
rk818_bat_get_charge_state(struct rk818_battery * di)931 static int rk818_bat_get_charge_state(struct rk818_battery *di)
932 {
933 	union power_supply_propval val;
934 	int ret;
935 
936 	if (!di->usb_psy || !di->ac_psy)
937 		rk818_bat_get_chrg_psy(di);
938 
939 	if (di->usb_psy) {
940 		ret = di->usb_psy->desc->get_property(di->usb_psy,
941 						      POWER_SUPPLY_PROP_ONLINE,
942 						      &val);
943 		if (!ret)
944 			di->usb_in = val.intval;
945 	}
946 
947 	if (di->ac_psy) {
948 		ret = di->ac_psy->desc->get_property(di->ac_psy,
949 						     POWER_SUPPLY_PROP_ONLINE,
950 						     &val);
951 		if (!ret)
952 			di->ac_in = val.intval;
953 	}
954 
955 	DBG("%s: ac_online=%d, usb_online=%d\n",
956 	    __func__, di->ac_in, di->usb_in);
957 
958 	return (di->usb_in || di->ac_in);
959 }
960 
rk818_get_capacity_leve(struct rk818_battery * di)961 static int rk818_get_capacity_leve(struct rk818_battery *di)
962 {
963 	if (di->pdata->bat_mode == MODE_VIRTUAL)
964 		return POWER_SUPPLY_CAPACITY_LEVEL_NORMAL;
965 
966 	if (di->dsoc < 1)
967 		return POWER_SUPPLY_CAPACITY_LEVEL_CRITICAL;
968 	else if (di->dsoc <= 20)
969 		return POWER_SUPPLY_CAPACITY_LEVEL_LOW;
970 	else if (di->dsoc <= 70)
971 		return POWER_SUPPLY_CAPACITY_LEVEL_NORMAL;
972 	else if (di->dsoc <= 90)
973 		return POWER_SUPPLY_CAPACITY_LEVEL_HIGH;
974 	else
975 		return POWER_SUPPLY_CAPACITY_LEVEL_FULL;
976 }
977 
rk818_battery_time_to_full(struct rk818_battery * di)978 static int rk818_battery_time_to_full(struct rk818_battery *di)
979 {
980 	int time_sec;
981 	int cap_temp;
982 
983 	if (di->pdata->bat_mode == MODE_VIRTUAL) {
984 		time_sec = 3600;
985 	} else if (di->voltage_avg > 0) {
986 		cap_temp = di->pdata->design_capacity - di->remain_cap;
987 		if (cap_temp < 0)
988 			cap_temp = 0;
989 		time_sec = (3600 * cap_temp) / di->voltage_avg;
990 	} else {
991 		time_sec = 3600 * 24; /* One day */
992 	}
993 
994 	return time_sec;
995 }
996 
rk818_battery_get_property(struct power_supply * psy,enum power_supply_property psp,union power_supply_propval * val)997 static int rk818_battery_get_property(struct power_supply *psy,
998 				      enum power_supply_property psp,
999 				      union power_supply_propval *val)
1000 {
1001 	struct rk818_battery *di = power_supply_get_drvdata(psy);
1002 
1003 	switch (psp) {
1004 	case POWER_SUPPLY_PROP_CURRENT_NOW:
1005 		val->intval = di->current_avg * 1000;/*uA*/
1006 		if (di->pdata->bat_mode == MODE_VIRTUAL)
1007 			val->intval = VIRTUAL_CURRENT * 1000;
1008 		break;
1009 	case POWER_SUPPLY_PROP_VOLTAGE_NOW:
1010 		val->intval = di->voltage_avg * 1000;/*uV*/
1011 		if (di->pdata->bat_mode == MODE_VIRTUAL)
1012 			val->intval = VIRTUAL_VOLTAGE * 1000;
1013 		break;
1014 	case POWER_SUPPLY_PROP_PRESENT:
1015 		val->intval = is_rk818_bat_exist(di);
1016 		if (di->pdata->bat_mode == MODE_VIRTUAL)
1017 			val->intval = VIRTUAL_PRESET;
1018 		break;
1019 	case POWER_SUPPLY_PROP_CAPACITY:
1020 		val->intval = di->dsoc;
1021 		if (di->pdata->bat_mode == MODE_VIRTUAL)
1022 			val->intval = VIRTUAL_SOC;
1023 		DBG("<%s>. report dsoc: %d\n", __func__, val->intval);
1024 		break;
1025 	case POWER_SUPPLY_PROP_CAPACITY_LEVEL:
1026 		val->intval = rk818_get_capacity_leve(di);
1027 		break;
1028 	case POWER_SUPPLY_PROP_HEALTH:
1029 		val->intval = POWER_SUPPLY_HEALTH_GOOD;
1030 		break;
1031 	case POWER_SUPPLY_PROP_TEMP:
1032 		val->intval = di->temperature;
1033 		if (di->pdata->bat_mode == MODE_VIRTUAL)
1034 			val->intval = VIRTUAL_TEMPERATURE;
1035 		break;
1036 	case POWER_SUPPLY_PROP_STATUS:
1037 		if (di->pdata->bat_mode == MODE_VIRTUAL)
1038 			val->intval = VIRTUAL_STATUS;
1039 		else if (di->dsoc == 100)
1040 			val->intval = POWER_SUPPLY_STATUS_FULL;
1041 		else if (rk818_bat_get_charge_state(di))
1042 			val->intval = POWER_SUPPLY_STATUS_CHARGING;
1043 		else
1044 			val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
1045 		break;
1046 	case POWER_SUPPLY_PROP_CHARGE_COUNTER:
1047 		val->intval = di->charge_count;
1048 		break;
1049 	case POWER_SUPPLY_PROP_CHARGE_FULL:
1050 	case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN:
1051 		val->intval = di->pdata->design_capacity * 1000;/* uAh */
1052 		break;
1053 	case POWER_SUPPLY_PROP_TIME_TO_FULL_NOW:
1054 		val->intval = rk818_battery_time_to_full(di);
1055 		break;
1056 	case POWER_SUPPLY_PROP_VOLTAGE_MAX:
1057 		val->intval = di->voltage_max;
1058 		break;
1059 	case POWER_SUPPLY_PROP_CURRENT_MAX:
1060 		val->intval = di->current_max;
1061 		break;
1062 	default:
1063 		return -EINVAL;
1064 	}
1065 
1066 	return 0;
1067 }
1068 
1069 static const struct power_supply_desc rk818_bat_desc = {
1070 	.name		= "battery",
1071 	.type		= POWER_SUPPLY_TYPE_BATTERY,
1072 	.properties	= rk818_bat_props,
1073 	.num_properties	= ARRAY_SIZE(rk818_bat_props),
1074 	.get_property	= rk818_battery_get_property,
1075 };
1076 
rk818_bat_init_power_supply(struct rk818_battery * di)1077 static int rk818_bat_init_power_supply(struct rk818_battery *di)
1078 {
1079 	struct power_supply_config psy_cfg = { .drv_data = di, };
1080 
1081 	di->bat = devm_power_supply_register(di->dev, &rk818_bat_desc, &psy_cfg);
1082 	if (IS_ERR(di->bat)) {
1083 		dev_err(di->dev, "register bat power supply fail\n");
1084 		return PTR_ERR(di->bat);
1085 	}
1086 
1087 	return 0;
1088 }
1089 
rk818_bat_save_cap(struct rk818_battery * di,int cap)1090 static void rk818_bat_save_cap(struct rk818_battery *di, int cap)
1091 {
1092 	u8 buf;
1093 	static u32 old_cap;
1094 
1095 	if (cap >= di->qmax)
1096 		cap = di->qmax;
1097 	if (cap <= 0)
1098 		cap = 0;
1099 	if (old_cap == cap)
1100 		return;
1101 
1102 	old_cap = cap;
1103 	buf = (cap >> 24) & 0xff;
1104 	rk818_bat_write(di, RK818_REMAIN_CAP_REG3, buf);
1105 	buf = (cap >> 16) & 0xff;
1106 	rk818_bat_write(di, RK818_REMAIN_CAP_REG2, buf);
1107 	buf = (cap >> 8) & 0xff;
1108 	rk818_bat_write(di, RK818_REMAIN_CAP_REG1, buf);
1109 	buf = (cap >> 0) & 0xff;
1110 	rk818_bat_write(di, RK818_REMAIN_CAP_REG0, buf);
1111 }
1112 
rk818_bat_get_prev_cap(struct rk818_battery * di)1113 static int rk818_bat_get_prev_cap(struct rk818_battery *di)
1114 {
1115 	int val = 0;
1116 
1117 	val |= rk818_bat_read(di, RK818_REMAIN_CAP_REG3) << 24;
1118 	val |= rk818_bat_read(di, RK818_REMAIN_CAP_REG2) << 16;
1119 	val |= rk818_bat_read(di, RK818_REMAIN_CAP_REG1) << 8;
1120 	val |= rk818_bat_read(di, RK818_REMAIN_CAP_REG0) << 0;
1121 
1122 	return val;
1123 }
1124 
rk818_bat_save_fcc(struct rk818_battery * di,u32 fcc)1125 static void rk818_bat_save_fcc(struct rk818_battery *di, u32 fcc)
1126 {
1127 	u8 buf;
1128 
1129 	buf = (fcc >> 24) & 0xff;
1130 	rk818_bat_write(di, RK818_NEW_FCC_REG3, buf);
1131 	buf = (fcc >> 16) & 0xff;
1132 	rk818_bat_write(di, RK818_NEW_FCC_REG2, buf);
1133 	buf = (fcc >> 8) & 0xff;
1134 	rk818_bat_write(di, RK818_NEW_FCC_REG1, buf);
1135 	buf = (fcc >> 0) & 0xff;
1136 	rk818_bat_write(di, RK818_NEW_FCC_REG0, buf);
1137 
1138 	BAT_INFO("save fcc: %d\n", fcc);
1139 }
1140 
rk818_bat_get_fcc(struct rk818_battery * di)1141 static int rk818_bat_get_fcc(struct rk818_battery *di)
1142 {
1143 	u32 fcc = 0;
1144 
1145 	fcc |= rk818_bat_read(di, RK818_NEW_FCC_REG3) << 24;
1146 	fcc |= rk818_bat_read(di, RK818_NEW_FCC_REG2) << 16;
1147 	fcc |= rk818_bat_read(di, RK818_NEW_FCC_REG1) << 8;
1148 	fcc |= rk818_bat_read(di, RK818_NEW_FCC_REG0) << 0;
1149 
1150 	if (fcc < MIN_FCC) {
1151 		BAT_INFO("invalid fcc(%d), use design cap", fcc);
1152 		fcc = di->pdata->design_capacity;
1153 		rk818_bat_save_fcc(di, fcc);
1154 	} else if (fcc > di->pdata->design_qmax) {
1155 		BAT_INFO("invalid fcc(%d), use qmax", fcc);
1156 		fcc = di->pdata->design_qmax;
1157 		rk818_bat_save_fcc(di, fcc);
1158 	}
1159 
1160 	return fcc;
1161 }
1162 
rk818_bat_init_coulomb_cap(struct rk818_battery * di,u32 capacity)1163 static void rk818_bat_init_coulomb_cap(struct rk818_battery *di, u32 capacity)
1164 {
1165 	u8 buf;
1166 	u32 cap;
1167 
1168 	cap = capacity * 2390 / DIV(di->res_div);
1169 	buf = (cap >> 24) & 0xff;
1170 	rk818_bat_write(di, RK818_GASCNT_CAL_REG3, buf);
1171 	buf = (cap >> 16) & 0xff;
1172 	rk818_bat_write(di, RK818_GASCNT_CAL_REG2, buf);
1173 	buf = (cap >> 8) & 0xff;
1174 	rk818_bat_write(di, RK818_GASCNT_CAL_REG1, buf);
1175 	buf = ((cap >> 0) & 0xff);
1176 	rk818_bat_write(di, RK818_GASCNT_CAL_REG0, buf);
1177 
1178 	DBG("<%s>. new coulomb cap = %d\n", __func__, capacity);
1179 	di->remain_cap = capacity;
1180 	di->rsoc = rk818_bat_get_rsoc(di);
1181 }
1182 
rk818_bat_save_dsoc(struct rk818_battery * di,u8 save_soc)1183 static void rk818_bat_save_dsoc(struct rk818_battery *di, u8 save_soc)
1184 {
1185 	static int last_soc = -1;
1186 
1187 	if (last_soc != save_soc) {
1188 		rk818_bat_write(di, RK818_SOC_REG, save_soc);
1189 		last_soc = save_soc;
1190 	}
1191 }
1192 
rk818_bat_get_prev_dsoc(struct rk818_battery * di)1193 static int rk818_bat_get_prev_dsoc(struct rk818_battery *di)
1194 {
1195 	return rk818_bat_read(di, RK818_SOC_REG);
1196 }
1197 
rk818_bat_save_reboot_cnt(struct rk818_battery * di,u8 save_cnt)1198 static void rk818_bat_save_reboot_cnt(struct rk818_battery *di, u8 save_cnt)
1199 {
1200 	rk818_bat_write(di, RK818_REBOOT_CNT_REG, save_cnt);
1201 }
1202 
rk818_bat_fb_notifier(struct notifier_block * nb,unsigned long event,void * data)1203 static int rk818_bat_fb_notifier(struct notifier_block *nb,
1204 				 unsigned long event, void *data)
1205 {
1206 	struct rk818_battery *di;
1207 	struct fb_event *evdata = data;
1208 
1209 	if (event != FB_EVENT_BLANK)
1210 		return NOTIFY_DONE;
1211 
1212 	di = container_of(nb, struct rk818_battery, fb_nb);
1213 	di->fb_blank = *(int *)evdata->data;
1214 
1215 	return NOTIFY_OK;
1216 }
1217 
rk818_bat_register_fb_notify(struct rk818_battery * di)1218 static int rk818_bat_register_fb_notify(struct rk818_battery *di)
1219 {
1220 	memset(&di->fb_nb, 0, sizeof(di->fb_nb));
1221 	di->fb_nb.notifier_call = rk818_bat_fb_notifier;
1222 
1223 	return fb_register_client(&di->fb_nb);
1224 }
1225 
rk818_bat_unregister_fb_notify(struct rk818_battery * di)1226 static int rk818_bat_unregister_fb_notify(struct rk818_battery *di)
1227 {
1228 	return fb_unregister_client(&di->fb_nb);
1229 }
1230 
rk818_bat_get_halt_cnt(struct rk818_battery * di)1231 static u8 rk818_bat_get_halt_cnt(struct rk818_battery *di)
1232 {
1233 	return rk818_bat_read(di, RK818_HALT_CNT_REG);
1234 }
1235 
rk818_bat_inc_halt_cnt(struct rk818_battery * di)1236 static void rk818_bat_inc_halt_cnt(struct rk818_battery *di)
1237 {
1238 	u8 cnt;
1239 
1240 	cnt = rk818_bat_read(di, RK818_HALT_CNT_REG);
1241 	rk818_bat_write(di, RK818_HALT_CNT_REG, ++cnt);
1242 }
1243 
is_rk818_bat_last_halt(struct rk818_battery * di)1244 static bool is_rk818_bat_last_halt(struct rk818_battery *di)
1245 {
1246 	int pre_cap = rk818_bat_get_prev_cap(di);
1247 	int now_cap = rk818_bat_get_coulomb_cap(di);
1248 
1249 	/* over 10%: system halt last time */
1250 	if (abs(now_cap - pre_cap) > (di->fcc / 10)) {
1251 		rk818_bat_inc_halt_cnt(di);
1252 		return true;
1253 	} else {
1254 		return false;
1255 	}
1256 }
1257 
rk818_bat_first_pwron(struct rk818_battery * di)1258 static void rk818_bat_first_pwron(struct rk818_battery *di)
1259 {
1260 	int ocv_vol;
1261 
1262 	rk818_bat_save_fcc(di, di->design_cap);
1263 	ocv_vol = rk818_bat_get_ocv_voltage(di);
1264 	di->fcc = rk818_bat_get_fcc(di);
1265 	di->nac = rk818_bat_vol_to_ocvcap(di, ocv_vol);
1266 	di->rsoc = rk818_bat_vol_to_ocvsoc(di, ocv_vol);
1267 	di->dsoc = di->rsoc;
1268 	di->is_first_on = true;
1269 
1270 	BAT_INFO("first on: dsoc=%d, rsoc=%d cap=%d, fcc=%d, ov=%d\n",
1271 		 di->dsoc, di->rsoc, di->nac, di->fcc, ocv_vol);
1272 }
1273 
rk818_bat_not_first_pwron(struct rk818_battery * di)1274 static void rk818_bat_not_first_pwron(struct rk818_battery *di)
1275 {
1276 	int now_cap, pre_soc, pre_cap, ocv_cap, ocv_soc, ocv_vol;
1277 
1278 	di->fcc = rk818_bat_get_fcc(di);
1279 	pre_soc = rk818_bat_get_prev_dsoc(di);
1280 	pre_cap = rk818_bat_get_prev_cap(di);
1281 	now_cap = rk818_bat_get_coulomb_cap(di);
1282 	di->is_halt = is_rk818_bat_last_halt(di);
1283 	di->halt_cnt = rk818_bat_get_halt_cnt(di);
1284 	di->is_initialized = is_rk818_bat_initialized(di);
1285 	di->is_ocv_calib = is_rk818_bat_ocv_valid(di);
1286 
1287 	if (di->is_initialized) {
1288 		BAT_INFO("initialized yet..\n");
1289 		goto finish;
1290 	} else if (di->is_halt) {
1291 		BAT_INFO("system halt last time... cap: pre=%d, now=%d\n",
1292 			 pre_cap, now_cap);
1293 		if (now_cap < 0)
1294 			now_cap = 0;
1295 		rk818_bat_init_coulomb_cap(di, now_cap);
1296 		pre_cap = now_cap;
1297 		pre_soc = di->rsoc;
1298 		goto finish;
1299 	} else if (di->is_ocv_calib) {
1300 		ocv_vol = rk818_bat_get_ocv_voltage(di);
1301 		ocv_soc = rk818_bat_vol_to_ocvsoc(di, ocv_vol);
1302 		ocv_cap = rk818_bat_vol_to_ocvcap(di, ocv_vol);
1303 		pre_cap = ocv_cap;
1304 		di->ocv_pre_dsoc = pre_soc;
1305 		di->ocv_new_dsoc = ocv_soc;
1306 		if (abs(ocv_soc - pre_soc) >= di->pdata->max_soc_offset) {
1307 			di->ocv_pre_dsoc = pre_soc;
1308 			di->ocv_new_dsoc = ocv_soc;
1309 			di->is_max_soc_offset = true;
1310 			BAT_INFO("trigger max soc offset, dsoc: %d -> %d\n",
1311 				 pre_soc, ocv_soc);
1312 			pre_soc = ocv_soc;
1313 		}
1314 		BAT_INFO("OCV calib: cap=%d, rsoc=%d\n", ocv_cap, ocv_soc);
1315 	} else if (di->pwroff_min > 0) {
1316 		ocv_vol = rk818_bat_get_ocv_voltage(di);
1317 		ocv_soc = rk818_bat_vol_to_ocvsoc(di, ocv_vol);
1318 		ocv_cap = rk818_bat_vol_to_ocvcap(di, ocv_vol);
1319 		di->force_pre_dsoc = pre_soc;
1320 		di->force_new_dsoc = ocv_soc;
1321 		if (abs(ocv_soc - pre_soc) >= 80) {
1322 			di->is_force_calib = true;
1323 			BAT_INFO("dsoc force calib: %d -> %d\n",
1324 				 pre_soc, ocv_soc);
1325 			pre_soc = ocv_soc;
1326 			pre_cap = ocv_cap;
1327 		}
1328 	}
1329 
1330 finish:
1331 	di->dsoc = pre_soc;
1332 	di->nac = pre_cap;
1333 	if (di->nac < 0)
1334 		di->nac = 0;
1335 
1336 	BAT_INFO("dsoc=%d cap=%d v=%d ov=%d rv=%d min=%d psoc=%d pcap=%d\n",
1337 		 di->dsoc, di->nac, rk818_bat_get_avg_voltage(di),
1338 		 rk818_bat_get_ocv_voltage(di), rk818_bat_get_relax_voltage(di),
1339 		 di->pwroff_min, rk818_bat_get_prev_dsoc(di),
1340 		 rk818_bat_get_prev_cap(di));
1341 }
1342 
rk818_bat_ocv_sw_reset(struct rk818_battery * di)1343 static bool rk818_bat_ocv_sw_reset(struct rk818_battery *di)
1344 {
1345 	u8 buf;
1346 
1347 	buf = rk818_bat_read(di, RK818_MISC_MARK_REG);
1348 	if (((buf & FG_RESET_LATE) && di->pwroff_min >= 30) ||
1349 	    (buf & FG_RESET_NOW)) {
1350 		buf &= ~FG_RESET_LATE;
1351 		buf &= ~FG_RESET_NOW;
1352 		rk818_bat_write(di, RK818_MISC_MARK_REG, buf);
1353 		BAT_INFO("manual reset fuel gauge\n");
1354 		return true;
1355 	} else {
1356 		return false;
1357 	}
1358 }
1359 
rk818_bat_init_rsoc(struct rk818_battery * di)1360 static void rk818_bat_init_rsoc(struct rk818_battery *di)
1361 {
1362 	di->is_first_power_on = is_rk818_bat_first_pwron(di);
1363 	di->is_sw_reset = rk818_bat_ocv_sw_reset(di);
1364 	di->pwroff_min = rk818_bat_get_pwroff_min(di);
1365 
1366 	if (di->is_first_power_on || di->is_sw_reset)
1367 		rk818_bat_first_pwron(di);
1368 	else
1369 		rk818_bat_not_first_pwron(di);
1370 }
1371 
rk818_bat_get_chrg_status(struct rk818_battery * di)1372 static u8 rk818_bat_get_chrg_status(struct rk818_battery *di)
1373 {
1374 	u8 status;
1375 
1376 	status = rk818_bat_read(di, RK818_SUP_STS_REG) & CHRG_STATUS_MSK;
1377 	switch (status) {
1378 	case CHARGE_OFF:
1379 		DBG("CHARGE-OFF ...\n");
1380 		break;
1381 	case DEAD_CHARGE:
1382 		BAT_INFO("DEAD CHARGE...\n");
1383 		break;
1384 	case TRICKLE_CHARGE:
1385 		BAT_INFO("TRICKLE CHARGE...\n ");
1386 		break;
1387 	case CC_OR_CV:
1388 		DBG("CC or CV...\n");
1389 		break;
1390 	case CHARGE_FINISH:
1391 		DBG("CHARGE FINISH...\n");
1392 		break;
1393 	case USB_OVER_VOL:
1394 		BAT_INFO("USB OVER VOL...\n");
1395 		break;
1396 	case BAT_TMP_ERR:
1397 		BAT_INFO("BAT TMP ERROR...\n");
1398 		break;
1399 	case TIMER_ERR:
1400 		BAT_INFO("TIMER ERROR...\n");
1401 		break;
1402 	case USB_EXIST:
1403 		BAT_INFO("USB EXIST...\n");
1404 		break;
1405 	case USB_EFF:
1406 		BAT_INFO("USB EFF...\n");
1407 		break;
1408 	default:
1409 		return -EINVAL;
1410 	}
1411 
1412 	return status;
1413 }
1414 
rk818_bat_parse_fb_temperature(struct rk818_battery * di)1415 static u8 rk818_bat_parse_fb_temperature(struct rk818_battery *di)
1416 {
1417 	u8 reg;
1418 	int index, fb_temp;
1419 
1420 	reg = DEFAULT_FB_TEMP;
1421 	fb_temp = di->pdata->fb_temp;
1422 	for (index = 0; index < ARRAY_SIZE(feedback_temp_array); index++) {
1423 		if (fb_temp < feedback_temp_array[index])
1424 			break;
1425 		reg = (index << FB_TEMP_SHIFT);
1426 	}
1427 
1428 	return reg;
1429 }
1430 
rk818_bat_parse_finish_ma(struct rk818_battery * di,int fcc)1431 static u8 rk818_bat_parse_finish_ma(struct rk818_battery *di, int fcc)
1432 {
1433 	u8 ma;
1434 
1435 	if (di->pdata->sample_res == SAMPLE_RES_10MR)
1436 		ma = FINISH_100MA;
1437 	else if (fcc > 5000)
1438 		ma = FINISH_250MA;
1439 	else if (fcc >= 4000)
1440 		ma = FINISH_200MA;
1441 	else if (fcc >= 3000)
1442 		ma = FINISH_150MA;
1443 	else
1444 		ma = FINISH_100MA;
1445 
1446 	return ma;
1447 }
1448 
rk818_bat_init_chrg_config(struct rk818_battery * di)1449 static void rk818_bat_init_chrg_config(struct rk818_battery *di)
1450 {
1451 	u8 usb_ctrl, chrg_ctrl2, chrg_ctrl3;
1452 	u8 thermal, ggcon, finish_ma, fb_temp;
1453 
1454 	finish_ma = rk818_bat_parse_finish_ma(di, di->fcc);
1455 	fb_temp = rk818_bat_parse_fb_temperature(di);
1456 
1457 	ggcon = rk818_bat_read(di, RK818_GGCON_REG);
1458 	thermal = rk818_bat_read(di, RK818_THERMAL_REG);
1459 	usb_ctrl = rk818_bat_read(di, RK818_USB_CTRL_REG);
1460 	chrg_ctrl2 = rk818_bat_read(di, RK818_CHRG_CTRL_REG2);
1461 	chrg_ctrl3 = rk818_bat_read(di, RK818_CHRG_CTRL_REG3);
1462 
1463 	/* set charge finish current */
1464 	chrg_ctrl3 |= CHRG_TERM_DIG_SIGNAL;
1465 	chrg_ctrl2 &= ~FINISH_CUR_MSK;
1466 	chrg_ctrl2 |= finish_ma;
1467 
1468 	/* disable cccv mode */
1469 	chrg_ctrl3 &= ~CHRG_TIMER_CCCV_EN;
1470 
1471 	/* set feed back temperature */
1472 	if (di->pdata->fb_temp)
1473 		usb_ctrl |= CHRG_CT_EN;
1474 	else
1475 		usb_ctrl &= ~CHRG_CT_EN;
1476 	thermal &= ~FB_TEMP_MSK;
1477 	thermal |= fb_temp;
1478 
1479 	/* adc current mode */
1480 	ggcon |= ADC_CUR_MODE;
1481 
1482 	rk818_bat_write(di, RK818_GGCON_REG, ggcon);
1483 	rk818_bat_write(di, RK818_THERMAL_REG, thermal);
1484 	rk818_bat_write(di, RK818_USB_CTRL_REG, usb_ctrl);
1485 	rk818_bat_write(di, RK818_CHRG_CTRL_REG2, chrg_ctrl2);
1486 	rk818_bat_write(di, RK818_CHRG_CTRL_REG3, chrg_ctrl3);
1487 }
1488 
rk818_bat_init_coffset(struct rk818_battery * di)1489 static void rk818_bat_init_coffset(struct rk818_battery *di)
1490 {
1491 	int coffset, ioffset;
1492 
1493 	ioffset = rk818_bat_get_ioffset(di);
1494 	di->poffset = rk818_bat_read(di, RK818_POFFSET_REG);
1495 	if (!di->poffset)
1496 		di->poffset = DEFAULT_POFFSET;
1497 
1498 	coffset = di->poffset + ioffset;
1499 	if (coffset < INVALID_COFFSET_MIN || coffset > INVALID_COFFSET_MAX)
1500 		coffset = DEFAULT_COFFSET;
1501 
1502 	rk818_bat_set_coffset(di, coffset);
1503 
1504 	DBG("<%s>. offset: p=0x%x, i=0x%x, c=0x%x\n",
1505 	    __func__, di->poffset, ioffset, rk818_bat_get_coffset(di));
1506 }
1507 
rk818_bat_caltimer_isr(struct timer_list * t)1508 static void rk818_bat_caltimer_isr(struct timer_list *t)
1509 {
1510 	struct rk818_battery *di = from_timer(di, t, caltimer);
1511 
1512 	mod_timer(&di->caltimer, jiffies + MINUTE(8) * HZ);
1513 	queue_delayed_work(di->bat_monitor_wq, &di->calib_delay_work,
1514 			   msecs_to_jiffies(10));
1515 }
1516 
rk818_bat_internal_calib(struct work_struct * work)1517 static void rk818_bat_internal_calib(struct work_struct *work)
1518 {
1519 	int ioffset, poffset;
1520 	struct rk818_battery *di = container_of(work,
1521 			struct rk818_battery, calib_delay_work.work);
1522 
1523 	/* calib coffset */
1524 	poffset = rk818_bat_read(di, RK818_POFFSET_REG);
1525 	if (poffset)
1526 		di->poffset = poffset;
1527 	else
1528 		di->poffset = DEFAULT_POFFSET;
1529 
1530 	ioffset = rk818_bat_get_ioffset(di);
1531 	rk818_bat_set_coffset(di, ioffset + di->poffset);
1532 
1533 	/* calib voltage kb */
1534 	rk818_bat_init_voltage_kb(di);
1535 	BAT_INFO("caltimer: ioffset=0x%x, coffset=0x%x, poffset=%d\n",
1536 		 ioffset, rk818_bat_get_coffset(di), di->poffset);
1537 }
1538 
rk818_bat_init_caltimer(struct rk818_battery * di)1539 static void rk818_bat_init_caltimer(struct rk818_battery *di)
1540 {
1541 	timer_setup(&di->caltimer, rk818_bat_caltimer_isr, 0);
1542 	di->caltimer.expires = jiffies + MINUTE(8) * HZ;
1543 	add_timer(&di->caltimer);
1544 	INIT_DELAYED_WORK(&di->calib_delay_work, rk818_bat_internal_calib);
1545 }
1546 
rk818_bat_init_zero_table(struct rk818_battery * di)1547 static void rk818_bat_init_zero_table(struct rk818_battery *di)
1548 {
1549 	int i, diff, min, max;
1550 	size_t ocv_size, length;
1551 
1552 	ocv_size = di->pdata->ocv_size;
1553 	length = sizeof(di->pdata->zero_table) * ocv_size;
1554 	di->pdata->zero_table =
1555 			devm_kzalloc(di->dev, length, GFP_KERNEL);
1556 	if (!di->pdata->zero_table) {
1557 		di->pdata->zero_table = di->pdata->ocv_table;
1558 		dev_err(di->dev, "malloc zero table fail\n");
1559 		return;
1560 	}
1561 
1562 	min = di->pdata->pwroff_vol,
1563 	max = di->pdata->ocv_table[ocv_size - 4];
1564 	diff = (max - min) / DIV(ocv_size - 1);
1565 	for (i = 0; i < ocv_size; i++)
1566 		di->pdata->zero_table[i] = min + (i * diff);
1567 
1568 	for (i = 0; i < ocv_size; i++)
1569 		DBG("zero[%d] = %d\n", i, di->pdata->zero_table[i]);
1570 
1571 	for (i = 0; i < ocv_size; i++)
1572 		DBG("ocv[%d] = %d\n", i, di->pdata->ocv_table[i]);
1573 }
1574 
rk818_bat_calc_sm_linek(struct rk818_battery * di)1575 static void rk818_bat_calc_sm_linek(struct rk818_battery *di)
1576 {
1577 	int linek, current_avg;
1578 	u8 diff, delta;
1579 
1580 	delta = abs(di->dsoc - di->rsoc);
1581 	diff = delta * 3;/* speed:3/4 */
1582 	current_avg = rk818_bat_get_avg_current(di);
1583 	if (current_avg >= 0) {
1584 		if (di->dsoc < di->rsoc)
1585 			linek = 1000 * (delta + diff) / DIV(diff);
1586 		else if (di->dsoc > di->rsoc)
1587 			linek = 1000 * diff / DIV(delta + diff);
1588 		else
1589 			linek = 1000;
1590 		di->dbg_meet_soc = (di->dsoc >= di->rsoc) ?
1591 				   (di->dsoc + diff) : (di->rsoc + diff);
1592 	} else {
1593 		if (di->dsoc < di->rsoc)
1594 			linek = -1000 * diff / DIV(delta + diff);
1595 		else if (di->dsoc > di->rsoc)
1596 			linek = -1000 * (delta + diff) / DIV(diff);
1597 		else
1598 			linek = -1000;
1599 		di->dbg_meet_soc = (di->dsoc >= di->rsoc) ?
1600 				   (di->dsoc - diff) : (di->rsoc - diff);
1601 	}
1602 
1603 	di->sm_linek = linek;
1604 	di->sm_remain_cap = di->remain_cap;
1605 	di->dbg_calc_dsoc = di->dsoc;
1606 	di->dbg_calc_rsoc = di->rsoc;
1607 
1608 	DBG("<%s>.diff=%d, k=%d, cur=%d\n", __func__, diff, linek, current_avg);
1609 }
1610 
rk818_bat_calc_zero_linek(struct rk818_battery * di)1611 static void rk818_bat_calc_zero_linek(struct rk818_battery *di)
1612 {
1613 	int dead_voltage, ocv_voltage;
1614 	int voltage_avg, current_avg, vsys;
1615 	int ocv_cap, dead_cap, xsoc;
1616 	int ocv_soc, dead_soc;
1617 	int pwroff_vol;
1618 	int i, cnt = 0, vol_old, vol_now;
1619 	int org_linek = 0, min_gap_xsoc;
1620 
1621 	if ((abs(di->current_avg) < 500) && (di->dsoc > 10))
1622 		pwroff_vol = di->pdata->pwroff_vol + 50;
1623 	else
1624 		pwroff_vol = di->pdata->pwroff_vol;
1625 
1626 	do {
1627 		vol_old = rk818_bat_get_avg_voltage(di);
1628 		msleep(100);
1629 		vol_now = rk818_bat_get_avg_voltage(di);
1630 		cnt++;
1631 	} while ((vol_old == vol_now) && (cnt < 11));
1632 
1633 	voltage_avg = 0;
1634 	for (i = 0; i < 10; i++) {
1635 		voltage_avg += rk818_bat_get_avg_voltage(di);
1636 		msleep(100);
1637 	}
1638 
1639 	/* calc estimate ocv voltage */
1640 	voltage_avg /= 10;
1641 	current_avg = rk818_bat_get_avg_current(di);
1642 	vsys = voltage_avg + (current_avg * DEF_PWRPATH_RES) / 1000;
1643 
1644 	DBG("ZERO0: shtd_vol: org = %d, now = %d, zero_reserve_dsoc = %d\n",
1645 	    di->pdata->pwroff_vol, pwroff_vol, di->pdata->zero_reserve_dsoc);
1646 
1647 	dead_voltage = pwroff_vol - current_avg *
1648 				(di->bat_res + DEF_PWRPATH_RES) / 1000;
1649 	ocv_voltage = voltage_avg - (current_avg * di->bat_res) / 1000;
1650 	DBG("ZERO0: dead_voltage(shtd) = %d, ocv_voltage(now) = %d\n",
1651 	    dead_voltage, ocv_voltage);
1652 
1653 	/* calc estimate soc and cap */
1654 	dead_soc = rk818_bat_vol_to_zerosoc(di, dead_voltage);
1655 	dead_cap = rk818_bat_vol_to_zerocap(di, dead_voltage);
1656 	DBG("ZERO0: dead_soc = %d, dead_cap = %d\n",
1657 	    dead_soc, dead_cap);
1658 
1659 	ocv_soc = rk818_bat_vol_to_zerosoc(di, ocv_voltage);
1660 	ocv_cap = rk818_bat_vol_to_zerocap(di, ocv_voltage);
1661 	DBG("ZERO0: ocv_soc = %d, ocv_cap = %d\n",
1662 	    ocv_soc, ocv_cap);
1663 
1664 	/* xsoc: available rsoc */
1665 	xsoc = ocv_soc - dead_soc;
1666 
1667 	/* min_gap_xsoc: reserve xsoc */
1668 	if (abs(current_avg) > ZERO_LOAD_LVL1)
1669 		min_gap_xsoc = ZERO_GAP_XSOC3;
1670 	else if (abs(current_avg) > ZERO_LOAD_LVL2)
1671 		min_gap_xsoc = ZERO_GAP_XSOC2;
1672 	else
1673 		min_gap_xsoc = ZERO_GAP_XSOC1;
1674 
1675 	if ((xsoc <= 30) && (di->dsoc >= di->pdata->zero_reserve_dsoc))
1676 		min_gap_xsoc = min_gap_xsoc + ZERO_GAP_CALIB;
1677 
1678 	di->zero_remain_cap = di->remain_cap;
1679 	di->zero_timeout_cnt = 0;
1680 	if ((di->dsoc <= 1) && (xsoc > 0)) {
1681 		di->zero_linek = 400;
1682 		di->zero_drop_sec = 0;
1683 	} else if (xsoc >= 0) {
1684 		di->zero_drop_sec = 0;
1685 		di->zero_linek = (di->zero_dsoc + xsoc / 2) / DIV(xsoc);
1686 		org_linek = di->zero_linek;
1687 		/* battery energy mode to use up voltage */
1688 		if ((di->pdata->energy_mode) &&
1689 		    (xsoc - di->dsoc >= ZERO_GAP_XSOC3) &&
1690 		    (di->dsoc <= 10) && (di->zero_linek < 300)) {
1691 			di->zero_linek = 300;
1692 			DBG("ZERO-new: zero_linek adjust step0...\n");
1693 		/* reserve enough power yet, slow down any way */
1694 		} else if ((xsoc - di->dsoc >= min_gap_xsoc) ||
1695 			   ((xsoc - di->dsoc >= ZERO_GAP_XSOC2) &&
1696 			    (di->dsoc <= 10) && (xsoc > 15))) {
1697 			if (xsoc <= 20 &&
1698 			    di->dsoc >= di->pdata->zero_reserve_dsoc)
1699 				di->zero_linek = 1200;
1700 			else if (xsoc - di->dsoc >= 2 * min_gap_xsoc)
1701 				di->zero_linek = 400;
1702 			else if (xsoc - di->dsoc >= 3 + min_gap_xsoc)
1703 				di->zero_linek = 600;
1704 			else
1705 				di->zero_linek = 800;
1706 			DBG("ZERO-new: zero_linek adjust step1...\n");
1707 		/* control zero mode beginning enter */
1708 		} else if ((di->zero_linek > 1800) && (di->dsoc > 70)) {
1709 			di->zero_linek = 1800;
1710 			DBG("ZERO-new: zero_linek adjust step2...\n");
1711 		/* dsoc close to xsoc: it must reserve power */
1712 		} else if ((di->zero_linek > 1000) && (di->zero_linek < 1200)) {
1713 			di->zero_linek = 1200;
1714 			DBG("ZERO-new: zero_linek adjust step3...\n");
1715 		/* dsoc[5~15], dsoc < xsoc */
1716 		} else if ((di->dsoc <= 15 && di->dsoc > 5) &&
1717 			   (di->zero_linek <= 1200)) {
1718 			/* slow down */
1719 			if (xsoc - di->dsoc >= min_gap_xsoc)
1720 				di->zero_linek = 800;
1721 			/* reserve power */
1722 			else
1723 				di->zero_linek = 1200;
1724 			DBG("ZERO-new: zero_linek adjust step4...\n");
1725 		/* dsoc[5, 100], dsoc < xsoc */
1726 		} else if ((di->zero_linek < 1000) && (di->dsoc >= 5)) {
1727 			if ((xsoc - di->dsoc) < min_gap_xsoc) {
1728 				/* reserve power */
1729 				di->zero_linek = 1200;
1730 			} else {
1731 				if (abs(di->current_avg) > 500)/* heavy */
1732 					di->zero_linek = 900;
1733 				else
1734 					di->zero_linek = 1000;
1735 			}
1736 			DBG("ZERO-new: zero_linek adjust step5...\n");
1737 		/* dsoc[0~5], dsoc < xsoc */
1738 		} else if ((di->zero_linek < 1000) && (di->dsoc <= 5)) {
1739 			if ((xsoc - di->dsoc) <= 3)
1740 				di->zero_linek = 1200;
1741 			else
1742 				di->zero_linek = 800;
1743 			DBG("ZERO-new: zero_linek adjust step6...\n");
1744 		}
1745 	} else {
1746 		/* xsoc < 0 */
1747 		di->zero_linek = 1000;
1748 		if (!di->zero_drop_sec)
1749 			di->zero_drop_sec = get_boot_sec();
1750 		if (base2sec(di->zero_drop_sec) >= WAIT_DSOC_DROP_SEC) {
1751 			DBG("ZERO0: t=%lu\n", base2sec(di->zero_drop_sec));
1752 			di->zero_drop_sec = 0;
1753 			di->dsoc--;
1754 			di->zero_dsoc = (di->dsoc + 1) * 1000 -
1755 						MIN_ACCURACY;
1756 		}
1757 	}
1758 
1759 	if (voltage_avg < pwroff_vol - 70) {
1760 		if (!di->shtd_drop_sec)
1761 			di->shtd_drop_sec = get_boot_sec();
1762 		if (base2sec(di->shtd_drop_sec) > WAIT_SHTD_DROP_SEC) {
1763 			BAT_INFO("voltage extreme low...soc:%d->0\n", di->dsoc);
1764 			di->shtd_drop_sec = 0;
1765 			di->dsoc = 0;
1766 		}
1767 	} else {
1768 		di->shtd_drop_sec = 0;
1769 	}
1770 
1771 	DBG("ZERO-new: org_linek=%d, zero_linek=%d, dsoc=%d, Xsoc=%d, "
1772 	    "rsoc=%d, gap=%d, v=%d, vsys=%d\n"
1773 	    "ZERO-new: di->zero_dsoc=%d, zero_remain_cap=%d, zero_drop=%ld, "
1774 	    "sht_drop=%ld\n\n",
1775 	    org_linek, di->zero_linek, di->dsoc, xsoc, di->rsoc,
1776 	    min_gap_xsoc, voltage_avg, vsys, di->zero_dsoc, di->zero_remain_cap,
1777 	    base2sec(di->zero_drop_sec), base2sec(di->shtd_drop_sec));
1778 }
1779 
rk818_bat_finish_algo_prepare(struct rk818_battery * di)1780 static void rk818_bat_finish_algo_prepare(struct rk818_battery *di)
1781 {
1782 	di->finish_base = get_boot_sec();
1783 	if (!di->finish_base)
1784 		di->finish_base = 1;
1785 }
1786 
rk818_bat_smooth_algo_prepare(struct rk818_battery * di)1787 static void rk818_bat_smooth_algo_prepare(struct rk818_battery *di)
1788 {
1789 	int tmp_soc;
1790 
1791 	tmp_soc = di->sm_chrg_dsoc / 1000;
1792 	if (tmp_soc != di->dsoc)
1793 		di->sm_chrg_dsoc = di->dsoc * 1000;
1794 
1795 	tmp_soc = di->sm_dischrg_dsoc / 1000;
1796 	if (tmp_soc != di->dsoc)
1797 		di->sm_dischrg_dsoc =
1798 		(di->dsoc + 1) * 1000 - MIN_ACCURACY;
1799 
1800 	DBG("<%s>. tmp_soc=%d, dsoc=%d, dsoc:sm_dischrg=%d, sm_chrg=%d\n",
1801 	    __func__, tmp_soc, di->dsoc, di->sm_dischrg_dsoc, di->sm_chrg_dsoc);
1802 
1803 	rk818_bat_calc_sm_linek(di);
1804 }
1805 
rk818_bat_zero_algo_prepare(struct rk818_battery * di)1806 static void rk818_bat_zero_algo_prepare(struct rk818_battery *di)
1807 {
1808 	int tmp_dsoc;
1809 
1810 	di->zero_timeout_cnt = 0;
1811 	tmp_dsoc = di->zero_dsoc / 1000;
1812 	if (tmp_dsoc != di->dsoc)
1813 		di->zero_dsoc = (di->dsoc + 1) * 1000 - MIN_ACCURACY;
1814 
1815 	DBG("<%s>. first calc, reinit linek\n", __func__);
1816 
1817 	rk818_bat_calc_zero_linek(di);
1818 }
1819 
rk818_bat_calc_zero_algorithm(struct rk818_battery * di)1820 static void rk818_bat_calc_zero_algorithm(struct rk818_battery *di)
1821 {
1822 	int tmp_soc = 0, sm_delta_dsoc = 0;
1823 
1824 	tmp_soc = di->zero_dsoc / 1000;
1825 	if (tmp_soc == di->dsoc)
1826 		goto out;
1827 
1828 	DBG("<%s>. enter: dsoc=%d, rsoc=%d\n", __func__, di->dsoc, di->rsoc);
1829 	/* when discharge slow down, take sm chrg into calc */
1830 	if (di->dsoc < di->rsoc) {
1831 		/* take sm charge rest into calc */
1832 		tmp_soc = di->sm_chrg_dsoc / 1000;
1833 		if (tmp_soc == di->dsoc) {
1834 			sm_delta_dsoc = di->sm_chrg_dsoc - di->dsoc * 1000;
1835 			di->sm_chrg_dsoc = di->dsoc * 1000;
1836 			di->zero_dsoc += sm_delta_dsoc;
1837 			DBG("ZERO1: take sm chrg,delta=%d\n", sm_delta_dsoc);
1838 		}
1839 	}
1840 
1841 	/* when discharge speed up, take sm dischrg into calc */
1842 	if (di->dsoc > di->rsoc) {
1843 		/* take sm discharge rest into calc */
1844 		tmp_soc = di->sm_dischrg_dsoc / 1000;
1845 		if (tmp_soc == di->dsoc) {
1846 			sm_delta_dsoc = di->sm_dischrg_dsoc -
1847 				((di->dsoc + 1) * 1000 - MIN_ACCURACY);
1848 			di->sm_dischrg_dsoc = (di->dsoc + 1) * 1000 -
1849 								MIN_ACCURACY;
1850 			di->zero_dsoc += sm_delta_dsoc;
1851 			DBG("ZERO1: take sm dischrg,delta=%d\n", sm_delta_dsoc);
1852 		}
1853 	}
1854 
1855 	/* check overflow */
1856 	if (di->zero_dsoc > (di->dsoc + 1) * 1000 - MIN_ACCURACY) {
1857 		DBG("ZERO1: zero dsoc overflow: %d\n", di->zero_dsoc);
1858 		di->zero_dsoc = (di->dsoc + 1) * 1000 - MIN_ACCURACY;
1859 	}
1860 
1861 	/* check new dsoc */
1862 	tmp_soc = di->zero_dsoc / 1000;
1863 	if (tmp_soc != di->dsoc) {
1864 		/* avoid dsoc jump when heavy load */
1865 		if ((di->dsoc - tmp_soc) > 1) {
1866 			di->dsoc--;
1867 			di->zero_dsoc = (di->dsoc + 1) * 1000 - MIN_ACCURACY;
1868 			DBG("ZERO1: heavy load...\n");
1869 		} else {
1870 			di->dsoc = tmp_soc;
1871 		}
1872 		di->zero_drop_sec = 0;
1873 	}
1874 
1875 out:
1876 	DBG("ZERO1: zero_dsoc(Y0)=%d, dsoc=%d, rsoc=%d, tmp_soc=%d\n",
1877 	    di->zero_dsoc, di->dsoc, di->rsoc, tmp_soc);
1878 	DBG("ZERO1: sm_dischrg_dsoc=%d, sm_chrg_dsoc=%d\n",
1879 	    di->sm_dischrg_dsoc, di->sm_chrg_dsoc);
1880 }
1881 
rk818_bat_zero_algorithm(struct rk818_battery * di)1882 static void rk818_bat_zero_algorithm(struct rk818_battery *di)
1883 {
1884 	int delta_cap = 0, delta_soc = 0;
1885 
1886 	di->zero_timeout_cnt++;
1887 	delta_cap = di->zero_remain_cap - di->remain_cap;
1888 	delta_soc = di->zero_linek * (delta_cap * 100) / DIV(di->fcc);
1889 
1890 	DBG("ZERO1: zero_linek=%d, zero_dsoc(Y0)=%d, dsoc=%d, rsoc=%d\n"
1891 	    "ZERO1: delta_soc(X0)=%d, delta_cap=%d, zero_remain_cap = %d\n"
1892 	    "ZERO1: timeout_cnt=%d, sm_dischrg=%d, sm_chrg=%d\n\n",
1893 	    di->zero_linek, di->zero_dsoc, di->dsoc, di->rsoc,
1894 	    delta_soc, delta_cap, di->zero_remain_cap,
1895 	    di->zero_timeout_cnt, di->sm_dischrg_dsoc, di->sm_chrg_dsoc);
1896 
1897 	if ((delta_soc >= MIN_ZERO_DSOC_ACCURACY) ||
1898 	    (di->zero_timeout_cnt > MIN_ZERO_OVERCNT) ||
1899 	    (di->zero_linek == 0)) {
1900 		DBG("ZERO1:--------- enter calc -----------\n");
1901 		di->zero_timeout_cnt = 0;
1902 		di->zero_dsoc -= delta_soc;
1903 		rk818_bat_calc_zero_algorithm(di);
1904 		rk818_bat_calc_zero_linek(di);
1905 	}
1906 }
1907 
rk818_bat_dump_time_table(struct rk818_battery * di)1908 static void rk818_bat_dump_time_table(struct rk818_battery *di)
1909 {
1910 	u8 i;
1911 	static int old_index;
1912 	static int old_min;
1913 	int mod = di->dsoc % 10;
1914 	int index = di->dsoc / 10;
1915 	u32 time;
1916 
1917 	if (rk818_bat_chrg_online(di))
1918 		time = base2min(di->plug_in_base);
1919 	else
1920 		time = base2min(di->plug_out_base);
1921 
1922 	if ((mod == 0) && (index > 0) && (old_index != index)) {
1923 		di->dbg_chrg_min[index - 1] = time - old_min;
1924 		old_min = time;
1925 		old_index = index;
1926 	}
1927 
1928 	for (i = 1; i < 11; i++)
1929 		DBG("Time[%d]=%d, ", (i * 10), di->dbg_chrg_min[i - 1]);
1930 	DBG("\n");
1931 }
1932 
rk818_bat_debug_info(struct rk818_battery * di)1933 static void rk818_bat_debug_info(struct rk818_battery *di)
1934 {
1935 	u8 sup_tst, ggcon, ggsts, vb_mod, ts_ctrl, reboot_cnt;
1936 	u8 usb_ctrl, chrg_ctrl1, thermal;
1937 	u8 int_sts1, int_sts2;
1938 	u8 int_msk1, int_msk2;
1939 	u8 chrg_ctrl2, chrg_ctrl3, rtc, misc, dcdc_en;
1940 	char *work_mode[] = {"ZERO", "FINISH", "UN", "UN", "SMOOTH"};
1941 	char *bat_mode[] = {"BAT", "VIRTUAL"};
1942 
1943 	if (rk818_bat_chrg_online(di))
1944 		di->plug_out_base = get_boot_sec();
1945 	else
1946 		di->plug_in_base = get_boot_sec();
1947 
1948 	rk818_bat_dump_time_table(di);
1949 
1950 	if (!dbg_enable)
1951 		return;
1952 
1953 	ts_ctrl = rk818_bat_read(di, RK818_TS_CTRL_REG);
1954 	misc = rk818_bat_read(di, RK818_MISC_MARK_REG);
1955 	ggcon = rk818_bat_read(di, RK818_GGCON_REG);
1956 	ggsts = rk818_bat_read(di, RK818_GGSTS_REG);
1957 	sup_tst = rk818_bat_read(di, RK818_SUP_STS_REG);
1958 	vb_mod = rk818_bat_read(di, RK818_VB_MON_REG);
1959 	usb_ctrl = rk818_bat_read(di, RK818_USB_CTRL_REG);
1960 	chrg_ctrl1 = rk818_bat_read(di, RK818_CHRG_CTRL_REG1);
1961 	chrg_ctrl2 = rk818_bat_read(di, RK818_CHRG_CTRL_REG2);
1962 	chrg_ctrl3 = rk818_bat_read(di, RK818_CHRG_CTRL_REG3);
1963 	rtc = rk818_bat_read(di, 0);
1964 	thermal = rk818_bat_read(di, RK818_THERMAL_REG);
1965 	int_sts1 = rk818_bat_read(di, RK818_INT_STS_REG1);
1966 	int_sts2 = rk818_bat_read(di, RK818_INT_STS_REG2);
1967 	int_msk1 = rk818_bat_read(di, RK818_INT_STS_MSK_REG1);
1968 	int_msk2 = rk818_bat_read(di, RK818_INT_STS_MSK_REG2);
1969 	dcdc_en = rk818_bat_read(di, RK818_DCDC_EN_REG);
1970 	reboot_cnt = rk818_bat_read(di, RK818_REBOOT_CNT_REG);
1971 
1972 	DBG("\n------- DEBUG REGS, [Ver: %s] -------------------\n"
1973 	    "GGCON=0x%2x, GGSTS=0x%2x, RTC=0x%2x, DCDC_EN2=0x%2x\n"
1974 	    "SUP_STS= 0x%2x, VB_MOD=0x%2x, USB_CTRL=0x%2x\n"
1975 	    "THERMAL=0x%2x, MISC_MARK=0x%2x, TS_CTRL=0x%2x\n"
1976 	    "CHRG_CTRL:REG1=0x%2x, REG2=0x%2x, REG3=0x%2x\n"
1977 	    "INT_STS:  REG1=0x%2x, REG2=0x%2x\n"
1978 	    "INT_MSK:  REG1=0x%2x, REG2=0x%2x\n",
1979 	    DRIVER_VERSION, ggcon, ggsts, rtc, dcdc_en,
1980 	    sup_tst, vb_mod, usb_ctrl,
1981 	    thermal, misc, ts_ctrl,
1982 	    chrg_ctrl1, chrg_ctrl2, chrg_ctrl3,
1983 	    int_sts1, int_sts2, int_msk1, int_msk2
1984 	   );
1985 
1986 	DBG("###############################################################\n"
1987 	    "Dsoc=%d, Rsoc=%d, Vavg=%d, Iavg=%d, Cap=%d, Fcc=%d, d=%d\n"
1988 	    "K=%d, Mode=%s, Oldcap=%d, Is=%d, Ip=%d, Vs=%d\n"
1989 	    "fb_temp=%d, bat_temp=%d, sample_res=%d, USB=%d, DC=%d\n"
1990 	    "off:i=0x%x, c=0x%x, p=%d, Rbat=%d, age_ocv_cap=%d, fb=%d, hot=%d\n"
1991 	    "adp:finish=%lu, boot_min=%lu, sleep_min=%lu, adc=%d, Vsys=%d\n"
1992 	    "bat:%s, meet: soc=%d, calc: dsoc=%d, rsoc=%d, Vocv=%d\n"
1993 	    "pwr: dsoc=%d, rsoc=%d, vol=%d, halt: st=%d, cnt=%d, reboot=%d\n"
1994 	    "ocv_c=%d: %d -> %d; max_c=%d: %d -> %d; force_c=%d: %d -> %d\n"
1995 	    "min=%d, init=%d, sw=%d, below0=%d, first=%d, changed=%d\n"
1996 	    "###############################################################\n",
1997 	    di->dsoc, di->rsoc, di->voltage_avg, di->current_avg,
1998 	    di->remain_cap, di->fcc, di->rsoc - di->dsoc,
1999 	    di->sm_linek, work_mode[di->work_mode], di->sm_remain_cap,
2000 	    di->res_div * chrg_cur_sel_array[chrg_ctrl1 & 0x0f],
2001 	    chrg_cur_input_array[usb_ctrl & 0x0f],
2002 	    chrg_vol_sel_array[(chrg_ctrl1 & 0x70) >> 4],
2003 	    feedback_temp_array[(thermal & 0x0c) >> 2], di->temperature,
2004 	    di->pdata->sample_res, di->usb_in, di->ac_in,
2005 	    rk818_bat_get_ioffset(di),
2006 	    rk818_bat_get_coffset(di), di->poffset, di->bat_res,
2007 	    di->age_adjust_cap, di->fb_blank, !!(thermal & HOTDIE_STS),
2008 	    base2min(di->finish_base),
2009 	    base2min(di->boot_base), di->sleep_sum_sec / 60,
2010 	    di->adc_allow_update,
2011 	    di->voltage_avg + di->current_avg * DEF_PWRPATH_RES / 1000,
2012 	    bat_mode[di->pdata->bat_mode], di->dbg_meet_soc, di->dbg_calc_dsoc,
2013 	    di->dbg_calc_rsoc, di->voltage_ocv, di->dbg_pwr_dsoc,
2014 	    di->dbg_pwr_rsoc, di->dbg_pwr_vol, di->is_halt, di->halt_cnt,
2015 	    reboot_cnt, di->is_ocv_calib, di->ocv_pre_dsoc, di->ocv_new_dsoc,
2016 	    di->is_max_soc_offset, di->max_pre_dsoc, di->max_new_dsoc,
2017 	    di->is_force_calib, di->force_pre_dsoc, di->force_new_dsoc,
2018 	    di->pwroff_min, di->is_initialized, di->is_sw_reset,
2019 	    di->dbg_cap_low0, di->is_first_on, di->last_dsoc
2020 	   );
2021 }
2022 
rk818_bat_init_capacity(struct rk818_battery * di,u32 cap)2023 static void rk818_bat_init_capacity(struct rk818_battery *di, u32 cap)
2024 {
2025 	int delta_cap;
2026 
2027 	delta_cap = cap - di->remain_cap;
2028 	if (!delta_cap)
2029 		return;
2030 
2031 	di->age_adjust_cap += delta_cap;
2032 	rk818_bat_init_coulomb_cap(di, cap);
2033 	rk818_bat_smooth_algo_prepare(di);
2034 	rk818_bat_zero_algo_prepare(di);
2035 }
2036 
rk818_bat_update_age_fcc(struct rk818_battery * di)2037 static void rk818_bat_update_age_fcc(struct rk818_battery *di)
2038 {
2039 	int fcc, remain_cap, age_keep_min, lock_fcc;
2040 
2041 	lock_fcc = rk818_bat_get_coulomb_cap(di);
2042 	remain_cap = lock_fcc - di->age_ocv_cap - di->age_adjust_cap;
2043 	age_keep_min = base2min(di->age_keep_sec);
2044 
2045 	DBG("%s: lock_fcc=%d, age_ocv_cap=%d, age_adjust_cap=%d, remain_cap=%d,"
2046 	    "age_allow_update=%d, age_keep_min=%d\n",
2047 	    __func__, lock_fcc, di->age_ocv_cap, di->age_adjust_cap, remain_cap,
2048 	    di->age_allow_update, age_keep_min);
2049 
2050 	if ((di->chrg_status == CHARGE_FINISH) && (di->age_allow_update) &&
2051 	    (age_keep_min < 1200)) {
2052 		di->age_allow_update = false;
2053 		fcc = remain_cap * 100 / DIV(100 - di->age_ocv_soc);
2054 		BAT_INFO("lock_fcc=%d, calc_cap=%d, age: soc=%d, cap=%d, "
2055 			 "level=%d, fcc:%d->%d?\n",
2056 			 lock_fcc, remain_cap, di->age_ocv_soc,
2057 			 di->age_ocv_cap, di->age_level, di->fcc, fcc);
2058 
2059 		if ((fcc < di->qmax) && (fcc > MIN_FCC)) {
2060 			BAT_INFO("fcc:%d->%d!\n", di->fcc, fcc);
2061 			di->fcc = fcc;
2062 			rk818_bat_init_capacity(di, di->fcc);
2063 			rk818_bat_save_fcc(di, di->fcc);
2064 			rk818_bat_save_age_level(di, di->age_level);
2065 		}
2066 	}
2067 }
2068 
rk818_bat_wait_finish_sig(struct rk818_battery * di)2069 static void rk818_bat_wait_finish_sig(struct rk818_battery *di)
2070 {
2071 	int chrg_finish_vol = di->pdata->max_chrg_voltage;
2072 
2073 	if (!rk818_bat_chrg_online(di))
2074 		return;
2075 
2076 	if ((di->chrg_status == CHARGE_FINISH) && (di->adc_allow_update) &&
2077 	    (di->voltage_avg > chrg_finish_vol - 150)) {
2078 		rk818_bat_update_age_fcc(di);
2079 		if (rk818_bat_adc_calib(di))
2080 			di->adc_allow_update = false;
2081 	}
2082 }
2083 
rk818_bat_finish_algorithm(struct rk818_battery * di)2084 static void rk818_bat_finish_algorithm(struct rk818_battery *di)
2085 {
2086 	unsigned long finish_sec, soc_sec;
2087 	int plus_soc, finish_current, rest = 0;
2088 
2089 	/* rsoc */
2090 	if ((di->remain_cap != di->fcc) &&
2091 	    (rk818_bat_get_chrg_status(di) == CHARGE_FINISH)) {
2092 		di->age_adjust_cap += (di->fcc - di->remain_cap);
2093 		rk818_bat_init_coulomb_cap(di, di->fcc);
2094 	}
2095 
2096 	/* dsoc */
2097 	if (di->dsoc < 100) {
2098 		if (!di->finish_base)
2099 			di->finish_base = get_boot_sec();
2100 		finish_current = (di->rsoc - di->dsoc) >  FINISH_MAX_SOC_DELAY ?
2101 					FINISH_CHRG_CUR2 : FINISH_CHRG_CUR1;
2102 		finish_sec = base2sec(di->finish_base);
2103 		soc_sec = di->fcc * 3600 / 100 / DIV(finish_current);
2104 		plus_soc = finish_sec / DIV(soc_sec);
2105 		if (finish_sec > soc_sec) {
2106 			rest = finish_sec % soc_sec;
2107 			di->dsoc += plus_soc;
2108 			di->finish_base = get_boot_sec();
2109 			if (di->finish_base > rest)
2110 				di->finish_base = get_boot_sec() - rest;
2111 		}
2112 		DBG("<%s>.CHARGE_FINISH:dsoc<100,dsoc=%d\n"
2113 		    "soc_time=%lu, sec_finish=%lu, plus_soc=%d, rest=%d\n",
2114 		    __func__, di->dsoc, soc_sec, finish_sec, plus_soc, rest);
2115 	}
2116 }
2117 
rk818_bat_calc_smooth_dischrg(struct rk818_battery * di)2118 static void rk818_bat_calc_smooth_dischrg(struct rk818_battery *di)
2119 {
2120 	int tmp_soc = 0, sm_delta_dsoc = 0, zero_delta_dsoc = 0;
2121 
2122 	tmp_soc = di->sm_dischrg_dsoc / 1000;
2123 	if (tmp_soc == di->dsoc)
2124 		goto out;
2125 
2126 	DBG("<%s>. enter: dsoc=%d, rsoc=%d\n", __func__, di->dsoc, di->rsoc);
2127 	/* when dischrge slow down, take sm charge rest into calc */
2128 	if (di->dsoc < di->rsoc) {
2129 		tmp_soc = di->sm_chrg_dsoc / 1000;
2130 		if (tmp_soc == di->dsoc) {
2131 			sm_delta_dsoc = di->sm_chrg_dsoc - di->dsoc * 1000;
2132 			di->sm_chrg_dsoc = di->dsoc * 1000;
2133 			di->sm_dischrg_dsoc += sm_delta_dsoc;
2134 			DBG("<%s>. take sm dischrg, delta=%d\n",
2135 			    __func__, sm_delta_dsoc);
2136 		}
2137 	}
2138 
2139 	/* when discharge speed up, take zero discharge rest into calc */
2140 	if (di->dsoc > di->rsoc) {
2141 		tmp_soc = di->zero_dsoc / 1000;
2142 		if (tmp_soc == di->dsoc) {
2143 			zero_delta_dsoc = di->zero_dsoc - ((di->dsoc + 1) *
2144 						1000 - MIN_ACCURACY);
2145 			di->zero_dsoc = (di->dsoc + 1) * 1000 - MIN_ACCURACY;
2146 			di->sm_dischrg_dsoc += zero_delta_dsoc;
2147 			DBG("<%s>. take zero schrg, delta=%d\n",
2148 			    __func__, zero_delta_dsoc);
2149 		}
2150 	}
2151 
2152 	/* check up overflow */
2153 	if ((di->sm_dischrg_dsoc) > ((di->dsoc + 1) * 1000 - MIN_ACCURACY)) {
2154 		DBG("<%s>. dischrg_dsoc up overflow\n", __func__);
2155 		di->sm_dischrg_dsoc = (di->dsoc + 1) *
2156 					1000 - MIN_ACCURACY;
2157 	}
2158 
2159 	/* check new dsoc */
2160 	tmp_soc = di->sm_dischrg_dsoc / 1000;
2161 	if (tmp_soc != di->dsoc) {
2162 		di->dsoc = tmp_soc;
2163 		di->sm_chrg_dsoc = di->dsoc * 1000;
2164 	}
2165 out:
2166 	DBG("<%s>. dsoc=%d, rsoc=%d, dsoc:sm_dischrg=%d, sm_chrg=%d, zero=%d\n",
2167 	    __func__, di->dsoc, di->rsoc, di->sm_dischrg_dsoc, di->sm_chrg_dsoc,
2168 	    di->zero_dsoc);
2169 
2170 }
2171 
rk818_bat_calc_smooth_chrg(struct rk818_battery * di)2172 static void rk818_bat_calc_smooth_chrg(struct rk818_battery *di)
2173 {
2174 	int tmp_soc = 0, sm_delta_dsoc = 0, zero_delta_dsoc = 0;
2175 
2176 	tmp_soc = di->sm_chrg_dsoc / 1000;
2177 	if (tmp_soc == di->dsoc)
2178 		goto out;
2179 
2180 	DBG("<%s>. enter: dsoc=%d, rsoc=%d\n", __func__, di->dsoc, di->rsoc);
2181 	/* when charge slow down, take zero & sm dischrg into calc */
2182 	if (di->dsoc > di->rsoc) {
2183 		/* take sm discharge rest into calc */
2184 		tmp_soc = di->sm_dischrg_dsoc / 1000;
2185 		if (tmp_soc == di->dsoc) {
2186 			sm_delta_dsoc = di->sm_dischrg_dsoc -
2187 					((di->dsoc + 1) * 1000 - MIN_ACCURACY);
2188 			di->sm_dischrg_dsoc = (di->dsoc + 1) * 1000 -
2189 							MIN_ACCURACY;
2190 			di->sm_chrg_dsoc += sm_delta_dsoc;
2191 			DBG("<%s>. take sm dischrg, delta=%d\n",
2192 			   __func__, sm_delta_dsoc);
2193 		}
2194 
2195 		/* take zero discharge rest into calc */
2196 		tmp_soc = di->zero_dsoc / 1000;
2197 		if (tmp_soc == di->dsoc) {
2198 			zero_delta_dsoc = di->zero_dsoc -
2199 			((di->dsoc + 1) * 1000 - MIN_ACCURACY);
2200 			di->zero_dsoc = (di->dsoc + 1) * 1000 - MIN_ACCURACY;
2201 			di->sm_chrg_dsoc += zero_delta_dsoc;
2202 			DBG("<%s>. take zero dischrg, delta=%d\n",
2203 			    __func__, zero_delta_dsoc);
2204 		}
2205 	}
2206 
2207 	/* check down overflow */
2208 	if (di->sm_chrg_dsoc < di->dsoc * 1000) {
2209 		DBG("<%s>. chrg_dsoc down overflow\n", __func__);
2210 		di->sm_chrg_dsoc = di->dsoc * 1000;
2211 	}
2212 
2213 	/* check new dsoc */
2214 	tmp_soc = di->sm_chrg_dsoc / 1000;
2215 	if (tmp_soc != di->dsoc) {
2216 		di->dsoc = tmp_soc;
2217 		di->sm_dischrg_dsoc = (di->dsoc + 1) * 1000 - MIN_ACCURACY;
2218 	}
2219 out:
2220 	DBG("<%s>.dsoc=%d, rsoc=%d, dsoc: sm_dischrg=%d, sm_chrg=%d, zero=%d\n",
2221 	    __func__, di->dsoc, di->rsoc, di->sm_dischrg_dsoc, di->sm_chrg_dsoc,
2222 	    di->zero_dsoc);
2223 }
2224 
rk818_bat_smooth_algorithm(struct rk818_battery * di)2225 static void rk818_bat_smooth_algorithm(struct rk818_battery *di)
2226 {
2227 	int ydsoc = 0, delta_cap = 0, old_cap = 0;
2228 	unsigned long tgt_sec = 0;
2229 
2230 	di->remain_cap = rk818_bat_get_coulomb_cap(di);
2231 
2232 	/* full charge: slow down */
2233 	if ((di->dsoc == 99) && (di->chrg_status == CC_OR_CV) &&
2234 	    (di->current_avg > 0)) {
2235 		di->sm_linek = FULL_CHRG_K;
2236 	/* terminal charge, slow down */
2237 	} else if ((di->current_avg >= TERM_CHRG_CURR) &&
2238 	    (di->chrg_status == CC_OR_CV) && (di->dsoc >= TERM_CHRG_DSOC)) {
2239 		di->sm_linek = TERM_CHRG_K;
2240 		DBG("<%s>. terminal mode..\n", __func__);
2241 	/* simulate charge, speed up */
2242 	} else if ((di->current_avg <= SIMULATE_CHRG_CURR) &&
2243 		   (di->current_avg > 0) && (di->chrg_status == CC_OR_CV) &&
2244 		   (di->dsoc < TERM_CHRG_DSOC) &&
2245 		   ((di->rsoc - di->dsoc) >= SIMULATE_CHRG_INTV)) {
2246 		di->sm_linek = SIMULATE_CHRG_K;
2247 		DBG("<%s>. simulate mode..\n", __func__);
2248 	} else {
2249 		/* charge and discharge switch */
2250 		if ((di->sm_linek * di->current_avg <= 0) ||
2251 		    (di->sm_linek == TERM_CHRG_K) ||
2252 		    (di->sm_linek == FULL_CHRG_K) ||
2253 		    (di->sm_linek == SIMULATE_CHRG_K)) {
2254 			DBG("<%s>. linek mode, retinit sm linek..\n", __func__);
2255 			rk818_bat_calc_sm_linek(di);
2256 		}
2257 	}
2258 
2259 	old_cap = di->sm_remain_cap;
2260 	/*
2261 	 * when dsoc equal rsoc(not include full, term, simulate case),
2262 	 * sm_linek should change to -1000/1000 smoothly to avoid dsoc+1/-1
2263 	 * right away, so change it after flat seconds
2264 	 */
2265 	if ((di->dsoc == di->rsoc) && (abs(di->sm_linek) != 1000) &&
2266 	    (di->sm_linek != FULL_CHRG_K && di->sm_linek != TERM_CHRG_K &&
2267 	     di->sm_linek != SIMULATE_CHRG_K)) {
2268 		if (!di->flat_match_sec)
2269 			di->flat_match_sec = get_boot_sec();
2270 		tgt_sec = di->fcc * 3600 / 100 / DIV(abs(di->current_avg)) / 3;
2271 		if (base2sec(di->flat_match_sec) >= tgt_sec) {
2272 			di->flat_match_sec = 0;
2273 			di->sm_linek = (di->current_avg >= 0) ? 1000 : -1000;
2274 		}
2275 		DBG("<%s>. flat_sec=%ld, tgt_sec=%ld, sm_k=%d\n", __func__,
2276 		    base2sec(di->flat_match_sec), tgt_sec, di->sm_linek);
2277 	} else {
2278 		di->flat_match_sec = 0;
2279 	}
2280 
2281 	/* abs(k)=1000 or dsoc=100, stop calc */
2282 	if ((abs(di->sm_linek) == 1000) || (di->current_avg >= 0 &&
2283 	     di->chrg_status == CC_OR_CV && di->dsoc >= 100)) {
2284 		DBG("<%s>. sm_linek=%d\n", __func__, di->sm_linek);
2285 		if (abs(di->sm_linek) == 1000) {
2286 			di->dsoc = di->rsoc;
2287 			di->sm_linek = (di->sm_linek > 0) ? 1000 : -1000;
2288 			DBG("<%s>. dsoc == rsoc, sm_linek=%d\n",
2289 			    __func__, di->sm_linek);
2290 		}
2291 		di->sm_remain_cap = di->remain_cap;
2292 		di->sm_chrg_dsoc = di->dsoc * 1000;
2293 		di->sm_dischrg_dsoc = (di->dsoc + 1) * 1000 - MIN_ACCURACY;
2294 		DBG("<%s>. sm_dischrg_dsoc=%d, sm_chrg_dsoc=%d\n",
2295 		    __func__, di->sm_dischrg_dsoc, di->sm_chrg_dsoc);
2296 	} else {
2297 		delta_cap = di->remain_cap - di->sm_remain_cap;
2298 		if (delta_cap == 0) {
2299 			DBG("<%s>. delta_cap = 0\n", __func__);
2300 			return;
2301 		}
2302 		ydsoc = di->sm_linek * abs(delta_cap) * 100 / DIV(di->fcc);
2303 		if (ydsoc == 0) {
2304 			DBG("<%s>. ydsoc = 0\n", __func__);
2305 			return;
2306 		}
2307 		di->sm_remain_cap = di->remain_cap;
2308 
2309 		DBG("<%s>. k=%d, ydsoc=%d; cap:old=%d, new:%d; delta_cap=%d\n",
2310 		    __func__, di->sm_linek, ydsoc, old_cap,
2311 		    di->sm_remain_cap, delta_cap);
2312 
2313 		/* discharge mode */
2314 		if (ydsoc < 0) {
2315 			di->sm_dischrg_dsoc += ydsoc;
2316 			rk818_bat_calc_smooth_dischrg(di);
2317 		/* charge mode */
2318 		} else {
2319 			di->sm_chrg_dsoc += ydsoc;
2320 			rk818_bat_calc_smooth_chrg(di);
2321 		}
2322 
2323 		if (di->s2r) {
2324 			di->s2r = false;
2325 			rk818_bat_calc_sm_linek(di);
2326 		}
2327 	}
2328 }
2329 
2330 /*
2331  * cccv and finish switch all the time will cause dsoc freeze,
2332  * if so, do finish chrg, 100ma is less than min finish_ma.
2333  */
rk818_bat_fake_finish_mode(struct rk818_battery * di)2334 static bool rk818_bat_fake_finish_mode(struct rk818_battery *di)
2335 {
2336 	if ((di->rsoc == 100) && (rk818_bat_get_chrg_status(di) == CC_OR_CV) &&
2337 	    (abs(di->current_avg) <= 100))
2338 		return true;
2339 	else
2340 		return false;
2341 }
2342 
rk818_bat_display_smooth(struct rk818_battery * di)2343 static void rk818_bat_display_smooth(struct rk818_battery *di)
2344 {
2345 	/* discharge: reinit "zero & smooth" algorithm to avoid handling dsoc */
2346 	if (di->s2r && !di->sleep_chrg_online) {
2347 		DBG("s2r: discharge, reset algorithm...\n");
2348 		di->s2r = false;
2349 		rk818_bat_zero_algo_prepare(di);
2350 		rk818_bat_smooth_algo_prepare(di);
2351 		return;
2352 	}
2353 
2354 	if (di->work_mode == MODE_FINISH) {
2355 		DBG("step1: charge finish...\n");
2356 		rk818_bat_finish_algorithm(di);
2357 		if ((rk818_bat_get_chrg_status(di) != CHARGE_FINISH) &&
2358 		    !rk818_bat_fake_finish_mode(di)) {
2359 			if ((di->current_avg < 0) &&
2360 			    (di->voltage_avg < di->pdata->zero_algorithm_vol)) {
2361 				DBG("step1: change to zero mode...\n");
2362 				rk818_bat_zero_algo_prepare(di);
2363 				di->work_mode = MODE_ZERO;
2364 			} else {
2365 				DBG("step1: change to smooth mode...\n");
2366 				rk818_bat_smooth_algo_prepare(di);
2367 				di->work_mode = MODE_SMOOTH;
2368 			}
2369 		}
2370 	} else if (di->work_mode == MODE_ZERO) {
2371 		DBG("step2: zero algorithm...\n");
2372 		rk818_bat_zero_algorithm(di);
2373 		if ((di->voltage_avg >= di->pdata->zero_algorithm_vol + 50) ||
2374 		    (di->current_avg >= 0)) {
2375 			DBG("step2: change to smooth mode...\n");
2376 			rk818_bat_smooth_algo_prepare(di);
2377 			di->work_mode = MODE_SMOOTH;
2378 		} else if ((rk818_bat_get_chrg_status(di) == CHARGE_FINISH) ||
2379 			   rk818_bat_fake_finish_mode(di)) {
2380 			DBG("step2: change to finish mode...\n");
2381 			rk818_bat_finish_algo_prepare(di);
2382 			di->work_mode = MODE_FINISH;
2383 		}
2384 	} else {
2385 		DBG("step3: smooth algorithm...\n");
2386 		rk818_bat_smooth_algorithm(di);
2387 		if ((di->current_avg < 0) &&
2388 		    (di->voltage_avg < di->pdata->zero_algorithm_vol)) {
2389 			DBG("step3: change to zero mode...\n");
2390 			rk818_bat_zero_algo_prepare(di);
2391 			di->work_mode = MODE_ZERO;
2392 		} else if ((rk818_bat_get_chrg_status(di) == CHARGE_FINISH) ||
2393 			   rk818_bat_fake_finish_mode(di)) {
2394 			DBG("step3: change to finish mode...\n");
2395 			rk818_bat_finish_algo_prepare(di);
2396 			di->work_mode = MODE_FINISH;
2397 		}
2398 	}
2399 }
2400 
rk818_bat_relax_vol_calib(struct rk818_battery * di)2401 static void rk818_bat_relax_vol_calib(struct rk818_battery *di)
2402 {
2403 	int soc, cap, vol;
2404 
2405 	vol = di->voltage_relax;
2406 	soc = rk818_bat_vol_to_ocvsoc(di, vol);
2407 	cap = rk818_bat_vol_to_ocvcap(di, vol);
2408 	rk818_bat_init_capacity(di, cap);
2409 	BAT_INFO("sleep ocv calib: rsoc=%d, cap=%d\n", soc, cap);
2410 }
2411 
rk818_bat_relife_age_flag(struct rk818_battery * di)2412 static void rk818_bat_relife_age_flag(struct rk818_battery *di)
2413 {
2414 	u8 ocv_soc, ocv_cap, soc_level;
2415 
2416 	if (di->voltage_relax <= 0)
2417 		return;
2418 
2419 	ocv_soc = rk818_bat_vol_to_ocvsoc(di, di->voltage_relax);
2420 	ocv_cap = rk818_bat_vol_to_ocvcap(di, di->voltage_relax);
2421 	DBG("<%s>. ocv_soc=%d, min=%lu, vol=%d\n", __func__,
2422 	    ocv_soc, di->sleep_dischrg_sec / 60, di->voltage_relax);
2423 
2424 	/* sleep enough time and ocv_soc enough low */
2425 	if (!di->age_allow_update && ocv_soc <= 10) {
2426 		di->age_voltage = di->voltage_relax;
2427 		di->age_ocv_cap = ocv_cap;
2428 		di->age_ocv_soc = ocv_soc;
2429 		di->age_adjust_cap = 0;
2430 
2431 		if (ocv_soc <= 1)
2432 			di->age_level = 100;
2433 		else if (ocv_soc < 5)
2434 			di->age_level = 90;
2435 		else
2436 			di->age_level = 80;
2437 
2438 		soc_level = rk818_bat_get_age_level(di);
2439 		if (soc_level > di->age_level) {
2440 			di->age_allow_update = false;
2441 		} else {
2442 			di->age_allow_update = true;
2443 			di->age_keep_sec = get_boot_sec();
2444 		}
2445 
2446 		BAT_INFO("resume: age_vol:%d, age_ocv_cap:%d, age_ocv_soc:%d, "
2447 			 "soc_level:%d, age_allow_update:%d, "
2448 			 "age_level:%d\n",
2449 			 di->age_voltage, di->age_ocv_cap, ocv_soc, soc_level,
2450 			 di->age_allow_update, di->age_level);
2451 	}
2452 }
2453 
rk818_bat_sleep_dischrg(struct rk818_battery * di)2454 static int rk818_bat_sleep_dischrg(struct rk818_battery *di)
2455 {
2456 	bool ocv_soc_updated = false;
2457 	int tgt_dsoc, gap_soc, sleep_soc = 0;
2458 	int pwroff_vol = di->pdata->pwroff_vol;
2459 	unsigned long sleep_sec = di->sleep_dischrg_sec;
2460 
2461 	DBG("<%s>. enter: dsoc=%d, rsoc=%d, rv=%d, v=%d, sleep_min=%lu\n",
2462 	    __func__, di->dsoc, di->rsoc, di->voltage_relax,
2463 	    di->voltage_avg, sleep_sec / 60);
2464 
2465 	if (di->voltage_relax >= di->voltage_avg) {
2466 		rk818_bat_relax_vol_calib(di);
2467 		rk818_bat_restart_relax(di);
2468 		rk818_bat_relife_age_flag(di);
2469 		ocv_soc_updated = true;
2470 	}
2471 
2472 	/* handle dsoc */
2473 	if (di->dsoc <= di->rsoc) {
2474 		di->sleep_sum_cap = (SLP_CURR_MIN * sleep_sec / 3600);
2475 		sleep_soc = di->sleep_sum_cap * 100 / DIV(di->fcc);
2476 		tgt_dsoc = di->dsoc - sleep_soc;
2477 		if (sleep_soc > 0) {
2478 			BAT_INFO("calib0: rl=%d, dl=%d, intval=%d\n",
2479 				 di->rsoc, di->dsoc, sleep_soc);
2480 			if (di->dsoc < 5) {
2481 				di->dsoc--;
2482 			} else if ((tgt_dsoc < 5) && (di->dsoc >= 5)) {
2483 				if (di->dsoc == 5)
2484 					di->dsoc--;
2485 				else
2486 					di->dsoc = 5;
2487 			} else if (tgt_dsoc > 5) {
2488 				di->dsoc = tgt_dsoc;
2489 			}
2490 		}
2491 
2492 		DBG("%s: dsoc<=rsoc, sum_cap=%d==>sleep_soc=%d, tgt_dsoc=%d\n",
2493 		    __func__, di->sleep_sum_cap, sleep_soc, tgt_dsoc);
2494 	} else {
2495 		/* di->dsoc > di->rsoc */
2496 		di->sleep_sum_cap = (SLP_CURR_MAX * sleep_sec / 3600);
2497 		sleep_soc = di->sleep_sum_cap / DIV(di->fcc / 100);
2498 		gap_soc = di->dsoc - di->rsoc;
2499 
2500 		BAT_INFO("calib1: rsoc=%d, dsoc=%d, intval=%d\n",
2501 			 di->rsoc, di->dsoc, sleep_soc);
2502 		if (gap_soc > sleep_soc) {
2503 			if ((gap_soc - 5) > (sleep_soc * 2))
2504 				di->dsoc -= (sleep_soc * 2);
2505 			else
2506 				di->dsoc -= sleep_soc;
2507 		} else {
2508 			di->dsoc = di->rsoc;
2509 		}
2510 
2511 		DBG("%s: dsoc>rsoc, sum_cap=%d=>sleep_soc=%d, gap_soc=%d\n",
2512 		    __func__, di->sleep_sum_cap, sleep_soc, gap_soc);
2513 	}
2514 
2515 	if (di->voltage_avg <= pwroff_vol - 70) {
2516 		di->dsoc = 0;
2517 		rk_send_wakeup_key();
2518 		BAT_INFO("low power sleeping, shutdown... %d\n", di->dsoc);
2519 	}
2520 
2521 	if (ocv_soc_updated && sleep_soc && (di->rsoc - di->dsoc) < 5 &&
2522 	    di->dsoc < 40) {
2523 		di->dsoc--;
2524 		BAT_INFO("low power sleeping, reserved... %d\n", di->dsoc);
2525 	}
2526 
2527 	if (di->dsoc <= 0) {
2528 		di->dsoc = 0;
2529 		rk_send_wakeup_key();
2530 		BAT_INFO("sleep dsoc is %d...\n", di->dsoc);
2531 	}
2532 
2533 	DBG("<%s>. out: dsoc=%d, rsoc=%d, sum_cap=%d\n",
2534 	    __func__, di->dsoc, di->rsoc, di->sleep_sum_cap);
2535 
2536 	return sleep_soc;
2537 }
2538 
rk818_bat_power_supply_changed(struct rk818_battery * di)2539 static void rk818_bat_power_supply_changed(struct rk818_battery *di)
2540 {
2541 	u8 status, thermal;
2542 	static int old_soc = -1;
2543 
2544 	if (di->dsoc > 100)
2545 		di->dsoc = 100;
2546 	else if (di->dsoc < 0)
2547 		di->dsoc = 0;
2548 
2549 	if (di->dsoc == old_soc)
2550 		return;
2551 
2552 	thermal = rk818_bat_read(di, RK818_THERMAL_REG);
2553 	status = rk818_bat_read(di, RK818_SUP_STS_REG);
2554 	status = (status & CHRG_STATUS_MSK) >> 4;
2555 	old_soc = di->dsoc;
2556 	di->last_dsoc = di->dsoc;
2557 	power_supply_changed(di->bat);
2558 	BAT_INFO("changed: dsoc=%d, rsoc=%d, v=%d, ov=%d c=%d, "
2559 		 "cap=%d, f=%d, st=%s, hotdie=%d\n",
2560 		 di->dsoc, di->rsoc, di->voltage_avg, di->voltage_ocv,
2561 		 di->current_avg, di->remain_cap, di->fcc, bat_status[status],
2562 		 !!(thermal & HOTDIE_STS));
2563 
2564 	BAT_INFO("dl=%d, rl=%d, v=%d, halt=%d, halt_n=%d, max=%d, "
2565 		 "init=%d, sw=%d, calib=%d, below0=%d, force=%d\n",
2566 		 di->dbg_pwr_dsoc, di->dbg_pwr_rsoc, di->dbg_pwr_vol,
2567 		 di->is_halt, di->halt_cnt, di->is_max_soc_offset,
2568 		 di->is_initialized, di->is_sw_reset, di->is_ocv_calib,
2569 		 di->dbg_cap_low0, di->is_force_calib);
2570 }
2571 
rk818_bat_check_reboot(struct rk818_battery * di)2572 static u8 rk818_bat_check_reboot(struct rk818_battery *di)
2573 {
2574 	u8 cnt;
2575 
2576 	cnt = rk818_bat_read(di, RK818_REBOOT_CNT_REG);
2577 	cnt++;
2578 
2579 	if (cnt >= REBOOT_MAX_CNT) {
2580 		BAT_INFO("reboot: %d --> %d\n", di->dsoc, di->rsoc);
2581 		di->dsoc = di->rsoc;
2582 		if (di->dsoc > 100)
2583 			di->dsoc = 100;
2584 		else if (di->dsoc < 0)
2585 			di->dsoc = 0;
2586 		rk818_bat_save_dsoc(di, di->dsoc);
2587 		cnt = REBOOT_MAX_CNT;
2588 	}
2589 
2590 	rk818_bat_save_reboot_cnt(di, cnt);
2591 	DBG("reboot cnt: %d\n", cnt);
2592 
2593 	return cnt;
2594 }
2595 
rk818_bat_rsoc_daemon(struct rk818_battery * di)2596 static void rk818_bat_rsoc_daemon(struct rk818_battery *di)
2597 {
2598 	int est_vol, remain_cap;
2599 	static unsigned long sec;
2600 
2601 	if ((di->remain_cap < 0) && (di->fb_blank != 0)) {
2602 		if (!sec)
2603 			sec = get_boot_sec();
2604 		wake_lock_timeout(&di->wake_lock,
2605 				  (di->pdata->monitor_sec + 1) * HZ);
2606 
2607 		DBG("sec=%ld, hold_sec=%ld\n", sec, base2sec(sec));
2608 		if (base2sec(sec) >= 60) {
2609 			sec = 0;
2610 			di->dbg_cap_low0++;
2611 			est_vol = di->voltage_avg -
2612 					(di->bat_res * di->current_avg) / 1000;
2613 			remain_cap = rk818_bat_vol_to_ocvcap(di, est_vol);
2614 			rk818_bat_init_capacity(di, remain_cap);
2615 			BAT_INFO("adjust cap below 0 --> %d, rsoc=%d\n",
2616 				 di->remain_cap, di->rsoc);
2617 			wake_unlock(&di->wake_lock);
2618 		}
2619 	} else {
2620 		sec = 0;
2621 	}
2622 }
2623 
rk818_bat_update_info(struct rk818_battery * di)2624 static void rk818_bat_update_info(struct rk818_battery *di)
2625 {
2626 	int is_charging;
2627 
2628 	di->voltage_avg = rk818_bat_get_avg_voltage(di);
2629 	di->current_avg = rk818_bat_get_avg_current(di);
2630 	di->voltage_relax = rk818_bat_get_relax_voltage(di);
2631 	di->rsoc = rk818_bat_get_rsoc(di);
2632 	di->remain_cap = rk818_bat_get_coulomb_cap(di);
2633 	di->chrg_status = rk818_bat_get_chrg_status(di);
2634 	is_charging = rk818_bat_get_charge_state(di);
2635 	if (is_charging != di->is_charging) {
2636 		di->is_charging = is_charging;
2637 		if (is_charging)
2638 			di->charge_count++;
2639 	}
2640 	if (di->voltage_avg > di->voltage_max)
2641 		di->voltage_max = di->voltage_avg;
2642 	if (di->current_avg > di->current_max)
2643 		di->current_max = di->current_avg;
2644 
2645 	/* smooth charge */
2646 	if (di->remain_cap > di->fcc) {
2647 		di->sm_remain_cap -= (di->remain_cap - di->fcc);
2648 		DBG("<%s>. cap: remain=%d, sm_remain=%d\n",
2649 		    __func__, di->remain_cap, di->sm_remain_cap);
2650 		rk818_bat_init_coulomb_cap(di, di->fcc);
2651 	}
2652 
2653 	if (di->chrg_status != CHARGE_FINISH)
2654 		di->finish_base = get_boot_sec();
2655 
2656 	/*
2657 	 * we need update fcc in continuous charging state, if discharge state
2658 	 * keep at least 2 hour, we decide not to update fcc, so clear the
2659 	 * fcc update flag: age_allow_update.
2660 	 */
2661 	if (base2min(di->plug_out_base) > 120)
2662 		di->age_allow_update = false;
2663 
2664 	/* do adc calib: status must from cccv mode to finish mode */
2665 	if (di->chrg_status == CC_OR_CV) {
2666 		di->adc_allow_update = true;
2667 		di->adc_calib_cnt = 0;
2668 	}
2669 }
2670 
rk818_bat_init_ts1_detect(struct rk818_battery * di)2671 static void rk818_bat_init_ts1_detect(struct rk818_battery *di)
2672 {
2673 	u8 buf;
2674 	u32 *ntc_table = di->pdata->ntc_table;
2675 
2676 	if (!di->pdata->ntc_size)
2677 		return;
2678 
2679 	/* select ua */
2680 	buf = rk818_bat_read(di, RK818_TS_CTRL_REG);
2681 	buf &= ~TS1_CUR_MSK;
2682 	/* chose suitable UA for temperature detect */
2683 	if (ntc_table[0] < NTC_80UA_MAX_MEASURE) {
2684 		di->pdata->ntc_factor = NTC_CALC_FACTOR_80UA;
2685 		di->pdata->ntc_uA = 80;
2686 		buf |= ADC_CUR_80UA;
2687 	} else if (ntc_table[0] < NTC_60UA_MAX_MEASURE) {
2688 		di->pdata->ntc_factor = NTC_CALC_FACTOR_60UA;
2689 		di->pdata->ntc_uA = 60;
2690 		buf |= ADC_CUR_60UA;
2691 	} else if (ntc_table[0] < NTC_40UA_MAX_MEASURE) {
2692 		di->pdata->ntc_factor = NTC_CALC_FACTOR_40UA;
2693 		di->pdata->ntc_uA = 40;
2694 		buf |= ADC_CUR_40UA;
2695 	} else {
2696 		di->pdata->ntc_factor = NTC_CALC_FACTOR_20UA;
2697 		di->pdata->ntc_uA = 20;
2698 		buf |= ADC_CUR_20UA;
2699 	}
2700 	rk818_bat_write(di, RK818_TS_CTRL_REG, buf);
2701 
2702 	/* enable ADC_TS1_EN */
2703 	buf = rk818_bat_read(di, RK818_ADC_CTRL_REG);
2704 	buf |= ADC_TS1_EN;
2705 	rk818_bat_write(di, RK818_ADC_CTRL_REG, buf);
2706 }
2707 
2708 /*
2709  * Due to hardware design issue, Vdelta = "(R_sample + R_other) * I_avg" will be
2710  * included into TS1 adc value. We must subtract it to get correct adc value.
2711  * The solution:
2712  *
2713  * (1) calculate Vdelta:
2714  *
2715  *   adc1 - Vdelta    ua1			  (adc2 * ua1) - (adc1 * ua2)
2716  *   ------------- = -----  ==> equals: Vdelta = -----------------------------
2717  *   adc2 - Vdelta    ua2				ua1 - ua2
2718  *
2719  *
2720  * (2) calculate correct ADC value:
2721  *
2722  *     charging: ADC = adc1 - abs(Vdelta);
2723  *  discharging: ADC = adc1 + abs(Vdelta);
2724  */
rk818_bat_get_ntc_res(struct rk818_battery * di)2725 static int rk818_bat_get_ntc_res(struct rk818_battery *di)
2726 {
2727 	int adc1 = 0, adc2 = 0;
2728 	int ua1, ua2, v_delta, res, val;
2729 	u8 buf;
2730 
2731 	/* read sample ua1 */
2732 	buf = rk818_bat_read(di, RK818_TS_CTRL_REG);
2733 	DBG("<%s>. read adc1, sample uA=%d\n",
2734 	    __func__, ((buf & 0x03) + 1) * 20);
2735 
2736 	/* read adc adc1 */
2737 	ua1 = di->pdata->ntc_uA;
2738 	adc1 |= rk818_bat_read(di, RK818_TS1_ADC_REGL) << 0;
2739 	adc1 |= rk818_bat_read(di, RK818_TS1_ADC_REGH) << 8;
2740 
2741 	/* chose reference UA for adc2 */
2742 	ua2 = (ua1 != 20) ? 20 : 40;
2743 	buf = rk818_bat_read(di, RK818_TS_CTRL_REG);
2744 	buf &= ~TS1_CUR_MSK;
2745 	buf |= ((ua2 - 20) / 20);
2746 	rk818_bat_write(di, RK818_TS_CTRL_REG, buf);
2747 
2748 	/* read adc adc2 */
2749 	msleep(1000);
2750 
2751 	/* read sample ua2 */
2752 	buf = rk818_bat_read(di, RK818_TS_CTRL_REG);
2753 	DBG("<%s>. read adc2, sample uA=%d\n",
2754 	    __func__, ((buf & 0x03) + 1) * 20);
2755 
2756 	adc2 |= rk818_bat_read(di, RK818_TS1_ADC_REGL) << 0;
2757 	adc2 |= rk818_bat_read(di, RK818_TS1_ADC_REGH) << 8;
2758 
2759 	DBG("<%s>. ua1=%d, ua2=%d, adc1=%d, adc2=%d\n",
2760 	    __func__, ua1, ua2, adc1, adc2);
2761 
2762 	/* calculate delta voltage */
2763 	if (adc2 != adc1)
2764 		v_delta = abs((adc2 * ua1 - adc1 * ua2) / (ua2 - ua1));
2765 	else
2766 		v_delta = 0;
2767 
2768 	/* considering current avg direction, calcuate real adc value */
2769 	val = (di->current_avg >= 0) ? (adc1 - v_delta) : (adc1 + v_delta);
2770 
2771 	DBG("<%s>. Iavg=%d, Vdelta=%d, Vadc=%d\n",
2772 	    __func__, di->current_avg, v_delta, val);
2773 
2774 	res = val * di->pdata->ntc_factor;
2775 
2776 	DBG("<%s>. val=%d, ntc_res=%d, ntc_factor=%d, Rdelta=%d\n",
2777 	    __func__, val, res, di->pdata->ntc_factor,
2778 	    v_delta * di->pdata->ntc_factor);
2779 
2780 	DBG("<%s>. t=[%d'C(%d) ~ %dC(%d)]\n", __func__,
2781 	    di->pdata->ntc_degree_from, di->pdata->ntc_table[0],
2782 	    di->pdata->ntc_degree_from + di->pdata->ntc_size - 1,
2783 	    di->pdata->ntc_table[di->pdata->ntc_size - 1]);
2784 
2785 	rk818_bat_init_ts1_detect(di);
2786 
2787 	return res;
2788 }
2789 
rk818_bat_set_input_current(struct rk818_battery * di,int input_current)2790 static void rk818_bat_set_input_current(struct rk818_battery *di,
2791 					int input_current)
2792 {
2793 	u8 usb_ctrl;
2794 
2795 	usb_ctrl = rk818_bat_read(di, RK818_USB_CTRL_REG);
2796 	usb_ctrl &= ~0x0f;
2797 	usb_ctrl |= (input_current);
2798 	rk818_bat_write(di, RK818_USB_CTRL_REG, usb_ctrl);
2799 }
2800 
2801 static BLOCKING_NOTIFIER_HEAD(rk818_bat_notifier_chain);
2802 
rk818_bat_temp_notifier_register(struct notifier_block * nb)2803 int rk818_bat_temp_notifier_register(struct notifier_block *nb)
2804 {
2805 	return blocking_notifier_chain_register(&rk818_bat_notifier_chain, nb);
2806 }
2807 EXPORT_SYMBOL_GPL(rk818_bat_temp_notifier_register);
2808 
rk818_bat_temp_notifier_unregister(struct notifier_block * nb)2809 int rk818_bat_temp_notifier_unregister(struct notifier_block *nb)
2810 {
2811 	return blocking_notifier_chain_unregister(&rk818_bat_notifier_chain, nb);
2812 }
2813 EXPORT_SYMBOL_GPL(rk818_bat_temp_notifier_unregister);
2814 
rk818_bat_temp_notifier_callback(int temp)2815 static void rk818_bat_temp_notifier_callback(int temp)
2816 {
2817 	blocking_notifier_call_chain(&rk818_bat_notifier_chain, temp, NULL);
2818 }
2819 
rk818_bat_update_temperature(struct rk818_battery * di)2820 static void rk818_bat_update_temperature(struct rk818_battery *di)
2821 {
2822 	static int old_temp, first_time = 1;
2823 	u32 ntc_size, *ntc_table;
2824 	int i, res, temp;
2825 
2826 	ntc_table = di->pdata->ntc_table;
2827 	ntc_size = di->pdata->ntc_size;
2828 	di->temperature = VIRTUAL_TEMPERATURE;
2829 
2830 	if (ntc_size) {
2831 		res = rk818_bat_get_ntc_res(di);
2832 		if (res < ntc_table[ntc_size - 1]) {
2833 			di->temperature = di->pdata->ntc_degree_from +
2834 					  di->pdata->ntc_size - 1;
2835 			if (di->pdata->bat_mode != MODE_VIRTUAL)
2836 				rk818_bat_set_input_current(di, INPUT_CUR80MA);
2837 			BAT_INFO("bat ntc upper max degree: R=%d\n", res);
2838 		} else if (res > ntc_table[0]) {
2839 			di->temperature = di->pdata->ntc_degree_from;
2840 			if (di->pdata->bat_mode != MODE_VIRTUAL)
2841 				rk818_bat_set_input_current(di, INPUT_CUR80MA);
2842 			BAT_INFO("bat ntc lower min degree: R=%d\n", res);
2843 		} else {
2844 			for (i = 0; i < ntc_size; i++) {
2845 				if (res >= ntc_table[i])
2846 					break;
2847 			}
2848 
2849 			/* if first in, init old_temp */
2850 			temp = (i + di->pdata->ntc_degree_from) * 10;
2851 			if (first_time == 1) {
2852 				di->temperature = temp;
2853 				old_temp = temp;
2854 				first_time = 0;
2855 			}
2856 
2857 			/*
2858 			 * compare with old one, it's invalid when over 50
2859 			 * and we should use old data.
2860 			 */
2861 			if (abs(temp - old_temp) > 50)
2862 				temp = old_temp;
2863 			else
2864 				old_temp = temp;
2865 
2866 			di->temperature = temp;
2867 			DBG("<%s>. temperature = %d\n",
2868 			    __func__, di->temperature);
2869 			rk818_bat_temp_notifier_callback(di->temperature / 10);
2870 		}
2871 	}
2872 }
2873 
rk818_bat_init_dsoc_algorithm(struct rk818_battery * di)2874 static void rk818_bat_init_dsoc_algorithm(struct rk818_battery *di)
2875 {
2876 	u8 buf;
2877 	int16_t rest = 0;
2878 	unsigned long soc_sec;
2879 	const char *mode_name[] = { "MODE_ZERO", "MODE_FINISH",
2880 		"MODE_SMOOTH_CHRG", "MODE_SMOOTH_DISCHRG", "MODE_SMOOTH", };
2881 
2882 	/* get rest */
2883 	rest |= rk818_bat_read(di, RK818_CALC_REST_REGH) << 8;
2884 	rest |= rk818_bat_read(di, RK818_CALC_REST_REGL) << 0;
2885 
2886 	/* get mode */
2887 	buf = rk818_bat_read(di, RK818_MISC_MARK_REG);
2888 	di->algo_rest_mode = (buf & ALGO_REST_MODE_MSK) >> ALGO_REST_MODE_SHIFT;
2889 
2890 	if (rk818_bat_get_chrg_status(di) == CHARGE_FINISH) {
2891 		if (di->algo_rest_mode == MODE_FINISH) {
2892 			soc_sec = di->fcc * 3600 / 100 / FINISH_CHRG_CUR1;
2893 			if ((rest / DIV(soc_sec)) > 0) {
2894 				if (di->dsoc < 100) {
2895 					di->dsoc++;
2896 					di->algo_rest_val = rest % soc_sec;
2897 					BAT_INFO("algorithm rest(%d) dsoc "
2898 						 "inc: %d\n",
2899 						 rest, di->dsoc);
2900 				} else {
2901 					di->algo_rest_val = 0;
2902 				}
2903 			} else {
2904 				di->algo_rest_val = rest;
2905 			}
2906 		} else {
2907 			di->algo_rest_val = rest;
2908 		}
2909 	} else {
2910 		/* charge speed up */
2911 		if ((rest / 1000) > 0 && rk818_bat_chrg_online(di)) {
2912 			if (di->dsoc < di->rsoc) {
2913 				di->dsoc++;
2914 				di->algo_rest_val = rest % 1000;
2915 				BAT_INFO("algorithm rest(%d) dsoc inc: %d\n",
2916 					 rest, di->dsoc);
2917 			} else {
2918 				di->algo_rest_val = 0;
2919 			}
2920 		/* discharge speed up */
2921 		} else if (((rest / 1000) < 0) && !rk818_bat_chrg_online(di)) {
2922 			if (di->dsoc > di->rsoc) {
2923 				di->dsoc--;
2924 				di->algo_rest_val = rest % 1000;
2925 				BAT_INFO("algorithm rest(%d) dsoc sub: %d\n",
2926 					 rest, di->dsoc);
2927 			} else {
2928 				di->algo_rest_val = 0;
2929 			}
2930 		} else {
2931 			di->algo_rest_val = rest;
2932 		}
2933 	}
2934 
2935 	if (di->dsoc >= 100)
2936 		di->dsoc = 100;
2937 	else if (di->dsoc <= 0)
2938 		di->dsoc = 0;
2939 
2940 	/* init current mode */
2941 	di->voltage_avg = rk818_bat_get_avg_voltage(di);
2942 	di->current_avg = rk818_bat_get_avg_current(di);
2943 	if (rk818_bat_get_chrg_status(di) == CHARGE_FINISH) {
2944 		rk818_bat_finish_algo_prepare(di);
2945 		di->work_mode = MODE_FINISH;
2946 	} else {
2947 		rk818_bat_smooth_algo_prepare(di);
2948 		di->work_mode = MODE_SMOOTH;
2949 	}
2950 
2951 	DBG("<%s>. init: org_rest=%d, rest=%d, mode=%s; "
2952 	    "doc(x1000): zero=%d, chrg=%d, dischrg=%d, finish=%lu\n",
2953 	    __func__, rest, di->algo_rest_val, mode_name[di->algo_rest_mode],
2954 	    di->zero_dsoc, di->sm_chrg_dsoc, di->sm_dischrg_dsoc,
2955 	    di->finish_base);
2956 }
2957 
rk818_bat_save_algo_rest(struct rk818_battery * di)2958 static void rk818_bat_save_algo_rest(struct rk818_battery *di)
2959 {
2960 	u8 buf, mode;
2961 	int16_t algo_rest = 0;
2962 	int tmp_soc;
2963 	int zero_rest = 0, sm_chrg_rest = 0;
2964 	int sm_dischrg_rest = 0, finish_rest = 0;
2965 	const char *mode_name[] = { "MODE_ZERO", "MODE_FINISH",
2966 		"MODE_SMOOTH_CHRG", "MODE_SMOOTH_DISCHRG", "MODE_SMOOTH", };
2967 
2968 	/* zero dischrg */
2969 	tmp_soc = (di->zero_dsoc) / 1000;
2970 	if (tmp_soc == di->dsoc)
2971 		zero_rest = di->zero_dsoc - ((di->dsoc + 1) * 1000 -
2972 				MIN_ACCURACY);
2973 
2974 	/* sm chrg */
2975 	tmp_soc = di->sm_chrg_dsoc / 1000;
2976 	if (tmp_soc == di->dsoc)
2977 		sm_chrg_rest = di->sm_chrg_dsoc - di->dsoc * 1000;
2978 
2979 	/* sm dischrg */
2980 	tmp_soc = (di->sm_dischrg_dsoc) / 1000;
2981 	if (tmp_soc == di->dsoc)
2982 		sm_dischrg_rest = di->sm_dischrg_dsoc - ((di->dsoc + 1) * 1000 -
2983 				MIN_ACCURACY);
2984 
2985 	/* last time is also finish chrg, then add last rest */
2986 	if (di->algo_rest_mode == MODE_FINISH && di->algo_rest_val)
2987 		finish_rest = base2sec(di->finish_base) + di->algo_rest_val;
2988 	else
2989 		finish_rest = base2sec(di->finish_base);
2990 
2991 	/* total calc */
2992 	if ((rk818_bat_chrg_online(di) && (di->dsoc > di->rsoc)) ||
2993 	    (!rk818_bat_chrg_online(di) && (di->dsoc < di->rsoc)) ||
2994 	    (di->dsoc == di->rsoc)) {
2995 		di->algo_rest_val = 0;
2996 		algo_rest = 0;
2997 		DBG("<%s>. step1..\n", __func__);
2998 	} else if (di->work_mode == MODE_FINISH) {
2999 		algo_rest = finish_rest;
3000 		DBG("<%s>. step2..\n", __func__);
3001 	} else if (di->algo_rest_mode == MODE_FINISH) {
3002 		algo_rest = zero_rest + sm_dischrg_rest + sm_chrg_rest;
3003 		DBG("<%s>. step3..\n", __func__);
3004 	} else {
3005 		if (rk818_bat_chrg_online(di) && (di->dsoc < di->rsoc))
3006 			algo_rest = sm_chrg_rest + di->algo_rest_val;
3007 		else if (!rk818_bat_chrg_online(di) && (di->dsoc > di->rsoc))
3008 			algo_rest = zero_rest + sm_dischrg_rest +
3009 				    di->algo_rest_val;
3010 		else
3011 			algo_rest = zero_rest + sm_dischrg_rest + sm_chrg_rest +
3012 				    di->algo_rest_val;
3013 		DBG("<%s>. step4..\n", __func__);
3014 	}
3015 
3016 	/* check mode */
3017 	if ((di->work_mode == MODE_FINISH) || (di->work_mode == MODE_ZERO)) {
3018 		mode = di->work_mode;
3019 	} else {/* MODE_SMOOTH */
3020 		if (di->sm_linek > 0)
3021 			mode = MODE_SMOOTH_CHRG;
3022 		else
3023 			mode = MODE_SMOOTH_DISCHRG;
3024 	}
3025 
3026 	/* save mode */
3027 	buf = rk818_bat_read(di, RK818_MISC_MARK_REG);
3028 	buf &= ~ALGO_REST_MODE_MSK;
3029 	buf |= (mode << ALGO_REST_MODE_SHIFT);
3030 	rk818_bat_write(di, RK818_MISC_MARK_REG, buf);
3031 
3032 	/* save rest */
3033 	buf = (algo_rest >> 8) & 0xff;
3034 	rk818_bat_write(di, RK818_CALC_REST_REGH, buf);
3035 	buf = (algo_rest >> 0) & 0xff;
3036 	rk818_bat_write(di, RK818_CALC_REST_REGL, buf);
3037 
3038 	DBG("<%s>. rest: algo=%d, mode=%s, last_rest=%d; zero=%d, "
3039 	    "chrg=%d, dischrg=%d, finish=%lu\n",
3040 	    __func__, algo_rest, mode_name[mode], di->algo_rest_val, zero_rest,
3041 	    sm_chrg_rest, sm_dischrg_rest, base2sec(di->finish_base));
3042 }
3043 
rk818_bat_save_data(struct rk818_battery * di)3044 static void rk818_bat_save_data(struct rk818_battery *di)
3045 {
3046 	rk818_bat_save_dsoc(di, di->dsoc);
3047 	rk818_bat_save_cap(di, di->remain_cap);
3048 	rk818_bat_save_algo_rest(di);
3049 }
3050 
rk818_battery_work(struct work_struct * work)3051 static void rk818_battery_work(struct work_struct *work)
3052 {
3053 	struct rk818_battery *di =
3054 		container_of(work, struct rk818_battery, bat_delay_work.work);
3055 
3056 	rk818_bat_update_info(di);
3057 	rk818_bat_wait_finish_sig(di);
3058 	rk818_bat_rsoc_daemon(di);
3059 	rk818_bat_update_temperature(di);
3060 	rk818_bat_display_smooth(di);
3061 	rk818_bat_power_supply_changed(di);
3062 	rk818_bat_save_data(di);
3063 	rk818_bat_debug_info(di);
3064 
3065 	queue_delayed_work(di->bat_monitor_wq, &di->bat_delay_work,
3066 			   msecs_to_jiffies(di->monitor_ms));
3067 }
3068 
rk818_vb_low_irq(int irq,void * bat)3069 static irqreturn_t rk818_vb_low_irq(int irq, void *bat)
3070 {
3071 	struct rk818_battery *di = (struct rk818_battery *)bat;
3072 
3073 	di->dsoc = 0;
3074 	rk_send_wakeup_key();
3075 	BAT_INFO("lower power yet, power off system! v=%d, c=%d, dsoc=%d\n",
3076 		 di->voltage_avg, di->current_avg, di->dsoc);
3077 
3078 	return IRQ_HANDLED;
3079 }
3080 
rk818_bat_init_sysfs(struct rk818_battery * di)3081 static void rk818_bat_init_sysfs(struct rk818_battery *di)
3082 {
3083 	int i, ret;
3084 
3085 	for (i = 0; i < ARRAY_SIZE(rk818_bat_attr); i++) {
3086 		ret = sysfs_create_file(&di->dev->kobj,
3087 					&rk818_bat_attr[i].attr);
3088 		if (ret)
3089 			dev_err(di->dev, "create bat node(%s) error\n",
3090 				rk818_bat_attr[i].attr.name);
3091 	}
3092 }
3093 
rk818_bat_init_irqs(struct rk818_battery * di)3094 static int rk818_bat_init_irqs(struct rk818_battery *di)
3095 {
3096 	struct rk808 *rk818 = di->rk818;
3097 	struct platform_device *pdev = di->pdev;
3098 	int ret, vb_lo_irq;
3099 
3100 	vb_lo_irq = regmap_irq_get_virq(rk818->irq_data, RK818_IRQ_VB_LO);
3101 	if (vb_lo_irq < 0) {
3102 		dev_err(di->dev, "vb_lo_irq request failed!\n");
3103 		return vb_lo_irq;
3104 	}
3105 
3106 	ret = devm_request_threaded_irq(di->dev, vb_lo_irq, NULL,
3107 					rk818_vb_low_irq,
3108 					IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
3109 					"rk818_vb_low", di);
3110 	if (ret) {
3111 		dev_err(&pdev->dev, "vb_lo_irq request failed!\n");
3112 		return ret;
3113 	}
3114 	enable_irq_wake(vb_lo_irq);
3115 
3116 	return 0;
3117 }
3118 
rk818_bat_init_info(struct rk818_battery * di)3119 static void rk818_bat_init_info(struct rk818_battery *di)
3120 {
3121 	di->design_cap = di->pdata->design_capacity;
3122 	di->qmax = di->pdata->design_qmax;
3123 	di->bat_res = di->pdata->bat_res;
3124 	di->monitor_ms = di->pdata->monitor_sec * TIMER_MS_COUNTS;
3125 	di->boot_base = POWER_ON_SEC_BASE;
3126 	di->res_div = (di->pdata->sample_res == SAMPLE_RES_20MR) ?
3127 		       SAMPLE_RES_DIV1 : SAMPLE_RES_DIV2;
3128 }
3129 
rk818_get_rtc_sec(void)3130 static time64_t rk818_get_rtc_sec(void)
3131 {
3132 	int err;
3133 	struct rtc_time tm;
3134 	struct rtc_device *rtc = rtc_class_open(CONFIG_RTC_HCTOSYS_DEVICE);
3135 
3136 	err = rtc_read_time(rtc, &tm);
3137 	if (err) {
3138 		dev_err(rtc->dev.parent, "read hardware clk failed\n");
3139 		return 0;
3140 	}
3141 
3142 	err = rtc_valid_tm(&tm);
3143 	if (err) {
3144 		dev_err(rtc->dev.parent, "invalid date time\n");
3145 		return 0;
3146 	}
3147 
3148 	return rtc_tm_to_time64(&tm);
3149 }
3150 
rk818_bat_rtc_sleep_sec(struct rk818_battery * di)3151 static int rk818_bat_rtc_sleep_sec(struct rk818_battery *di)
3152 {
3153 	int interval_sec;
3154 
3155 	interval_sec = rk818_get_rtc_sec() - di->rtc_base;
3156 
3157 	return (interval_sec > 0) ? interval_sec : 0;
3158 }
3159 
rk818_bat_set_shtd_vol(struct rk818_battery * di)3160 static void rk818_bat_set_shtd_vol(struct rk818_battery *di)
3161 {
3162 	u8 val;
3163 
3164 	/* set vbat lowest 3.0v shutdown */
3165 	val = rk818_bat_read(di, RK818_VB_MON_REG);
3166 	val &= ~(VBAT_LOW_VOL_MASK | VBAT_LOW_ACT_MASK);
3167 	val |= (RK818_VBAT_LOW_3V0 | EN_VABT_LOW_SHUT_DOWN);
3168 	rk818_bat_write(di, RK818_VB_MON_REG, val);
3169 
3170 	/* disable low irq */
3171 	rk818_bat_set_bits(di, RK818_INT_STS_MSK_REG1,
3172 			   VB_LOW_INT_EN, VB_LOW_INT_EN);
3173 }
3174 
rk818_bat_init_fg(struct rk818_battery * di)3175 static void rk818_bat_init_fg(struct rk818_battery *di)
3176 {
3177 	rk818_bat_enable_gauge(di);
3178 	rk818_bat_init_voltage_kb(di);
3179 	rk818_bat_init_coffset(di);
3180 	rk818_bat_set_relax_sample(di);
3181 	rk818_bat_set_ioffset_sample(di);
3182 	rk818_bat_set_ocv_sample(di);
3183 	rk818_bat_init_ts1_detect(di);
3184 	rk818_bat_init_rsoc(di);
3185 	rk818_bat_init_coulomb_cap(di, di->nac);
3186 	rk818_bat_init_age_algorithm(di);
3187 	rk818_bat_init_chrg_config(di);
3188 	rk818_bat_set_shtd_vol(di);
3189 	rk818_bat_init_zero_table(di);
3190 	rk818_bat_init_caltimer(di);
3191 	rk818_bat_init_dsoc_algorithm(di);
3192 
3193 	di->voltage_avg = rk818_bat_get_avg_voltage(di);
3194 	di->voltage_ocv = rk818_bat_get_ocv_voltage(di);
3195 	di->voltage_relax = rk818_bat_get_relax_voltage(di);
3196 	di->current_avg = rk818_bat_get_avg_current(di);
3197 	di->remain_cap = rk818_bat_get_coulomb_cap(di);
3198 	di->dbg_pwr_dsoc = di->dsoc;
3199 	di->dbg_pwr_rsoc = di->rsoc;
3200 	di->dbg_pwr_vol = di->voltage_avg;
3201 
3202 	rk818_bat_dump_regs(di, 0x99, 0xee);
3203 	DBG("nac=%d cap=%d ov=%d v=%d rv=%d dl=%d rl=%d c=%d\n",
3204 	    di->nac, di->remain_cap, di->voltage_ocv, di->voltage_avg,
3205 	    di->voltage_relax, di->dsoc, di->rsoc, di->current_avg);
3206 }
3207 
3208 #ifdef CONFIG_OF
rk818_bat_parse_dt(struct rk818_battery * di)3209 static int rk818_bat_parse_dt(struct rk818_battery *di)
3210 {
3211 	u32 out_value;
3212 	int length, ret;
3213 	size_t size;
3214 	struct device_node *np = di->dev->of_node;
3215 	struct battery_platform_data *pdata;
3216 	struct device *dev = di->dev;
3217 
3218 	pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
3219 	if (!pdata)
3220 		return -ENOMEM;
3221 
3222 	di->pdata = pdata;
3223 	/* init default param */
3224 	pdata->bat_res = DEFAULT_BAT_RES;
3225 	pdata->monitor_sec = DEFAULT_MONITOR_SEC;
3226 	pdata->pwroff_vol = DEFAULT_PWROFF_VOL_THRESD;
3227 	pdata->sleep_exit_current = DEFAULT_SLP_EXIT_CUR;
3228 	pdata->sleep_enter_current = DEFAULT_SLP_ENTER_CUR;
3229 	pdata->bat_mode = MODE_BATTARY;
3230 	pdata->max_soc_offset = DEFAULT_MAX_SOC_OFFSET;
3231 	pdata->sample_res = DEFAULT_SAMPLE_RES;
3232 	pdata->energy_mode = DEFAULT_ENERGY_MODE;
3233 	pdata->fb_temp = DEFAULT_FB_TEMP;
3234 	pdata->zero_reserve_dsoc = DEFAULT_ZERO_RESERVE_DSOC;
3235 
3236 	/* parse necessary param */
3237 	if (!of_find_property(np, "ocv_table", &length)) {
3238 		dev_err(dev, "ocv_table not found!\n");
3239 		return -EINVAL;
3240 	}
3241 
3242 	pdata->ocv_size = length / sizeof(u32);
3243 	if (pdata->ocv_size <= 0) {
3244 		dev_err(dev, "invalid ocv table\n");
3245 		return -EINVAL;
3246 	}
3247 
3248 	size = sizeof(*pdata->ocv_table) * pdata->ocv_size;
3249 	pdata->ocv_table = devm_kzalloc(di->dev, size, GFP_KERNEL);
3250 	if (!pdata->ocv_table)
3251 		return -ENOMEM;
3252 
3253 	ret = of_property_read_u32_array(np, "ocv_table",
3254 					 pdata->ocv_table,
3255 					 pdata->ocv_size);
3256 	if (ret < 0)
3257 		return ret;
3258 
3259 	ret = of_property_read_u32(np, "design_capacity", &out_value);
3260 	if (ret < 0) {
3261 		dev_err(dev, "design_capacity not found!\n");
3262 		return ret;
3263 	}
3264 	pdata->design_capacity = out_value;
3265 
3266 	ret = of_property_read_u32(np, "design_qmax", &out_value);
3267 	if (ret < 0) {
3268 		dev_err(dev, "design_qmax not found!\n");
3269 		return ret;
3270 	}
3271 	pdata->design_qmax = out_value;
3272 	ret = of_property_read_u32(np, "max_chrg_voltage", &out_value);
3273 	if (ret < 0) {
3274 		dev_err(dev, "max_chrg_voltage missing!\n");
3275 		return ret;
3276 	}
3277 	pdata->max_chrg_voltage = out_value;
3278 	if (out_value >= 4300)
3279 		pdata->zero_algorithm_vol = DEFAULT_ALGR_VOL_THRESD2;
3280 	else
3281 		pdata->zero_algorithm_vol = DEFAULT_ALGR_VOL_THRESD1;
3282 
3283 	ret = of_property_read_u32(np, "fb_temperature", &pdata->fb_temp);
3284 	if (ret < 0)
3285 		dev_err(dev, "fb_temperature missing!\n");
3286 
3287 	ret = of_property_read_u32(np, "sample_res", &pdata->sample_res);
3288 	if (ret < 0)
3289 		dev_err(dev, "sample_res missing!\n");
3290 
3291 	ret = of_property_read_u32(np, "energy_mode", &pdata->energy_mode);
3292 	if (ret < 0)
3293 		dev_err(dev, "energy_mode missing!\n");
3294 
3295 	ret = of_property_read_u32(np, "max_soc_offset",
3296 				   &pdata->max_soc_offset);
3297 	if (ret < 0)
3298 		dev_err(dev, "max_soc_offset missing!\n");
3299 
3300 	ret = of_property_read_u32(np, "monitor_sec", &pdata->monitor_sec);
3301 	if (ret < 0)
3302 		dev_err(dev, "monitor_sec missing!\n");
3303 
3304 	ret = of_property_read_u32(np, "zero_algorithm_vol",
3305 				   &pdata->zero_algorithm_vol);
3306 	if (ret < 0)
3307 		dev_err(dev, "zero_algorithm_vol missing!\n");
3308 
3309 	ret = of_property_read_u32(np, "zero_reserve_dsoc",
3310 				  &pdata->zero_reserve_dsoc);
3311 
3312 	ret = of_property_read_u32(np, "virtual_power", &pdata->bat_mode);
3313 	if (ret < 0)
3314 		dev_err(dev, "virtual_power missing!\n");
3315 
3316 	ret = of_property_read_u32(np, "bat_res", &pdata->bat_res);
3317 	if (ret < 0)
3318 		dev_err(dev, "bat_res missing!\n");
3319 
3320 	ret = of_property_read_u32(np, "sleep_enter_current",
3321 				   &pdata->sleep_enter_current);
3322 	if (ret < 0)
3323 		dev_err(dev, "sleep_enter_current missing!\n");
3324 
3325 	ret = of_property_read_u32(np, "sleep_exit_current",
3326 				   &pdata->sleep_exit_current);
3327 	if (ret < 0)
3328 		dev_err(dev, "sleep_exit_current missing!\n");
3329 
3330 	ret = of_property_read_u32(np, "power_off_thresd", &pdata->pwroff_vol);
3331 	if (ret < 0)
3332 		dev_err(dev, "power_off_thresd missing!\n");
3333 
3334 	if (!of_find_property(np, "ntc_table", &length)) {
3335 		pdata->ntc_size = 0;
3336 	} else {
3337 		/* get ntc degree base value */
3338 		ret = of_property_read_s32(np, "ntc_degree_from_v2",
3339 					   &pdata->ntc_degree_from);
3340 		if (ret) {
3341 			dev_err(dev, "invalid ntc_degree_from_v2\n");
3342 			return -EINVAL;
3343 		}
3344 
3345 		pdata->ntc_size = length / sizeof(u32);
3346 	}
3347 
3348 	if (pdata->ntc_size) {
3349 		size = sizeof(*pdata->ntc_table) * pdata->ntc_size;
3350 		pdata->ntc_table = devm_kzalloc(di->dev, size, GFP_KERNEL);
3351 		if (!pdata->ntc_table)
3352 			return -ENOMEM;
3353 
3354 		ret = of_property_read_u32_array(np, "ntc_table",
3355 						 pdata->ntc_table,
3356 						 pdata->ntc_size);
3357 		if (ret < 0)
3358 			return ret;
3359 	}
3360 
3361 	DBG("the battery dts info dump:\n"
3362 	    "bat_res:%d\n"
3363 	    "design_capacity:%d\n"
3364 	    "design_qmax :%d\n"
3365 	    "sleep_enter_current:%d\n"
3366 	    "sleep_exit_current:%d\n"
3367 	    "zero_algorithm_vol:%d\n"
3368 	    "zero_reserve_dsoc:%d\n"
3369 	    "monitor_sec:%d\n"
3370 	    "max_soc_offset:%d\n"
3371 	    "virtual_power:%d\n"
3372 	    "pwroff_vol:%d\n"
3373 	    "sample_res:%d\n"
3374 	    "ntc_size=%d\n"
3375 	    "ntc_degree_from_v2:%d\n"
3376 	    "ntc_degree_to:%d\n",
3377 	    pdata->bat_res, pdata->design_capacity, pdata->design_qmax,
3378 	    pdata->sleep_enter_current, pdata->sleep_exit_current,
3379 	    pdata->zero_algorithm_vol, pdata->zero_reserve_dsoc,
3380 	    pdata->monitor_sec,
3381 	    pdata->max_soc_offset, pdata->bat_mode, pdata->pwroff_vol,
3382 	    pdata->sample_res, pdata->ntc_size, pdata->ntc_degree_from,
3383 	    pdata->ntc_degree_from + pdata->ntc_size - 1
3384 	    );
3385 
3386 	return 0;
3387 }
3388 #else
rk818_bat_parse_dt(struct rk818_battery * di)3389 static int rk818_bat_parse_dt(struct rk818_battery *di)
3390 {
3391 	return -ENODEV;
3392 }
3393 #endif
3394 
3395 static const struct of_device_id rk818_battery_of_match[] = {
3396 	{.compatible = "rk818-battery",},
3397 	{ },
3398 };
3399 
rk818_battery_probe(struct platform_device * pdev)3400 static int rk818_battery_probe(struct platform_device *pdev)
3401 {
3402 	const struct of_device_id *of_id =
3403 			of_match_device(rk818_battery_of_match, &pdev->dev);
3404 	struct rk818_battery *di;
3405 	struct rk808 *rk818 = dev_get_drvdata(pdev->dev.parent);
3406 	int ret;
3407 
3408 	if (!of_id) {
3409 		dev_err(&pdev->dev, "Failed to find matching dt id\n");
3410 		return -ENODEV;
3411 	}
3412 
3413 	di = devm_kzalloc(&pdev->dev, sizeof(*di), GFP_KERNEL);
3414 	if (!di)
3415 		return -ENOMEM;
3416 
3417 	di->rk818 = rk818;
3418 	di->pdev = pdev;
3419 	di->dev = &pdev->dev;
3420 	di->regmap = rk818->regmap;
3421 	platform_set_drvdata(pdev, di);
3422 
3423 	ret = rk818_bat_parse_dt(di);
3424 	if (ret < 0) {
3425 		dev_err(di->dev, "rk818 battery parse dt failed!\n");
3426 		return ret;
3427 	}
3428 
3429 	if (!is_rk818_bat_exist(di)) {
3430 		di->pdata->bat_mode = MODE_VIRTUAL;
3431 		dev_err(di->dev, "no battery, virtual power mode\n");
3432 	}
3433 
3434 	ret = rk818_bat_init_irqs(di);
3435 	if (ret != 0) {
3436 		dev_err(di->dev, "rk818 bat init irqs failed!\n");
3437 		return ret;
3438 	}
3439 
3440 	ret = rk818_bat_init_power_supply(di);
3441 	if (ret) {
3442 		dev_err(di->dev, "rk818 power supply register failed!\n");
3443 		return ret;
3444 	}
3445 
3446 	rk818_bat_init_info(di);
3447 	rk818_bat_init_fg(di);
3448 	rk818_bat_init_sysfs(di);
3449 	rk818_bat_register_fb_notify(di);
3450 	wake_lock_init(&di->wake_lock, WAKE_LOCK_SUSPEND, "rk818_bat_lock");
3451 	di->bat_monitor_wq = alloc_ordered_workqueue("%s",
3452 			WQ_MEM_RECLAIM | WQ_FREEZABLE, "rk818-bat-monitor-wq");
3453 	INIT_DELAYED_WORK(&di->bat_delay_work, rk818_battery_work);
3454 	queue_delayed_work(di->bat_monitor_wq, &di->bat_delay_work,
3455 			   msecs_to_jiffies(TIMER_MS_COUNTS * 5));
3456 
3457 	BAT_INFO("driver version %s\n", DRIVER_VERSION);
3458 
3459 	return ret;
3460 }
3461 
rk818_battery_suspend(struct platform_device * dev,pm_message_t state)3462 static int rk818_battery_suspend(struct platform_device *dev,
3463 				 pm_message_t state)
3464 {
3465 	struct rk818_battery *di = platform_get_drvdata(dev);
3466 	u8 val, st;
3467 
3468 	cancel_delayed_work_sync(&di->bat_delay_work);
3469 
3470 	di->s2r = false;
3471 	di->sleep_chrg_online = rk818_bat_chrg_online(di);
3472 	di->sleep_chrg_status = rk818_bat_get_chrg_status(di);
3473 	di->current_avg = rk818_bat_get_avg_current(di);
3474 	di->remain_cap = rk818_bat_get_coulomb_cap(di);
3475 	di->rsoc = rk818_bat_get_rsoc(di);
3476 	di->rtc_base = rk818_get_rtc_sec();
3477 	rk818_bat_save_data(di);
3478 	st = (rk818_bat_read(di, RK818_SUP_STS_REG) & CHRG_STATUS_MSK) >> 4;
3479 
3480 	/* if not CHARGE_FINISH, reinit finish_base.
3481 	 * avoid sleep loop between suspend and resume
3482 	 */
3483 	if (di->sleep_chrg_status != CHARGE_FINISH)
3484 		di->finish_base = get_boot_sec();
3485 
3486 	/* avoid: enter suspend from MODE_ZERO: load from heavy to light */
3487 	if ((di->work_mode == MODE_ZERO) &&
3488 	    (di->sleep_chrg_online) && (di->current_avg >= 0)) {
3489 		DBG("suspend: MODE_ZERO exit...\n");
3490 		/* it need't do prepare for mode finish and smooth, it will
3491 		 * be done in display_smooth
3492 		 */
3493 		if (di->sleep_chrg_status == CHARGE_FINISH) {
3494 			di->work_mode = MODE_FINISH;
3495 			di->finish_base = get_boot_sec();
3496 		} else {
3497 			di->work_mode = MODE_SMOOTH;
3498 			rk818_bat_smooth_algo_prepare(di);
3499 		}
3500 	}
3501 
3502 	/* set vbat low than 3.4v to generate a wakeup irq */
3503 	val = rk818_bat_read(di, RK818_VB_MON_REG);
3504 	val &= (~(VBAT_LOW_VOL_MASK | VBAT_LOW_ACT_MASK));
3505 	val |= (RK818_VBAT_LOW_3V4 | EN_VBAT_LOW_IRQ);
3506 	rk818_bat_write(di, RK818_VB_MON_REG, val);
3507 	rk818_bat_set_bits(di, RK818_INT_STS_MSK_REG1, VB_LOW_INT_EN, 0);
3508 
3509 	BAT_INFO("suspend: dl=%d rl=%d c=%d v=%d cap=%d at=%ld ch=%d st=%s\n",
3510 		 di->dsoc, di->rsoc, di->current_avg,
3511 		 rk818_bat_get_avg_voltage(di), rk818_bat_get_coulomb_cap(di),
3512 		 di->sleep_dischrg_sec, di->sleep_chrg_online, bat_status[st]);
3513 
3514 	return 0;
3515 }
3516 
rk818_battery_resume(struct platform_device * dev)3517 static int rk818_battery_resume(struct platform_device *dev)
3518 {
3519 	struct rk818_battery *di = platform_get_drvdata(dev);
3520 	int interval_sec, time_step = 0, pwroff_vol;
3521 	u8 val, st;
3522 
3523 	di->s2r = true;
3524 	di->current_avg = rk818_bat_get_avg_current(di);
3525 	di->voltage_relax = rk818_bat_get_relax_voltage(di);
3526 	di->voltage_avg = rk818_bat_get_avg_voltage(di);
3527 	di->remain_cap = rk818_bat_get_coulomb_cap(di);
3528 	di->rsoc = rk818_bat_get_rsoc(di);
3529 	interval_sec = rk818_bat_rtc_sleep_sec(di);
3530 	di->sleep_sum_sec += interval_sec;
3531 	pwroff_vol = di->pdata->pwroff_vol;
3532 	st = (rk818_bat_read(di, RK818_SUP_STS_REG) & CHRG_STATUS_MSK) >> 4;
3533 
3534 	if (!di->sleep_chrg_online) {
3535 		/* only add up discharge sleep seconds */
3536 		di->sleep_dischrg_sec += interval_sec;
3537 		if (di->voltage_avg <= pwroff_vol + 50)
3538 			time_step = DISCHRG_TIME_STEP1;
3539 		else
3540 			time_step = DISCHRG_TIME_STEP2;
3541 	}
3542 
3543 	BAT_INFO("resume: dl=%d rl=%d c=%d v=%d rv=%d "
3544 		 "cap=%d dt=%d at=%ld ch=%d st=%s\n",
3545 		 di->dsoc, di->rsoc, di->current_avg, di->voltage_avg,
3546 		 di->voltage_relax, rk818_bat_get_coulomb_cap(di), interval_sec,
3547 		 di->sleep_dischrg_sec, di->sleep_chrg_online, bat_status[st]);
3548 
3549 	/* sleep: enough time and discharge */
3550 	if ((di->sleep_dischrg_sec > time_step) && (!di->sleep_chrg_online)) {
3551 		if (rk818_bat_sleep_dischrg(di))
3552 			di->sleep_dischrg_sec = 0;
3553 	}
3554 
3555 	rk818_bat_save_data(di);
3556 
3557 	/* set vbat lowest 3.0v shutdown */
3558 	val = rk818_bat_read(di, RK818_VB_MON_REG);
3559 	val &= ~(VBAT_LOW_VOL_MASK | VBAT_LOW_ACT_MASK);
3560 	val |= (RK818_VBAT_LOW_3V0 | EN_VABT_LOW_SHUT_DOWN);
3561 	rk818_bat_write(di, RK818_VB_MON_REG, val);
3562 	rk818_bat_set_bits(di, RK818_INT_STS_MSK_REG1,
3563 			   VB_LOW_INT_EN, VB_LOW_INT_EN);
3564 
3565 	/* charge/lowpower lock: for battery work to update dsoc and rsoc */
3566 	if ((di->sleep_chrg_online) ||
3567 	    (!di->sleep_chrg_online && di->voltage_avg < di->pdata->pwroff_vol))
3568 		wake_lock_timeout(&di->wake_lock, msecs_to_jiffies(2000));
3569 
3570 	queue_delayed_work(di->bat_monitor_wq, &di->bat_delay_work,
3571 			   msecs_to_jiffies(1000));
3572 
3573 	return 0;
3574 }
3575 
rk818_battery_shutdown(struct platform_device * dev)3576 static void rk818_battery_shutdown(struct platform_device *dev)
3577 {
3578 	u8 cnt = 0;
3579 	struct rk818_battery *di = platform_get_drvdata(dev);
3580 
3581 	cancel_delayed_work_sync(&di->bat_delay_work);
3582 	cancel_delayed_work_sync(&di->calib_delay_work);
3583 	rk818_bat_unregister_fb_notify(di);
3584 	del_timer(&di->caltimer);
3585 	if (base2sec(di->boot_base) < REBOOT_PERIOD_SEC)
3586 		cnt = rk818_bat_check_reboot(di);
3587 	else
3588 		rk818_bat_save_reboot_cnt(di, 0);
3589 
3590 	BAT_INFO("shutdown: dl=%d rl=%d c=%d v=%d cap=%d f=%d ch=%d n=%d "
3591 		 "mode=%d rest=%d\n",
3592 		 di->dsoc, di->rsoc, di->current_avg, di->voltage_avg,
3593 		 di->remain_cap, di->fcc, rk818_bat_chrg_online(di), cnt,
3594 		 di->algo_rest_mode, di->algo_rest_val);
3595 }
3596 
3597 static struct platform_driver rk818_battery_driver = {
3598 	.probe = rk818_battery_probe,
3599 	.suspend = rk818_battery_suspend,
3600 	.resume = rk818_battery_resume,
3601 	.shutdown = rk818_battery_shutdown,
3602 	.driver = {
3603 		.name = "rk818-battery",
3604 		.of_match_table = rk818_battery_of_match,
3605 	},
3606 };
3607 
battery_init(void)3608 static int __init battery_init(void)
3609 {
3610 	return platform_driver_register(&rk818_battery_driver);
3611 }
3612 fs_initcall_sync(battery_init);
3613 
battery_exit(void)3614 static void __exit battery_exit(void)
3615 {
3616 	platform_driver_unregister(&rk818_battery_driver);
3617 }
3618 module_exit(battery_exit);
3619 
3620 MODULE_LICENSE("GPL");
3621 MODULE_ALIAS("platform:rk818-battery");
3622 MODULE_AUTHOR("chenjh<chenjh@rock-chips.com>");
3623