Lines Matching refs:di
246 static int rk818_bat_read(struct battery_priv *di, u8 reg) in rk818_bat_read() argument
248 return pmic_reg_read(di->dev->parent, reg); in rk818_bat_read()
251 static void rk818_bat_write(struct battery_priv *di, u8 reg, u8 buf) in rk818_bat_write() argument
253 pmic_reg_write(di->dev->parent, reg, buf); in rk818_bat_write()
266 static int rk818_bat_get_rsoc(struct battery_priv *di) in rk818_bat_get_rsoc() argument
268 return (di->remain_cap + di->fcc / 200) * 100 / DIV(di->fcc); in rk818_bat_get_rsoc()
271 static int rk818_bat_get_dsoc(struct battery_priv *di) in rk818_bat_get_dsoc() argument
273 return rk818_bat_read(di, SOC_REG); in rk818_bat_get_dsoc()
276 static void rk818_bat_enable_gauge(struct battery_priv *di) in rk818_bat_enable_gauge() argument
280 val = rk818_bat_read(di, TS_CTRL_REG); in rk818_bat_enable_gauge()
282 rk818_bat_write(di, TS_CTRL_REG, val); in rk818_bat_enable_gauge()
285 static int rk818_bat_get_vcalib0(struct battery_priv *di) in rk818_bat_get_vcalib0() argument
289 val |= rk818_bat_read(di, VCALIB0_REGL) << 0; in rk818_bat_get_vcalib0()
290 val |= rk818_bat_read(di, VCALIB0_REGH) << 8; in rk818_bat_get_vcalib0()
295 static int rk818_bat_get_vcalib1(struct battery_priv *di) in rk818_bat_get_vcalib1() argument
299 val |= rk818_bat_read(di, VCALIB1_REGL) << 0; in rk818_bat_get_vcalib1()
300 val |= rk818_bat_read(di, VCALIB1_REGH) << 8; in rk818_bat_get_vcalib1()
305 static int rk818_bat_get_ioffset(struct battery_priv *di) in rk818_bat_get_ioffset() argument
309 val |= rk818_bat_read(di, IOFFSET_REGL) << 0; in rk818_bat_get_ioffset()
310 val |= rk818_bat_read(di, IOFFSET_REGH) << 8; in rk818_bat_get_ioffset()
316 static int rk818_bat_get_coffset(struct battery_priv *di) in rk818_bat_get_coffset() argument
320 val |= rk818_bat_read(di, CAL_OFFSET_REGL) << 0; in rk818_bat_get_coffset()
321 val |= rk818_bat_read(di, CAL_OFFSET_REGH) << 8; in rk818_bat_get_coffset()
327 static void rk818_bat_set_coffset(struct battery_priv *di, int val) in rk818_bat_set_coffset() argument
332 rk818_bat_write(di, CAL_OFFSET_REGL, buf); in rk818_bat_set_coffset()
334 rk818_bat_write(di, CAL_OFFSET_REGH, buf); in rk818_bat_set_coffset()
339 static void rk818_bat_init_coffset(struct battery_priv *di) in rk818_bat_init_coffset() argument
343 ioffset = rk818_bat_get_ioffset(di); in rk818_bat_init_coffset()
345 di->poffset = rk818_bat_read(di, POFFSET_REG); in rk818_bat_init_coffset()
346 if (!di->poffset) in rk818_bat_init_coffset()
347 di->poffset = DEFAULT_POFFSET; in rk818_bat_init_coffset()
349 coffset = di->poffset + ioffset; in rk818_bat_init_coffset()
353 rk818_bat_set_coffset(di, coffset); in rk818_bat_init_coffset()
356 static void rk818_bat_init_voltage_kb(struct battery_priv *di) in rk818_bat_init_voltage_kb() argument
360 vcalib0 = rk818_bat_get_vcalib0(di); in rk818_bat_init_voltage_kb()
361 vcalib1 = rk818_bat_get_vcalib1(di); in rk818_bat_init_voltage_kb()
362 di->voltage_k = (4200 - 3000) * 1000 / DIV(vcalib1 - vcalib0); in rk818_bat_init_voltage_kb()
363 di->voltage_b = 4200 - (di->voltage_k * vcalib1) / 1000; in rk818_bat_init_voltage_kb()
364 DBG("%s. vk=%d, vb=%d\n", __func__, di->voltage_k, di->voltage_b); in rk818_bat_init_voltage_kb()
367 static int rk818_bat_get_ocv_voltage(struct battery_priv *di) in rk818_bat_get_ocv_voltage() argument
371 val |= rk818_bat_read(di, BAT_OCV_REGL) << 0; in rk818_bat_get_ocv_voltage()
372 val |= rk818_bat_read(di, BAT_OCV_REGH) << 8; in rk818_bat_get_ocv_voltage()
373 vol = di->voltage_k * val / 1000 + di->voltage_b; in rk818_bat_get_ocv_voltage()
378 static int rk818_bat_get_avg_current(struct battery_priv *di) in rk818_bat_get_avg_current() argument
382 val |= rk818_bat_read(di, BAT_CUR_AVG_REGL) << 0; in rk818_bat_get_avg_current()
383 val |= rk818_bat_read(di, BAT_CUR_AVG_REGH) << 8; in rk818_bat_get_avg_current()
387 val = val * di->res_div * 1506 / 1000; in rk818_bat_get_avg_current()
392 static int rk818_bat_get_avg_voltage(struct battery_priv *di) in rk818_bat_get_avg_voltage() argument
396 val |= rk818_bat_read(di, BAT_VOL_REGL) << 0; in rk818_bat_get_avg_voltage()
397 val |= rk818_bat_read(di, BAT_VOL_REGH) << 8; in rk818_bat_get_avg_voltage()
398 vol = di->voltage_k * val / 1000 + di->voltage_b; in rk818_bat_get_avg_voltage()
403 static int rk818_bat_get_est_voltage(struct battery_priv *di) in rk818_bat_get_est_voltage() argument
415 vol = rk818_bat_get_avg_voltage(di); in rk818_bat_get_est_voltage()
416 curr = rk818_bat_get_avg_current(di); in rk818_bat_get_est_voltage()
417 plugin = rk818_bat_read(di, VB_MON_REG) & PLUG_IN_STS ? 1 : 0; in rk818_bat_get_est_voltage()
418 if (di->is_first_power_on || (!plugin && curr >= 0) || (plugin && curr <= 0)) { in rk818_bat_get_est_voltage()
420 __func__, curr, plugin, di->is_first_power_on); in rk818_bat_get_est_voltage()
423 est_vol = vol - (di->bat_res * curr / 1000); in rk818_bat_get_est_voltage()
430 vol = rk818_bat_get_avg_voltage(di); in rk818_bat_get_est_voltage()
431 curr = rk818_bat_get_avg_current(di); in rk818_bat_get_est_voltage()
432 plugin = rk818_bat_read(di, VB_MON_REG) & PLUG_IN_STS; in rk818_bat_get_est_voltage()
433 if (di->is_first_power_on || (!plugin && curr >= 0) || (plugin && curr <= 0)) { in rk818_bat_get_est_voltage()
435 __func__, curr, plugin, di->is_first_power_on); in rk818_bat_get_est_voltage()
438 est_vol = vol - (di->bat_res * curr / 1000); in rk818_bat_get_est_voltage()
448 static u8 rk818_bat_finish_ma(struct battery_priv *di, int fcc) in rk818_bat_finish_ma() argument
452 if (di->res_div == 2) in rk818_bat_finish_ma()
466 static void rk818_bat_select_chrg_cv(struct battery_priv *di) in rk818_bat_select_chrg_cv() argument
470 chrg_vol_sel = di->dts_vol_sel; in rk818_bat_select_chrg_cv()
471 chrg_cur_sel = di->dts_cur_sel; in rk818_bat_select_chrg_cv()
472 chrg_cur_input = di->dts_cur_input; in rk818_bat_select_chrg_cv()
473 if (di->sample_res == SAMPLE_RES_10mR) { in rk818_bat_select_chrg_cv()
475 chrg_cur_sel /= di->res_div; in rk818_bat_select_chrg_cv()
483 di->chrg_vol_sel = (index << 4); in rk818_bat_select_chrg_cv()
489 di->chrg_cur_input = (index << 0); in rk818_bat_select_chrg_cv()
495 di->chrg_cur_sel = (index << 0); in rk818_bat_select_chrg_cv()
499 __func__, di->chrg_vol_sel, di->chrg_cur_input, di->chrg_cur_sel); in rk818_bat_select_chrg_cv()
502 static void rk818_bat_init_chrg_config(struct battery_priv *di) in rk818_bat_init_chrg_config() argument
507 rk818_bat_select_chrg_cv(di); in rk818_bat_init_chrg_config()
508 finish_ma = rk818_bat_finish_ma(di, di->fcc); in rk818_bat_init_chrg_config()
510 ggcon = rk818_bat_read(di, GGCON_REG); in rk818_bat_init_chrg_config()
511 sup_sts = rk818_bat_read(di, SUP_STS_REG); in rk818_bat_init_chrg_config()
512 usb_ctrl = rk818_bat_read(di, USB_CTRL_REG); in rk818_bat_init_chrg_config()
513 thermal = rk818_bat_read(di, THERMAL_REG); in rk818_bat_init_chrg_config()
514 chrg_ctrl2 = rk818_bat_read(di, CHRG_CTRL_REG2); in rk818_bat_init_chrg_config()
515 chrg_ctrl3 = rk818_bat_read(di, CHRG_CTRL_REG3); in rk818_bat_init_chrg_config()
519 usb_ctrl |= di->chrg_cur_input; in rk818_bat_init_chrg_config()
520 chrg_ctrl1 = (CHRG_EN | di->chrg_vol_sel | di->chrg_cur_sel); in rk818_bat_init_chrg_config()
543 rk818_bat_write(di, GGCON_REG, ggcon); in rk818_bat_init_chrg_config()
544 rk818_bat_write(di, SUP_STS_REG, sup_sts); in rk818_bat_init_chrg_config()
545 rk818_bat_write(di, USB_CTRL_REG, usb_ctrl); in rk818_bat_init_chrg_config()
546 rk818_bat_write(di, THERMAL_REG, thermal); in rk818_bat_init_chrg_config()
547 rk818_bat_write(di, CHRG_CTRL_REG1, chrg_ctrl1); in rk818_bat_init_chrg_config()
548 rk818_bat_write(di, CHRG_CTRL_REG2, chrg_ctrl2); in rk818_bat_init_chrg_config()
549 rk818_bat_write(di, CHRG_CTRL_REG3, chrg_ctrl3); in rk818_bat_init_chrg_config()
599 static int rk818_bat_vol_to_cap(struct battery_priv *di, int voltage) in rk818_bat_vol_to_cap() argument
604 ocv_table = di->ocv_table; in rk818_bat_vol_to_cap()
605 ocv_size = di->ocv_size; in rk818_bat_vol_to_cap()
607 ocv_cap = ab_div_c(tmp, di->fcc, MAX_INTERPOLATE); in rk818_bat_vol_to_cap()
612 static int rk818_bat_vol_to_soc(struct battery_priv *di, int voltage) in rk818_bat_vol_to_soc() argument
617 ocv_table = di->ocv_table; in rk818_bat_vol_to_soc()
618 ocv_size = di->ocv_size; in rk818_bat_vol_to_soc()
625 static int rk818_bat_get_prev_cap(struct battery_priv *di) in rk818_bat_get_prev_cap() argument
629 val |= rk818_bat_read(di, REMAIN_CAP_REG3) << 24; in rk818_bat_get_prev_cap()
630 val |= rk818_bat_read(di, REMAIN_CAP_REG2) << 16; in rk818_bat_get_prev_cap()
631 val |= rk818_bat_read(di, REMAIN_CAP_REG1) << 8; in rk818_bat_get_prev_cap()
632 val |= rk818_bat_read(di, REMAIN_CAP_REG0) << 0; in rk818_bat_get_prev_cap()
637 static void rk818_bat_save_fcc(struct battery_priv *di, u32 cap) in rk818_bat_save_fcc() argument
642 rk818_bat_write(di, NEW_FCC_REG3, buf); in rk818_bat_save_fcc()
644 rk818_bat_write(di, NEW_FCC_REG2, buf); in rk818_bat_save_fcc()
646 rk818_bat_write(di, NEW_FCC_REG1, buf); in rk818_bat_save_fcc()
648 rk818_bat_write(di, NEW_FCC_REG0, buf); in rk818_bat_save_fcc()
651 static int rk818_bat_get_fcc(struct battery_priv *di) in rk818_bat_get_fcc() argument
655 val |= rk818_bat_read(di, NEW_FCC_REG3) << 24; in rk818_bat_get_fcc()
656 val |= rk818_bat_read(di, NEW_FCC_REG2) << 16; in rk818_bat_get_fcc()
657 val |= rk818_bat_read(di, NEW_FCC_REG1) << 8; in rk818_bat_get_fcc()
658 val |= rk818_bat_read(di, NEW_FCC_REG0) << 0; in rk818_bat_get_fcc()
661 val = di->design_cap; in rk818_bat_get_fcc()
662 else if (val > di->qmax) in rk818_bat_get_fcc()
663 val = di->qmax; in rk818_bat_get_fcc()
668 static int rk818_bat_get_pwroff_min(struct battery_priv *di) in rk818_bat_get_pwroff_min() argument
672 cur = rk818_bat_read(di, NON_ACT_TIMER_CNT_REG); in rk818_bat_get_pwroff_min()
673 last = rk818_bat_read(di, NON_ACT_TIMER_CNT_SAVE_REG); in rk818_bat_get_pwroff_min()
674 rk818_bat_write(di, NON_ACT_TIMER_CNT_SAVE_REG, cur); in rk818_bat_get_pwroff_min()
679 static int rk818_bat_get_coulomb_cap(struct battery_priv *di) in rk818_bat_get_coulomb_cap() argument
683 val |= rk818_bat_read(di, GASCNT_REG3) << 24; in rk818_bat_get_coulomb_cap()
684 val |= rk818_bat_read(di, GASCNT_REG2) << 16; in rk818_bat_get_coulomb_cap()
685 val |= rk818_bat_read(di, GASCNT_REG1) << 8; in rk818_bat_get_coulomb_cap()
686 val |= rk818_bat_read(di, GASCNT_REG0) << 0; in rk818_bat_get_coulomb_cap()
689 return val * di->res_div; in rk818_bat_get_coulomb_cap()
692 static void rk818_bat_save_cap(struct battery_priv *di, int cap) in rk818_bat_save_cap() argument
700 if (cap >= di->qmax) in rk818_bat_save_cap()
701 cap = di->qmax; in rk818_bat_save_cap()
705 rk818_bat_write(di, REMAIN_CAP_REG3, buf); in rk818_bat_save_cap()
707 rk818_bat_write(di, REMAIN_CAP_REG2, buf); in rk818_bat_save_cap()
709 rk818_bat_write(di, REMAIN_CAP_REG1, buf); in rk818_bat_save_cap()
711 rk818_bat_write(di, REMAIN_CAP_REG0, buf); in rk818_bat_save_cap()
714 static void rk818_bat_init_capacity(struct battery_priv *di, u32 capacity) in rk818_bat_init_capacity() argument
720 delta = capacity - di->remain_cap; in rk818_bat_init_capacity()
724 cap = capacity * 2390 / di->res_div; in rk818_bat_init_capacity()
726 rk818_bat_write(di, GASCNT_CAL_REG3, buf); in rk818_bat_init_capacity()
728 rk818_bat_write(di, GASCNT_CAL_REG2, buf); in rk818_bat_init_capacity()
730 rk818_bat_write(di, GASCNT_CAL_REG1, buf); in rk818_bat_init_capacity()
732 rk818_bat_write(di, GASCNT_CAL_REG0, buf); in rk818_bat_init_capacity()
734 di->remain_cap = rk818_bat_get_coulomb_cap(di); in rk818_bat_init_capacity()
735 di->rsoc = rk818_bat_get_rsoc(di); in rk818_bat_init_capacity()
736 rk818_bat_save_cap(di, di->remain_cap); in rk818_bat_init_capacity()
739 static bool is_rk818_bat_ocv_valid(struct battery_priv *di) in is_rk818_bat_ocv_valid() argument
741 return di->pwroff_min >= 30 ? true : false; in is_rk818_bat_ocv_valid()
744 static int rk818_bat_get_usb_state(struct battery_priv *di) in rk818_bat_get_usb_state() argument
750 if ((rk818_bat_read(di, VB_MON_REG) & PLUG_IN_STS) != 0) in rk818_bat_get_usb_state()
770 static void rk818_bat_clr_initialized_state(struct battery_priv *di) in rk818_bat_clr_initialized_state() argument
774 val = rk818_bat_read(di, MISC_MARK_REG); in rk818_bat_clr_initialized_state()
776 rk818_bat_write(di, MISC_MARK_REG, val); in rk818_bat_clr_initialized_state()
779 static bool rk818_bat_is_initialized(struct battery_priv *di) in rk818_bat_is_initialized() argument
781 return (rk818_bat_read(di, MISC_MARK_REG) & FG_INIT) ? true : false; in rk818_bat_is_initialized()
784 static void rk818_bat_set_initialized_state(struct battery_priv *di) in rk818_bat_set_initialized_state() argument
788 val = rk818_bat_read(di, MISC_MARK_REG); in rk818_bat_set_initialized_state()
789 if (rk818_bat_get_usb_state(di) != NO_CHARGER) { in rk818_bat_set_initialized_state()
791 rk818_bat_write(di, MISC_MARK_REG, val); in rk818_bat_set_initialized_state()
793 rk818_bat_get_est_voltage(di), in rk818_bat_set_initialized_state()
794 rk818_bat_get_usb_state(di)); in rk818_bat_set_initialized_state()
798 static void rk818_bat_save_dsoc(struct battery_priv *di, u8 save_soc) in rk818_bat_save_dsoc() argument
804 rk818_bat_write(di, SOC_REG, save_soc); in rk818_bat_save_dsoc()
808 static void rk818_bat_first_pwron(struct battery_priv *di) in rk818_bat_first_pwron() argument
812 rk818_bat_save_fcc(di, di->design_cap); in rk818_bat_first_pwron()
813 ocv_vol = rk818_bat_get_ocv_voltage(di); in rk818_bat_first_pwron()
814 curr = rk818_bat_get_avg_current(di); in rk818_bat_first_pwron()
815 di->fcc = rk818_bat_get_fcc(di); in rk818_bat_first_pwron()
816 di->nac = rk818_bat_vol_to_cap(di, ocv_vol); in rk818_bat_first_pwron()
817 di->rsoc = rk818_bat_vol_to_soc(di, ocv_vol); in rk818_bat_first_pwron()
818 di->dsoc = di->rsoc; in rk818_bat_first_pwron()
819 vol = rk818_bat_get_avg_voltage(di); in rk818_bat_first_pwron()
824 rk818_bat_save_dsoc(di, di->dsoc); in rk818_bat_first_pwron()
825 rk818_bat_init_capacity(di, di->nac); in rk818_bat_first_pwron()
826 rk818_bat_set_initialized_state(di); in rk818_bat_first_pwron()
828 di->dsoc, vol, ocv_vol, curr, rk818_bat_get_usb_state(di), di->fcc); in rk818_bat_first_pwron()
831 static u8 rk818_bat_get_halt_cnt(struct battery_priv *di) in rk818_bat_get_halt_cnt() argument
833 return rk818_bat_read(di, HALT_CNT_REG); in rk818_bat_get_halt_cnt()
836 static void rk818_bat_inc_halt_cnt(struct battery_priv *di) in rk818_bat_inc_halt_cnt() argument
840 cnt = rk818_bat_read(di, HALT_CNT_REG); in rk818_bat_inc_halt_cnt()
841 rk818_bat_write(di, HALT_CNT_REG, ++cnt); in rk818_bat_inc_halt_cnt()
844 static bool is_rk818_bat_last_halt(struct battery_priv *di) in is_rk818_bat_last_halt() argument
846 int pre_cap = rk818_bat_get_prev_cap(di); in is_rk818_bat_last_halt()
847 int now_cap = rk818_bat_get_coulomb_cap(di); in is_rk818_bat_last_halt()
850 if (abs(now_cap - pre_cap) > (di->fcc / 20)) { in is_rk818_bat_last_halt()
851 rk818_bat_inc_halt_cnt(di); in is_rk818_bat_last_halt()
858 static void rk818_bat_not_first_pwron(struct battery_priv *di) in rk818_bat_not_first_pwron() argument
863 di->fcc = rk818_bat_get_fcc(di); in rk818_bat_not_first_pwron()
864 pre_soc = rk818_bat_get_dsoc(di); in rk818_bat_not_first_pwron()
865 pre_cap = rk818_bat_get_prev_cap(di); in rk818_bat_not_first_pwron()
866 now_cap = rk818_bat_get_coulomb_cap(di); in rk818_bat_not_first_pwron()
867 voltage = rk818_bat_get_est_voltage(di); in rk818_bat_not_first_pwron()
868 di->pwr_dsoc = pre_soc; in rk818_bat_not_first_pwron()
869 di->pwr_rsoc = (now_cap + di->fcc / 200) * 100 / DIV(di->fcc); in rk818_bat_not_first_pwron()
870 di->is_halt = is_rk818_bat_last_halt(di); in rk818_bat_not_first_pwron()
871 di->halt_cnt = rk818_bat_get_halt_cnt(di); in rk818_bat_not_first_pwron()
872 di->is_ocv_calib = is_rk818_bat_ocv_valid(di); in rk818_bat_not_first_pwron()
874 if (di->is_halt) { in rk818_bat_not_first_pwron()
879 rk818_bat_init_capacity(di, now_cap); in rk818_bat_not_first_pwron()
880 pre_cap = di->remain_cap; in rk818_bat_not_first_pwron()
881 pre_soc = di->rsoc; in rk818_bat_not_first_pwron()
883 } else if (di->is_ocv_calib) { in rk818_bat_not_first_pwron()
884 ocv_vol = rk818_bat_get_ocv_voltage(di); in rk818_bat_not_first_pwron()
885 ocv_soc = rk818_bat_vol_to_soc(di, ocv_vol); in rk818_bat_not_first_pwron()
886 ocv_cap = rk818_bat_vol_to_cap(di, ocv_vol); in rk818_bat_not_first_pwron()
890 if (abs(ocv_soc - pre_soc) >= di->max_soc_offset) { in rk818_bat_not_first_pwron()
894 di->is_max_soc_offset = true; in rk818_bat_not_first_pwron()
900 rk818_bat_init_capacity(di, now_cap); in rk818_bat_not_first_pwron()
901 pre_cap = di->remain_cap; in rk818_bat_not_first_pwron()
902 pre_soc = di->rsoc; in rk818_bat_not_first_pwron()
906 di->dsoc = pre_soc; in rk818_bat_not_first_pwron()
907 di->nac = pre_cap; in rk818_bat_not_first_pwron()
908 rk818_bat_init_capacity(di, di->nac); in rk818_bat_not_first_pwron()
909 rk818_bat_save_dsoc(di, di->dsoc); in rk818_bat_not_first_pwron()
910 rk818_bat_set_initialized_state(di); in rk818_bat_not_first_pwron()
912 di->dsoc, di->rsoc, di->remain_cap, di->pwroff_min, in rk818_bat_not_first_pwron()
913 rk818_bat_get_avg_voltage(di), rk818_bat_get_ocv_voltage(di), in rk818_bat_not_first_pwron()
914 rk818_bat_get_avg_current(di), rk818_bat_get_dsoc(di), in rk818_bat_not_first_pwron()
915 rk818_bat_get_usb_state(di), di->fcc, DRIVER_VERSION in rk818_bat_not_first_pwron()
919 static bool is_rk818_bat_first_poweron(struct battery_priv *di) in is_rk818_bat_first_poweron() argument
923 buf = rk818_bat_read(di, GGSTS_REG); in is_rk818_bat_first_poweron()
926 rk818_bat_write(di, GGSTS_REG, buf); in is_rk818_bat_first_poweron()
933 static bool rk818_bat_ocv_sw_reset(struct battery_priv *di) in rk818_bat_ocv_sw_reset() argument
937 buf = rk818_bat_read(di, MISC_MARK_REG); in rk818_bat_ocv_sw_reset()
938 if (((buf & FG_RESET_LATE) && di->pwroff_min >= 30) || in rk818_bat_ocv_sw_reset()
942 rk818_bat_write(di, MISC_MARK_REG, buf); in rk818_bat_ocv_sw_reset()
950 static void rk818_bat_init_rsoc(struct battery_priv *di) in rk818_bat_init_rsoc() argument
959 charger = rk818_bat_get_usb_state(di); in rk818_bat_init_rsoc()
960 voltage = rk818_bat_get_est_voltage(di); in rk818_bat_init_rsoc()
961 di->is_first_power_on = is_rk818_bat_first_poweron(di); in rk818_bat_init_rsoc()
971 if (di->is_first_power_on) { in rk818_bat_init_rsoc()
973 } else if ((di->dsoc == 0) && (voltage >= ZERO_MIN_VOLTAGE)) { in rk818_bat_init_rsoc()
985 di->pwroff_min = rk818_bat_get_pwroff_min(di); in rk818_bat_init_rsoc()
986 di->is_sw_reset = rk818_bat_ocv_sw_reset(di); in rk818_bat_init_rsoc()
988 if (di->is_first_power_on || di->is_sw_reset) in rk818_bat_init_rsoc()
989 rk818_bat_first_pwron(di); in rk818_bat_init_rsoc()
991 rk818_bat_not_first_pwron(di); in rk818_bat_init_rsoc()
994 static int rk818_bat_calc_linek(struct battery_priv *di) in rk818_bat_calc_linek() argument
998 di->calc_dsoc = di->dsoc; in rk818_bat_calc_linek()
999 di->calc_rsoc = di->rsoc; in rk818_bat_calc_linek()
1000 di->sm_old_cap = di->remain_cap; in rk818_bat_calc_linek()
1002 delta = abs(di->dsoc - di->rsoc); in rk818_bat_calc_linek()
1004 di->sm_meet_soc = (di->dsoc >= di->rsoc) ? in rk818_bat_calc_linek()
1005 (di->dsoc + diff) : (di->rsoc + diff); in rk818_bat_calc_linek()
1007 if (di->dsoc < di->rsoc) in rk818_bat_calc_linek()
1009 else if (di->dsoc > di->rsoc) in rk818_bat_calc_linek()
1014 di->sm_chrg_dsoc = di->dsoc * 1000; in rk818_bat_calc_linek()
1017 __func__, di->sm_meet_soc, diff, linek, in rk818_bat_calc_linek()
1018 di->calc_dsoc, di->calc_rsoc); in rk818_bat_calc_linek()
1023 static void rk818_bat_init_ts1(struct battery_priv *di) in rk818_bat_init_ts1() argument
1026 u32 *ntc_table = di->ntc_table; in rk818_bat_init_ts1()
1028 if (!di->ntc_size) in rk818_bat_init_ts1()
1032 buf = rk818_bat_read(di, TS_CTRL_REG); in rk818_bat_init_ts1()
1036 di->ntc_factor = NTC_CALC_FACTOR_80UA; in rk818_bat_init_ts1()
1037 di->ntc_uA = 80; in rk818_bat_init_ts1()
1040 di->ntc_factor = NTC_CALC_FACTOR_60UA; in rk818_bat_init_ts1()
1041 di->ntc_uA = 60; in rk818_bat_init_ts1()
1044 di->ntc_factor = NTC_CALC_FACTOR_40UA; in rk818_bat_init_ts1()
1045 di->ntc_uA = 40; in rk818_bat_init_ts1()
1048 di->ntc_factor = NTC_CALC_FACTOR_20UA; in rk818_bat_init_ts1()
1049 di->ntc_uA = 20; in rk818_bat_init_ts1()
1052 rk818_bat_write(di, TS_CTRL_REG, buf); in rk818_bat_init_ts1()
1055 buf = rk818_bat_read(di, ADC_CTRL_REG); in rk818_bat_init_ts1()
1057 rk818_bat_write(di, ADC_CTRL_REG, buf); in rk818_bat_init_ts1()
1060 static void rk818_bat_init_ts2(struct battery_priv *di) in rk818_bat_init_ts2() argument
1064 if (!di->ts2_vol_multi) in rk818_bat_init_ts2()
1068 buf = rk818_bat_read(di, TS_CTRL_REG); in rk818_bat_init_ts2()
1070 rk818_bat_write(di, TS_CTRL_REG, buf); in rk818_bat_init_ts2()
1073 buf = rk818_bat_read(di, ADC_CTRL_REG); in rk818_bat_init_ts2()
1075 rk818_bat_write(di, ADC_CTRL_REG, buf); in rk818_bat_init_ts2()
1078 static int rk818_fg_init(struct battery_priv *di) in rk818_fg_init() argument
1082 rk818_bat_enable_gauge(di); in rk818_fg_init()
1083 rk818_bat_init_voltage_kb(di); in rk818_fg_init()
1084 rk818_bat_init_coffset(di); in rk818_fg_init()
1085 rk818_bat_init_ts1(di); in rk818_fg_init()
1086 rk818_bat_init_ts2(di); in rk818_fg_init()
1087 rk818_bat_clr_initialized_state(di); in rk818_fg_init()
1088 cap = rk818_bat_get_coulomb_cap(di); in rk818_fg_init()
1089 di->dsoc = rk818_bat_get_dsoc(di); in rk818_fg_init()
1090 di->rsoc = (cap + di->fcc / 200) * 100 / DIV(di->fcc); in rk818_fg_init()
1093 rk818_bat_init_rsoc(di); in rk818_fg_init()
1095 rk818_bat_init_chrg_config(di); in rk818_fg_init()
1096 di->voltage_avg = rk818_bat_get_avg_voltage(di); in rk818_fg_init()
1097 di->voltage_ocv = rk818_bat_get_ocv_voltage(di); in rk818_fg_init()
1098 di->current_avg = rk818_bat_get_avg_current(di); in rk818_fg_init()
1099 di->sm_linek = rk818_bat_calc_linek(di); in rk818_fg_init()
1100 di->finish_chrg_base = get_timer(0); in rk818_fg_init()
1101 di->term_sig_base = get_timer(0); in rk818_fg_init()
1102 di->pwr_vol = di->voltage_avg; in rk818_fg_init()
1105 __func__, di->dsoc, di->rsoc, di->voltage_avg, di->voltage_ocv, in rk818_fg_init()
1106 di->current_avg, rk818_bat_get_est_voltage(di)); in rk818_fg_init()
1111 static bool is_rk818_bat_exist(struct battery_priv *di) in is_rk818_bat_exist() argument
1113 return (rk818_bat_read(di, SUP_STS_REG) & BAT_EXS) ? true : false; in is_rk818_bat_exist()
1116 static void rk818_bat_set_current(struct battery_priv *di, int input_current) in rk818_bat_set_current() argument
1120 usb_ctrl = rk818_bat_read(di, USB_CTRL_REG); in rk818_bat_set_current()
1123 rk818_bat_write(di, USB_CTRL_REG, usb_ctrl); in rk818_bat_set_current()
1126 static int rk818_bat_get_ts2_voltage(struct battery_priv *di) in rk818_bat_get_ts2_voltage() argument
1130 val |= rk818_bat_read(di, RK818_TS2_ADC_REGL) << 0; in rk818_bat_get_ts2_voltage()
1131 val |= rk818_bat_read(di, RK818_TS2_ADC_REGH) << 8; in rk818_bat_get_ts2_voltage()
1134 val = val * 2200 * di->ts2_vol_multi / 4095; in rk818_bat_get_ts2_voltage()
1140 static void rk818_bat_ts2_update_current(struct battery_priv *di) in rk818_bat_ts2_update_current() argument
1144 rk818_bat_set_current(di, ILIM_450MA); in rk818_bat_ts2_update_current()
1146 while (input_current < di->chrg_cur_input) { in rk818_bat_ts2_update_current()
1148 ts2_vol = rk818_bat_get_ts2_voltage(di); in rk818_bat_ts2_update_current()
1159 input_current = di->chrg_cur_input; in rk818_bat_ts2_update_current()
1160 rk818_bat_set_current(di, input_current); in rk818_bat_ts2_update_current()
1168 rk818_bat_set_current(di, input_current); in rk818_bat_ts2_update_current()
1185 rk818_bat_set_current(di, input_current); in rk818_bat_ts2_update_current()
1194 static void rk818_bat_charger_setting(struct battery_priv *di, int charger) in rk818_bat_charger_setting() argument
1209 rk818_bat_set_current(di, ILIM_450MA); in rk818_bat_charger_setting()
1212 rk818_bat_set_current(di, ILIM_450MA); in rk818_bat_charger_setting()
1214 if (pdata->uboot_charge && di->ts2_vol_multi) { in rk818_bat_charger_setting()
1215 rk818_bat_ts2_update_current(di); in rk818_bat_charger_setting()
1216 } else if ((rk818_bat_get_est_voltage(di) < low_power_voltage) && in rk818_bat_charger_setting()
1217 (di->ts2_vol_multi)) { in rk818_bat_charger_setting()
1218 rk818_bat_ts2_update_current(di); in rk818_bat_charger_setting()
1220 rk818_bat_set_current(di, di->chrg_cur_input); in rk818_bat_charger_setting()
1231 static int rk818_bat_get_dc_state(struct battery_priv *di) in rk818_bat_get_dc_state() argument
1233 if (!di->dc_is_valid) in rk818_bat_get_dc_state()
1236 return dm_gpio_get_value(&di->dc_det) ? DC_CHARGER : NO_CHARGER; in rk818_bat_get_dc_state()
1239 static int rk818_bat_get_charger_type(struct battery_priv *di) in rk818_bat_get_charger_type() argument
1244 if ((rk818_bat_read(di, VB_MON_REG) & PLUG_IN_STS) == 0) in rk818_bat_get_charger_type()
1248 if (di->virtual_power) in rk818_bat_get_charger_type()
1252 charger_type = rk818_bat_get_dc_state(di); in rk818_bat_get_charger_type()
1257 return rk818_bat_get_usb_state(di); in rk818_bat_get_charger_type()
1260 static u8 rk818_bat_get_chrg_status(struct battery_priv *di) in rk818_bat_get_chrg_status() argument
1264 status = rk818_bat_read(di, SUP_STS_REG) & BAT_STATUS_MSK; in rk818_bat_get_chrg_status()
1303 static void rk818_bat_finish_chrg(struct battery_priv *di) in rk818_bat_finish_chrg() argument
1307 if (di->dsoc < 100) { in rk818_bat_finish_chrg()
1308 tgt_sec = di->fcc * 3600 / 100 / FINISH_CALI_CURR; in rk818_bat_finish_chrg()
1309 if (get_timer(di->finish_chrg_base) > SECONDS(tgt_sec)) { in rk818_bat_finish_chrg()
1310 di->finish_chrg_base = get_timer(0); in rk818_bat_finish_chrg()
1311 di->dsoc++; in rk818_bat_finish_chrg()
1315 get_timer(di->finish_chrg_base)); in rk818_bat_finish_chrg()
1318 static void rk818_bat_debug_info(struct battery_priv *di) in rk818_bat_debug_info() argument
1326 ggcon = rk818_bat_read(di, GGCON_REG); in rk818_bat_debug_info()
1327 ggsts = rk818_bat_read(di, GGSTS_REG); in rk818_bat_debug_info()
1328 sup_sts = rk818_bat_read(di, SUP_STS_REG); in rk818_bat_debug_info()
1329 usb_ctrl = rk818_bat_read(di, USB_CTRL_REG); in rk818_bat_debug_info()
1330 thermal = rk818_bat_read(di, THERMAL_REG); in rk818_bat_debug_info()
1331 vb_mod = rk818_bat_read(di, VB_MON_REG); in rk818_bat_debug_info()
1332 misc = rk818_bat_read(di, MISC_MARK_REG); in rk818_bat_debug_info()
1333 rtc = rk818_bat_read(di, SECONDS_REG); in rk818_bat_debug_info()
1334 chrg_ctrl1 = rk818_bat_read(di, CHRG_CTRL_REG1); in rk818_bat_debug_info()
1335 chrg_ctrl2 = rk818_bat_read(di, CHRG_CTRL_REG2); in rk818_bat_debug_info()
1336 chrg_ctrl3 = rk818_bat_read(di, CHRG_CTRL_REG3); in rk818_bat_debug_info()
1351 di->dsoc, rk818_bat_get_rsoc(di), rk818_bat_get_avg_voltage(di), in rk818_bat_debug_info()
1352 rk818_bat_get_avg_current(di), di->remain_cap, di->fcc, in rk818_bat_debug_info()
1353 di->rsoc - di->dsoc, in rk818_bat_debug_info()
1354 di->sm_linek, di->sm_old_cap, name[di->chrg_type], in rk818_bat_debug_info()
1355 di->res_div * CHRG_CUR_SEL[chrg_ctrl1 & 0x0f], in rk818_bat_debug_info()
1357 CHRG_VOL_SEL[(chrg_ctrl1 & 0x70) >> 4], di->pwroff_min, in rk818_bat_debug_info()
1358 di->sm_meet_soc, di->calc_dsoc, di->calc_rsoc, in rk818_bat_debug_info()
1359 rk818_bat_get_ocv_voltage(di), rk818_bat_get_ioffset(di), in rk818_bat_debug_info()
1360 rk818_bat_get_coffset(di), di->is_max_soc_offset, in rk818_bat_debug_info()
1361 di->is_ocv_calib, di->is_halt, di->halt_cnt, di->pwr_dsoc, in rk818_bat_debug_info()
1362 di->pwr_rsoc, di->pwr_vol, di->sample_res, in rk818_bat_debug_info()
1363 di->virtual_power ? "VIRTUAL" : "BAT", in rk818_bat_debug_info()
1364 di->temperature in rk818_bat_debug_info()
1366 rk818_bat_get_chrg_status(di); in rk818_bat_debug_info()
1370 static void rk818_bat_linek_algorithm(struct battery_priv *di) in rk818_bat_linek_algorithm() argument
1373 u8 chg_st = rk818_bat_get_chrg_status(di); in rk818_bat_linek_algorithm()
1376 if (di->dsoc == 99) in rk818_bat_linek_algorithm()
1377 di->sm_linek = CHRG_FULL_K; in rk818_bat_linek_algorithm()
1378 else if (di->dsoc >= CHRG_TERM_DSOC && di->current_avg > TERM_CALI_CURR) in rk818_bat_linek_algorithm()
1379 di->sm_linek = CHRG_TERM_K; in rk818_bat_linek_algorithm()
1381 delta_cap = di->remain_cap - di->sm_old_cap; in rk818_bat_linek_algorithm()
1382 ydsoc = di->sm_linek * delta_cap * 100 / DIV(di->fcc); in rk818_bat_linek_algorithm()
1384 tmp = (di->sm_chrg_dsoc + 1) / 1000; in rk818_bat_linek_algorithm()
1385 if (tmp != di->dsoc) in rk818_bat_linek_algorithm()
1386 di->sm_chrg_dsoc = di->dsoc * 1000; in rk818_bat_linek_algorithm()
1387 di->sm_chrg_dsoc += ydsoc; in rk818_bat_linek_algorithm()
1388 di->dsoc = (di->sm_chrg_dsoc + 1) / 1000; in rk818_bat_linek_algorithm()
1389 di->sm_old_cap = di->remain_cap; in rk818_bat_linek_algorithm()
1390 if (di->dsoc == di->rsoc && di->sm_linek != CHRG_FULL_K && in rk818_bat_linek_algorithm()
1391 di->sm_linek != CHRG_TERM_K) in rk818_bat_linek_algorithm()
1392 di->sm_linek = 1000; in rk818_bat_linek_algorithm()
1395 if ((di->sm_linek == 1000 || di->dsoc >= 100) && in rk818_bat_linek_algorithm()
1397 if (di->sm_linek == 1000) in rk818_bat_linek_algorithm()
1398 di->dsoc = di->rsoc; in rk818_bat_linek_algorithm()
1399 di->sm_chrg_dsoc = di->dsoc * 1000; in rk818_bat_linek_algorithm()
1404 di->sm_linek, di->sm_chrg_dsoc, delta_cap, ydsoc, di->sm_old_cap, in rk818_bat_linek_algorithm()
1405 di->calc_dsoc, di->calc_rsoc, di->sm_meet_soc); in rk818_bat_linek_algorithm()
1408 static void rk818_bat_set_term_mode(struct battery_priv *di, int mode) in rk818_bat_set_term_mode() argument
1412 buf = rk818_bat_read(di, CHRG_CTRL_REG3); in rk818_bat_set_term_mode()
1415 rk818_bat_write(di, CHRG_CTRL_REG3, buf); in rk818_bat_set_term_mode()
1420 static int rk818_bat_get_iadc(struct battery_priv *di) in rk818_bat_get_iadc() argument
1424 val |= rk818_bat_read(di, BAT_CUR_AVG_REGL) << 0; in rk818_bat_get_iadc()
1425 val |= rk818_bat_read(di, BAT_CUR_AVG_REGH) << 8; in rk818_bat_get_iadc()
1432 static bool rk818_bat_adc_calib(struct battery_priv *di) in rk818_bat_adc_calib() argument
1436 if (abs(di->current_avg) < ADC_CALIB_THRESHOLD) in rk818_bat_adc_calib()
1440 adc = rk818_bat_get_iadc(di); in rk818_bat_adc_calib()
1441 coffset = rk818_bat_get_coffset(di); in rk818_bat_adc_calib()
1442 rk818_bat_set_coffset(di, coffset + adc); in rk818_bat_adc_calib()
1444 adc = rk818_bat_get_iadc(di); in rk818_bat_adc_calib()
1446 coffset = rk818_bat_get_coffset(di); in rk818_bat_adc_calib()
1447 ioffset = rk818_bat_get_ioffset(di); in rk818_bat_adc_calib()
1448 di->poffset = coffset - ioffset; in rk818_bat_adc_calib()
1449 rk818_bat_write(di, POFFSET_REG, di->poffset); in rk818_bat_adc_calib()
1451 coffset, ioffset, di->poffset); in rk818_bat_adc_calib()
1455 rk818_bat_set_coffset(di, coffset); in rk818_bat_adc_calib()
1463 static void rk818_bat_smooth_charge(struct battery_priv *di) in rk818_bat_smooth_charge() argument
1465 u8 chg_st = rk818_bat_get_chrg_status(di); in rk818_bat_smooth_charge()
1468 if (di->term_sig_base && get_timer(di->term_sig_base) > SECONDS(1)) { in rk818_bat_smooth_charge()
1470 rk818_bat_set_term_mode(di, CHRG_TERM_DIG_SIGNAL); in rk818_bat_smooth_charge()
1471 di->term_sig_base = 0; in rk818_bat_smooth_charge()
1475 if ((di->chrg_type == NO_CHARGER) || in rk818_bat_smooth_charge()
1476 !rk818_bat_is_initialized(di)) { in rk818_bat_smooth_charge()
1477 DBG("chrg=%d, initialized=%d\n", di->chrg_type, in rk818_bat_smooth_charge()
1478 rk818_bat_is_initialized(di)); in rk818_bat_smooth_charge()
1483 di->remain_cap = rk818_bat_get_coulomb_cap(di); in rk818_bat_smooth_charge()
1484 di->rsoc = rk818_bat_get_rsoc(di); in rk818_bat_smooth_charge()
1485 if (di->remain_cap > di->fcc) { in rk818_bat_smooth_charge()
1486 di->sm_old_cap -= (di->remain_cap - di->fcc); in rk818_bat_smooth_charge()
1487 rk818_bat_init_capacity(di, di->fcc); in rk818_bat_smooth_charge()
1488 DBG("%s: init capacity: %d\n", __func__, di->fcc); in rk818_bat_smooth_charge()
1494 if (di->adc_allow_update) in rk818_bat_smooth_charge()
1495 di->adc_allow_update = !rk818_bat_adc_calib(di); in rk818_bat_smooth_charge()
1496 rk818_bat_finish_chrg(di); in rk818_bat_smooth_charge()
1497 rk818_bat_init_capacity(di, di->fcc); in rk818_bat_smooth_charge()
1500 di->adc_allow_update = true; in rk818_bat_smooth_charge()
1501 di->finish_chrg_base = get_timer(0); in rk818_bat_smooth_charge()
1502 rk818_bat_linek_algorithm(di); in rk818_bat_smooth_charge()
1506 if (di->dsoc > 100) in rk818_bat_smooth_charge()
1507 di->dsoc = 100; in rk818_bat_smooth_charge()
1508 else if (di->dsoc < 0) in rk818_bat_smooth_charge()
1509 di->dsoc = 0; in rk818_bat_smooth_charge()
1512 __func__, di->dsoc, rk818_bat_get_rsoc(di)); in rk818_bat_smooth_charge()
1514 rk818_bat_save_dsoc(di, di->dsoc); in rk818_bat_smooth_charge()
1515 rk818_bat_save_cap(di, di->remain_cap); in rk818_bat_smooth_charge()
1517 rk818_bat_debug_info(di); in rk818_bat_smooth_charge()
1537 static int rk818_bat_get_ntc_res(struct battery_priv *di) in rk818_bat_get_ntc_res() argument
1554 buf = rk818_bat_read(di, TS_CTRL_REG); in rk818_bat_get_ntc_res()
1559 ua1 = di->ntc_uA; in rk818_bat_get_ntc_res()
1560 adc1 |= rk818_bat_read(di, TS_ADC_REGL) << 0; in rk818_bat_get_ntc_res()
1561 adc1 |= rk818_bat_read(di, TS_ADC_REGH) << 8; in rk818_bat_get_ntc_res()
1565 buf = rk818_bat_read(di, TS_CTRL_REG); in rk818_bat_get_ntc_res()
1568 rk818_bat_write(di, TS_CTRL_REG, buf); in rk818_bat_get_ntc_res()
1583 buf = rk818_bat_read(di, TS_CTRL_REG); in rk818_bat_get_ntc_res()
1588 adc2 |= rk818_bat_read(di, TS_ADC_REGL) << 0; in rk818_bat_get_ntc_res()
1589 adc2 |= rk818_bat_read(di, TS_ADC_REGH) << 8; in rk818_bat_get_ntc_res()
1601 val = (di->current_avg >= 0) ? (adc1 - v_delta) : (adc1 + v_delta); in rk818_bat_get_ntc_res()
1604 __func__, di->current_avg, v_delta, val); in rk818_bat_get_ntc_res()
1606 res = val * di->ntc_factor; in rk818_bat_get_ntc_res()
1609 __func__, val, res, di->ntc_factor); in rk818_bat_get_ntc_res()
1612 di->ntc_degree_from, di->ntc_table[0], in rk818_bat_get_ntc_res()
1613 di->ntc_degree_from + di->ntc_size - 1, in rk818_bat_get_ntc_res()
1614 di->ntc_table[di->ntc_size - 1]); in rk818_bat_get_ntc_res()
1616 rk818_bat_init_ts1(di); in rk818_bat_get_ntc_res()
1621 static int rk818_bat_update_temperature(struct battery_priv *di) in rk818_bat_update_temperature() argument
1627 ntc_table = di->ntc_table; in rk818_bat_update_temperature()
1628 ntc_size = di->ntc_size; in rk818_bat_update_temperature()
1631 res = rk818_bat_get_ntc_res(di); in rk818_bat_update_temperature()
1633 di->temperature = old_temperature; in rk818_bat_update_temperature()
1638 di->temperature = di->ntc_degree_from; in rk818_bat_update_temperature()
1639 old_temperature = di->ntc_degree_from; in rk818_bat_update_temperature()
1642 di->temperature = di->ntc_degree_from + di->ntc_size - 1; in rk818_bat_update_temperature()
1643 old_temperature = di->ntc_degree_from + di->ntc_size - 1; in rk818_bat_update_temperature()
1652 temp = (i + di->ntc_degree_from); in rk818_bat_update_temperature()
1654 di->temperature = temp; in rk818_bat_update_temperature()
1660 di->temperature = temp; in rk818_bat_update_temperature()
1664 DBG("temperature=%d\n", di->temperature); in rk818_bat_update_temperature()
1671 struct battery_priv *di = dev_get_priv(dev); in rk818_bat_bat_is_exit() local
1673 return is_rk818_bat_exist(di); in rk818_bat_bat_is_exit()
1678 struct battery_priv *di = dev_get_priv(dev); in rk818_bat_update_get_soc() local
1683 di->chrg_type = in rk818_bat_update_get_soc()
1684 rk818_bat_get_charger_type(di); in rk818_bat_update_get_soc()
1685 rk818_bat_charger_setting(di, di->chrg_type); in rk818_bat_update_get_soc()
1696 wait = rk818_bat_update_temperature(di); in rk818_bat_update_get_soc()
1704 rk818_bat_smooth_charge(di); in rk818_bat_update_get_soc()
1708 if (!di->virtual_power && di->voltage_k) in rk818_bat_update_get_soc()
1709 return di->dsoc; in rk818_bat_update_get_soc()
1716 struct battery_priv *di = dev_get_priv(dev); in rk818_bat_update_get_current() local
1718 if (!di->virtual_power && di->voltage_k) in rk818_bat_update_get_current()
1719 return rk818_bat_get_avg_current(di); in rk818_bat_update_get_current()
1726 struct battery_priv *di = dev_get_priv(dev); in rk818_bat_update_get_voltage() local
1728 if (!di->virtual_power && di->voltage_k) in rk818_bat_update_get_voltage()
1729 return rk818_bat_get_est_voltage(di); in rk818_bat_update_get_voltage()
1736 struct battery_priv *di = dev_get_priv(dev); in rk818_bat_update_get_chrg_online() local
1738 return rk818_bat_get_charger_type(di); in rk818_bat_update_get_chrg_online()
1752 struct battery_priv *di = dev_get_priv(dev); in rk818_fg_ofdata_to_platdata() local
1762 di->dev = dev; in rk818_fg_ofdata_to_platdata()
1772 di->ocv_table = calloc(len, 1); in rk818_fg_ofdata_to_platdata()
1773 if (!di->ocv_table) { in rk818_fg_ofdata_to_platdata()
1778 di->ocv_size = len / 4; in rk818_fg_ofdata_to_platdata()
1780 di->ocv_table, di->ocv_size)) { in rk818_fg_ofdata_to_platdata()
1782 free(di->ocv_table); in rk818_fg_ofdata_to_platdata()
1787 di->design_cap = dev_read_u32_default(dev, "design_capacity", -1); in rk818_fg_ofdata_to_platdata()
1788 if (di->design_cap < 0) { in rk818_fg_ofdata_to_platdata()
1793 di->qmax = dev_read_u32_default(dev, "design_qmax", -1); in rk818_fg_ofdata_to_platdata()
1794 if (di->qmax < 0) { in rk818_fg_ofdata_to_platdata()
1800 di->dts_vol_sel = dev_read_u32_default(dev, "max_chrg_voltage", 4200); in rk818_fg_ofdata_to_platdata()
1801 if (di->dts_vol_sel < 0) in rk818_fg_ofdata_to_platdata()
1802 di->dts_vol_sel = dev_read_u32_default(dev, in rk818_fg_ofdata_to_platdata()
1805 di->dts_cur_input = dev_read_u32_default(dev, "max_input_current", 2000); in rk818_fg_ofdata_to_platdata()
1806 if (di->dts_cur_input < 0) in rk818_fg_ofdata_to_platdata()
1807 di->dts_cur_input = dev_read_u32_default(dev, in rk818_fg_ofdata_to_platdata()
1810 di->dts_cur_sel = dev_read_u32_default(dev, "max_chrg_current", 1200); in rk818_fg_ofdata_to_platdata()
1811 if (di->dts_cur_sel < 0) in rk818_fg_ofdata_to_platdata()
1812 di->dts_cur_sel = dev_read_u32_default(dev, in rk818_fg_ofdata_to_platdata()
1815 di->max_soc_offset = dev_read_u32_default(dev, "max_soc_offset", 70); in rk818_fg_ofdata_to_platdata()
1816 di->virtual_power = dev_read_u32_default(dev, "virtual_power", 0); in rk818_fg_ofdata_to_platdata()
1817 di->bat_res = dev_read_u32_default(dev, "bat_res", 135); in rk818_fg_ofdata_to_platdata()
1818 di->sample_res = dev_read_u32_default(dev, "sample_res", SAMPLE_RES_20mR); in rk818_fg_ofdata_to_platdata()
1819 di->ts2_vol_multi = dev_read_u32_default(dev, "ts2_vol_multi", 0); in rk818_fg_ofdata_to_platdata()
1821 di->res_div = (di->sample_res == SAMPLE_RES_20mR) ? in rk818_fg_ofdata_to_platdata()
1825 0, &di->dc_det, GPIOD_IS_IN); in rk818_fg_ofdata_to_platdata()
1827 di->dc_is_valid = 1; in rk818_fg_ofdata_to_platdata()
1835 di->ntc_size = 0; in rk818_fg_ofdata_to_platdata()
1845 di->ntc_degree_from = degree_from[1]; in rk818_fg_ofdata_to_platdata()
1847 di->ntc_degree_from = -di->ntc_degree_from; in rk818_fg_ofdata_to_platdata()
1849 di->ntc_size = len / sizeof(u32); in rk818_fg_ofdata_to_platdata()
1852 if (di->ntc_size) { in rk818_fg_ofdata_to_platdata()
1853 di->ntc_table = calloc(len, 1); in rk818_fg_ofdata_to_platdata()
1854 if (!di->ntc_table) { in rk818_fg_ofdata_to_platdata()
1860 di->ntc_table, di->ntc_size); in rk818_fg_ofdata_to_platdata()
1868 if (!is_rk818_bat_exist(di)) in rk818_fg_ofdata_to_platdata()
1869 di->virtual_power = 1; in rk818_fg_ofdata_to_platdata()
1872 DBG("max_input_current:%d\n", di->dts_cur_input); in rk818_fg_ofdata_to_platdata()
1873 DBG("max_chrg_current:%d\n", di->dts_cur_sel); in rk818_fg_ofdata_to_platdata()
1874 DBG("max_chrg_voltage:%d\n", di->dts_vol_sel); in rk818_fg_ofdata_to_platdata()
1875 DBG("design_capacity :%d\n", di->design_cap); in rk818_fg_ofdata_to_platdata()
1876 DBG("design_qmax:%d\n", di->qmax); in rk818_fg_ofdata_to_platdata()
1877 DBG("max_soc_offset:%d\n", di->max_soc_offset); in rk818_fg_ofdata_to_platdata()
1878 DBG("sample_res:%d\n", di->sample_res); in rk818_fg_ofdata_to_platdata()
1879 DBG("virtual_power:%d\n", di->virtual_power); in rk818_fg_ofdata_to_platdata()
1880 DBG("ts2_vol_multi:%d\n", di->ts2_vol_multi); in rk818_fg_ofdata_to_platdata()
1881 DBG("dc det: %d\n", di->dc_is_valid); in rk818_fg_ofdata_to_platdata()
1882 DBG("ntc_size:%d\n", di->ntc_size); in rk818_fg_ofdata_to_platdata()
1883 DBG("ntc_degree_from:%d\n", di->ntc_degree_from); in rk818_fg_ofdata_to_platdata()
1884 DBG("ntc_degree_to:%d\n", di->ntc_degree_from + di->ntc_size - 1); in rk818_fg_ofdata_to_platdata()
1892 struct battery_priv *di = dev_get_priv(dev); in rk818_fg_probe() local
1899 return rk818_fg_init(di); in rk818_fg_probe()