Lines Matching refs:di

361 static int ab8500_fg_is_low_curr(struct ab8500_fg *di, int curr)  in ab8500_fg_is_low_curr()  argument
366 if (curr > -di->bm->fg_params->high_curr_threshold) in ab8500_fg_is_low_curr()
380 static int ab8500_fg_add_cap_sample(struct ab8500_fg *di, int sample) in ab8500_fg_add_cap_sample() argument
383 struct ab8500_fg_avg_cap *avg = &di->avg_cap; in ab8500_fg_add_cap_sample()
414 static void ab8500_fg_clear_cap_samples(struct ab8500_fg *di) in ab8500_fg_clear_cap_samples() argument
417 struct ab8500_fg_avg_cap *avg = &di->avg_cap; in ab8500_fg_clear_cap_samples()
437 static void ab8500_fg_fill_cap_sample(struct ab8500_fg *di, int sample) in ab8500_fg_fill_cap_sample() argument
441 struct ab8500_fg_avg_cap *avg = &di->avg_cap; in ab8500_fg_fill_cap_sample()
464 static int ab8500_fg_coulomb_counter(struct ab8500_fg *di, bool enable) in ab8500_fg_coulomb_counter() argument
467 mutex_lock(&di->cc_lock); in ab8500_fg_coulomb_counter()
471 ret = abx500_set_register_interruptible(di->dev, AB8500_RTC, in ab8500_fg_coulomb_counter()
477 ret = abx500_set_register_interruptible(di->dev, in ab8500_fg_coulomb_counter()
479 di->fg_samples); in ab8500_fg_coulomb_counter()
484 ret = abx500_set_register_interruptible(di->dev, AB8500_RTC, in ab8500_fg_coulomb_counter()
490 di->flags.fg_enabled = true; in ab8500_fg_coulomb_counter()
493 ret = abx500_mask_and_set_register_interruptible(di->dev, in ab8500_fg_coulomb_counter()
499 ret = abx500_set_register_interruptible(di->dev, in ab8500_fg_coulomb_counter()
505 ret = abx500_set_register_interruptible(di->dev, AB8500_RTC, in ab8500_fg_coulomb_counter()
510 di->flags.fg_enabled = false; in ab8500_fg_coulomb_counter()
513 dev_dbg(di->dev, " CC enabled: %d Samples: %d\n", in ab8500_fg_coulomb_counter()
514 enable, di->fg_samples); in ab8500_fg_coulomb_counter()
516 mutex_unlock(&di->cc_lock); in ab8500_fg_coulomb_counter()
520 dev_err(di->dev, "%s Enabling coulomb counter failed\n", __func__); in ab8500_fg_coulomb_counter()
521 mutex_unlock(&di->cc_lock); in ab8500_fg_coulomb_counter()
533 int ab8500_fg_inst_curr_start(struct ab8500_fg *di) in ab8500_fg_inst_curr_start() argument
538 mutex_lock(&di->cc_lock); in ab8500_fg_inst_curr_start()
540 di->nbr_cceoc_irq_cnt = 0; in ab8500_fg_inst_curr_start()
541 ret = abx500_get_register_interruptible(di->dev, AB8500_RTC, in ab8500_fg_inst_curr_start()
547 dev_dbg(di->dev, "%s Enable FG\n", __func__); in ab8500_fg_inst_curr_start()
548 di->turn_off_fg = true; in ab8500_fg_inst_curr_start()
551 ret = abx500_set_register_interruptible(di->dev, in ab8500_fg_inst_curr_start()
558 ret = abx500_set_register_interruptible(di->dev, AB8500_RTC, in ab8500_fg_inst_curr_start()
564 di->turn_off_fg = false; in ab8500_fg_inst_curr_start()
568 reinit_completion(&di->ab8500_fg_started); in ab8500_fg_inst_curr_start()
569 reinit_completion(&di->ab8500_fg_complete); in ab8500_fg_inst_curr_start()
570 enable_irq(di->irq); in ab8500_fg_inst_curr_start()
575 mutex_unlock(&di->cc_lock); in ab8500_fg_inst_curr_start()
585 int ab8500_fg_inst_curr_started(struct ab8500_fg *di) in ab8500_fg_inst_curr_started() argument
587 return completion_done(&di->ab8500_fg_started); in ab8500_fg_inst_curr_started()
596 int ab8500_fg_inst_curr_done(struct ab8500_fg *di) in ab8500_fg_inst_curr_done() argument
598 return completion_done(&di->ab8500_fg_complete); in ab8500_fg_inst_curr_done()
610 int ab8500_fg_inst_curr_finalize(struct ab8500_fg *di, int *res) in ab8500_fg_inst_curr_finalize() argument
617 if (!completion_done(&di->ab8500_fg_complete)) { in ab8500_fg_inst_curr_finalize()
619 &di->ab8500_fg_complete, in ab8500_fg_inst_curr_finalize()
621 dev_dbg(di->dev, "Finalize time: %d ms\n", in ab8500_fg_inst_curr_finalize()
625 disable_irq(di->irq); in ab8500_fg_inst_curr_finalize()
626 di->nbr_cceoc_irq_cnt = 0; in ab8500_fg_inst_curr_finalize()
627 dev_err(di->dev, "completion timed out [%d]\n", in ab8500_fg_inst_curr_finalize()
633 disable_irq(di->irq); in ab8500_fg_inst_curr_finalize()
634 di->nbr_cceoc_irq_cnt = 0; in ab8500_fg_inst_curr_finalize()
636 ret = abx500_mask_and_set_register_interruptible(di->dev, in ab8500_fg_inst_curr_finalize()
644 ret = abx500_get_register_interruptible(di->dev, AB8500_GAS_GAUGE, in ab8500_fg_inst_curr_finalize()
649 ret = abx500_get_register_interruptible(di->dev, AB8500_GAS_GAUGE, in ab8500_fg_inst_curr_finalize()
673 (1000 * di->bm->fg_res); in ab8500_fg_inst_curr_finalize()
675 if (di->turn_off_fg) { in ab8500_fg_inst_curr_finalize()
676 dev_dbg(di->dev, "%s Disable FG\n", __func__); in ab8500_fg_inst_curr_finalize()
679 ret = abx500_set_register_interruptible(di->dev, in ab8500_fg_inst_curr_finalize()
685 ret = abx500_set_register_interruptible(di->dev, AB8500_RTC, in ab8500_fg_inst_curr_finalize()
690 mutex_unlock(&di->cc_lock); in ab8500_fg_inst_curr_finalize()
695 mutex_unlock(&di->cc_lock); in ab8500_fg_inst_curr_finalize()
706 int ab8500_fg_inst_curr_blocking(struct ab8500_fg *di) in ab8500_fg_inst_curr_blocking() argument
712 ret = ab8500_fg_inst_curr_start(di); in ab8500_fg_inst_curr_blocking()
714 dev_err(di->dev, "Failed to initialize fg_inst\n"); in ab8500_fg_inst_curr_blocking()
719 if (!completion_done(&di->ab8500_fg_started)) { in ab8500_fg_inst_curr_blocking()
721 &di->ab8500_fg_started, in ab8500_fg_inst_curr_blocking()
723 dev_dbg(di->dev, "Start time: %d ms\n", in ab8500_fg_inst_curr_blocking()
727 dev_err(di->dev, "completion timed out [%d]\n", in ab8500_fg_inst_curr_blocking()
733 ret = ab8500_fg_inst_curr_finalize(di, &res); in ab8500_fg_inst_curr_blocking()
735 dev_err(di->dev, "Failed to finalize fg_inst\n"); in ab8500_fg_inst_curr_blocking()
739 dev_dbg(di->dev, "%s instant current: %d", __func__, res); in ab8500_fg_inst_curr_blocking()
742 disable_irq(di->irq); in ab8500_fg_inst_curr_blocking()
743 mutex_unlock(&di->cc_lock); in ab8500_fg_inst_curr_blocking()
760 struct ab8500_fg *di = container_of(work, in ab8500_fg_acc_cur_work() local
763 mutex_lock(&di->cc_lock); in ab8500_fg_acc_cur_work()
764 ret = abx500_set_register_interruptible(di->dev, AB8500_GAS_GAUGE, in ab8500_fg_acc_cur_work()
769 ret = abx500_get_register_interruptible(di->dev, AB8500_GAS_GAUGE, in ab8500_fg_acc_cur_work()
774 ret = abx500_get_register_interruptible(di->dev, AB8500_GAS_GAUGE, in ab8500_fg_acc_cur_work()
779 ret = abx500_get_register_interruptible(di->dev, AB8500_GAS_GAUGE, in ab8500_fg_acc_cur_work()
796 di->accu_charge = (val * QLSB_NANO_AMP_HOURS_X10) / in ab8500_fg_acc_cur_work()
797 (100 * di->bm->fg_res); in ab8500_fg_acc_cur_work()
805 di->avg_curr = (val * QLSB_NANO_AMP_HOURS_X10 * 36) / in ab8500_fg_acc_cur_work()
806 (1000 * di->bm->fg_res * (di->fg_samples / 4)); in ab8500_fg_acc_cur_work()
808 di->flags.conv_done = true; in ab8500_fg_acc_cur_work()
810 mutex_unlock(&di->cc_lock); in ab8500_fg_acc_cur_work()
812 queue_work(di->fg_wq, &di->fg_work); in ab8500_fg_acc_cur_work()
814 dev_dbg(di->dev, "fg_res: %d, fg_samples: %d, gasg: %d, accu_charge: %d \n", in ab8500_fg_acc_cur_work()
815 di->bm->fg_res, di->fg_samples, val, di->accu_charge); in ab8500_fg_acc_cur_work()
818 dev_err(di->dev, in ab8500_fg_acc_cur_work()
820 mutex_unlock(&di->cc_lock); in ab8500_fg_acc_cur_work()
821 queue_work(di->fg_wq, &di->fg_work); in ab8500_fg_acc_cur_work()
830 static int ab8500_fg_bat_voltage(struct ab8500_fg *di) in ab8500_fg_bat_voltage() argument
835 ret = iio_read_channel_processed(di->main_bat_v, &vbat); in ab8500_fg_bat_voltage()
837 dev_err(di->dev, in ab8500_fg_bat_voltage()
854 static int ab8500_fg_volt_to_capacity(struct ab8500_fg *di, int voltage) in ab8500_fg_volt_to_capacity() argument
860 tbl = di->bm->bat_type[di->bm->batt_id].v_to_cap_tbl, in ab8500_fg_volt_to_capacity()
861 tbl_size = di->bm->bat_type[di->bm->batt_id].n_v_cap_tbl_elements; in ab8500_fg_volt_to_capacity()
880 dev_dbg(di->dev, "%s Vbat: %d, Cap: %d per mille", in ab8500_fg_volt_to_capacity()
893 static int ab8500_fg_uncomp_volt_to_capacity(struct ab8500_fg *di) in ab8500_fg_uncomp_volt_to_capacity() argument
895 di->vbat = ab8500_fg_bat_voltage(di); in ab8500_fg_uncomp_volt_to_capacity()
896 return ab8500_fg_volt_to_capacity(di, di->vbat); in ab8500_fg_uncomp_volt_to_capacity()
906 static int ab8500_fg_battery_resistance(struct ab8500_fg *di) in ab8500_fg_battery_resistance() argument
912 tbl = di->bm->bat_type[di->bm->batt_id].batres_tbl; in ab8500_fg_battery_resistance()
913 tbl_size = di->bm->bat_type[di->bm->batt_id].n_batres_tbl_elements; in ab8500_fg_battery_resistance()
916 if (di->bat_temp / 10 > tbl[i].temp) in ab8500_fg_battery_resistance()
921 resist = interpolate(di->bat_temp / 10, in ab8500_fg_battery_resistance()
932 dev_dbg(di->dev, "%s Temp: %d battery internal resistance: %d" in ab8500_fg_battery_resistance()
934 __func__, di->bat_temp, resist, di->bm->fg_res / 10, in ab8500_fg_battery_resistance()
935 (di->bm->fg_res / 10) + resist); in ab8500_fg_battery_resistance()
938 resist += di->bm->fg_res / 10; in ab8500_fg_battery_resistance()
950 static int ab8500_fg_load_comp_volt_to_capacity(struct ab8500_fg *di) in ab8500_fg_load_comp_volt_to_capacity() argument
956 ab8500_fg_inst_curr_start(di); in ab8500_fg_load_comp_volt_to_capacity()
959 vbat += ab8500_fg_bat_voltage(di); in ab8500_fg_load_comp_volt_to_capacity()
962 } while (!ab8500_fg_inst_curr_done(di)); in ab8500_fg_load_comp_volt_to_capacity()
964 ab8500_fg_inst_curr_finalize(di, &di->inst_curr); in ab8500_fg_load_comp_volt_to_capacity()
966 di->vbat = vbat / i; in ab8500_fg_load_comp_volt_to_capacity()
967 res = ab8500_fg_battery_resistance(di); in ab8500_fg_load_comp_volt_to_capacity()
970 vbat_comp = di->vbat - (di->inst_curr * res) / 1000; in ab8500_fg_load_comp_volt_to_capacity()
972 dev_dbg(di->dev, "%s Measured Vbat: %dmV,Compensated Vbat %dmV, " in ab8500_fg_load_comp_volt_to_capacity()
974 __func__, di->vbat, vbat_comp, res, di->inst_curr, i); in ab8500_fg_load_comp_volt_to_capacity()
976 return ab8500_fg_volt_to_capacity(di, vbat_comp); in ab8500_fg_load_comp_volt_to_capacity()
986 static int ab8500_fg_convert_mah_to_permille(struct ab8500_fg *di, int cap_mah) in ab8500_fg_convert_mah_to_permille() argument
988 return (cap_mah * 1000) / di->bat_cap.max_mah_design; in ab8500_fg_convert_mah_to_permille()
998 static int ab8500_fg_convert_permille_to_mah(struct ab8500_fg *di, int cap_pm) in ab8500_fg_convert_permille_to_mah() argument
1000 return cap_pm * di->bat_cap.max_mah_design / 1000; in ab8500_fg_convert_permille_to_mah()
1010 static int ab8500_fg_convert_mah_to_uwh(struct ab8500_fg *di, int cap_mah) in ab8500_fg_convert_mah_to_uwh() argument
1015 div_res = ((u64) cap_mah) * ((u64) di->vbat_nom); in ab8500_fg_convert_mah_to_uwh()
1032 static int ab8500_fg_calc_cap_charging(struct ab8500_fg *di) in ab8500_fg_calc_cap_charging() argument
1034 dev_dbg(di->dev, "%s cap_mah %d accu_charge %d\n", in ab8500_fg_calc_cap_charging()
1036 di->bat_cap.mah, in ab8500_fg_calc_cap_charging()
1037 di->accu_charge); in ab8500_fg_calc_cap_charging()
1040 if (di->bat_cap.mah + di->accu_charge > 0) in ab8500_fg_calc_cap_charging()
1041 di->bat_cap.mah += di->accu_charge; in ab8500_fg_calc_cap_charging()
1043 di->bat_cap.mah = 0; in ab8500_fg_calc_cap_charging()
1048 if (di->bat_cap.mah >= di->bat_cap.max_mah_design || in ab8500_fg_calc_cap_charging()
1049 di->flags.force_full) { in ab8500_fg_calc_cap_charging()
1050 di->bat_cap.mah = di->bat_cap.max_mah_design; in ab8500_fg_calc_cap_charging()
1053 ab8500_fg_fill_cap_sample(di, di->bat_cap.mah); in ab8500_fg_calc_cap_charging()
1054 di->bat_cap.permille = in ab8500_fg_calc_cap_charging()
1055 ab8500_fg_convert_mah_to_permille(di, di->bat_cap.mah); in ab8500_fg_calc_cap_charging()
1058 di->vbat = ab8500_fg_bat_voltage(di); in ab8500_fg_calc_cap_charging()
1059 di->inst_curr = ab8500_fg_inst_curr_blocking(di); in ab8500_fg_calc_cap_charging()
1061 return di->bat_cap.mah; in ab8500_fg_calc_cap_charging()
1073 static int ab8500_fg_calc_cap_discharge_voltage(struct ab8500_fg *di, bool comp) in ab8500_fg_calc_cap_discharge_voltage() argument
1078 permille = ab8500_fg_load_comp_volt_to_capacity(di); in ab8500_fg_calc_cap_discharge_voltage()
1080 permille = ab8500_fg_uncomp_volt_to_capacity(di); in ab8500_fg_calc_cap_discharge_voltage()
1082 mah = ab8500_fg_convert_permille_to_mah(di, permille); in ab8500_fg_calc_cap_discharge_voltage()
1084 di->bat_cap.mah = ab8500_fg_add_cap_sample(di, mah); in ab8500_fg_calc_cap_discharge_voltage()
1085 di->bat_cap.permille = in ab8500_fg_calc_cap_discharge_voltage()
1086 ab8500_fg_convert_mah_to_permille(di, di->bat_cap.mah); in ab8500_fg_calc_cap_discharge_voltage()
1088 return di->bat_cap.mah; in ab8500_fg_calc_cap_discharge_voltage()
1099 static int ab8500_fg_calc_cap_discharge_fg(struct ab8500_fg *di) in ab8500_fg_calc_cap_discharge_fg() argument
1103 dev_dbg(di->dev, "%s cap_mah %d accu_charge %d\n", in ab8500_fg_calc_cap_discharge_fg()
1105 di->bat_cap.mah, in ab8500_fg_calc_cap_discharge_fg()
1106 di->accu_charge); in ab8500_fg_calc_cap_discharge_fg()
1109 if (di->bat_cap.mah + di->accu_charge > 0) in ab8500_fg_calc_cap_discharge_fg()
1110 di->bat_cap.mah += di->accu_charge; in ab8500_fg_calc_cap_discharge_fg()
1112 di->bat_cap.mah = 0; in ab8500_fg_calc_cap_discharge_fg()
1114 if (di->bat_cap.mah >= di->bat_cap.max_mah_design) in ab8500_fg_calc_cap_discharge_fg()
1115 di->bat_cap.mah = di->bat_cap.max_mah_design; in ab8500_fg_calc_cap_discharge_fg()
1121 permille = ab8500_fg_convert_mah_to_permille(di, di->bat_cap.mah); in ab8500_fg_calc_cap_discharge_fg()
1122 permille_volt = ab8500_fg_uncomp_volt_to_capacity(di); in ab8500_fg_calc_cap_discharge_fg()
1125 di->bat_cap.permille = permille_volt; in ab8500_fg_calc_cap_discharge_fg()
1126 di->bat_cap.mah = ab8500_fg_convert_permille_to_mah(di, in ab8500_fg_calc_cap_discharge_fg()
1127 di->bat_cap.permille); in ab8500_fg_calc_cap_discharge_fg()
1129 dev_dbg(di->dev, "%s voltage based: perm %d perm_volt %d\n", in ab8500_fg_calc_cap_discharge_fg()
1134 ab8500_fg_fill_cap_sample(di, di->bat_cap.mah); in ab8500_fg_calc_cap_discharge_fg()
1136 ab8500_fg_fill_cap_sample(di, di->bat_cap.mah); in ab8500_fg_calc_cap_discharge_fg()
1137 di->bat_cap.permille = in ab8500_fg_calc_cap_discharge_fg()
1138 ab8500_fg_convert_mah_to_permille(di, di->bat_cap.mah); in ab8500_fg_calc_cap_discharge_fg()
1141 return di->bat_cap.mah; in ab8500_fg_calc_cap_discharge_fg()
1150 static int ab8500_fg_capacity_level(struct ab8500_fg *di) in ab8500_fg_capacity_level() argument
1154 percent = DIV_ROUND_CLOSEST(di->bat_cap.permille, 10); in ab8500_fg_capacity_level()
1156 if (percent <= di->bm->cap_levels->critical || in ab8500_fg_capacity_level()
1157 di->flags.low_bat) in ab8500_fg_capacity_level()
1159 else if (percent <= di->bm->cap_levels->low) in ab8500_fg_capacity_level()
1161 else if (percent <= di->bm->cap_levels->normal) in ab8500_fg_capacity_level()
1163 else if (percent <= di->bm->cap_levels->high) in ab8500_fg_capacity_level()
1179 static int ab8500_fg_calculate_scaled_capacity(struct ab8500_fg *di) in ab8500_fg_calculate_scaled_capacity() argument
1181 struct ab8500_fg_cap_scaling *cs = &di->bat_cap.cap_scale; in ab8500_fg_calculate_scaled_capacity()
1182 int capacity = di->bat_cap.prev_percent; in ab8500_fg_calculate_scaled_capacity()
1191 if (di->flags.fully_charged) { in ab8500_fg_calculate_scaled_capacity()
1194 max(capacity, di->bm->fg_params->maint_thres); in ab8500_fg_calculate_scaled_capacity()
1195 dev_dbg(di->dev, "Scale cap with %d/%d\n", in ab8500_fg_calculate_scaled_capacity()
1203 DIV_ROUND_CLOSEST(di->bat_cap.prev_percent * in ab8500_fg_calculate_scaled_capacity()
1207 if (di->flags.charging) { in ab8500_fg_calculate_scaled_capacity()
1210 dev_dbg(di->dev, "Cap to stop scale lowered %d%%\n", in ab8500_fg_calculate_scaled_capacity()
1212 } else if (!di->flags.fully_charged) { in ab8500_fg_calculate_scaled_capacity()
1213 if (di->bat_cap.prev_percent >= in ab8500_fg_calculate_scaled_capacity()
1215 dev_dbg(di->dev, "Disabling scaled capacity\n"); in ab8500_fg_calculate_scaled_capacity()
1217 capacity = di->bat_cap.prev_percent; in ab8500_fg_calculate_scaled_capacity()
1219 dev_dbg(di->dev, in ab8500_fg_calculate_scaled_capacity()
1237 static void ab8500_fg_update_cap_scalers(struct ab8500_fg *di) in ab8500_fg_update_cap_scalers() argument
1239 struct ab8500_fg_cap_scaling *cs = &di->bat_cap.cap_scale; in ab8500_fg_update_cap_scalers()
1243 if (di->flags.charging) { in ab8500_fg_update_cap_scalers()
1244 di->bat_cap.cap_scale.disable_cap_level = in ab8500_fg_update_cap_scalers()
1245 di->bat_cap.cap_scale.scaled_cap; in ab8500_fg_update_cap_scalers()
1246 dev_dbg(di->dev, "Cap to stop scale at charge %d%%\n", in ab8500_fg_update_cap_scalers()
1247 di->bat_cap.cap_scale.disable_cap_level); in ab8500_fg_update_cap_scalers()
1251 cs->cap_to_scale[1] = di->bat_cap.prev_percent; in ab8500_fg_update_cap_scalers()
1255 max(di->bat_cap.prev_percent, in ab8500_fg_update_cap_scalers()
1256 di->bm->fg_params->maint_thres); in ab8500_fg_update_cap_scalers()
1259 dev_dbg(di->dev, "Cap to scale at discharge %d/%d\n", in ab8500_fg_update_cap_scalers()
1272 static void ab8500_fg_check_capacity_limits(struct ab8500_fg *di, bool init) in ab8500_fg_check_capacity_limits() argument
1275 int percent = DIV_ROUND_CLOSEST(di->bat_cap.permille, 10); in ab8500_fg_check_capacity_limits()
1277 di->bat_cap.level = ab8500_fg_capacity_level(di); in ab8500_fg_check_capacity_limits()
1279 if (di->bat_cap.level != di->bat_cap.prev_level) { in ab8500_fg_check_capacity_limits()
1284 if (!(!di->flags.charging && di->bat_cap.level > in ab8500_fg_check_capacity_limits()
1285 di->bat_cap.prev_level) || init) { in ab8500_fg_check_capacity_limits()
1286 dev_dbg(di->dev, "level changed from %d to %d\n", in ab8500_fg_check_capacity_limits()
1287 di->bat_cap.prev_level, in ab8500_fg_check_capacity_limits()
1288 di->bat_cap.level); in ab8500_fg_check_capacity_limits()
1289 di->bat_cap.prev_level = di->bat_cap.level; in ab8500_fg_check_capacity_limits()
1292 dev_dbg(di->dev, "level not allowed to go up " 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()
1303 if (di->flags.low_bat) { in ab8500_fg_check_capacity_limits()
1304 dev_dbg(di->dev, "Battery low, set capacity to 0\n"); in ab8500_fg_check_capacity_limits()
1305 di->bat_cap.prev_percent = 0; in ab8500_fg_check_capacity_limits()
1306 di->bat_cap.permille = 0; in ab8500_fg_check_capacity_limits()
1308 di->bat_cap.prev_mah = 0; in ab8500_fg_check_capacity_limits()
1309 di->bat_cap.mah = 0; in ab8500_fg_check_capacity_limits()
1311 } else if (di->flags.fully_charged) { in ab8500_fg_check_capacity_limits()
1316 if (di->flags.force_full) { in ab8500_fg_check_capacity_limits()
1317 di->bat_cap.prev_percent = percent; in ab8500_fg_check_capacity_limits()
1318 di->bat_cap.prev_mah = di->bat_cap.mah; in ab8500_fg_check_capacity_limits()
1322 if (!di->bat_cap.cap_scale.enable && in ab8500_fg_check_capacity_limits()
1323 di->bm->capacity_scaling) { in ab8500_fg_check_capacity_limits()
1324 di->bat_cap.cap_scale.enable = true; in ab8500_fg_check_capacity_limits()
1325 di->bat_cap.cap_scale.cap_to_scale[0] = 100; in ab8500_fg_check_capacity_limits()
1326 di->bat_cap.cap_scale.cap_to_scale[1] = in ab8500_fg_check_capacity_limits()
1327 di->bat_cap.prev_percent; in ab8500_fg_check_capacity_limits()
1328 di->bat_cap.cap_scale.disable_cap_level = 100; in ab8500_fg_check_capacity_limits()
1330 } else if (di->bat_cap.prev_percent != percent) { in ab8500_fg_check_capacity_limits()
1331 dev_dbg(di->dev, in ab8500_fg_check_capacity_limits()
1335 di->bat_cap.prev_percent = percent; in ab8500_fg_check_capacity_limits()
1336 di->bat_cap.prev_mah = di->bat_cap.mah; in ab8500_fg_check_capacity_limits()
1340 } else if (di->bat_cap.prev_percent != percent) { in ab8500_fg_check_capacity_limits()
1347 di->bat_cap.prev_percent = 1; in ab8500_fg_check_capacity_limits()
1351 } else if (!(!di->flags.charging && in ab8500_fg_check_capacity_limits()
1352 percent > di->bat_cap.prev_percent) || init) { in ab8500_fg_check_capacity_limits()
1357 dev_dbg(di->dev, in ab8500_fg_check_capacity_limits()
1359 di->bat_cap.prev_percent, in ab8500_fg_check_capacity_limits()
1361 di->bat_cap.permille); in ab8500_fg_check_capacity_limits()
1362 di->bat_cap.prev_percent = percent; in ab8500_fg_check_capacity_limits()
1363 di->bat_cap.prev_mah = di->bat_cap.mah; in ab8500_fg_check_capacity_limits()
1367 dev_dbg(di->dev, "capacity not allowed to go up since " in ab8500_fg_check_capacity_limits()
1369 di->bat_cap.prev_percent, in ab8500_fg_check_capacity_limits()
1371 di->bat_cap.permille); in ab8500_fg_check_capacity_limits()
1376 if (di->bm->capacity_scaling) { in ab8500_fg_check_capacity_limits()
1377 di->bat_cap.cap_scale.scaled_cap = in ab8500_fg_check_capacity_limits()
1378 ab8500_fg_calculate_scaled_capacity(di); in ab8500_fg_check_capacity_limits()
1380 dev_info(di->dev, "capacity=%d (%d)\n", in ab8500_fg_check_capacity_limits()
1381 di->bat_cap.prev_percent, in ab8500_fg_check_capacity_limits()
1382 di->bat_cap.cap_scale.scaled_cap); in ab8500_fg_check_capacity_limits()
1384 power_supply_changed(di->fg_psy); in ab8500_fg_check_capacity_limits()
1385 if (di->flags.fully_charged && di->flags.force_full) { in ab8500_fg_check_capacity_limits()
1386 dev_dbg(di->dev, "Battery full, notifying.\n"); in ab8500_fg_check_capacity_limits()
1387 di->flags.force_full = false; in ab8500_fg_check_capacity_limits()
1388 sysfs_notify(&di->fg_kobject, NULL, "charge_full"); in ab8500_fg_check_capacity_limits()
1390 sysfs_notify(&di->fg_kobject, NULL, "charge_now"); in ab8500_fg_check_capacity_limits()
1394 static void ab8500_fg_charge_state_to(struct ab8500_fg *di, in ab8500_fg_charge_state_to() argument
1397 dev_dbg(di->dev, "Charge state from %d [%s] to %d [%s]\n", in ab8500_fg_charge_state_to()
1398 di->charge_state, in ab8500_fg_charge_state_to()
1399 charge_state[di->charge_state], in ab8500_fg_charge_state_to()
1403 di->charge_state = new_state; in ab8500_fg_charge_state_to()
1406 static void ab8500_fg_discharge_state_to(struct ab8500_fg *di, in ab8500_fg_discharge_state_to() argument
1409 dev_dbg(di->dev, "Discharge state from %d [%s] to %d [%s]\n", in ab8500_fg_discharge_state_to()
1410 di->discharge_state, in ab8500_fg_discharge_state_to()
1411 discharge_state[di->discharge_state], in ab8500_fg_discharge_state_to()
1415 di->discharge_state = new_state; in ab8500_fg_discharge_state_to()
1424 static void ab8500_fg_algorithm_charging(struct ab8500_fg *di) in ab8500_fg_algorithm_charging() argument
1430 if (di->discharge_state != AB8500_FG_DISCHARGE_INIT_RECOVERY) in ab8500_fg_algorithm_charging()
1431 ab8500_fg_discharge_state_to(di, in ab8500_fg_algorithm_charging()
1434 switch (di->charge_state) { in ab8500_fg_algorithm_charging()
1436 di->fg_samples = SEC_TO_SAMPLE( in ab8500_fg_algorithm_charging()
1437 di->bm->fg_params->accu_charging); in ab8500_fg_algorithm_charging()
1439 ab8500_fg_coulomb_counter(di, true); in ab8500_fg_algorithm_charging()
1440 ab8500_fg_charge_state_to(di, AB8500_FG_CHARGE_READOUT); in ab8500_fg_algorithm_charging()
1448 mutex_lock(&di->cc_lock); in ab8500_fg_algorithm_charging()
1449 if (!di->flags.conv_done && !di->flags.force_full) { in ab8500_fg_algorithm_charging()
1451 mutex_unlock(&di->cc_lock); in ab8500_fg_algorithm_charging()
1452 dev_dbg(di->dev, "%s CC conv not done\n", in ab8500_fg_algorithm_charging()
1457 di->flags.conv_done = false; in ab8500_fg_algorithm_charging()
1458 mutex_unlock(&di->cc_lock); in ab8500_fg_algorithm_charging()
1460 ab8500_fg_calc_cap_charging(di); in ab8500_fg_algorithm_charging()
1469 ab8500_fg_check_capacity_limits(di, false); in ab8500_fg_algorithm_charging()
1472 static void force_capacity(struct ab8500_fg *di) in force_capacity() argument
1476 ab8500_fg_clear_cap_samples(di); in force_capacity()
1477 cap = di->bat_cap.user_mah; in force_capacity()
1478 if (cap > di->bat_cap.max_mah_design) { in force_capacity()
1479 dev_dbg(di->dev, "Remaining cap %d can't be bigger than total" in force_capacity()
1480 " %d\n", cap, di->bat_cap.max_mah_design); in force_capacity()
1481 cap = di->bat_cap.max_mah_design; in force_capacity()
1483 ab8500_fg_fill_cap_sample(di, di->bat_cap.user_mah); in force_capacity()
1484 di->bat_cap.permille = ab8500_fg_convert_mah_to_permille(di, cap); in force_capacity()
1485 di->bat_cap.mah = cap; in force_capacity()
1486 ab8500_fg_check_capacity_limits(di, true); in force_capacity()
1489 static bool check_sysfs_capacity(struct ab8500_fg *di) in check_sysfs_capacity() argument
1494 cap = di->bat_cap.user_mah; in check_sysfs_capacity()
1496 cap_permille = ab8500_fg_convert_mah_to_permille(di, in check_sysfs_capacity()
1497 di->bat_cap.user_mah); in check_sysfs_capacity()
1499 lower = di->bat_cap.permille - di->bm->fg_params->user_cap_limit * 10; in check_sysfs_capacity()
1500 upper = di->bat_cap.permille + di->bm->fg_params->user_cap_limit * 10; in check_sysfs_capacity()
1508 dev_dbg(di->dev, "Capacity limits:" in check_sysfs_capacity()
1510 lower, cap_permille, upper, cap, di->bat_cap.mah); in check_sysfs_capacity()
1514 dev_dbg(di->dev, "OK! Using users cap %d uAh now\n", cap); in check_sysfs_capacity()
1515 force_capacity(di); in check_sysfs_capacity()
1518 dev_dbg(di->dev, "Capacity from user out of limits, ignoring"); in check_sysfs_capacity()
1528 static void ab8500_fg_algorithm_discharging(struct ab8500_fg *di) in ab8500_fg_algorithm_discharging() argument
1533 if (di->charge_state != AB8500_FG_CHARGE_INIT) in ab8500_fg_algorithm_discharging()
1534 ab8500_fg_charge_state_to(di, AB8500_FG_CHARGE_INIT); in ab8500_fg_algorithm_discharging()
1536 switch (di->discharge_state) { in ab8500_fg_algorithm_discharging()
1539 di->init_cnt = 0; in ab8500_fg_algorithm_discharging()
1540 di->fg_samples = SEC_TO_SAMPLE(di->bm->fg_params->init_timer); in ab8500_fg_algorithm_discharging()
1541 ab8500_fg_coulomb_counter(di, true); in ab8500_fg_algorithm_discharging()
1542 ab8500_fg_discharge_state_to(di, in ab8500_fg_algorithm_discharging()
1553 sleep_time = di->bm->fg_params->init_timer; in ab8500_fg_algorithm_discharging()
1556 if (di->init_cnt > di->bm->fg_params->init_discard_time) { in ab8500_fg_algorithm_discharging()
1557 ab8500_fg_calc_cap_discharge_voltage(di, true); in ab8500_fg_algorithm_discharging()
1559 ab8500_fg_check_capacity_limits(di, true); in ab8500_fg_algorithm_discharging()
1562 di->init_cnt += sleep_time; in ab8500_fg_algorithm_discharging()
1563 if (di->init_cnt > di->bm->fg_params->init_total_time) in ab8500_fg_algorithm_discharging()
1564 ab8500_fg_discharge_state_to(di, in ab8500_fg_algorithm_discharging()
1570 di->recovery_cnt = 0; in ab8500_fg_algorithm_discharging()
1571 di->recovery_needed = true; in ab8500_fg_algorithm_discharging()
1572 ab8500_fg_discharge_state_to(di, in ab8500_fg_algorithm_discharging()
1578 sleep_time = di->bm->fg_params->recovery_sleep_timer; in ab8500_fg_algorithm_discharging()
1586 di->inst_curr = ab8500_fg_inst_curr_blocking(di); in ab8500_fg_algorithm_discharging()
1588 if (ab8500_fg_is_low_curr(di, di->inst_curr)) { in ab8500_fg_algorithm_discharging()
1589 if (di->recovery_cnt > in ab8500_fg_algorithm_discharging()
1590 di->bm->fg_params->recovery_total_time) { in ab8500_fg_algorithm_discharging()
1591 di->fg_samples = SEC_TO_SAMPLE( in ab8500_fg_algorithm_discharging()
1592 di->bm->fg_params->accu_high_curr); in ab8500_fg_algorithm_discharging()
1593 ab8500_fg_coulomb_counter(di, true); in ab8500_fg_algorithm_discharging()
1594 ab8500_fg_discharge_state_to(di, in ab8500_fg_algorithm_discharging()
1596 di->recovery_needed = false; in ab8500_fg_algorithm_discharging()
1598 queue_delayed_work(di->fg_wq, in ab8500_fg_algorithm_discharging()
1599 &di->fg_periodic_work, in ab8500_fg_algorithm_discharging()
1602 di->recovery_cnt += sleep_time; in ab8500_fg_algorithm_discharging()
1604 di->fg_samples = SEC_TO_SAMPLE( in ab8500_fg_algorithm_discharging()
1605 di->bm->fg_params->accu_high_curr); in ab8500_fg_algorithm_discharging()
1606 ab8500_fg_coulomb_counter(di, true); in ab8500_fg_algorithm_discharging()
1607 ab8500_fg_discharge_state_to(di, in ab8500_fg_algorithm_discharging()
1613 di->fg_samples = SEC_TO_SAMPLE( in ab8500_fg_algorithm_discharging()
1614 di->bm->fg_params->accu_high_curr); in ab8500_fg_algorithm_discharging()
1615 ab8500_fg_coulomb_counter(di, true); in ab8500_fg_algorithm_discharging()
1616 ab8500_fg_discharge_state_to(di, in ab8500_fg_algorithm_discharging()
1621 di->inst_curr = ab8500_fg_inst_curr_blocking(di); in ab8500_fg_algorithm_discharging()
1623 if (ab8500_fg_is_low_curr(di, di->inst_curr)) { in ab8500_fg_algorithm_discharging()
1625 if (di->high_curr_mode) { in ab8500_fg_algorithm_discharging()
1626 di->high_curr_mode = false; in ab8500_fg_algorithm_discharging()
1627 di->high_curr_cnt = 0; in ab8500_fg_algorithm_discharging()
1630 if (di->recovery_needed) { in ab8500_fg_algorithm_discharging()
1631 ab8500_fg_discharge_state_to(di, in ab8500_fg_algorithm_discharging()
1634 queue_delayed_work(di->fg_wq, in ab8500_fg_algorithm_discharging()
1635 &di->fg_periodic_work, 0); in ab8500_fg_algorithm_discharging()
1640 ab8500_fg_calc_cap_discharge_voltage(di, true); in ab8500_fg_algorithm_discharging()
1642 mutex_lock(&di->cc_lock); in ab8500_fg_algorithm_discharging()
1643 if (!di->flags.conv_done) { in ab8500_fg_algorithm_discharging()
1645 mutex_unlock(&di->cc_lock); in ab8500_fg_algorithm_discharging()
1646 dev_dbg(di->dev, "%s CC conv not done\n", in ab8500_fg_algorithm_discharging()
1651 di->flags.conv_done = false; in ab8500_fg_algorithm_discharging()
1652 mutex_unlock(&di->cc_lock); in ab8500_fg_algorithm_discharging()
1655 if (!di->high_curr_mode) { in ab8500_fg_algorithm_discharging()
1656 di->high_curr_mode = true; in ab8500_fg_algorithm_discharging()
1657 di->high_curr_cnt = 0; in ab8500_fg_algorithm_discharging()
1660 di->high_curr_cnt += in ab8500_fg_algorithm_discharging()
1661 di->bm->fg_params->accu_high_curr; in ab8500_fg_algorithm_discharging()
1662 if (di->high_curr_cnt > in ab8500_fg_algorithm_discharging()
1663 di->bm->fg_params->high_curr_time) in ab8500_fg_algorithm_discharging()
1664 di->recovery_needed = true; in ab8500_fg_algorithm_discharging()
1666 ab8500_fg_calc_cap_discharge_fg(di); in ab8500_fg_algorithm_discharging()
1669 ab8500_fg_check_capacity_limits(di, false); in ab8500_fg_algorithm_discharging()
1674 ab8500_fg_calc_cap_discharge_voltage(di, true); in ab8500_fg_algorithm_discharging()
1676 di->fg_samples = SEC_TO_SAMPLE( in ab8500_fg_algorithm_discharging()
1677 di->bm->fg_params->accu_high_curr); in ab8500_fg_algorithm_discharging()
1678 ab8500_fg_coulomb_counter(di, true); in ab8500_fg_algorithm_discharging()
1679 ab8500_fg_discharge_state_to(di, in ab8500_fg_algorithm_discharging()
1682 ab8500_fg_check_capacity_limits(di, false); in ab8500_fg_algorithm_discharging()
1696 static void ab8500_fg_algorithm_calibrate(struct ab8500_fg *di) in ab8500_fg_algorithm_calibrate() argument
1700 switch (di->calib_state) { in ab8500_fg_algorithm_calibrate()
1702 dev_dbg(di->dev, "Calibration ongoing...\n"); in ab8500_fg_algorithm_calibrate()
1704 ret = abx500_mask_and_set_register_interruptible(di->dev, in ab8500_fg_algorithm_calibrate()
1710 ret = abx500_mask_and_set_register_interruptible(di->dev, in ab8500_fg_algorithm_calibrate()
1715 di->calib_state = AB8500_FG_CALIB_WAIT; in ab8500_fg_algorithm_calibrate()
1718 ret = abx500_mask_and_set_register_interruptible(di->dev, in ab8500_fg_algorithm_calibrate()
1723 di->flags.calibrate = false; in ab8500_fg_algorithm_calibrate()
1724 dev_dbg(di->dev, "Calibration done...\n"); in ab8500_fg_algorithm_calibrate()
1725 queue_delayed_work(di->fg_wq, &di->fg_periodic_work, 0); in ab8500_fg_algorithm_calibrate()
1728 dev_dbg(di->dev, "Calibration WFI\n"); in ab8500_fg_algorithm_calibrate()
1735 dev_err(di->dev, "failed to calibrate the CC\n"); in ab8500_fg_algorithm_calibrate()
1736 di->flags.calibrate = false; in ab8500_fg_algorithm_calibrate()
1737 di->calib_state = AB8500_FG_CALIB_INIT; in ab8500_fg_algorithm_calibrate()
1738 queue_delayed_work(di->fg_wq, &di->fg_periodic_work, 0); in ab8500_fg_algorithm_calibrate()
1747 static void ab8500_fg_algorithm(struct ab8500_fg *di) in ab8500_fg_algorithm() argument
1749 if (di->flags.calibrate) in ab8500_fg_algorithm()
1750 ab8500_fg_algorithm_calibrate(di); in ab8500_fg_algorithm()
1752 if (di->flags.charging) in ab8500_fg_algorithm()
1753 ab8500_fg_algorithm_charging(di); in ab8500_fg_algorithm()
1755 ab8500_fg_algorithm_discharging(di); in ab8500_fg_algorithm()
1758 dev_dbg(di->dev, "[FG_DATA] %d %d %d %d %d %d %d %d %d %d " in ab8500_fg_algorithm()
1760 di->bat_cap.max_mah_design, in ab8500_fg_algorithm()
1761 di->bat_cap.max_mah, in ab8500_fg_algorithm()
1762 di->bat_cap.mah, in ab8500_fg_algorithm()
1763 di->bat_cap.permille, in ab8500_fg_algorithm()
1764 di->bat_cap.level, in ab8500_fg_algorithm()
1765 di->bat_cap.prev_mah, in ab8500_fg_algorithm()
1766 di->bat_cap.prev_percent, in ab8500_fg_algorithm()
1767 di->bat_cap.prev_level, in ab8500_fg_algorithm()
1768 di->vbat, in ab8500_fg_algorithm()
1769 di->inst_curr, in ab8500_fg_algorithm()
1770 di->avg_curr, in ab8500_fg_algorithm()
1771 di->accu_charge, in ab8500_fg_algorithm()
1772 di->flags.charging, in ab8500_fg_algorithm()
1773 di->charge_state, in ab8500_fg_algorithm()
1774 di->discharge_state, in ab8500_fg_algorithm()
1775 di->high_curr_mode, in ab8500_fg_algorithm()
1776 di->recovery_needed); in ab8500_fg_algorithm()
1787 struct ab8500_fg *di = container_of(work, struct ab8500_fg, in ab8500_fg_periodic_work() local
1790 if (di->init_capacity) { in ab8500_fg_periodic_work()
1792 ab8500_fg_calc_cap_discharge_voltage(di, true); in ab8500_fg_periodic_work()
1793 ab8500_fg_check_capacity_limits(di, true); in ab8500_fg_periodic_work()
1794 di->init_capacity = false; in ab8500_fg_periodic_work()
1796 queue_delayed_work(di->fg_wq, &di->fg_periodic_work, 0); in ab8500_fg_periodic_work()
1797 } else if (di->flags.user_cap) { in ab8500_fg_periodic_work()
1798 if (check_sysfs_capacity(di)) { in ab8500_fg_periodic_work()
1799 ab8500_fg_check_capacity_limits(di, true); in ab8500_fg_periodic_work()
1800 if (di->flags.charging) in ab8500_fg_periodic_work()
1801 ab8500_fg_charge_state_to(di, in ab8500_fg_periodic_work()
1804 ab8500_fg_discharge_state_to(di, in ab8500_fg_periodic_work()
1807 di->flags.user_cap = false; in ab8500_fg_periodic_work()
1808 queue_delayed_work(di->fg_wq, &di->fg_periodic_work, 0); in ab8500_fg_periodic_work()
1810 ab8500_fg_algorithm(di); in ab8500_fg_periodic_work()
1825 struct ab8500_fg *di = container_of(work, struct ab8500_fg, in ab8500_fg_check_hw_failure_work() local
1832 ret = abx500_get_register_interruptible(di->dev, in ab8500_fg_check_hw_failure_work()
1836 dev_err(di->dev, "%s ab8500 read failed\n", __func__); in ab8500_fg_check_hw_failure_work()
1840 if (!di->flags.bat_ovv) { in ab8500_fg_check_hw_failure_work()
1841 dev_dbg(di->dev, "Battery OVV\n"); in ab8500_fg_check_hw_failure_work()
1842 di->flags.bat_ovv = true; in ab8500_fg_check_hw_failure_work()
1843 power_supply_changed(di->fg_psy); in ab8500_fg_check_hw_failure_work()
1846 queue_delayed_work(di->fg_wq, &di->fg_check_hw_failure_work, in ab8500_fg_check_hw_failure_work()
1849 dev_dbg(di->dev, "Battery recovered from OVV\n"); in ab8500_fg_check_hw_failure_work()
1850 di->flags.bat_ovv = false; in ab8500_fg_check_hw_failure_work()
1851 power_supply_changed(di->fg_psy); in ab8500_fg_check_hw_failure_work()
1865 struct ab8500_fg *di = container_of(work, struct ab8500_fg, in ab8500_fg_low_bat_work() local
1868 vbat = ab8500_fg_bat_voltage(di); in ab8500_fg_low_bat_work()
1871 if (vbat < di->bm->fg_params->lowbat_threshold) { in ab8500_fg_low_bat_work()
1873 if (di->low_bat_cnt < 1) { in ab8500_fg_low_bat_work()
1874 di->flags.low_bat = true; in ab8500_fg_low_bat_work()
1875 dev_warn(di->dev, "Shut down pending...\n"); in ab8500_fg_low_bat_work()
1882 di->low_bat_cnt--; in ab8500_fg_low_bat_work()
1883 dev_warn(di->dev, "Battery voltage still LOW\n"); in ab8500_fg_low_bat_work()
1884 queue_delayed_work(di->fg_wq, &di->fg_low_bat_work, in ab8500_fg_low_bat_work()
1888 di->flags.low_bat_delay = false; in ab8500_fg_low_bat_work()
1889 di->low_bat_cnt = 10; in ab8500_fg_low_bat_work()
1890 dev_warn(di->dev, "Battery voltage OK again\n"); in ab8500_fg_low_bat_work()
1894 ab8500_fg_check_capacity_limits(di, false); in ab8500_fg_low_bat_work()
1907 static int ab8500_fg_battok_calc(struct ab8500_fg *di, int target) in ab8500_fg_battok_calc() argument
1923 static int ab8500_fg_battok_init_hw_register(struct ab8500_fg *di) in ab8500_fg_battok_init_hw_register() argument
1933 sel0 = di->bm->fg_params->battok_falling_th_sel0; in ab8500_fg_battok_init_hw_register()
1934 sel1 = di->bm->fg_params->battok_raising_th_sel1; in ab8500_fg_battok_init_hw_register()
1936 cbp_sel0 = ab8500_fg_battok_calc(di, sel0); in ab8500_fg_battok_init_hw_register()
1937 cbp_sel1 = ab8500_fg_battok_calc(di, sel1); in ab8500_fg_battok_init_hw_register()
1942 dev_warn(di->dev, "Invalid voltage step:%d, using %d %d\n", in ab8500_fg_battok_init_hw_register()
1948 dev_warn(di->dev, "Invalid voltage step:%d, using %d %d\n", in ab8500_fg_battok_init_hw_register()
1953 dev_dbg(di->dev, "using: %x %d %d\n", new_val, cbp_sel0, cbp_sel1); in ab8500_fg_battok_init_hw_register()
1954 ret = abx500_set_register_interruptible(di->dev, AB8500_SYS_CTRL2_BLOCK, in ab8500_fg_battok_init_hw_register()
1967 struct ab8500_fg *di = container_of(work, struct ab8500_fg, fg_work); in ab8500_fg_instant_work() local
1969 ab8500_fg_algorithm(di); in ab8500_fg_instant_work()
1981 struct ab8500_fg *di = _di; in ab8500_fg_cc_data_end_handler() local
1982 if (!di->nbr_cceoc_irq_cnt) { in ab8500_fg_cc_data_end_handler()
1983 di->nbr_cceoc_irq_cnt++; in ab8500_fg_cc_data_end_handler()
1984 complete(&di->ab8500_fg_started); in ab8500_fg_cc_data_end_handler()
1986 di->nbr_cceoc_irq_cnt = 0; in ab8500_fg_cc_data_end_handler()
1987 complete(&di->ab8500_fg_complete); in ab8500_fg_cc_data_end_handler()
2001 struct ab8500_fg *di = _di; in ab8500_fg_cc_int_calib_handler() local
2002 di->calib_state = AB8500_FG_CALIB_END; in ab8500_fg_cc_int_calib_handler()
2003 queue_delayed_work(di->fg_wq, &di->fg_periodic_work, 0); in ab8500_fg_cc_int_calib_handler()
2016 struct ab8500_fg *di = _di; in ab8500_fg_cc_convend_handler() local
2018 queue_work(di->fg_wq, &di->fg_acc_cur_work); in ab8500_fg_cc_convend_handler()
2032 struct ab8500_fg *di = _di; in ab8500_fg_batt_ovv_handler() local
2034 dev_dbg(di->dev, "Battery OVV\n"); in ab8500_fg_batt_ovv_handler()
2037 queue_delayed_work(di->fg_wq, &di->fg_check_hw_failure_work, 0); in ab8500_fg_batt_ovv_handler()
2051 struct ab8500_fg *di = _di; in ab8500_fg_lowbatf_handler() local
2054 if (!di->flags.low_bat_delay) { in ab8500_fg_lowbatf_handler()
2055 dev_warn(di->dev, "Battery voltage is below LOW threshold\n"); in ab8500_fg_lowbatf_handler()
2056 di->flags.low_bat_delay = true; in ab8500_fg_lowbatf_handler()
2061 queue_delayed_work(di->fg_wq, &di->fg_low_bat_work, in ab8500_fg_lowbatf_handler()
2089 struct ab8500_fg *di = power_supply_get_drvdata(psy); in ab8500_fg_get_property() local
2100 if (di->flags.bat_ovv) in ab8500_fg_get_property()
2103 val->intval = di->vbat * 1000; in ab8500_fg_get_property()
2106 val->intval = di->inst_curr * 1000; in ab8500_fg_get_property()
2109 val->intval = di->avg_curr * 1000; in ab8500_fg_get_property()
2112 val->intval = ab8500_fg_convert_mah_to_uwh(di, in ab8500_fg_get_property()
2113 di->bat_cap.max_mah_design); in ab8500_fg_get_property()
2116 val->intval = ab8500_fg_convert_mah_to_uwh(di, in ab8500_fg_get_property()
2117 di->bat_cap.max_mah); in ab8500_fg_get_property()
2120 if (di->flags.batt_unknown && !di->bm->chg_unknown_bat && in ab8500_fg_get_property()
2121 di->flags.batt_id_received) in ab8500_fg_get_property()
2122 val->intval = ab8500_fg_convert_mah_to_uwh(di, in ab8500_fg_get_property()
2123 di->bat_cap.max_mah); in ab8500_fg_get_property()
2125 val->intval = ab8500_fg_convert_mah_to_uwh(di, in ab8500_fg_get_property()
2126 di->bat_cap.prev_mah); in ab8500_fg_get_property()
2129 val->intval = di->bat_cap.max_mah_design; in ab8500_fg_get_property()
2132 val->intval = di->bat_cap.max_mah; in ab8500_fg_get_property()
2135 if (di->flags.batt_unknown && !di->bm->chg_unknown_bat && in ab8500_fg_get_property()
2136 di->flags.batt_id_received) in ab8500_fg_get_property()
2137 val->intval = di->bat_cap.max_mah; in ab8500_fg_get_property()
2139 val->intval = di->bat_cap.prev_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()
2146 val->intval = di->bat_cap.prev_percent; 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_level; in ab8500_fg_get_property()
2166 struct ab8500_fg *di; in ab8500_fg_get_ext_psy_data() local
2171 di = power_supply_get_drvdata(psy); in ab8500_fg_get_ext_psy_data()
2197 if (!di->flags.charging) in ab8500_fg_get_ext_psy_data()
2199 di->flags.charging = false; in ab8500_fg_get_ext_psy_data()
2200 di->flags.fully_charged = false; in ab8500_fg_get_ext_psy_data()
2201 if (di->bm->capacity_scaling) in ab8500_fg_get_ext_psy_data()
2202 ab8500_fg_update_cap_scalers(di); in ab8500_fg_get_ext_psy_data()
2203 queue_work(di->fg_wq, &di->fg_work); in ab8500_fg_get_ext_psy_data()
2206 if (di->flags.fully_charged) in ab8500_fg_get_ext_psy_data()
2208 di->flags.fully_charged = true; in ab8500_fg_get_ext_psy_data()
2209 di->flags.force_full = true; in ab8500_fg_get_ext_psy_data()
2211 di->bat_cap.max_mah = di->bat_cap.mah; in ab8500_fg_get_ext_psy_data()
2212 queue_work(di->fg_wq, &di->fg_work); in ab8500_fg_get_ext_psy_data()
2215 if (di->flags.charging && in ab8500_fg_get_ext_psy_data()
2216 !di->flags.fully_charged) in ab8500_fg_get_ext_psy_data()
2218 di->flags.charging = true; in ab8500_fg_get_ext_psy_data()
2219 di->flags.fully_charged = false; in ab8500_fg_get_ext_psy_data()
2220 if (di->bm->capacity_scaling) in ab8500_fg_get_ext_psy_data()
2221 ab8500_fg_update_cap_scalers(di); in ab8500_fg_get_ext_psy_data()
2222 queue_work(di->fg_wq, &di->fg_work); in ab8500_fg_get_ext_psy_data()
2232 if (!di->flags.batt_id_received && in ab8500_fg_get_ext_psy_data()
2233 di->bm->batt_id != BATTERY_UNKNOWN) { in ab8500_fg_get_ext_psy_data()
2236 b = &(di->bm->bat_type[di->bm->batt_id]); in ab8500_fg_get_ext_psy_data()
2238 di->flags.batt_id_received = true; in ab8500_fg_get_ext_psy_data()
2240 di->bat_cap.max_mah_design = in ab8500_fg_get_ext_psy_data()
2244 di->bat_cap.max_mah = in ab8500_fg_get_ext_psy_data()
2245 di->bat_cap.max_mah_design; in ab8500_fg_get_ext_psy_data()
2247 di->vbat_nom = b->nominal_voltage; in ab8500_fg_get_ext_psy_data()
2251 di->flags.batt_unknown = false; in ab8500_fg_get_ext_psy_data()
2253 di->flags.batt_unknown = true; in ab8500_fg_get_ext_psy_data()
2262 if (di->flags.batt_id_received) in ab8500_fg_get_ext_psy_data()
2263 di->bat_temp = ret.intval; in ab8500_fg_get_ext_psy_data()
2282 static int ab8500_fg_init_hw_registers(struct ab8500_fg *di) in ab8500_fg_init_hw_registers() argument
2287 ret = abx500_mask_and_set_register_interruptible(di->dev, in ab8500_fg_init_hw_registers()
2293 dev_err(di->dev, "failed to set BATT_OVV\n"); in ab8500_fg_init_hw_registers()
2298 ret = abx500_mask_and_set_register_interruptible(di->dev, in ab8500_fg_init_hw_registers()
2304 dev_err(di->dev, "failed to enable BATT_OVV\n"); in ab8500_fg_init_hw_registers()
2309 ret = abx500_set_register_interruptible(di->dev, in ab8500_fg_init_hw_registers()
2313 di->bm->fg_params->lowbat_threshold) << 1 | in ab8500_fg_init_hw_registers()
2316 dev_err(di->dev, "%s write failed\n", __func__); in ab8500_fg_init_hw_registers()
2321 ret = ab8500_fg_battok_init_hw_register(di); in ab8500_fg_init_hw_registers()
2323 dev_err(di->dev, "BattOk init write failed.\n"); in ab8500_fg_init_hw_registers()
2327 if (is_ab8505(di->parent)) { in ab8500_fg_init_hw_registers()
2328 ret = abx500_set_register_interruptible(di->dev, AB8500_RTC, in ab8500_fg_init_hw_registers()
2329 AB8505_RTC_PCUT_MAX_TIME_REG, di->bm->fg_params->pcut_max_time); in ab8500_fg_init_hw_registers()
2332 dev_err(di->dev, "%s write failed AB8505_RTC_PCUT_MAX_TIME_REG\n", __func__); in ab8500_fg_init_hw_registers()
2336 ret = abx500_set_register_interruptible(di->dev, AB8500_RTC, in ab8500_fg_init_hw_registers()
2337 AB8505_RTC_PCUT_FLAG_TIME_REG, di->bm->fg_params->pcut_flag_time); in ab8500_fg_init_hw_registers()
2340 dev_err(di->dev, "%s write failed AB8505_RTC_PCUT_FLAG_TIME_REG\n", __func__); in ab8500_fg_init_hw_registers()
2344 ret = abx500_set_register_interruptible(di->dev, AB8500_RTC, in ab8500_fg_init_hw_registers()
2345 AB8505_RTC_PCUT_RESTART_REG, di->bm->fg_params->pcut_max_restart); in ab8500_fg_init_hw_registers()
2348 dev_err(di->dev, "%s write failed AB8505_RTC_PCUT_RESTART_REG\n", __func__); in ab8500_fg_init_hw_registers()
2352 ret = abx500_set_register_interruptible(di->dev, AB8500_RTC, in ab8500_fg_init_hw_registers()
2353 AB8505_RTC_PCUT_DEBOUNCE_REG, di->bm->fg_params->pcut_debounce_time); in ab8500_fg_init_hw_registers()
2356 dev_err(di->dev, "%s write failed AB8505_RTC_PCUT_DEBOUNCE_REG\n", __func__); in ab8500_fg_init_hw_registers()
2360 ret = abx500_set_register_interruptible(di->dev, AB8500_RTC, in ab8500_fg_init_hw_registers()
2361 AB8505_RTC_PCUT_CTL_STATUS_REG, di->bm->fg_params->pcut_enable); in ab8500_fg_init_hw_registers()
2364 dev_err(di->dev, "%s write failed AB8505_RTC_PCUT_CTL_STATUS_REG\n", __func__); in ab8500_fg_init_hw_registers()
2383 struct ab8500_fg *di = power_supply_get_drvdata(psy); in ab8500_fg_external_power_changed() local
2386 di->fg_psy, ab8500_fg_get_ext_psy_data); in ab8500_fg_external_power_changed()
2399 struct ab8500_fg *di = container_of(work, struct ab8500_fg, in ab8500_fg_reinit_work() local
2402 if (!di->flags.calibrate) { in ab8500_fg_reinit_work()
2403 dev_dbg(di->dev, "Resetting FG state machine to init.\n"); in ab8500_fg_reinit_work()
2404 ab8500_fg_clear_cap_samples(di); in ab8500_fg_reinit_work()
2405 ab8500_fg_calc_cap_discharge_voltage(di, true); in ab8500_fg_reinit_work()
2406 ab8500_fg_charge_state_to(di, AB8500_FG_CHARGE_INIT); in ab8500_fg_reinit_work()
2407 ab8500_fg_discharge_state_to(di, AB8500_FG_DISCHARGE_INIT); in ab8500_fg_reinit_work()
2408 queue_delayed_work(di->fg_wq, &di->fg_periodic_work, 0); in ab8500_fg_reinit_work()
2411 dev_err(di->dev, "Residual offset calibration ongoing " in ab8500_fg_reinit_work()
2414 queue_delayed_work(di->fg_wq, &di->fg_reinit_work, in ab8500_fg_reinit_work()
2427 static ssize_t charge_full_show(struct ab8500_fg *di, char *buf) in charge_full_show() argument
2429 return sprintf(buf, "%d\n", di->bat_cap.max_mah); in charge_full_show()
2432 static ssize_t charge_full_store(struct ab8500_fg *di, const char *buf, in charge_full_store() argument
2442 di->bat_cap.max_mah = (int) charge_full; in charge_full_store()
2446 static ssize_t charge_now_show(struct ab8500_fg *di, char *buf) in charge_now_show() argument
2448 return sprintf(buf, "%d\n", di->bat_cap.prev_mah); in charge_now_show()
2451 static ssize_t charge_now_store(struct ab8500_fg *di, const char *buf, in charge_now_store() argument
2461 di->bat_cap.user_mah = (int) charge_now; in charge_now_store()
2462 di->flags.user_cap = true; in charge_now_store()
2463 queue_delayed_work(di->fg_wq, &di->fg_periodic_work, 0); in charge_now_store()
2477 struct ab8500_fg *di; in ab8500_fg_show() local
2480 di = container_of(kobj, struct ab8500_fg, fg_kobject); in ab8500_fg_show()
2485 return entry->show(di, buf); in ab8500_fg_show()
2492 struct ab8500_fg *di; in ab8500_fg_store() local
2495 di = container_of(kobj, struct ab8500_fg, fg_kobject); in ab8500_fg_store()
2500 return entry->store(di, buf, count); in ab8500_fg_store()
2525 static void ab8500_fg_sysfs_exit(struct ab8500_fg *di) in ab8500_fg_sysfs_exit() argument
2527 kobject_del(&di->fg_kobject); in ab8500_fg_sysfs_exit()
2537 static int ab8500_fg_sysfs_init(struct ab8500_fg *di) in ab8500_fg_sysfs_init() argument
2541 ret = kobject_init_and_add(&di->fg_kobject, in ab8500_fg_sysfs_init()
2545 kobject_put(&di->fg_kobject); in ab8500_fg_sysfs_init()
2546 dev_err(di->dev, "failed to create sysfs entry\n"); in ab8500_fg_sysfs_init()
2559 struct ab8500_fg *di = power_supply_get_drvdata(psy); in ab8505_powercut_flagtime_read() local
2561 ret = abx500_get_register_interruptible(di->dev, AB8500_RTC, in ab8505_powercut_flagtime_read()
2582 struct ab8500_fg *di = power_supply_get_drvdata(psy); in ab8505_powercut_flagtime_write() local
2592 ret = abx500_set_register_interruptible(di->dev, AB8500_RTC, in ab8505_powercut_flagtime_write()
2609 struct ab8500_fg *di = power_supply_get_drvdata(psy); in ab8505_powercut_maxtime_read() local
2611 ret = abx500_get_register_interruptible(di->dev, AB8500_RTC, in ab8505_powercut_maxtime_read()
2633 struct ab8500_fg *di = power_supply_get_drvdata(psy); in ab8505_powercut_maxtime_write() local
2643 ret = abx500_set_register_interruptible(di->dev, AB8500_RTC, in ab8505_powercut_maxtime_write()
2660 struct ab8500_fg *di = power_supply_get_drvdata(psy); in ab8505_powercut_restart_read() local
2662 ret = abx500_get_register_interruptible(di->dev, AB8500_RTC, in ab8505_powercut_restart_read()
2683 struct ab8500_fg *di = power_supply_get_drvdata(psy); in ab8505_powercut_restart_write() local
2693 ret = abx500_set_register_interruptible(di->dev, AB8500_RTC, in ab8505_powercut_restart_write()
2711 struct ab8500_fg *di = power_supply_get_drvdata(psy); in ab8505_powercut_timer_read() local
2713 ret = abx500_get_register_interruptible(di->dev, AB8500_RTC, in ab8505_powercut_timer_read()
2734 struct ab8500_fg *di = power_supply_get_drvdata(psy); in ab8505_powercut_restart_counter_read() local
2736 ret = abx500_get_register_interruptible(di->dev, AB8500_RTC, in ab8505_powercut_restart_counter_read()
2757 struct ab8500_fg *di = power_supply_get_drvdata(psy); in ab8505_powercut_read() local
2759 ret = abx500_get_register_interruptible(di->dev, AB8500_RTC, in ab8505_powercut_read()
2778 struct ab8500_fg *di = power_supply_get_drvdata(psy); in ab8505_powercut_write() local
2788 ret = abx500_set_register_interruptible(di->dev, AB8500_RTC, in ab8505_powercut_write()
2806 struct ab8500_fg *di = power_supply_get_drvdata(psy); in ab8505_powercut_flag_read() local
2808 ret = abx500_get_register_interruptible(di->dev, AB8500_RTC, in ab8505_powercut_flag_read()
2829 struct ab8500_fg *di = power_supply_get_drvdata(psy); in ab8505_powercut_debounce_read() local
2831 ret = abx500_get_register_interruptible(di->dev, AB8500_RTC, in ab8505_powercut_debounce_read()
2852 struct ab8500_fg *di = power_supply_get_drvdata(psy); in ab8505_powercut_debounce_write() local
2862 ret = abx500_set_register_interruptible(di->dev, AB8500_RTC, in ab8505_powercut_debounce_write()
2879 struct ab8500_fg *di = power_supply_get_drvdata(psy); in ab8505_powercut_enable_status_read() local
2881 ret = abx500_get_register_interruptible(di->dev, AB8500_RTC, in ab8505_powercut_enable_status_read()
2914 static int ab8500_fg_sysfs_psy_create_attrs(struct ab8500_fg *di) in ab8500_fg_sysfs_psy_create_attrs() argument
2918 if (is_ab8505(di->parent)) { in ab8500_fg_sysfs_psy_create_attrs()
2920 if (device_create_file(&di->fg_psy->dev, in ab8500_fg_sysfs_psy_create_attrs()
2926 dev_err(&di->fg_psy->dev, "Failed creating sysfs psy attrs for ab8505.\n"); in ab8500_fg_sysfs_psy_create_attrs()
2928 device_remove_file(&di->fg_psy->dev, in ab8500_fg_sysfs_psy_create_attrs()
2934 static void ab8500_fg_sysfs_psy_remove_attrs(struct ab8500_fg *di) in ab8500_fg_sysfs_psy_remove_attrs() argument
2938 if (is_ab8505(di->parent)) { in ab8500_fg_sysfs_psy_remove_attrs()
2940 (void)device_remove_file(&di->fg_psy->dev, in ab8500_fg_sysfs_psy_remove_attrs()
2950 struct ab8500_fg *di = platform_get_drvdata(pdev); in ab8500_fg_resume() local
2956 if (!di->flags.charging) { in ab8500_fg_resume()
2957 ab8500_fg_discharge_state_to(di, AB8500_FG_DISCHARGE_WAKEUP); in ab8500_fg_resume()
2958 queue_work(di->fg_wq, &di->fg_work); in ab8500_fg_resume()
2967 struct ab8500_fg *di = platform_get_drvdata(pdev); in ab8500_fg_suspend() local
2969 flush_delayed_work(&di->fg_periodic_work); in ab8500_fg_suspend()
2970 flush_work(&di->fg_work); in ab8500_fg_suspend()
2971 flush_work(&di->fg_acc_cur_work); in ab8500_fg_suspend()
2972 flush_delayed_work(&di->fg_reinit_work); in ab8500_fg_suspend()
2973 flush_delayed_work(&di->fg_low_bat_work); in ab8500_fg_suspend()
2974 flush_delayed_work(&di->fg_check_hw_failure_work); in ab8500_fg_suspend()
2980 if (di->flags.fg_enabled && !di->flags.charging) in ab8500_fg_suspend()
2981 ab8500_fg_coulomb_counter(di, false); in ab8500_fg_suspend()
2993 struct ab8500_fg *di = platform_get_drvdata(pdev); in ab8500_fg_remove() local
2995 list_del(&di->node); in ab8500_fg_remove()
2998 ret = ab8500_fg_coulomb_counter(di, false); in ab8500_fg_remove()
3000 dev_err(di->dev, "failed to disable coulomb counter\n"); in ab8500_fg_remove()
3002 destroy_workqueue(di->fg_wq); in ab8500_fg_remove()
3003 ab8500_fg_sysfs_exit(di); in ab8500_fg_remove()
3006 ab8500_fg_sysfs_psy_remove_attrs(di); in ab8500_fg_remove()
3007 power_supply_unregister(di->fg_psy); in ab8500_fg_remove()
3042 struct ab8500_fg *di; in ab8500_fg_probe() local
3046 di = devm_kzalloc(&pdev->dev, sizeof(*di), GFP_KERNEL); in ab8500_fg_probe()
3047 if (!di) { in ab8500_fg_probe()
3056 di->bm = plat; in ab8500_fg_probe()
3059 ret = ab8500_bm_of_probe(&pdev->dev, np, di->bm); in ab8500_fg_probe()
3066 mutex_init(&di->cc_lock); in ab8500_fg_probe()
3069 di->dev = &pdev->dev; in ab8500_fg_probe()
3070 di->parent = dev_get_drvdata(pdev->dev.parent); in ab8500_fg_probe()
3072 di->main_bat_v = devm_iio_channel_get(&pdev->dev, "main_bat_v"); in ab8500_fg_probe()
3073 if (IS_ERR(di->main_bat_v)) { in ab8500_fg_probe()
3074 if (PTR_ERR(di->main_bat_v) == -ENODEV) in ab8500_fg_probe()
3077 return PTR_ERR(di->main_bat_v); in ab8500_fg_probe()
3082 psy_cfg.drv_data = di; in ab8500_fg_probe()
3084 di->bat_cap.max_mah_design = MILLI_TO_MICRO * in ab8500_fg_probe()
3085 di->bm->bat_type[di->bm->batt_id].charge_full_design; in ab8500_fg_probe()
3087 di->bat_cap.max_mah = di->bat_cap.max_mah_design; in ab8500_fg_probe()
3089 di->vbat_nom = di->bm->bat_type[di->bm->batt_id].nominal_voltage; in ab8500_fg_probe()
3091 di->init_capacity = true; in ab8500_fg_probe()
3093 ab8500_fg_charge_state_to(di, AB8500_FG_CHARGE_INIT); in ab8500_fg_probe()
3094 ab8500_fg_discharge_state_to(di, AB8500_FG_DISCHARGE_INIT); in ab8500_fg_probe()
3097 di->fg_wq = alloc_ordered_workqueue("ab8500_fg_wq", WQ_MEM_RECLAIM); in ab8500_fg_probe()
3098 if (di->fg_wq == NULL) { in ab8500_fg_probe()
3099 dev_err(di->dev, "failed to create work queue\n"); in ab8500_fg_probe()
3104 INIT_WORK(&di->fg_work, ab8500_fg_instant_work); in ab8500_fg_probe()
3107 INIT_WORK(&di->fg_acc_cur_work, ab8500_fg_acc_cur_work); in ab8500_fg_probe()
3110 INIT_DEFERRABLE_WORK(&di->fg_reinit_work, in ab8500_fg_probe()
3114 INIT_DEFERRABLE_WORK(&di->fg_periodic_work, in ab8500_fg_probe()
3118 INIT_DEFERRABLE_WORK(&di->fg_low_bat_work, in ab8500_fg_probe()
3122 INIT_DEFERRABLE_WORK(&di->fg_check_hw_failure_work, in ab8500_fg_probe()
3126 di->flags.low_bat = false; in ab8500_fg_probe()
3129 di->low_bat_cnt = 10; in ab8500_fg_probe()
3132 ret = ab8500_fg_init_hw_registers(di); in ab8500_fg_probe()
3134 dev_err(di->dev, "failed to initialize registers\n"); in ab8500_fg_probe()
3139 di->flags.batt_unknown = true; in ab8500_fg_probe()
3140 di->flags.batt_id_received = false; in ab8500_fg_probe()
3143 di->fg_psy = power_supply_register(di->dev, &ab8500_fg_desc, &psy_cfg); in ab8500_fg_probe()
3144 if (IS_ERR(di->fg_psy)) { in ab8500_fg_probe()
3145 dev_err(di->dev, "failed to register FG psy\n"); in ab8500_fg_probe()
3146 ret = PTR_ERR(di->fg_psy); in ab8500_fg_probe()
3150 di->fg_samples = SEC_TO_SAMPLE(di->bm->fg_params->init_timer); in ab8500_fg_probe()
3151 ab8500_fg_coulomb_counter(di, true); in ab8500_fg_probe()
3157 init_completion(&di->ab8500_fg_started); in ab8500_fg_probe()
3158 init_completion(&di->ab8500_fg_complete); in ab8500_fg_probe()
3170 ab8500_fg_irq_th[i].name, di); in ab8500_fg_probe()
3173 dev_err(di->dev, "failed to request %s IRQ %d: %d\n", in ab8500_fg_probe()
3177 dev_dbg(di->dev, "Requested %s IRQ %d: %d\n", in ab8500_fg_probe()
3190 ab8500_fg_irq_bh[0].name, di); in ab8500_fg_probe()
3193 dev_err(di->dev, "failed to request %s IRQ %d: %d\n", in ab8500_fg_probe()
3197 dev_dbg(di->dev, "Requested %s IRQ %d: %d\n", in ab8500_fg_probe()
3200 di->irq = platform_get_irq_byname(pdev, "CCEOC"); in ab8500_fg_probe()
3201 disable_irq(di->irq); in ab8500_fg_probe()
3202 di->nbr_cceoc_irq_cnt = 0; in ab8500_fg_probe()
3204 platform_set_drvdata(pdev, di); in ab8500_fg_probe()
3206 ret = ab8500_fg_sysfs_init(di); in ab8500_fg_probe()
3208 dev_err(di->dev, "failed to create sysfs entry\n"); in ab8500_fg_probe()
3212 ret = ab8500_fg_sysfs_psy_create_attrs(di); in ab8500_fg_probe()
3214 dev_err(di->dev, "failed to create FG psy\n"); in ab8500_fg_probe()
3215 ab8500_fg_sysfs_exit(di); in ab8500_fg_probe()
3220 di->flags.calibrate = true; in ab8500_fg_probe()
3221 di->calib_state = AB8500_FG_CALIB_INIT; in ab8500_fg_probe()
3224 di->bat_temp = 210; in ab8500_fg_probe()
3227 queue_delayed_work(di->fg_wq, &di->fg_periodic_work, 0); in ab8500_fg_probe()
3229 list_add_tail(&di->node, &ab8500_fg_list); in ab8500_fg_probe()
3236 free_irq(irq, di); in ab8500_fg_probe()
3241 free_irq(irq, di); in ab8500_fg_probe()
3244 power_supply_unregister(di->fg_psy); in ab8500_fg_probe()
3246 destroy_workqueue(di->fg_wq); in ab8500_fg_probe()