int of_batterydata_read_data(struct device_node *batterydata_container_node, struct bms_battery_data *batt_data, int batt_id_uv) { struct device_node *node, *best_node, *df_node; struct batt_id_rng id_range; size_t sz = sizeof(struct batt_id_rng) / sizeof(int); struct batt_ids batt_ids; int delta, best_delta, batt_id_kohm, rpull_up_kohm, vadc_vdd_uv, best_id_kohm, i, rc = 0; int default_kohm; node = batterydata_container_node; OF_PROP_READ(rpull_up_kohm, "rpull-up-kohm", node, rc, false); OF_PROP_READ(vadc_vdd_uv, "vref-batt-therm-uv", node, rc, false); if (rc) return rc; OF_PROP_READ(default_kohm, "default-kohm", node, rc, true); df_node = NULL; batt_id_kohm = of_batterydata_convert_battery_id_kohm(batt_id_uv, rpull_up_kohm, vadc_vdd_uv); best_node = NULL; best_delta = 0; best_id_kohm = 0; /* * Find the battery data with a battery id resistor closest to this one */ for_each_child_of_node(batterydata_container_node, node) { rc = of_batterydata_read_batt_id_kohm(node, "qcom,batt-id-kohm", &batt_ids); if (rc) continue; for (i = 0; i < batt_ids.num; i++) { delta = abs(batt_ids.kohm[i] - batt_id_kohm); if (delta < best_delta || !best_node) { best_node = node; best_delta = delta; best_id_kohm = batt_ids.kohm[i]; } if ((default_kohm != -EINVAL) && (batt_ids.kohm[i] == default_kohm)) df_node = node; } }
int of_batterydata_read_data(struct device_node *batterydata_container_node, struct bms_battery_data *batt_data, int batt_id_uv) { struct device_node *node, *best_node; struct batt_ids batt_ids; const char *battery_type = NULL; int delta, best_delta, batt_id_kohm, rpull_up_kohm, vadc_vdd_uv, best_id_kohm, i, rc = 0; node = batterydata_container_node; OF_PROP_READ(rpull_up_kohm, "rpull-up-kohm", node, rc, false); OF_PROP_READ(vadc_vdd_uv, "vref-batt-therm", node, rc, false); if (rc) return rc; batt_id_kohm = of_batterydata_convert_battery_id_kohm(batt_id_uv, rpull_up_kohm, vadc_vdd_uv); pr_info("[BATT][BMS] batt_id_kohm=%d\n",batt_id_kohm); best_node = NULL; best_delta = 0; best_id_kohm = 0; /* * Find the battery data with a battery id resistor closest to this one */ for_each_child_of_node(batterydata_container_node, node) { rc = of_batterydata_read_batt_id_kohm(node, "qcom,batt-id-kohm", &batt_ids); if (rc) continue; for (i = 0; i < batt_ids.num; i++) { delta = abs(batt_ids.kohm[i] - batt_id_kohm); if (delta < best_delta || !best_node) { best_node = node; best_delta = delta; best_id_kohm = batt_ids.kohm[i]; } } }
static int of_batterydata_load_battery_data(struct device_node *node, int best_id_kohm, struct bms_battery_data *batt_data) { int rc; rc = of_batterydata_read_single_row_lut(node, "qcom,fcc-temp-lut", batt_data->fcc_temp_lut); if (rc) return rc; rc = of_batterydata_read_pc_temp_ocv_lut(node, "qcom,pc-temp-ocv-lut", batt_data->pc_temp_ocv_lut); if (rc) return rc; rc = of_batterydata_read_sf_lut(node, "qcom,rbatt-sf-lut", batt_data->rbatt_sf_lut); if (rc) return rc; rc = of_batterydata_read_ibat_temp_acc_lut(node, "qcom,ibat-acc-lut", batt_data->ibat_acc_lut); if (rc) return rc; rc = of_property_read_string(node, "qcom,battery-type", &batt_data->battery_type); if (rc) { pr_err("Error reading qcom,battery-type property rc=%d\n", rc); batt_data->battery_type = NULL; return rc; } OF_PROP_READ(batt_data->fcc, "fcc-mah", node, rc, false); OF_PROP_READ(batt_data->default_rbatt_mohm, "default-rbatt-mohm", node, rc, false); OF_PROP_READ(batt_data->rbatt_capacitive_mohm, "rbatt-capacitive-mohm", node, rc, false); OF_PROP_READ(batt_data->flat_ocv_threshold_uv, "flat-ocv-threshold-uv", node, rc, true); OF_PROP_READ(batt_data->max_voltage_uv, "max-voltage-uv", node, rc, true); OF_PROP_READ(batt_data->cutoff_uv, "v-cutoff-uv", node, rc, true); OF_PROP_READ(batt_data->iterm_ua, "chg-term-ua", node, rc, true); batt_data->batt_id_kohm = best_id_kohm; return rc; }
static int of_batterydata_load_battery_data(struct device_node *node, int best_id_kohm, struct bms_battery_data *batt_data) { int rc; #ifdef CONFIG_HUAWEI_KERNEL int warm_bat_decidegc = 0; int warm_bat_chg_ma = 0; int warm_bat_mv = 0; int cool_bat_decidegc = 0; int cool_bat_chg_ma = 0; int cool_bat_mv = 0; int cold_bat_decidegc = 0; int hot_bat_decidegc = 0; rc = 0; OF_PROP_READ(warm_bat_decidegc, "warm-bat-decidegc", node, rc, false); OF_PROP_READ(warm_bat_chg_ma, "ibatmax-warm-ma", node, rc, false); OF_PROP_READ(warm_bat_mv, "warm-bat-mv", node, rc, false); OF_PROP_READ(cool_bat_decidegc, "cool-bat-decidegc", node, rc, false); OF_PROP_READ(cool_bat_chg_ma, "ibatmax-cool-ma", node, rc, false); OF_PROP_READ(cool_bat_mv, "cool-bat-mv", node, rc, false); OF_PROP_READ(hot_bat_decidegc, "hot-bat-decidegc", node, rc, false); OF_PROP_READ(cold_bat_decidegc, "cold-bat-decidegc", node, rc, false); if (!rc) { batt_data->warm_bat_decidegc = warm_bat_decidegc; batt_data->warm_bat_chg_ma = warm_bat_chg_ma; batt_data->warm_bat_mv = warm_bat_mv; batt_data->cool_bat_decidegc = cool_bat_decidegc; batt_data->cool_bat_chg_ma = cool_bat_chg_ma; batt_data->cool_bat_mv = cool_bat_mv; batt_data->hot_bat_decidegc = hot_bat_decidegc; batt_data->cold_bat_decidegc = cold_bat_decidegc; } rc = 0; #endif rc = of_batterydata_read_single_row_lut(node, "qcom,fcc-temp-lut", batt_data->fcc_temp_lut); if (rc) return rc; rc = of_batterydata_read_pc_temp_ocv_lut(node, "qcom,pc-temp-ocv-lut", batt_data->pc_temp_ocv_lut); if (rc) return rc; rc = of_batterydata_read_sf_lut(node, "qcom,rbatt-sf-lut", batt_data->rbatt_sf_lut); if (rc) return rc; OF_PROP_READ(batt_data->fcc, "fcc-mah", node, rc, false); OF_PROP_READ(batt_data->default_rbatt_mohm, "default-rbatt-mohm", node, rc, false); OF_PROP_READ(batt_data->rbatt_capacitive_mohm, "rbatt-capacitive-mohm", node, rc, false); OF_PROP_READ(batt_data->flat_ocv_threshold_uv, "flat-ocv-threshold", node, rc, true); OF_PROP_READ(batt_data->max_voltage_uv, "max-voltage-uv", node, rc, true); OF_PROP_READ(batt_data->cutoff_uv, "v-cutoff-uv", node, rc, true); OF_PROP_READ(batt_data->iterm_ua, "chg-term-ua", node, rc, true); batt_data->batt_id_kohm = best_id_kohm; return rc; }