Lines Matching +full:abs +full:- +full:flat

5  * Author: chenjh <chenjh@rock-chips.com>
51 #define BAT_INFO(fmt, args...) pr_info("rk816-bat: "fmt, ##args)
316 return (get_boot_sec() > x) ? (get_boot_sec() - x) : 0; in base2sec()
337 d = (value - table[i - 1]) * (MAX_INTERPOLATE / (size - 1)); in interpolate()
338 d /= table[i] - table[i - 1]; in interpolate()
339 d = d + (i - 1) * (MAX_INTERPOLATE / (size - 1)); in interpolate()
360 c = -c; in ab_div_c()
367 ans = -ans; in ab_div_c()
376 ret = regmap_read(di->regmap, reg, &val); in rk816_bat_read()
378 dev_err(di->dev, "read reg:0x%x failed\n", reg); in rk816_bat_read()
387 ret = regmap_write(di->regmap, reg, buf); in rk816_bat_write()
389 dev_err(di->dev, "i2c write reg: 0x%2x error\n", reg); in rk816_bat_write()
398 ret = regmap_update_bits(di->regmap, reg, mask, buf); in rk816_bat_set_bits()
400 dev_err(di->dev, "write reg:0x%x failed\n", reg); in rk816_bat_set_bits()
409 ret = regmap_update_bits(di->regmap, reg, mask, 0); in rk816_bat_clear_bits()
411 dev_err(di->dev, "clr reg:0x%02x failed\n", reg); in rk816_bat_clear_bits()
423 DBG("dump regs from: 0x%x-->0x%x\n", start, end); in rk816_bat_dump_regs()
430 return (di->usb_in || di->ac_in || di->dc_in) ? true : false; in rk816_bat_chrg_online()
442 if (!di->over_20mR) in rk816_bat_get_coulomb_cap()
443 cap = RES_FAC_MUX(val / 2390, di->res_fac); in rk816_bat_get_coulomb_cap()
445 cap = RES_FAC_DIV(val / 2390, di->res_fac); in rk816_bat_get_coulomb_cap()
455 return (remain_cap + di->fcc / 200) * 100 / DIV(di->fcc); in rk816_bat_get_rsoc()
467 dev_err(di->dev, "error! cmd require only one args\n"); in bat_info_store()
598 di->voltage_k = (4200 - 3000) * 1000 / DIV(vcalib1 - vcalib0); in rk816_bat_init_voltage_kb()
599 di->voltage_b = 4200 - (di->voltage_k * vcalib1) / 1000; in rk816_bat_init_voltage_kb()
601 DBG("voltage_k=%d(*1000),voltage_b=%d\n", di->voltage_k, di->voltage_b); in rk816_bat_init_voltage_kb()
610 vol = di->voltage_k * val / 1000 + di->voltage_b; in rk816_bat_get_ocv_voltage()
621 vol = di->voltage_k * val / 1000 + di->voltage_b; in rk816_bat_get_avg_voltage()
632 vol = di->voltage_k * val / 1000 + di->voltage_b; in rk816_bat_get_usb_voltage()
654 vol = di->voltage_k * val / 1000 + di->voltage_b; in rk816_bat_get_relax_vol1()
665 vol = di->voltage_k * val / 1000 + di->voltage_b; in rk816_bat_get_relax_vol2()
690 val -= 4096; in rk816_bat_get_avg_current()
692 if (!di->over_20mR) in rk816_bat_get_avg_current()
693 cur = RES_FAC_MUX(val * 1506, di->res_fac) / 1000; in rk816_bat_get_avg_current()
695 cur = RES_FAC_DIV(val * 1506, di->res_fac) / 1000; in rk816_bat_get_avg_current()
707 val -= 4096; in rk816_bat_get_relax_cur1()
719 val -= 4096; in rk816_bat_get_relax_cur2()
742 ocv_table = di->pdata->ocv_table; in rk816_bat_vol_to_ocvsoc()
743 ocv_size = di->pdata->ocv_size; in rk816_bat_vol_to_ocvsoc()
755 ocv_table = di->pdata->ocv_table; in rk816_bat_vol_to_ocvcap()
756 ocv_size = di->pdata->ocv_size; in rk816_bat_vol_to_ocvcap()
758 cap = ab_div_c(temp, di->fcc, MAX_INTERPOLATE); in rk816_bat_vol_to_ocvcap()
768 ocv_table = di->pdata->zero_table; in rk816_bat_vol_to_zerosoc()
769 ocv_size = di->pdata->ocv_size; in rk816_bat_vol_to_zerosoc()
781 ocv_table = di->pdata->zero_table; in rk816_bat_vol_to_zerocap()
782 ocv_size = di->pdata->ocv_size; in rk816_bat_vol_to_zerocap()
784 cap = ab_div_c(temp, di->fcc, MAX_INTERPOLATE); in rk816_bat_vol_to_zerocap()
796 val -= 4096; in rk816_bat_get_iadc()
810 if ((di->chrg_status != CHARGE_FINISH) || in rk816_bat_adc_calib()
811 (di->adc_calib_cnt > ADC_CALIB_CNT) || in rk816_bat_adc_calib()
812 (base2min(di->boot_base) < ADC_CALIB_LMT_MIN) || in rk816_bat_adc_calib()
813 (abs(di->current_avg) < ADC_CALIB_THRESHOLD) || in rk816_bat_adc_calib()
817 di->adc_calib_cnt++; in rk816_bat_adc_calib()
832 enable_irq(di->cvtlmt_irq); in rk816_bat_adc_calib()
834 disable_irq(di->cvtlmt_irq); in rk816_bat_adc_calib()
835 if (di->cvtlmt_int_event) { in rk816_bat_adc_calib()
836 di->cvtlmt_int_event = 0; in rk816_bat_adc_calib()
853 enable_irq(di->cvtlmt_irq); in rk816_bat_adc_calib()
855 disable_irq(di->cvtlmt_irq); in rk816_bat_adc_calib()
856 if (di->cvtlmt_int_event) { in rk816_bat_adc_calib()
857 di->cvtlmt_int_event = 0; in rk816_bat_adc_calib()
865 if (abs(adc) < ADC_CALIB_THRESHOLD) { in rk816_bat_adc_calib()
868 di->poffset = coffset - ioffset; in rk816_bat_adc_calib()
869 rk816_bat_write(di, RK816_PCB_IOFFSET_REG, di->poffset); in rk816_bat_adc_calib()
871 coffset, ioffset, di->poffset); in rk816_bat_adc_calib()
875 i, di->adc_calib_cnt); in rk816_bat_adc_calib()
918 struct battery_platform_data *pdata = di->pdata; in rk816_bat_set_relax_sample()
920 filter_thres = pdata->sleep_filter_current * 1000 / 1506; in rk816_bat_set_relax_sample()
922 if (!di->over_20mR) { in rk816_bat_set_relax_sample()
923 enter_thres = RES_FAC_DIV(pdata->sleep_enter_current * 1000, in rk816_bat_set_relax_sample()
924 di->res_fac) / 1506; in rk816_bat_set_relax_sample()
925 exit_thres = RES_FAC_DIV(pdata->sleep_exit_current * 1000, in rk816_bat_set_relax_sample()
926 di->res_fac) / 1506; in rk816_bat_set_relax_sample()
928 enter_thres = RES_FAC_MUX(pdata->sleep_enter_current * 1000, in rk816_bat_set_relax_sample()
929 di->res_fac) / 1506; in rk816_bat_set_relax_sample()
930 exit_thres = RES_FAC_MUX(pdata->sleep_exit_current * 1000, in rk816_bat_set_relax_sample()
931 di->res_fac) / 1506; in rk816_bat_set_relax_sample()
952 __func__, pdata->sleep_enter_current, pdata->sleep_exit_current); in rk816_bat_set_relax_sample()
962 int pwr_off_thresd = di->pdata->pwroff_vol; in rk816_bat_lowpwr_check()
964 if (di->current_avg < 0 && di->voltage_avg < pwr_off_thresd) { in rk816_bat_lowpwr_check()
969 (di->voltage_avg <= pwr_off_thresd - 50)) { in rk816_bat_lowpwr_check()
970 di->fake_offline = 1; in rk816_bat_lowpwr_check()
971 if (di->voltage_avg <= pwr_off_thresd - 50) in rk816_bat_lowpwr_check()
972 di->dsoc--; in rk816_bat_lowpwr_check()
974 di->dsoc, di->current_avg); in rk816_bat_lowpwr_check()
978 di->fake_offline = 0; in rk816_bat_lowpwr_check()
982 __func__, base2sec(time), di->dsoc, in rk816_bat_lowpwr_check()
983 di->current_avg, di->fake_offline); in rk816_bat_lowpwr_check()
1031 return (!di->is_initialized && di->pwroff_min >= 30) ? true : false; in is_rk816_bat_ocv_valid()
1038 if (di->bat_first_power_on || is_rk816_bat_ocv_valid(di)) { in rk816_bat_init_age_algorithm()
1044 di->age_voltage = ocv_vol; in rk816_bat_init_age_algorithm()
1045 di->age_ocv_cap = ocv_cap; in rk816_bat_init_age_algorithm()
1046 di->age_ocv_soc = ocv_soc; in rk816_bat_init_age_algorithm()
1047 di->age_adjust_cap = 0; in rk816_bat_init_age_algorithm()
1050 di->age_level = 100; in rk816_bat_init_age_algorithm()
1052 di->age_level = 95; in rk816_bat_init_age_algorithm()
1054 di->age_level = 90; in rk816_bat_init_age_algorithm()
1056 di->age_level = 80; in rk816_bat_init_age_algorithm()
1059 if (age_level > di->age_level) { in rk816_bat_init_age_algorithm()
1060 di->age_allow_update = false; in rk816_bat_init_age_algorithm()
1061 age_level -= 5; in rk816_bat_init_age_algorithm()
1066 di->age_allow_update = true; in rk816_bat_init_age_algorithm()
1067 di->age_keep_sec = get_boot_sec(); in rk816_bat_init_age_algorithm()
1071 di->age_voltage, di->age_ocv_cap, in rk816_bat_init_age_algorithm()
1072 ocv_soc, age_level, di->age_allow_update, in rk816_bat_init_age_algorithm()
1073 di->age_level); in rk816_bat_init_age_algorithm()
1101 if (val->intval) in rk816_bat_ac_set_property()
1107 return -EINVAL; in rk816_bat_ac_set_property()
1121 if (val->intval) in rk816_bat_usb_set_property()
1127 return -EINVAL; in rk816_bat_usb_set_property()
1135 if (di->pdata->bat_mode == MODE_VIRTUAL) in rk816_get_capacity_leve()
1138 if (di->dsoc < 1) in rk816_get_capacity_leve()
1140 else if (di->dsoc <= 20) in rk816_get_capacity_leve()
1142 else if (di->dsoc <= 70) in rk816_get_capacity_leve()
1144 else if (di->dsoc <= 90) in rk816_get_capacity_leve()
1155 if (di->pdata->bat_mode == MODE_VIRTUAL) { in rk816_battery_time_to_full()
1157 } else if (di->voltage_avg > 0) { in rk816_battery_time_to_full()
1158 cap_temp = di->pdata->design_capacity - di->remain_cap; in rk816_battery_time_to_full()
1161 time_sec = (3600 * cap_temp) / di->voltage_avg; in rk816_battery_time_to_full()
1177 val->intval = di->current_avg * 1000;/*uA*/ in rk816_battery_get_property()
1178 if (di->pdata->bat_mode == MODE_VIRTUAL) in rk816_battery_get_property()
1179 val->intval = VIRTUAL_CURRENT * 1000; in rk816_battery_get_property()
1182 val->intval = di->voltage_avg * 1000;/*uV*/ in rk816_battery_get_property()
1183 if (di->pdata->bat_mode == MODE_VIRTUAL) in rk816_battery_get_property()
1184 val->intval = VIRTUAL_VOLTAGE * 1000; in rk816_battery_get_property()
1187 val->intval = is_rk816_bat_exist(di); in rk816_battery_get_property()
1188 if (di->pdata->bat_mode == MODE_VIRTUAL) in rk816_battery_get_property()
1189 val->intval = VIRTUAL_PRESET; in rk816_battery_get_property()
1192 val->intval = di->dsoc; in rk816_battery_get_property()
1193 if (di->pdata->bat_mode == MODE_VIRTUAL) in rk816_battery_get_property()
1194 val->intval = VIRTUAL_SOC; in rk816_battery_get_property()
1195 DBG("<%s>. report dsoc: %d\n", __func__, val->intval); in rk816_battery_get_property()
1198 val->intval = rk816_get_capacity_leve(di); in rk816_battery_get_property()
1201 val->intval = POWER_SUPPLY_HEALTH_GOOD; in rk816_battery_get_property()
1204 val->intval = di->prop_status; in rk816_battery_get_property()
1205 if (di->pdata->bat_mode == MODE_VIRTUAL) in rk816_battery_get_property()
1206 val->intval = VIRTUAL_STATUS; in rk816_battery_get_property()
1208 val->intval = POWER_SUPPLY_STATUS_DISCHARGING; in rk816_battery_get_property()
1211 val->intval = di->temperature; in rk816_battery_get_property()
1212 if (di->pdata->bat_mode == MODE_VIRTUAL) in rk816_battery_get_property()
1213 val->intval = VIRTUAL_TEMPERATURE; in rk816_battery_get_property()
1216 val->intval = di->charge_count; in rk816_battery_get_property()
1220 val->intval = di->pdata->design_capacity * 1000;/* uAh */ in rk816_battery_get_property()
1223 val->intval = rk816_battery_time_to_full(di); in rk816_battery_get_property()
1226 return -EINVAL; in rk816_battery_get_property()
1255 if (di->pdata->bat_mode == MODE_VIRTUAL) in rk816_bat_ac_get_property()
1256 val->intval = VIRTUAL_AC_ONLINE; in rk816_bat_ac_get_property()
1257 else if (di->fake_offline) in rk816_bat_ac_get_property()
1258 val->intval = 0; in rk816_bat_ac_get_property()
1260 val->intval = di->ac_in | di->dc_in; in rk816_bat_ac_get_property()
1263 val->intval = di->voltage_max; in rk816_bat_ac_get_property()
1266 val->intval = di->current_max; in rk816_bat_ac_get_property()
1269 val->intval = rk816_bat_is_input_enabled(di); in rk816_bat_ac_get_property()
1272 ret = -EINVAL; in rk816_bat_ac_get_property()
1288 if (di->pdata->bat_mode == MODE_VIRTUAL) in rk816_bat_usb_get_property()
1289 val->intval = VIRTUAL_USB_ONLINE; in rk816_bat_usb_get_property()
1290 else if (di->fake_offline) in rk816_bat_usb_get_property()
1291 val->intval = 0; in rk816_bat_usb_get_property()
1293 val->intval = di->usb_in; in rk816_bat_usb_get_property()
1296 val->intval = di->voltage_max; in rk816_bat_usb_get_property()
1299 val->intval = di->current_max; in rk816_bat_usb_get_property()
1302 val->intval = rk816_bat_is_input_enabled(di); in rk816_bat_usb_get_property()
1305 ret = -EINVAL; in rk816_bat_usb_get_property()
1357 di->bat = devm_power_supply_register(di->dev, in rk816_bat_init_power_supply()
1359 if (IS_ERR(di->bat)) { in rk816_bat_init_power_supply()
1360 dev_err(di->dev, "register bat power supply fail\n"); in rk816_bat_init_power_supply()
1361 return PTR_ERR(di->bat); in rk816_bat_init_power_supply()
1364 di->ac = devm_power_supply_register(di->dev, in rk816_bat_init_power_supply()
1366 if (IS_ERR(di->ac)) { in rk816_bat_init_power_supply()
1367 dev_err(di->dev, "register ac power supply fail\n"); in rk816_bat_init_power_supply()
1368 return PTR_ERR(di->ac); in rk816_bat_init_power_supply()
1371 di->usb = devm_power_supply_register(di->dev, in rk816_bat_init_power_supply()
1373 if (IS_ERR(di->usb)) { in rk816_bat_init_power_supply()
1374 dev_err(di->dev, "register usb power supply fail\n"); in rk816_bat_init_power_supply()
1375 return PTR_ERR(di->usb); in rk816_bat_init_power_supply()
1386 if (capacity >= di->qmax) in rk816_bat_save_cap()
1387 capacity = di->qmax; in rk816_bat_save_cap()
1443 fcc = di->pdata->design_capacity; in rk816_bat_get_fcc()
1445 } else if (fcc > di->pdata->design_qmax) { in rk816_bat_get_fcc()
1447 fcc = di->pdata->design_qmax; in rk816_bat_get_fcc()
1480 static int last_soc = -1; in rk816_bat_save_dsoc()
1500 if (rk816_led_ops && rk816_led_ops->led_init) { in rk816_bat_init_leds()
1501 rk816_led_ops->led_init(di); in rk816_bat_init_leds()
1508 static int old_prop = -1; in rk816_bat_update_leds()
1516 if (rk816_led_ops && rk816_led_ops->led_charging_full) { in rk816_bat_update_leds()
1517 rk816_led_ops->led_charging_full(di); in rk816_bat_update_leds()
1522 if (rk816_led_ops && rk816_led_ops->led_charging) { in rk816_bat_update_leds()
1523 rk816_led_ops->led_charging(di); in rk816_bat_update_leds()
1528 if (rk816_led_ops && rk816_led_ops->led_discharging) { in rk816_bat_update_leds()
1529 rk816_led_ops->led_discharging(di); in rk816_bat_update_leds()
1555 if (di->pdata->bat_mode == MODE_VIRTUAL) { in rk816_bat_set_input_current()
1557 input_current = di->chrg_cur_input; in rk816_bat_set_input_current()
1575 di->usb_in = 0; in rk816_bat_set_chrg_param()
1576 di->ac_in = 0; in rk816_bat_set_chrg_param()
1577 di->dc_in = 0; in rk816_bat_set_chrg_param()
1578 di->prop_status = POWER_SUPPLY_STATUS_DISCHARGING; in rk816_bat_set_chrg_param()
1579 rk816_bat_set_chrg_current(di, di->chrg_cur_sel); in rk816_bat_set_chrg_param()
1581 power_supply_changed(di->bat); in rk816_bat_set_chrg_param()
1582 power_supply_changed(di->usb); in rk816_bat_set_chrg_param()
1583 power_supply_changed(di->ac); in rk816_bat_set_chrg_param()
1586 di->usb_in = 0; in rk816_bat_set_chrg_param()
1587 di->ac_in = 0; in rk816_bat_set_chrg_param()
1588 if (di->dc_in == 0) { in rk816_bat_set_chrg_param()
1589 di->prop_status = POWER_SUPPLY_STATUS_DISCHARGING; in rk816_bat_set_chrg_param()
1590 rk816_bat_set_chrg_current(di, di->chrg_cur_sel); in rk816_bat_set_chrg_param()
1593 power_supply_changed(di->usb); in rk816_bat_set_chrg_param()
1594 power_supply_changed(di->ac); in rk816_bat_set_chrg_param()
1597 di->usb_in = 1; in rk816_bat_set_chrg_param()
1598 di->ac_in = 0; in rk816_bat_set_chrg_param()
1599 di->prop_status = POWER_SUPPLY_STATUS_CHARGING; in rk816_bat_set_chrg_param()
1600 if (di->dc_in == 0) { in rk816_bat_set_chrg_param()
1601 rk816_bat_set_chrg_current(di, di->chrg_cur_sel); in rk816_bat_set_chrg_param()
1604 power_supply_changed(di->usb); in rk816_bat_set_chrg_param()
1607 di->usb_in = 1; in rk816_bat_set_chrg_param()
1608 di->ac_in = 0; in rk816_bat_set_chrg_param()
1609 di->prop_status = POWER_SUPPLY_STATUS_CHARGING; in rk816_bat_set_chrg_param()
1610 if (di->dc_in == 0) { in rk816_bat_set_chrg_param()
1611 rk816_bat_set_chrg_current(di, di->chrg_cur_sel); in rk816_bat_set_chrg_param()
1614 power_supply_changed(di->usb); in rk816_bat_set_chrg_param()
1617 di->ac_in = 1; in rk816_bat_set_chrg_param()
1618 di->usb_in = 0; in rk816_bat_set_chrg_param()
1619 di->prop_status = POWER_SUPPLY_STATUS_CHARGING; in rk816_bat_set_chrg_param()
1620 rk816_bat_set_chrg_current(di, di->chrg_cur_sel); in rk816_bat_set_chrg_param()
1621 rk816_bat_set_input_current(di, di->chrg_cur_input); in rk816_bat_set_chrg_param()
1622 power_supply_changed(di->ac); in rk816_bat_set_chrg_param()
1625 di->dc_in = 1; in rk816_bat_set_chrg_param()
1626 di->prop_status = POWER_SUPPLY_STATUS_CHARGING; in rk816_bat_set_chrg_param()
1627 rk816_bat_set_chrg_current(di, di->chrg_cur_sel); in rk816_bat_set_chrg_param()
1628 rk816_bat_set_input_current(di, di->chrg_cur_input); in rk816_bat_set_chrg_param()
1629 power_supply_changed(di->ac); in rk816_bat_set_chrg_param()
1632 di->dc_in = 0; in rk816_bat_set_chrg_param()
1640 di->ac_in = 0; in rk816_bat_set_chrg_param()
1641 di->usb_in = 0; in rk816_bat_set_chrg_param()
1642 di->prop_status = POWER_SUPPLY_STATUS_DISCHARGING; in rk816_bat_set_chrg_param()
1643 rk816_bat_set_chrg_current(di, di->chrg_cur_sel); in rk816_bat_set_chrg_param()
1645 } else if (di->usb_in) { in rk816_bat_set_chrg_param()
1646 rk816_bat_set_chrg_current(di, di->chrg_cur_sel); in rk816_bat_set_chrg_param()
1648 di->prop_status = POWER_SUPPLY_STATUS_CHARGING; in rk816_bat_set_chrg_param()
1650 power_supply_changed(di->usb); in rk816_bat_set_chrg_param()
1651 power_supply_changed(di->ac); in rk816_bat_set_chrg_param()
1654 di->prop_status = POWER_SUPPLY_STATUS_DISCHARGING; in rk816_bat_set_chrg_param()
1658 di->charger_changed = 1; in rk816_bat_set_chrg_param()
1667 if (di->dsoc == 100 && rk816_bat_chrg_online(di)) in rk816_bat_set_chrg_param()
1668 di->prop_status = POWER_SUPPLY_STATUS_FULL; in rk816_bat_set_chrg_param()
1670 rk816_bat_update_leds(di, di->prop_status); in rk816_bat_set_chrg_param()
1675 di->otg_in = online; in rk816_bat_set_otg_in()
1679 * -----: VBUS-5V
1684 * |------------------>>>>>>>>>>>>>>>
1689 * -------------- ##############
1692 * A: charger plugin event(vbus-5v on);
1700 * E: output-5v mode really works(enable boost+otg)
1703 * 1. Charger plugin at spot-A and switch to charing mode at spot-D.
1704 * 2. Software check PLUG_IN_STS=0 at spot-B, so we think it's not
1706 * spot-E(because delay of i2c transfer or other).
1707 * 3. It's a pity that pmic has been changed to charing mode at spot-D
1708 * earlier than spot-E.
1715 * We should enable otg first at spot-B, trying to switch to output-5v mode,
1717 * again at spot-F, if PLUG_IN_STS=1, means it's charging mode now, we abandont
1726 if (di->otg_pmic5v) { in rk816_bat_set_otg_power()
1731 /* (spot-B). for safe, detect vbus-5v by pmic self */ in rk816_bat_set_otg_power()
1734 BAT_INFO("detect vbus-5v suppling, deny otg on..\n"); in rk816_bat_set_otg_power()
1738 /* (spot-B). enable otg, try to switch to output-5v mode */ in rk816_bat_set_otg_power()
1744 * 140ms and check charger again. if still check vbus-5v online, in rk816_bat_set_otg_power()
1749 /* spot-F */ in rk816_bat_set_otg_power()
1754 BAT_INFO("detect vbus-5v suppling too, deny otg on\n"); in rk816_bat_set_otg_power()
1759 * reach here, means pmic switch to output-5v mode ok, it's in rk816_bat_set_otg_power()
1760 * safe to enable boost-5v on output mode. in rk816_bat_set_otg_power()
1764 di->otg_pmic5v = 1; in rk816_bat_set_otg_power()
1768 if (!di->otg_pmic5v) { in rk816_bat_set_otg_power()
1773 di->otg_pmic5v = 0; in rk816_bat_set_otg_power()
1786 if (!di->iio_chan) { in rk816_bat_get_adc_dc_state()
1787 di->iio_chan = iio_channel_get(&di->rk816->i2c->dev, NULL); in rk816_bat_get_adc_dc_state()
1788 if (IS_ERR(di->iio_chan)) { in rk816_bat_get_adc_dc_state()
1789 di->iio_chan = NULL; in rk816_bat_get_adc_dc_state()
1794 if (iio_read_channel_raw(di->iio_chan, &val) < 0) { in rk816_bat_get_adc_dc_state()
1807 if (!gpio_is_valid(di->pdata->dc_det_pin)) in rk816_bat_get_gpio_dc_state()
1810 level = gpio_get_value(di->pdata->dc_det_pin); in rk816_bat_get_gpio_dc_state()
1812 return (level == di->pdata->dc_det_level) ? in rk816_bat_get_gpio_dc_state()
1820 if (di->pdata->dc_det_adc) in rk816_bat_get_dc_state()
1844 if (di->otg_in && di->pdata->power_dc2otg) { in rk816_bat_dc_delay_work()
1852 if (di->otg_in) { in rk816_bat_dc_delay_work()
1855 * must wait 200ms to wait 5v-input fade away before in rk816_bat_dc_delay_work()
1864 if (di->pdata->dc_det_adc) in rk816_bat_dc_delay_work()
1865 queue_delayed_work(di->usb_charger_wq, in rk816_bat_dc_delay_work()
1866 &di->dc_delay_work, in rk816_bat_dc_delay_work()
1880 di->fb_blank = *(int *)evdata->data; in rk816_bat_fb_notifier()
1887 memset(&di->fb_nb, 0, sizeof(di->fb_nb)); in rk816_bat_register_fb_notify()
1888 di->fb_nb.notifier_call = rk816_bat_fb_notifier; in rk816_bat_register_fb_notify()
1890 return fb_register_client(&di->fb_nb); in rk816_bat_register_fb_notify()
1895 return fb_unregister_client(&di->fb_nb); in rk816_bat_unregister_fb_notify()
1903 if (!di->over_20mR) in rk816_bat_init_coulomb_cap()
1904 cap = RES_FAC_DIV(capacity * 2390, di->res_fac); in rk816_bat_init_coulomb_cap()
1906 cap = RES_FAC_MUX(capacity * 2390, di->res_fac); in rk816_bat_init_coulomb_cap()
1917 di->remain_cap = capacity; in rk816_bat_init_coulomb_cap()
1918 di->rsoc = rk816_bat_get_rsoc(di); in rk816_bat_init_coulomb_cap()
1940 if (abs(now_cap - pre_cap) > (di->fcc / 10)) { in is_rk816_bat_last_halt()
1952 rk816_bat_save_fcc(di, di->design_cap); in rk816_bat_first_pwron()
1954 di->fcc = rk816_bat_get_fcc(di); in rk816_bat_first_pwron()
1955 di->nac = rk816_bat_vol_to_ocvcap(di, ocv_vol); in rk816_bat_first_pwron()
1956 di->rsoc = rk816_bat_vol_to_ocvsoc(di, ocv_vol); in rk816_bat_first_pwron()
1957 di->dsoc = di->rsoc; in rk816_bat_first_pwron()
1958 di->is_first_on = true; in rk816_bat_first_pwron()
1961 di->dsoc, di->rsoc, di->nac, di->fcc, ocv_vol); in rk816_bat_first_pwron()
1968 di->fcc = rk816_bat_get_fcc(di); in rk816_bat_not_first_pwron()
1972 di->is_halt = is_rk816_bat_last_halt(di); in rk816_bat_not_first_pwron()
1973 di->halt_cnt = rk816_bat_get_halt_cnt(di); in rk816_bat_not_first_pwron()
1974 di->is_initialized = is_rk816_bat_initialized(di); in rk816_bat_not_first_pwron()
1975 di->is_ocv_calib = is_rk816_bat_ocv_valid(di); in rk816_bat_not_first_pwron()
1977 if (di->is_initialized) { in rk816_bat_not_first_pwron()
1980 } else if (di->is_halt) { in rk816_bat_not_first_pwron()
1987 pre_soc = di->rsoc; in rk816_bat_not_first_pwron()
1989 } else if (di->is_ocv_calib) { in rk816_bat_not_first_pwron()
1994 di->ocv_pre_dsoc = pre_soc; in rk816_bat_not_first_pwron()
1995 di->ocv_new_dsoc = ocv_soc; in rk816_bat_not_first_pwron()
1996 if (abs(ocv_soc - pre_soc) >= di->pdata->max_soc_offset) { in rk816_bat_not_first_pwron()
1997 di->ocv_pre_dsoc = pre_soc; in rk816_bat_not_first_pwron()
1998 di->ocv_new_dsoc = ocv_soc; in rk816_bat_not_first_pwron()
1999 di->is_max_soc_offset = true; in rk816_bat_not_first_pwron()
2000 BAT_INFO("trigger max soc offset, dsoc: %d -> %d\n", in rk816_bat_not_first_pwron()
2005 } else if (di->pwroff_min > 0) { in rk816_bat_not_first_pwron()
2009 di->force_pre_dsoc = pre_soc; in rk816_bat_not_first_pwron()
2010 di->force_new_dsoc = ocv_soc; in rk816_bat_not_first_pwron()
2011 if (abs(ocv_soc - pre_soc) >= 80) { in rk816_bat_not_first_pwron()
2012 di->is_force_calib = true; in rk816_bat_not_first_pwron()
2013 BAT_INFO("dsoc force calib: %d -> %d\n", in rk816_bat_not_first_pwron()
2021 di->dsoc = pre_soc; in rk816_bat_not_first_pwron()
2022 di->nac = pre_cap; in rk816_bat_not_first_pwron()
2023 if (di->nac < 0) in rk816_bat_not_first_pwron()
2024 di->nac = 0; in rk816_bat_not_first_pwron()
2027 di->dsoc, di->nac, rk816_bat_get_avg_voltage(di), in rk816_bat_not_first_pwron()
2029 di->pwroff_min, rk816_bat_get_prev_dsoc(di), in rk816_bat_not_first_pwron()
2038 if (((buf & FG_RESET_LATE) && di->pwroff_min >= 30) || in rk816_bat_ocv_sw_reset()
2054 int *temp_t = di->pdata->temp_t; in rk816_bat_setup_ocv_table()
2055 int temp_t_num = di->pdata->temp_t_num; in rk816_bat_setup_ocv_table()
2065 di->pdata->ocv_table = di->pdata->table_t[0]; in rk816_bat_setup_ocv_table()
2070 if (temp > temp_t[temp_t_num - 1]) { in rk816_bat_setup_ocv_table()
2072 di->pdata->ocv_table = di->pdata->table_t[temp_t_num - 1]; in rk816_bat_setup_ocv_table()
2080 di->pdata->ocv_table = di->pdata->table_t[i]; in rk816_bat_setup_ocv_table()
2086 for (i = 0; i < temp_t_num - 1; i++) { in rk816_bat_setup_ocv_table()
2098 percent = (temp - temp_l) * 100 / DIV(temp_h - temp_l); in rk816_bat_setup_ocv_table()
2101 for (i = 0; i < di->pdata->ocv_size; i++) { in rk816_bat_setup_ocv_table()
2102 volt_ltemp = di->pdata->table_t[idx][i]; in rk816_bat_setup_ocv_table()
2103 volt_htemp = di->pdata->table_t[idx + 1][i]; in rk816_bat_setup_ocv_table()
2105 di->pdata->ocv_table[i] = volt_ltemp + in rk816_bat_setup_ocv_table()
2106 (volt_htemp - volt_ltemp) * percent / 100; in rk816_bat_setup_ocv_table()
2109 temp_l, volt_ltemp, temp, di->pdata->ocv_table[i], in rk816_bat_setup_ocv_table()
2111 (volt_htemp - volt_ltemp) * percent / 100); in rk816_bat_setup_ocv_table()
2117 di->bat_first_power_on = is_rk816_bat_first_pwron(di); in rk816_bat_init_rsoc()
2118 di->is_sw_reset = rk816_bat_ocv_sw_reset(di); in rk816_bat_init_rsoc()
2119 di->pwroff_min = rk816_bat_get_pwroff_min(di); in rk816_bat_init_rsoc()
2121 if (di->bat_first_power_on || di->is_sw_reset) in rk816_bat_init_rsoc()
2134 DBG("CHARGE-OFF ...\n"); in rk816_bat_get_chrg_status()
2177 fb_temp = di->pdata->fb_temp; in rk816_bat_fb_temp()
2189 if (di->pdata->sample_res == 20) { in rk816_bat_select_sample_res()
2190 di->over_20mR = 0; in rk816_bat_select_sample_res()
2191 di->res_fac = 10; in rk816_bat_select_sample_res()
2192 } else if (di->pdata->sample_res > 20) { in rk816_bat_select_sample_res()
2193 di->over_20mR = 1; in rk816_bat_select_sample_res()
2194 di->res_fac = di->pdata->sample_res * 10 / 20; in rk816_bat_select_sample_res()
2196 di->over_20mR = 0; in rk816_bat_select_sample_res()
2197 di->res_fac = 20 * 10 / di->pdata->sample_res; in rk816_bat_select_sample_res()
2230 if (di->pdata->sample_res < 20) { in rk816_bat_decode_chrg_current()
2232 chrg_current = RES_FAC_DIV(chrg_current, di->res_fac); in rk816_bat_decode_chrg_current()
2235 } else if (di->pdata->sample_res > 20) { in rk816_bat_decode_chrg_current()
2236 chrg_current = RES_FAC_MUX(chrg_current, di->res_fac); in rk816_bat_decode_chrg_current()
2269 di->chrg_vol_sel = rk816_bat_decode_chrg_vol(di, in rk816_bat_select_chrg_cv()
2270 di->pdata->max_chrg_voltage); in rk816_bat_select_chrg_cv()
2271 di->chrg_cur_input = rk816_bat_decode_input_current(di, in rk816_bat_select_chrg_cv()
2272 di->pdata->max_input_current); in rk816_bat_select_chrg_cv()
2273 di->chrg_cur_sel = rk816_bat_decode_chrg_current(di, in rk816_bat_select_chrg_cv()
2274 di->pdata->max_chrg_current); in rk816_bat_select_chrg_cv()
2277 __func__, di->chrg_vol_sel, di->chrg_cur_input, di->chrg_cur_sel); in rk816_bat_select_chrg_cv()
2294 if (di->pdata->sample_res < 20) { in rk816_bat_finish_ma()
2300 } else if (di->pdata->sample_res > 20) { in rk816_bat_finish_ma()
2317 finish_ma = rk816_bat_finish_ma(di, di->fcc); in rk816_bat_init_chrg_config()
2330 usb_ctrl |= di->chrg_cur_input; in rk816_bat_init_chrg_config()
2331 chrg_ctrl1 = (CHRG_EN) | (di->chrg_vol_sel | di->chrg_cur_sel); in rk816_bat_init_chrg_config()
2346 if (di->pdata->fb_temp) in rk816_bat_init_chrg_config()
2372 di->poffset = coffset - ioffset; in rk816_bat_init_poffset()
2379 mod_timer(&di->caltimer, jiffies + MINUTE(8) * HZ); in rk816_bat_caltimer_isr()
2380 queue_delayed_work(di->bat_monitor_wq, &di->calib_delay_work, in rk816_bat_caltimer_isr()
2391 rk816_bat_set_coffset(di, di->poffset + ioffset); in rk816_bat_internal_calib()
2399 timer_setup(&di->caltimer, rk816_bat_caltimer_isr, 0); in rk816_bat_init_caltimer()
2400 di->caltimer.expires = jiffies + MINUTE(8) * HZ; in rk816_bat_init_caltimer()
2401 add_timer(&di->caltimer); in rk816_bat_init_caltimer()
2402 INIT_DELAYED_WORK(&di->calib_delay_work, rk816_bat_internal_calib); in rk816_bat_init_caltimer()
2410 ocv_size = di->pdata->ocv_size; in rk816_bat_init_zero_table()
2411 length = sizeof(di->pdata->zero_table) * ocv_size; in rk816_bat_init_zero_table()
2412 di->pdata->zero_table = in rk816_bat_init_zero_table()
2413 devm_kzalloc(di->dev, length, GFP_KERNEL); in rk816_bat_init_zero_table()
2414 if (!di->pdata->zero_table) { in rk816_bat_init_zero_table()
2415 di->pdata->zero_table = di->pdata->ocv_table; in rk816_bat_init_zero_table()
2416 dev_err(di->dev, "malloc zero table fail\n"); in rk816_bat_init_zero_table()
2420 min = di->pdata->pwroff_vol, in rk816_bat_init_zero_table()
2421 max = di->pdata->ocv_table[ocv_size - 4]; in rk816_bat_init_zero_table()
2422 diff = (max - min) / DIV(ocv_size - 1); in rk816_bat_init_zero_table()
2424 di->pdata->zero_table[i] = min + (i * diff); in rk816_bat_init_zero_table()
2430 DBG("zero[%d] = %d\n", i, di->pdata->zero_table[i]); in rk816_bat_init_zero_table()
2433 DBG("ocv[%d] = %d\n", i, di->pdata->ocv_table[i]); in rk816_bat_init_zero_table()
2441 delta = abs(di->dsoc - di->rsoc); in rk816_bat_calc_sm_linek()
2445 if (di->dsoc < di->rsoc) in rk816_bat_calc_sm_linek()
2447 else if (di->dsoc > di->rsoc) in rk816_bat_calc_sm_linek()
2451 di->dbg_meet_soc = (di->dsoc >= di->rsoc) ? in rk816_bat_calc_sm_linek()
2452 (di->dsoc + diff) : (di->rsoc + diff); in rk816_bat_calc_sm_linek()
2454 if (di->dsoc < di->rsoc) in rk816_bat_calc_sm_linek()
2455 linek = -1000 * diff / DIV(delta + diff); in rk816_bat_calc_sm_linek()
2456 else if (di->dsoc > di->rsoc) in rk816_bat_calc_sm_linek()
2457 linek = -1000 * (delta + diff) / DIV(diff); in rk816_bat_calc_sm_linek()
2459 linek = -1000; in rk816_bat_calc_sm_linek()
2460 di->dbg_meet_soc = (di->dsoc >= di->rsoc) ? in rk816_bat_calc_sm_linek()
2461 (di->dsoc - diff) : (di->rsoc - diff); in rk816_bat_calc_sm_linek()
2464 di->sm_linek = linek; in rk816_bat_calc_sm_linek()
2465 di->sm_remain_cap = di->remain_cap; in rk816_bat_calc_sm_linek()
2466 di->dbg_calc_dsoc = di->dsoc; in rk816_bat_calc_sm_linek()
2467 di->dbg_calc_rsoc = di->rsoc; in rk816_bat_calc_sm_linek()
2481 if ((abs(di->current_avg) < 400) && (di->dsoc > 5)) in rk816_bat_calc_zero_linek()
2482 pwroff_vol = di->pdata->pwroff_vol + 50; in rk816_bat_calc_zero_linek()
2484 pwroff_vol = di->pdata->pwroff_vol; in rk816_bat_calc_zero_linek()
2492 di->pdata->pwroff_vol, pwroff_vol, di->pdata->zero_reserve_dsoc); in rk816_bat_calc_zero_linek()
2494 dead_voltage = pwroff_vol - current_avg * in rk816_bat_calc_zero_linek()
2495 (di->bat_res + DEF_PWRPATH_RES) / 1000; in rk816_bat_calc_zero_linek()
2496 ocv_voltage = voltage_avg - (current_avg * di->bat_res) / 1000; in rk816_bat_calc_zero_linek()
2512 xsoc = ocv_soc - dead_soc; in rk816_bat_calc_zero_linek()
2515 if (abs(current_avg) > ZERO_LOAD_LVL1) in rk816_bat_calc_zero_linek()
2517 else if (abs(current_avg) > ZERO_LOAD_LVL2) in rk816_bat_calc_zero_linek()
2522 if ((xsoc <= 30) && (di->dsoc >= di->pdata->zero_reserve_dsoc)) in rk816_bat_calc_zero_linek()
2525 di->zero_remain_cap = di->remain_cap; in rk816_bat_calc_zero_linek()
2526 di->zero_timeout_cnt = 0; in rk816_bat_calc_zero_linek()
2527 if ((di->dsoc <= 1) && (xsoc > 0)) { in rk816_bat_calc_zero_linek()
2528 di->zero_linek = 400; in rk816_bat_calc_zero_linek()
2529 di->zero_drop_sec = 0; in rk816_bat_calc_zero_linek()
2531 di->zero_drop_sec = 0; in rk816_bat_calc_zero_linek()
2532 di->zero_linek = (di->zero_dsoc + xsoc / 2) / DIV(xsoc); in rk816_bat_calc_zero_linek()
2533 org_linek = di->zero_linek; in rk816_bat_calc_zero_linek()
2535 if ((di->pdata->energy_mode) && in rk816_bat_calc_zero_linek()
2536 (xsoc - di->dsoc >= MIN_ZERO_GAP_XSOC3) && in rk816_bat_calc_zero_linek()
2537 (di->dsoc <= 10) && (di->zero_linek < 300)) { in rk816_bat_calc_zero_linek()
2538 di->zero_linek = 300; in rk816_bat_calc_zero_linek()
2539 DBG("ZERO-new: zero_linek adjust step0...\n"); in rk816_bat_calc_zero_linek()
2541 } else if ((xsoc - di->dsoc >= min_gap_xsoc) || in rk816_bat_calc_zero_linek()
2542 ((xsoc - di->dsoc >= MIN_ZERO_GAP_XSOC2) && in rk816_bat_calc_zero_linek()
2543 (di->dsoc <= 10) && (xsoc > 15))) { in rk816_bat_calc_zero_linek()
2545 di->dsoc >= di->pdata->zero_reserve_dsoc) in rk816_bat_calc_zero_linek()
2546 di->zero_linek = 1200; in rk816_bat_calc_zero_linek()
2547 else if (xsoc - di->dsoc >= 2 * min_gap_xsoc) in rk816_bat_calc_zero_linek()
2548 di->zero_linek = 400; in rk816_bat_calc_zero_linek()
2549 else if (xsoc - di->dsoc >= 3 + min_gap_xsoc) in rk816_bat_calc_zero_linek()
2550 di->zero_linek = 600; in rk816_bat_calc_zero_linek()
2552 di->zero_linek = 800; in rk816_bat_calc_zero_linek()
2553 DBG("ZERO-new: zero_linek adjust step1...\n"); in rk816_bat_calc_zero_linek()
2555 } else if ((di->zero_linek > 1800) && (di->dsoc > 70)) { in rk816_bat_calc_zero_linek()
2556 di->zero_linek = 1800; in rk816_bat_calc_zero_linek()
2557 DBG("ZERO-new: zero_linek adjust step2...\n"); in rk816_bat_calc_zero_linek()
2559 } else if ((di->zero_linek > 1000) && (di->zero_linek < 1200)) { in rk816_bat_calc_zero_linek()
2560 di->zero_linek = 1200; in rk816_bat_calc_zero_linek()
2561 DBG("ZERO-new: zero_linek adjust step3...\n"); in rk816_bat_calc_zero_linek()
2563 } else if ((di->dsoc <= 15 && di->dsoc > 5) && in rk816_bat_calc_zero_linek()
2564 (di->zero_linek <= 1200)) { in rk816_bat_calc_zero_linek()
2566 if ((xsoc - di->dsoc) >= min_gap_xsoc) in rk816_bat_calc_zero_linek()
2567 di->zero_linek = 800; in rk816_bat_calc_zero_linek()
2570 di->zero_linek = 1200; in rk816_bat_calc_zero_linek()
2571 DBG("ZERO-new: zero_linek adjust step4...\n"); in rk816_bat_calc_zero_linek()
2573 } else if ((di->zero_linek < 1000) && (di->dsoc >= 5)) { in rk816_bat_calc_zero_linek()
2574 if ((xsoc - di->dsoc) < min_gap_xsoc) { in rk816_bat_calc_zero_linek()
2576 di->zero_linek = 1200; in rk816_bat_calc_zero_linek()
2578 if (abs(di->current_avg) > 500)/* heavy */ in rk816_bat_calc_zero_linek()
2579 di->zero_linek = 900; in rk816_bat_calc_zero_linek()
2581 di->zero_linek = 1000; in rk816_bat_calc_zero_linek()
2583 DBG("ZERO-new: zero_linek adjust step5...\n"); in rk816_bat_calc_zero_linek()
2585 } else if ((di->zero_linek < 1000) && (di->dsoc <= 5)) { in rk816_bat_calc_zero_linek()
2586 if ((xsoc - di->dsoc) <= 3) in rk816_bat_calc_zero_linek()
2587 di->zero_linek = 1200; in rk816_bat_calc_zero_linek()
2589 di->zero_linek = 800; in rk816_bat_calc_zero_linek()
2590 DBG("ZERO-new: zero_linek adjust step6...\n"); in rk816_bat_calc_zero_linek()
2594 di->zero_linek = 1000; in rk816_bat_calc_zero_linek()
2595 if (!di->zero_drop_sec) in rk816_bat_calc_zero_linek()
2596 di->zero_drop_sec = get_boot_sec(); in rk816_bat_calc_zero_linek()
2597 if (base2sec(di->zero_drop_sec) >= WAIT_DSOC_DROP_SEC) { in rk816_bat_calc_zero_linek()
2598 DBG("ZERO0: t=%lu\n", base2sec(di->zero_drop_sec)); in rk816_bat_calc_zero_linek()
2599 di->zero_drop_sec = 0; in rk816_bat_calc_zero_linek()
2600 di->dsoc--; in rk816_bat_calc_zero_linek()
2601 di->zero_dsoc = (di->dsoc + 1) * 1000 - in rk816_bat_calc_zero_linek()
2606 if (voltage_avg < pwroff_vol - 70) { in rk816_bat_calc_zero_linek()
2607 if (!di->shtd_drop_sec) in rk816_bat_calc_zero_linek()
2608 di->shtd_drop_sec = get_boot_sec(); in rk816_bat_calc_zero_linek()
2609 if (base2sec(di->shtd_drop_sec) > WAIT_SHTD_DROP_SEC) { in rk816_bat_calc_zero_linek()
2610 BAT_INFO("voltage extreme low...soc:%d->0\n", di->dsoc); in rk816_bat_calc_zero_linek()
2611 di->shtd_drop_sec = 0; in rk816_bat_calc_zero_linek()
2612 di->dsoc = 0; in rk816_bat_calc_zero_linek()
2615 di->shtd_drop_sec = 0; in rk816_bat_calc_zero_linek()
2618 DBG("ZERO-new: org_linek=%d, zero_linek=%d, dsoc=%d, Xsoc=%d, rsoc=%d, gap=%d, v=%d, vsys=%d\n" in rk816_bat_calc_zero_linek()
2619 "ZERO-new: di->zero_dsoc=%d, zero_remain_cap=%d, zero_drop=%ld, sht_drop=%ld\n\n", in rk816_bat_calc_zero_linek()
2620 org_linek, di->zero_linek, di->dsoc, xsoc, di->rsoc, in rk816_bat_calc_zero_linek()
2621 min_gap_xsoc, voltage_avg, vsys, di->zero_dsoc, di->zero_remain_cap, in rk816_bat_calc_zero_linek()
2622 base2sec(di->zero_drop_sec), base2sec(di->shtd_drop_sec)); in rk816_bat_calc_zero_linek()
2627 di->chrg_finish_base = get_boot_sec(); in rk816_bat_finish_algo_prepare()
2628 if (!di->chrg_finish_base) in rk816_bat_finish_algo_prepare()
2629 di->chrg_finish_base = 1; in rk816_bat_finish_algo_prepare()
2636 tmp_soc = di->sm_chrg_dsoc / 1000; in rk816_bat_smooth_algo_prepare()
2637 if (tmp_soc != di->dsoc) in rk816_bat_smooth_algo_prepare()
2638 di->sm_chrg_dsoc = di->dsoc * 1000; in rk816_bat_smooth_algo_prepare()
2640 tmp_soc = di->sm_dischrg_dsoc / 1000; in rk816_bat_smooth_algo_prepare()
2641 if (tmp_soc != di->dsoc) in rk816_bat_smooth_algo_prepare()
2642 di->sm_dischrg_dsoc = in rk816_bat_smooth_algo_prepare()
2643 (di->dsoc + 1) * 1000 - MIN_ACCURACY; in rk816_bat_smooth_algo_prepare()
2646 __func__, tmp_soc, di->dsoc, di->sm_dischrg_dsoc, di->sm_chrg_dsoc); in rk816_bat_smooth_algo_prepare()
2655 di->zero_timeout_cnt = 0; in rk816_bat_zero_algo_prepare()
2656 tmp_dsoc = di->zero_dsoc / 1000; in rk816_bat_zero_algo_prepare()
2657 if (tmp_dsoc != di->dsoc) in rk816_bat_zero_algo_prepare()
2658 di->zero_dsoc = (di->dsoc + 1) * 1000 - MIN_ACCURACY; in rk816_bat_zero_algo_prepare()
2669 tmp_soc = di->zero_dsoc / 1000; in rk816_bat_calc_zero_algorithm()
2670 if (tmp_soc == di->dsoc) in rk816_bat_calc_zero_algorithm()
2673 DBG("<%s>. enter: dsoc=%d, rsoc=%d\n", __func__, di->dsoc, di->rsoc); in rk816_bat_calc_zero_algorithm()
2675 if (di->dsoc < di->rsoc) { in rk816_bat_calc_zero_algorithm()
2677 tmp_soc = di->sm_chrg_dsoc / 1000; in rk816_bat_calc_zero_algorithm()
2678 if (tmp_soc == di->dsoc) { in rk816_bat_calc_zero_algorithm()
2679 sm_delta_dsoc = di->sm_chrg_dsoc - di->dsoc * 1000; in rk816_bat_calc_zero_algorithm()
2680 di->sm_chrg_dsoc = di->dsoc * 1000; in rk816_bat_calc_zero_algorithm()
2681 di->zero_dsoc += sm_delta_dsoc; in rk816_bat_calc_zero_algorithm()
2687 if (di->dsoc > di->rsoc) { in rk816_bat_calc_zero_algorithm()
2689 tmp_soc = di->sm_dischrg_dsoc / 1000; in rk816_bat_calc_zero_algorithm()
2690 if (tmp_soc == di->dsoc) { in rk816_bat_calc_zero_algorithm()
2691 sm_delta_dsoc = di->sm_dischrg_dsoc - in rk816_bat_calc_zero_algorithm()
2692 ((di->dsoc + 1) * 1000 - MIN_ACCURACY); in rk816_bat_calc_zero_algorithm()
2693 di->sm_dischrg_dsoc = (di->dsoc + 1) * 1000 - in rk816_bat_calc_zero_algorithm()
2695 di->zero_dsoc += sm_delta_dsoc; in rk816_bat_calc_zero_algorithm()
2701 if (di->zero_dsoc > (di->dsoc + 1) * 1000 - MIN_ACCURACY) { in rk816_bat_calc_zero_algorithm()
2702 DBG("ZERO1: zero dsoc overflow: %d\n", di->zero_dsoc); in rk816_bat_calc_zero_algorithm()
2703 di->zero_dsoc = (di->dsoc + 1) * 1000 - MIN_ACCURACY; in rk816_bat_calc_zero_algorithm()
2707 tmp_soc = di->zero_dsoc / 1000; in rk816_bat_calc_zero_algorithm()
2708 if (tmp_soc != di->dsoc) { in rk816_bat_calc_zero_algorithm()
2710 if ((di->dsoc - tmp_soc) > 1) { in rk816_bat_calc_zero_algorithm()
2711 di->dsoc--; in rk816_bat_calc_zero_algorithm()
2712 di->zero_dsoc = (di->dsoc + 1) * 1000 - MIN_ACCURACY; in rk816_bat_calc_zero_algorithm()
2715 di->dsoc = tmp_soc; in rk816_bat_calc_zero_algorithm()
2717 di->zero_drop_sec = 0; in rk816_bat_calc_zero_algorithm()
2722 di->zero_dsoc, di->dsoc, di->rsoc, tmp_soc); in rk816_bat_calc_zero_algorithm()
2724 di->sm_dischrg_dsoc, di->sm_chrg_dsoc); in rk816_bat_calc_zero_algorithm()
2731 di->zero_timeout_cnt++; in rk816_bat_zero_algorithm()
2732 delta_cap = di->zero_remain_cap - di->remain_cap; in rk816_bat_zero_algorithm()
2733 delta_soc = di->zero_linek * (delta_cap * 100) / DIV(di->fcc); in rk816_bat_zero_algorithm()
2738 di->zero_linek, di->zero_dsoc, di->dsoc, di->rsoc, in rk816_bat_zero_algorithm()
2739 delta_soc, delta_cap, di->zero_remain_cap, in rk816_bat_zero_algorithm()
2740 di->zero_timeout_cnt, di->sm_dischrg_dsoc, di->sm_chrg_dsoc); in rk816_bat_zero_algorithm()
2743 (di->zero_timeout_cnt > MIN_ZERO_OVERCNT) || in rk816_bat_zero_algorithm()
2744 (di->zero_linek == 0)) { in rk816_bat_zero_algorithm()
2745 DBG("ZERO1:--------- enter calc -----------\n"); in rk816_bat_zero_algorithm()
2746 di->zero_timeout_cnt = 0; in rk816_bat_zero_algorithm()
2747 di->zero_dsoc -= delta_soc; in rk816_bat_zero_algorithm()
2759 int mod = di->dsoc % 10; in rk816_bat_dump_time_table()
2760 int index = di->dsoc / 10; in rk816_bat_dump_time_table()
2763 time = base2min(di->plug_in_base); in rk816_bat_dump_time_table()
2765 time = base2min(di->plug_out_base); in rk816_bat_dump_time_table()
2768 di->dbg_chrg_min[index - 1] = time - old_min; in rk816_bat_dump_time_table()
2774 DBG("Time[%d]=%d, ", (i * 10), di->dbg_chrg_min[i - 1]); in rk816_bat_dump_time_table()
2790 di->plug_out_base = get_boot_sec(); in rk816_bat_debug_info()
2792 di->plug_in_base = get_boot_sec(); in rk816_bat_debug_info()
2820 if (!di->over_20mR) in rk816_bat_debug_info()
2821 chrg_sel = RES_FAC_MUX(chrg_sel, di->res_fac); in rk816_bat_debug_info()
2823 chrg_sel = RES_FAC_DIV(chrg_sel, di->res_fac); in rk816_bat_debug_info()
2825 DBG("\n------- DEBUG REGS, [Ver: %s] -------------------\n" in rk816_bat_debug_info()
2848 "ocv_c=%d: %d -> %d; max_c=%d: %d -> %d; force_c=%d: %d -> %d\n" in rk816_bat_debug_info()
2851 di->dsoc, di->rsoc, di->voltage_avg, di->current_avg, in rk816_bat_debug_info()
2852 di->remain_cap, di->fcc, di->dsoc - di->rsoc, in rk816_bat_debug_info()
2853 di->sm_linek, work_mode[di->work_mode], di->sm_remain_cap, in rk816_bat_debug_info()
2858 di->ac_in, di->usb_in, di->dc_in, di->otg_in, di->otg_pmic5v, in rk816_bat_debug_info()
2859 di->prop_status, in rk816_bat_debug_info()
2860 FEED_BACK_TEMP[(thermal & 0x0c) >> 2], di->temperature, in rk816_bat_debug_info()
2862 di->poffset, di->bat_res, di->age_adjust_cap, di->fb_blank, in rk816_bat_debug_info()
2864 base2min(di->plug_in_base), base2min(di->plug_out_base), in rk816_bat_debug_info()
2865 base2min(di->chrg_finish_base), di->lock_fcc, in rk816_bat_debug_info()
2866 base2min(di->boot_base), di->sleep_sum_sec / 60, in rk816_bat_debug_info()
2867 di->adc_allow_update, di->res_fac, in rk816_bat_debug_info()
2868 bat_mode[di->pdata->bat_mode], di->dbg_meet_soc, in rk816_bat_debug_info()
2869 di->dbg_calc_dsoc, di->dbg_calc_rsoc, di->voltage_ocv, in rk816_bat_debug_info()
2870 di->pdata->sample_res, in rk816_bat_debug_info()
2871 di->dbg_pwr_dsoc, di->dbg_pwr_rsoc, di->dbg_pwr_vol, di->is_halt, in rk816_bat_debug_info()
2872 di->halt_cnt, reboot_cnt, in rk816_bat_debug_info()
2873 di->is_ocv_calib, di->ocv_pre_dsoc, di->ocv_new_dsoc, in rk816_bat_debug_info()
2874 di->is_max_soc_offset, di->max_pre_dsoc, di->max_new_dsoc, in rk816_bat_debug_info()
2875 di->is_force_calib, di->force_pre_dsoc, di->force_new_dsoc, in rk816_bat_debug_info()
2876 di->pwroff_min, di->is_initialized, di->is_sw_reset, in rk816_bat_debug_info()
2877 di->dbg_cap_low0, di->is_first_on, di->last_dsoc in rk816_bat_debug_info()
2885 delta_cap = cap - di->remain_cap; in rk816_bat_init_capacity()
2889 di->age_adjust_cap += delta_cap; in rk816_bat_init_capacity()
2901 di->lock_fcc = rk816_bat_get_lock_fcc(di); in rk816_bat_update_age_fcc()
2902 if (di->lock_fcc == 0) in rk816_bat_update_age_fcc()
2905 fcc = di->lock_fcc; in rk816_bat_update_age_fcc()
2906 remain_cap = fcc - di->age_ocv_cap - di->age_adjust_cap; in rk816_bat_update_age_fcc()
2907 age_keep_min = base2min(di->age_keep_sec); in rk816_bat_update_age_fcc()
2910 __func__, fcc, di->age_ocv_cap, di->age_adjust_cap, remain_cap, in rk816_bat_update_age_fcc()
2911 di->age_allow_update, age_keep_min); in rk816_bat_update_age_fcc()
2913 if ((di->chrg_status == CHARGE_FINISH) && (di->age_allow_update) && in rk816_bat_update_age_fcc()
2915 di->age_allow_update = false; in rk816_bat_update_age_fcc()
2916 fcc = remain_cap * 100 / DIV(100 - di->age_ocv_soc); in rk816_bat_update_age_fcc()
2917 BAT_INFO("lock_fcc=%d, calc_cap=%d, age: soc=%d, cap=%d, level=%d, fcc:%d->%d?\n", in rk816_bat_update_age_fcc()
2918 di->lock_fcc, remain_cap, di->age_ocv_soc, in rk816_bat_update_age_fcc()
2919 di->age_ocv_cap, di->age_level, di->fcc, fcc); in rk816_bat_update_age_fcc()
2921 if ((fcc < di->qmax) && (fcc > MIN_FCC)) { in rk816_bat_update_age_fcc()
2922 BAT_INFO("fcc:%d->%d!\n", di->fcc, fcc); in rk816_bat_update_age_fcc()
2923 di->fcc = fcc; in rk816_bat_update_age_fcc()
2924 rk816_bat_init_capacity(di, di->fcc); in rk816_bat_update_age_fcc()
2925 rk816_bat_save_fcc(di, di->fcc); in rk816_bat_update_age_fcc()
2926 rk816_bat_save_age_level(di, di->age_level); in rk816_bat_update_age_fcc()
2933 int chrg_finish_vol = di->pdata->max_chrg_voltage; in rk816_bat_wait_finish_sig()
2938 if ((di->chrg_status == CHARGE_FINISH) && in rk816_bat_wait_finish_sig()
2940 (di->voltage_avg > chrg_finish_vol - 150) && di->adc_allow_update) { in rk816_bat_wait_finish_sig()
2943 di->adc_allow_update = false; in rk816_bat_wait_finish_sig()
2953 if ((di->remain_cap != di->fcc) && in rk816_bat_finish_algorithm()
2955 di->age_adjust_cap += (di->fcc - di->remain_cap); in rk816_bat_finish_algorithm()
2956 rk816_bat_init_coulomb_cap(di, di->fcc); in rk816_bat_finish_algorithm()
2960 if (di->dsoc < 100) { in rk816_bat_finish_algorithm()
2961 if (!di->chrg_finish_base) in rk816_bat_finish_algorithm()
2962 di->chrg_finish_base = get_boot_sec(); in rk816_bat_finish_algorithm()
2964 finish_current = (di->rsoc - di->dsoc) > FINISH_MAX_SOC_DELAY ? in rk816_bat_finish_algorithm()
2966 finish_sec = base2sec(di->chrg_finish_base); in rk816_bat_finish_algorithm()
2967 soc_sec = di->fcc * 3600 / 100 / DIV(finish_current); in rk816_bat_finish_algorithm()
2971 di->dsoc += plus_soc; in rk816_bat_finish_algorithm()
2972 di->chrg_finish_base = get_boot_sec(); in rk816_bat_finish_algorithm()
2973 if (di->chrg_finish_base > rest) in rk816_bat_finish_algorithm()
2974 di->chrg_finish_base = get_boot_sec() - rest; in rk816_bat_finish_algorithm()
2978 __func__, di->dsoc, soc_sec, finish_sec, plus_soc, rest); in rk816_bat_finish_algorithm()
2986 tmp_soc = di->sm_dischrg_dsoc / 1000; in rk816_bat_calc_smooth_dischrg()
2987 if (tmp_soc == di->dsoc) in rk816_bat_calc_smooth_dischrg()
2990 DBG("<%s>. enter: dsoc=%d, rsoc=%d\n", __func__, di->dsoc, di->rsoc); in rk816_bat_calc_smooth_dischrg()
2992 if (di->dsoc < di->rsoc) { in rk816_bat_calc_smooth_dischrg()
2993 tmp_soc = di->sm_chrg_dsoc / 1000; in rk816_bat_calc_smooth_dischrg()
2994 if (tmp_soc == di->dsoc) { in rk816_bat_calc_smooth_dischrg()
2995 sm_delta_dsoc = di->sm_chrg_dsoc - di->dsoc * 1000; in rk816_bat_calc_smooth_dischrg()
2996 di->sm_chrg_dsoc = di->dsoc * 1000; in rk816_bat_calc_smooth_dischrg()
2997 di->sm_dischrg_dsoc += sm_delta_dsoc; in rk816_bat_calc_smooth_dischrg()
3004 if (di->dsoc > di->rsoc) { in rk816_bat_calc_smooth_dischrg()
3005 tmp_soc = di->zero_dsoc / 1000; in rk816_bat_calc_smooth_dischrg()
3006 if (tmp_soc == di->dsoc) { in rk816_bat_calc_smooth_dischrg()
3007 zero_delta_dsoc = di->zero_dsoc - ((di->dsoc + 1) * in rk816_bat_calc_smooth_dischrg()
3008 1000 - MIN_ACCURACY); in rk816_bat_calc_smooth_dischrg()
3009 di->zero_dsoc = (di->dsoc + 1) * 1000 - MIN_ACCURACY; in rk816_bat_calc_smooth_dischrg()
3010 di->sm_dischrg_dsoc += zero_delta_dsoc; in rk816_bat_calc_smooth_dischrg()
3017 if ((di->sm_dischrg_dsoc) > ((di->dsoc + 1) * 1000 - MIN_ACCURACY)) { in rk816_bat_calc_smooth_dischrg()
3019 di->sm_dischrg_dsoc = (di->dsoc + 1) * in rk816_bat_calc_smooth_dischrg()
3020 1000 - MIN_ACCURACY; in rk816_bat_calc_smooth_dischrg()
3024 tmp_soc = di->sm_dischrg_dsoc / 1000; in rk816_bat_calc_smooth_dischrg()
3025 if (tmp_soc != di->dsoc) { in rk816_bat_calc_smooth_dischrg()
3026 di->dsoc = tmp_soc; in rk816_bat_calc_smooth_dischrg()
3027 di->sm_chrg_dsoc = di->dsoc * 1000; in rk816_bat_calc_smooth_dischrg()
3031 __func__, di->dsoc, di->rsoc, di->sm_dischrg_dsoc, di->sm_chrg_dsoc, in rk816_bat_calc_smooth_dischrg()
3032 di->zero_dsoc); in rk816_bat_calc_smooth_dischrg()
3039 tmp_soc = di->sm_chrg_dsoc / 1000; in rk816_bat_calc_smooth_chrg()
3040 if (tmp_soc == di->dsoc) in rk816_bat_calc_smooth_chrg()
3043 DBG("<%s>. enter: dsoc=%d, rsoc=%d\n", __func__, di->dsoc, di->rsoc); in rk816_bat_calc_smooth_chrg()
3045 if (di->dsoc > di->rsoc) { in rk816_bat_calc_smooth_chrg()
3047 tmp_soc = di->sm_dischrg_dsoc / 1000; in rk816_bat_calc_smooth_chrg()
3048 if (tmp_soc == di->dsoc) { in rk816_bat_calc_smooth_chrg()
3049 sm_delta_dsoc = di->sm_dischrg_dsoc - in rk816_bat_calc_smooth_chrg()
3050 ((di->dsoc + 1) * 1000 - MIN_ACCURACY); in rk816_bat_calc_smooth_chrg()
3051 di->sm_dischrg_dsoc = (di->dsoc + 1) * 1000 - in rk816_bat_calc_smooth_chrg()
3053 di->sm_chrg_dsoc += sm_delta_dsoc; in rk816_bat_calc_smooth_chrg()
3059 tmp_soc = di->zero_dsoc / 1000; in rk816_bat_calc_smooth_chrg()
3060 if (tmp_soc == di->dsoc) { in rk816_bat_calc_smooth_chrg()
3061 zero_delta_dsoc = di->zero_dsoc - in rk816_bat_calc_smooth_chrg()
3062 ((di->dsoc + 1) * 1000 - MIN_ACCURACY); in rk816_bat_calc_smooth_chrg()
3063 di->zero_dsoc = (di->dsoc + 1) * 1000 - MIN_ACCURACY; in rk816_bat_calc_smooth_chrg()
3064 di->sm_chrg_dsoc += zero_delta_dsoc; in rk816_bat_calc_smooth_chrg()
3071 if (di->sm_chrg_dsoc < di->dsoc * 1000) { in rk816_bat_calc_smooth_chrg()
3073 di->sm_chrg_dsoc = di->dsoc * 1000; in rk816_bat_calc_smooth_chrg()
3077 tmp_soc = di->sm_chrg_dsoc / 1000; in rk816_bat_calc_smooth_chrg()
3078 if (tmp_soc != di->dsoc) { in rk816_bat_calc_smooth_chrg()
3079 di->dsoc = tmp_soc; in rk816_bat_calc_smooth_chrg()
3080 di->sm_dischrg_dsoc = (di->dsoc + 1) * 1000 - MIN_ACCURACY; in rk816_bat_calc_smooth_chrg()
3084 __func__, di->dsoc, di->rsoc, di->sm_dischrg_dsoc, di->sm_chrg_dsoc, in rk816_bat_calc_smooth_chrg()
3085 di->zero_dsoc); in rk816_bat_calc_smooth_chrg()
3093 di->remain_cap = rk816_bat_get_coulomb_cap(di); in rk816_bat_smooth_algorithm()
3096 if ((di->dsoc == 99) && (di->chrg_status == CC_OR_CV) && in rk816_bat_smooth_algorithm()
3097 (di->current_avg > 0)) { in rk816_bat_smooth_algorithm()
3098 di->sm_linek = FULL_CHRG_K; in rk816_bat_smooth_algorithm()
3100 } else if ((di->current_avg >= TERM_CHRG_CURR) && in rk816_bat_smooth_algorithm()
3101 (di->chrg_status == CC_OR_CV) && (di->dsoc >= TERM_CHRG_DSOC)) { in rk816_bat_smooth_algorithm()
3102 di->sm_linek = TERM_CHRG_K; in rk816_bat_smooth_algorithm()
3105 } else if ((di->current_avg <= SIMULATE_CHRG_CURR) && in rk816_bat_smooth_algorithm()
3106 (di->current_avg > 0) && (di->chrg_status == CC_OR_CV) && in rk816_bat_smooth_algorithm()
3107 (di->dsoc < TERM_CHRG_DSOC) && in rk816_bat_smooth_algorithm()
3108 ((di->rsoc - di->dsoc) >= SIMULATE_CHRG_INTV)) { in rk816_bat_smooth_algorithm()
3109 di->sm_linek = SIMULATE_CHRG_K; in rk816_bat_smooth_algorithm()
3113 if ((di->sm_linek * di->current_avg <= 0) || in rk816_bat_smooth_algorithm()
3114 (di->sm_linek == TERM_CHRG_K) || in rk816_bat_smooth_algorithm()
3115 (di->sm_linek == FULL_CHRG_K) || in rk816_bat_smooth_algorithm()
3116 (di->sm_linek == SIMULATE_CHRG_K)) { in rk816_bat_smooth_algorithm()
3122 old_cap = di->sm_remain_cap; in rk816_bat_smooth_algorithm()
3125 * sm_linek should change to -1000/1000 smoothly to avoid dsoc+1/-1 in rk816_bat_smooth_algorithm()
3126 * right away, so change it after flat seconds in rk816_bat_smooth_algorithm()
3128 if ((di->dsoc == di->rsoc) && (abs(di->sm_linek) != 1000) && in rk816_bat_smooth_algorithm()
3129 (di->sm_linek != FULL_CHRG_K && di->sm_linek != TERM_CHRG_K && in rk816_bat_smooth_algorithm()
3130 di->sm_linek != SIMULATE_CHRG_K)) { in rk816_bat_smooth_algorithm()
3131 if (!di->flat_match_sec) in rk816_bat_smooth_algorithm()
3132 di->flat_match_sec = get_boot_sec(); in rk816_bat_smooth_algorithm()
3133 tgt_sec = di->fcc * 3600 / 100 / DIV(abs(di->current_avg)) / 3; in rk816_bat_smooth_algorithm()
3134 if (base2sec(di->flat_match_sec) >= tgt_sec) { in rk816_bat_smooth_algorithm()
3135 di->flat_match_sec = 0; in rk816_bat_smooth_algorithm()
3136 di->sm_linek = (di->current_avg >= 0) ? 1000 : -1000; in rk816_bat_smooth_algorithm()
3139 base2sec(di->flat_match_sec), tgt_sec, di->sm_linek); in rk816_bat_smooth_algorithm()
3141 di->flat_match_sec = 0; in rk816_bat_smooth_algorithm()
3144 /* abs(k)=1000 or dsoc=100, stop calc */ in rk816_bat_smooth_algorithm()
3145 if ((abs(di->sm_linek) == 1000) || (di->current_avg >= 0 && in rk816_bat_smooth_algorithm()
3146 di->chrg_status == CC_OR_CV && di->dsoc >= 100)) { in rk816_bat_smooth_algorithm()
3147 DBG("<%s>. sm_linek=%d\n", __func__, di->sm_linek); in rk816_bat_smooth_algorithm()
3148 if (abs(di->sm_linek) == 1000) { in rk816_bat_smooth_algorithm()
3149 di->dsoc = di->rsoc; in rk816_bat_smooth_algorithm()
3150 di->sm_linek = (di->sm_linek > 0) ? 1000 : -1000; in rk816_bat_smooth_algorithm()
3152 __func__, di->sm_linek); in rk816_bat_smooth_algorithm()
3154 di->sm_remain_cap = di->remain_cap; in rk816_bat_smooth_algorithm()
3155 di->sm_chrg_dsoc = di->dsoc * 1000; in rk816_bat_smooth_algorithm()
3156 di->sm_dischrg_dsoc = (di->dsoc + 1) * 1000 - MIN_ACCURACY; in rk816_bat_smooth_algorithm()
3158 __func__, di->sm_dischrg_dsoc, di->sm_chrg_dsoc); in rk816_bat_smooth_algorithm()
3160 delta_cap = di->remain_cap - di->sm_remain_cap; in rk816_bat_smooth_algorithm()
3165 ydsoc = di->sm_linek * abs(delta_cap) * 100 / DIV(di->fcc); in rk816_bat_smooth_algorithm()
3170 di->sm_remain_cap = di->remain_cap; in rk816_bat_smooth_algorithm()
3173 __func__, di->sm_linek, ydsoc, old_cap, in rk816_bat_smooth_algorithm()
3174 di->sm_remain_cap, delta_cap); in rk816_bat_smooth_algorithm()
3178 di->sm_dischrg_dsoc += ydsoc; in rk816_bat_smooth_algorithm()
3182 di->sm_chrg_dsoc += ydsoc; in rk816_bat_smooth_algorithm()
3186 if (di->s2r) { in rk816_bat_smooth_algorithm()
3187 di->s2r = false; in rk816_bat_smooth_algorithm()
3195 if ((di->rsoc == 100) && (rk816_bat_get_chrg_status(di) == CC_OR_CV) && in rk816_bat_fake_finish_mode()
3196 (abs(di->current_avg) <= 100)) in rk816_bat_fake_finish_mode()
3205 if (di->s2r && !di->sleep_chrg_online) { in rk816_bat_display_smooth()
3207 di->s2r = false; in rk816_bat_display_smooth()
3213 if (di->work_mode == MODE_FINISH) { in rk816_bat_display_smooth()
3218 if ((di->current_avg < 0) && in rk816_bat_display_smooth()
3219 (di->voltage_avg < di->pdata->zero_algorithm_vol)) { in rk816_bat_display_smooth()
3222 di->work_mode = MODE_ZERO; in rk816_bat_display_smooth()
3226 di->work_mode = MODE_SMOOTH; in rk816_bat_display_smooth()
3229 } else if (di->work_mode == MODE_ZERO) { in rk816_bat_display_smooth()
3232 if ((di->voltage_avg >= di->pdata->zero_algorithm_vol + 50) || in rk816_bat_display_smooth()
3233 (di->current_avg >= 0)) { in rk816_bat_display_smooth()
3236 di->work_mode = MODE_SMOOTH; in rk816_bat_display_smooth()
3241 di->work_mode = MODE_FINISH; in rk816_bat_display_smooth()
3246 if ((di->current_avg < 0) && in rk816_bat_display_smooth()
3247 (di->voltage_avg < di->pdata->zero_algorithm_vol)) { in rk816_bat_display_smooth()
3250 di->work_mode = MODE_ZERO; in rk816_bat_display_smooth()
3255 di->work_mode = MODE_FINISH; in rk816_bat_display_smooth()
3264 vol = di->voltage_relax - (di->current_relax * di->bat_res) / 1000; in rk816_bat_relax_vol_calib()
3275 if (di->voltage_relax <= 0) in rk816_bat_relife_age_flag()
3278 ocv_soc = rk816_bat_vol_to_ocvsoc(di, di->voltage_relax); in rk816_bat_relife_age_flag()
3279 ocv_cap = rk816_bat_vol_to_ocvcap(di, di->voltage_relax); in rk816_bat_relife_age_flag()
3281 ocv_soc, di->sleep_dischrg_sec / 60, di->voltage_relax); in rk816_bat_relife_age_flag()
3284 if (!di->age_allow_update && ocv_soc <= 10) { in rk816_bat_relife_age_flag()
3285 di->age_voltage = di->voltage_relax; in rk816_bat_relife_age_flag()
3286 di->age_ocv_cap = ocv_cap; in rk816_bat_relife_age_flag()
3287 di->age_ocv_soc = ocv_soc; in rk816_bat_relife_age_flag()
3288 di->age_adjust_cap = 0; in rk816_bat_relife_age_flag()
3291 di->age_level = 100; in rk816_bat_relife_age_flag()
3293 di->age_level = 90; in rk816_bat_relife_age_flag()
3295 di->age_level = 80; in rk816_bat_relife_age_flag()
3298 if (soc_level > di->age_level) { in rk816_bat_relife_age_flag()
3299 di->age_allow_update = false; in rk816_bat_relife_age_flag()
3301 di->age_allow_update = true; in rk816_bat_relife_age_flag()
3302 di->age_keep_sec = get_boot_sec(); in rk816_bat_relife_age_flag()
3306 di->age_voltage, di->age_ocv_cap, ocv_soc, soc_level, in rk816_bat_relife_age_flag()
3307 di->age_allow_update, di->age_level); in rk816_bat_relife_age_flag()
3315 int pwroff_vol = di->pdata->pwroff_vol; in rk816_bat_sleep_dischrg()
3316 unsigned long sleep_sec = di->sleep_dischrg_sec; in rk816_bat_sleep_dischrg()
3319 __func__, di->dsoc, di->rsoc, di->voltage_relax, in rk816_bat_sleep_dischrg()
3320 di->voltage_avg, sleep_sec / 60); in rk816_bat_sleep_dischrg()
3322 if (di->voltage_relax >= di->voltage_avg) { in rk816_bat_sleep_dischrg()
3330 if (di->dsoc <= di->rsoc) { in rk816_bat_sleep_dischrg()
3331 di->sleep_sum_cap = (SLP_CURR_MIN * sleep_sec / 3600); in rk816_bat_sleep_dischrg()
3332 sleep_soc = di->sleep_sum_cap * 100 / DIV(di->fcc); in rk816_bat_sleep_dischrg()
3333 tgt_dsoc = di->dsoc - sleep_soc; in rk816_bat_sleep_dischrg()
3336 di->rsoc, di->dsoc, sleep_soc); in rk816_bat_sleep_dischrg()
3337 if (di->dsoc < 5) { in rk816_bat_sleep_dischrg()
3338 di->dsoc--; in rk816_bat_sleep_dischrg()
3339 } else if ((tgt_dsoc < 5) && (di->dsoc >= 5)) { in rk816_bat_sleep_dischrg()
3340 if (di->dsoc == 5) in rk816_bat_sleep_dischrg()
3341 di->dsoc--; in rk816_bat_sleep_dischrg()
3343 di->dsoc = 5; in rk816_bat_sleep_dischrg()
3345 di->dsoc = tgt_dsoc; in rk816_bat_sleep_dischrg()
3350 __func__, di->sleep_sum_cap, sleep_soc, tgt_dsoc); in rk816_bat_sleep_dischrg()
3352 /*di->dsoc > di->rsoc*/ in rk816_bat_sleep_dischrg()
3353 di->sleep_sum_cap = (SLP_CURR_MAX * sleep_sec / 3600); in rk816_bat_sleep_dischrg()
3354 sleep_soc = di->sleep_sum_cap / DIV(di->fcc / 100); in rk816_bat_sleep_dischrg()
3355 gap_soc = di->dsoc - di->rsoc; in rk816_bat_sleep_dischrg()
3358 di->rsoc, di->dsoc, sleep_soc); in rk816_bat_sleep_dischrg()
3360 if ((gap_soc - 5) > (sleep_soc * 2)) in rk816_bat_sleep_dischrg()
3361 di->dsoc -= (sleep_soc * 2); in rk816_bat_sleep_dischrg()
3363 di->dsoc -= sleep_soc; in rk816_bat_sleep_dischrg()
3365 di->dsoc = di->rsoc; in rk816_bat_sleep_dischrg()
3369 __func__, di->sleep_sum_cap, sleep_soc, gap_soc); in rk816_bat_sleep_dischrg()
3372 if (di->voltage_avg <= pwroff_vol - 70) { in rk816_bat_sleep_dischrg()
3373 di->dsoc = 0; in rk816_bat_sleep_dischrg()
3375 BAT_INFO("low power sleeping, shutdown... %d\n", di->dsoc); in rk816_bat_sleep_dischrg()
3378 if (ocv_soc_updated && sleep_soc && (di->rsoc - di->dsoc) < 5 && in rk816_bat_sleep_dischrg()
3379 di->dsoc < 40) { in rk816_bat_sleep_dischrg()
3380 di->dsoc--; in rk816_bat_sleep_dischrg()
3381 BAT_INFO("low power sleeping, reserved... %d\n", di->dsoc); in rk816_bat_sleep_dischrg()
3384 if (di->dsoc <= 0) { in rk816_bat_sleep_dischrg()
3385 di->dsoc = 0; in rk816_bat_sleep_dischrg()
3387 BAT_INFO("sleep dsoc is %d...\n", di->dsoc); in rk816_bat_sleep_dischrg()
3391 __func__, di->dsoc, di->rsoc, di->sleep_sum_cap); in rk816_bat_sleep_dischrg()
3399 static int old_soc = -1; in rk816_bat_power_supply_changed()
3402 if (di->dsoc > 100) in rk816_bat_power_supply_changed()
3403 di->dsoc = 100; in rk816_bat_power_supply_changed()
3404 else if (di->dsoc < 0) in rk816_bat_power_supply_changed()
3405 di->dsoc = 0; in rk816_bat_power_supply_changed()
3409 if (di->dsoc == 100) in rk816_bat_power_supply_changed()
3410 di->prop_status = POWER_SUPPLY_STATUS_FULL; in rk816_bat_power_supply_changed()
3412 di->prop_status = POWER_SUPPLY_STATUS_CHARGING; in rk816_bat_power_supply_changed()
3413 rk816_bat_update_leds(di, di->prop_status); in rk816_bat_power_supply_changed()
3416 if (di->dsoc == old_soc) in rk816_bat_power_supply_changed()
3423 old_soc = di->dsoc; in rk816_bat_power_supply_changed()
3424 di->last_dsoc = di->dsoc; in rk816_bat_power_supply_changed()
3425 power_supply_changed(di->bat); in rk816_bat_power_supply_changed()
3427 di->dsoc, di->rsoc, di->voltage_avg, di->voltage_ocv, in rk816_bat_power_supply_changed()
3428 di->current_avg, di->remain_cap, di->fcc, bat_status[status], in rk816_bat_power_supply_changed()
3432 di->dbg_pwr_dsoc, di->dbg_pwr_rsoc, di->dbg_pwr_vol, in rk816_bat_power_supply_changed()
3433 di->is_halt, di->halt_cnt, di->is_max_soc_offset, in rk816_bat_power_supply_changed()
3434 di->is_initialized, di->is_sw_reset, di->is_ocv_calib, in rk816_bat_power_supply_changed()
3435 di->dbg_cap_low0, di->is_force_calib); in rk816_bat_power_supply_changed()
3446 BAT_INFO("reboot: %d --> %d\n", di->dsoc, di->rsoc); in rk816_bat_check_reboot()
3447 di->dsoc = di->rsoc; in rk816_bat_check_reboot()
3448 if (di->dsoc > 100) in rk816_bat_check_reboot()
3449 di->dsoc = 100; in rk816_bat_check_reboot()
3450 else if (di->dsoc < 0) in rk816_bat_check_reboot()
3451 di->dsoc = 0; in rk816_bat_check_reboot()
3452 rk816_bat_save_dsoc(di, di->dsoc); in rk816_bat_check_reboot()
3483 if ((di->remain_cap < 0) && (di->fb_blank != 0)) { in rk816_bat_rsoc_daemon()
3486 wake_lock_timeout(&di->wake_lock, in rk816_bat_rsoc_daemon()
3487 (di->pdata->monitor_sec + 1) * HZ); in rk816_bat_rsoc_daemon()
3491 di->dbg_cap_low0++; in rk816_bat_rsoc_daemon()
3492 est_vol = di->voltage_avg - in rk816_bat_rsoc_daemon()
3493 (di->bat_res * di->current_avg) / 1000; in rk816_bat_rsoc_daemon()
3496 BAT_INFO("adjust cap below 0 --> %d, rsoc=%d\n", in rk816_bat_rsoc_daemon()
3497 di->remain_cap, di->rsoc); in rk816_bat_rsoc_daemon()
3498 wake_unlock(&di->wake_lock); in rk816_bat_rsoc_daemon()
3509 di->voltage_avg = rk816_bat_get_avg_voltage(di); in rk816_bat_update_info()
3510 di->current_avg = rk816_bat_get_avg_current(di); in rk816_bat_update_info()
3511 di->chrg_status = rk816_bat_get_chrg_status(di); in rk816_bat_update_info()
3512 di->voltage_relax = rk816_bat_get_relax_voltage(di); in rk816_bat_update_info()
3513 di->rsoc = rk816_bat_get_rsoc(di); in rk816_bat_update_info()
3514 di->remain_cap = rk816_bat_get_coulomb_cap(di); in rk816_bat_update_info()
3516 if (is_charging != di->is_charging) { in rk816_bat_update_info()
3517 di->is_charging = is_charging; in rk816_bat_update_info()
3519 di->charge_count++; in rk816_bat_update_info()
3521 if (di->voltage_avg > di->voltage_max) in rk816_bat_update_info()
3522 di->voltage_max = di->voltage_avg; in rk816_bat_update_info()
3523 if (di->current_avg > di->current_max) in rk816_bat_update_info()
3524 di->current_max = di->current_avg; in rk816_bat_update_info()
3527 if (di->remain_cap > di->fcc) { in rk816_bat_update_info()
3528 di->sm_remain_cap -= (di->remain_cap - di->fcc); in rk816_bat_update_info()
3530 __func__, di->remain_cap, di->sm_remain_cap); in rk816_bat_update_info()
3531 rk816_bat_init_coulomb_cap(di, di->fcc); in rk816_bat_update_info()
3534 if (di->chrg_status != CHARGE_FINISH) in rk816_bat_update_info()
3535 di->chrg_finish_base = get_boot_sec(); in rk816_bat_update_info()
3542 if (base2min(di->plug_out_base) > 120) in rk816_bat_update_info()
3543 di->age_allow_update = false; in rk816_bat_update_info()
3545 if (di->chrg_status == CC_OR_CV) { in rk816_bat_update_info()
3546 di->adc_allow_update = true; in rk816_bat_update_info()
3547 di->adc_calib_cnt = 0; in rk816_bat_update_info()
3565 di->algo_rest_mode = (buf & ALGO_REST_MODE_MSK) >> ALGO_REST_MODE_SHIFT; in rk816_bat_init_dsoc_algorithm()
3568 if (di->algo_rest_mode == MODE_FINISH) { in rk816_bat_init_dsoc_algorithm()
3569 soc_sec = di->fcc * 3600 / 100 / FINISH_CHRG_CUR1; in rk816_bat_init_dsoc_algorithm()
3571 if (di->dsoc < 100) { in rk816_bat_init_dsoc_algorithm()
3572 di->dsoc++; in rk816_bat_init_dsoc_algorithm()
3573 di->algo_rest_val = rest % soc_sec; in rk816_bat_init_dsoc_algorithm()
3575 rest, di->dsoc); in rk816_bat_init_dsoc_algorithm()
3577 di->algo_rest_val = 0; in rk816_bat_init_dsoc_algorithm()
3580 di->algo_rest_val = rest; in rk816_bat_init_dsoc_algorithm()
3583 di->algo_rest_val = rest; in rk816_bat_init_dsoc_algorithm()
3589 if (di->dsoc < di->rsoc) { in rk816_bat_init_dsoc_algorithm()
3590 di->dsoc++; in rk816_bat_init_dsoc_algorithm()
3591 di->algo_rest_val = rest % 1000; in rk816_bat_init_dsoc_algorithm()
3593 rest, di->dsoc); in rk816_bat_init_dsoc_algorithm()
3595 di->algo_rest_val = 0; in rk816_bat_init_dsoc_algorithm()
3599 if (di->dsoc > di->rsoc) { in rk816_bat_init_dsoc_algorithm()
3600 di->dsoc--; in rk816_bat_init_dsoc_algorithm()
3601 di->algo_rest_val = rest % 1000; in rk816_bat_init_dsoc_algorithm()
3603 rest, di->dsoc); in rk816_bat_init_dsoc_algorithm()
3605 di->algo_rest_val = 0; in rk816_bat_init_dsoc_algorithm()
3608 di->algo_rest_val = rest; in rk816_bat_init_dsoc_algorithm()
3612 if (di->dsoc >= 100) in rk816_bat_init_dsoc_algorithm()
3613 di->dsoc = 100; in rk816_bat_init_dsoc_algorithm()
3614 else if (di->dsoc <= 0) in rk816_bat_init_dsoc_algorithm()
3615 di->dsoc = 0; in rk816_bat_init_dsoc_algorithm()
3618 di->voltage_avg = rk816_bat_get_avg_voltage(di); in rk816_bat_init_dsoc_algorithm()
3619 di->current_avg = rk816_bat_get_avg_current(di); in rk816_bat_init_dsoc_algorithm()
3622 di->work_mode = MODE_FINISH; in rk816_bat_init_dsoc_algorithm()
3625 di->work_mode = MODE_SMOOTH; in rk816_bat_init_dsoc_algorithm()
3630 __func__, rest, di->algo_rest_val, mode_name[di->algo_rest_mode], in rk816_bat_init_dsoc_algorithm()
3631 di->zero_dsoc, di->sm_chrg_dsoc, di->sm_dischrg_dsoc, in rk816_bat_init_dsoc_algorithm()
3632 di->chrg_finish_base); in rk816_bat_init_dsoc_algorithm()
3646 tmp_soc = (di->zero_dsoc) / 1000; in rk816_bat_save_algo_rest()
3647 if (tmp_soc == di->dsoc) in rk816_bat_save_algo_rest()
3648 zero_rest = di->zero_dsoc - ((di->dsoc + 1) * 1000 - in rk816_bat_save_algo_rest()
3652 tmp_soc = di->sm_chrg_dsoc / 1000; in rk816_bat_save_algo_rest()
3653 if (tmp_soc == di->dsoc) in rk816_bat_save_algo_rest()
3654 sm_chrg_rest = di->sm_chrg_dsoc - di->dsoc * 1000; in rk816_bat_save_algo_rest()
3657 tmp_soc = (di->sm_dischrg_dsoc) / 1000; in rk816_bat_save_algo_rest()
3658 if (tmp_soc == di->dsoc) in rk816_bat_save_algo_rest()
3659 sm_dischrg_rest = di->sm_dischrg_dsoc - ((di->dsoc + 1) * 1000 - in rk816_bat_save_algo_rest()
3663 if (di->algo_rest_mode == MODE_FINISH && di->algo_rest_val) in rk816_bat_save_algo_rest()
3664 finish_rest = base2sec(di->chrg_finish_base) + in rk816_bat_save_algo_rest()
3665 di->algo_rest_val; in rk816_bat_save_algo_rest()
3667 finish_rest = base2sec(di->chrg_finish_base); in rk816_bat_save_algo_rest()
3670 if ((rk816_bat_chrg_online(di) && (di->dsoc > di->rsoc)) || in rk816_bat_save_algo_rest()
3671 (!rk816_bat_chrg_online(di) && (di->dsoc < di->rsoc)) || in rk816_bat_save_algo_rest()
3672 (di->dsoc == di->rsoc)) { in rk816_bat_save_algo_rest()
3673 di->algo_rest_val = 0; in rk816_bat_save_algo_rest()
3676 } else if (di->work_mode == MODE_FINISH) { in rk816_bat_save_algo_rest()
3679 } else if (di->algo_rest_mode == MODE_FINISH) { in rk816_bat_save_algo_rest()
3683 if (rk816_bat_chrg_online(di) && (di->dsoc < di->rsoc)) in rk816_bat_save_algo_rest()
3684 algo_rest = sm_chrg_rest + di->algo_rest_val; in rk816_bat_save_algo_rest()
3685 else if (!rk816_bat_chrg_online(di) && (di->dsoc > di->rsoc)) in rk816_bat_save_algo_rest()
3687 di->algo_rest_val; in rk816_bat_save_algo_rest()
3690 di->algo_rest_val; in rk816_bat_save_algo_rest()
3695 if ((di->work_mode == MODE_FINISH) || (di->work_mode == MODE_ZERO)) { in rk816_bat_save_algo_rest()
3696 mode = di->work_mode; in rk816_bat_save_algo_rest()
3698 if (di->sm_linek > 0) in rk816_bat_save_algo_rest()
3717 __func__, algo_rest, mode_name[mode], di->algo_rest_val, zero_rest, in rk816_bat_save_algo_rest()
3718 sm_chrg_rest, sm_dischrg_rest, base2sec(di->chrg_finish_base)); in rk816_bat_save_algo_rest()
3723 rk816_bat_save_dsoc(di, di->dsoc); in rk816_bat_save_data()
3724 rk816_bat_save_cap(di, di->remain_cap); in rk816_bat_save_data()
3736 res = ((di->voltage_k * val) / 1000 + di->voltage_b) * 1000 / 2200; in rk816_bat_get_ntc_res()
3737 res = res * 1000 / di->pdata->ntc_factor; in rk816_bat_get_ntc_res()
3740 __func__, val, res, di->pdata->ntc_factor); in rk816_bat_get_ntc_res()
3743 di->pdata->ntc_degree_from, di->pdata->ntc_table[0], in rk816_bat_get_ntc_res()
3744 di->pdata->ntc_degree_from + di->pdata->ntc_size - 1, in rk816_bat_get_ntc_res()
3745 di->pdata->ntc_table[di->pdata->ntc_size - 1]); in rk816_bat_get_ntc_res()
3752 static int temp_triggered, config_index = -1; in rk816_bat_temperature_chrg()
3758 for (i = 0; i < di->pdata->tc_count; i++) { in rk816_bat_temperature_chrg()
3759 up_temp = di->pdata->tc_table[i].temp_up; in rk816_bat_temperature_chrg()
3760 down_temp = di->pdata->tc_table[i].temp_down; in rk816_bat_temperature_chrg()
3761 cfg_current = di->pdata->tc_table[i].chrg_current; in rk816_bat_temperature_chrg()
3765 if (config_index == i && !di->charger_changed) in rk816_bat_temperature_chrg()
3769 di->charger_changed = 0; in rk816_bat_temperature_chrg()
3772 if (di->pdata->tc_table[i].set_chrg_current) { in rk816_bat_temperature_chrg()
3774 if (!di->over_20mR) in rk816_bat_temperature_chrg()
3777 di->res_fac); in rk816_bat_temperature_chrg()
3781 di->res_fac); in rk816_bat_temperature_chrg()
3800 config_index = -1; in rk816_bat_temperature_chrg()
3801 rk816_bat_set_chrg_current(di, di->chrg_cur_sel); in rk816_bat_temperature_chrg()
3802 if (di->ac_in || di->dc_in) in rk816_bat_temperature_chrg()
3803 rk816_bat_set_input_current(di, di->chrg_cur_input); in rk816_bat_temperature_chrg()
3809 if (!di->over_20mR) in rk816_bat_temperature_chrg()
3811 RES_FAC_MUX(CHRG_CUR_SEL[cfg_current], di->res_fac); in rk816_bat_temperature_chrg()
3814 RES_FAC_DIV(CHRG_CUR_SEL[cfg_current], di->res_fac); in rk816_bat_temperature_chrg()
3827 ntc_table = di->pdata->ntc_table; in rk816_bat_update_temperature()
3828 ntc_size = di->pdata->ntc_size; in rk816_bat_update_temperature()
3829 di->temperature = VIRTUAL_TEMPERATURE; in rk816_bat_update_temperature()
3833 if (res < ntc_table[ntc_size - 1]) { in rk816_bat_update_temperature()
3845 di->temperature = (i + di->pdata->ntc_degree_from) * 10; in rk816_bat_update_temperature()
3846 rk816_bat_temperature_chrg(di, di->temperature / 10); in rk816_bat_update_temperature()
3856 int i, curr_temp = di->temperature / 10; in rk816_bat_update_ocv_table()
3858 if (di->pdata->temp_t_num < 2) in rk816_bat_update_ocv_table()
3872 temperature_sum -= temp_record_table[temp_idx]; in rk816_bat_update_ocv_table()
3897 for (i = 0; i < di->pdata->ocv_size; i++) in rk816_bat_update_ocv_table()
3898 DBG("* ocv_table[%d]=%d\n", i, di->pdata->ocv_table[i]); in rk816_bat_update_ocv_table()
3919 queue_delayed_work(di->bat_monitor_wq, &di->bat_delay_work, in rk816_battery_work()
3920 msecs_to_jiffies(di->monitor_ms)); in rk816_battery_work()
3928 if (extcon_get_state(di->cable_edev, EXTCON_USB) == 0) { in rk816_bat_discnt_evt_worker()
3938 struct extcon_dev *edev = di->cable_edev; in rk816_bat_host_evt_worker()
3944 if (di->dc_in && di->pdata->power_dc2otg) in rk816_bat_host_evt_worker()
3959 struct extcon_dev *edev = di->cable_edev; in rk816_bat_charger_evt_worker()
3986 queue_delayed_work(di->usb_charger_wq, &di->usb_work, in rk816_bat_charger_evt_notifier()
3998 queue_delayed_work(di->usb_charger_wq, &di->discnt_work, in rk816_bat_discnt_evt_notfier()
4010 queue_delayed_work(di->usb_charger_wq, &di->host_work, in rk816_bat_host_evt_notifier()
4021 di->voltage_avg); in rk816_vb_low_irq()
4022 di->dsoc = 0; in rk816_vb_low_irq()
4024 power_supply_changed(di->bat); in rk816_vb_low_irq()
4041 di->cvtlmt_int_event = 1; in rk816_cvtlmt()
4059 if (gpio_get_value(di->pdata->dc_det_pin)) in rk816_vbat_dc_det()
4065 queue_delayed_work(di->usb_charger_wq, in rk816_vbat_dc_det()
4066 &di->dc_delay_work, msecs_to_jiffies(500)); in rk816_vbat_dc_det()
4077 ret = sysfs_create_file(&di->dev->kobj, in rk816_bat_init_sysfs()
4080 dev_err(di->dev, "create bat node(%s) error\n", in rk816_bat_init_sysfs()
4089 struct rk808 *rk816 = di->rk816; in rk816_bat_init_irqs()
4090 struct platform_device *pdev = di->pdev; in rk816_bat_init_irqs()
4092 vb_lo_irq = regmap_irq_get_virq(rk816->irq_data, RK816_IRQ_VB_LOW); in rk816_bat_init_irqs()
4094 dev_err(&pdev->dev, "find vb_lo_irq error\n"); in rk816_bat_init_irqs()
4098 plug_in_irq = regmap_irq_get_virq(rk816->battery_irq_data, in rk816_bat_init_irqs()
4101 dev_err(&pdev->dev, "find plug_in_irq error\n"); in rk816_bat_init_irqs()
4105 plug_out_irq = regmap_irq_get_virq(rk816->battery_irq_data, in rk816_bat_init_irqs()
4108 dev_err(&pdev->dev, "find plug_out_irq error\n"); in rk816_bat_init_irqs()
4112 cvtlmt_irq = regmap_irq_get_virq(rk816->battery_irq_data, in rk816_bat_init_irqs()
4115 dev_err(&pdev->dev, "find cvtlmt_irq error\n"); in rk816_bat_init_irqs()
4120 ret = devm_request_threaded_irq(di->dev, vb_lo_irq, NULL, in rk816_bat_init_irqs()
4125 dev_err(di->dev, "vb low irq request failed!\n"); in rk816_bat_init_irqs()
4132 ret = devm_request_threaded_irq(di->dev, plug_in_irq, NULL, in rk816_bat_init_irqs()
4137 dev_err(di->dev, "plug in irq request failed!\n"); in rk816_bat_init_irqs()
4142 ret = devm_request_threaded_irq(di->dev, plug_out_irq, NULL, in rk816_bat_init_irqs()
4147 dev_err(di->dev, "plug out irq request failed!\n"); in rk816_bat_init_irqs()
4152 ret = devm_request_threaded_irq(di->dev, cvtlmt_irq, NULL, in rk816_bat_init_irqs()
4157 dev_err(di->dev, "cvtlmt irq request failed!\n"); in rk816_bat_init_irqs()
4162 di->cvtlmt_irq = cvtlmt_irq; in rk816_bat_init_irqs()
4169 di->design_cap = di->pdata->design_capacity; in rk816_bat_init_info()
4170 di->qmax = di->pdata->design_qmax; in rk816_bat_init_info()
4171 di->bat_res = di->pdata->bat_res; in rk816_bat_init_info()
4172 di->sleep_chrg_status = rk816_bat_get_chrg_status(di); in rk816_bat_init_info()
4173 di->monitor_ms = di->pdata->monitor_sec * TIMER_MS_COUNTS; in rk816_bat_init_info()
4174 di->prop_status = POWER_SUPPLY_STATUS_DISCHARGING; in rk816_bat_init_info()
4175 di->boot_base = POWER_ON_SEC_BASE; in rk816_bat_init_info()
4176 di->chrg_finish_base = 0; in rk816_bat_init_info()
4177 di->plug_in_base = 0; in rk816_bat_init_info()
4178 di->plug_out_base = 0; in rk816_bat_init_info()
4193 if (gpio_is_valid(di->pdata->dc_det_pin)) { in rk816_bat_init_gpio_dc_det()
4194 ret = devm_gpio_request(di->dev, di->pdata->dc_det_pin, in rk816_bat_init_gpio_dc_det()
4197 dev_err(di->dev, "Failed to request gpio %d\n", in rk816_bat_init_gpio_dc_det()
4198 di->pdata->dc_det_pin); in rk816_bat_init_gpio_dc_det()
4202 ret = gpio_direction_input(di->pdata->dc_det_pin); in rk816_bat_init_gpio_dc_det()
4204 dev_err(di->dev, "failed to set gpio input\n"); in rk816_bat_init_gpio_dc_det()
4208 level = gpio_get_value(di->pdata->dc_det_pin); in rk816_bat_init_gpio_dc_det()
4209 if (level == di->pdata->dc_det_level) in rk816_bat_init_gpio_dc_det()
4219 dc_det_irq = gpio_to_irq(di->pdata->dc_det_pin); in rk816_bat_init_gpio_dc_det()
4220 ret = devm_request_irq(di->dev, dc_det_irq, rk816_vbat_dc_det, in rk816_bat_init_gpio_dc_det()
4223 dev_err(di->dev, "rk816_dc_det_irq request failed!\n"); in rk816_bat_init_gpio_dc_det()
4237 if (di->pdata->dc_det_adc) in rk816_bat_init_dc_det()
4248 struct device *dev = di->dev; in rk816_bat_init_charger()
4252 di->usb_charger_wq = alloc_ordered_workqueue("%s", in rk816_bat_init_charger()
4254 "rk816-bat-charger-wq"); in rk816_bat_init_charger()
4255 INIT_DELAYED_WORK(&di->dc_delay_work, rk816_bat_dc_delay_work); in rk816_bat_init_charger()
4258 edev = extcon_get_edev_by_phandle(dev->parent, 0); in rk816_bat_init_charger()
4260 if (PTR_ERR(edev) != -EPROBE_DEFER) in rk816_bat_init_charger()
4266 INIT_DELAYED_WORK(&di->usb_work, rk816_bat_charger_evt_worker); in rk816_bat_init_charger()
4267 di->cable_cg_nb.notifier_call = rk816_bat_charger_evt_notifier; in rk816_bat_init_charger()
4269 &di->cable_cg_nb); in rk816_bat_init_charger()
4276 &di->cable_cg_nb); in rk816_bat_init_charger()
4280 &di->cable_cg_nb); in rk816_bat_init_charger()
4285 &di->cable_cg_nb); in rk816_bat_init_charger()
4289 &di->cable_cg_nb); in rk816_bat_init_charger()
4291 &di->cable_cg_nb); in rk816_bat_init_charger()
4296 INIT_DELAYED_WORK(&di->host_work, rk816_bat_host_evt_worker); in rk816_bat_init_charger()
4297 di->cable_host_nb.notifier_call = rk816_bat_host_evt_notifier; in rk816_bat_init_charger()
4299 &di->cable_host_nb); in rk816_bat_init_charger()
4303 &di->cable_cg_nb); in rk816_bat_init_charger()
4305 &di->cable_cg_nb); in rk816_bat_init_charger()
4307 &di->cable_cg_nb); in rk816_bat_init_charger()
4313 INIT_DELAYED_WORK(&di->discnt_work, rk816_bat_discnt_evt_worker); in rk816_bat_init_charger()
4314 di->cable_discnt_nb.notifier_call = rk816_bat_discnt_evt_notfier; in rk816_bat_init_charger()
4316 &di->cable_discnt_nb); in rk816_bat_init_charger()
4320 &di->cable_cg_nb); in rk816_bat_init_charger()
4322 &di->cable_cg_nb); in rk816_bat_init_charger()
4324 &di->cable_cg_nb); in rk816_bat_init_charger()
4326 &di->cable_host_nb); in rk816_bat_init_charger()
4330 di->cable_edev = edev; in rk816_bat_init_charger()
4333 schedule_delayed_work(&di->host_work, 0); in rk816_bat_init_charger()
4334 schedule_delayed_work(&di->usb_work, 0); in rk816_bat_init_charger()
4339 if (di->pdata->dc_det_adc) in rk816_bat_init_charger()
4340 queue_delayed_work(di->usb_charger_wq, &di->dc_delay_work, in rk816_bat_init_charger()
4345 if (di->dc_in && di->otg_in && di->pdata->power_dc2otg) { in rk816_bat_init_charger()
4361 dev_err(rtc->dev.parent, "read hardware clk failed\n"); in rk816_get_rtc_sec()
4367 dev_err(rtc->dev.parent, "invalid date time\n"); in rk816_get_rtc_sec()
4378 interval_sec = rk816_get_rtc_sec() - di->rtc_base; in rk816_bat_rtc_sleep_sec()
4387 if (!di->pdata->ntc_size) in rk816_bat_init_ts_detect()
4403 if (di->pdata->ntc_factor == NTC_CALC_FACTOR_80UA) in rk816_bat_init_ts_detect()
4405 else if (di->pdata->ntc_factor == NTC_CALC_FACTOR_60UA) in rk816_bat_init_ts_detect()
4407 else if (di->pdata->ntc_factor == NTC_CALC_FACTOR_40UA) in rk816_bat_init_ts_detect()
4431 rk816_bat_setup_ocv_table(di, di->temperature / 10); in rk816_bat_init_fg()
4433 rk816_bat_init_coulomb_cap(di, di->nac); in rk816_bat_init_fg()
4440 di->voltage_avg = rk816_bat_get_avg_voltage(di); in rk816_bat_init_fg()
4441 di->voltage_ocv = rk816_bat_get_ocv_voltage(di); in rk816_bat_init_fg()
4442 di->voltage_relax = rk816_bat_get_relax_voltage(di); in rk816_bat_init_fg()
4443 di->current_avg = rk816_bat_get_avg_current(di); in rk816_bat_init_fg()
4444 di->current_relax = rk816_bat_get_relax_current(di); in rk816_bat_init_fg()
4445 di->remain_cap = rk816_bat_get_coulomb_cap(di); in rk816_bat_init_fg()
4446 di->dbg_pwr_dsoc = di->dsoc; in rk816_bat_init_fg()
4447 di->dbg_pwr_rsoc = di->rsoc; in rk816_bat_init_fg()
4448 di->dbg_pwr_vol = di->voltage_avg; in rk816_bat_init_fg()
4452 di->nac, di->remain_cap, di->voltage_ocv, di->voltage_avg, in rk816_bat_init_fg()
4453 di->voltage_relax, di->dsoc, di->rsoc, di->current_avg); in rk816_bat_init_fg()
4459 struct battery_platform_data *pdata = di->pdata; in rk816_bat_read_ocv_tables()
4470 pdata->table_t[idx], in rk816_bat_read_ocv_tables()
4471 pdata->ocv_size)) { in rk816_bat_read_ocv_tables()
4472 dev_err(di->dev, "invalid table_t0\n"); in rk816_bat_read_ocv_tables()
4473 return -EINVAL; in rk816_bat_read_ocv_tables()
4478 dev_err(di->dev, "invalid temp_t0\n"); in rk816_bat_read_ocv_tables()
4479 return -EINVAL; in rk816_bat_read_ocv_tables()
4482 pdata->temp_t[idx] = -value; in rk816_bat_read_ocv_tables()
4484 pdata->temp_t[idx] = value; in rk816_bat_read_ocv_tables()
4494 pdata->table_t[idx], in rk816_bat_read_ocv_tables()
4495 pdata->ocv_size)) { in rk816_bat_read_ocv_tables()
4496 dev_err(di->dev, "invalid table_t1\n"); in rk816_bat_read_ocv_tables()
4497 return -EINVAL; in rk816_bat_read_ocv_tables()
4502 dev_err(di->dev, "invalid temp_t1\n"); in rk816_bat_read_ocv_tables()
4503 return -EINVAL; in rk816_bat_read_ocv_tables()
4506 pdata->temp_t[idx] = -value; in rk816_bat_read_ocv_tables()
4508 pdata->temp_t[idx] = value; in rk816_bat_read_ocv_tables()
4518 pdata->table_t[idx], in rk816_bat_read_ocv_tables()
4519 pdata->ocv_size)) { in rk816_bat_read_ocv_tables()
4520 dev_err(di->dev, "invalid table_t2\n"); in rk816_bat_read_ocv_tables()
4521 return -EINVAL; in rk816_bat_read_ocv_tables()
4526 dev_err(di->dev, "invalid temp_t2\n"); in rk816_bat_read_ocv_tables()
4527 return -EINVAL; in rk816_bat_read_ocv_tables()
4530 pdata->temp_t[idx] = -value; in rk816_bat_read_ocv_tables()
4532 pdata->temp_t[idx] = value; in rk816_bat_read_ocv_tables()
4542 pdata->table_t[idx], in rk816_bat_read_ocv_tables()
4543 pdata->ocv_size)) { in rk816_bat_read_ocv_tables()
4544 dev_err(di->dev, "invalid table_t3\n"); in rk816_bat_read_ocv_tables()
4545 return -EINVAL; in rk816_bat_read_ocv_tables()
4550 dev_err(di->dev, "invalid temp_t3\n"); in rk816_bat_read_ocv_tables()
4551 return -EINVAL; in rk816_bat_read_ocv_tables()
4554 pdata->temp_t[idx] = -value; in rk816_bat_read_ocv_tables()
4556 pdata->temp_t[idx] = value; in rk816_bat_read_ocv_tables()
4560 di->pdata->temp_t_num = idx; in rk816_bat_read_ocv_tables()
4562 DBG("realtime ocv table nums=%d\n", di->pdata->temp_t_num); in rk816_bat_read_ocv_tables()
4565 for (j = 0; j < pdata->temp_t_num; j++) { in rk816_bat_read_ocv_tables()
4566 DBG("\n\ntemperature[%d]=%d\n", j, pdata->temp_t[j]); in rk816_bat_read_ocv_tables()
4567 for (i = 0; i < di->pdata->ocv_size; i++) in rk816_bat_read_ocv_tables()
4569 j, i, pdata->table_t[j][i]); in rk816_bat_read_ocv_tables()
4589 dev_err(di->dev, in parse_temperature_chrg_table()
4591 return -EINVAL; in parse_temperature_chrg_table()
4595 di->pdata->tc_count = count; in parse_temperature_chrg_table()
4596 di->pdata->tc_table = devm_kzalloc(di->dev, in parse_temperature_chrg_table()
4597 count * sizeof(*di->pdata->tc_table), in parse_temperature_chrg_table()
4599 if (!di->pdata->tc_table) in parse_temperature_chrg_table()
4600 return -ENOMEM; in parse_temperature_chrg_table()
4604 di->pdata->tc_table[i].temp_down = be32_to_cpu(*list++); in parse_temperature_chrg_table()
4605 di->pdata->tc_table[i].temp_up = be32_to_cpu(*list++); in parse_temperature_chrg_table()
4614 di->pdata->tc_table[i].set_chrg_current = 1; in parse_temperature_chrg_table()
4615 di->pdata->tc_table[i].chrg_current = in parse_temperature_chrg_table()
4618 di->pdata->tc_table[i].chrg_current = in parse_temperature_chrg_table()
4623 i, di->pdata->tc_table[i].temp_down, in parse_temperature_chrg_table()
4624 di->pdata->tc_table[i].temp_up, in parse_temperature_chrg_table()
4625 di->pdata->tc_table[i].chrg_current); in parse_temperature_chrg_table()
4639 struct device *dev = di->dev; in rk816_bat_parse_dt()
4642 np = of_find_node_by_name(di->rk816->i2c->dev.of_node, "battery"); in rk816_bat_parse_dt()
4645 return -ENODEV; in rk816_bat_parse_dt()
4648 pdata = devm_kzalloc(di->dev, sizeof(*pdata), GFP_KERNEL); in rk816_bat_parse_dt()
4650 return -ENOMEM; in rk816_bat_parse_dt()
4652 di->pdata = pdata; in rk816_bat_parse_dt()
4654 pdata->bat_res = DEFAULT_BAT_RES; in rk816_bat_parse_dt()
4655 pdata->monitor_sec = DEFAULT_MONITOR_SEC; in rk816_bat_parse_dt()
4656 pdata->pwroff_vol = DEFAULT_PWROFF_VOL_THRESD; in rk816_bat_parse_dt()
4657 pdata->sleep_exit_current = DEFAULT_SLP_EXIT_CUR; in rk816_bat_parse_dt()
4658 pdata->sleep_enter_current = DEFAULT_SLP_ENTER_CUR; in rk816_bat_parse_dt()
4659 pdata->sleep_filter_current = DEFAULT_SLP_FILTER_CUR; in rk816_bat_parse_dt()
4660 pdata->bat_mode = MODE_BATTARY; in rk816_bat_parse_dt()
4661 pdata->max_soc_offset = DEFAULT_MAX_SOC_OFFSET; in rk816_bat_parse_dt()
4662 pdata->fb_temp = DEFAULT_FB_TEMP; in rk816_bat_parse_dt()
4663 pdata->energy_mode = DEFAULT_ENERGY_MODE; in rk816_bat_parse_dt()
4664 pdata->zero_reserve_dsoc = DEFAULT_ZERO_RESERVE_DSOC; in rk816_bat_parse_dt()
4665 pdata->sample_res = DEFAULT_SAMPLE_RES; in rk816_bat_parse_dt()
4670 return -EINVAL; in rk816_bat_parse_dt()
4673 pdata->ocv_size = length / sizeof(u32); in rk816_bat_parse_dt()
4674 if (pdata->ocv_size <= 0) { in rk816_bat_parse_dt()
4676 return -EINVAL; in rk816_bat_parse_dt()
4679 size = sizeof(*pdata->ocv_table) * pdata->ocv_size; in rk816_bat_parse_dt()
4680 pdata->ocv_table = devm_kzalloc(di->dev, size, GFP_KERNEL); in rk816_bat_parse_dt()
4681 if (!pdata->ocv_table) in rk816_bat_parse_dt()
4682 return -ENOMEM; in rk816_bat_parse_dt()
4684 ret = of_property_read_u32_array(np, "ocv_table", pdata->ocv_table, in rk816_bat_parse_dt()
4685 pdata->ocv_size); in rk816_bat_parse_dt()
4691 di->pdata->temp_t_num = 0; in rk816_bat_parse_dt()
4701 pdata->design_capacity = out_value; in rk816_bat_parse_dt()
4708 pdata->design_qmax = out_value; in rk816_bat_parse_dt()
4715 pdata->max_chrg_current = out_value; in rk816_bat_parse_dt()
4722 pdata->max_input_current = out_value; in rk816_bat_parse_dt()
4729 pdata->max_chrg_voltage = out_value; in rk816_bat_parse_dt()
4731 pdata->zero_algorithm_vol = DEFAULT_ALGR_VOL_THRESD2; in rk816_bat_parse_dt()
4733 pdata->zero_algorithm_vol = DEFAULT_ALGR_VOL_THRESD1; in rk816_bat_parse_dt()
4735 pdata->extcon = device_property_read_bool(dev->parent, "extcon"); in rk816_bat_parse_dt()
4736 if (!pdata->extcon) { in rk816_bat_parse_dt()
4738 return -EINVAL; in rk816_bat_parse_dt()
4742 of_property_read_u32(np, "sample_res", &pdata->sample_res); in rk816_bat_parse_dt()
4744 ret = of_property_read_u32(np, "fb_temperature", &pdata->fb_temp); in rk816_bat_parse_dt()
4748 ret = of_property_read_u32(np, "energy_mode", &pdata->energy_mode); in rk816_bat_parse_dt()
4753 &pdata->max_soc_offset); in rk816_bat_parse_dt()
4757 ret = of_property_read_u32(np, "monitor_sec", &pdata->monitor_sec); in rk816_bat_parse_dt()
4762 &pdata->zero_algorithm_vol); in rk816_bat_parse_dt()
4767 &pdata->zero_reserve_dsoc); in rk816_bat_parse_dt()
4769 ret = of_property_read_u32(np, "virtual_power", &pdata->bat_mode); in rk816_bat_parse_dt()
4773 ret = of_property_read_u32(np, "power_dc2otg", &pdata->power_dc2otg); in rk816_bat_parse_dt()
4777 ret = of_property_read_u32(np, "bat_res", &pdata->bat_res); in rk816_bat_parse_dt()
4782 &pdata->sleep_enter_current); in rk816_bat_parse_dt()
4787 &pdata->sleep_exit_current); in rk816_bat_parse_dt()
4792 &pdata->sleep_filter_current); in rk816_bat_parse_dt()
4796 ret = of_property_read_u32(np, "power_off_thresd", &pdata->pwroff_vol); in rk816_bat_parse_dt()
4801 &pdata->otg5v_suspend_enable); in rk816_bat_parse_dt()
4803 pdata->otg5v_suspend_enable = 1; in rk816_bat_parse_dt()
4806 pdata->dc_det_pin = -1; in rk816_bat_parse_dt()
4807 of_property_read_u32(np, "dc_det_adc", &pdata->dc_det_adc); in rk816_bat_parse_dt()
4808 if (!pdata->dc_det_adc) in rk816_bat_parse_dt()
4814 pdata->dc_det_pin = of_get_named_gpio_flags(np, "dc_det_gpio", in rk816_bat_parse_dt()
4816 if (gpio_is_valid(pdata->dc_det_pin)) { in rk816_bat_parse_dt()
4817 pdata->dc_det_level = in rk816_bat_parse_dt()
4820 pdata->power_dc2otg = 1; in rk816_bat_parse_dt()
4825 pdata->ntc_size = 0; in rk816_bat_parse_dt()
4829 &pdata->ntc_degree_from); in rk816_bat_parse_dt()
4832 return -EINVAL; in rk816_bat_parse_dt()
4835 pdata->ntc_size = length / sizeof(u32); in rk816_bat_parse_dt()
4838 if (pdata->ntc_size) { in rk816_bat_parse_dt()
4839 size = sizeof(*pdata->ntc_table) * pdata->ntc_size; in rk816_bat_parse_dt()
4840 pdata->ntc_table = devm_kzalloc(di->dev, size, GFP_KERNEL); in rk816_bat_parse_dt()
4841 if (!pdata->ntc_table) in rk816_bat_parse_dt()
4842 return -ENOMEM; in rk816_bat_parse_dt()
4845 pdata->ntc_table, in rk816_bat_parse_dt()
4846 pdata->ntc_size); in rk816_bat_parse_dt()
4850 if (pdata->ntc_table[0] < NTC_80UA_MAX_MEASURE) in rk816_bat_parse_dt()
4851 pdata->ntc_factor = NTC_CALC_FACTOR_80UA; in rk816_bat_parse_dt()
4852 else if (pdata->ntc_table[0] < NTC_60UA_MAX_MEASURE) in rk816_bat_parse_dt()
4853 pdata->ntc_factor = NTC_CALC_FACTOR_60UA; in rk816_bat_parse_dt()
4854 else if (pdata->ntc_table[0] < NTC_40UA_MAX_MEASURE) in rk816_bat_parse_dt()
4855 pdata->ntc_factor = NTC_CALC_FACTOR_40UA; in rk816_bat_parse_dt()
4857 pdata->ntc_factor = NTC_CALC_FACTOR_20UA; in rk816_bat_parse_dt()
4887 pdata->bat_res, pdata->sample_res, pdata->max_input_current, in rk816_bat_parse_dt()
4888 pdata->max_chrg_current, pdata->max_chrg_voltage, in rk816_bat_parse_dt()
4889 pdata->design_capacity, pdata->design_qmax, in rk816_bat_parse_dt()
4890 pdata->sleep_enter_current, pdata->sleep_exit_current, in rk816_bat_parse_dt()
4891 pdata->sleep_filter_current, pdata->zero_algorithm_vol, in rk816_bat_parse_dt()
4892 pdata->zero_reserve_dsoc, pdata->monitor_sec, pdata->power_dc2otg, in rk816_bat_parse_dt()
4893 pdata->max_soc_offset, pdata->bat_mode, pdata->pwroff_vol, in rk816_bat_parse_dt()
4894 pdata->dc_det_adc, pdata->ntc_factor, in rk816_bat_parse_dt()
4895 pdata->ntc_size, pdata->ntc_degree_from, in rk816_bat_parse_dt()
4896 pdata->ntc_degree_from + pdata->ntc_size - 1 in rk816_bat_parse_dt()
4903 {.compatible = "rk816-battery",},
4910 of_match_device(rk816_battery_of_match, &pdev->dev); in rk816_battery_probe()
4912 struct rk808 *rk816 = dev_get_drvdata(pdev->dev.parent); in rk816_battery_probe()
4916 dev_err(&pdev->dev, "Failed to find matching dt id\n"); in rk816_battery_probe()
4917 return -ENODEV; in rk816_battery_probe()
4920 di = devm_kzalloc(&pdev->dev, sizeof(*di), GFP_KERNEL); in rk816_battery_probe()
4922 return -ENOMEM; in rk816_battery_probe()
4924 di->rk816 = rk816; in rk816_battery_probe()
4925 di->pdev = pdev; in rk816_battery_probe()
4926 di->dev = &pdev->dev; in rk816_battery_probe()
4927 di->regmap = rk816->regmap; in rk816_battery_probe()
4932 dev_err(&pdev->dev, "rk816 battery parse dt failed!\n"); in rk816_battery_probe()
4937 di->pdata->bat_mode = MODE_VIRTUAL; in rk816_battery_probe()
4938 dev_err(&pdev->dev, "no battery, virtual power mode\n"); in rk816_battery_probe()
4943 dev_err(&pdev->dev, "rk816 power supply register failed!\n"); in rk816_battery_probe()
4953 wake_lock_init(&di->wake_lock, WAKE_LOCK_SUSPEND, "rk816_bat_lock"); in rk816_battery_probe()
4954 di->bat_monitor_wq = alloc_ordered_workqueue("%s", in rk816_battery_probe()
4955 WQ_MEM_RECLAIM | WQ_FREEZABLE, "rk816-bat-monitor-wq"); in rk816_battery_probe()
4956 INIT_DELAYED_WORK(&di->bat_delay_work, rk816_battery_work); in rk816_battery_probe()
4960 dev_err(&pdev->dev, "rk816 bat irq init failed!\n"); in rk816_battery_probe()
4964 queue_delayed_work(di->bat_monitor_wq, &di->bat_delay_work, in rk816_battery_probe()
4972 cancel_delayed_work(&di->dc_delay_work); in rk816_battery_probe()
4973 cancel_delayed_work(&di->bat_delay_work); in rk816_battery_probe()
4974 cancel_delayed_work(&di->calib_delay_work); in rk816_battery_probe()
4975 destroy_workqueue(di->bat_monitor_wq); in rk816_battery_probe()
4976 destroy_workqueue(di->usb_charger_wq); in rk816_battery_probe()
4978 del_timer(&di->caltimer); in rk816_battery_probe()
4979 wake_lock_destroy(&di->wake_lock); in rk816_battery_probe()
4990 cancel_delayed_work_sync(&di->bat_delay_work); in rk816_battery_suspend()
4991 di->s2r = false; in rk816_battery_suspend()
4992 di->sleep_chrg_online = rk816_bat_chrg_online(di); in rk816_battery_suspend()
4993 di->sleep_chrg_status = rk816_bat_get_chrg_status(di); in rk816_battery_suspend()
4994 di->current_avg = rk816_bat_get_avg_current(di); in rk816_battery_suspend()
4995 di->remain_cap = rk816_bat_get_coulomb_cap(di); in rk816_battery_suspend()
4996 di->rsoc = rk816_bat_get_rsoc(di); in rk816_battery_suspend()
4997 di->rtc_base = rk816_get_rtc_sec(); in rk816_battery_suspend()
5000 di->slp_dcdc_en_reg = rk816_bat_read(di, RK816_SLP_DCDC_EN_REG); in rk816_battery_suspend()
5003 if (di->pdata->otg5v_suspend_enable) { in rk816_battery_suspend()
5004 if ((di->otg_in && !di->dc_in) || in rk816_battery_suspend()
5005 (di->otg_in && di->dc_in && !di->pdata->power_dc2otg)) { in rk816_battery_suspend()
5025 if (di->sleep_chrg_status != CHARGE_FINISH) in rk816_battery_suspend()
5026 di->chrg_finish_base = get_boot_sec(); in rk816_battery_suspend()
5029 if ((di->work_mode == MODE_ZERO) && in rk816_battery_suspend()
5030 (di->sleep_chrg_online) && (di->current_avg >= 0)) { in rk816_battery_suspend()
5035 if (di->sleep_chrg_status == CHARGE_FINISH) { in rk816_battery_suspend()
5036 di->work_mode = MODE_FINISH; in rk816_battery_suspend()
5037 di->chrg_finish_base = get_boot_sec(); in rk816_battery_suspend()
5039 di->work_mode = MODE_SMOOTH; in rk816_battery_suspend()
5045 di->dsoc, di->rsoc, di->current_avg, in rk816_battery_suspend()
5047 di->sleep_dischrg_sec, di->sleep_chrg_online, bat_status[st]); in rk816_battery_suspend()
5058 di->s2r = true; in rk816_battery_resume()
5059 di->voltage_avg = rk816_bat_get_avg_voltage(di); in rk816_battery_resume()
5060 di->current_avg = rk816_bat_get_avg_current(di); in rk816_battery_resume()
5061 di->voltage_relax = rk816_bat_get_relax_voltage(di); in rk816_battery_resume()
5062 di->current_relax = rk816_bat_get_relax_current(di); in rk816_battery_resume()
5063 di->remain_cap = rk816_bat_get_coulomb_cap(di); in rk816_battery_resume()
5064 di->rsoc = rk816_bat_get_rsoc(di); in rk816_battery_resume()
5066 di->sleep_sum_sec += interval_sec; in rk816_battery_resume()
5067 pwroff_vol = di->pdata->pwroff_vol; in rk816_battery_resume()
5071 OTG_BOOST_SLP_ON, di->slp_dcdc_en_reg); in rk816_battery_resume()
5073 if (!di->sleep_chrg_online) { in rk816_battery_resume()
5075 di->sleep_dischrg_sec += interval_sec; in rk816_battery_resume()
5076 if (di->voltage_avg <= pwroff_vol + 50) in rk816_battery_resume()
5083 di->dsoc, di->rsoc, di->current_avg, di->voltage_avg, in rk816_battery_resume()
5084 di->voltage_relax, rk816_bat_get_coulomb_cap(di), interval_sec, in rk816_battery_resume()
5085 di->sleep_dischrg_sec, di->sleep_chrg_online, bat_status[st]); in rk816_battery_resume()
5088 if ((di->sleep_dischrg_sec > time_step) && (!di->sleep_chrg_online)) { in rk816_battery_resume()
5090 di->sleep_dischrg_sec = 0; in rk816_battery_resume()
5096 if ((di->sleep_chrg_online) || in rk816_battery_resume()
5097 (!di->sleep_chrg_online && di->voltage_avg <= pwroff_vol)) in rk816_battery_resume()
5098 wake_lock_timeout(&di->wake_lock, msecs_to_jiffies(2000)); in rk816_battery_resume()
5100 queue_delayed_work(di->bat_monitor_wq, &di->bat_delay_work, in rk816_battery_resume()
5111 extcon_unregister_notifier(di->cable_edev, EXTCON_CHG_USB_SDP, in rk816_battery_shutdown()
5112 &di->cable_cg_nb); in rk816_battery_shutdown()
5113 extcon_unregister_notifier(di->cable_edev, EXTCON_CHG_USB_DCP, in rk816_battery_shutdown()
5114 &di->cable_cg_nb); in rk816_battery_shutdown()
5115 extcon_unregister_notifier(di->cable_edev, EXTCON_CHG_USB_CDP, in rk816_battery_shutdown()
5116 &di->cable_cg_nb); in rk816_battery_shutdown()
5117 extcon_unregister_notifier(di->cable_edev, EXTCON_USB_VBUS_EN, in rk816_battery_shutdown()
5118 &di->cable_host_nb); in rk816_battery_shutdown()
5119 extcon_unregister_notifier(di->cable_edev, EXTCON_USB, in rk816_battery_shutdown()
5120 &di->cable_discnt_nb); in rk816_battery_shutdown()
5123 cancel_delayed_work_sync(&di->dc_delay_work); in rk816_battery_shutdown()
5124 cancel_delayed_work_sync(&di->bat_delay_work); in rk816_battery_shutdown()
5125 cancel_delayed_work_sync(&di->calib_delay_work); in rk816_battery_shutdown()
5126 cancel_delayed_work_sync(&di->usb_work); in rk816_battery_shutdown()
5127 cancel_delayed_work_sync(&di->host_work); in rk816_battery_shutdown()
5128 cancel_delayed_work_sync(&di->discnt_work); in rk816_battery_shutdown()
5129 destroy_workqueue(di->bat_monitor_wq); in rk816_battery_shutdown()
5130 destroy_workqueue(di->usb_charger_wq); in rk816_battery_shutdown()
5132 del_timer(&di->caltimer); in rk816_battery_shutdown()
5135 if (base2sec(di->boot_base) < REBOOT_PERIOD_SEC) in rk816_battery_shutdown()
5141 di->dsoc, di->rsoc, di->current_avg, di->voltage_avg, in rk816_battery_shutdown()
5142 di->remain_cap, di->fcc, rk816_bat_chrg_online(di), in rk816_battery_shutdown()
5143 di->otg_in, di->otg_pmic5v, cnt, in rk816_battery_shutdown()
5144 di->algo_rest_mode, di->algo_rest_val); in rk816_battery_shutdown()
5153 .name = "rk816-battery",
5171 MODULE_ALIAS("platform:rk816-battery");
5172 MODULE_AUTHOR("chenjh<chenjh@rock-chips.com>");