Lines Matching refs:di
250 static int rk816_bat_read(struct battery_priv *di, u8 reg) in rk816_bat_read() argument
252 return pmic_reg_read(di->dev->parent, reg); in rk816_bat_read()
255 static void rk816_bat_write(struct battery_priv *di, u8 reg, u8 buf) in rk816_bat_write() argument
257 pmic_reg_write(di->dev->parent, reg, buf); in rk816_bat_write()
270 static int rk816_bat_get_rsoc(struct battery_priv *di) in rk816_bat_get_rsoc() argument
272 return (di->remain_cap + di->fcc / 200) * 100 / DIV(di->fcc); in rk816_bat_get_rsoc()
275 static int rk816_bat_get_dsoc(struct battery_priv *di) in rk816_bat_get_dsoc() argument
277 return rk816_bat_read(di, SOC_REG); in rk816_bat_get_dsoc()
280 static void rk816_bat_enable_input_current(struct battery_priv *di) in rk816_bat_enable_input_current() argument
284 val = rk816_bat_read(di, BAT_CTRL_REG); in rk816_bat_enable_input_current()
286 rk816_bat_write(di, BAT_CTRL_REG, val); in rk816_bat_enable_input_current()
289 static void rk816_bat_enable_gauge(struct battery_priv *di) in rk816_bat_enable_gauge() argument
293 val = rk816_bat_read(di, TS_CTRL_REG); in rk816_bat_enable_gauge()
295 rk816_bat_write(di, TS_CTRL_REG, val); in rk816_bat_enable_gauge()
298 static void rk816_bat_set_vol_instant_mode(struct battery_priv *di) in rk816_bat_set_vol_instant_mode() argument
302 val = rk816_bat_read(di, GGSTS_REG); in rk816_bat_set_vol_instant_mode()
304 rk816_bat_write(di, GGSTS_REG, val); in rk816_bat_set_vol_instant_mode()
307 static void rk816_bat_set_vol_avg_mode(struct battery_priv *di) in rk816_bat_set_vol_avg_mode() argument
311 val = rk816_bat_read(di, GGSTS_REG); in rk816_bat_set_vol_avg_mode()
314 rk816_bat_write(di, GGSTS_REG, val); in rk816_bat_set_vol_avg_mode()
317 static int rk816_bat_get_vcalib0(struct battery_priv *di) in rk816_bat_get_vcalib0() argument
321 val |= rk816_bat_read(di, VCALIB0_REGL) << 0; in rk816_bat_get_vcalib0()
322 val |= rk816_bat_read(di, VCALIB0_REGH) << 8; in rk816_bat_get_vcalib0()
327 static int rk816_bat_get_vcalib1(struct battery_priv *di) in rk816_bat_get_vcalib1() argument
331 val |= rk816_bat_read(di, VCALIB1_REGL) << 0; in rk816_bat_get_vcalib1()
332 val |= rk816_bat_read(di, VCALIB1_REGH) << 8; in rk816_bat_get_vcalib1()
337 static void rk816_bat_set_coffset(struct battery_priv *di, int val) in rk816_bat_set_coffset() argument
342 rk816_bat_write(di, CAL_OFFSET_REGL, buf); in rk816_bat_set_coffset()
344 rk816_bat_write(di, CAL_OFFSET_REGH, buf); in rk816_bat_set_coffset()
347 static int rk816_bat_get_ioffset(struct battery_priv *di) in rk816_bat_get_ioffset() argument
351 val |= rk816_bat_read(di, IOFFSET_REGL) << 0; in rk816_bat_get_ioffset()
352 val |= rk816_bat_read(di, IOFFSET_REGH) << 8; in rk816_bat_get_ioffset()
357 static void rk816_bat_save_dsoc(struct battery_priv *di, u8 save_soc) in rk816_bat_save_dsoc() argument
363 rk816_bat_write(di, SOC_REG, save_soc); in rk816_bat_save_dsoc()
367 static void rk816_bat_save_cap(struct battery_priv *di, int cap) in rk816_bat_save_cap() argument
375 if (cap >= di->qmax) in rk816_bat_save_cap()
376 cap = di->qmax; in rk816_bat_save_cap()
380 rk816_bat_write(di, REMAIN_CAP_REG3, buf); in rk816_bat_save_cap()
382 rk816_bat_write(di, REMAIN_CAP_REG2, buf); in rk816_bat_save_cap()
384 rk816_bat_write(di, REMAIN_CAP_REG1, buf); in rk816_bat_save_cap()
386 rk816_bat_write(di, REMAIN_CAP_REG0, buf); in rk816_bat_save_cap()
389 static void rk816_bat_init_voltage_kb(struct battery_priv *di) in rk816_bat_init_voltage_kb() argument
393 vcalib0 = rk816_bat_get_vcalib0(di); in rk816_bat_init_voltage_kb()
394 vcalib1 = rk816_bat_get_vcalib1(di); in rk816_bat_init_voltage_kb()
395 di->voltage_k = (4200 - 3000) * 1000 / DIV(vcalib1 - vcalib0); in rk816_bat_init_voltage_kb()
396 di->voltage_b = 4200 - (di->voltage_k * vcalib1) / 1000; in rk816_bat_init_voltage_kb()
397 DBG("%s. vk=%d, vb=%d\n", __func__, di->voltage_k, di->voltage_b); in rk816_bat_init_voltage_kb()
400 static int rk816_bat_get_ocv_voltage(struct battery_priv *di) in rk816_bat_get_ocv_voltage() argument
404 val |= rk816_bat_read(di, BAT_OCV_REGL) << 0; in rk816_bat_get_ocv_voltage()
405 val |= rk816_bat_read(di, BAT_OCV_REGH) << 8; in rk816_bat_get_ocv_voltage()
406 vol = di->voltage_k * val / 1000 + di->voltage_b; in rk816_bat_get_ocv_voltage()
412 static int rk816_bat_get_avg_current(struct battery_priv *di) in rk816_bat_get_avg_current() argument
416 val |= rk816_bat_read(di, BAT_CUR_AVG_REGL) << 0; in rk816_bat_get_avg_current()
417 val |= rk816_bat_read(di, BAT_CUR_AVG_REGH) << 8; in rk816_bat_get_avg_current()
421 if (!di->over_20mR) in rk816_bat_get_avg_current()
422 cur = RES_FAC_MUX(val * 1506, di->res_fac) / 1000; in rk816_bat_get_avg_current()
424 cur = RES_FAC_DIV(val * 1506, di->res_fac) / 1000; in rk816_bat_get_avg_current()
429 static int rk816_bat_get_avg_voltage(struct battery_priv *di) in rk816_bat_get_avg_voltage() argument
433 val |= rk816_bat_read(di, BAT_VOL_REGL) << 0; in rk816_bat_get_avg_voltage()
434 val |= rk816_bat_read(di, BAT_VOL_REGH) << 8; in rk816_bat_get_avg_voltage()
435 vol = di->voltage_k * val / 1000 + di->voltage_b; in rk816_bat_get_avg_voltage()
441 static int rk816_bat_get_est_voltage(struct battery_priv *di) in rk816_bat_get_est_voltage() argument
445 vol = rk816_bat_get_avg_voltage(di); in rk816_bat_get_est_voltage()
446 curr = rk816_bat_get_avg_current(di); in rk816_bat_get_est_voltage()
447 est_vol = vol - (di->bat_res * curr / 1000); in rk816_bat_get_est_voltage()
452 static u8 rk816_bat_finish_ma(struct battery_priv *di, int fcc) in rk816_bat_finish_ma() argument
466 if (di->sample_res < 20) { in rk816_bat_finish_ma()
472 } else if (di->sample_res > 20) { in rk816_bat_finish_ma()
483 static void rk816_bat_select_chrg_cv(struct battery_priv *di) in rk816_bat_select_chrg_cv() argument
487 chrg_vol_sel = di->dts_vol_sel; in rk816_bat_select_chrg_cv()
488 chrg_cur_sel = di->dts_cur_sel; in rk816_bat_select_chrg_cv()
489 chrg_cur_input = di->dts_cur_input; in rk816_bat_select_chrg_cv()
491 if (di->sample_res < 20) { in rk816_bat_select_chrg_cv()
493 chrg_cur_sel = RES_FAC_DIV(chrg_cur_sel, di->res_fac); in rk816_bat_select_chrg_cv()
496 } else if (di->sample_res > 20) { in rk816_bat_select_chrg_cv()
497 chrg_cur_sel = RES_FAC_MUX(chrg_cur_sel, di->res_fac); in rk816_bat_select_chrg_cv()
507 di->chrg_vol_sel = (index << 4); in rk816_bat_select_chrg_cv()
513 di->chrg_cur_input = (index << 0); in rk816_bat_select_chrg_cv()
519 di->chrg_cur_sel = (index << 0); in rk816_bat_select_chrg_cv()
523 __func__, di->chrg_vol_sel, di->chrg_cur_input, di->chrg_cur_sel); in rk816_bat_select_chrg_cv()
526 static void rk816_bat_init_chrg_config(struct battery_priv *di) in rk816_bat_init_chrg_config() argument
531 rk816_bat_select_chrg_cv(di); in rk816_bat_init_chrg_config()
532 finish_ma = rk816_bat_finish_ma(di, di->fcc); in rk816_bat_init_chrg_config()
534 ggcon = rk816_bat_read(di, GGCON_REG); in rk816_bat_init_chrg_config()
535 sup_sts = rk816_bat_read(di, SUP_STS_REG); in rk816_bat_init_chrg_config()
536 usb_ctrl = rk816_bat_read(di, USB_CTRL_REG); in rk816_bat_init_chrg_config()
537 thermal = rk816_bat_read(di, THERMAL_REG); in rk816_bat_init_chrg_config()
538 chrg_ctrl2 = rk816_bat_read(di, CHRG_CTRL_REG2); in rk816_bat_init_chrg_config()
539 chrg_ctrl3 = rk816_bat_read(di, CHRG_CTRL_REG3); in rk816_bat_init_chrg_config()
543 usb_ctrl |= di->chrg_cur_input; in rk816_bat_init_chrg_config()
544 chrg_ctrl1 = (CHRG_EN | di->chrg_vol_sel | di->chrg_cur_sel); in rk816_bat_init_chrg_config()
566 rk816_bat_write(di, GGCON_REG, ggcon); in rk816_bat_init_chrg_config()
567 rk816_bat_write(di, SUP_STS_REG, sup_sts); in rk816_bat_init_chrg_config()
568 rk816_bat_write(di, USB_CTRL_REG, usb_ctrl); in rk816_bat_init_chrg_config()
569 rk816_bat_write(di, THERMAL_REG, thermal); in rk816_bat_init_chrg_config()
570 rk816_bat_write(di, CHRG_CTRL_REG1, chrg_ctrl1); in rk816_bat_init_chrg_config()
571 rk816_bat_write(di, CHRG_CTRL_REG2, chrg_ctrl2); in rk816_bat_init_chrg_config()
572 rk816_bat_write(di, CHRG_CTRL_REG3, chrg_ctrl3); in rk816_bat_init_chrg_config()
622 static int rk816_bat_vol_to_cap(struct battery_priv *di, int voltage) in rk816_bat_vol_to_cap() argument
627 ocv_table = di->ocv_table; in rk816_bat_vol_to_cap()
628 ocv_size = di->ocv_size; in rk816_bat_vol_to_cap()
630 ocv_cap = ab_div_c(tmp, di->fcc, MAX_INTERPOLATE); in rk816_bat_vol_to_cap()
635 static int rk816_bat_vol_to_soc(struct battery_priv *di, int voltage) in rk816_bat_vol_to_soc() argument
640 ocv_table = di->ocv_table; in rk816_bat_vol_to_soc()
641 ocv_size = di->ocv_size; in rk816_bat_vol_to_soc()
648 static int rk816_bat_get_prev_cap(struct battery_priv *di) in rk816_bat_get_prev_cap() argument
652 val |= rk816_bat_read(di, REMAIN_CAP_REG3) << 24; in rk816_bat_get_prev_cap()
653 val |= rk816_bat_read(di, REMAIN_CAP_REG2) << 16; in rk816_bat_get_prev_cap()
654 val |= rk816_bat_read(di, REMAIN_CAP_REG1) << 8; in rk816_bat_get_prev_cap()
655 val |= rk816_bat_read(di, REMAIN_CAP_REG0) << 0; in rk816_bat_get_prev_cap()
660 static void rk816_bat_save_fcc(struct battery_priv *di, u32 cap) in rk816_bat_save_fcc() argument
665 rk816_bat_write(di, NEW_FCC_REG3, buf); in rk816_bat_save_fcc()
667 rk816_bat_write(di, NEW_FCC_REG2, buf); in rk816_bat_save_fcc()
669 rk816_bat_write(di, NEW_FCC_REG1, buf); in rk816_bat_save_fcc()
671 rk816_bat_write(di, NEW_FCC_REG0, buf); in rk816_bat_save_fcc()
674 static int rk816_bat_get_fcc(struct battery_priv *di) in rk816_bat_get_fcc() argument
678 val |= rk816_bat_read(di, NEW_FCC_REG3) << 24; in rk816_bat_get_fcc()
679 val |= rk816_bat_read(di, NEW_FCC_REG2) << 16; in rk816_bat_get_fcc()
680 val |= rk816_bat_read(di, NEW_FCC_REG1) << 8; in rk816_bat_get_fcc()
681 val |= rk816_bat_read(di, NEW_FCC_REG0) << 0; in rk816_bat_get_fcc()
684 val = di->design_cap; in rk816_bat_get_fcc()
685 else if (val > di->qmax) in rk816_bat_get_fcc()
686 val = di->qmax; in rk816_bat_get_fcc()
691 static u8 rk816_bat_get_pwroff_min(struct battery_priv *di) in rk816_bat_get_pwroff_min() argument
695 cur = rk816_bat_read(di, NON_ACT_TIMER_CNT_REG); in rk816_bat_get_pwroff_min()
696 last = rk816_bat_read(di, NON_ACT_TIMER_CNT_SAVE_REG); in rk816_bat_get_pwroff_min()
697 rk816_bat_write(di, NON_ACT_TIMER_CNT_SAVE_REG, cur); in rk816_bat_get_pwroff_min()
702 static int rk816_bat_get_coulomb_cap(struct battery_priv *di) in rk816_bat_get_coulomb_cap() argument
706 val |= rk816_bat_read(di, GASCNT_REG3) << 24; in rk816_bat_get_coulomb_cap()
707 val |= rk816_bat_read(di, GASCNT_REG2) << 16; in rk816_bat_get_coulomb_cap()
708 val |= rk816_bat_read(di, GASCNT_REG1) << 8; in rk816_bat_get_coulomb_cap()
709 val |= rk816_bat_read(di, GASCNT_REG0) << 0; in rk816_bat_get_coulomb_cap()
711 if (!di->over_20mR) in rk816_bat_get_coulomb_cap()
712 cap = RES_FAC_MUX(val / 2390, di->res_fac); in rk816_bat_get_coulomb_cap()
714 cap = RES_FAC_DIV(val / 2390, di->res_fac); in rk816_bat_get_coulomb_cap()
719 static void rk816_bat_init_capacity(struct battery_priv *di, u32 capacity) in rk816_bat_init_capacity() argument
725 delta = capacity - di->remain_cap; in rk816_bat_init_capacity()
729 if (!di->over_20mR) in rk816_bat_init_capacity()
730 cap = RES_FAC_DIV(capacity * 2390, di->res_fac); in rk816_bat_init_capacity()
732 cap = RES_FAC_MUX(capacity * 2390, di->res_fac); in rk816_bat_init_capacity()
735 rk816_bat_write(di, GASCNT_CAL_REG3, buf); in rk816_bat_init_capacity()
737 rk816_bat_write(di, GASCNT_CAL_REG2, buf); in rk816_bat_init_capacity()
739 rk816_bat_write(di, GASCNT_CAL_REG1, buf); in rk816_bat_init_capacity()
741 rk816_bat_write(di, GASCNT_CAL_REG0, buf); in rk816_bat_init_capacity()
743 di->remain_cap = rk816_bat_get_coulomb_cap(di); in rk816_bat_init_capacity()
744 di->rsoc = rk816_bat_get_rsoc(di); in rk816_bat_init_capacity()
747 static bool is_rk816_bat_ocv_valid(struct battery_priv *di) in is_rk816_bat_ocv_valid() argument
749 return di->pwroff_min >= 30 ? true : false; in is_rk816_bat_ocv_valid()
752 static int rk816_bat_get_usb_state(struct battery_priv *di) in rk816_bat_get_usb_state() argument
758 if ((rk816_bat_read(di, VB_MON_REG) & PLUG_IN_STS) != 0) in rk816_bat_get_usb_state()
778 static void rk816_bat_clr_initialized_state(struct battery_priv *di) in rk816_bat_clr_initialized_state() argument
782 val = rk816_bat_read(di, MISC_MARK_REG); in rk816_bat_clr_initialized_state()
784 rk816_bat_write(di, MISC_MARK_REG, val); in rk816_bat_clr_initialized_state()
787 static bool rk816_bat_is_initialized(struct battery_priv *di) in rk816_bat_is_initialized() argument
789 return (rk816_bat_read(di, MISC_MARK_REG) & FG_INIT) ? true : false; in rk816_bat_is_initialized()
792 static void rk816_bat_set_initialized_state(struct battery_priv *di) in rk816_bat_set_initialized_state() argument
796 val = rk816_bat_read(di, MISC_MARK_REG); in rk816_bat_set_initialized_state()
797 if (rk816_bat_get_usb_state(di) != NO_CHARGER) { in rk816_bat_set_initialized_state()
799 rk816_bat_write(di, MISC_MARK_REG, val); in rk816_bat_set_initialized_state()
801 rk816_bat_get_est_voltage(di), in rk816_bat_set_initialized_state()
802 rk816_bat_get_usb_state(di)); in rk816_bat_set_initialized_state()
806 static void rk816_bat_first_pwron(struct battery_priv *di) in rk816_bat_first_pwron() argument
810 rk816_bat_save_fcc(di, di->design_cap); in rk816_bat_first_pwron()
811 ocv_vol = rk816_bat_get_ocv_voltage(di); in rk816_bat_first_pwron()
812 di->fcc = rk816_bat_get_fcc(di); in rk816_bat_first_pwron()
813 di->nac = rk816_bat_vol_to_cap(di, ocv_vol); in rk816_bat_first_pwron()
814 di->rsoc = rk816_bat_vol_to_soc(di, ocv_vol); in rk816_bat_first_pwron()
815 di->dsoc = di->rsoc; in rk816_bat_first_pwron()
816 rk816_bat_init_capacity(di, di->nac); in rk816_bat_first_pwron()
817 rk816_bat_set_initialized_state(di); in rk816_bat_first_pwron()
819 BAT_INFO("first power on: soc=%d\n", di->dsoc); in rk816_bat_first_pwron()
822 static u8 rk816_bat_get_halt_cnt(struct battery_priv *di) in rk816_bat_get_halt_cnt() argument
824 return rk816_bat_read(di, HALT_CNT_REG); in rk816_bat_get_halt_cnt()
827 static void rk816_bat_inc_halt_cnt(struct battery_priv *di) in rk816_bat_inc_halt_cnt() argument
831 cnt = rk816_bat_read(di, HALT_CNT_REG); in rk816_bat_inc_halt_cnt()
832 rk816_bat_write(di, HALT_CNT_REG, ++cnt); in rk816_bat_inc_halt_cnt()
835 static bool is_rk816_bat_last_halt(struct battery_priv *di) in is_rk816_bat_last_halt() argument
837 int pre_cap = rk816_bat_get_prev_cap(di); in is_rk816_bat_last_halt()
838 int now_cap = rk816_bat_get_coulomb_cap(di); in is_rk816_bat_last_halt()
841 if (abs(now_cap - pre_cap) > (di->fcc / 20)) { in is_rk816_bat_last_halt()
842 rk816_bat_inc_halt_cnt(di); in is_rk816_bat_last_halt()
849 static void rk816_bat_not_first_pwron(struct battery_priv *di) in rk816_bat_not_first_pwron() argument
853 di->fcc = rk816_bat_get_fcc(di); in rk816_bat_not_first_pwron()
854 pre_soc = rk816_bat_get_dsoc(di); in rk816_bat_not_first_pwron()
855 pre_cap = rk816_bat_get_prev_cap(di); in rk816_bat_not_first_pwron()
856 now_cap = rk816_bat_get_coulomb_cap(di); in rk816_bat_not_first_pwron()
857 di->pwr_dsoc = pre_soc; in rk816_bat_not_first_pwron()
858 di->pwr_rsoc = (now_cap + di->fcc / 200) * 100 / DIV(di->fcc); in rk816_bat_not_first_pwron()
859 di->is_halt = is_rk816_bat_last_halt(di); in rk816_bat_not_first_pwron()
860 di->halt_cnt = rk816_bat_get_halt_cnt(di); in rk816_bat_not_first_pwron()
861 di->is_ocv_calib = is_rk816_bat_ocv_valid(di); in rk816_bat_not_first_pwron()
863 if (di->is_halt) { in rk816_bat_not_first_pwron()
868 rk816_bat_init_capacity(di, now_cap); in rk816_bat_not_first_pwron()
869 pre_cap = di->remain_cap; in rk816_bat_not_first_pwron()
870 pre_soc = di->rsoc; in rk816_bat_not_first_pwron()
872 } else if (di->is_ocv_calib) { in rk816_bat_not_first_pwron()
873 ocv_vol = rk816_bat_get_ocv_voltage(di); in rk816_bat_not_first_pwron()
874 ocv_soc = rk816_bat_vol_to_soc(di, ocv_vol); in rk816_bat_not_first_pwron()
875 ocv_cap = rk816_bat_vol_to_cap(di, ocv_vol); in rk816_bat_not_first_pwron()
879 if (abs(ocv_soc - pre_soc) >= di->max_soc_offset) { in rk816_bat_not_first_pwron()
883 di->is_max_soc_offset = true; in rk816_bat_not_first_pwron()
888 di->dsoc = pre_soc; in rk816_bat_not_first_pwron()
889 di->nac = pre_cap; in rk816_bat_not_first_pwron()
890 rk816_bat_init_capacity(di, di->nac); in rk816_bat_not_first_pwron()
891 rk816_bat_set_initialized_state(di); in rk816_bat_not_first_pwron()
893 di->dsoc, di->rsoc, di->remain_cap, di->pwroff_min, in rk816_bat_not_first_pwron()
894 rk816_bat_get_avg_voltage(di), rk816_bat_get_ocv_voltage(di), in rk816_bat_not_first_pwron()
895 rk816_bat_get_avg_current(di), rk816_bat_get_dsoc(di), in rk816_bat_not_first_pwron()
896 rk816_bat_get_usb_state(di), DRIVER_VERSION in rk816_bat_not_first_pwron()
900 static bool is_rk816_bat_first_poweron(struct battery_priv *di) in is_rk816_bat_first_poweron() argument
904 buf = rk816_bat_read(di, GGSTS_REG); in is_rk816_bat_first_poweron()
907 rk816_bat_write(di, GGSTS_REG, buf); in is_rk816_bat_first_poweron()
914 static bool rk816_bat_ocv_sw_reset(struct battery_priv *di) in rk816_bat_ocv_sw_reset() argument
918 buf = rk816_bat_read(di, MISC_MARK_REG); in rk816_bat_ocv_sw_reset()
919 if (((buf & FG_RESET_LATE) && di->pwroff_min >= 30) || in rk816_bat_ocv_sw_reset()
923 rk816_bat_write(di, MISC_MARK_REG, buf); in rk816_bat_ocv_sw_reset()
931 static int rk816_bat_calc_linek(struct battery_priv *di) in rk816_bat_calc_linek() argument
935 di->calc_dsoc = di->dsoc; in rk816_bat_calc_linek()
936 di->calc_rsoc = di->rsoc; in rk816_bat_calc_linek()
937 di->sm_old_cap = di->remain_cap; in rk816_bat_calc_linek()
939 delta = abs(di->dsoc - di->rsoc); in rk816_bat_calc_linek()
941 di->sm_meet_soc = (di->dsoc >= di->rsoc) ? in rk816_bat_calc_linek()
942 (di->dsoc + diff) : (di->rsoc + diff); in rk816_bat_calc_linek()
944 if (di->dsoc < di->rsoc) in rk816_bat_calc_linek()
946 else if (di->dsoc > di->rsoc) in rk816_bat_calc_linek()
951 di->sm_chrg_dsoc = di->dsoc * 1000; in rk816_bat_calc_linek()
954 __func__, di->sm_meet_soc, diff, linek, in rk816_bat_calc_linek()
955 di->calc_dsoc, di->calc_rsoc); in rk816_bat_calc_linek()
960 static int rk816_bat_get_coffset(struct battery_priv *di) in rk816_bat_get_coffset() argument
964 val |= rk816_bat_read(di, CAL_OFFSET_REGL) << 0; in rk816_bat_get_coffset()
965 val |= rk816_bat_read(di, CAL_OFFSET_REGH) << 8; in rk816_bat_get_coffset()
970 static void rk816_bat_init_poffset(struct battery_priv *di) in rk816_bat_init_poffset() argument
974 coffset = rk816_bat_get_coffset(di); in rk816_bat_init_poffset()
975 ioffset = rk816_bat_get_ioffset(di); in rk816_bat_init_poffset()
976 di->poffset = coffset - ioffset; in rk816_bat_init_poffset()
979 static void rk816_bat_select_sample_res(struct battery_priv *di) in rk816_bat_select_sample_res() argument
982 if (di->sample_res == SAMPLE_RES_20MR) { in rk816_bat_select_sample_res()
983 di->over_20mR = 0; in rk816_bat_select_sample_res()
984 di->res_fac = 10; in rk816_bat_select_sample_res()
985 } else if (di->sample_res > SAMPLE_RES_20MR) { in rk816_bat_select_sample_res()
986 di->over_20mR = 1; in rk816_bat_select_sample_res()
987 di->res_fac = di->sample_res * 10 / SAMPLE_RES_20MR; in rk816_bat_select_sample_res()
989 di->over_20mR = 0; in rk816_bat_select_sample_res()
990 di->res_fac = SAMPLE_RES_20MR * 10 / di->sample_res; in rk816_bat_select_sample_res()
993 static bool is_rk816_bat_exist(struct battery_priv *di) in is_rk816_bat_exist() argument
995 return (rk816_bat_read(di, SUP_STS_REG) & BAT_EXS) ? true : false; in is_rk816_bat_exist()
998 static void rk816_bat_set_current(struct battery_priv *di, int input_current) in rk816_bat_set_current() argument
1002 usb_ctrl = rk816_bat_read(di, USB_CTRL_REG); in rk816_bat_set_current()
1005 rk816_bat_write(di, USB_CTRL_REG, usb_ctrl); in rk816_bat_set_current()
1008 static void rk816_bat_charger_setting(struct battery_priv *di, int charger) in rk816_bat_charger_setting() argument
1015 rk816_bat_set_current(di, ILIM_450MA); in rk816_bat_charger_setting()
1017 rk816_bat_set_current(di, ILIM_450MA); in rk816_bat_charger_setting()
1019 rk816_bat_set_current(di, di->chrg_cur_input); in rk816_bat_charger_setting()
1027 static int rk816_bat_get_dc_state(struct battery_priv *di) in rk816_bat_get_dc_state() argument
1031 if (di->dc_type == DC_TYPE_OF_NONE) { in rk816_bat_get_dc_state()
1033 } else if (di->dc_type == DC_TYPE_OF_ADC) { in rk816_bat_get_dc_state()
1044 return (dm_gpio_get_value(&di->dc_det)) ? in rk816_bat_get_dc_state()
1049 static int rk816_bat_get_charger_type(struct battery_priv *di) in rk816_bat_get_charger_type() argument
1054 if ((rk816_bat_read(di, VB_MON_REG) & PLUG_IN_STS) == 0) in rk816_bat_get_charger_type()
1058 if (di->virtual_power) in rk816_bat_get_charger_type()
1062 charger_type = rk816_bat_get_dc_state(di); in rk816_bat_get_charger_type()
1067 return rk816_bat_get_usb_state(di); in rk816_bat_get_charger_type()
1070 static bool rk816_bat_need_initialize(struct battery_priv *di) in rk816_bat_need_initialize() argument
1080 est_voltage = rk816_bat_get_avg_voltage(di); in rk816_bat_need_initialize()
1090 void rk816_bat_init_rsoc(struct battery_priv *di) in rk816_bat_init_rsoc() argument
1094 di->is_first_power_on = is_rk816_bat_first_poweron(di); in rk816_bat_init_rsoc()
1096 if (di->is_first_power_on) in rk816_bat_init_rsoc()
1099 else if (rk816_bat_get_charger_type(di) != NO_CHARGER) in rk816_bat_init_rsoc()
1100 initialize = rk816_bat_need_initialize(di); in rk816_bat_init_rsoc()
1107 di->pwroff_min = rk816_bat_get_pwroff_min(di); in rk816_bat_init_rsoc()
1108 di->is_sw_reset = rk816_bat_ocv_sw_reset(di); in rk816_bat_init_rsoc()
1110 if (di->is_first_power_on || di->is_sw_reset) in rk816_bat_init_rsoc()
1111 rk816_bat_first_pwron(di); in rk816_bat_init_rsoc()
1113 rk816_bat_not_first_pwron(di); in rk816_bat_init_rsoc()
1115 rk816_bat_save_dsoc(di, di->dsoc); in rk816_bat_init_rsoc()
1116 rk816_bat_save_cap(di, di->remain_cap); in rk816_bat_init_rsoc()
1119 static int rk816_fg_init(struct battery_priv *di) in rk816_fg_init() argument
1121 rk816_bat_enable_input_current(di); in rk816_fg_init()
1122 rk816_bat_enable_gauge(di); in rk816_fg_init()
1123 rk816_bat_set_vol_instant_mode(di); in rk816_fg_init()
1124 rk816_bat_init_voltage_kb(di); in rk816_fg_init()
1125 rk816_bat_init_poffset(di); in rk816_fg_init()
1126 rk816_bat_select_sample_res(di); in rk816_fg_init()
1127 rk816_bat_clr_initialized_state(di); in rk816_fg_init()
1128 di->dsoc = rk816_bat_get_dsoc(di); in rk816_fg_init()
1129 di->remain_cap = rk816_bat_get_prev_cap(di); in rk816_fg_init()
1135 rk816_bat_init_rsoc(di); in rk816_fg_init()
1136 rk816_bat_init_chrg_config(di); in rk816_fg_init()
1137 di->chrg_type = rk816_bat_get_charger_type(di); in rk816_fg_init()
1138 di->voltage_avg = rk816_bat_get_avg_voltage(di); in rk816_fg_init()
1139 di->voltage_ocv = rk816_bat_get_ocv_voltage(di); in rk816_fg_init()
1140 di->current_avg = rk816_bat_get_avg_current(di); in rk816_fg_init()
1141 di->sm_linek = rk816_bat_calc_linek(di); in rk816_fg_init()
1142 di->finish_chrg_base = get_timer(0); in rk816_fg_init()
1143 di->pwr_vol = di->voltage_avg; in rk816_fg_init()
1144 rk816_bat_charger_setting(di, di->chrg_type); in rk816_fg_init()
1147 di->dsoc, di->remain_cap, di->voltage_avg, in rk816_fg_init()
1148 charger_type_to_name[di->chrg_type], in rk816_fg_init()
1149 di->virtual_power ? "(virtual)" : ""); in rk816_fg_init()
1154 static u8 rk816_bat_get_chrg_status(struct battery_priv *di) in rk816_bat_get_chrg_status() argument
1158 status = rk816_bat_read(di, SUP_STS_REG) & BAT_STATUS_MSK; in rk816_bat_get_chrg_status()
1197 static void rk816_bat_finish_chrg(struct battery_priv *di) in rk816_bat_finish_chrg() argument
1201 if (di->dsoc < 100) { in rk816_bat_finish_chrg()
1202 tgt_sec = di->fcc * 3600 / 100 / FINISH_CALI_CURR; in rk816_bat_finish_chrg()
1203 if (get_timer(di->finish_chrg_base) > SECONDS(tgt_sec)) { in rk816_bat_finish_chrg()
1204 di->finish_chrg_base = get_timer(0); in rk816_bat_finish_chrg()
1205 di->dsoc++; in rk816_bat_finish_chrg()
1209 get_timer(di->finish_chrg_base)); in rk816_bat_finish_chrg()
1212 static void rk816_bat_debug_info(struct battery_priv *di) in rk816_bat_debug_info() argument
1221 ggcon = rk816_bat_read(di, GGCON_REG); in rk816_bat_debug_info()
1222 ggsts = rk816_bat_read(di, GGSTS_REG); in rk816_bat_debug_info()
1223 sup_sts = rk816_bat_read(di, SUP_STS_REG); in rk816_bat_debug_info()
1224 usb_ctrl = rk816_bat_read(di, USB_CTRL_REG); in rk816_bat_debug_info()
1225 thermal = rk816_bat_read(di, THERMAL_REG); in rk816_bat_debug_info()
1226 vb_mod = rk816_bat_read(di, VB_MON_REG); in rk816_bat_debug_info()
1227 misc = rk816_bat_read(di, MISC_MARK_REG); in rk816_bat_debug_info()
1228 rtc = rk816_bat_read(di, SECONDS_REG); in rk816_bat_debug_info()
1229 chrg_ctrl1 = rk816_bat_read(di, CHRG_CTRL_REG1); in rk816_bat_debug_info()
1230 chrg_ctrl2 = rk816_bat_read(di, CHRG_CTRL_REG2); in rk816_bat_debug_info()
1231 chrg_ctrl3 = rk816_bat_read(di, CHRG_CTRL_REG3); in rk816_bat_debug_info()
1232 if (!di->over_20mR) in rk816_bat_debug_info()
1234 di->res_fac); in rk816_bat_debug_info()
1237 di->res_fac); in rk816_bat_debug_info()
1252 di->dsoc, rk816_bat_get_rsoc(di), rk816_bat_get_avg_voltage(di), in rk816_bat_debug_info()
1253 rk816_bat_get_avg_current(di), di->remain_cap, di->fcc, in rk816_bat_debug_info()
1254 di->rsoc - di->dsoc, in rk816_bat_debug_info()
1255 di->sm_linek, di->sm_old_cap, name[di->chrg_type], in rk816_bat_debug_info()
1258 CHRG_VOL_SEL[(chrg_ctrl1 & 0x70) >> 4], di->res_fac, in rk816_bat_debug_info()
1259 di->pwroff_min, in rk816_bat_debug_info()
1260 di->sm_meet_soc, di->calc_dsoc, di->calc_rsoc, in rk816_bat_debug_info()
1261 rk816_bat_get_ocv_voltage(di), di->sample_res, in rk816_bat_debug_info()
1262 rk816_bat_get_ioffset(di), in rk816_bat_debug_info()
1263 rk816_bat_get_coffset(di), di->is_max_soc_offset, in rk816_bat_debug_info()
1264 di->is_ocv_calib, di->is_halt, di->halt_cnt, di->pwr_dsoc, in rk816_bat_debug_info()
1265 di->pwr_rsoc, di->pwr_vol, is_rk816_bat_exist(di) in rk816_bat_debug_info()
1267 rk816_bat_get_chrg_status(di); in rk816_bat_debug_info()
1271 static void rk816_bat_linek_algorithm(struct battery_priv *di) in rk816_bat_linek_algorithm() argument
1274 u8 chg_st = rk816_bat_get_chrg_status(di); in rk816_bat_linek_algorithm()
1277 if (di->dsoc == 99) in rk816_bat_linek_algorithm()
1278 di->sm_linek = CHRG_FULL_K; in rk816_bat_linek_algorithm()
1279 else if (di->dsoc >= CHRG_TERM_DSOC && di->current_avg > TERM_CALI_CURR) in rk816_bat_linek_algorithm()
1280 di->sm_linek = CHRG_TERM_K; in rk816_bat_linek_algorithm()
1282 delta_cap = di->remain_cap - di->sm_old_cap; in rk816_bat_linek_algorithm()
1283 ydsoc = di->sm_linek * delta_cap * 100 / DIV(di->fcc); in rk816_bat_linek_algorithm()
1285 tmp = (di->sm_chrg_dsoc + 1) / 1000; in rk816_bat_linek_algorithm()
1286 if (tmp != di->dsoc) in rk816_bat_linek_algorithm()
1287 di->sm_chrg_dsoc = di->dsoc * 1000; in rk816_bat_linek_algorithm()
1288 di->sm_chrg_dsoc += ydsoc; in rk816_bat_linek_algorithm()
1289 di->dsoc = (di->sm_chrg_dsoc + 1) / 1000; in rk816_bat_linek_algorithm()
1290 di->sm_old_cap = di->remain_cap; in rk816_bat_linek_algorithm()
1291 if (di->dsoc == di->rsoc && di->sm_linek != CHRG_FULL_K && in rk816_bat_linek_algorithm()
1292 di->sm_linek != CHRG_TERM_K) in rk816_bat_linek_algorithm()
1293 di->sm_linek = 1000; in rk816_bat_linek_algorithm()
1296 if ((di->sm_linek == 1000 || di->dsoc >= 100) && in rk816_bat_linek_algorithm()
1298 if (di->sm_linek == 1000) in rk816_bat_linek_algorithm()
1299 di->dsoc = di->rsoc; in rk816_bat_linek_algorithm()
1300 di->sm_chrg_dsoc = di->dsoc * 1000; in rk816_bat_linek_algorithm()
1305 di->sm_linek, di->sm_chrg_dsoc, delta_cap, ydsoc, di->sm_old_cap, in rk816_bat_linek_algorithm()
1306 di->calc_dsoc, di->calc_rsoc, di->sm_meet_soc); in rk816_bat_linek_algorithm()
1309 static int rk816_bat_get_iadc(struct battery_priv *di) in rk816_bat_get_iadc() argument
1313 val |= rk816_bat_read(di, BAT_CUR_AVG_REGL) << 0; in rk816_bat_get_iadc()
1314 val |= rk816_bat_read(di, BAT_CUR_AVG_REGH) << 8; in rk816_bat_get_iadc()
1321 static bool rk816_bat_adc_calib(struct battery_priv *di) in rk816_bat_adc_calib() argument
1325 if (abs(di->current_avg) < ADC_CALIB_THRESHOLD) in rk816_bat_adc_calib()
1329 adc = rk816_bat_get_iadc(di); in rk816_bat_adc_calib()
1330 coffset = rk816_bat_get_coffset(di); in rk816_bat_adc_calib()
1331 rk816_bat_set_coffset(di, coffset + adc); in rk816_bat_adc_calib()
1333 adc = rk816_bat_get_iadc(di); in rk816_bat_adc_calib()
1335 coffset = rk816_bat_get_coffset(di); in rk816_bat_adc_calib()
1336 ioffset = rk816_bat_get_ioffset(di); in rk816_bat_adc_calib()
1337 di->poffset = coffset - ioffset; in rk816_bat_adc_calib()
1338 rk816_bat_write(di, POFFSET_REG, di->poffset); in rk816_bat_adc_calib()
1340 coffset, ioffset, di->poffset); in rk816_bat_adc_calib()
1344 rk816_bat_set_coffset(di, coffset); in rk816_bat_adc_calib()
1352 static void rk816_bat_smooth_charge(struct battery_priv *di) in rk816_bat_smooth_charge() argument
1354 u8 chg_st = rk816_bat_get_chrg_status(di); in rk816_bat_smooth_charge()
1356 if (di->vol_mode_base && get_timer(di->vol_mode_base) > SECONDS(10)) { in rk816_bat_smooth_charge()
1357 rk816_bat_set_vol_avg_mode(di); in rk816_bat_smooth_charge()
1358 di->vol_mode_base = 0; in rk816_bat_smooth_charge()
1362 if ((di->chrg_type == NO_CHARGER) || in rk816_bat_smooth_charge()
1363 !rk816_bat_is_initialized(di)) { in rk816_bat_smooth_charge()
1364 DBG("chrg=%d, initialized=%d\n", di->chrg_type, in rk816_bat_smooth_charge()
1365 rk816_bat_is_initialized(di)); in rk816_bat_smooth_charge()
1370 di->remain_cap = rk816_bat_get_coulomb_cap(di); in rk816_bat_smooth_charge()
1371 di->rsoc = rk816_bat_get_rsoc(di); in rk816_bat_smooth_charge()
1372 if (di->remain_cap > di->fcc) { in rk816_bat_smooth_charge()
1373 di->sm_old_cap -= (di->remain_cap - di->fcc); in rk816_bat_smooth_charge()
1374 rk816_bat_init_capacity(di, di->fcc); in rk816_bat_smooth_charge()
1380 if (di->adc_allow_update) in rk816_bat_smooth_charge()
1381 di->adc_allow_update = !rk816_bat_adc_calib(di); in rk816_bat_smooth_charge()
1382 rk816_bat_finish_chrg(di); in rk816_bat_smooth_charge()
1383 rk816_bat_init_capacity(di, di->fcc); in rk816_bat_smooth_charge()
1386 di->adc_allow_update = true; in rk816_bat_smooth_charge()
1387 di->finish_chrg_base = get_timer(0); in rk816_bat_smooth_charge()
1388 rk816_bat_linek_algorithm(di); in rk816_bat_smooth_charge()
1392 if (di->dsoc > 100) in rk816_bat_smooth_charge()
1393 di->dsoc = 100; in rk816_bat_smooth_charge()
1394 else if (di->dsoc < 0) in rk816_bat_smooth_charge()
1395 di->dsoc = 0; in rk816_bat_smooth_charge()
1397 rk816_bat_save_dsoc(di, di->dsoc); in rk816_bat_smooth_charge()
1398 rk816_bat_save_cap(di, di->remain_cap); in rk816_bat_smooth_charge()
1400 rk816_bat_debug_info(di); in rk816_bat_smooth_charge()
1405 struct battery_priv *di = dev_get_priv(dev); in rk816_bat_bat_is_exit() local
1407 return is_rk816_bat_exist(di); in rk816_bat_bat_is_exit()
1412 struct battery_priv *di = dev_get_priv(dev); in rk816_bat_update_get_soc() local
1416 di->chrg_type = in rk816_bat_update_get_soc()
1417 rk816_bat_get_charger_type(di); in rk816_bat_update_get_soc()
1418 rk816_bat_charger_setting(di, di->chrg_type); in rk816_bat_update_get_soc()
1425 rk816_bat_smooth_charge(di); in rk816_bat_update_get_soc()
1429 if (!di->virtual_power && di->voltage_k) in rk816_bat_update_get_soc()
1430 return di->dsoc; in rk816_bat_update_get_soc()
1437 struct battery_priv *di = dev_get_priv(dev); in rk816_bat_update_get_voltage() local
1439 if (!di->virtual_power && di->voltage_k) in rk816_bat_update_get_voltage()
1440 return rk816_bat_get_est_voltage(di); in rk816_bat_update_get_voltage()
1447 struct battery_priv *di = dev_get_priv(dev); in rk816_bat_update_get_current() local
1449 if (!di->virtual_power && di->voltage_k) in rk816_bat_update_get_current()
1450 return rk816_bat_get_avg_current(di); in rk816_bat_update_get_current()
1457 struct battery_priv *di = dev_get_priv(dev); in rk816_bat_update_get_chrg_online() local
1459 return rk816_bat_get_charger_type(di); in rk816_bat_update_get_chrg_online()
1473 struct battery_priv *di = dev_get_priv(dev); in rk816_fg_ofdata_to_platdata() local
1482 di->dev = dev; in rk816_fg_ofdata_to_platdata()
1492 di->ocv_table = calloc(len, 1); in rk816_fg_ofdata_to_platdata()
1493 if (!di->ocv_table) { in rk816_fg_ofdata_to_platdata()
1498 di->ocv_size = len / 4; in rk816_fg_ofdata_to_platdata()
1500 di->ocv_table, di->ocv_size)) { in rk816_fg_ofdata_to_platdata()
1502 free(di->ocv_table); in rk816_fg_ofdata_to_platdata()
1507 di->design_cap = dev_read_u32_default(dev, "design_capacity", -1); in rk816_fg_ofdata_to_platdata()
1508 if (di->design_cap < 0) { in rk816_fg_ofdata_to_platdata()
1513 di->qmax = dev_read_u32_default(dev, "design_qmax", -1); in rk816_fg_ofdata_to_platdata()
1514 if (di->qmax < 0) { in rk816_fg_ofdata_to_platdata()
1520 di->dts_vol_sel = dev_read_u32_default(dev, "max_chrg_voltage", 4200); in rk816_fg_ofdata_to_platdata()
1521 di->dts_cur_input = dev_read_u32_default(dev, "max_input_current", 2000); in rk816_fg_ofdata_to_platdata()
1522 di->dts_cur_sel = dev_read_u32_default(dev, "max_chrg_current", 1200); in rk816_fg_ofdata_to_platdata()
1523 di->max_soc_offset = dev_read_u32_default(dev, "max_soc_offset", 70); in rk816_fg_ofdata_to_platdata()
1524 di->virtual_power = dev_read_u32_default(dev, "virtual_power", 0); in rk816_fg_ofdata_to_platdata()
1525 di->sample_res = dev_read_u32_default(dev, "sample_res", 20); in rk816_fg_ofdata_to_platdata()
1526 di->bat_res = dev_read_u32_default(dev, "bat_res", 135); in rk816_fg_ofdata_to_platdata()
1529 di->dc_det_adc = dev_read_u32_default(dev, "dc_det_adc", 0); in rk816_fg_ofdata_to_platdata()
1530 if (di->dc_det_adc <= 0) { in rk816_fg_ofdata_to_platdata()
1532 0, &di->dc_det, GPIOD_IS_IN)) { in rk816_fg_ofdata_to_platdata()
1533 di->dc_type = DC_TYPE_OF_GPIO; in rk816_fg_ofdata_to_platdata()
1535 di->dc_type = DC_TYPE_OF_NONE; in rk816_fg_ofdata_to_platdata()
1538 di->dc_type = DC_TYPE_OF_ADC; in rk816_fg_ofdata_to_platdata()
1542 if (!is_rk816_bat_exist(di)) in rk816_fg_ofdata_to_platdata()
1543 di->virtual_power = 1; in rk816_fg_ofdata_to_platdata()
1546 DBG("max_input_current:%d\n", di->dts_cur_input); in rk816_fg_ofdata_to_platdata()
1547 DBG("max_chrg_current:%d\n", di->dts_cur_sel); in rk816_fg_ofdata_to_platdata()
1548 DBG("max_chrg_voltage:%d\n", di->dts_vol_sel); in rk816_fg_ofdata_to_platdata()
1549 DBG("design_capacity :%d\n", di->design_cap); in rk816_fg_ofdata_to_platdata()
1550 DBG("design_qmax:%d\n", di->qmax); in rk816_fg_ofdata_to_platdata()
1551 DBG("max_soc_offset:%d\n", di->max_soc_offset); in rk816_fg_ofdata_to_platdata()
1552 DBG("dc_det_adc:%d\n", di->dc_det_adc); in rk816_fg_ofdata_to_platdata()
1553 DBG("res_sample:%d\n", di->sample_res); in rk816_fg_ofdata_to_platdata()
1561 struct battery_priv *di = dev_get_priv(dev); in rk816_fg_probe() local
1568 return rk816_fg_init(di); in rk816_fg_probe()