Lines Matching refs:di
366 static int ab8500_fg_is_low_curr(struct ab8500_fg *di, int curr) in ab8500_fg_is_low_curr() argument
371 if (curr > -di->bm->fg_params->high_curr_threshold) in ab8500_fg_is_low_curr()
385 static int ab8500_fg_add_cap_sample(struct ab8500_fg *di, int sample) in ab8500_fg_add_cap_sample() argument
388 struct ab8500_fg_avg_cap *avg = &di->avg_cap; in ab8500_fg_add_cap_sample()
421 static void ab8500_fg_clear_cap_samples(struct ab8500_fg *di) in ab8500_fg_clear_cap_samples() argument
424 struct ab8500_fg_avg_cap *avg = &di->avg_cap; in ab8500_fg_clear_cap_samples()
444 static void ab8500_fg_fill_cap_sample(struct ab8500_fg *di, int sample) in ab8500_fg_fill_cap_sample() argument
448 struct ab8500_fg_avg_cap *avg = &di->avg_cap; in ab8500_fg_fill_cap_sample()
471 static int ab8500_fg_coulomb_counter(struct ab8500_fg *di, bool enable) in ab8500_fg_coulomb_counter() argument
474 mutex_lock(&di->cc_lock); in ab8500_fg_coulomb_counter()
478 ret = abx500_set_register_interruptible(di->dev, AB8500_RTC, in ab8500_fg_coulomb_counter()
484 ret = abx500_set_register_interruptible(di->dev, in ab8500_fg_coulomb_counter()
486 di->fg_samples); in ab8500_fg_coulomb_counter()
491 ret = abx500_set_register_interruptible(di->dev, AB8500_RTC, in ab8500_fg_coulomb_counter()
497 di->flags.fg_enabled = true; in ab8500_fg_coulomb_counter()
500 ret = abx500_mask_and_set_register_interruptible(di->dev, in ab8500_fg_coulomb_counter()
506 ret = abx500_set_register_interruptible(di->dev, in ab8500_fg_coulomb_counter()
512 ret = abx500_set_register_interruptible(di->dev, AB8500_RTC, in ab8500_fg_coulomb_counter()
517 di->flags.fg_enabled = false; in ab8500_fg_coulomb_counter()
520 dev_dbg(di->dev, " CC enabled: %d Samples: %d\n", in ab8500_fg_coulomb_counter()
521 enable, di->fg_samples); in ab8500_fg_coulomb_counter()
523 mutex_unlock(&di->cc_lock); in ab8500_fg_coulomb_counter()
527 dev_err(di->dev, "%s Enabling coulomb counter failed\n", __func__); in ab8500_fg_coulomb_counter()
528 mutex_unlock(&di->cc_lock); in ab8500_fg_coulomb_counter()
540 int ab8500_fg_inst_curr_start(struct ab8500_fg *di) in ab8500_fg_inst_curr_start() argument
545 mutex_lock(&di->cc_lock); in ab8500_fg_inst_curr_start()
547 di->nbr_cceoc_irq_cnt = 0; in ab8500_fg_inst_curr_start()
548 ret = abx500_get_register_interruptible(di->dev, AB8500_RTC, in ab8500_fg_inst_curr_start()
554 dev_dbg(di->dev, "%s Enable FG\n", __func__); in ab8500_fg_inst_curr_start()
555 di->turn_off_fg = true; in ab8500_fg_inst_curr_start()
558 ret = abx500_set_register_interruptible(di->dev, in ab8500_fg_inst_curr_start()
565 ret = abx500_set_register_interruptible(di->dev, AB8500_RTC, in ab8500_fg_inst_curr_start()
571 di->turn_off_fg = false; in ab8500_fg_inst_curr_start()
575 reinit_completion(&di->ab8500_fg_started); in ab8500_fg_inst_curr_start()
576 reinit_completion(&di->ab8500_fg_complete); in ab8500_fg_inst_curr_start()
577 enable_irq(di->irq); in ab8500_fg_inst_curr_start()
582 mutex_unlock(&di->cc_lock); in ab8500_fg_inst_curr_start()
592 int ab8500_fg_inst_curr_started(struct ab8500_fg *di) in ab8500_fg_inst_curr_started() argument
594 return completion_done(&di->ab8500_fg_started); in ab8500_fg_inst_curr_started()
603 int ab8500_fg_inst_curr_done(struct ab8500_fg *di) in ab8500_fg_inst_curr_done() argument
605 return completion_done(&di->ab8500_fg_complete); in ab8500_fg_inst_curr_done()
617 int ab8500_fg_inst_curr_finalize(struct ab8500_fg *di, int *res) in ab8500_fg_inst_curr_finalize() argument
624 if (!completion_done(&di->ab8500_fg_complete)) { in ab8500_fg_inst_curr_finalize()
626 &di->ab8500_fg_complete, in ab8500_fg_inst_curr_finalize()
628 dev_dbg(di->dev, "Finalize time: %d ms\n", in ab8500_fg_inst_curr_finalize()
632 disable_irq(di->irq); in ab8500_fg_inst_curr_finalize()
633 di->nbr_cceoc_irq_cnt = 0; in ab8500_fg_inst_curr_finalize()
634 dev_err(di->dev, "completion timed out [%d]\n", in ab8500_fg_inst_curr_finalize()
640 disable_irq(di->irq); in ab8500_fg_inst_curr_finalize()
641 di->nbr_cceoc_irq_cnt = 0; in ab8500_fg_inst_curr_finalize()
643 ret = abx500_mask_and_set_register_interruptible(di->dev, in ab8500_fg_inst_curr_finalize()
651 ret = abx500_get_register_interruptible(di->dev, AB8500_GAS_GAUGE, in ab8500_fg_inst_curr_finalize()
656 ret = abx500_get_register_interruptible(di->dev, AB8500_GAS_GAUGE, in ab8500_fg_inst_curr_finalize()
680 (1000 * di->bm->fg_res); in ab8500_fg_inst_curr_finalize()
682 if (di->turn_off_fg) { in ab8500_fg_inst_curr_finalize()
683 dev_dbg(di->dev, "%s Disable FG\n", __func__); in ab8500_fg_inst_curr_finalize()
686 ret = abx500_set_register_interruptible(di->dev, in ab8500_fg_inst_curr_finalize()
692 ret = abx500_set_register_interruptible(di->dev, AB8500_RTC, in ab8500_fg_inst_curr_finalize()
697 mutex_unlock(&di->cc_lock); in ab8500_fg_inst_curr_finalize()
702 mutex_unlock(&di->cc_lock); in ab8500_fg_inst_curr_finalize()
713 int ab8500_fg_inst_curr_blocking(struct ab8500_fg *di) in ab8500_fg_inst_curr_blocking() argument
719 ret = ab8500_fg_inst_curr_start(di); in ab8500_fg_inst_curr_blocking()
721 dev_err(di->dev, "Failed to initialize fg_inst\n"); in ab8500_fg_inst_curr_blocking()
726 if (!completion_done(&di->ab8500_fg_started)) { in ab8500_fg_inst_curr_blocking()
728 &di->ab8500_fg_started, in ab8500_fg_inst_curr_blocking()
730 dev_dbg(di->dev, "Start time: %d ms\n", in ab8500_fg_inst_curr_blocking()
734 dev_err(di->dev, "completion timed out [%d]\n", in ab8500_fg_inst_curr_blocking()
740 ret = ab8500_fg_inst_curr_finalize(di, &res); in ab8500_fg_inst_curr_blocking()
742 dev_err(di->dev, "Failed to finalize fg_inst\n"); in ab8500_fg_inst_curr_blocking()
746 dev_dbg(di->dev, "%s instant current: %d", __func__, res); in ab8500_fg_inst_curr_blocking()
749 disable_irq(di->irq); in ab8500_fg_inst_curr_blocking()
750 mutex_unlock(&di->cc_lock); in ab8500_fg_inst_curr_blocking()
767 struct ab8500_fg *di = container_of(work, in ab8500_fg_acc_cur_work() local
770 mutex_lock(&di->cc_lock); in ab8500_fg_acc_cur_work()
771 ret = abx500_set_register_interruptible(di->dev, AB8500_GAS_GAUGE, in ab8500_fg_acc_cur_work()
776 ret = abx500_get_register_interruptible(di->dev, AB8500_GAS_GAUGE, in ab8500_fg_acc_cur_work()
781 ret = abx500_get_register_interruptible(di->dev, AB8500_GAS_GAUGE, in ab8500_fg_acc_cur_work()
786 ret = abx500_get_register_interruptible(di->dev, AB8500_GAS_GAUGE, in ab8500_fg_acc_cur_work()
803 di->accu_charge = (val * QLSB_NANO_AMP_HOURS_X10) / in ab8500_fg_acc_cur_work()
804 (100 * di->bm->fg_res); in ab8500_fg_acc_cur_work()
812 di->avg_curr = (val * QLSB_NANO_AMP_HOURS_X10 * 36) / in ab8500_fg_acc_cur_work()
813 (1000 * di->bm->fg_res * (di->fg_samples / 4)); in ab8500_fg_acc_cur_work()
815 di->flags.conv_done = true; in ab8500_fg_acc_cur_work()
817 mutex_unlock(&di->cc_lock); in ab8500_fg_acc_cur_work()
819 queue_work(di->fg_wq, &di->fg_work); in ab8500_fg_acc_cur_work()
821 dev_dbg(di->dev, "fg_res: %d, fg_samples: %d, gasg: %d, accu_charge: %d \n", in ab8500_fg_acc_cur_work()
822 di->bm->fg_res, di->fg_samples, val, di->accu_charge); in ab8500_fg_acc_cur_work()
825 dev_err(di->dev, in ab8500_fg_acc_cur_work()
827 mutex_unlock(&di->cc_lock); in ab8500_fg_acc_cur_work()
828 queue_work(di->fg_wq, &di->fg_work); in ab8500_fg_acc_cur_work()
837 static int ab8500_fg_bat_voltage(struct ab8500_fg *di) in ab8500_fg_bat_voltage() argument
842 vbat = ab8500_gpadc_convert(di->gpadc, MAIN_BAT_V); in ab8500_fg_bat_voltage()
844 dev_err(di->dev, in ab8500_fg_bat_voltage()
861 static int ab8500_fg_volt_to_capacity(struct ab8500_fg *di, int voltage) in ab8500_fg_volt_to_capacity() argument
867 tbl = di->bm->bat_type[di->bm->batt_id].v_to_cap_tbl, in ab8500_fg_volt_to_capacity()
868 tbl_size = di->bm->bat_type[di->bm->batt_id].n_v_cap_tbl_elements; in ab8500_fg_volt_to_capacity()
887 dev_dbg(di->dev, "%s Vbat: %d, Cap: %d per mille", in ab8500_fg_volt_to_capacity()
900 static int ab8500_fg_uncomp_volt_to_capacity(struct ab8500_fg *di) in ab8500_fg_uncomp_volt_to_capacity() argument
902 di->vbat = ab8500_fg_bat_voltage(di); in ab8500_fg_uncomp_volt_to_capacity()
903 return ab8500_fg_volt_to_capacity(di, di->vbat); in ab8500_fg_uncomp_volt_to_capacity()
913 static int ab8500_fg_battery_resistance(struct ab8500_fg *di) in ab8500_fg_battery_resistance() argument
919 tbl = di->bm->bat_type[di->bm->batt_id].batres_tbl; in ab8500_fg_battery_resistance()
920 tbl_size = di->bm->bat_type[di->bm->batt_id].n_batres_tbl_elements; in ab8500_fg_battery_resistance()
923 if (di->bat_temp / 10 > tbl[i].temp) in ab8500_fg_battery_resistance()
928 resist = interpolate(di->bat_temp / 10, in ab8500_fg_battery_resistance()
939 dev_dbg(di->dev, "%s Temp: %d battery internal resistance: %d" in ab8500_fg_battery_resistance()
941 __func__, di->bat_temp, resist, di->bm->fg_res / 10, in ab8500_fg_battery_resistance()
942 (di->bm->fg_res / 10) + resist); in ab8500_fg_battery_resistance()
945 resist += di->bm->fg_res / 10; in ab8500_fg_battery_resistance()
957 static int ab8500_fg_load_comp_volt_to_capacity(struct ab8500_fg *di) in ab8500_fg_load_comp_volt_to_capacity() argument
963 ab8500_fg_inst_curr_start(di); in ab8500_fg_load_comp_volt_to_capacity()
966 vbat += ab8500_fg_bat_voltage(di); in ab8500_fg_load_comp_volt_to_capacity()
969 } while (!ab8500_fg_inst_curr_done(di)); in ab8500_fg_load_comp_volt_to_capacity()
971 ab8500_fg_inst_curr_finalize(di, &di->inst_curr); in ab8500_fg_load_comp_volt_to_capacity()
973 di->vbat = vbat / i; in ab8500_fg_load_comp_volt_to_capacity()
974 res = ab8500_fg_battery_resistance(di); in ab8500_fg_load_comp_volt_to_capacity()
977 vbat_comp = di->vbat - (di->inst_curr * res) / 1000; in ab8500_fg_load_comp_volt_to_capacity()
979 dev_dbg(di->dev, "%s Measured Vbat: %dmV,Compensated Vbat %dmV, " in ab8500_fg_load_comp_volt_to_capacity()
981 __func__, di->vbat, vbat_comp, res, di->inst_curr, i); in ab8500_fg_load_comp_volt_to_capacity()
983 return ab8500_fg_volt_to_capacity(di, vbat_comp); in ab8500_fg_load_comp_volt_to_capacity()
993 static int ab8500_fg_convert_mah_to_permille(struct ab8500_fg *di, int cap_mah) in ab8500_fg_convert_mah_to_permille() argument
995 return (cap_mah * 1000) / di->bat_cap.max_mah_design; in ab8500_fg_convert_mah_to_permille()
1005 static int ab8500_fg_convert_permille_to_mah(struct ab8500_fg *di, int cap_pm) in ab8500_fg_convert_permille_to_mah() argument
1007 return cap_pm * di->bat_cap.max_mah_design / 1000; in ab8500_fg_convert_permille_to_mah()
1017 static int ab8500_fg_convert_mah_to_uwh(struct ab8500_fg *di, int cap_mah) in ab8500_fg_convert_mah_to_uwh() argument
1022 div_res = ((u64) cap_mah) * ((u64) di->vbat_nom); in ab8500_fg_convert_mah_to_uwh()
1039 static int ab8500_fg_calc_cap_charging(struct ab8500_fg *di) in ab8500_fg_calc_cap_charging() argument
1041 dev_dbg(di->dev, "%s cap_mah %d accu_charge %d\n", in ab8500_fg_calc_cap_charging()
1043 di->bat_cap.mah, in ab8500_fg_calc_cap_charging()
1044 di->accu_charge); in ab8500_fg_calc_cap_charging()
1047 if (di->bat_cap.mah + di->accu_charge > 0) in ab8500_fg_calc_cap_charging()
1048 di->bat_cap.mah += di->accu_charge; in ab8500_fg_calc_cap_charging()
1050 di->bat_cap.mah = 0; in ab8500_fg_calc_cap_charging()
1055 if (di->bat_cap.mah >= di->bat_cap.max_mah_design || in ab8500_fg_calc_cap_charging()
1056 di->flags.force_full) { in ab8500_fg_calc_cap_charging()
1057 di->bat_cap.mah = di->bat_cap.max_mah_design; in ab8500_fg_calc_cap_charging()
1060 ab8500_fg_fill_cap_sample(di, di->bat_cap.mah); in ab8500_fg_calc_cap_charging()
1061 di->bat_cap.permille = in ab8500_fg_calc_cap_charging()
1062 ab8500_fg_convert_mah_to_permille(di, di->bat_cap.mah); in ab8500_fg_calc_cap_charging()
1065 di->vbat = ab8500_fg_bat_voltage(di); in ab8500_fg_calc_cap_charging()
1066 di->inst_curr = ab8500_fg_inst_curr_blocking(di); in ab8500_fg_calc_cap_charging()
1068 return di->bat_cap.mah; in ab8500_fg_calc_cap_charging()
1080 static int ab8500_fg_calc_cap_discharge_voltage(struct ab8500_fg *di, bool comp) in ab8500_fg_calc_cap_discharge_voltage() argument
1085 permille = ab8500_fg_load_comp_volt_to_capacity(di); in ab8500_fg_calc_cap_discharge_voltage()
1087 permille = ab8500_fg_uncomp_volt_to_capacity(di); in ab8500_fg_calc_cap_discharge_voltage()
1089 mah = ab8500_fg_convert_permille_to_mah(di, permille); in ab8500_fg_calc_cap_discharge_voltage()
1091 di->bat_cap.mah = ab8500_fg_add_cap_sample(di, mah); in ab8500_fg_calc_cap_discharge_voltage()
1092 di->bat_cap.permille = in ab8500_fg_calc_cap_discharge_voltage()
1093 ab8500_fg_convert_mah_to_permille(di, di->bat_cap.mah); in ab8500_fg_calc_cap_discharge_voltage()
1095 return di->bat_cap.mah; in ab8500_fg_calc_cap_discharge_voltage()
1106 static int ab8500_fg_calc_cap_discharge_fg(struct ab8500_fg *di) in ab8500_fg_calc_cap_discharge_fg() argument
1110 dev_dbg(di->dev, "%s cap_mah %d accu_charge %d\n", in ab8500_fg_calc_cap_discharge_fg()
1112 di->bat_cap.mah, in ab8500_fg_calc_cap_discharge_fg()
1113 di->accu_charge); in ab8500_fg_calc_cap_discharge_fg()
1116 if (di->bat_cap.mah + di->accu_charge > 0) in ab8500_fg_calc_cap_discharge_fg()
1117 di->bat_cap.mah += di->accu_charge; in ab8500_fg_calc_cap_discharge_fg()
1119 di->bat_cap.mah = 0; in ab8500_fg_calc_cap_discharge_fg()
1121 if (di->bat_cap.mah >= di->bat_cap.max_mah_design) in ab8500_fg_calc_cap_discharge_fg()
1122 di->bat_cap.mah = di->bat_cap.max_mah_design; in ab8500_fg_calc_cap_discharge_fg()
1128 permille = ab8500_fg_convert_mah_to_permille(di, di->bat_cap.mah); in ab8500_fg_calc_cap_discharge_fg()
1129 permille_volt = ab8500_fg_uncomp_volt_to_capacity(di); in ab8500_fg_calc_cap_discharge_fg()
1132 di->bat_cap.permille = permille_volt; in ab8500_fg_calc_cap_discharge_fg()
1133 di->bat_cap.mah = ab8500_fg_convert_permille_to_mah(di, in ab8500_fg_calc_cap_discharge_fg()
1134 di->bat_cap.permille); in ab8500_fg_calc_cap_discharge_fg()
1136 dev_dbg(di->dev, "%s voltage based: perm %d perm_volt %d\n", in ab8500_fg_calc_cap_discharge_fg()
1141 ab8500_fg_fill_cap_sample(di, di->bat_cap.mah); in ab8500_fg_calc_cap_discharge_fg()
1143 ab8500_fg_fill_cap_sample(di, di->bat_cap.mah); in ab8500_fg_calc_cap_discharge_fg()
1144 di->bat_cap.permille = in ab8500_fg_calc_cap_discharge_fg()
1145 ab8500_fg_convert_mah_to_permille(di, di->bat_cap.mah); in ab8500_fg_calc_cap_discharge_fg()
1148 return di->bat_cap.mah; in ab8500_fg_calc_cap_discharge_fg()
1157 static int ab8500_fg_capacity_level(struct ab8500_fg *di) in ab8500_fg_capacity_level() argument
1161 percent = DIV_ROUND_CLOSEST(di->bat_cap.permille, 10); in ab8500_fg_capacity_level()
1163 if (percent <= di->bm->cap_levels->critical || in ab8500_fg_capacity_level()
1164 di->flags.low_bat) in ab8500_fg_capacity_level()
1166 else if (percent <= di->bm->cap_levels->low) in ab8500_fg_capacity_level()
1168 else if (percent <= di->bm->cap_levels->normal) in ab8500_fg_capacity_level()
1170 else if (percent <= di->bm->cap_levels->high) in ab8500_fg_capacity_level()
1186 static int ab8500_fg_calculate_scaled_capacity(struct ab8500_fg *di) in ab8500_fg_calculate_scaled_capacity() argument
1188 struct ab8500_fg_cap_scaling *cs = &di->bat_cap.cap_scale; in ab8500_fg_calculate_scaled_capacity()
1189 int capacity = di->bat_cap.prev_percent; in ab8500_fg_calculate_scaled_capacity()
1198 if (di->flags.fully_charged) { in ab8500_fg_calculate_scaled_capacity()
1201 max(capacity, di->bm->fg_params->maint_thres); in ab8500_fg_calculate_scaled_capacity()
1202 dev_dbg(di->dev, "Scale cap with %d/%d\n", in ab8500_fg_calculate_scaled_capacity()
1210 DIV_ROUND_CLOSEST(di->bat_cap.prev_percent * in ab8500_fg_calculate_scaled_capacity()
1214 if (di->flags.charging) { in ab8500_fg_calculate_scaled_capacity()
1217 dev_dbg(di->dev, "Cap to stop scale lowered %d%%\n", in ab8500_fg_calculate_scaled_capacity()
1219 } else if (!di->flags.fully_charged) { in ab8500_fg_calculate_scaled_capacity()
1220 if (di->bat_cap.prev_percent >= in ab8500_fg_calculate_scaled_capacity()
1222 dev_dbg(di->dev, "Disabling scaled capacity\n"); in ab8500_fg_calculate_scaled_capacity()
1224 capacity = di->bat_cap.prev_percent; in ab8500_fg_calculate_scaled_capacity()
1226 dev_dbg(di->dev, in ab8500_fg_calculate_scaled_capacity()
1244 static void ab8500_fg_update_cap_scalers(struct ab8500_fg *di) in ab8500_fg_update_cap_scalers() argument
1246 struct ab8500_fg_cap_scaling *cs = &di->bat_cap.cap_scale; in ab8500_fg_update_cap_scalers()
1250 if (di->flags.charging) { in ab8500_fg_update_cap_scalers()
1251 di->bat_cap.cap_scale.disable_cap_level = in ab8500_fg_update_cap_scalers()
1252 di->bat_cap.cap_scale.scaled_cap; in ab8500_fg_update_cap_scalers()
1253 dev_dbg(di->dev, "Cap to stop scale at charge %d%%\n", in ab8500_fg_update_cap_scalers()
1254 di->bat_cap.cap_scale.disable_cap_level); in ab8500_fg_update_cap_scalers()
1258 cs->cap_to_scale[1] = di->bat_cap.prev_percent; in ab8500_fg_update_cap_scalers()
1262 max(di->bat_cap.prev_percent, in ab8500_fg_update_cap_scalers()
1263 di->bm->fg_params->maint_thres); in ab8500_fg_update_cap_scalers()
1266 dev_dbg(di->dev, "Cap to scale at discharge %d/%d\n", in ab8500_fg_update_cap_scalers()
1279 static void ab8500_fg_check_capacity_limits(struct ab8500_fg *di, bool init) in ab8500_fg_check_capacity_limits() argument
1282 int percent = DIV_ROUND_CLOSEST(di->bat_cap.permille, 10); in ab8500_fg_check_capacity_limits()
1284 di->bat_cap.level = ab8500_fg_capacity_level(di); in ab8500_fg_check_capacity_limits()
1286 if (di->bat_cap.level != di->bat_cap.prev_level) { in ab8500_fg_check_capacity_limits()
1291 if (!(!di->flags.charging && di->bat_cap.level > in ab8500_fg_check_capacity_limits()
1292 di->bat_cap.prev_level) || init) { in ab8500_fg_check_capacity_limits()
1293 dev_dbg(di->dev, "level changed from %d to %d\n", in ab8500_fg_check_capacity_limits()
1294 di->bat_cap.prev_level, in ab8500_fg_check_capacity_limits()
1295 di->bat_cap.level); in ab8500_fg_check_capacity_limits()
1296 di->bat_cap.prev_level = di->bat_cap.level; in ab8500_fg_check_capacity_limits()
1299 dev_dbg(di->dev, "level not allowed to go up " in ab8500_fg_check_capacity_limits()
1301 di->bat_cap.prev_level, in ab8500_fg_check_capacity_limits()
1302 di->bat_cap.level); in ab8500_fg_check_capacity_limits()
1310 if (di->flags.low_bat) { in ab8500_fg_check_capacity_limits()
1311 dev_dbg(di->dev, "Battery low, set capacity to 0\n"); in ab8500_fg_check_capacity_limits()
1312 di->bat_cap.prev_percent = 0; in ab8500_fg_check_capacity_limits()
1313 di->bat_cap.permille = 0; in ab8500_fg_check_capacity_limits()
1315 di->bat_cap.prev_mah = 0; in ab8500_fg_check_capacity_limits()
1316 di->bat_cap.mah = 0; in ab8500_fg_check_capacity_limits()
1318 } else if (di->flags.fully_charged) { in ab8500_fg_check_capacity_limits()
1323 if (di->flags.force_full) { in ab8500_fg_check_capacity_limits()
1324 di->bat_cap.prev_percent = percent; in ab8500_fg_check_capacity_limits()
1325 di->bat_cap.prev_mah = di->bat_cap.mah; in ab8500_fg_check_capacity_limits()
1329 if (!di->bat_cap.cap_scale.enable && in ab8500_fg_check_capacity_limits()
1330 di->bm->capacity_scaling) { in ab8500_fg_check_capacity_limits()
1331 di->bat_cap.cap_scale.enable = true; in ab8500_fg_check_capacity_limits()
1332 di->bat_cap.cap_scale.cap_to_scale[0] = 100; in ab8500_fg_check_capacity_limits()
1333 di->bat_cap.cap_scale.cap_to_scale[1] = in ab8500_fg_check_capacity_limits()
1334 di->bat_cap.prev_percent; in ab8500_fg_check_capacity_limits()
1335 di->bat_cap.cap_scale.disable_cap_level = 100; in ab8500_fg_check_capacity_limits()
1337 } else if (di->bat_cap.prev_percent != percent) { in ab8500_fg_check_capacity_limits()
1338 dev_dbg(di->dev, in ab8500_fg_check_capacity_limits()
1342 di->bat_cap.prev_percent = percent; in ab8500_fg_check_capacity_limits()
1343 di->bat_cap.prev_mah = di->bat_cap.mah; in ab8500_fg_check_capacity_limits()
1347 } else if (di->bat_cap.prev_percent != percent) { in ab8500_fg_check_capacity_limits()
1354 di->bat_cap.prev_percent = 1; in ab8500_fg_check_capacity_limits()
1358 } else if (!(!di->flags.charging && in ab8500_fg_check_capacity_limits()
1359 percent > di->bat_cap.prev_percent) || init) { in ab8500_fg_check_capacity_limits()
1364 dev_dbg(di->dev, in ab8500_fg_check_capacity_limits()
1366 di->bat_cap.prev_percent, in ab8500_fg_check_capacity_limits()
1368 di->bat_cap.permille); in ab8500_fg_check_capacity_limits()
1369 di->bat_cap.prev_percent = percent; in ab8500_fg_check_capacity_limits()
1370 di->bat_cap.prev_mah = di->bat_cap.mah; in ab8500_fg_check_capacity_limits()
1374 dev_dbg(di->dev, "capacity not allowed to go up since " in ab8500_fg_check_capacity_limits()
1376 di->bat_cap.prev_percent, in ab8500_fg_check_capacity_limits()
1378 di->bat_cap.permille); in ab8500_fg_check_capacity_limits()
1383 if (di->bm->capacity_scaling) { in ab8500_fg_check_capacity_limits()
1384 di->bat_cap.cap_scale.scaled_cap = in ab8500_fg_check_capacity_limits()
1385 ab8500_fg_calculate_scaled_capacity(di); in ab8500_fg_check_capacity_limits()
1387 dev_info(di->dev, "capacity=%d (%d)\n", in ab8500_fg_check_capacity_limits()
1388 di->bat_cap.prev_percent, in ab8500_fg_check_capacity_limits()
1389 di->bat_cap.cap_scale.scaled_cap); in ab8500_fg_check_capacity_limits()
1391 power_supply_changed(di->fg_psy); in ab8500_fg_check_capacity_limits()
1392 if (di->flags.fully_charged && di->flags.force_full) { in ab8500_fg_check_capacity_limits()
1393 dev_dbg(di->dev, "Battery full, notifying.\n"); in ab8500_fg_check_capacity_limits()
1394 di->flags.force_full = false; in ab8500_fg_check_capacity_limits()
1395 sysfs_notify(&di->fg_kobject, NULL, "charge_full"); in ab8500_fg_check_capacity_limits()
1397 sysfs_notify(&di->fg_kobject, NULL, "charge_now"); in ab8500_fg_check_capacity_limits()
1401 static void ab8500_fg_charge_state_to(struct ab8500_fg *di, in ab8500_fg_charge_state_to() argument
1404 dev_dbg(di->dev, "Charge state from %d [%s] to %d [%s]\n", in ab8500_fg_charge_state_to()
1405 di->charge_state, in ab8500_fg_charge_state_to()
1406 charge_state[di->charge_state], in ab8500_fg_charge_state_to()
1410 di->charge_state = new_state; in ab8500_fg_charge_state_to()
1413 static void ab8500_fg_discharge_state_to(struct ab8500_fg *di, in ab8500_fg_discharge_state_to() argument
1416 dev_dbg(di->dev, "Disharge state from %d [%s] to %d [%s]\n", in ab8500_fg_discharge_state_to()
1417 di->discharge_state, in ab8500_fg_discharge_state_to()
1418 discharge_state[di->discharge_state], in ab8500_fg_discharge_state_to()
1422 di->discharge_state = new_state; in ab8500_fg_discharge_state_to()
1431 static void ab8500_fg_algorithm_charging(struct ab8500_fg *di) in ab8500_fg_algorithm_charging() argument
1437 if (di->discharge_state != AB8500_FG_DISCHARGE_INIT_RECOVERY) in ab8500_fg_algorithm_charging()
1438 ab8500_fg_discharge_state_to(di, in ab8500_fg_algorithm_charging()
1441 switch (di->charge_state) { in ab8500_fg_algorithm_charging()
1443 di->fg_samples = SEC_TO_SAMPLE( in ab8500_fg_algorithm_charging()
1444 di->bm->fg_params->accu_charging); in ab8500_fg_algorithm_charging()
1446 ab8500_fg_coulomb_counter(di, true); in ab8500_fg_algorithm_charging()
1447 ab8500_fg_charge_state_to(di, AB8500_FG_CHARGE_READOUT); in ab8500_fg_algorithm_charging()
1455 mutex_lock(&di->cc_lock); in ab8500_fg_algorithm_charging()
1456 if (!di->flags.conv_done && !di->flags.force_full) { in ab8500_fg_algorithm_charging()
1458 mutex_unlock(&di->cc_lock); in ab8500_fg_algorithm_charging()
1459 dev_dbg(di->dev, "%s CC conv not done\n", in ab8500_fg_algorithm_charging()
1464 di->flags.conv_done = false; in ab8500_fg_algorithm_charging()
1465 mutex_unlock(&di->cc_lock); in ab8500_fg_algorithm_charging()
1467 ab8500_fg_calc_cap_charging(di); in ab8500_fg_algorithm_charging()
1476 ab8500_fg_check_capacity_limits(di, false); in ab8500_fg_algorithm_charging()
1479 static void force_capacity(struct ab8500_fg *di) in force_capacity() argument
1483 ab8500_fg_clear_cap_samples(di); in force_capacity()
1484 cap = di->bat_cap.user_mah; in force_capacity()
1485 if (cap > di->bat_cap.max_mah_design) { in force_capacity()
1486 dev_dbg(di->dev, "Remaining cap %d can't be bigger than total" in force_capacity()
1487 " %d\n", cap, di->bat_cap.max_mah_design); in force_capacity()
1488 cap = di->bat_cap.max_mah_design; in force_capacity()
1490 ab8500_fg_fill_cap_sample(di, di->bat_cap.user_mah); in force_capacity()
1491 di->bat_cap.permille = ab8500_fg_convert_mah_to_permille(di, cap); in force_capacity()
1492 di->bat_cap.mah = cap; in force_capacity()
1493 ab8500_fg_check_capacity_limits(di, true); in force_capacity()
1496 static bool check_sysfs_capacity(struct ab8500_fg *di) in check_sysfs_capacity() argument
1501 cap = di->bat_cap.user_mah; in check_sysfs_capacity()
1503 cap_permille = ab8500_fg_convert_mah_to_permille(di, in check_sysfs_capacity()
1504 di->bat_cap.user_mah); in check_sysfs_capacity()
1506 lower = di->bat_cap.permille - di->bm->fg_params->user_cap_limit * 10; in check_sysfs_capacity()
1507 upper = di->bat_cap.permille + di->bm->fg_params->user_cap_limit * 10; in check_sysfs_capacity()
1515 dev_dbg(di->dev, "Capacity limits:" in check_sysfs_capacity()
1517 lower, cap_permille, upper, cap, di->bat_cap.mah); in check_sysfs_capacity()
1521 dev_dbg(di->dev, "OK! Using users cap %d uAh now\n", cap); in check_sysfs_capacity()
1522 force_capacity(di); in check_sysfs_capacity()
1525 dev_dbg(di->dev, "Capacity from user out of limits, ignoring"); in check_sysfs_capacity()
1535 static void ab8500_fg_algorithm_discharging(struct ab8500_fg *di) in ab8500_fg_algorithm_discharging() argument
1540 if (di->charge_state != AB8500_FG_CHARGE_INIT) in ab8500_fg_algorithm_discharging()
1541 ab8500_fg_charge_state_to(di, AB8500_FG_CHARGE_INIT); in ab8500_fg_algorithm_discharging()
1543 switch (di->discharge_state) { in ab8500_fg_algorithm_discharging()
1546 di->init_cnt = 0; in ab8500_fg_algorithm_discharging()
1547 di->fg_samples = SEC_TO_SAMPLE(di->bm->fg_params->init_timer); in ab8500_fg_algorithm_discharging()
1548 ab8500_fg_coulomb_counter(di, true); in ab8500_fg_algorithm_discharging()
1549 ab8500_fg_discharge_state_to(di, in ab8500_fg_algorithm_discharging()
1560 sleep_time = di->bm->fg_params->init_timer; in ab8500_fg_algorithm_discharging()
1563 if (di->init_cnt > di->bm->fg_params->init_discard_time) { in ab8500_fg_algorithm_discharging()
1564 ab8500_fg_calc_cap_discharge_voltage(di, true); in ab8500_fg_algorithm_discharging()
1566 ab8500_fg_check_capacity_limits(di, true); in ab8500_fg_algorithm_discharging()
1569 di->init_cnt += sleep_time; in ab8500_fg_algorithm_discharging()
1570 if (di->init_cnt > di->bm->fg_params->init_total_time) in ab8500_fg_algorithm_discharging()
1571 ab8500_fg_discharge_state_to(di, in ab8500_fg_algorithm_discharging()
1577 di->recovery_cnt = 0; in ab8500_fg_algorithm_discharging()
1578 di->recovery_needed = true; in ab8500_fg_algorithm_discharging()
1579 ab8500_fg_discharge_state_to(di, in ab8500_fg_algorithm_discharging()
1585 sleep_time = di->bm->fg_params->recovery_sleep_timer; in ab8500_fg_algorithm_discharging()
1593 di->inst_curr = ab8500_fg_inst_curr_blocking(di); in ab8500_fg_algorithm_discharging()
1595 if (ab8500_fg_is_low_curr(di, di->inst_curr)) { in ab8500_fg_algorithm_discharging()
1596 if (di->recovery_cnt > in ab8500_fg_algorithm_discharging()
1597 di->bm->fg_params->recovery_total_time) { in ab8500_fg_algorithm_discharging()
1598 di->fg_samples = SEC_TO_SAMPLE( in ab8500_fg_algorithm_discharging()
1599 di->bm->fg_params->accu_high_curr); in ab8500_fg_algorithm_discharging()
1600 ab8500_fg_coulomb_counter(di, true); in ab8500_fg_algorithm_discharging()
1601 ab8500_fg_discharge_state_to(di, in ab8500_fg_algorithm_discharging()
1603 di->recovery_needed = false; in ab8500_fg_algorithm_discharging()
1605 queue_delayed_work(di->fg_wq, in ab8500_fg_algorithm_discharging()
1606 &di->fg_periodic_work, in ab8500_fg_algorithm_discharging()
1609 di->recovery_cnt += sleep_time; in ab8500_fg_algorithm_discharging()
1611 di->fg_samples = SEC_TO_SAMPLE( in ab8500_fg_algorithm_discharging()
1612 di->bm->fg_params->accu_high_curr); in ab8500_fg_algorithm_discharging()
1613 ab8500_fg_coulomb_counter(di, true); in ab8500_fg_algorithm_discharging()
1614 ab8500_fg_discharge_state_to(di, in ab8500_fg_algorithm_discharging()
1620 di->fg_samples = SEC_TO_SAMPLE( in ab8500_fg_algorithm_discharging()
1621 di->bm->fg_params->accu_high_curr); in ab8500_fg_algorithm_discharging()
1622 ab8500_fg_coulomb_counter(di, true); in ab8500_fg_algorithm_discharging()
1623 ab8500_fg_discharge_state_to(di, in ab8500_fg_algorithm_discharging()
1628 di->inst_curr = ab8500_fg_inst_curr_blocking(di); in ab8500_fg_algorithm_discharging()
1630 if (ab8500_fg_is_low_curr(di, di->inst_curr)) { in ab8500_fg_algorithm_discharging()
1632 if (di->high_curr_mode) { in ab8500_fg_algorithm_discharging()
1633 di->high_curr_mode = false; in ab8500_fg_algorithm_discharging()
1634 di->high_curr_cnt = 0; in ab8500_fg_algorithm_discharging()
1637 if (di->recovery_needed) { in ab8500_fg_algorithm_discharging()
1638 ab8500_fg_discharge_state_to(di, in ab8500_fg_algorithm_discharging()
1641 queue_delayed_work(di->fg_wq, in ab8500_fg_algorithm_discharging()
1642 &di->fg_periodic_work, 0); in ab8500_fg_algorithm_discharging()
1647 ab8500_fg_calc_cap_discharge_voltage(di, true); in ab8500_fg_algorithm_discharging()
1649 mutex_lock(&di->cc_lock); in ab8500_fg_algorithm_discharging()
1650 if (!di->flags.conv_done) { in ab8500_fg_algorithm_discharging()
1652 mutex_unlock(&di->cc_lock); in ab8500_fg_algorithm_discharging()
1653 dev_dbg(di->dev, "%s CC conv not done\n", in ab8500_fg_algorithm_discharging()
1658 di->flags.conv_done = false; in ab8500_fg_algorithm_discharging()
1659 mutex_unlock(&di->cc_lock); in ab8500_fg_algorithm_discharging()
1662 if (!di->high_curr_mode) { in ab8500_fg_algorithm_discharging()
1663 di->high_curr_mode = true; in ab8500_fg_algorithm_discharging()
1664 di->high_curr_cnt = 0; in ab8500_fg_algorithm_discharging()
1667 di->high_curr_cnt += in ab8500_fg_algorithm_discharging()
1668 di->bm->fg_params->accu_high_curr; in ab8500_fg_algorithm_discharging()
1669 if (di->high_curr_cnt > in ab8500_fg_algorithm_discharging()
1670 di->bm->fg_params->high_curr_time) in ab8500_fg_algorithm_discharging()
1671 di->recovery_needed = true; in ab8500_fg_algorithm_discharging()
1673 ab8500_fg_calc_cap_discharge_fg(di); in ab8500_fg_algorithm_discharging()
1676 ab8500_fg_check_capacity_limits(di, false); in ab8500_fg_algorithm_discharging()
1681 ab8500_fg_calc_cap_discharge_voltage(di, true); in ab8500_fg_algorithm_discharging()
1683 di->fg_samples = SEC_TO_SAMPLE( in ab8500_fg_algorithm_discharging()
1684 di->bm->fg_params->accu_high_curr); in ab8500_fg_algorithm_discharging()
1685 ab8500_fg_coulomb_counter(di, true); in ab8500_fg_algorithm_discharging()
1686 ab8500_fg_discharge_state_to(di, in ab8500_fg_algorithm_discharging()
1689 ab8500_fg_check_capacity_limits(di, false); in ab8500_fg_algorithm_discharging()
1703 static void ab8500_fg_algorithm_calibrate(struct ab8500_fg *di) in ab8500_fg_algorithm_calibrate() argument
1707 switch (di->calib_state) { in ab8500_fg_algorithm_calibrate()
1709 dev_dbg(di->dev, "Calibration ongoing...\n"); in ab8500_fg_algorithm_calibrate()
1711 ret = abx500_mask_and_set_register_interruptible(di->dev, in ab8500_fg_algorithm_calibrate()
1717 ret = abx500_mask_and_set_register_interruptible(di->dev, in ab8500_fg_algorithm_calibrate()
1722 di->calib_state = AB8500_FG_CALIB_WAIT; in ab8500_fg_algorithm_calibrate()
1725 ret = abx500_mask_and_set_register_interruptible(di->dev, in ab8500_fg_algorithm_calibrate()
1730 di->flags.calibrate = false; in ab8500_fg_algorithm_calibrate()
1731 dev_dbg(di->dev, "Calibration done...\n"); in ab8500_fg_algorithm_calibrate()
1732 queue_delayed_work(di->fg_wq, &di->fg_periodic_work, 0); in ab8500_fg_algorithm_calibrate()
1735 dev_dbg(di->dev, "Calibration WFI\n"); in ab8500_fg_algorithm_calibrate()
1742 dev_err(di->dev, "failed to calibrate the CC\n"); in ab8500_fg_algorithm_calibrate()
1743 di->flags.calibrate = false; in ab8500_fg_algorithm_calibrate()
1744 di->calib_state = AB8500_FG_CALIB_INIT; in ab8500_fg_algorithm_calibrate()
1745 queue_delayed_work(di->fg_wq, &di->fg_periodic_work, 0); in ab8500_fg_algorithm_calibrate()
1754 static void ab8500_fg_algorithm(struct ab8500_fg *di) in ab8500_fg_algorithm() argument
1756 if (di->flags.calibrate) in ab8500_fg_algorithm()
1757 ab8500_fg_algorithm_calibrate(di); in ab8500_fg_algorithm()
1759 if (di->flags.charging) in ab8500_fg_algorithm()
1760 ab8500_fg_algorithm_charging(di); in ab8500_fg_algorithm()
1762 ab8500_fg_algorithm_discharging(di); in ab8500_fg_algorithm()
1765 dev_dbg(di->dev, "[FG_DATA] %d %d %d %d %d %d %d %d %d %d " in ab8500_fg_algorithm()
1767 di->bat_cap.max_mah_design, in ab8500_fg_algorithm()
1768 di->bat_cap.max_mah, in ab8500_fg_algorithm()
1769 di->bat_cap.mah, in ab8500_fg_algorithm()
1770 di->bat_cap.permille, in ab8500_fg_algorithm()
1771 di->bat_cap.level, in ab8500_fg_algorithm()
1772 di->bat_cap.prev_mah, in ab8500_fg_algorithm()
1773 di->bat_cap.prev_percent, in ab8500_fg_algorithm()
1774 di->bat_cap.prev_level, in ab8500_fg_algorithm()
1775 di->vbat, in ab8500_fg_algorithm()
1776 di->inst_curr, in ab8500_fg_algorithm()
1777 di->avg_curr, in ab8500_fg_algorithm()
1778 di->accu_charge, in ab8500_fg_algorithm()
1779 di->flags.charging, in ab8500_fg_algorithm()
1780 di->charge_state, in ab8500_fg_algorithm()
1781 di->discharge_state, in ab8500_fg_algorithm()
1782 di->high_curr_mode, in ab8500_fg_algorithm()
1783 di->recovery_needed); in ab8500_fg_algorithm()
1794 struct ab8500_fg *di = container_of(work, struct ab8500_fg, in ab8500_fg_periodic_work() local
1797 if (di->init_capacity) { in ab8500_fg_periodic_work()
1799 ab8500_fg_calc_cap_discharge_voltage(di, true); in ab8500_fg_periodic_work()
1800 ab8500_fg_check_capacity_limits(di, true); in ab8500_fg_periodic_work()
1801 di->init_capacity = false; in ab8500_fg_periodic_work()
1803 queue_delayed_work(di->fg_wq, &di->fg_periodic_work, 0); in ab8500_fg_periodic_work()
1804 } else if (di->flags.user_cap) { in ab8500_fg_periodic_work()
1805 if (check_sysfs_capacity(di)) { in ab8500_fg_periodic_work()
1806 ab8500_fg_check_capacity_limits(di, true); in ab8500_fg_periodic_work()
1807 if (di->flags.charging) in ab8500_fg_periodic_work()
1808 ab8500_fg_charge_state_to(di, in ab8500_fg_periodic_work()
1811 ab8500_fg_discharge_state_to(di, in ab8500_fg_periodic_work()
1814 di->flags.user_cap = false; in ab8500_fg_periodic_work()
1815 queue_delayed_work(di->fg_wq, &di->fg_periodic_work, 0); in ab8500_fg_periodic_work()
1817 ab8500_fg_algorithm(di); in ab8500_fg_periodic_work()
1832 struct ab8500_fg *di = container_of(work, struct ab8500_fg, in ab8500_fg_check_hw_failure_work() local
1839 ret = abx500_get_register_interruptible(di->dev, in ab8500_fg_check_hw_failure_work()
1843 dev_err(di->dev, "%s ab8500 read failed\n", __func__); in ab8500_fg_check_hw_failure_work()
1847 if (!di->flags.bat_ovv) { in ab8500_fg_check_hw_failure_work()
1848 dev_dbg(di->dev, "Battery OVV\n"); in ab8500_fg_check_hw_failure_work()
1849 di->flags.bat_ovv = true; in ab8500_fg_check_hw_failure_work()
1850 power_supply_changed(di->fg_psy); in ab8500_fg_check_hw_failure_work()
1853 queue_delayed_work(di->fg_wq, &di->fg_check_hw_failure_work, in ab8500_fg_check_hw_failure_work()
1856 dev_dbg(di->dev, "Battery recovered from OVV\n"); in ab8500_fg_check_hw_failure_work()
1857 di->flags.bat_ovv = false; in ab8500_fg_check_hw_failure_work()
1858 power_supply_changed(di->fg_psy); in ab8500_fg_check_hw_failure_work()
1872 struct ab8500_fg *di = container_of(work, struct ab8500_fg, in ab8500_fg_low_bat_work() local
1875 vbat = ab8500_fg_bat_voltage(di); in ab8500_fg_low_bat_work()
1878 if (vbat < di->bm->fg_params->lowbat_threshold) { in ab8500_fg_low_bat_work()
1880 if (di->low_bat_cnt < 1) { in ab8500_fg_low_bat_work()
1881 di->flags.low_bat = true; in ab8500_fg_low_bat_work()
1882 dev_warn(di->dev, "Shut down pending...\n"); in ab8500_fg_low_bat_work()
1889 di->low_bat_cnt--; in ab8500_fg_low_bat_work()
1890 dev_warn(di->dev, "Battery voltage still LOW\n"); in ab8500_fg_low_bat_work()
1891 queue_delayed_work(di->fg_wq, &di->fg_low_bat_work, in ab8500_fg_low_bat_work()
1895 di->flags.low_bat_delay = false; in ab8500_fg_low_bat_work()
1896 di->low_bat_cnt = 10; in ab8500_fg_low_bat_work()
1897 dev_warn(di->dev, "Battery voltage OK again\n"); in ab8500_fg_low_bat_work()
1901 ab8500_fg_check_capacity_limits(di, false); in ab8500_fg_low_bat_work()
1914 static int ab8500_fg_battok_calc(struct ab8500_fg *di, int target) in ab8500_fg_battok_calc() argument
1930 static int ab8500_fg_battok_init_hw_register(struct ab8500_fg *di) in ab8500_fg_battok_init_hw_register() argument
1940 sel0 = di->bm->fg_params->battok_falling_th_sel0; in ab8500_fg_battok_init_hw_register()
1941 sel1 = di->bm->fg_params->battok_raising_th_sel1; in ab8500_fg_battok_init_hw_register()
1943 cbp_sel0 = ab8500_fg_battok_calc(di, sel0); in ab8500_fg_battok_init_hw_register()
1944 cbp_sel1 = ab8500_fg_battok_calc(di, sel1); in ab8500_fg_battok_init_hw_register()
1949 dev_warn(di->dev, "Invalid voltage step:%d, using %d %d\n", in ab8500_fg_battok_init_hw_register()
1955 dev_warn(di->dev, "Invalid voltage step:%d, using %d %d\n", in ab8500_fg_battok_init_hw_register()
1960 dev_dbg(di->dev, "using: %x %d %d\n", new_val, cbp_sel0, cbp_sel1); in ab8500_fg_battok_init_hw_register()
1961 ret = abx500_set_register_interruptible(di->dev, AB8500_SYS_CTRL2_BLOCK, in ab8500_fg_battok_init_hw_register()
1974 struct ab8500_fg *di = container_of(work, struct ab8500_fg, fg_work); in ab8500_fg_instant_work() local
1976 ab8500_fg_algorithm(di); in ab8500_fg_instant_work()
1988 struct ab8500_fg *di = _di; in ab8500_fg_cc_data_end_handler() local
1989 if (!di->nbr_cceoc_irq_cnt) { in ab8500_fg_cc_data_end_handler()
1990 di->nbr_cceoc_irq_cnt++; in ab8500_fg_cc_data_end_handler()
1991 complete(&di->ab8500_fg_started); in ab8500_fg_cc_data_end_handler()
1993 di->nbr_cceoc_irq_cnt = 0; in ab8500_fg_cc_data_end_handler()
1994 complete(&di->ab8500_fg_complete); in ab8500_fg_cc_data_end_handler()
2008 struct ab8500_fg *di = _di; in ab8500_fg_cc_int_calib_handler() local
2009 di->calib_state = AB8500_FG_CALIB_END; in ab8500_fg_cc_int_calib_handler()
2010 queue_delayed_work(di->fg_wq, &di->fg_periodic_work, 0); in ab8500_fg_cc_int_calib_handler()
2023 struct ab8500_fg *di = _di; in ab8500_fg_cc_convend_handler() local
2025 queue_work(di->fg_wq, &di->fg_acc_cur_work); in ab8500_fg_cc_convend_handler()
2039 struct ab8500_fg *di = _di; in ab8500_fg_batt_ovv_handler() local
2041 dev_dbg(di->dev, "Battery OVV\n"); in ab8500_fg_batt_ovv_handler()
2044 queue_delayed_work(di->fg_wq, &di->fg_check_hw_failure_work, 0); in ab8500_fg_batt_ovv_handler()
2058 struct ab8500_fg *di = _di; in ab8500_fg_lowbatf_handler() local
2061 if (!di->flags.low_bat_delay) { in ab8500_fg_lowbatf_handler()
2062 dev_warn(di->dev, "Battery voltage is below LOW threshold\n"); in ab8500_fg_lowbatf_handler()
2063 di->flags.low_bat_delay = true; in ab8500_fg_lowbatf_handler()
2068 queue_delayed_work(di->fg_wq, &di->fg_low_bat_work, in ab8500_fg_lowbatf_handler()
2096 struct ab8500_fg *di = power_supply_get_drvdata(psy); in ab8500_fg_get_property() local
2107 if (di->flags.bat_ovv) in ab8500_fg_get_property()
2110 val->intval = di->vbat * 1000; in ab8500_fg_get_property()
2113 val->intval = di->inst_curr * 1000; in ab8500_fg_get_property()
2116 val->intval = di->avg_curr * 1000; in ab8500_fg_get_property()
2119 val->intval = ab8500_fg_convert_mah_to_uwh(di, in ab8500_fg_get_property()
2120 di->bat_cap.max_mah_design); in ab8500_fg_get_property()
2123 val->intval = ab8500_fg_convert_mah_to_uwh(di, in ab8500_fg_get_property()
2124 di->bat_cap.max_mah); in ab8500_fg_get_property()
2127 if (di->flags.batt_unknown && !di->bm->chg_unknown_bat && in ab8500_fg_get_property()
2128 di->flags.batt_id_received) in ab8500_fg_get_property()
2129 val->intval = ab8500_fg_convert_mah_to_uwh(di, in ab8500_fg_get_property()
2130 di->bat_cap.max_mah); in ab8500_fg_get_property()
2132 val->intval = ab8500_fg_convert_mah_to_uwh(di, in ab8500_fg_get_property()
2133 di->bat_cap.prev_mah); in ab8500_fg_get_property()
2136 val->intval = di->bat_cap.max_mah_design; in ab8500_fg_get_property()
2139 val->intval = di->bat_cap.max_mah; in ab8500_fg_get_property()
2142 if (di->flags.batt_unknown && !di->bm->chg_unknown_bat && in ab8500_fg_get_property()
2143 di->flags.batt_id_received) in ab8500_fg_get_property()
2144 val->intval = di->bat_cap.max_mah; in ab8500_fg_get_property()
2146 val->intval = di->bat_cap.prev_mah; in ab8500_fg_get_property()
2149 if (di->flags.batt_unknown && !di->bm->chg_unknown_bat && in ab8500_fg_get_property()
2150 di->flags.batt_id_received) in ab8500_fg_get_property()
2153 val->intval = di->bat_cap.prev_percent; in ab8500_fg_get_property()
2156 if (di->flags.batt_unknown && !di->bm->chg_unknown_bat && in ab8500_fg_get_property()
2157 di->flags.batt_id_received) in ab8500_fg_get_property()
2160 val->intval = di->bat_cap.prev_level; in ab8500_fg_get_property()
2172 struct ab8500_fg *di; in ab8500_fg_get_ext_psy_data() local
2179 di = power_supply_get_drvdata(psy); in ab8500_fg_get_ext_psy_data()
2209 if (!di->flags.charging) in ab8500_fg_get_ext_psy_data()
2211 di->flags.charging = false; in ab8500_fg_get_ext_psy_data()
2212 di->flags.fully_charged = false; in ab8500_fg_get_ext_psy_data()
2213 if (di->bm->capacity_scaling) in ab8500_fg_get_ext_psy_data()
2214 ab8500_fg_update_cap_scalers(di); in ab8500_fg_get_ext_psy_data()
2215 queue_work(di->fg_wq, &di->fg_work); in ab8500_fg_get_ext_psy_data()
2218 if (di->flags.fully_charged) in ab8500_fg_get_ext_psy_data()
2220 di->flags.fully_charged = true; in ab8500_fg_get_ext_psy_data()
2221 di->flags.force_full = true; in ab8500_fg_get_ext_psy_data()
2223 di->bat_cap.max_mah = di->bat_cap.mah; in ab8500_fg_get_ext_psy_data()
2224 queue_work(di->fg_wq, &di->fg_work); in ab8500_fg_get_ext_psy_data()
2227 if (di->flags.charging && in ab8500_fg_get_ext_psy_data()
2228 !di->flags.fully_charged) in ab8500_fg_get_ext_psy_data()
2230 di->flags.charging = true; in ab8500_fg_get_ext_psy_data()
2231 di->flags.fully_charged = false; in ab8500_fg_get_ext_psy_data()
2232 if (di->bm->capacity_scaling) in ab8500_fg_get_ext_psy_data()
2233 ab8500_fg_update_cap_scalers(di); in ab8500_fg_get_ext_psy_data()
2234 queue_work(di->fg_wq, &di->fg_work); in ab8500_fg_get_ext_psy_data()
2244 if (!di->flags.batt_id_received && in ab8500_fg_get_ext_psy_data()
2245 di->bm->batt_id != BATTERY_UNKNOWN) { in ab8500_fg_get_ext_psy_data()
2248 b = &(di->bm->bat_type[di->bm->batt_id]); in ab8500_fg_get_ext_psy_data()
2250 di->flags.batt_id_received = true; in ab8500_fg_get_ext_psy_data()
2252 di->bat_cap.max_mah_design = in ab8500_fg_get_ext_psy_data()
2256 di->bat_cap.max_mah = in ab8500_fg_get_ext_psy_data()
2257 di->bat_cap.max_mah_design; in ab8500_fg_get_ext_psy_data()
2259 di->vbat_nom = b->nominal_voltage; in ab8500_fg_get_ext_psy_data()
2263 di->flags.batt_unknown = false; in ab8500_fg_get_ext_psy_data()
2265 di->flags.batt_unknown = true; in ab8500_fg_get_ext_psy_data()
2274 if (di->flags.batt_id_received) in ab8500_fg_get_ext_psy_data()
2275 di->bat_temp = ret.intval; in ab8500_fg_get_ext_psy_data()
2294 static int ab8500_fg_init_hw_registers(struct ab8500_fg *di) in ab8500_fg_init_hw_registers() argument
2299 ret = abx500_mask_and_set_register_interruptible(di->dev, in ab8500_fg_init_hw_registers()
2305 dev_err(di->dev, "failed to set BATT_OVV\n"); in ab8500_fg_init_hw_registers()
2310 ret = abx500_mask_and_set_register_interruptible(di->dev, in ab8500_fg_init_hw_registers()
2316 dev_err(di->dev, "failed to enable BATT_OVV\n"); in ab8500_fg_init_hw_registers()
2321 ret = abx500_set_register_interruptible(di->dev, in ab8500_fg_init_hw_registers()
2325 di->bm->fg_params->lowbat_threshold) << 1 | in ab8500_fg_init_hw_registers()
2328 dev_err(di->dev, "%s write failed\n", __func__); in ab8500_fg_init_hw_registers()
2333 ret = ab8500_fg_battok_init_hw_register(di); in ab8500_fg_init_hw_registers()
2335 dev_err(di->dev, "BattOk init write failed.\n"); in ab8500_fg_init_hw_registers()
2339 if (((is_ab8505(di->parent) || is_ab9540(di->parent)) && in ab8500_fg_init_hw_registers()
2340 abx500_get_chip_id(di->dev) >= AB8500_CUT2P0) in ab8500_fg_init_hw_registers()
2341 || is_ab8540(di->parent)) { in ab8500_fg_init_hw_registers()
2342 ret = abx500_set_register_interruptible(di->dev, AB8500_RTC, in ab8500_fg_init_hw_registers()
2343 AB8505_RTC_PCUT_MAX_TIME_REG, di->bm->fg_params->pcut_max_time); in ab8500_fg_init_hw_registers()
2346 dev_err(di->dev, "%s write failed AB8505_RTC_PCUT_MAX_TIME_REG\n", __func__); in ab8500_fg_init_hw_registers()
2350 ret = abx500_set_register_interruptible(di->dev, AB8500_RTC, in ab8500_fg_init_hw_registers()
2351 AB8505_RTC_PCUT_FLAG_TIME_REG, di->bm->fg_params->pcut_flag_time); in ab8500_fg_init_hw_registers()
2354 dev_err(di->dev, "%s write failed AB8505_RTC_PCUT_FLAG_TIME_REG\n", __func__); in ab8500_fg_init_hw_registers()
2358 ret = abx500_set_register_interruptible(di->dev, AB8500_RTC, in ab8500_fg_init_hw_registers()
2359 AB8505_RTC_PCUT_RESTART_REG, di->bm->fg_params->pcut_max_restart); in ab8500_fg_init_hw_registers()
2362 dev_err(di->dev, "%s write failed AB8505_RTC_PCUT_RESTART_REG\n", __func__); in ab8500_fg_init_hw_registers()
2366 ret = abx500_set_register_interruptible(di->dev, AB8500_RTC, in ab8500_fg_init_hw_registers()
2367 AB8505_RTC_PCUT_DEBOUNCE_REG, di->bm->fg_params->pcut_debounce_time); in ab8500_fg_init_hw_registers()
2370 dev_err(di->dev, "%s write failed AB8505_RTC_PCUT_DEBOUNCE_REG\n", __func__); in ab8500_fg_init_hw_registers()
2374 ret = abx500_set_register_interruptible(di->dev, AB8500_RTC, in ab8500_fg_init_hw_registers()
2375 AB8505_RTC_PCUT_CTL_STATUS_REG, di->bm->fg_params->pcut_enable); in ab8500_fg_init_hw_registers()
2378 dev_err(di->dev, "%s write failed AB8505_RTC_PCUT_CTL_STATUS_REG\n", __func__); in ab8500_fg_init_hw_registers()
2397 struct ab8500_fg *di = power_supply_get_drvdata(psy); in ab8500_fg_external_power_changed() local
2400 di->fg_psy, ab8500_fg_get_ext_psy_data); in ab8500_fg_external_power_changed()
2413 struct ab8500_fg *di = container_of(work, struct ab8500_fg, in ab8500_fg_reinit_work() local
2416 if (di->flags.calibrate == false) { in ab8500_fg_reinit_work()
2417 dev_dbg(di->dev, "Resetting FG state machine to init.\n"); in ab8500_fg_reinit_work()
2418 ab8500_fg_clear_cap_samples(di); in ab8500_fg_reinit_work()
2419 ab8500_fg_calc_cap_discharge_voltage(di, true); in ab8500_fg_reinit_work()
2420 ab8500_fg_charge_state_to(di, AB8500_FG_CHARGE_INIT); in ab8500_fg_reinit_work()
2421 ab8500_fg_discharge_state_to(di, AB8500_FG_DISCHARGE_INIT); in ab8500_fg_reinit_work()
2422 queue_delayed_work(di->fg_wq, &di->fg_periodic_work, 0); in ab8500_fg_reinit_work()
2425 dev_err(di->dev, "Residual offset calibration ongoing " in ab8500_fg_reinit_work()
2428 queue_delayed_work(di->fg_wq, &di->fg_reinit_work, in ab8500_fg_reinit_work()
2441 static ssize_t charge_full_show(struct ab8500_fg *di, char *buf) in charge_full_show() argument
2443 return sprintf(buf, "%d\n", di->bat_cap.max_mah); in charge_full_show()
2446 static ssize_t charge_full_store(struct ab8500_fg *di, const char *buf, in charge_full_store() argument
2454 dev_dbg(di->dev, "Ret %zd charge_full %lu", ret, charge_full); in charge_full_store()
2457 di->bat_cap.max_mah = (int) charge_full; in charge_full_store()
2463 static ssize_t charge_now_show(struct ab8500_fg *di, char *buf) in charge_now_show() argument
2465 return sprintf(buf, "%d\n", di->bat_cap.prev_mah); in charge_now_show()
2468 static ssize_t charge_now_store(struct ab8500_fg *di, const char *buf, in charge_now_store() argument
2476 dev_dbg(di->dev, "Ret %zd charge_now %lu was %d", in charge_now_store()
2477 ret, charge_now, di->bat_cap.prev_mah); in charge_now_store()
2480 di->bat_cap.user_mah = (int) charge_now; in charge_now_store()
2481 di->flags.user_cap = true; in charge_now_store()
2483 queue_delayed_work(di->fg_wq, &di->fg_periodic_work, 0); in charge_now_store()
2498 struct ab8500_fg *di; in ab8500_fg_show() local
2501 di = container_of(kobj, struct ab8500_fg, fg_kobject); in ab8500_fg_show()
2506 return entry->show(di, buf); in ab8500_fg_show()
2513 struct ab8500_fg *di; in ab8500_fg_store() local
2516 di = container_of(kobj, struct ab8500_fg, fg_kobject); in ab8500_fg_store()
2521 return entry->store(di, buf, count); in ab8500_fg_store()
2546 static void ab8500_fg_sysfs_exit(struct ab8500_fg *di) in ab8500_fg_sysfs_exit() argument
2548 kobject_del(&di->fg_kobject); in ab8500_fg_sysfs_exit()
2558 static int ab8500_fg_sysfs_init(struct ab8500_fg *di) in ab8500_fg_sysfs_init() argument
2562 ret = kobject_init_and_add(&di->fg_kobject, in ab8500_fg_sysfs_init()
2566 dev_err(di->dev, "failed to create sysfs entry\n"); in ab8500_fg_sysfs_init()
2578 struct ab8500_fg *di = power_supply_get_drvdata(psy); in ab8505_powercut_flagtime_read() local
2580 ret = abx500_get_register_interruptible(di->dev, AB8500_RTC, in ab8505_powercut_flagtime_read()
2601 struct ab8500_fg *di = power_supply_get_drvdata(psy); in ab8505_powercut_flagtime_write() local
2610 ret = abx500_set_register_interruptible(di->dev, AB8500_RTC, in ab8505_powercut_flagtime_write()
2627 struct ab8500_fg *di = power_supply_get_drvdata(psy); in ab8505_powercut_maxtime_read() local
2629 ret = abx500_get_register_interruptible(di->dev, AB8500_RTC, in ab8505_powercut_maxtime_read()
2651 struct ab8500_fg *di = power_supply_get_drvdata(psy); in ab8505_powercut_maxtime_write() local
2659 ret = abx500_set_register_interruptible(di->dev, AB8500_RTC, in ab8505_powercut_maxtime_write()
2676 struct ab8500_fg *di = power_supply_get_drvdata(psy); in ab8505_powercut_restart_read() local
2678 ret = abx500_get_register_interruptible(di->dev, AB8500_RTC, in ab8505_powercut_restart_read()
2699 struct ab8500_fg *di = power_supply_get_drvdata(psy); in ab8505_powercut_restart_write() local
2707 ret = abx500_set_register_interruptible(di->dev, AB8500_RTC, in ab8505_powercut_restart_write()
2725 struct ab8500_fg *di = power_supply_get_drvdata(psy); in ab8505_powercut_timer_read() local
2727 ret = abx500_get_register_interruptible(di->dev, AB8500_RTC, in ab8505_powercut_timer_read()
2748 struct ab8500_fg *di = power_supply_get_drvdata(psy); in ab8505_powercut_restart_counter_read() local
2750 ret = abx500_get_register_interruptible(di->dev, AB8500_RTC, in ab8505_powercut_restart_counter_read()
2771 struct ab8500_fg *di = power_supply_get_drvdata(psy); in ab8505_powercut_read() local
2773 ret = abx500_get_register_interruptible(di->dev, AB8500_RTC, in ab8505_powercut_read()
2792 struct ab8500_fg *di = power_supply_get_drvdata(psy); in ab8505_powercut_write() local
2800 ret = abx500_set_register_interruptible(di->dev, AB8500_RTC, in ab8505_powercut_write()
2818 struct ab8500_fg *di = power_supply_get_drvdata(psy); in ab8505_powercut_flag_read() local
2820 ret = abx500_get_register_interruptible(di->dev, AB8500_RTC, in ab8505_powercut_flag_read()
2841 struct ab8500_fg *di = power_supply_get_drvdata(psy); in ab8505_powercut_debounce_read() local
2843 ret = abx500_get_register_interruptible(di->dev, AB8500_RTC, in ab8505_powercut_debounce_read()
2864 struct ab8500_fg *di = power_supply_get_drvdata(psy); in ab8505_powercut_debounce_write() local
2872 ret = abx500_set_register_interruptible(di->dev, AB8500_RTC, in ab8505_powercut_debounce_write()
2889 struct ab8500_fg *di = power_supply_get_drvdata(psy); in ab8505_powercut_enable_status_read() local
2891 ret = abx500_get_register_interruptible(di->dev, AB8500_RTC, in ab8505_powercut_enable_status_read()
2924 static int ab8500_fg_sysfs_psy_create_attrs(struct ab8500_fg *di) in ab8500_fg_sysfs_psy_create_attrs() argument
2928 if (((is_ab8505(di->parent) || is_ab9540(di->parent)) && in ab8500_fg_sysfs_psy_create_attrs()
2929 abx500_get_chip_id(di->dev) >= AB8500_CUT2P0) in ab8500_fg_sysfs_psy_create_attrs()
2930 || is_ab8540(di->parent)) { in ab8500_fg_sysfs_psy_create_attrs()
2932 if (device_create_file(&di->fg_psy->dev, in ab8500_fg_sysfs_psy_create_attrs()
2938 dev_err(&di->fg_psy->dev, "Failed creating sysfs psy attrs for ab8505.\n"); in ab8500_fg_sysfs_psy_create_attrs()
2940 device_remove_file(&di->fg_psy->dev, in ab8500_fg_sysfs_psy_create_attrs()
2946 static void ab8500_fg_sysfs_psy_remove_attrs(struct ab8500_fg *di) in ab8500_fg_sysfs_psy_remove_attrs() argument
2950 if (((is_ab8505(di->parent) || is_ab9540(di->parent)) && in ab8500_fg_sysfs_psy_remove_attrs()
2951 abx500_get_chip_id(di->dev) >= AB8500_CUT2P0) in ab8500_fg_sysfs_psy_remove_attrs()
2952 || is_ab8540(di->parent)) { in ab8500_fg_sysfs_psy_remove_attrs()
2954 (void)device_remove_file(&di->fg_psy->dev, in ab8500_fg_sysfs_psy_remove_attrs()
2964 struct ab8500_fg *di = platform_get_drvdata(pdev); in ab8500_fg_resume() local
2970 if (!di->flags.charging) { in ab8500_fg_resume()
2971 ab8500_fg_discharge_state_to(di, AB8500_FG_DISCHARGE_WAKEUP); in ab8500_fg_resume()
2972 queue_work(di->fg_wq, &di->fg_work); in ab8500_fg_resume()
2981 struct ab8500_fg *di = platform_get_drvdata(pdev); in ab8500_fg_suspend() local
2983 flush_delayed_work(&di->fg_periodic_work); in ab8500_fg_suspend()
2984 flush_work(&di->fg_work); in ab8500_fg_suspend()
2985 flush_work(&di->fg_acc_cur_work); in ab8500_fg_suspend()
2986 flush_delayed_work(&di->fg_reinit_work); in ab8500_fg_suspend()
2987 flush_delayed_work(&di->fg_low_bat_work); in ab8500_fg_suspend()
2988 flush_delayed_work(&di->fg_check_hw_failure_work); in ab8500_fg_suspend()
2994 if (di->flags.fg_enabled && !di->flags.charging) in ab8500_fg_suspend()
2995 ab8500_fg_coulomb_counter(di, false); in ab8500_fg_suspend()
3007 struct ab8500_fg *di = platform_get_drvdata(pdev); in ab8500_fg_remove() local
3009 list_del(&di->node); in ab8500_fg_remove()
3012 ret = ab8500_fg_coulomb_counter(di, false); in ab8500_fg_remove()
3014 dev_err(di->dev, "failed to disable coulomb counter\n"); in ab8500_fg_remove()
3016 destroy_workqueue(di->fg_wq); in ab8500_fg_remove()
3017 ab8500_fg_sysfs_exit(di); in ab8500_fg_remove()
3020 ab8500_fg_sysfs_psy_remove_attrs(di); in ab8500_fg_remove()
3021 power_supply_unregister(di->fg_psy); in ab8500_fg_remove()
3056 struct ab8500_fg *di; in ab8500_fg_probe() local
3060 di = devm_kzalloc(&pdev->dev, sizeof(*di), GFP_KERNEL); in ab8500_fg_probe()
3061 if (!di) { in ab8500_fg_probe()
3070 di->bm = plat; in ab8500_fg_probe()
3073 ret = ab8500_bm_of_probe(&pdev->dev, np, di->bm); in ab8500_fg_probe()
3080 mutex_init(&di->cc_lock); in ab8500_fg_probe()
3083 di->dev = &pdev->dev; in ab8500_fg_probe()
3084 di->parent = dev_get_drvdata(pdev->dev.parent); in ab8500_fg_probe()
3085 di->gpadc = ab8500_gpadc_get("ab8500-gpadc.0"); in ab8500_fg_probe()
3089 psy_cfg.drv_data = di; in ab8500_fg_probe()
3091 di->bat_cap.max_mah_design = MILLI_TO_MICRO * in ab8500_fg_probe()
3092 di->bm->bat_type[di->bm->batt_id].charge_full_design; in ab8500_fg_probe()
3094 di->bat_cap.max_mah = di->bat_cap.max_mah_design; in ab8500_fg_probe()
3096 di->vbat_nom = di->bm->bat_type[di->bm->batt_id].nominal_voltage; in ab8500_fg_probe()
3098 di->init_capacity = true; in ab8500_fg_probe()
3100 ab8500_fg_charge_state_to(di, AB8500_FG_CHARGE_INIT); in ab8500_fg_probe()
3101 ab8500_fg_discharge_state_to(di, AB8500_FG_DISCHARGE_INIT); in ab8500_fg_probe()
3104 di->fg_wq = create_singlethread_workqueue("ab8500_fg_wq"); in ab8500_fg_probe()
3105 if (di->fg_wq == NULL) { in ab8500_fg_probe()
3106 dev_err(di->dev, "failed to create work queue\n"); in ab8500_fg_probe()
3111 INIT_WORK(&di->fg_work, ab8500_fg_instant_work); in ab8500_fg_probe()
3114 INIT_WORK(&di->fg_acc_cur_work, ab8500_fg_acc_cur_work); in ab8500_fg_probe()
3117 INIT_DEFERRABLE_WORK(&di->fg_reinit_work, in ab8500_fg_probe()
3121 INIT_DEFERRABLE_WORK(&di->fg_periodic_work, in ab8500_fg_probe()
3125 INIT_DEFERRABLE_WORK(&di->fg_low_bat_work, in ab8500_fg_probe()
3129 INIT_DEFERRABLE_WORK(&di->fg_check_hw_failure_work, in ab8500_fg_probe()
3133 di->flags.low_bat = false; in ab8500_fg_probe()
3136 di->low_bat_cnt = 10; in ab8500_fg_probe()
3139 ret = ab8500_fg_init_hw_registers(di); in ab8500_fg_probe()
3141 dev_err(di->dev, "failed to initialize registers\n"); in ab8500_fg_probe()
3146 di->flags.batt_unknown = true; in ab8500_fg_probe()
3147 di->flags.batt_id_received = false; in ab8500_fg_probe()
3150 di->fg_psy = power_supply_register(di->dev, &ab8500_fg_desc, &psy_cfg); in ab8500_fg_probe()
3151 if (IS_ERR(di->fg_psy)) { in ab8500_fg_probe()
3152 dev_err(di->dev, "failed to register FG psy\n"); in ab8500_fg_probe()
3153 ret = PTR_ERR(di->fg_psy); in ab8500_fg_probe()
3157 di->fg_samples = SEC_TO_SAMPLE(di->bm->fg_params->init_timer); in ab8500_fg_probe()
3158 ab8500_fg_coulomb_counter(di, true); in ab8500_fg_probe()
3164 init_completion(&di->ab8500_fg_started); in ab8500_fg_probe()
3165 init_completion(&di->ab8500_fg_complete); in ab8500_fg_probe()
3172 ab8500_fg_irq_th[i].name, di); in ab8500_fg_probe()
3175 dev_err(di->dev, "failed to request %s IRQ %d: %d\n", in ab8500_fg_probe()
3179 dev_dbg(di->dev, "Requested %s IRQ %d: %d\n", in ab8500_fg_probe()
3187 ab8500_fg_irq_bh[0].name, di); in ab8500_fg_probe()
3190 dev_err(di->dev, "failed to request %s IRQ %d: %d\n", in ab8500_fg_probe()
3194 dev_dbg(di->dev, "Requested %s IRQ %d: %d\n", in ab8500_fg_probe()
3197 di->irq = platform_get_irq_byname(pdev, "CCEOC"); in ab8500_fg_probe()
3198 disable_irq(di->irq); in ab8500_fg_probe()
3199 di->nbr_cceoc_irq_cnt = 0; in ab8500_fg_probe()
3201 platform_set_drvdata(pdev, di); in ab8500_fg_probe()
3203 ret = ab8500_fg_sysfs_init(di); in ab8500_fg_probe()
3205 dev_err(di->dev, "failed to create sysfs entry\n"); in ab8500_fg_probe()
3209 ret = ab8500_fg_sysfs_psy_create_attrs(di); in ab8500_fg_probe()
3211 dev_err(di->dev, "failed to create FG psy\n"); in ab8500_fg_probe()
3212 ab8500_fg_sysfs_exit(di); in ab8500_fg_probe()
3217 di->flags.calibrate = true; in ab8500_fg_probe()
3218 di->calib_state = AB8500_FG_CALIB_INIT; in ab8500_fg_probe()
3221 di->bat_temp = 210; in ab8500_fg_probe()
3224 queue_delayed_work(di->fg_wq, &di->fg_periodic_work, 0); in ab8500_fg_probe()
3226 list_add_tail(&di->node, &ab8500_fg_list); in ab8500_fg_probe()
3231 power_supply_unregister(di->fg_psy); in ab8500_fg_probe()
3236 free_irq(irq, di); in ab8500_fg_probe()
3239 free_irq(irq, di); in ab8500_fg_probe()
3241 destroy_workqueue(di->fg_wq); in ab8500_fg_probe()