Lines Matching full:battery
308 static int rk817_bat_read(struct rk817_battery_device *battery, u8 reg) in rk817_bat_read() argument
310 return pmic_reg_read(battery->dev->parent, reg); in rk817_bat_read()
313 static void rk817_bat_write(struct rk817_battery_device *battery, in rk817_bat_write() argument
316 pmic_reg_write(battery->dev->parent, reg, buf); in rk817_bat_write()
319 static int rk817_bat_get_vaclib0(struct rk817_battery_device *battery) in rk817_bat_get_vaclib0() argument
323 vcalib_value |= rk817_bat_read(battery, VCALIB0_H) << 8; in rk817_bat_get_vaclib0()
324 vcalib_value |= rk817_bat_read(battery, VCALIB0_L); in rk817_bat_get_vaclib0()
329 static int rk817_bat_get_vaclib1(struct rk817_battery_device *battery) in rk817_bat_get_vaclib1() argument
333 vcalib_value |= rk817_bat_read(battery, VCALIB1_H) << 8; in rk817_bat_get_vaclib1()
334 vcalib_value |= rk817_bat_read(battery, VCALIB1_L); in rk817_bat_get_vaclib1()
339 static void rk817_bat_init_voltage_kb(struct rk817_battery_device *battery) in rk817_bat_init_voltage_kb() argument
343 vcalib0 = rk817_bat_get_vaclib0(battery); in rk817_bat_init_voltage_kb()
344 vcalib1 = rk817_bat_get_vaclib1(battery); in rk817_bat_init_voltage_kb()
346 if (battery->variant == RK809_ID) { in rk817_bat_init_voltage_kb()
347 battery->voltage_k = (1050 - 600) * 1000 / DIV(vcalib1 - vcalib0); in rk817_bat_init_voltage_kb()
348 battery->voltage_b = 1050 - (battery->voltage_k * vcalib1) / 1000; in rk817_bat_init_voltage_kb()
350 battery->voltage_k = (4025 - 2300) * 1000 / DIV(vcalib1 - vcalib0); in rk817_bat_init_voltage_kb()
351 battery->voltage_b = 4025 - (battery->voltage_k * vcalib1) / 1000; in rk817_bat_init_voltage_kb()
355 /* power on battery voltage */
356 static int rk817_bat_get_pwron_voltage(struct rk817_battery_device *battery) in rk817_bat_get_pwron_voltage() argument
360 val = rk817_bat_read(battery, PWRON_VOL_H) << 8; in rk817_bat_get_pwron_voltage()
361 val |= rk817_bat_read(battery, PWRON_VOL_L); in rk817_bat_get_pwron_voltage()
362 vol = battery->voltage_k * val / 1000 + battery->voltage_b; in rk817_bat_get_pwron_voltage()
363 if (battery->variant == RK809_ID) { in rk817_bat_get_pwron_voltage()
364 vol_temp = (vol * battery->bat_res_up / battery->bat_res_down + vol); in rk817_bat_get_pwron_voltage()
371 static int rk817_bat_get_USB_voltage(struct rk817_battery_device *battery) in rk817_bat_get_USB_voltage() argument
375 val = rk817_bat_read(battery, USB_VOL_L) << 0; in rk817_bat_get_USB_voltage()
376 val |= rk817_bat_read(battery, USB_VOL_H) << 8; in rk817_bat_get_USB_voltage()
378 vol = (battery->voltage_k * val / 1000 + battery->voltage_b) * 60 / 46; in rk817_bat_get_USB_voltage()
379 if (battery->variant == RK809_ID) { in rk817_bat_get_USB_voltage()
380 vol_temp = vol * battery->bat_res_up / battery->bat_res_down + vol; in rk817_bat_get_USB_voltage()
387 static int rk817_bat_get_sys_voltage(struct rk817_battery_device *battery) in rk817_bat_get_sys_voltage() argument
391 val = rk817_bat_read(battery, SYS_VOL_H) << 8; in rk817_bat_get_sys_voltage()
392 val |= rk817_bat_read(battery, SYS_VOL_L) << 0; in rk817_bat_get_sys_voltage()
394 vol = (battery->voltage_k * val / 1000 + battery->voltage_b) * 60 / 46; in rk817_bat_get_sys_voltage()
395 if (battery->variant == RK809_ID) { in rk817_bat_get_sys_voltage()
396 vol_temp = vol * battery->bat_res_up / battery->bat_res_down + vol; in rk817_bat_get_sys_voltage()
403 static int rk817_bat_get_battery_voltage(struct rk817_battery_device *battery) in rk817_bat_get_battery_voltage() argument
407 val = rk817_bat_read(battery, BAT_VOL_H) << 8; in rk817_bat_get_battery_voltage()
408 val |= rk817_bat_read(battery, BAT_VOL_L) << 0; in rk817_bat_get_battery_voltage()
410 vol = battery->voltage_k * val / 1000 + battery->voltage_b; in rk817_bat_get_battery_voltage()
411 if (battery->variant == RK809_ID) { in rk817_bat_get_battery_voltage()
412 vol_temp = (vol * battery->bat_res_up / battery->bat_res_down + vol); in rk817_bat_get_battery_voltage()
418 static int rk817_bat_get_avg_current(struct rk817_battery_device *battery) in rk817_bat_get_avg_current() argument
422 val |= rk817_bat_read(battery, BAT_CUR); in rk817_bat_get_avg_current()
423 val |= rk817_bat_read(battery, BAT_CUR_H) << 8; in rk817_bat_get_avg_current()
428 cur = ADC_TO_CURRENT(val, battery->res_div); in rk817_bat_get_avg_current()
433 static int rk817_bat_get_pwron_current(struct rk817_battery_device *battery) in rk817_bat_get_pwron_current() argument
437 val |= rk817_bat_read(battery, PWRON_CUR_L); in rk817_bat_get_pwron_current()
438 val |= rk817_bat_read(battery, PWRON_CUR_H) << 8; in rk817_bat_get_pwron_current()
442 cur = ADC_TO_CURRENT(val, battery->res_div); in rk817_bat_get_pwron_current()
447 static void rk817_bat_calibration(struct rk817_battery_device *battery) in rk817_bat_calibration() argument
452 if (rk817_bat_read(battery, ADC_CONFIG1) & 0x80) { in rk817_bat_calibration()
453 ioffset_value = rk817_bat_read(battery, IOFFSET_H) << 8; in rk817_bat_calibration()
454 ioffset_value |= rk817_bat_read(battery, IOFFSET_L); in rk817_bat_calibration()
457 rk817_bat_write(battery, CAL_OFFSET_H, buf); in rk817_bat_calibration()
459 rk817_bat_write(battery, CAL_OFFSET_L, buf); in rk817_bat_calibration()
461 rk817_bat_init_voltage_kb(battery); in rk817_bat_calibration()
462 rk817_bat_write(battery, ADC_CONFIG1, 0x80); in rk817_bat_calibration()
466 static int rk817_bat_get_rsoc(struct rk817_battery_device *battery);
468 static void rk817_bat_init_coulomb_cap(struct rk817_battery_device *battery, in rk817_bat_init_coulomb_cap() argument
475 cap = CAPACITY_TO_ADC(capacity, battery->res_div); in rk817_bat_init_coulomb_cap()
479 rk817_bat_write(battery, Q_INIT_H3, buf); in rk817_bat_init_coulomb_cap()
481 rk817_bat_write(battery, Q_INIT_H2, buf); in rk817_bat_init_coulomb_cap()
483 rk817_bat_write(battery, Q_INIT_L1, buf); in rk817_bat_init_coulomb_cap()
485 rk817_bat_write(battery, Q_INIT_L0, buf); in rk817_bat_init_coulomb_cap()
487 val = rk817_bat_read(battery, Q_INIT_H3) << 24; in rk817_bat_init_coulomb_cap()
488 val |= rk817_bat_read(battery, Q_INIT_H2) << 16; in rk817_bat_init_coulomb_cap()
489 val |= rk817_bat_read(battery, Q_INIT_L1) << 8; in rk817_bat_init_coulomb_cap()
490 val |= rk817_bat_read(battery, Q_INIT_L0) << 0; in rk817_bat_init_coulomb_cap()
493 battery->rsoc = rk817_bat_get_rsoc(battery); in rk817_bat_init_coulomb_cap()
494 battery->remain_cap = capacity * 1000; in rk817_bat_init_coulomb_cap()
497 static bool rk817_bat_remain_cap_is_valid(struct rk817_battery_device *battery) in rk817_bat_remain_cap_is_valid() argument
499 return !(rk817_bat_read(battery, Q_PRES_H3) & CAP_INVALID); in rk817_bat_remain_cap_is_valid()
502 static u32 rk817_bat_get_capacity_uah(struct rk817_battery_device *battery) in rk817_bat_get_capacity_uah() argument
506 if (rk817_bat_remain_cap_is_valid(battery)) { in rk817_bat_get_capacity_uah()
507 val = rk817_bat_read(battery, Q_PRES_H3) << 24; in rk817_bat_get_capacity_uah()
508 val |= rk817_bat_read(battery, Q_PRES_H2) << 16; in rk817_bat_get_capacity_uah()
509 val |= rk817_bat_read(battery, Q_PRES_L1) << 8; in rk817_bat_get_capacity_uah()
510 val |= rk817_bat_read(battery, Q_PRES_L0) << 0; in rk817_bat_get_capacity_uah()
512 capacity = ADC_TO_CAPACITY_UAH(val, battery->res_div); in rk817_bat_get_capacity_uah()
518 static u32 rk817_bat_get_capacity_mah(struct rk817_battery_device *battery) in rk817_bat_get_capacity_mah() argument
522 if (rk817_bat_remain_cap_is_valid(battery)) { in rk817_bat_get_capacity_mah()
523 val = rk817_bat_read(battery, Q_PRES_H3) << 24; in rk817_bat_get_capacity_mah()
524 val |= rk817_bat_read(battery, Q_PRES_H2) << 16; in rk817_bat_get_capacity_mah()
525 val |= rk817_bat_read(battery, Q_PRES_L1) << 8; in rk817_bat_get_capacity_mah()
526 val |= rk817_bat_read(battery, Q_PRES_L0) << 0; in rk817_bat_get_capacity_mah()
527 capacity = ADC_TO_CAPACITY(val, battery->res_div); in rk817_bat_get_capacity_mah()
533 static void rk817_bat_save_cap(struct rk817_battery_device *battery, in rk817_bat_save_cap() argument
539 if (capacity >= battery->qmax) in rk817_bat_save_cap()
540 capacity = battery->qmax; in rk817_bat_save_cap()
548 rk817_bat_write(battery, REMAIN_CAP_REG2, buf); in rk817_bat_save_cap()
550 rk817_bat_write(battery, REMAIN_CAP_REG1, buf); in rk817_bat_save_cap()
552 rk817_bat_write(battery, REMAIN_CAP_REG0, buf); in rk817_bat_save_cap()
555 static int rk817_bat_get_rsoc(struct rk817_battery_device *battery) in rk817_bat_get_rsoc() argument
559 remain_cap = rk817_bat_get_capacity_uah(battery); in rk817_bat_get_rsoc()
561 return remain_cap * 100 / DIV(battery->fcc); in rk817_bat_get_rsoc()
564 static int rk817_bat_vol_to_soc(struct rk817_battery_device *battery, in rk817_bat_vol_to_soc() argument
570 ocv_table = battery->ocv_table; in rk817_bat_vol_to_soc()
571 ocv_size = battery->ocv_size; in rk817_bat_vol_to_soc()
578 static int rk817_bat_vol_to_cap(struct rk817_battery_device *battery, in rk817_bat_vol_to_cap() argument
584 ocv_table = battery->ocv_table; in rk817_bat_vol_to_cap()
585 ocv_size = battery->ocv_size; in rk817_bat_vol_to_cap()
587 capacity = ab_div_c(temp, battery->fcc, MAX_INTERPOLATE); in rk817_bat_vol_to_cap()
592 static void rk817_bat_save_dsoc(struct rk817_battery_device *battery, in rk817_bat_save_dsoc() argument
598 rk817_bat_write(battery, SOC_REG0, save_soc & 0xff); in rk817_bat_save_dsoc()
599 rk817_bat_write(battery, SOC_REG1, (save_soc >> 8) & 0xff); in rk817_bat_save_dsoc()
600 rk817_bat_write(battery, SOC_REG2, (save_soc >> 16) & 0xff); in rk817_bat_save_dsoc()
606 static int rk817_bat_get_prev_dsoc(struct rk817_battery_device *battery) in rk817_bat_get_prev_dsoc() argument
610 value = rk817_bat_read(battery, SOC_REG0); in rk817_bat_get_prev_dsoc()
611 value |= rk817_bat_read(battery, SOC_REG1) << 8; in rk817_bat_get_prev_dsoc()
612 value |= rk817_bat_read(battery, SOC_REG2) << 16; in rk817_bat_get_prev_dsoc()
617 static int rk817_bat_get_prev_cap(struct rk817_battery_device *battery) in rk817_bat_get_prev_cap() argument
621 val = rk817_bat_read(battery, REMAIN_CAP_REG2) << 16; in rk817_bat_get_prev_cap()
622 val |= rk817_bat_read(battery, REMAIN_CAP_REG1) << 8; in rk817_bat_get_prev_cap()
623 val |= rk817_bat_read(battery, REMAIN_CAP_REG0) << 0; in rk817_bat_get_prev_cap()
628 static void rk817_bat_gas_gaugle_enable(struct rk817_battery_device *battery) in rk817_bat_gas_gaugle_enable() argument
632 value = rk817_bat_read(battery, ADC_CONFIG0); in rk817_bat_gas_gaugle_enable()
633 rk817_bat_write(battery, ADC_CONFIG0, value | 0x80); in rk817_bat_gas_gaugle_enable()
636 static bool is_rk817_bat_first_pwron(struct rk817_battery_device *battery) in is_rk817_bat_first_pwron() argument
640 value = rk817_bat_read(battery, GG_STS); in is_rk817_bat_first_pwron()
643 rk817_bat_write(battery, GG_STS, value & (~BAT_CON)); in is_rk817_bat_first_pwron()
650 static int rk817_bat_get_off_count(struct rk817_battery_device *battery) in rk817_bat_get_off_count() argument
654 value = rk817_bat_read(battery, OFF_CNT); in rk817_bat_get_off_count()
655 rk817_bat_write(battery, OFF_CNT, 0x00); in rk817_bat_get_off_count()
660 static void rk817_bat_update_qmax(struct rk817_battery_device *battery, in rk817_bat_update_qmax() argument
666 cap_adc = CAPACITY_TO_ADC(capacity, battery->res_div); in rk817_bat_update_qmax()
668 rk817_bat_write(battery, Q_MAX_H3, buf); in rk817_bat_update_qmax()
670 rk817_bat_write(battery, Q_MAX_H2, buf); in rk817_bat_update_qmax()
672 rk817_bat_write(battery, Q_MAX_L1, buf); in rk817_bat_update_qmax()
674 rk817_bat_write(battery, Q_MAX_L0, buf); in rk817_bat_update_qmax()
676 battery->qmax = capacity; in rk817_bat_update_qmax()
679 static void rk817_bat_save_fcc(struct rk817_battery_device *battery, int fcc) in rk817_bat_save_fcc() argument
684 rk817_bat_write(battery, NEW_FCC_REG2, buf); in rk817_bat_save_fcc()
686 rk817_bat_write(battery, NEW_FCC_REG1, buf); in rk817_bat_save_fcc()
688 rk817_bat_write(battery, NEW_FCC_REG0, buf); in rk817_bat_save_fcc()
691 static void rk817_bat_first_pwron(struct rk817_battery_device *battery) in rk817_bat_first_pwron() argument
693 battery->rsoc = in rk817_bat_first_pwron()
694 rk817_bat_vol_to_soc(battery, in rk817_bat_first_pwron()
695 battery->pwron_voltage) * 1000;/* uAH */ in rk817_bat_first_pwron()
696 battery->dsoc = battery->rsoc; in rk817_bat_first_pwron()
697 battery->fcc = battery->design_cap; in rk817_bat_first_pwron()
699 battery->nac = rk817_bat_vol_to_cap(battery, in rk817_bat_first_pwron()
700 battery->pwron_voltage); in rk817_bat_first_pwron()
702 rk817_bat_update_qmax(battery, battery->qmax); in rk817_bat_first_pwron()
703 rk817_bat_save_fcc(battery, battery->fcc); in rk817_bat_first_pwron()
705 __func__, battery->rsoc, battery->dsoc, battery->fcc, battery->nac); in rk817_bat_first_pwron()
708 static int rk817_bat_get_fcc(struct rk817_battery_device *battery) in rk817_bat_get_fcc() argument
712 fcc = rk817_bat_read(battery, NEW_FCC_REG2) << 16; in rk817_bat_get_fcc()
713 fcc |= rk817_bat_read(battery, NEW_FCC_REG1) << 8; in rk817_bat_get_fcc()
714 fcc |= rk817_bat_read(battery, NEW_FCC_REG0) << 0; in rk817_bat_get_fcc()
718 fcc = battery->design_capacity; in rk817_bat_get_fcc()
719 rk817_bat_save_fcc(battery, fcc); in rk817_bat_get_fcc()
720 } else if (fcc > battery->qmax) { in rk817_bat_get_fcc()
722 fcc = battery->qmax; in rk817_bat_get_fcc()
723 rk817_bat_save_fcc(battery, fcc); in rk817_bat_get_fcc()
729 static void rk817_bat_inc_halt_cnt(struct rk817_battery_device *battery) in rk817_bat_inc_halt_cnt() argument
733 cnt = rk817_bat_read(battery, HALT_CNT_REG); in rk817_bat_inc_halt_cnt()
734 rk817_bat_write(battery, HALT_CNT_REG, ++cnt); in rk817_bat_inc_halt_cnt()
737 static bool is_rk817_bat_last_halt(struct rk817_battery_device *battery) in is_rk817_bat_last_halt() argument
739 int pre_cap = rk817_bat_get_prev_cap(battery); in is_rk817_bat_last_halt()
740 int now_cap = rk817_bat_get_capacity_mah(battery); in is_rk817_bat_last_halt()
742 battery->nac = rk817_bat_vol_to_cap(battery, in is_rk817_bat_last_halt()
743 battery->pwron_voltage); in is_rk817_bat_last_halt()
747 if (abs(now_cap - pre_cap) > (battery->fcc / 10)) { in is_rk817_bat_last_halt()
748 rk817_bat_inc_halt_cnt(battery); in is_rk817_bat_last_halt()
754 if (abs(battery->nac - pre_cap) > (battery->fcc / 5)) { in is_rk817_bat_last_halt()
755 rk817_bat_inc_halt_cnt(battery); in is_rk817_bat_last_halt()
763 static u8 rk817_bat_get_halt_cnt(struct rk817_battery_device *battery) in rk817_bat_get_halt_cnt() argument
765 return rk817_bat_read(battery, HALT_CNT_REG); in rk817_bat_get_halt_cnt()
768 static int rk817_bat_is_initialized(struct rk817_battery_device *battery) in rk817_bat_is_initialized() argument
770 u8 val = rk817_bat_read(battery, FG_INIT); in rk817_bat_is_initialized()
775 static void rk817_bat_set_initialized_flag(struct rk817_battery_device *battery) in rk817_bat_set_initialized_flag() argument
777 u8 val = rk817_bat_read(battery, FG_INIT); in rk817_bat_set_initialized_flag()
779 rk817_bat_write(battery, FG_INIT, val | (0x80)); in rk817_bat_set_initialized_flag()
782 static void rk817_bat_not_first_pwron(struct rk817_battery_device *battery) in rk817_bat_not_first_pwron() argument
786 battery->fcc = rk817_bat_get_fcc(battery); in rk817_bat_not_first_pwron()
787 pre_soc = rk817_bat_get_prev_dsoc(battery); in rk817_bat_not_first_pwron()
788 pre_cap = rk817_bat_get_prev_cap(battery); in rk817_bat_not_first_pwron()
790 now_cap = rk817_bat_get_capacity_mah(battery); in rk817_bat_not_first_pwron()
791 battery->halt_cnt = rk817_bat_get_halt_cnt(battery); in rk817_bat_not_first_pwron()
792 battery->nac = rk817_bat_vol_to_cap(battery, in rk817_bat_not_first_pwron()
793 battery->pwron_voltage); in rk817_bat_not_first_pwron()
794 battery->remain_cap = pre_cap * 1000; in rk817_bat_not_first_pwron()
795 battery->is_halt = is_rk817_bat_last_halt(battery); in rk817_bat_not_first_pwron()
800 if (now_cap >= battery->fcc) in rk817_bat_not_first_pwron()
801 now_cap = battery->fcc; in rk817_bat_not_first_pwron()
803 now_soc = now_cap * 1000 * 100 / battery->fcc; in rk817_bat_not_first_pwron()
805 pre_soc += (now_soc - pre_cap * 1000 * 100 / battery->fcc); in rk817_bat_not_first_pwron()
810 if (now_cap >= battery->fcc) in rk817_bat_not_first_pwron()
814 rk817_bat_init_coulomb_cap(battery, pre_cap); in rk817_bat_not_first_pwron()
815 rk817_bat_init_coulomb_cap(battery, pre_cap + 1); in rk817_bat_not_first_pwron()
816 rk817_bat_get_capacity_mah(battery); in rk817_bat_not_first_pwron()
818 battery->dsoc = pre_soc; in rk817_bat_not_first_pwron()
819 if (battery->dsoc > 100000) in rk817_bat_not_first_pwron()
820 battery->dsoc = 100000; in rk817_bat_not_first_pwron()
821 battery->nac = pre_cap; in rk817_bat_not_first_pwron()
822 if (battery->nac < 0) in rk817_bat_not_first_pwron()
823 battery->nac = 0; in rk817_bat_not_first_pwron()
826 battery->dsoc, battery->nac, rk817_bat_get_battery_voltage(battery), in rk817_bat_not_first_pwron()
827 rk817_bat_get_pwron_voltage(battery), in rk817_bat_not_first_pwron()
828 battery->pwroff_min, rk817_bat_get_prev_dsoc(battery), in rk817_bat_not_first_pwron()
829 rk817_bat_get_prev_cap(battery)); in rk817_bat_not_first_pwron()
832 static void rk817_bat_rsoc_init(struct rk817_battery_device *battery) in rk817_bat_rsoc_init() argument
836 battery->is_first_power_on = is_rk817_bat_first_pwron(battery); in rk817_bat_rsoc_init()
837 battery->pwroff_min = rk817_bat_get_off_count(battery); in rk817_bat_rsoc_init()
838 battery->pwron_voltage = rk817_bat_get_pwron_voltage(battery); in rk817_bat_rsoc_init()
840 value = rk817_bat_read(battery, DRV_VERSION); in rk817_bat_rsoc_init()
844 battery->drv_version &= 0x0f; in rk817_bat_rsoc_init()
845 DBG("reg read version:%d dts read version:%d\n", version, battery->drv_version); in rk817_bat_rsoc_init()
846 if (battery->drv_version != version) { in rk817_bat_rsoc_init()
847 battery->is_first_power_on = 1; in rk817_bat_rsoc_init()
849 value |= battery->drv_version; in rk817_bat_rsoc_init()
850 rk817_bat_write(battery, DRV_VERSION, value); in rk817_bat_rsoc_init()
853 DBG("battery = %d\n", rk817_bat_get_battery_voltage(battery)); in rk817_bat_rsoc_init()
855 __func__, battery->is_first_power_on, in rk817_bat_rsoc_init()
856 battery->pwroff_min, battery->pwron_voltage); in rk817_bat_rsoc_init()
858 if (battery->is_first_power_on) in rk817_bat_rsoc_init()
859 rk817_bat_first_pwron(battery); in rk817_bat_rsoc_init()
861 rk817_bat_not_first_pwron(battery); in rk817_bat_rsoc_init()
863 rk817_bat_save_dsoc(battery, battery->dsoc); in rk817_bat_rsoc_init()
864 rk817_bat_save_cap(battery, battery->nac); in rk817_bat_rsoc_init()
867 static int rk817_bat_calc_linek(struct rk817_battery_device *battery) in rk817_bat_calc_linek() argument
871 battery->calc_dsoc = battery->dsoc; in rk817_bat_calc_linek()
872 battery->calc_rsoc = battery->rsoc; in rk817_bat_calc_linek()
873 battery->sm_old_cap = battery->remain_cap; in rk817_bat_calc_linek()
875 delta = abs(battery->dsoc - battery->rsoc); in rk817_bat_calc_linek()
877 battery->sm_meet_soc = (battery->dsoc >= battery->rsoc) ? in rk817_bat_calc_linek()
878 (battery->dsoc + diff) : (battery->rsoc + diff); in rk817_bat_calc_linek()
880 if (battery->dsoc < battery->rsoc) in rk817_bat_calc_linek()
882 else if (battery->dsoc > battery->rsoc) in rk817_bat_calc_linek()
887 battery->sm_chrg_dsoc = battery->dsoc; in rk817_bat_calc_linek()
890 __func__, battery->sm_meet_soc, diff, linek, in rk817_bat_calc_linek()
891 battery->calc_dsoc, battery->calc_rsoc); in rk817_bat_calc_linek()
896 static int rk817_bat_get_est_voltage(struct rk817_battery_device *battery) in rk817_bat_get_est_voltage() argument
898 return rk817_bat_get_battery_voltage(battery); in rk817_bat_get_est_voltage()
903 struct rk817_battery_device *battery = dev_get_priv(dev); in rk817_bat_update_get_voltage() local
905 if (!battery->virtual_power && battery->voltage_k) in rk817_bat_update_get_voltage()
906 return rk817_bat_get_est_voltage(battery); in rk817_bat_update_get_voltage()
913 struct rk817_battery_device *battery = dev_get_priv(dev); in rk817_bat_update_get_current() local
915 if (!battery->virtual_power && battery->voltage_k) in rk817_bat_update_get_current()
916 return rk817_bat_get_avg_current(battery); in rk817_bat_update_get_current()
921 static int rk817_bat_dwc_otg_check_dpdm(struct rk817_battery_device *battery) in rk817_bat_dwc_otg_check_dpdm() argument
923 if (battery->variant == RK809_ID) { in rk817_bat_dwc_otg_check_dpdm()
924 if (rk817_bat_read(battery, PMIC_SYS_STS) & PLUG_IN_STS) in rk817_bat_dwc_otg_check_dpdm()
935 struct rk817_battery_device *battery = dev_get_priv(dev); in rk817_bat_update_get_chrg_online() local
937 return rk817_bat_dwc_otg_check_dpdm(battery); in rk817_bat_update_get_chrg_online()
940 static int rk817_bat_get_usb_state(struct rk817_battery_device *battery) in rk817_bat_get_usb_state() argument
944 switch (rk817_bat_dwc_otg_check_dpdm(battery)) { in rk817_bat_get_usb_state()
946 if ((rk817_bat_read(battery, PMIC_SYS_STS) & PLUG_IN_STS) != 0) in rk817_bat_get_usb_state()
966 static int rk817_bat_get_charger_type(struct rk817_battery_device *battery) in rk817_bat_get_charger_type() argument
968 struct rk8xx_priv *rk8xx = dev_get_priv(battery->dev->parent); in rk817_bat_get_charger_type()
973 if ((rk817_bat_read(battery, PMIC_SYS_STS) & PLUG_IN_STS) == 0) in rk817_bat_get_charger_type()
977 if (battery->virtual_power) in rk817_bat_get_charger_type()
981 chrg_type = rk817_bat_get_usb_state(battery); in rk817_bat_get_charger_type()
982 if (chrg_type != NO_CHARGER && (battery->rsoc + 500) / 1000 >= 100) in rk817_bat_get_charger_type()
986 val = rk817_bat_read(battery, PMIC_CHRG_STS); in rk817_bat_get_charger_type()
994 static void rk817_bat_set_input_current(struct rk817_battery_device *battery, in rk817_bat_set_input_current() argument
999 usb_ctrl = rk817_bat_read(battery, USB_CTRL_REG); in rk817_bat_set_input_current()
1002 rk817_bat_write(battery, USB_CTRL_REG, usb_ctrl); in rk817_bat_set_input_current()
1005 static void rk817_bat_set_input_voltage(struct rk817_battery_device *battery, in rk817_bat_set_input_voltage() argument
1010 usb_ctrl = rk817_bat_read(battery, USB_CTRL_REG); in rk817_bat_set_input_voltage()
1013 rk817_bat_write(battery, USB_CTRL_REG, usb_ctrl); in rk817_bat_set_input_voltage()
1016 static void rk817_bat_charger_setting(struct rk817_battery_device *battery, in rk817_bat_charger_setting() argument
1021 rk817_bat_set_input_voltage(battery, VLIM_4500MV); in rk817_bat_charger_setting()
1026 rk817_bat_set_input_current(battery, ILIM_450MA); in rk817_bat_charger_setting()
1029 rk817_bat_set_input_current(battery, ILIM_450MA); in rk817_bat_charger_setting()
1032 rk817_bat_set_input_current(battery, ILIM_1500MA); in rk817_bat_charger_setting()
1041 static void rk817_bat_linek_algorithm(struct rk817_battery_device *battery) in rk817_bat_linek_algorithm() argument
1044 u8 chg_st = rk817_bat_get_charger_type(battery); in rk817_bat_linek_algorithm()
1047 if (battery->dsoc / 1000 == 99) in rk817_bat_linek_algorithm()
1048 battery->sm_linek = CHRG_FULL_K; in rk817_bat_linek_algorithm()
1049 else if (battery->dsoc / 1000 >= CHRG_TERM_DSOC && in rk817_bat_linek_algorithm()
1050 battery->current_avg > TERM_CALI_CURR) in rk817_bat_linek_algorithm()
1051 battery->sm_linek = CHRG_TERM_K; in rk817_bat_linek_algorithm()
1053 delta_cap = battery->remain_cap - battery->sm_old_cap; in rk817_bat_linek_algorithm()
1054 ydsoc = battery->sm_linek * (delta_cap / DIV(battery->fcc)) / 10; in rk817_bat_linek_algorithm()
1055 battery->sm_chrg_dsoc += ydsoc; in rk817_bat_linek_algorithm()
1057 tmp = battery->sm_chrg_dsoc / 1000; in rk817_bat_linek_algorithm()
1060 if (battery->sm_chrg_dsoc < 0) in rk817_bat_linek_algorithm()
1061 battery->sm_chrg_dsoc = 0; in rk817_bat_linek_algorithm()
1063 tmp = battery->sm_chrg_dsoc / 1000; in rk817_bat_linek_algorithm()
1065 if (tmp != battery->dsoc / 1000) { in rk817_bat_linek_algorithm()
1066 if (battery->sm_chrg_dsoc < battery->dsoc) in rk817_bat_linek_algorithm()
1069 battery->dsoc = battery->sm_chrg_dsoc; in rk817_bat_linek_algorithm()
1070 if (battery->dsoc <= 0) in rk817_bat_linek_algorithm()
1071 battery->dsoc = 0; in rk817_bat_linek_algorithm()
1074 battery->sm_old_cap = battery->remain_cap; in rk817_bat_linek_algorithm()
1075 if (battery->dsoc / 1000 == battery->rsoc / 1000 && in rk817_bat_linek_algorithm()
1076 battery->sm_linek != CHRG_FULL_K && in rk817_bat_linek_algorithm()
1077 battery->sm_linek != CHRG_TERM_K) in rk817_bat_linek_algorithm()
1078 battery->sm_linek = 1000; in rk817_bat_linek_algorithm()
1081 if ((battery->sm_linek == 1000 || battery->dsoc >= 100 * 1000) && in rk817_bat_linek_algorithm()
1083 if (battery->sm_linek == 1000) in rk817_bat_linek_algorithm()
1084 battery->dsoc = battery->rsoc; in rk817_bat_linek_algorithm()
1085 battery->sm_chrg_dsoc = battery->dsoc; in rk817_bat_linek_algorithm()
1089 static void rk817_bat_finish_chrg(struct rk817_battery_device *battery) in rk817_bat_finish_chrg() argument
1093 if (battery->dsoc / 1000 < 100) { in rk817_bat_finish_chrg()
1094 tgt_sec = battery->fcc * 3600 / 100 / FINISH_CALI_CURR; in rk817_bat_finish_chrg()
1095 if (get_timer(battery->finish_chrg_base) > SECONDS(tgt_sec)) { in rk817_bat_finish_chrg()
1096 battery->finish_chrg_base = get_timer(0); in rk817_bat_finish_chrg()
1097 battery->dsoc += 1000; in rk817_bat_finish_chrg()
1102 static void rk817_bat_debug_info(struct rk817_battery_device *battery) in rk817_bat_debug_info() argument
1105 DBG("CAL_OFFSET = 0x%x", rk817_bat_read(battery, CAL_OFFSET_H)); in rk817_bat_debug_info()
1106 DBG("%x\n", rk817_bat_read(battery, CAL_OFFSET_L)); in rk817_bat_debug_info()
1107 DBG("current_avg = %d\n", rk817_bat_get_avg_current(battery)); in rk817_bat_debug_info()
1108 DBG("k = %d, b = %d\n", battery->voltage_k, battery->voltage_b); in rk817_bat_debug_info()
1109 DBG("battery: %d\n", rk817_bat_get_battery_voltage(battery)); in rk817_bat_debug_info()
1110 DBG("voltage_sys = %d\n", rk817_bat_get_sys_voltage(battery)); in rk817_bat_debug_info()
1111 DBG("voltage_usb = %d\n", rk817_bat_get_USB_voltage(battery)); in rk817_bat_debug_info()
1112 DBG("current_avg = %d\n", rk817_bat_get_avg_current(battery)); in rk817_bat_debug_info()
1113 DBG("dsoc = %d\n", battery->dsoc); in rk817_bat_debug_info()
1114 DBG("rsoc = %d\n", rk817_bat_get_rsoc(battery)); in rk817_bat_debug_info()
1115 DBG("remain_cap = %d\n", rk817_bat_get_capacity_uah(battery)); in rk817_bat_debug_info()
1116 DBG("fcc = %d\n", battery->fcc); in rk817_bat_debug_info()
1117 DBG("qmax = %d\n", battery->qmax); in rk817_bat_debug_info()
1120 static void rk817_bat_smooth_charge(struct rk817_battery_device *battery) in rk817_bat_smooth_charge() argument
1122 u8 chg_st = rk817_bat_get_charger_type(battery); in rk817_bat_smooth_charge()
1124 rk817_bat_debug_info(battery); in rk817_bat_smooth_charge()
1125 rk817_bat_calibration(battery); in rk817_bat_smooth_charge()
1127 if (battery->term_sig_base && in rk817_bat_smooth_charge()
1128 get_timer(battery->term_sig_base) > SECONDS(1)) in rk817_bat_smooth_charge()
1129 battery->term_sig_base = 0; in rk817_bat_smooth_charge()
1132 if ((battery->chrg_type == NO_CHARGER) || in rk817_bat_smooth_charge()
1133 !rk817_bat_is_initialized(battery)) { in rk817_bat_smooth_charge()
1134 DBG("chrg=%d\n", battery->chrg_type); in rk817_bat_smooth_charge()
1135 rk817_bat_set_initialized_flag(battery); in rk817_bat_smooth_charge()
1140 battery->remain_cap = rk817_bat_get_capacity_uah(battery); in rk817_bat_smooth_charge()
1141 battery->rsoc = rk817_bat_get_rsoc(battery); in rk817_bat_smooth_charge()
1142 if (battery->remain_cap / 1000 > battery->fcc) { in rk817_bat_smooth_charge()
1143 battery->sm_old_cap -= in rk817_bat_smooth_charge()
1144 (battery->remain_cap - battery->fcc * 1000); in rk817_bat_smooth_charge()
1145 rk817_bat_init_coulomb_cap(battery, battery->fcc + 100); in rk817_bat_smooth_charge()
1146 rk817_bat_init_coulomb_cap(battery, battery->fcc); in rk817_bat_smooth_charge()
1151 rk817_bat_finish_chrg(battery); in rk817_bat_smooth_charge()
1152 rk817_bat_init_coulomb_cap(battery, battery->fcc + 100); in rk817_bat_smooth_charge()
1153 rk817_bat_init_coulomb_cap(battery, battery->fcc); in rk817_bat_smooth_charge()
1156 battery->adc_allow_update = true; in rk817_bat_smooth_charge()
1157 battery->finish_chrg_base = get_timer(0); in rk817_bat_smooth_charge()
1158 rk817_bat_linek_algorithm(battery); in rk817_bat_smooth_charge()
1162 if (battery->dsoc / 1000 > 100) in rk817_bat_smooth_charge()
1163 battery->dsoc = 100 * 1000; in rk817_bat_smooth_charge()
1164 else if (battery->dsoc < 0) in rk817_bat_smooth_charge()
1165 battery->dsoc = 0; in rk817_bat_smooth_charge()
1167 rk817_bat_save_dsoc(battery, battery->dsoc); in rk817_bat_smooth_charge()
1168 rk817_bat_save_cap(battery, battery->remain_cap / 1000); in rk817_bat_smooth_charge()
1175 struct rk817_battery_device *battery = dev_get_priv(dev); in rk817_bat_update_get_soc() local
1178 rk817_bat_debug_info(battery); in rk817_bat_update_get_soc()
1180 battery->chrg_type = in rk817_bat_update_get_soc()
1181 rk817_bat_get_charger_type(battery); in rk817_bat_update_get_soc()
1182 rk817_bat_charger_setting(battery, battery->chrg_type); in rk817_bat_update_get_soc()
1189 rk817_bat_smooth_charge(battery); in rk817_bat_update_get_soc()
1193 if (!battery->virtual_power && battery->voltage_k) in rk817_bat_update_get_soc()
1194 return battery->dsoc / 1000; in rk817_bat_update_get_soc()
1199 static int rk817_is_bat_exist(struct rk817_battery_device *battery) in rk817_is_bat_exist() argument
1201 struct rk8xx_priv *rk8xx = dev_get_priv(battery->dev->parent); in rk817_is_bat_exist()
1204 return (rk817_bat_read(battery, PMIC_CHRG_STS) & 0x80) ? 1 : 0; in rk817_is_bat_exist()
1211 struct rk817_battery_device *battery = dev_get_priv(dev); in rk817_bat_bat_is_exist() local
1213 return rk817_is_bat_exist(battery); in rk817_bat_bat_is_exist()
1228 struct rk817_battery_device *battery = dev_get_priv(dev); in rk817_fg_ofdata_to_platdata() local
1239 battery->dev = dev; in rk817_fg_ofdata_to_platdata()
1240 battery->variant = rk8xx->variant; in rk817_fg_ofdata_to_platdata()
1248 battery->ocv_table = calloc(len, 1); in rk817_fg_ofdata_to_platdata()
1249 if (!battery->ocv_table) { in rk817_fg_ofdata_to_platdata()
1254 battery->ocv_size = len / 4; in rk817_fg_ofdata_to_platdata()
1256 battery->ocv_table, battery->ocv_size)) { in rk817_fg_ofdata_to_platdata()
1258 free(battery->ocv_table); in rk817_fg_ofdata_to_platdata()
1263 battery->design_cap = dev_read_u32_default(dev, "design_capacity", -1); in rk817_fg_ofdata_to_platdata()
1264 if (battery->design_cap < 0) { in rk817_fg_ofdata_to_platdata()
1269 battery->qmax = dev_read_u32_default(dev, "design_qmax", -1); in rk817_fg_ofdata_to_platdata()
1270 if (battery->qmax < 0) { in rk817_fg_ofdata_to_platdata()
1275 battery->virtual_power = dev_read_u32_default(dev, "virtual_power", 0); in rk817_fg_ofdata_to_platdata()
1276 if (!rk817_is_bat_exist(battery)) in rk817_fg_ofdata_to_platdata()
1277 battery->virtual_power = 1; in rk817_fg_ofdata_to_platdata()
1280 battery->bat_res_up = dev_read_u32_default(dev, "bat_res_up", -1); in rk817_fg_ofdata_to_platdata()
1281 if (battery->bat_res_up < 0) { in rk817_fg_ofdata_to_platdata()
1286 battery->bat_res_down = dev_read_u32_default(dev, "bat_res_down", -1); in rk817_fg_ofdata_to_platdata()
1287 if (battery->bat_res_down < 0) { in rk817_fg_ofdata_to_platdata()
1293 battery->drv_version = dev_read_u32_default(dev, "drv_version", -1); in rk817_fg_ofdata_to_platdata()
1294 if (battery->drv_version < 0) in rk817_fg_ofdata_to_platdata()
1295 battery->drv_version = 0; in rk817_fg_ofdata_to_platdata()
1298 if (battery->res_div < 0) in rk817_fg_ofdata_to_platdata()
1301 battery->res_div = (value == SAMPLE_RES_20mR) ? in rk817_fg_ofdata_to_platdata()
1305 for (i = 0; i < battery->ocv_size; i++) in rk817_fg_ofdata_to_platdata()
1306 DBG("%d ", battery->ocv_table[i]); in rk817_fg_ofdata_to_platdata()
1307 DBG("ocvsize: %d\n", battery->ocv_size); in rk817_fg_ofdata_to_platdata()
1308 DBG("battery->design_cap: %d\n", battery->design_cap); in rk817_fg_ofdata_to_platdata()
1309 DBG("battery->qmax: %d\n", battery->qmax); in rk817_fg_ofdata_to_platdata()
1310 DBG("battery->bat_res_up: %d\n", battery->bat_res_up); in rk817_fg_ofdata_to_platdata()
1311 DBG("battery->bat_res_down: %d\n", battery->bat_res_down); in rk817_fg_ofdata_to_platdata()
1316 static int rk817_fg_init(struct rk817_battery_device *battery) in rk817_fg_init() argument
1320 value = rk817_bat_read(battery, GG_CON); in rk817_fg_init()
1321 rk817_bat_write(battery, GG_CON, value | VOL_OUPUT_INSTANT_MODE); in rk817_fg_init()
1322 if (battery->variant == RK817_ID) { in rk817_fg_init()
1323 value = rk817_bat_read(battery, BAT_DISCHRG); in rk817_fg_init()
1324 rk817_bat_write(battery, BAT_DISCHRG, value & (~DIS_ILIM_EN)); in rk817_fg_init()
1326 rk817_bat_gas_gaugle_enable(battery); in rk817_fg_init()
1327 rk817_bat_init_voltage_kb(battery); in rk817_fg_init()
1328 rk817_bat_calibration(battery); in rk817_fg_init()
1329 rk817_bat_rsoc_init(battery); in rk817_fg_init()
1330 rk817_bat_init_coulomb_cap(battery, battery->nac); in rk817_fg_init()
1331 rk817_bat_set_initialized_flag(battery); in rk817_fg_init()
1333 battery->voltage_avg = rk817_bat_get_battery_voltage(battery); in rk817_fg_init()
1334 battery->voltage_sys = rk817_bat_get_sys_voltage(battery); in rk817_fg_init()
1335 battery->voltage_usb = rk817_bat_get_USB_voltage(battery); in rk817_fg_init()
1336 battery->current_avg = rk817_bat_get_avg_current(battery); in rk817_fg_init()
1337 battery->current_pwron = rk817_bat_get_pwron_current(battery); in rk817_fg_init()
1338 battery->remain_cap = rk817_bat_get_capacity_uah(battery); in rk817_fg_init()
1339 battery->rsoc = rk817_bat_get_rsoc(battery); in rk817_fg_init()
1340 battery->sm_linek = rk817_bat_calc_linek(battery); in rk817_fg_init()
1341 battery->chrg_type = rk817_bat_get_charger_type(battery); in rk817_fg_init()
1342 battery->finish_chrg_base = get_timer(0); in rk817_fg_init()
1343 battery->term_sig_base = get_timer(0); in rk817_fg_init()
1345 battery->dbg_pwr_dsoc = battery->dsoc; in rk817_fg_init()
1346 battery->dbg_pwr_rsoc = battery->rsoc; in rk817_fg_init()
1347 battery->dbg_pwr_vol = battery->voltage_avg; in rk817_fg_init()
1349 if (battery->variant == RK817_ID) in rk817_fg_init()
1350 rk817_bat_charger_setting(battery, battery->chrg_type); in rk817_fg_init()
1353 battery->voltage_k, battery->voltage_b); in rk817_fg_init()
1354 DBG("voltage_sys = %d\n", battery->voltage_sys); in rk817_fg_init()
1355 DBG("voltage usb: %d\n", battery->voltage_avg); in rk817_fg_init()
1356 DBG("battery: %d\n", battery->voltage_avg); in rk817_fg_init()
1357 DBG("current_avg = %d\n", battery->current_avg); in rk817_fg_init()
1358 DBG("current_pwron = %d\n", battery->current_pwron); in rk817_fg_init()
1359 DBG("remain_cap = %d\n", battery->remain_cap); in rk817_fg_init()
1360 DBG("fcc = %d\n", battery->fcc); in rk817_fg_init()
1361 DBG("qmax = %d\n", battery->qmax); in rk817_fg_init()
1362 DBG("dsoc = %d\n", battery->dsoc); in rk817_fg_init()
1363 DBG("rsoc = %d\n", battery->rsoc); in rk817_fg_init()
1364 DBG("charge type: %d\n", battery->chrg_type); in rk817_fg_init()
1372 struct rk817_battery_device *battery = dev_get_priv(dev); in rk817_fg_probe() local
1379 return rk817_fg_init(battery); in rk817_fg_probe()