Lines Matching full:battery

2  * rk817 battery  driver
627 bool change; /* Battery status change, report information */
695 static int rk817_bat_field_read(struct rk817_battery_device *battery, in rk817_bat_field_read() argument
701 ret = regmap_field_read(battery->rmap_fields[field_id], &val); in rk817_bat_field_read()
708 static int rk817_bat_field_write(struct rk817_battery_device *battery, in rk817_bat_field_write() argument
712 return regmap_field_write(battery->rmap_fields[field_id], val); in rk817_bat_field_write()
716 static int rk817_bat_get_coffset(struct rk817_battery_device *battery) in rk817_bat_get_coffset() argument
720 coffset_value |= rk817_bat_field_read(battery, CAL_OFFSET_H) << 8; in rk817_bat_get_coffset()
721 coffset_value |= rk817_bat_field_read(battery, CAL_OFFSET_L); in rk817_bat_get_coffset()
726 static void rk817_bat_set_coffset(struct rk817_battery_device *battery, int val) in rk817_bat_set_coffset() argument
731 rk817_bat_field_write(battery, CAL_OFFSET_H, buf); in rk817_bat_set_coffset()
733 rk817_bat_field_write(battery, CAL_OFFSET_L, buf); in rk817_bat_set_coffset()
737 static int rk817_bat_get_ioffset(struct rk817_battery_device *battery) in rk817_bat_get_ioffset() argument
741 ioffset_value |= rk817_bat_field_read(battery, IOFFSET_H) << 8; in rk817_bat_get_ioffset()
742 ioffset_value |= rk817_bat_field_read(battery, IOFFSET_L); in rk817_bat_get_ioffset()
747 static void rk817_bat_current_calibration(struct rk817_battery_device *battery) in rk817_bat_current_calibration() argument
751 pwron_value = rk817_bat_field_read(battery, PWRON_CUR_H) << 8; in rk817_bat_current_calibration()
752 pwron_value |= rk817_bat_field_read(battery, PWRON_CUR_L); in rk817_bat_current_calibration()
754 ioffset = rk817_bat_get_ioffset(battery); in rk817_bat_current_calibration()
756 DBG("Caloffset: 0x%x\n", rk817_bat_get_coffset(battery)); in rk817_bat_current_calibration()
763 rk817_bat_set_coffset(battery, cal_offset); in rk817_bat_current_calibration()
764 DBG("Caloffset: 0x%x\n", rk817_bat_get_coffset(battery)); in rk817_bat_current_calibration()
768 static int rk817_bat_get_vaclib0(struct rk817_battery_device *battery) in rk817_bat_get_vaclib0() argument
772 vcalib_value |= rk817_bat_field_read(battery, VCALIB0_H) << 8; in rk817_bat_get_vaclib0()
773 vcalib_value |= rk817_bat_field_read(battery, VCALIB0_L); in rk817_bat_get_vaclib0()
778 static int rk817_bat_get_vaclib1(struct rk817_battery_device *battery) in rk817_bat_get_vaclib1() argument
782 vcalib_value |= rk817_bat_field_read(battery, VCALIB1_H) << 8; in rk817_bat_get_vaclib1()
783 vcalib_value |= rk817_bat_field_read(battery, VCALIB1_L); in rk817_bat_get_vaclib1()
788 static void rk817_bat_init_voltage_kb(struct rk817_battery_device *battery) in rk817_bat_init_voltage_kb() argument
792 vcalib0 = rk817_bat_get_vaclib0(battery); in rk817_bat_init_voltage_kb()
793 vcalib1 = rk817_bat_get_vaclib1(battery); in rk817_bat_init_voltage_kb()
794 if (battery->chip_id == RK809_ID) { in rk817_bat_init_voltage_kb()
795 battery->voltage_k = (1050 - 600) * 1000 / DIV(vcalib1 - vcalib0); in rk817_bat_init_voltage_kb()
796 battery->voltage_b = 1050 - (battery->voltage_k * vcalib1) / 1000; in rk817_bat_init_voltage_kb()
798 battery->voltage_k = (4025 - 2300) * 1000 / DIV(vcalib1 - vcalib0); in rk817_bat_init_voltage_kb()
799 battery->voltage_b = 4025 - (battery->voltage_k * vcalib1) / 1000; in rk817_bat_init_voltage_kb()
803 static void rk817_bat_restart_relax(struct rk817_battery_device *battery) in rk817_bat_restart_relax() argument
805 rk817_bat_field_write(battery, RELAX_VOL1_UPD, 0x00); in rk817_bat_restart_relax()
806 rk817_bat_field_write(battery, RELAX_VOL2_UPD, 0x00); in rk817_bat_restart_relax()
809 static bool is_rk817_bat_relax_mode(struct rk817_battery_device *battery) in is_rk817_bat_relax_mode() argument
813 relax_sts = rk817_bat_field_read(battery, RELAX_STS); in is_rk817_bat_relax_mode()
814 relax_vol1_upd = rk817_bat_field_read(battery, RELAX_VOL1_UPD); in is_rk817_bat_relax_mode()
815 relax_vol2_upd = rk817_bat_field_read(battery, RELAX_VOL2_UPD); in is_rk817_bat_relax_mode()
826 static u16 rk817_bat_get_relax_vol1(struct rk817_battery_device *battery) in rk817_bat_get_relax_vol1() argument
830 val = rk817_bat_field_read(battery, RELAX_VOL1_H) << 8; in rk817_bat_get_relax_vol1()
831 val |= rk817_bat_field_read(battery, RELAX_VOL1_L); in rk817_bat_get_relax_vol1()
832 vol = battery->voltage_k * val / 1000 + battery->voltage_b; in rk817_bat_get_relax_vol1()
837 static u16 rk817_bat_get_relax_vol2(struct rk817_battery_device *battery) in rk817_bat_get_relax_vol2() argument
841 val = rk817_bat_field_read(battery, RELAX_VOL2_H) << 8; in rk817_bat_get_relax_vol2()
842 val |= rk817_bat_field_read(battery, RELAX_VOL2_L); in rk817_bat_get_relax_vol2()
843 vol = battery->voltage_k * val / 1000 + battery->voltage_b; in rk817_bat_get_relax_vol2()
848 static u16 rk817_bat_get_relax_voltage(struct rk817_battery_device *battery) in rk817_bat_get_relax_voltage() argument
852 if (!is_rk817_bat_relax_mode(battery)) in rk817_bat_get_relax_voltage()
855 relax_vol1 = rk817_bat_get_relax_vol1(battery); in rk817_bat_get_relax_voltage()
856 relax_vol2 = rk817_bat_get_relax_vol2(battery); in rk817_bat_get_relax_voltage()
861 static void rk817_bat_set_relax_sample(struct rk817_battery_device *battery) in rk817_bat_set_relax_sample() argument
865 struct battery_platform_data *pdata = battery->pdata; in rk817_bat_set_relax_sample()
870 battery->res_div); in rk817_bat_set_relax_sample()
872 battery->res_div); in rk817_bat_set_relax_sample()
876 rk817_bat_field_write(battery, RELAX_THRE_H, buf); in rk817_bat_set_relax_sample()
878 rk817_bat_field_write(battery, RELAX_THRE_L, buf); in rk817_bat_set_relax_sample()
881 rk817_bat_field_write(battery, SLEEP_CON_SAMP_CUR_H, buf); in rk817_bat_set_relax_sample()
883 rk817_bat_field_write(battery, SLEEP_CON_SAMP_CUR_L, buf); in rk817_bat_set_relax_sample()
886 rk817_bat_restart_relax(battery); in rk817_bat_set_relax_sample()
894 static void rk817_bat_ocv_thre(struct rk817_battery_device *battery, int value) in rk817_bat_ocv_thre() argument
896 rk817_bat_field_write(battery, OCV_THRE_VOL, value); in rk817_bat_ocv_thre()
899 static int rk817_bat_get_ocv_voltage(struct rk817_battery_device *battery) in rk817_bat_get_ocv_voltage() argument
903 val = rk817_bat_field_read(battery, OCV_VOL_H) << 8; in rk817_bat_get_ocv_voltage()
904 val |= rk817_bat_field_read(battery, OCV_VOL_L); in rk817_bat_get_ocv_voltage()
905 vol = battery->voltage_k * val / 1000 + battery->voltage_b; in rk817_bat_get_ocv_voltage()
907 if (battery->chip_id == RK809_ID) { in rk817_bat_get_ocv_voltage()
908 vol_temp = vol * battery->pdata->bat_res_up / in rk817_bat_get_ocv_voltage()
909 battery->pdata->bat_res_down + vol; in rk817_bat_get_ocv_voltage()
916 static int rk817_bat_get_ocv0_voltage0(struct rk817_battery_device *battery) in rk817_bat_get_ocv0_voltage0() argument
920 val = rk817_bat_field_read(battery, OCV_VOL0_H) << 8; in rk817_bat_get_ocv0_voltage0()
921 val |= rk817_bat_field_read(battery, OCV_VOL0_L); in rk817_bat_get_ocv0_voltage0()
922 vol = battery->voltage_k * val / 1000 + battery->voltage_b; in rk817_bat_get_ocv0_voltage0()
923 if (battery->chip_id == RK809_ID) { in rk817_bat_get_ocv0_voltage0()
924 vol_temp = vol * battery->pdata->bat_res_up / in rk817_bat_get_ocv0_voltage0()
925 battery->pdata->bat_res_down + vol; in rk817_bat_get_ocv0_voltage0()
932 /* power on battery voltage */
933 static int rk817_bat_get_pwron_voltage(struct rk817_battery_device *battery) in rk817_bat_get_pwron_voltage() argument
937 val = rk817_bat_field_read(battery, PWRON_VOL_H) << 8; in rk817_bat_get_pwron_voltage()
938 val |= rk817_bat_field_read(battery, PWRON_VOL_L); in rk817_bat_get_pwron_voltage()
939 vol = battery->voltage_k * val / 1000 + battery->voltage_b; in rk817_bat_get_pwron_voltage()
940 if (battery->chip_id == RK809_ID) { in rk817_bat_get_pwron_voltage()
941 vol_temp = vol * battery->pdata->bat_res_up / in rk817_bat_get_pwron_voltage()
942 battery->pdata->bat_res_down + vol; in rk817_bat_get_pwron_voltage()
949 static int rk817_bat_get_battery_voltage(struct rk817_battery_device *battery) in rk817_bat_get_battery_voltage() argument
954 vcalib0 = rk817_bat_get_vaclib0(battery); in rk817_bat_get_battery_voltage()
955 vcalib1 = rk817_bat_get_vaclib1(battery); in rk817_bat_get_battery_voltage()
958 val = rk817_bat_field_read(battery, BAT_VOL_H) << 8; in rk817_bat_get_battery_voltage()
959 val |= rk817_bat_field_read(battery, BAT_VOL_L) << 0; in rk817_bat_get_battery_voltage()
961 vol = battery->voltage_k * val / 1000 + battery->voltage_b; in rk817_bat_get_battery_voltage()
963 if (battery->chip_id == RK809_ID) { in rk817_bat_get_battery_voltage()
964 vol_temp = vol * battery->pdata->bat_res_up / in rk817_bat_get_battery_voltage()
965 battery->pdata->bat_res_down + vol; in rk817_bat_get_battery_voltage()
972 static int rk817_bat_get_USB_voltage(struct rk817_battery_device *battery) in rk817_bat_get_USB_voltage() argument
976 rk817_bat_field_write(battery, USB_VOL_ADC_EN, 0x01); in rk817_bat_get_USB_voltage()
978 val = rk817_bat_field_read(battery, USB_VOL_H) << 8; in rk817_bat_get_USB_voltage()
979 val |= rk817_bat_field_read(battery, USB_VOL_L) << 0; in rk817_bat_get_USB_voltage()
981 vol = (battery->voltage_k * val / 1000 + battery->voltage_b) * 60 / 46; in rk817_bat_get_USB_voltage()
983 if (battery->chip_id == RK809_ID) { in rk817_bat_get_USB_voltage()
984 vol_temp = vol * battery->pdata->bat_res_up / in rk817_bat_get_USB_voltage()
985 battery->pdata->bat_res_down + vol; in rk817_bat_get_USB_voltage()
992 static int rk817_bat_get_sys_voltage(struct rk817_battery_device *battery) in rk817_bat_get_sys_voltage() argument
996 val = rk817_bat_field_read(battery, SYS_VOL_H) << 8; in rk817_bat_get_sys_voltage()
997 val |= rk817_bat_field_read(battery, SYS_VOL_L) << 0; in rk817_bat_get_sys_voltage()
999 vol = (battery->voltage_k * val / 1000 + battery->voltage_b) * 60 / 46; in rk817_bat_get_sys_voltage()
1001 if (battery->chip_id == RK809_ID) { in rk817_bat_get_sys_voltage()
1002 vol_temp = vol * battery->pdata->bat_res_up / in rk817_bat_get_sys_voltage()
1003 battery->pdata->bat_res_down + vol; in rk817_bat_get_sys_voltage()
1010 static int rk817_bat_get_avg_current(struct rk817_battery_device *battery) in rk817_bat_get_avg_current() argument
1014 val = rk817_bat_field_read(battery, BAT_CUR_H) << 8; in rk817_bat_get_avg_current()
1015 val |= rk817_bat_field_read(battery, BAT_CUR_L); in rk817_bat_get_avg_current()
1020 cur = ADC_TO_CURRENT(val, battery->res_div); in rk817_bat_get_avg_current()
1025 static int rk817_bat_get_relax_cur1(struct rk817_battery_device *battery) in rk817_bat_get_relax_cur1() argument
1029 val = rk817_bat_field_read(battery, RELAX_CUR1_H) << 8; in rk817_bat_get_relax_cur1()
1030 val |= rk817_bat_field_read(battery, RELAX_CUR1_L); in rk817_bat_get_relax_cur1()
1035 cur = ADC_TO_CURRENT(val, battery->res_div); in rk817_bat_get_relax_cur1()
1040 static int rk817_bat_get_relax_cur2(struct rk817_battery_device *battery) in rk817_bat_get_relax_cur2() argument
1044 val |= rk817_bat_field_read(battery, RELAX_CUR2_H) << 8; in rk817_bat_get_relax_cur2()
1045 val = rk817_bat_field_read(battery, RELAX_CUR2_L); in rk817_bat_get_relax_cur2()
1050 cur = ADC_TO_CURRENT(val, battery->res_div); in rk817_bat_get_relax_cur2()
1055 static int rk817_bat_get_relax_current(struct rk817_battery_device *battery) in rk817_bat_get_relax_current() argument
1059 if (!is_rk817_bat_relax_mode(battery)) in rk817_bat_get_relax_current()
1062 relax_cur1 = rk817_bat_get_relax_cur1(battery); in rk817_bat_get_relax_current()
1063 relax_cur2 = rk817_bat_get_relax_cur2(battery); in rk817_bat_get_relax_current()
1068 static int rk817_bat_get_ocv_current(struct rk817_battery_device *battery) in rk817_bat_get_ocv_current() argument
1072 val = rk817_bat_field_read(battery, OCV_CUR_H) << 8; in rk817_bat_get_ocv_current()
1073 val |= rk817_bat_field_read(battery, OCV_CUR_L); in rk817_bat_get_ocv_current()
1078 cur = ADC_TO_CURRENT(val, battery->res_div); in rk817_bat_get_ocv_current()
1083 static int rk817_bat_get_ocv_current0(struct rk817_battery_device *battery) in rk817_bat_get_ocv_current0() argument
1087 val = rk817_bat_field_read(battery, OCV_CUR0_H) << 8; in rk817_bat_get_ocv_current0()
1088 val |= rk817_bat_field_read(battery, OCV_CUR0_L); in rk817_bat_get_ocv_current0()
1093 cur = ADC_TO_CURRENT(val, battery->res_div); in rk817_bat_get_ocv_current0()
1098 static int rk817_bat_get_pwron_current(struct rk817_battery_device *battery) in rk817_bat_get_pwron_current() argument
1102 val = rk817_bat_field_read(battery, PWRON_CUR_H) << 8; in rk817_bat_get_pwron_current()
1103 val |= rk817_bat_field_read(battery, PWRON_CUR_L); in rk817_bat_get_pwron_current()
1107 cur = ADC_TO_CURRENT(val, battery->res_div); in rk817_bat_get_pwron_current()
1112 static bool rk817_bat_remain_cap_is_valid(struct rk817_battery_device *battery) in rk817_bat_remain_cap_is_valid() argument
1114 return !(rk817_bat_field_read(battery, Q_PRESS_H3) & CAP_INVALID); in rk817_bat_remain_cap_is_valid()
1117 static u32 rk817_bat_get_capacity_uah(struct rk817_battery_device *battery) in rk817_bat_get_capacity_uah() argument
1121 if (rk817_bat_remain_cap_is_valid(battery)) { in rk817_bat_get_capacity_uah()
1122 val = rk817_bat_field_read(battery, Q_PRESS_H3) << 24; in rk817_bat_get_capacity_uah()
1123 val |= rk817_bat_field_read(battery, Q_PRESS_H2) << 16; in rk817_bat_get_capacity_uah()
1124 val |= rk817_bat_field_read(battery, Q_PRESS_L1) << 8; in rk817_bat_get_capacity_uah()
1125 val |= rk817_bat_field_read(battery, Q_PRESS_L0) << 0; in rk817_bat_get_capacity_uah()
1127 capacity = ADC_TO_CAPACITY_UAH(val, battery->res_div); in rk817_bat_get_capacity_uah()
1134 static u32 rk817_bat_get_capacity_mah(struct rk817_battery_device *battery) in rk817_bat_get_capacity_mah() argument
1138 if (rk817_bat_remain_cap_is_valid(battery)) { in rk817_bat_get_capacity_mah()
1139 val = rk817_bat_field_read(battery, Q_PRESS_H3) << 24; in rk817_bat_get_capacity_mah()
1140 val |= rk817_bat_field_read(battery, Q_PRESS_H2) << 16; in rk817_bat_get_capacity_mah()
1141 val |= rk817_bat_field_read(battery, Q_PRESS_L1) << 8; in rk817_bat_get_capacity_mah()
1142 val |= rk817_bat_field_read(battery, Q_PRESS_L0) << 0; in rk817_bat_get_capacity_mah()
1144 capacity = ADC_TO_CAPACITY(val, battery->res_div); in rk817_bat_get_capacity_mah()
1146 DBG("Q_PRESS_H3 = 0x%x\n", rk817_bat_field_read(battery, Q_PRESS_H3)); in rk817_bat_get_capacity_mah()
1147 DBG("Q_PRESS_H2 = 0x%x\n", rk817_bat_field_read(battery, Q_PRESS_H2)); in rk817_bat_get_capacity_mah()
1148 DBG("Q_PRESS_H1 = 0x%x\n", rk817_bat_field_read(battery, Q_PRESS_L1)); in rk817_bat_get_capacity_mah()
1149 DBG("Q_PRESS_H0 = 0x%x\n", rk817_bat_field_read(battery, Q_PRESS_L0)); in rk817_bat_get_capacity_mah()
1155 static void fuel_gauge_q_init_info(struct rk817_battery_device *battery) in fuel_gauge_q_init_info() argument
1157 DBG("Q_INIT_H3 = 0x%x\n", rk817_bat_field_read(battery, Q_INIT_H3)); in fuel_gauge_q_init_info()
1158 DBG("Q_INIT_H2 = 0x%x\n", rk817_bat_field_read(battery, Q_INIT_H2)); in fuel_gauge_q_init_info()
1159 DBG("Q_INIT_L1 = 0x%x\n", rk817_bat_field_read(battery, Q_INIT_L1)); in fuel_gauge_q_init_info()
1160 DBG("Q_INIT_L0 = 0x%x\n", rk817_bat_field_read(battery, Q_INIT_L0)); in fuel_gauge_q_init_info()
1163 static void rk817_bat_init_coulomb_cap(struct rk817_battery_device *battery, in rk817_bat_init_coulomb_cap() argument
1169 fuel_gauge_q_init_info(battery); in rk817_bat_init_coulomb_cap()
1170 cap = CAPACITY_TO_ADC(capacity, battery->res_div); in rk817_bat_init_coulomb_cap()
1173 rk817_bat_field_write(battery, Q_INIT_H3, buf); in rk817_bat_init_coulomb_cap()
1175 rk817_bat_field_write(battery, Q_INIT_H2, buf); in rk817_bat_init_coulomb_cap()
1177 rk817_bat_field_write(battery, Q_INIT_L1, buf); in rk817_bat_init_coulomb_cap()
1179 rk817_bat_field_write(battery, Q_INIT_L0, buf); in rk817_bat_init_coulomb_cap()
1181 battery->rsoc = capacity * 1000 * 100 / DIV(battery->fcc); in rk817_bat_init_coulomb_cap()
1182 battery->remain_cap = capacity * 1000; in rk817_bat_init_coulomb_cap()
1183 DBG("new remaincap: %d\n", battery->remain_cap); in rk817_bat_init_coulomb_cap()
1184 fuel_gauge_q_init_info(battery); in rk817_bat_init_coulomb_cap()
1187 static void rk817_bat_save_cap(struct rk817_battery_device *battery, in rk817_bat_save_cap() argument
1193 if (capacity >= battery->qmax) in rk817_bat_save_cap()
1194 capacity = battery->qmax; in rk817_bat_save_cap()
1202 rk817_bat_field_write(battery, REMAIN_CAP_REG2, buf); in rk817_bat_save_cap()
1204 rk817_bat_field_write(battery, REMAIN_CAP_REG1, buf); in rk817_bat_save_cap()
1206 rk817_bat_field_write(battery, REMAIN_CAP_REG0, buf); in rk817_bat_save_cap()
1209 static void rk817_bat_update_qmax(struct rk817_battery_device *battery, in rk817_bat_update_qmax() argument
1215 cap_adc = CAPACITY_TO_ADC(capacity, battery->res_div); in rk817_bat_update_qmax()
1217 rk817_bat_field_write(battery, Q_MAX_H3, buf); in rk817_bat_update_qmax()
1219 rk817_bat_field_write(battery, Q_MAX_H2, buf); in rk817_bat_update_qmax()
1221 rk817_bat_field_write(battery, Q_MAX_L1, buf); in rk817_bat_update_qmax()
1223 rk817_bat_field_write(battery, Q_MAX_L0, buf); in rk817_bat_update_qmax()
1224 battery->qmax = capacity; in rk817_bat_update_qmax()
1227 static int rk817_bat_get_qmax(struct rk817_battery_device *battery) in rk817_bat_get_qmax() argument
1232 val = rk817_bat_field_read(battery, Q_MAX_H3) << 24; in rk817_bat_get_qmax()
1233 val |= rk817_bat_field_read(battery, Q_MAX_H2) << 16; in rk817_bat_get_qmax()
1234 val |= rk817_bat_field_read(battery, Q_MAX_L1) << 8; in rk817_bat_get_qmax()
1235 val |= rk817_bat_field_read(battery, Q_MAX_L0) << 0; in rk817_bat_get_qmax()
1236 capacity = ADC_TO_CAPACITY(val, battery->res_div); in rk817_bat_get_qmax()
1237 battery->qmax = capacity; in rk817_bat_get_qmax()
1241 static void rk817_bat_save_fcc(struct rk817_battery_device *battery, int fcc) in rk817_bat_save_fcc() argument
1246 rk817_bat_field_write(battery, NEW_FCC_REG2, buf); in rk817_bat_save_fcc()
1248 rk817_bat_field_write(battery, NEW_FCC_REG1, buf); in rk817_bat_save_fcc()
1250 rk817_bat_field_write(battery, NEW_FCC_REG0, buf); in rk817_bat_save_fcc()
1253 static int rk817_bat_get_fcc(struct rk817_battery_device *battery) in rk817_bat_get_fcc() argument
1257 fcc |= rk817_bat_field_read(battery, NEW_FCC_REG2) << 16; in rk817_bat_get_fcc()
1258 fcc |= rk817_bat_field_read(battery, NEW_FCC_REG1) << 8; in rk817_bat_get_fcc()
1259 fcc |= rk817_bat_field_read(battery, NEW_FCC_REG0) << 0; in rk817_bat_get_fcc()
1263 fcc = battery->pdata->design_capacity; in rk817_bat_get_fcc()
1264 rk817_bat_save_fcc(battery, fcc); in rk817_bat_get_fcc()
1265 } else if (fcc > battery->pdata->design_qmax) { in rk817_bat_get_fcc()
1267 fcc = battery->pdata->design_qmax; in rk817_bat_get_fcc()
1268 rk817_bat_save_fcc(battery, fcc); in rk817_bat_get_fcc()
1274 static int rk817_bat_get_rsoc(struct rk817_battery_device *battery) in rk817_bat_get_rsoc() argument
1278 remain_cap = rk817_bat_get_capacity_uah(battery); in rk817_bat_get_rsoc()
1280 return remain_cap * 100 / DIV(battery->fcc); in rk817_bat_get_rsoc()
1283 static int rk817_bat_get_off_count(struct rk817_battery_device *battery) in rk817_bat_get_off_count() argument
1285 return rk817_bat_field_read(battery, OFF_CNT); in rk817_bat_get_off_count()
1288 static int rk817_bat_get_ocv_count(struct rk817_battery_device *battery) in rk817_bat_get_ocv_count() argument
1290 return rk817_bat_field_read(battery, OCV_CNT); in rk817_bat_get_ocv_count()
1293 static int rk817_bat_vol_to_soc(struct rk817_battery_device *battery, in rk817_bat_vol_to_soc() argument
1299 ocv_table = battery->pdata->ocv_table; in rk817_bat_vol_to_soc()
1300 ocv_size = battery->pdata->ocv_size; in rk817_bat_vol_to_soc()
1307 static int rk817_bat_vol_to_cap(struct rk817_battery_device *battery, in rk817_bat_vol_to_cap() argument
1313 ocv_table = battery->pdata->ocv_table; in rk817_bat_vol_to_cap()
1314 ocv_size = battery->pdata->ocv_size; in rk817_bat_vol_to_cap()
1316 capacity = ab_div_c(temp, battery->fcc, MAX_INTERPOLATE); in rk817_bat_vol_to_cap()
1321 static void rk817_bat_save_dsoc(struct rk817_battery_device *battery, in rk817_bat_save_dsoc() argument
1327 rk817_bat_field_write(battery, SOC_REG0, in rk817_bat_save_dsoc()
1329 rk817_bat_field_write(battery, SOC_REG1, in rk817_bat_save_dsoc()
1331 rk817_bat_field_write(battery, SOC_REG2, in rk817_bat_save_dsoc()
1338 static int rk817_bat_get_prev_dsoc(struct rk817_battery_device *battery) in rk817_bat_get_prev_dsoc() argument
1342 soc_save = rk817_bat_field_read(battery, SOC_REG0); in rk817_bat_get_prev_dsoc()
1343 soc_save |= (rk817_bat_field_read(battery, SOC_REG1) << 8); in rk817_bat_get_prev_dsoc()
1344 soc_save |= (rk817_bat_field_read(battery, SOC_REG2) << 16); in rk817_bat_get_prev_dsoc()
1349 static bool is_rk817_bat_first_pwron(struct rk817_battery_device *battery) in is_rk817_bat_first_pwron() argument
1351 if (rk817_bat_field_read(battery, BAT_CON)) { in is_rk817_bat_first_pwron()
1352 rk817_bat_field_write(battery, BAT_CON, 0x00); in is_rk817_bat_first_pwron()
1359 static int rk817_bat_get_charge_status(struct rk817_battery_device *battery) in rk817_bat_get_charge_status() argument
1363 if (battery->chip_id == RK809_ID) { in rk817_bat_get_charge_status()
1364 if ((battery->voltage_avg > battery->pdata->design_max_voltage) && in rk817_bat_get_charge_status()
1365 (battery->current_avg > 0) && in rk817_bat_get_charge_status()
1366 ((battery->current_avg < 500) || in rk817_bat_get_charge_status()
1367 (battery->rsoc / 1000 == 100))) in rk817_bat_get_charge_status()
1370 if (battery->plugin_trigger) in rk817_bat_get_charge_status()
1375 status = rk817_bat_field_read(battery, CHG_STS); in rk817_bat_get_charge_status()
1378 if (battery->rsoc == 100 * 1000) { in rk817_bat_get_charge_status()
1404 DBG("battery temperature error...\n"); in rk817_bat_get_charge_status()
1407 DBG("battery timer error..\n"); in rk817_bat_get_charge_status()
1420 static bool rk817_bat_fake_finish_mode(struct rk817_battery_device *battery) in rk817_bat_fake_finish_mode() argument
1422 if ((battery->rsoc == 100) && in rk817_bat_fake_finish_mode()
1423 (rk817_bat_get_charge_status(battery) == CC_OR_CV_CHRG) && in rk817_bat_fake_finish_mode()
1424 (abs(battery->current_avg) <= 100)) in rk817_bat_fake_finish_mode()
1430 static int get_charge_status(struct rk817_battery_device *battery) in get_charge_status() argument
1432 return rk817_bat_get_charge_status(battery); in get_charge_status()
1435 static bool is_rk817_bat_ocv_valid(struct rk817_battery_device *battery) in is_rk817_bat_ocv_valid() argument
1437 return (!battery->is_initialized && battery->pwroff_min >= 30); in is_rk817_bat_ocv_valid()
1440 static void rk817_bat_gas_gaugle_enable(struct rk817_battery_device *battery) in rk817_bat_gas_gaugle_enable() argument
1442 rk817_bat_field_write(battery, GG_EN, ENABLE); in rk817_bat_gas_gaugle_enable()
1445 static void rk817_bat_gg_con_init(struct rk817_battery_device *battery) in rk817_bat_gg_con_init() argument
1447 rk817_bat_field_write(battery, RLX_SPT, S_8_MIN); in rk817_bat_gg_con_init()
1448 rk817_bat_field_write(battery, ADC_OFF_CAL_INTERV, S_8_MIN); in rk817_bat_gg_con_init()
1449 rk817_bat_field_write(battery, VOL_OUT_MOD, AVERAGE_MODE); in rk817_bat_gg_con_init()
1450 rk817_bat_field_write(battery, CUR_OUT_MOD, AVERAGE_MODE); in rk817_bat_gg_con_init()
1453 static void rk817_bat_adc_init(struct rk817_battery_device *battery) in rk817_bat_adc_init() argument
1455 rk817_bat_field_write(battery, SYS_VOL_ADC_EN, ENABLE); in rk817_bat_adc_init()
1456 rk817_bat_field_write(battery, TS_ADC_EN, ENABLE); in rk817_bat_adc_init()
1457 rk817_bat_field_write(battery, USB_VOL_ADC_EN, ENABLE); in rk817_bat_adc_init()
1458 rk817_bat_field_write(battery, BAT_VOL_ADC_EN, ENABLE); in rk817_bat_adc_init()
1459 rk817_bat_field_write(battery, BAT_CUR_ADC_EN, ENABLE); in rk817_bat_adc_init()
1462 static void rk817_bat_init_info(struct rk817_battery_device *battery) in rk817_bat_init_info() argument
1464 battery->design_cap = battery->pdata->design_capacity; in rk817_bat_init_info()
1465 battery->qmax = battery->pdata->design_qmax; in rk817_bat_init_info()
1466 battery->bat_res = battery->pdata->bat_res; in rk817_bat_init_info()
1467 battery->monitor_ms = battery->pdata->monitor_sec * TIMER_MS_COUNTS; in rk817_bat_init_info()
1468 battery->res_div = (battery->pdata->sample_res == SAMPLE_RES_20MR) ? in rk817_bat_init_info()
1470 DBG("battery->qmax :%d\n", battery->qmax); in rk817_bat_init_info()
1473 static int rk817_bat_get_prev_cap(struct rk817_battery_device *battery) in rk817_bat_get_prev_cap() argument
1477 val = rk817_bat_field_read(battery, REMAIN_CAP_REG2) << 16; in rk817_bat_get_prev_cap()
1478 val |= rk817_bat_field_read(battery, REMAIN_CAP_REG1) << 8; in rk817_bat_get_prev_cap()
1479 val |= rk817_bat_field_read(battery, REMAIN_CAP_REG0) << 0; in rk817_bat_get_prev_cap()
1484 static u8 rk817_bat_get_halt_cnt(struct rk817_battery_device *battery) in rk817_bat_get_halt_cnt() argument
1486 return rk817_bat_field_read(battery, HALT_CNT_REG); in rk817_bat_get_halt_cnt()
1489 static void rk817_bat_inc_halt_cnt(struct rk817_battery_device *battery) in rk817_bat_inc_halt_cnt() argument
1493 cnt = rk817_bat_field_read(battery, HALT_CNT_REG); in rk817_bat_inc_halt_cnt()
1494 rk817_bat_field_write(battery, HALT_CNT_REG, ++cnt); in rk817_bat_inc_halt_cnt()
1497 static bool is_rk817_bat_last_halt(struct rk817_battery_device *battery) in is_rk817_bat_last_halt() argument
1499 int pre_cap = rk817_bat_get_prev_cap(battery); in is_rk817_bat_last_halt()
1500 int now_cap = rk817_bat_get_capacity_mah(battery); in is_rk817_bat_last_halt()
1503 if (abs(now_cap - pre_cap) > (battery->fcc / 10)) { in is_rk817_bat_last_halt()
1504 rk817_bat_inc_halt_cnt(battery); in is_rk817_bat_last_halt()
1511 static u8 is_rk817_bat_initialized(struct rk817_battery_device *battery) in is_rk817_bat_initialized() argument
1513 u8 val = rk817_bat_field_read(battery, FG_INIT); in is_rk817_bat_initialized()
1516 rk817_bat_field_write(battery, FG_INIT, 0x00); in is_rk817_bat_initialized()
1523 static void rk817_bat_calc_sm_linek(struct rk817_battery_device *battery) in rk817_bat_calc_sm_linek() argument
1527 int current_avg = rk817_bat_get_avg_current(battery); in rk817_bat_calc_sm_linek()
1529 delta = abs(battery->dsoc - battery->rsoc); in rk817_bat_calc_sm_linek()
1533 if (battery->dsoc < battery->rsoc) in rk817_bat_calc_sm_linek()
1535 else if (battery->dsoc > battery->rsoc) in rk817_bat_calc_sm_linek()
1540 if (battery->dsoc < battery->rsoc) in rk817_bat_calc_sm_linek()
1542 else if (battery->dsoc > battery->rsoc) in rk817_bat_calc_sm_linek()
1548 battery->dbg_meet_soc = (battery->dsoc >= battery->rsoc) ? in rk817_bat_calc_sm_linek()
1549 (battery->dsoc - diff) : (battery->rsoc - diff); in rk817_bat_calc_sm_linek()
1551 battery->sm_linek = linek; in rk817_bat_calc_sm_linek()
1552 battery->sm_remain_cap = battery->remain_cap; in rk817_bat_calc_sm_linek()
1553 battery->dbg_calc_dsoc = battery->dsoc; in rk817_bat_calc_sm_linek()
1554 battery->dbg_calc_rsoc = battery->rsoc; in rk817_bat_calc_sm_linek()
1557 static void rk817_bat_smooth_algo_prepare(struct rk817_battery_device *battery) in rk817_bat_smooth_algo_prepare() argument
1559 battery->smooth_soc = battery->dsoc; in rk817_bat_smooth_algo_prepare()
1562 __func__, battery->dsoc, battery->smooth_soc); in rk817_bat_smooth_algo_prepare()
1563 rk817_bat_calc_sm_linek(battery); in rk817_bat_smooth_algo_prepare()
1566 static void rk817_bat_finish_algo_prepare(struct rk817_battery_device *battery) in rk817_bat_finish_algo_prepare() argument
1568 battery->finish_base = get_boot_sec(); in rk817_bat_finish_algo_prepare()
1570 if (!battery->finish_base) in rk817_bat_finish_algo_prepare()
1571 battery->finish_base = 1; in rk817_bat_finish_algo_prepare()
1574 static void rk817_bat_init_dsoc_algorithm(struct rk817_battery_device *battery) in rk817_bat_init_dsoc_algorithm() argument
1576 if (battery->dsoc >= 100 * 1000) in rk817_bat_init_dsoc_algorithm()
1577 battery->dsoc = 100 * 1000; in rk817_bat_init_dsoc_algorithm()
1578 else if (battery->dsoc <= 0) in rk817_bat_init_dsoc_algorithm()
1579 battery->dsoc = 0; in rk817_bat_init_dsoc_algorithm()
1581 battery->voltage_avg = rk817_bat_get_battery_voltage(battery); in rk817_bat_init_dsoc_algorithm()
1582 battery->current_avg = rk817_bat_get_avg_current(battery); in rk817_bat_init_dsoc_algorithm()
1584 if (get_charge_status(battery) == CHARGE_FINISH) { in rk817_bat_init_dsoc_algorithm()
1585 rk817_bat_finish_algo_prepare(battery); in rk817_bat_init_dsoc_algorithm()
1586 battery->work_mode = MODE_FINISH; in rk817_bat_init_dsoc_algorithm()
1588 rk817_bat_smooth_algo_prepare(battery); in rk817_bat_init_dsoc_algorithm()
1589 battery->work_mode = MODE_SMOOTH; in rk817_bat_init_dsoc_algorithm()
1592 __func__, battery->sm_remain_cap, battery->smooth_soc); in rk817_bat_init_dsoc_algorithm()
1595 static void rk817_bat_first_pwron(struct rk817_battery_device *battery) in rk817_bat_first_pwron() argument
1597 battery->rsoc = in rk817_bat_first_pwron()
1598 rk817_bat_vol_to_soc(battery, in rk817_bat_first_pwron()
1599 battery->pwron_voltage) * 1000;/* uAH */ in rk817_bat_first_pwron()
1600 battery->dsoc = battery->rsoc; in rk817_bat_first_pwron()
1601 battery->fcc = battery->pdata->design_capacity; in rk817_bat_first_pwron()
1602 battery->nac = rk817_bat_vol_to_cap(battery, battery->pwron_voltage); in rk817_bat_first_pwron()
1604 rk817_bat_update_qmax(battery, battery->qmax); in rk817_bat_first_pwron()
1605 rk817_bat_save_fcc(battery, battery->fcc); in rk817_bat_first_pwron()
1607 __func__, battery->rsoc, battery->dsoc, battery->fcc, battery->nac); in rk817_bat_first_pwron()
1610 static void rk817_bat_not_first_pwron(struct rk817_battery_device *battery) in rk817_bat_not_first_pwron() argument
1614 battery->fcc = rk817_bat_get_fcc(battery); in rk817_bat_not_first_pwron()
1615 pre_soc = rk817_bat_get_prev_dsoc(battery); in rk817_bat_not_first_pwron()
1616 pre_cap = rk817_bat_get_prev_cap(battery); in rk817_bat_not_first_pwron()
1617 now_cap = rk817_bat_get_capacity_mah(battery); in rk817_bat_not_first_pwron()
1618 battery->remain_cap = pre_cap * 1000; in rk817_bat_not_first_pwron()
1619 battery->is_halt = is_rk817_bat_last_halt(battery); in rk817_bat_not_first_pwron()
1620 battery->halt_cnt = rk817_bat_get_halt_cnt(battery); in rk817_bat_not_first_pwron()
1621 battery->is_initialized = is_rk817_bat_initialized(battery); in rk817_bat_not_first_pwron()
1622 battery->is_ocv_calib = is_rk817_bat_ocv_valid(battery); in rk817_bat_not_first_pwron()
1624 if (battery->is_halt) { in rk817_bat_not_first_pwron()
1629 rk817_bat_init_coulomb_cap(battery, now_cap); in rk817_bat_not_first_pwron()
1631 pre_soc = battery->rsoc; in rk817_bat_not_first_pwron()
1633 } else if (battery->is_initialized) { in rk817_bat_not_first_pwron()
1637 } else if (battery->is_ocv_calib) { in rk817_bat_not_first_pwron()
1639 ocv_vol = rk817_bat_get_ocv_voltage(battery); in rk817_bat_not_first_pwron()
1640 ocv_soc = rk817_bat_vol_to_soc(battery, ocv_vol); in rk817_bat_not_first_pwron()
1641 ocv_cap = rk817_bat_vol_to_cap(battery, ocv_vol); in rk817_bat_not_first_pwron()
1643 battery->ocv_pre_dsoc = pre_soc; in rk817_bat_not_first_pwron()
1644 battery->ocv_new_dsoc = ocv_soc; in rk817_bat_not_first_pwron()
1645 if (abs(ocv_soc - pre_soc) >= battery->pdata->max_soc_offset) { in rk817_bat_not_first_pwron()
1646 battery->ocv_pre_dsoc = pre_soc; in rk817_bat_not_first_pwron()
1647 battery->ocv_new_dsoc = ocv_soc; in rk817_bat_not_first_pwron()
1648 battery->is_max_soc_offset = true; in rk817_bat_not_first_pwron()
1654 } else if (battery->pwroff_min > 0) { in rk817_bat_not_first_pwron()
1655 ocv_vol = rk817_bat_get_ocv_voltage(battery); in rk817_bat_not_first_pwron()
1656 ocv_soc = rk817_bat_vol_to_soc(battery, ocv_vol); in rk817_bat_not_first_pwron()
1657 ocv_cap = rk817_bat_vol_to_cap(battery, ocv_vol); in rk817_bat_not_first_pwron()
1658 battery->force_pre_dsoc = pre_soc; in rk817_bat_not_first_pwron()
1659 battery->force_new_dsoc = ocv_soc; in rk817_bat_not_first_pwron()
1661 battery->is_force_calib = true; in rk817_bat_not_first_pwron()
1669 battery->dsoc = pre_soc; in rk817_bat_not_first_pwron()
1670 battery->nac = pre_cap; in rk817_bat_not_first_pwron()
1671 if (battery->nac < 0) in rk817_bat_not_first_pwron()
1672 battery->nac = 0; in rk817_bat_not_first_pwron()
1675 battery->dsoc, battery->nac, rk817_bat_get_battery_voltage(battery), in rk817_bat_not_first_pwron()
1676 rk817_bat_get_ocv_voltage(battery), in rk817_bat_not_first_pwron()
1677 rk817_bat_get_relax_voltage(battery), in rk817_bat_not_first_pwron()
1678 battery->pwroff_min, rk817_bat_get_prev_dsoc(battery), in rk817_bat_not_first_pwron()
1679 rk817_bat_get_prev_cap(battery)); in rk817_bat_not_first_pwron()
1682 static void rk817_bat_rsoc_init(struct rk817_battery_device *battery) in rk817_bat_rsoc_init() argument
1684 battery->is_first_power_on = is_rk817_bat_first_pwron(battery); in rk817_bat_rsoc_init()
1685 battery->pwroff_min = rk817_bat_get_off_count(battery); in rk817_bat_rsoc_init()
1686 battery->pwron_voltage = rk817_bat_get_pwron_voltage(battery); in rk817_bat_rsoc_init()
1689 __func__, battery->is_first_power_on, in rk817_bat_rsoc_init()
1690 battery->pwroff_min, battery->pwron_voltage); in rk817_bat_rsoc_init()
1692 if (battery->is_first_power_on) in rk817_bat_rsoc_init()
1693 rk817_bat_first_pwron(battery); in rk817_bat_rsoc_init()
1695 rk817_bat_not_first_pwron(battery); in rk817_bat_rsoc_init()
1697 rk817_bat_save_dsoc(battery, battery->dsoc); in rk817_bat_rsoc_init()
1702 struct rk817_battery_device *battery = in rk817_bat_caltimer_isr() local
1703 from_timer(battery, t, caltimer); in rk817_bat_caltimer_isr()
1705 mod_timer(&battery->caltimer, jiffies + MINUTE(8) * HZ); in rk817_bat_caltimer_isr()
1706 queue_delayed_work(battery->bat_monitor_wq, in rk817_bat_caltimer_isr()
1707 &battery->calib_delay_work, in rk817_bat_caltimer_isr()
1713 struct rk817_battery_device *battery = container_of(work, in rk817_bat_internal_calib() local
1718 rk817_bat_current_calibration(battery); in rk817_bat_internal_calib()
1720 rk817_bat_init_voltage_kb(battery); in rk817_bat_internal_calib()
1722 DBG("caltimer:coffset=0x%x\n", rk817_bat_get_coffset(battery)); in rk817_bat_internal_calib()
1725 static void rk817_bat_init_caltimer(struct rk817_battery_device *battery) in rk817_bat_init_caltimer() argument
1727 timer_setup(&battery->caltimer, in rk817_bat_init_caltimer()
1730 battery->caltimer.expires = jiffies + MINUTE(8) * HZ; in rk817_bat_init_caltimer()
1731 add_timer(&battery->caltimer); in rk817_bat_init_caltimer()
1732 INIT_DELAYED_WORK(&battery->calib_delay_work, rk817_bat_internal_calib); in rk817_bat_init_caltimer()
1735 static void rk817_bat_init_fg(struct rk817_battery_device *battery) in rk817_bat_init_fg() argument
1737 rk817_bat_adc_init(battery); in rk817_bat_init_fg()
1738 rk817_bat_gas_gaugle_enable(battery); in rk817_bat_init_fg()
1739 rk817_bat_gg_con_init(battery); in rk817_bat_init_fg()
1740 rk817_bat_init_voltage_kb(battery); in rk817_bat_init_fg()
1741 rk817_bat_set_relax_sample(battery); in rk817_bat_init_fg()
1742 rk817_bat_ocv_thre(battery, 0xff); in rk817_bat_init_fg()
1743 rk817_bat_init_caltimer(battery); in rk817_bat_init_fg()
1744 rk817_bat_rsoc_init(battery); in rk817_bat_init_fg()
1745 rk817_bat_init_coulomb_cap(battery, battery->nac); in rk817_bat_init_fg()
1746 DBG("rsoc%d, fcc = %d\n", battery->rsoc, battery->fcc); in rk817_bat_init_fg()
1747 rk817_bat_init_dsoc_algorithm(battery); in rk817_bat_init_fg()
1748 battery->qmax = rk817_bat_get_qmax(battery); in rk817_bat_init_fg()
1749 battery->voltage_avg = rk817_bat_get_battery_voltage(battery); in rk817_bat_init_fg()
1750 battery->voltage_sys = rk817_bat_get_sys_voltage(battery); in rk817_bat_init_fg()
1752 battery->voltage_ocv = rk817_bat_get_ocv_voltage(battery); in rk817_bat_init_fg()
1753 battery->voltage_relax = rk817_bat_get_relax_voltage(battery); in rk817_bat_init_fg()
1754 battery->current_avg = rk817_bat_get_avg_current(battery); in rk817_bat_init_fg()
1755 battery->dbg_pwr_dsoc = battery->dsoc; in rk817_bat_init_fg()
1756 battery->dbg_pwr_rsoc = battery->rsoc; in rk817_bat_init_fg()
1757 battery->dbg_pwr_vol = battery->voltage_avg; in rk817_bat_init_fg()
1758 battery->temperature = VIRTUAL_TEMPERATURE; in rk817_bat_init_fg()
1760 DBG("probe init: battery->dsoc = %d, rsoc = %d\n" in rk817_bat_init_fg()
1762 battery->dsoc, battery->rsoc, battery->remain_cap, in rk817_bat_init_fg()
1763 battery->voltage_avg, battery->voltage_sys, battery->qmax); in rk817_bat_init_fg()
1764 DBG("OCV_THRE_VOL: 0x%x", rk817_bat_field_read(battery, OCV_THRE_VOL)); in rk817_bat_init_fg()
1767 static int rk817_bat_parse_dt(struct rk817_battery_device *battery) in rk817_bat_parse_dt() argument
1773 struct device *dev = battery->dev; in rk817_bat_parse_dt()
1774 struct device_node *np = battery->dev->of_node; in rk817_bat_parse_dt()
1776 pdata = devm_kzalloc(battery->dev, sizeof(*pdata), GFP_KERNEL); in rk817_bat_parse_dt()
1780 battery->pdata = pdata; in rk817_bat_parse_dt()
1810 pdata->ocv_table = devm_kzalloc(battery->dev, size, GFP_KERNEL); in rk817_bat_parse_dt()
1897 if (battery->chip_id == RK809_ID) { in rk817_bat_parse_dt()
1901 dev_err(dev, "battery res_up missing\n"); in rk817_bat_parse_dt()
1906 dev_err(dev, "battery res_down missing!\n"); in rk817_bat_parse_dt()
1911 dev_err(dev, "battery design_max_voltage missing!\n"); in rk817_bat_parse_dt()
1914 &battery->is_register_chg_psy); in rk817_bat_parse_dt()
1915 if (ret < 0 || !battery->is_register_chg_psy) in rk817_bat_parse_dt()
1919 DBG("the battery dts info dump:\n" in rk817_bat_parse_dt()
1966 struct rk817_battery_device *battery = data; in rk817_bat_get_usb_psy() local
1970 battery->usb_psy = psy; in rk817_bat_get_usb_psy()
1979 struct rk817_battery_device *battery = data; in rk817_bat_get_ac_psy() local
1983 battery->ac_psy = psy; in rk817_bat_get_ac_psy()
1990 static void rk817_bat_get_chrg_psy(struct rk817_battery_device *battery) in rk817_bat_get_chrg_psy() argument
1992 if (!battery->usb_psy) in rk817_bat_get_chrg_psy()
1993 class_for_each_device(power_supply_class, NULL, (void *)battery, in rk817_bat_get_chrg_psy()
1995 if (!battery->ac_psy) in rk817_bat_get_chrg_psy()
1996 class_for_each_device(power_supply_class, NULL, (void *)battery, in rk817_bat_get_chrg_psy()
2000 static int rk817_bat_get_charge_state(struct rk817_battery_device *battery) in rk817_bat_get_charge_state() argument
2006 if (!battery->usb_psy || !battery->ac_psy) in rk817_bat_get_charge_state()
2007 rk817_bat_get_chrg_psy(battery); in rk817_bat_get_charge_state()
2009 psy = battery->usb_psy; in rk817_bat_get_charge_state()
2014 battery->usb_in = val.intval; in rk817_bat_get_charge_state()
2017 psy = battery->ac_psy; in rk817_bat_get_charge_state()
2022 battery->ac_in = val.intval; in rk817_bat_get_charge_state()
2026 __func__, battery->ac_in, battery->usb_in); in rk817_bat_get_charge_state()
2028 return (battery->usb_in || battery->ac_in); in rk817_bat_get_charge_state()
2031 static int rk817_get_capacity_leve(struct rk817_battery_device *battery) in rk817_get_capacity_leve() argument
2035 if (battery->pdata->bat_mode == MODE_VIRTUAL) in rk817_get_capacity_leve()
2038 dsoc = (battery->dsoc + 500) / 1000; in rk817_get_capacity_leve()
2051 static int rk817_battery_time_to_full(struct rk817_battery_device *battery) in rk817_battery_time_to_full() argument
2056 if (battery->pdata->bat_mode == MODE_VIRTUAL) { in rk817_battery_time_to_full()
2058 } else if (battery->voltage_avg > 0) { in rk817_battery_time_to_full()
2059 cap_temp = battery->design_cap - (battery->remain_cap / 1000); in rk817_battery_time_to_full()
2062 time_sec = (3600 * cap_temp) / battery->voltage_avg; in rk817_battery_time_to_full()
2074 struct rk817_battery_device *battery = power_supply_get_drvdata(psy); in rk817_battery_get_property() local
2078 val->intval = battery->current_avg * 1000;/*uA*/ in rk817_battery_get_property()
2079 if (battery->pdata->bat_mode == MODE_VIRTUAL) in rk817_battery_get_property()
2083 val->intval = battery->voltage_avg * 1000;/*uV*/ in rk817_battery_get_property()
2084 if (battery->pdata->bat_mode == MODE_VIRTUAL) in rk817_battery_get_property()
2088 val->intval = (battery->dsoc + 500) / 1000; in rk817_battery_get_property()
2089 if (battery->pdata->bat_mode == MODE_VIRTUAL) in rk817_battery_get_property()
2093 val->intval = rk817_get_capacity_leve(battery); in rk817_battery_get_property()
2099 val->intval = battery->temperature; in rk817_battery_get_property()
2100 if (battery->pdata->bat_mode == MODE_VIRTUAL) in rk817_battery_get_property()
2104 if (battery->pdata->bat_mode == MODE_VIRTUAL) in rk817_battery_get_property()
2106 else if (battery->dsoc == 100 * 1000) in rk817_battery_get_property()
2109 if ((battery->chip_id != RK809_ID) && in rk817_battery_get_property()
2110 rk817_bat_get_charge_state(battery)) in rk817_battery_get_property()
2112 else if (battery->chip_id == RK809_ID && in rk817_battery_get_property()
2113 battery->plugin_trigger) in rk817_battery_get_property()
2120 val->intval = battery->charge_count; in rk817_battery_get_property()
2124 val->intval = battery->pdata->design_capacity * 1000;/* uAh */ in rk817_battery_get_property()
2127 val->intval = rk817_battery_time_to_full(battery); in rk817_battery_get_property()
2143 .name = "battery",
2150 static int rk817_bat_init_power_supply(struct rk817_battery_device *battery) in rk817_bat_init_power_supply() argument
2152 struct power_supply_config psy_cfg = { .drv_data = battery, }; in rk817_bat_init_power_supply()
2154 battery->bat = devm_power_supply_register(battery->dev, in rk817_bat_init_power_supply()
2157 if (IS_ERR(battery->bat)) { in rk817_bat_init_power_supply()
2158 dev_err(battery->dev, "register bat power supply fail\n"); in rk817_bat_init_power_supply()
2159 return PTR_ERR(battery->bat); in rk817_bat_init_power_supply()
2174 struct rk817_battery_device *battery = power_supply_get_drvdata(psy); in rk809_chg_get_property() local
2178 if (battery->plugin_trigger) in rk809_chg_get_property()
2183 dev_dbg(battery->dev, "report online: %d\n", val->intval); in rk809_chg_get_property()
2190 dev_dbg(battery->dev, "report prop: %d\n", val->intval); in rk809_chg_get_property()
2208 static int rk809_chg_init_power_supply(struct rk817_battery_device *battery) in rk809_chg_init_power_supply() argument
2210 struct power_supply_config psy_cfg = { .drv_data = battery, }; in rk809_chg_init_power_supply()
2212 battery->chg_psy = in rk809_chg_init_power_supply()
2213 devm_power_supply_register(battery->dev, &rk809_chg_desc, in rk809_chg_init_power_supply()
2215 if (IS_ERR(battery->chg_psy)) { in rk809_chg_init_power_supply()
2216 dev_err(battery->dev, "register chg psy power supply fail\n"); in rk809_chg_init_power_supply()
2217 return PTR_ERR(battery->chg_psy); in rk809_chg_init_power_supply()
2223 static void rk817_bat_power_supply_changed(struct rk817_battery_device *battery) in rk817_bat_power_supply_changed() argument
2227 if (battery->dsoc > 100 * 1000) in rk817_bat_power_supply_changed()
2228 battery->dsoc = 100 * 1000; in rk817_bat_power_supply_changed()
2229 else if (battery->dsoc < 0) in rk817_bat_power_supply_changed()
2230 battery->dsoc = 0; in rk817_bat_power_supply_changed()
2232 if (battery->dsoc == old_soc && !battery->change) in rk817_bat_power_supply_changed()
2235 battery->change = false; in rk817_bat_power_supply_changed()
2236 old_soc = battery->dsoc; in rk817_bat_power_supply_changed()
2237 battery->last_dsoc = battery->dsoc; in rk817_bat_power_supply_changed()
2238 power_supply_changed(battery->bat); in rk817_bat_power_supply_changed()
2240 battery->dsoc, battery->rsoc, battery->voltage_avg, in rk817_bat_power_supply_changed()
2241 battery->voltage_ocv, battery->current_avg, in rk817_bat_power_supply_changed()
2242 battery->remain_cap, battery->fcc); in rk817_bat_power_supply_changed()
2246 battery->dbg_pwr_dsoc, battery->dbg_pwr_rsoc, in rk817_bat_power_supply_changed()
2247 battery->dbg_pwr_vol, in rk817_bat_power_supply_changed()
2248 battery->is_halt, battery->halt_cnt, in rk817_bat_power_supply_changed()
2249 battery->is_max_soc_offset, in rk817_bat_power_supply_changed()
2250 battery->is_initialized, battery->is_sw_reset, in rk817_bat_power_supply_changed()
2251 battery->is_ocv_calib, in rk817_bat_power_supply_changed()
2252 battery->dbg_cap_low0, battery->is_force_calib); in rk817_bat_power_supply_changed()
2255 static void rk817_battery_debug_info(struct rk817_battery_device *battery) in rk817_battery_debug_info() argument
2257 rk817_bat_get_battery_voltage(battery); in rk817_battery_debug_info()
2258 rk817_bat_get_sys_voltage(battery); in rk817_battery_debug_info()
2259 rk817_bat_get_USB_voltage(battery); in rk817_battery_debug_info()
2260 rk817_bat_get_pwron_voltage(battery); in rk817_battery_debug_info()
2261 rk817_bat_get_ocv_voltage(battery); in rk817_battery_debug_info()
2262 rk817_bat_get_ocv0_voltage0(battery); in rk817_battery_debug_info()
2264 rk817_bat_current_calibration(battery); in rk817_battery_debug_info()
2265 rk817_bat_get_avg_current(battery); in rk817_battery_debug_info()
2266 rk817_bat_get_relax_cur1(battery); in rk817_battery_debug_info()
2267 rk817_bat_get_relax_cur2(battery); in rk817_battery_debug_info()
2268 rk817_bat_get_relax_current(battery); in rk817_battery_debug_info()
2269 rk817_bat_get_ocv_current(battery); in rk817_battery_debug_info()
2270 rk817_bat_get_ocv_current0(battery); in rk817_battery_debug_info()
2271 rk817_bat_get_pwron_current(battery); in rk817_battery_debug_info()
2272 rk817_bat_get_ocv_count(battery); in rk817_battery_debug_info()
2273 rk817_bat_save_dsoc(battery, battery->dsoc); in rk817_battery_debug_info()
2274 DBG("capactiy = %d\n", rk817_bat_get_capacity_mah(battery)); in rk817_battery_debug_info()
2278 rk817_bat_update_charging_status(struct rk817_battery_device *battery) in rk817_bat_update_charging_status() argument
2282 is_charging = rk817_bat_get_charge_state(battery); in rk817_bat_update_charging_status()
2283 if (is_charging == battery->is_charging) in rk817_bat_update_charging_status()
2286 battery->change = true; in rk817_bat_update_charging_status()
2287 battery->is_charging = is_charging; in rk817_bat_update_charging_status()
2289 battery->charge_count++; in rk817_bat_update_charging_status()
2292 static void rk817_bat_update_info(struct rk817_battery_device *battery) in rk817_bat_update_info() argument
2294 battery->voltage_avg = rk817_bat_get_battery_voltage(battery); in rk817_bat_update_info()
2295 battery->voltage_sys = rk817_bat_get_sys_voltage(battery); in rk817_bat_update_info()
2296 battery->current_avg = rk817_bat_get_avg_current(battery); in rk817_bat_update_info()
2297 battery->voltage_relax = rk817_bat_get_relax_voltage(battery); in rk817_bat_update_info()
2298 battery->rsoc = rk817_bat_get_rsoc(battery); in rk817_bat_update_info()
2299 battery->remain_cap = rk817_bat_get_capacity_uah(battery); in rk817_bat_update_info()
2300 battery->voltage_usb = rk817_bat_get_USB_voltage(battery); in rk817_bat_update_info()
2301 battery->chrg_status = get_charge_status(battery); in rk817_bat_update_info()
2302 rk817_bat_update_charging_status(battery); in rk817_bat_update_info()
2303 DBG("valtage usb: %d\n", battery->voltage_usb); in rk817_bat_update_info()
2311 battery->voltage_avg, in rk817_bat_update_info()
2312 battery->voltage_sys, in rk817_bat_update_info()
2313 battery->current_avg, in rk817_bat_update_info()
2314 battery->rsoc, in rk817_bat_update_info()
2315 battery->chrg_status, in rk817_bat_update_info()
2316 rk817_bat_get_pwron_current(battery), in rk817_bat_update_info()
2317 battery->remain_cap); in rk817_bat_update_info()
2320 if (battery->remain_cap / 1000 > battery->fcc) { in rk817_bat_update_info()
2321 /*battery->sm_remain_cap -=*/ in rk817_bat_update_info()
2322 /*(battery->remain_cap - battery->fcc * 1000);*/ in rk817_bat_update_info()
2323 battery->sm_remain_cap = battery->fcc * 1000; in rk817_bat_update_info()
2325 __func__, battery->remain_cap, battery->sm_remain_cap); in rk817_bat_update_info()
2326 DBG("fcc: %d\n", battery->fcc); in rk817_bat_update_info()
2327 rk817_bat_init_coulomb_cap(battery, battery->fcc + 100); in rk817_bat_update_info()
2328 rk817_bat_init_coulomb_cap(battery, battery->fcc); in rk817_bat_update_info()
2329 rk817_bat_get_capacity_mah(battery); in rk817_bat_update_info()
2332 if (battery->chrg_status != CHARGE_FINISH) in rk817_bat_update_info()
2333 battery->finish_base = get_boot_sec(); in rk817_bat_update_info()
2336 static void rk817_bat_save_data(struct rk817_battery_device *battery) in rk817_bat_save_data() argument
2338 rk817_bat_save_dsoc(battery, battery->dsoc); in rk817_bat_save_data()
2339 rk817_bat_save_cap(battery, battery->remain_cap / 1000); in rk817_bat_save_data()
2346 static void rk817_bat_lowpwr_check(struct rk817_battery_device *battery) in rk817_bat_lowpwr_check() argument
2349 int pwr_off_thresd = battery->pdata->pwroff_vol; in rk817_bat_lowpwr_check()
2351 if (battery->current_avg < 0 && battery->voltage_avg < pwr_off_thresd) { in rk817_bat_lowpwr_check()
2356 (battery->voltage_avg <= pwr_off_thresd - 50)) { in rk817_bat_lowpwr_check()
2357 battery->fake_offline = 1; in rk817_bat_lowpwr_check()
2358 if (battery->voltage_avg <= pwr_off_thresd - 50) in rk817_bat_lowpwr_check()
2359 battery->dsoc -= 1000; in rk817_bat_lowpwr_check()
2361 battery->dsoc, battery->current_avg); in rk817_bat_lowpwr_check()
2365 battery->fake_offline = 0; in rk817_bat_lowpwr_check()
2369 __func__, base2sec(time), battery->dsoc, in rk817_bat_lowpwr_check()
2370 battery->current_avg, battery->fake_offline); in rk817_bat_lowpwr_check()
2373 static void rk817_bat_calc_smooth_dischrg(struct rk817_battery_device *battery) in rk817_bat_calc_smooth_dischrg() argument
2378 if (battery->smooth_soc < 0) in rk817_bat_calc_smooth_dischrg()
2379 battery->smooth_soc = 0; in rk817_bat_calc_smooth_dischrg()
2381 tmp_soc = battery->smooth_soc / 1000; in rk817_bat_calc_smooth_dischrg()
2383 if (tmp_soc != battery->dsoc / 1000) { in rk817_bat_calc_smooth_dischrg()
2384 if (battery->smooth_soc > battery->dsoc) in rk817_bat_calc_smooth_dischrg()
2387 if (battery->smooth_soc + 1000 > battery->dsoc) in rk817_bat_calc_smooth_dischrg()
2388 battery->dsoc = battery->smooth_soc; in rk817_bat_calc_smooth_dischrg()
2390 battery->dsoc -= 1000; in rk817_bat_calc_smooth_dischrg()
2392 if (battery->dsoc <= 0) in rk817_bat_calc_smooth_dischrg()
2393 battery->dsoc = 0; in rk817_bat_calc_smooth_dischrg()
2397 static void rk817_bat_smooth_algorithm(struct rk817_battery_device *battery) in rk817_bat_smooth_algorithm() argument
2402 /*int current_avg = rk817_bat_get_avg_current(battery);*/ in rk817_bat_smooth_algorithm()
2404 delta = abs(battery->dsoc - battery->rsoc); in rk817_bat_smooth_algorithm()
2408 if ((battery->sm_linek * battery->current_avg <= 0)) { in rk817_bat_smooth_algorithm()
2410 rk817_bat_calc_sm_linek(battery); in rk817_bat_smooth_algorithm()
2413 /*battery->sm_linek = linek;*/ in rk817_bat_smooth_algorithm()
2415 battery->remain_cap = rk817_bat_get_capacity_uah(battery); in rk817_bat_smooth_algorithm()
2417 old_cap = battery->sm_remain_cap; in rk817_bat_smooth_algorithm()
2418 DBG("smooth: smooth_soc = %d, dsoc = %d, battery->sm_linek = %d\n", in rk817_bat_smooth_algorithm()
2419 battery->smooth_soc, battery->dsoc, battery->sm_linek); in rk817_bat_smooth_algorithm()
2425 delta_cap = battery->remain_cap - battery->sm_remain_cap; in rk817_bat_smooth_algorithm()
2427 battery->sm_remain_cap, battery->remain_cap); in rk817_bat_smooth_algorithm()
2429 delta_cap, battery->dsoc); in rk817_bat_smooth_algorithm()
2437 ydsoc = battery->sm_linek * abs(delta_cap / 10) / DIV(battery->fcc); in rk817_bat_smooth_algorithm()
2439 DBG("smooth: ydsoc = %d, fcc = %d\n", ydsoc, battery->fcc); in rk817_bat_smooth_algorithm()
2444 battery->sm_remain_cap = battery->remain_cap; in rk817_bat_smooth_algorithm()
2447 __func__, battery->sm_linek, ydsoc, old_cap, in rk817_bat_smooth_algorithm()
2448 battery->sm_remain_cap, delta_cap); in rk817_bat_smooth_algorithm()
2454 battery->smooth_soc += ydsoc; in rk817_bat_smooth_algorithm()
2456 rk817_bat_calc_smooth_dischrg(battery); in rk817_bat_smooth_algorithm()
2458 if (battery->smooth_soc < 0) in rk817_bat_smooth_algorithm()
2459 battery->smooth_soc = 0; in rk817_bat_smooth_algorithm()
2461 tmp_soc = battery->smooth_soc / 1000; in rk817_bat_smooth_algorithm()
2463 if (tmp_soc != battery->dsoc / 1000) { in rk817_bat_smooth_algorithm()
2464 if (battery->smooth_soc < battery->dsoc) in rk817_bat_smooth_algorithm()
2467 battery->dsoc = battery->smooth_soc; in rk817_bat_smooth_algorithm()
2468 if (battery->dsoc <= 0) in rk817_bat_smooth_algorithm()
2469 battery->dsoc = 0; in rk817_bat_smooth_algorithm()
2473 if (battery->s2r) { in rk817_bat_smooth_algorithm()
2474 battery->s2r = false; in rk817_bat_smooth_algorithm()
2475 rk817_bat_calc_sm_linek(battery); in rk817_bat_smooth_algorithm()
2479 battery->smooth_soc, battery->dsoc); in rk817_bat_smooth_algorithm()
2481 delta_cap, battery->dsoc); in rk817_bat_smooth_algorithm()
2484 static void rk817_bat_calc_zero_linek(struct rk817_battery_device *battery) in rk817_bat_calc_zero_linek() argument
2494 if ((abs(battery->current_avg) < 400) && (battery->dsoc / 1000 > 5)) in rk817_bat_calc_zero_linek()
2495 pwroff_vol = battery->pdata->pwroff_vol + 50; in rk817_bat_calc_zero_linek()
2497 pwroff_vol = battery->pdata->pwroff_vol; in rk817_bat_calc_zero_linek()
2500 voltage_avg = rk817_bat_get_battery_voltage(battery); in rk817_bat_calc_zero_linek()
2501 current_avg = rk817_bat_get_avg_current(battery); in rk817_bat_calc_zero_linek()
2506 battery->zero_voltage_avg = voltage_avg; in rk817_bat_calc_zero_linek()
2507 battery->zero_current_avg = current_avg; in rk817_bat_calc_zero_linek()
2508 battery->zero_vsys = vsys; in rk817_bat_calc_zero_linek()
2515 battery->pdata->pwroff_vol, in rk817_bat_calc_zero_linek()
2517 battery->pdata->zero_reserve_dsoc); in rk817_bat_calc_zero_linek()
2521 (battery->bat_res + DEF_PWRPATH_RES) / 1000; in rk817_bat_calc_zero_linek()
2523 ocv_voltage = voltage_avg - (current_avg * battery->bat_res) / 1000; in rk817_bat_calc_zero_linek()
2528 dead_soc = rk817_bat_vol_to_soc(battery, dead_voltage); in rk817_bat_calc_zero_linek()
2529 dead_cap = rk817_bat_vol_to_cap(battery, dead_voltage); in rk817_bat_calc_zero_linek()
2533 ocv_soc = rk817_bat_vol_to_soc(battery, ocv_voltage); in rk817_bat_calc_zero_linek()
2534 ocv_cap = rk817_bat_vol_to_cap(battery, ocv_voltage); in rk817_bat_calc_zero_linek()
2541 battery->zero_dead_voltage = dead_voltage; in rk817_bat_calc_zero_linek()
2542 battery->zero_dead_soc = dead_soc; in rk817_bat_calc_zero_linek()
2543 battery->zero_dead_cap = dead_cap; in rk817_bat_calc_zero_linek()
2545 battery->zero_batvol_to_ocv = ocv_voltage; in rk817_bat_calc_zero_linek()
2546 battery->zero_batocv_to_soc = ocv_soc; in rk817_bat_calc_zero_linek()
2547 battery->zero_batocv_to_cap = ocv_cap; in rk817_bat_calc_zero_linek()
2549 battery->zero_xsoc = xsoc; in rk817_bat_calc_zero_linek()
2561 (battery->dsoc >= battery->pdata->zero_reserve_dsoc)) in rk817_bat_calc_zero_linek()
2564 battery->zero_remain_cap = battery->remain_cap; in rk817_bat_calc_zero_linek()
2565 battery->zero_timeout_cnt = 0; in rk817_bat_calc_zero_linek()
2566 if ((battery->dsoc / 1000 <= 1) && (xsoc > 0)) { in rk817_bat_calc_zero_linek()
2567 battery->zero_linek = 400; in rk817_bat_calc_zero_linek()
2568 battery->zero_drop_sec = 0; in rk817_bat_calc_zero_linek()
2570 battery->zero_drop_sec = 0; in rk817_bat_calc_zero_linek()
2571 battery->zero_linek = in rk817_bat_calc_zero_linek()
2572 (battery->zero_dsoc + xsoc / 2) / DIV(xsoc); in rk817_bat_calc_zero_linek()
2573 /* battery energy mode to use up voltage */ in rk817_bat_calc_zero_linek()
2574 if ((battery->pdata->energy_mode) && in rk817_bat_calc_zero_linek()
2575 (xsoc - battery->dsoc / 1000 >= MIN_ZERO_GAP_XSOC3) && in rk817_bat_calc_zero_linek()
2576 (battery->dsoc / 1000 <= 10) && (battery->zero_linek < 300)) { in rk817_bat_calc_zero_linek()
2577 battery->zero_linek = 300; in rk817_bat_calc_zero_linek()
2580 } else if ((xsoc - battery->dsoc / 1000 >= min_gap_xsoc) || in rk817_bat_calc_zero_linek()
2581 ((xsoc - battery->dsoc / 1000 >= MIN_ZERO_GAP_XSOC2) && in rk817_bat_calc_zero_linek()
2582 (battery->dsoc / 1000 <= 10) && (xsoc > 15))) { in rk817_bat_calc_zero_linek()
2584 battery->dsoc / 1000 >= battery->pdata->zero_reserve_dsoc) in rk817_bat_calc_zero_linek()
2585 battery->zero_linek = 1200; in rk817_bat_calc_zero_linek()
2586 else if (xsoc - battery->dsoc / 1000 >= 2 * min_gap_xsoc) in rk817_bat_calc_zero_linek()
2587 battery->zero_linek = 400; in rk817_bat_calc_zero_linek()
2588 else if (xsoc - battery->dsoc / 1000 >= 3 + min_gap_xsoc) in rk817_bat_calc_zero_linek()
2589 battery->zero_linek = 600; in rk817_bat_calc_zero_linek()
2591 battery->zero_linek = 800; in rk817_bat_calc_zero_linek()
2594 } else if ((battery->zero_linek > 1800) && in rk817_bat_calc_zero_linek()
2595 (battery->dsoc / 1000 > 70)) { in rk817_bat_calc_zero_linek()
2596 battery->zero_linek = 1800; in rk817_bat_calc_zero_linek()
2599 } else if ((battery->zero_linek > 1000) && in rk817_bat_calc_zero_linek()
2600 (battery->zero_linek < 1200)) { in rk817_bat_calc_zero_linek()
2601 battery->zero_linek = 1200; in rk817_bat_calc_zero_linek()
2604 } else if ((battery->dsoc / 1000 <= 15 && battery->dsoc > 5) && in rk817_bat_calc_zero_linek()
2605 (battery->zero_linek <= 1200)) { in rk817_bat_calc_zero_linek()
2607 if ((xsoc - battery->dsoc / 1000) >= min_gap_xsoc) in rk817_bat_calc_zero_linek()
2608 battery->zero_linek = 800; in rk817_bat_calc_zero_linek()
2611 battery->zero_linek = 1200; in rk817_bat_calc_zero_linek()
2614 } else if ((battery->zero_linek < 1000) && in rk817_bat_calc_zero_linek()
2615 (battery->dsoc / 1000 >= 5)) { in rk817_bat_calc_zero_linek()
2616 if ((xsoc - battery->dsoc / 1000) < min_gap_xsoc) { in rk817_bat_calc_zero_linek()
2618 battery->zero_linek = 1200; in rk817_bat_calc_zero_linek()
2620 if (abs(battery->current_avg) > 500)/* heavy */ in rk817_bat_calc_zero_linek()
2621 battery->zero_linek = 900; in rk817_bat_calc_zero_linek()
2623 battery->zero_linek = 1000; in rk817_bat_calc_zero_linek()
2627 } else if ((battery->zero_linek < 1000) && in rk817_bat_calc_zero_linek()
2628 (battery->dsoc / 1000 <= 5)) { in rk817_bat_calc_zero_linek()
2629 if ((xsoc - battery->dsoc / 1000) <= 3) in rk817_bat_calc_zero_linek()
2630 battery->zero_linek = 1200; in rk817_bat_calc_zero_linek()
2632 battery->zero_linek = 800; in rk817_bat_calc_zero_linek()
2637 battery->zero_linek = 1000; in rk817_bat_calc_zero_linek()
2638 if (!battery->zero_drop_sec) in rk817_bat_calc_zero_linek()
2639 battery->zero_drop_sec = get_boot_sec(); in rk817_bat_calc_zero_linek()
2640 if (base2sec(battery->zero_drop_sec) >= WAIT_DSOC_DROP_SEC) { in rk817_bat_calc_zero_linek()
2641 DBG("ZERO0: t=%lu\n", base2sec(battery->zero_drop_sec)); in rk817_bat_calc_zero_linek()
2642 battery->zero_drop_sec = 0; in rk817_bat_calc_zero_linek()
2643 battery->dsoc -= 1000; in rk817_bat_calc_zero_linek()
2644 if (battery->dsoc < 0) in rk817_bat_calc_zero_linek()
2645 battery->dsoc = 0; in rk817_bat_calc_zero_linek()
2646 battery->zero_dsoc = battery->dsoc; in rk817_bat_calc_zero_linek()
2651 if (!battery->shtd_drop_sec) in rk817_bat_calc_zero_linek()
2652 battery->shtd_drop_sec = get_boot_sec(); in rk817_bat_calc_zero_linek()
2653 if (base2sec(battery->shtd_drop_sec) > WAIT_SHTD_DROP_SEC) { in rk817_bat_calc_zero_linek()
2654 DBG("voltage extreme low...soc:%d->0\n", battery->dsoc); in rk817_bat_calc_zero_linek()
2655 battery->shtd_drop_sec = 0; in rk817_bat_calc_zero_linek()
2656 battery->dsoc = 0; in rk817_bat_calc_zero_linek()
2659 battery->shtd_drop_sec = 0; in rk817_bat_calc_zero_linek()
2662 DBG("Zero: zero_linek = %d\n", battery->zero_linek); in rk817_bat_calc_zero_linek()
2665 static void rk817_bat_zero_algo_prepare(struct rk817_battery_device *battery) in rk817_bat_zero_algo_prepare() argument
2669 tmp_dsoc = battery->zero_dsoc / 1000; in rk817_bat_zero_algo_prepare()
2671 if (tmp_dsoc != battery->smooth_soc / 1000) in rk817_bat_zero_algo_prepare()
2672 battery->zero_dsoc = battery->smooth_soc; in rk817_bat_zero_algo_prepare()
2674 DBG("zero_smooth: zero_dsoc = %d\n", battery->zero_dsoc); in rk817_bat_zero_algo_prepare()
2676 rk817_bat_calc_zero_linek(battery); in rk817_bat_zero_algo_prepare()
2679 static void rk817_bat_calc_zero_algorithm(struct rk817_battery_device *battery) in rk817_bat_calc_zero_algorithm() argument
2683 tmp_soc = battery->zero_dsoc / 1000; in rk817_bat_calc_zero_algorithm()
2685 if (tmp_soc == battery->dsoc / 1000) in rk817_bat_calc_zero_algorithm()
2688 if (battery->zero_dsoc > battery->dsoc) in rk817_bat_calc_zero_algorithm()
2691 if (battery->zero_dsoc < battery->dsoc - 1000) in rk817_bat_calc_zero_algorithm()
2692 battery->dsoc -= 1000; in rk817_bat_calc_zero_algorithm()
2694 battery->dsoc = battery->zero_dsoc; in rk817_bat_calc_zero_algorithm()
2697 static void rk817_bat_zero_algorithm(struct rk817_battery_device *battery) in rk817_bat_zero_algorithm() argument
2701 battery->zero_timeout_cnt++; in rk817_bat_zero_algorithm()
2702 delta_cap = battery->zero_remain_cap - battery->remain_cap; in rk817_bat_zero_algorithm()
2703 delta_soc = battery->zero_linek * delta_cap / DIV(battery->fcc) / 10; in rk817_bat_zero_algorithm()
2710 battery->zero_dead_voltage, in rk817_bat_zero_algorithm()
2711 battery->zero_dead_soc, in rk817_bat_zero_algorithm()
2712 battery->zero_dead_cap, in rk817_bat_zero_algorithm()
2713 battery->pdata->pwroff_vol); in rk817_bat_zero_algorithm()
2719 battery->zero_voltage_avg, in rk817_bat_zero_algorithm()
2720 battery->zero_current_avg, in rk817_bat_zero_algorithm()
2721 battery->zero_batvol_to_ocv, in rk817_bat_zero_algorithm()
2722 battery->zero_batocv_to_soc, in rk817_bat_zero_algorithm()
2723 battery->zero_batocv_to_cap); in rk817_bat_zero_algorithm()
2725 battery->zero_xsoc, battery->pdata->zero_reserve_dsoc); in rk817_bat_zero_algorithm()
2727 battery->zero_remain_cap, battery->remain_cap); in rk817_bat_zero_algorithm()
2729 delta_cap, battery->zero_linek, delta_soc); in rk817_bat_zero_algorithm()
2733 (battery->zero_timeout_cnt > MIN_ZERO_OVERCNT) || in rk817_bat_zero_algorithm()
2734 (battery->zero_linek == 0)) { in rk817_bat_zero_algorithm()
2736 battery->zero_timeout_cnt = 0; in rk817_bat_zero_algorithm()
2737 battery->zero_dsoc -= delta_soc; in rk817_bat_zero_algorithm()
2738 rk817_bat_calc_zero_algorithm(battery); in rk817_bat_zero_algorithm()
2739 DBG("Zero: dsoc: %d\n", battery->dsoc); in rk817_bat_zero_algorithm()
2740 rk817_bat_calc_zero_linek(battery); in rk817_bat_zero_algorithm()
2743 if ((battery->rsoc / 1000 < 1) && in rk817_bat_zero_algorithm()
2744 (battery->zero_batocv_to_cap > battery->fcc / 100)) { in rk817_bat_zero_algorithm()
2746 rk817_bat_init_coulomb_cap(battery, in rk817_bat_zero_algorithm()
2747 battery->zero_batocv_to_cap); in rk817_bat_zero_algorithm()
2748 rk817_bat_calc_zero_linek(battery); in rk817_bat_zero_algorithm()
2752 static void rk817_bat_finish_algorithm(struct rk817_battery_device *battery) in rk817_bat_finish_algorithm() argument
2758 if ((battery->remain_cap != battery->fcc) && in rk817_bat_finish_algorithm()
2759 (get_charge_status(battery) == CHARGE_FINISH)) { in rk817_bat_finish_algorithm()
2760 battery->age_adjust_cap += in rk817_bat_finish_algorithm()
2761 (battery->fcc * 1000 - battery->remain_cap); in rk817_bat_finish_algorithm()
2762 rk817_bat_init_coulomb_cap(battery, battery->fcc); in rk817_bat_finish_algorithm()
2763 rk817_bat_get_capacity_mah(battery); in rk817_bat_finish_algorithm()
2767 if (battery->dsoc < 100 * 1000) { in rk817_bat_finish_algorithm()
2768 if (!battery->finish_base) in rk817_bat_finish_algorithm()
2769 battery->finish_base = get_boot_sec(); in rk817_bat_finish_algorithm()
2771 finish_current = (battery->rsoc - battery->dsoc) > FINISH_MAX_SOC_DELAY ? in rk817_bat_finish_algorithm()
2773 finish_sec = base2sec(battery->finish_base); in rk817_bat_finish_algorithm()
2775 soc_sec = battery->fcc * 3600 / 100 / DIV(finish_current); in rk817_bat_finish_algorithm()
2779 battery->dsoc += plus_soc * 1000; in rk817_bat_finish_algorithm()
2780 battery->finish_base = get_boot_sec(); in rk817_bat_finish_algorithm()
2781 if (battery->finish_base > rest) in rk817_bat_finish_algorithm()
2782 battery->finish_base = get_boot_sec() - rest; in rk817_bat_finish_algorithm()
2786 battery->dsoc, soc_sec, finish_sec, plus_soc, rest); in rk817_bat_finish_algorithm()
2787 DBG("battery->age_adjust_cap = %d\n", battery->age_adjust_cap); in rk817_bat_finish_algorithm()
2791 static void rk817_bat_display_smooth(struct rk817_battery_device *battery) in rk817_bat_display_smooth() argument
2794 if (battery->s2r && !battery->sleep_chrg_online) { in rk817_bat_display_smooth()
2796 battery->s2r = false; in rk817_bat_display_smooth()
2797 rk817_bat_zero_algo_prepare(battery); in rk817_bat_display_smooth()
2798 rk817_bat_smooth_algo_prepare(battery); in rk817_bat_display_smooth()
2802 if (battery->work_mode == MODE_FINISH) { in rk817_bat_display_smooth()
2804 rk817_bat_finish_algorithm(battery); in rk817_bat_display_smooth()
2806 if ((get_charge_status(battery) != CHARGE_FINISH) && in rk817_bat_display_smooth()
2807 !rk817_bat_fake_finish_mode(battery)) { in rk817_bat_display_smooth()
2808 if ((battery->current_avg < 0) && in rk817_bat_display_smooth()
2809 (battery->voltage_avg < battery->pdata->zero_algorithm_vol)) { in rk817_bat_display_smooth()
2811 rk817_bat_zero_algo_prepare(battery); in rk817_bat_display_smooth()
2812 battery->work_mode = MODE_ZERO; in rk817_bat_display_smooth()
2815 rk817_bat_smooth_algo_prepare(battery); in rk817_bat_display_smooth()
2816 battery->work_mode = MODE_SMOOTH; in rk817_bat_display_smooth()
2819 } else if (battery->work_mode == MODE_ZERO) { in rk817_bat_display_smooth()
2821 rk817_bat_zero_algorithm(battery); in rk817_bat_display_smooth()
2822 if ((battery->voltage_avg >= in rk817_bat_display_smooth()
2823 battery->pdata->zero_algorithm_vol + 50) || in rk817_bat_display_smooth()
2824 (battery->current_avg >= 0)) { in rk817_bat_display_smooth()
2826 rk817_bat_smooth_algo_prepare(battery); in rk817_bat_display_smooth()
2827 battery->work_mode = MODE_SMOOTH; in rk817_bat_display_smooth()
2828 } else if ((get_charge_status(battery) == CHARGE_FINISH) || in rk817_bat_display_smooth()
2829 rk817_bat_fake_finish_mode(battery)) { in rk817_bat_display_smooth()
2831 rk817_bat_finish_algo_prepare(battery); in rk817_bat_display_smooth()
2832 battery->work_mode = MODE_FINISH; in rk817_bat_display_smooth()
2836 rk817_bat_smooth_algorithm(battery); in rk817_bat_display_smooth()
2837 if ((battery->current_avg < 0) && in rk817_bat_display_smooth()
2838 (battery->voltage_avg < in rk817_bat_display_smooth()
2839 battery->pdata->zero_algorithm_vol)) { in rk817_bat_display_smooth()
2841 rk817_bat_zero_algo_prepare(battery); in rk817_bat_display_smooth()
2842 battery->work_mode = MODE_ZERO; in rk817_bat_display_smooth()
2843 } else if ((get_charge_status(battery) == CHARGE_FINISH) || in rk817_bat_display_smooth()
2844 rk817_bat_fake_finish_mode(battery)) { in rk817_bat_display_smooth()
2846 rk817_bat_finish_algo_prepare(battery); in rk817_bat_display_smooth()
2847 battery->work_mode = MODE_FINISH; in rk817_bat_display_smooth()
2852 static void rk817_bat_output_info(struct rk817_battery_device *battery) in rk817_bat_output_info() argument
2855 DBG("info: voltage_k = %d\n", battery->voltage_k); in rk817_bat_output_info()
2856 DBG("info: voltage_b = %d\n", battery->voltage_b); in rk817_bat_output_info()
2857 DBG("info: voltage = %d\n", battery->voltage_avg); in rk817_bat_output_info()
2858 DBG("info: voltage_sys = %d\n", battery->voltage_sys); in rk817_bat_output_info()
2859 DBG("info: current = %d\n", battery->current_avg); in rk817_bat_output_info()
2861 DBG("info: FCC = %d\n", battery->fcc); in rk817_bat_output_info()
2862 DBG("info: remain_cap = %d\n", battery->remain_cap); in rk817_bat_output_info()
2863 DBG("info: sm_remain_cap = %d\n", battery->sm_remain_cap); in rk817_bat_output_info()
2864 DBG("info: sm_link = %d\n", battery->sm_linek); in rk817_bat_output_info()
2865 DBG("info: smooth_soc = %d\n", battery->smooth_soc); in rk817_bat_output_info()
2867 DBG("info: zero_remain_cap = %d\n", battery->zero_remain_cap); in rk817_bat_output_info()
2868 DBG("info: zero_link = %d\n", battery->zero_linek); in rk817_bat_output_info()
2869 DBG("info: zero_dsoc = %d\n", battery->zero_dsoc); in rk817_bat_output_info()
2871 DBG("info: remain_cap = %d\n", battery->remain_cap); in rk817_bat_output_info()
2873 battery->dsoc, battery->dsoc / 1000); in rk817_bat_output_info()
2874 DBG("info: rsoc = %d\n", battery->rsoc); in rk817_bat_output_info()
2880 struct rk817_battery_device *battery = in rk817_battery_work() local
2885 rk817_bat_update_info(battery); in rk817_battery_work()
2886 rk817_bat_lowpwr_check(battery); in rk817_battery_work()
2887 rk817_bat_display_smooth(battery); in rk817_battery_work()
2888 rk817_bat_power_supply_changed(battery); in rk817_battery_work()
2889 rk817_bat_save_data(battery); in rk817_battery_work()
2890 rk817_bat_output_info(battery); in rk817_battery_work()
2892 if (rk817_bat_field_read(battery, CUR_CALIB_UPD)) { in rk817_battery_work()
2893 rk817_bat_current_calibration(battery); in rk817_battery_work()
2894 rk817_bat_init_voltage_kb(battery); in rk817_battery_work()
2895 rk817_bat_field_write(battery, CUR_CALIB_UPD, 0x01); in rk817_battery_work()
2898 queue_delayed_work(battery->bat_monitor_wq, &battery->bat_delay_work, in rk817_battery_work()
2899 msecs_to_jiffies(battery->monitor_ms)); in rk817_battery_work()
2904 struct rk817_battery_device *battery; in rk809_plug_in_isr() local
2906 battery = (struct rk817_battery_device *)cg; in rk809_plug_in_isr()
2907 battery->plugin_trigger = 1; in rk809_plug_in_isr()
2908 battery->plugout_trigger = 0; in rk809_plug_in_isr()
2909 power_supply_changed(battery->bat); in rk809_plug_in_isr()
2910 if (battery->is_register_chg_psy) in rk809_plug_in_isr()
2911 power_supply_changed(battery->chg_psy); in rk809_plug_in_isr()
2918 struct rk817_battery_device *battery; in rk809_plug_out_isr() local
2920 battery = (struct rk817_battery_device *)cg; in rk809_plug_out_isr()
2921 battery->plugin_trigger = 0; in rk809_plug_out_isr()
2922 battery->plugout_trigger = 1; in rk809_plug_out_isr()
2923 power_supply_changed(battery->bat); in rk809_plug_out_isr()
2924 if (battery->is_register_chg_psy) in rk809_plug_out_isr()
2925 power_supply_changed(battery->chg_psy); in rk809_plug_out_isr()
2930 static int rk809_charge_init_irqs(struct rk817_battery_device *battery) in rk809_charge_init_irqs() argument
2932 struct rk808 *rk817 = battery->rk817; in rk809_charge_init_irqs()
2933 struct platform_device *pdev = battery->pdev; in rk809_charge_init_irqs()
2936 battery->plugin_trigger = 0; in rk809_charge_init_irqs()
2937 battery->plugout_trigger = 0; in rk809_charge_init_irqs()
2941 dev_err(battery->dev, "plug_in_irq request failed!\n"); in rk809_charge_init_irqs()
2947 dev_err(battery->dev, "plug_out_irq request failed!\n"); in rk809_charge_init_irqs()
2951 ret = devm_request_threaded_irq(battery->dev, plug_in_irq, NULL, in rk809_charge_init_irqs()
2954 "rk817_plug_in", battery); in rk809_charge_init_irqs()
2960 ret = devm_request_threaded_irq(battery->dev, plug_out_irq, NULL, in rk809_charge_init_irqs()
2963 "rk817_plug_out", battery); in rk809_charge_init_irqs()
2969 if (rk817_bat_field_read(battery, PLUG_IN_STS)) { in rk809_charge_init_irqs()
2970 battery->plugin_trigger = 1; in rk809_charge_init_irqs()
2971 battery->plugout_trigger = 0; in rk809_charge_init_irqs()
2979 { .compatible = "rk817,battery", },
2993 struct rk817_battery_device *battery; in rk817_battery_probe() local
3003 battery = devm_kzalloc(&client->dev, sizeof(*battery), GFP_KERNEL); in rk817_battery_probe()
3004 if (!battery) in rk817_battery_probe()
3007 battery->rk817 = rk817; in rk817_battery_probe()
3008 battery->client = client; in rk817_battery_probe()
3009 battery->dev = &pdev->dev; in rk817_battery_probe()
3010 platform_set_drvdata(pdev, battery); in rk817_battery_probe()
3011 battery->chip_id = rk817->variant; in rk817_battery_probe()
3013 battery->regmap = rk817->regmap; in rk817_battery_probe()
3014 if (IS_ERR(battery->regmap)) { in rk817_battery_probe()
3015 dev_err(battery->dev, "Failed to initialize regmap\n"); in rk817_battery_probe()
3022 battery->rmap_fields[i] = in rk817_battery_probe()
3023 devm_regmap_field_alloc(battery->dev, in rk817_battery_probe()
3024 battery->regmap, in rk817_battery_probe()
3026 if (IS_ERR(battery->rmap_fields[i])) { in rk817_battery_probe()
3027 dev_err(battery->dev, "cannot allocate regmap field\n"); in rk817_battery_probe()
3028 return PTR_ERR(battery->rmap_fields[i]); in rk817_battery_probe()
3032 ret = rk817_bat_parse_dt(battery); in rk817_battery_probe()
3034 dev_err(battery->dev, "battery parse dt failed!\n"); in rk817_battery_probe()
3038 rk817_bat_init_info(battery); in rk817_battery_probe()
3039 rk817_bat_init_fg(battery); in rk817_battery_probe()
3041 rk817_battery_debug_info(battery); in rk817_battery_probe()
3042 rk817_bat_update_info(battery); in rk817_battery_probe()
3044 rk817_bat_output_info(battery); in rk817_battery_probe()
3045 battery->bat_monitor_wq = alloc_ordered_workqueue("%s", in rk817_battery_probe()
3047 INIT_DELAYED_WORK(&battery->bat_delay_work, rk817_battery_work); in rk817_battery_probe()
3048 queue_delayed_work(battery->bat_monitor_wq, &battery->bat_delay_work, in rk817_battery_probe()
3050 INIT_WORK(&battery->resume_work, rk817_bat_resume_work); in rk817_battery_probe()
3052 ret = rk817_bat_init_power_supply(battery); in rk817_battery_probe()
3054 dev_err(battery->dev, "rk817 power supply register failed!\n"); in rk817_battery_probe()
3057 if (battery->is_register_chg_psy) { in rk817_battery_probe()
3058 ret = rk809_chg_init_power_supply(battery); in rk817_battery_probe()
3060 dev_err(battery->dev, "rk809 chg psy init failed!\n"); in rk817_battery_probe()
3065 if (battery->chip_id == RK809_ID) in rk817_battery_probe()
3066 rk809_charge_init_irqs(battery); in rk817_battery_probe()
3068 wake_lock_init(&battery->wake_lock, WAKE_LOCK_SUSPEND, in rk817_battery_probe()
3071 DBG("name: 0x%x", rk817_bat_field_read(battery, CHIP_NAME_H)); in rk817_battery_probe()
3072 DBG("%x\n", rk817_bat_field_read(battery, CHIP_NAME_L)); in rk817_battery_probe()
3107 struct rk817_battery_device *battery = dev_get_drvdata(&pdev->dev); in rk817_bat_pm_suspend() local
3109 cancel_delayed_work_sync(&battery->bat_delay_work); in rk817_bat_pm_suspend()
3111 battery->s2r = false; in rk817_bat_pm_suspend()
3112 battery->sleep_chrg_status = get_charge_status(battery); in rk817_bat_pm_suspend()
3113 battery->current_avg = rk817_bat_get_avg_current(battery); in rk817_bat_pm_suspend()
3114 if (battery->current_avg > 0 || in rk817_bat_pm_suspend()
3115 (battery->sleep_chrg_status == CC_OR_CV_CHRG) || in rk817_bat_pm_suspend()
3116 (battery->sleep_chrg_status == CHARGE_FINISH)) in rk817_bat_pm_suspend()
3117 battery->sleep_chrg_online = 1; in rk817_bat_pm_suspend()
3119 battery->sleep_chrg_online = 0; in rk817_bat_pm_suspend()
3121 battery->remain_cap = rk817_bat_get_capacity_uah(battery); in rk817_bat_pm_suspend()
3122 battery->rsoc = rk817_bat_get_rsoc(battery); in rk817_bat_pm_suspend()
3124 battery->rtc_base = rk817_get_rtc_sec(); in rk817_bat_pm_suspend()
3125 rk817_bat_save_data(battery); in rk817_bat_pm_suspend()
3127 if (battery->sleep_chrg_status != CHARGE_FINISH) in rk817_bat_pm_suspend()
3128 battery->finish_base = get_boot_sec(); in rk817_bat_pm_suspend()
3130 if ((battery->work_mode == MODE_ZERO) && in rk817_bat_pm_suspend()
3131 (battery->current_avg >= 0)) { in rk817_bat_pm_suspend()
3136 if (battery->sleep_chrg_status == CHARGE_FINISH) { in rk817_bat_pm_suspend()
3137 battery->work_mode = MODE_FINISH; in rk817_bat_pm_suspend()
3138 if (!battery->finish_base) in rk817_bat_pm_suspend()
3139 battery->finish_base = get_boot_sec(); in rk817_bat_pm_suspend()
3141 battery->work_mode = MODE_SMOOTH; in rk817_bat_pm_suspend()
3142 rk817_bat_smooth_algo_prepare(battery); in rk817_bat_pm_suspend()
3149 battery->dsoc, battery->rsoc, battery->current_avg, in rk817_bat_pm_suspend()
3150 rk817_bat_get_battery_voltage(battery), in rk817_bat_pm_suspend()
3151 rk817_bat_get_capacity_uah(battery), in rk817_bat_pm_suspend()
3152 battery->sleep_dischrg_sec, battery->sleep_chrg_online); in rk817_bat_pm_suspend()
3153 DBG("battery->sleep_chrg_status=%d\n", battery->sleep_chrg_status); in rk817_bat_pm_suspend()
3158 static int rk817_bat_rtc_sleep_sec(struct rk817_battery_device *battery) in rk817_bat_rtc_sleep_sec() argument
3162 interval_sec = rk817_get_rtc_sec() - battery->rtc_base; in rk817_bat_rtc_sleep_sec()
3167 static void rk817_bat_relife_age_flag(struct rk817_battery_device *battery) in rk817_bat_relife_age_flag() argument
3171 if (battery->voltage_relax <= 0) in rk817_bat_relife_age_flag()
3174 ocv_soc = rk817_bat_vol_to_soc(battery, battery->voltage_relax); in rk817_bat_relife_age_flag()
3175 ocv_cap = rk817_bat_vol_to_cap(battery, battery->voltage_relax); in rk817_bat_relife_age_flag()
3177 ocv_soc, battery->sleep_dischrg_sec / 60, battery->voltage_relax); in rk817_bat_relife_age_flag()
3180 if (!battery->age_allow_update && ocv_soc <= 10) { in rk817_bat_relife_age_flag()
3181 battery->age_voltage = battery->voltage_relax; in rk817_bat_relife_age_flag()
3182 battery->age_ocv_cap = ocv_cap; in rk817_bat_relife_age_flag()
3183 battery->age_ocv_soc = ocv_soc; in rk817_bat_relife_age_flag()
3184 battery->age_adjust_cap = 0; in rk817_bat_relife_age_flag()
3187 battery->age_level = 100; in rk817_bat_relife_age_flag()
3189 battery->age_level = 90; in rk817_bat_relife_age_flag()
3191 battery->age_level = 80; in rk817_bat_relife_age_flag()
3193 /*soc_level = rk818_bat_get_age_level(battery);*/ in rk817_bat_relife_age_flag()
3195 if (soc_level > battery->age_level) { in rk817_bat_relife_age_flag()
3196 battery->age_allow_update = false; in rk817_bat_relife_age_flag()
3198 battery->age_allow_update = true; in rk817_bat_relife_age_flag()
3199 battery->age_keep_sec = get_boot_sec(); in rk817_bat_relife_age_flag()
3205 battery->age_voltage, battery->age_ocv_cap, in rk817_bat_relife_age_flag()
3207 battery->age_allow_update, battery->age_level); in rk817_bat_relife_age_flag()
3211 static void rk817_bat_init_capacity(struct rk817_battery_device *battery, in rk817_bat_init_capacity() argument
3216 delta_cap = cap - battery->remain_cap; in rk817_bat_init_capacity()
3220 battery->age_adjust_cap += delta_cap; in rk817_bat_init_capacity()
3221 rk817_bat_init_coulomb_cap(battery, cap); in rk817_bat_init_capacity()
3222 rk817_bat_smooth_algo_prepare(battery); in rk817_bat_init_capacity()
3223 rk817_bat_zero_algo_prepare(battery); in rk817_bat_init_capacity()
3226 static void rk817_bat_relax_vol_calib(struct rk817_battery_device *battery) in rk817_bat_relax_vol_calib() argument
3230 vol = battery->voltage_relax; in rk817_bat_relax_vol_calib()
3231 soc = rk817_bat_vol_to_soc(battery, vol); in rk817_bat_relax_vol_calib()
3232 cap = rk817_bat_vol_to_cap(battery, vol); in rk817_bat_relax_vol_calib()
3233 rk817_bat_init_capacity(battery, cap); in rk817_bat_relax_vol_calib()
3237 static int rk817_bat_sleep_dischrg(struct rk817_battery_device *battery) in rk817_bat_sleep_dischrg() argument
3241 int pwroff_vol = battery->pdata->pwroff_vol; in rk817_bat_sleep_dischrg()
3242 unsigned long sleep_sec = battery->sleep_dischrg_sec; in rk817_bat_sleep_dischrg()
3246 __func__, battery->dsoc, battery->rsoc, battery->voltage_relax, in rk817_bat_sleep_dischrg()
3247 battery->voltage_avg, sleep_sec / 60); in rk817_bat_sleep_dischrg()
3249 if (battery->voltage_relax >= battery->voltage_avg) { in rk817_bat_sleep_dischrg()
3250 rk817_bat_relax_vol_calib(battery); in rk817_bat_sleep_dischrg()
3251 rk817_bat_restart_relax(battery); in rk817_bat_sleep_dischrg()
3252 rk817_bat_relife_age_flag(battery); in rk817_bat_sleep_dischrg()
3257 if (battery->dsoc <= battery->rsoc) { in rk817_bat_sleep_dischrg()
3258 if (battery->pdata->low_pwr_sleep) in rk817_bat_sleep_dischrg()
3262 battery->sleep_sum_cap = (sleep_cur * sleep_sec / 3600); in rk817_bat_sleep_dischrg()
3263 sleep_soc = battery->sleep_sum_cap * 100 / DIV(battery->fcc); in rk817_bat_sleep_dischrg()
3264 tgt_dsoc = battery->dsoc - sleep_soc * 1000; in rk817_bat_sleep_dischrg()
3267 battery->rsoc, battery->dsoc, sleep_soc); in rk817_bat_sleep_dischrg()
3268 if (battery->dsoc / 1000 < 5) { in rk817_bat_sleep_dischrg()
3269 battery->dsoc -= 1000; in rk817_bat_sleep_dischrg()
3271 (battery->dsoc / 1000 >= 5)) { in rk817_bat_sleep_dischrg()
3272 if (battery->dsoc / 1000 == 5) in rk817_bat_sleep_dischrg()
3273 battery->dsoc -= 1000; in rk817_bat_sleep_dischrg()
3275 battery->dsoc = 5 * 1000; in rk817_bat_sleep_dischrg()
3277 battery->dsoc = tgt_dsoc; in rk817_bat_sleep_dischrg()
3282 __func__, battery->sleep_sum_cap, sleep_soc, tgt_dsoc); in rk817_bat_sleep_dischrg()
3285 if (battery->pdata->low_pwr_sleep) in rk817_bat_sleep_dischrg()
3289 battery->sleep_sum_cap = (sleep_cur * sleep_sec / 3600); in rk817_bat_sleep_dischrg()
3290 sleep_soc = battery->sleep_sum_cap / DIV(battery->fcc / 100); in rk817_bat_sleep_dischrg()
3291 gap_soc = battery->dsoc - battery->rsoc; in rk817_bat_sleep_dischrg()
3294 battery->rsoc, battery->dsoc, sleep_soc); in rk817_bat_sleep_dischrg()
3297 battery->dsoc -= (sleep_soc * 2 * 1000); in rk817_bat_sleep_dischrg()
3299 battery->dsoc -= sleep_soc * 1000; in rk817_bat_sleep_dischrg()
3301 battery->dsoc = battery->rsoc; in rk817_bat_sleep_dischrg()
3305 __func__, battery->sleep_sum_cap, sleep_soc, gap_soc); in rk817_bat_sleep_dischrg()
3308 if (battery->voltage_avg <= pwroff_vol - 70) { in rk817_bat_sleep_dischrg()
3309 battery->dsoc = 0; in rk817_bat_sleep_dischrg()
3310 DBG("low power sleeping, shutdown... %d\n", battery->dsoc); in rk817_bat_sleep_dischrg()
3314 (battery->rsoc - battery->dsoc) < 5000 && in rk817_bat_sleep_dischrg()
3315 battery->dsoc < 40 * 1000) { in rk817_bat_sleep_dischrg()
3316 battery->dsoc -= 1000; in rk817_bat_sleep_dischrg()
3317 DBG("low power sleeping, reserved... %d\n", battery->dsoc); in rk817_bat_sleep_dischrg()
3320 if (battery->dsoc <= 0) { in rk817_bat_sleep_dischrg()
3321 battery->dsoc = 0; in rk817_bat_sleep_dischrg()
3322 DBG("sleep dsoc is %d...\n", battery->dsoc); in rk817_bat_sleep_dischrg()
3326 __func__, battery->dsoc, battery->rsoc, battery->sleep_sum_cap); in rk817_bat_sleep_dischrg()
3333 …struct rk817_battery_device *battery = container_of(work, struct rk817_battery_device, resume_work… in rk817_bat_resume_work() local
3336 battery->s2r = true; in rk817_bat_resume_work()
3337 battery->current_avg = rk817_bat_get_avg_current(battery); in rk817_bat_resume_work()
3338 battery->voltage_relax = rk817_bat_get_relax_voltage(battery); in rk817_bat_resume_work()
3339 battery->voltage_avg = rk817_bat_get_battery_voltage(battery); in rk817_bat_resume_work()
3340 battery->remain_cap = rk817_bat_get_capacity_uah(battery); in rk817_bat_resume_work()
3341 battery->rsoc = rk817_bat_get_rsoc(battery); in rk817_bat_resume_work()
3342 interval_sec = rk817_bat_rtc_sleep_sec(battery); in rk817_bat_resume_work()
3343 battery->sleep_sum_sec += interval_sec; in rk817_bat_resume_work()
3344 pwroff_vol = battery->pdata->pwroff_vol; in rk817_bat_resume_work()
3346 if (!battery->sleep_chrg_online) { in rk817_bat_resume_work()
3348 battery->sleep_dischrg_sec += interval_sec; in rk817_bat_resume_work()
3349 if (battery->voltage_avg <= pwroff_vol + 50) in rk817_bat_resume_work()
3357 battery->dsoc, battery->rsoc, battery->current_avg, in rk817_bat_resume_work()
3358 battery->voltage_avg, battery->voltage_relax, in rk817_bat_resume_work()
3359 rk817_bat_get_capacity_uah(battery), interval_sec, in rk817_bat_resume_work()
3360 battery->sleep_dischrg_sec, battery->sleep_chrg_online, in rk817_bat_resume_work()
3364 if ((!battery->sleep_chrg_online) && in rk817_bat_resume_work()
3365 (battery->sleep_dischrg_sec > time_step)) { in rk817_bat_resume_work()
3366 if (rk817_bat_sleep_dischrg(battery)) in rk817_bat_resume_work()
3367 battery->sleep_dischrg_sec = 0; in rk817_bat_resume_work()
3370 rk817_bat_save_data(battery); in rk817_bat_resume_work()
3372 /* charge/lowpower lock: for battery work to update dsoc and rsoc */ in rk817_bat_resume_work()
3373 if ((battery->sleep_chrg_online) || in rk817_bat_resume_work()
3374 (!battery->sleep_chrg_online && in rk817_bat_resume_work()
3375 battery->voltage_avg < battery->pdata->pwroff_vol)) in rk817_bat_resume_work()
3376 wake_lock_timeout(&battery->wake_lock, msecs_to_jiffies(2000)); in rk817_bat_resume_work()
3378 queue_delayed_work(battery->bat_monitor_wq, &battery->bat_delay_work, in rk817_bat_resume_work()
3384 struct rk817_battery_device *battery = dev_get_drvdata(dev); in rk817_bat_pm_resume() local
3386 queue_work(battery->bat_monitor_wq, &battery->resume_work); in rk817_bat_pm_resume()
3400 .name = "rk817-battery",
3418 MODULE_DESCRIPTION("RK817 Battery driver");