/* * sec_battery_dt.c * Samsung Mobile Battery Driver * * Copyright (C) 2018 Samsung Electronics * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ #include "sec_battery.h" #include "sec_battery_dt.h" #if defined(CONFIG_SEC_KUNIT) #include #else #define __visible_for_testing static #endif #ifdef CONFIG_OF #define PROPERTY_NAME_SIZE 128 int sec_bat_parse_dt_siop( struct sec_battery_info *battery, struct device_node *np) { sec_battery_platform_data_t *pdata = battery->pdata; int ret = 0, len = 0; const u32 *p; ret = of_property_read_u32(np, "battery,siop_icl", &pdata->siop_icl); if (ret) pdata->siop_icl = SIOP_INPUT_LIMIT_CURRENT; ret = of_property_read_u32(np, "battery,siop_fcc", &pdata->siop_fcc); if (ret) pdata->siop_fcc = SIOP_CHARGING_LIMIT_CURRENT; ret = of_property_read_u32(np, "battery,siop_hv_12v_icl", &pdata->siop_hv_12v_icl); if (ret) pdata->siop_hv_12v_icl = SIOP_HV_12V_INPUT_LIMIT_CURRENT; ret = of_property_read_u32(np, "battery,siop_hv_12v_fcc", &pdata->siop_hv_12v_fcc); if (ret) pdata->siop_hv_12v_fcc = SIOP_HV_12V_CHARGING_LIMIT_CURRENT; ret = of_property_read_u32(np, "battery,siop_hv_icl", &pdata->siop_hv_icl); if (ret) pdata->siop_hv_icl = SIOP_HV_INPUT_LIMIT_CURRENT; ret = of_property_read_u32(np, "battery,siop_hv_icl_2nd", &pdata->siop_hv_icl_2nd); if (ret) pdata->siop_hv_icl_2nd = SIOP_HV_INPUT_LIMIT_CURRENT; ret = of_property_read_u32(np, "battery,siop_hv_fcc", &pdata->siop_hv_fcc); if (ret) pdata->siop_hv_fcc = SIOP_HV_CHARGING_LIMIT_CURRENT; ret = of_property_read_u32(np, "battery,siop_apdo_icl", &pdata->siop_apdo_icl); if (ret) pdata->siop_apdo_icl = SIOP_APDO_INPUT_LIMIT_CURRENT; ret = of_property_read_u32(np, "battery,siop_apdo_fcc", &pdata->siop_apdo_fcc); if (ret) pdata->siop_apdo_fcc = SIOP_APDO_CHARGING_LIMIT_CURRENT; ret = of_property_read_u32(np, "battery,siop_wpc_icl", &pdata->siop_wpc_icl); if (ret) pdata->siop_wpc_icl = SIOP_WIRELESS_INPUT_LIMIT_CURRENT; p = of_get_property(np, "battery,siop_wpc_fcc", &len); if (!p) { pr_info("%s : battery,siop_wpc_fcc is Empty\n", __func__); } else { len = len / sizeof(u32); pdata->siop_wpc_fcc = kzalloc(sizeof(*pdata->siop_wpc_fcc) * len, GFP_KERNEL); ret = of_property_read_u32_array(np, "battery,siop_wpc_fcc", pdata->siop_wpc_fcc, len); pr_info("%s: parse siop_wpc_fcc, ret = %d, len = %d\n", __func__, ret, len); } ret = of_property_read_u32(np, "battery,siop_hv_wpc_icl", &pdata->siop_hv_wpc_icl); if (ret) pdata->siop_hv_wpc_icl = SIOP_HV_WIRELESS_INPUT_LIMIT_CURRENT; p = of_get_property(np, "battery,siop_hv_wpc_fcc", &len); if (!p) { pr_info("%s : battery,siop_hv_wpc_fcc is Empty\n", __func__); } else { len = len / sizeof(u32); pdata->siop_hv_wpc_fcc = kzalloc(sizeof(*pdata->siop_hv_wpc_fcc) * len, GFP_KERNEL); ret = of_property_read_u32_array(np, "battery,siop_hv_wpc_fcc", pdata->siop_hv_wpc_fcc, len); pr_info("%s: parse siop_hv_wpc_fcc, ret = %d, len = %d\n", __func__, ret, len); } len = of_property_count_u32_elems(np, "battery,siop_scenarios"); if (len > 0) { int siop_scenarios[SIOP_SCENARIO_NUM_MAX]; pdata->siop_scenarios_num = (len > SIOP_SCENARIO_NUM_MAX) ? SIOP_SCENARIO_NUM_MAX : len; ret = of_property_read_u32_array(np, "battery,siop_scenarios", (u32 *)siop_scenarios, pdata->siop_scenarios_num); ret = of_property_read_u32(np, "battery,siop_curr_type_num", &pdata->siop_curr_type_num); if (ret) { pdata->siop_scenarios_num = 0; pdata->siop_curr_type_num = 0; goto parse_siop_next; } pdata->siop_curr_type_num = (pdata->siop_curr_type_num > SIOP_CURR_TYPE_MAX) ? SIOP_CURR_TYPE_MAX : pdata->siop_curr_type_num; if (pdata->siop_curr_type_num > 0) { int i, j, siop_level; char prop_name[PROPERTY_NAME_SIZE]; for (i = 0; i < pdata->siop_scenarios_num; ++i) { siop_level = siop_scenarios[i]; pdata->siop_table[i].level = siop_level; snprintf(prop_name, PROPERTY_NAME_SIZE, "battery,siop_icl_%d", siop_level); ret = of_property_read_u32_array(np, prop_name, (u32 *)pdata->siop_table[i].icl, pdata->siop_curr_type_num); snprintf(prop_name, PROPERTY_NAME_SIZE, "battery,siop_fcc_%d", siop_level); ret = of_property_read_u32_array(np, prop_name, (u32 *)pdata->siop_table[i].fcc, pdata->siop_curr_type_num); for (j = 0; j < pdata->siop_curr_type_num; ++j) pr_info("%s: level=%d, [%d].siop_icl[%d]=%d, [%d].siop_fcc[%d]=%d\n", __func__, pdata->siop_table[i].level, i, j, pdata->siop_table[i].icl[j], i, j, pdata->siop_table[i].fcc[j]); } } } parse_siop_next: return ret; } int sec_bat_parse_dt_lrp( struct sec_battery_info *battery, struct device_node *np, int type) { sec_battery_platform_data_t *pdata = battery->pdata; int ret = 0, len = 0; char prop_name[PROPERTY_NAME_SIZE]; int lrp_table[LRP_PROPS]; snprintf(prop_name, PROPERTY_NAME_SIZE, "battery,temp_table_%s", LRP_TYPE_STRING[type]); len = of_property_count_u32_elems(np, prop_name); if (len != LRP_PROPS) return -1; ret = of_property_read_u32_array(np, prop_name, (u32 *)lrp_table, LRP_PROPS); if (ret) { pr_info("%s: failed to parse %s!!, ret = %d\n", __func__, LRP_TYPE_STRING[type], ret); return ret; } pdata->lrp_temp[type].trig[ST2][LCD_OFF] = lrp_table[0]; pdata->lrp_temp[type].recov[ST2][LCD_OFF] = lrp_table[1]; pdata->lrp_temp[type].trig[ST1][LCD_OFF] = lrp_table[2]; pdata->lrp_temp[type].recov[ST1][LCD_OFF] = lrp_table[3]; pdata->lrp_temp[type].trig[ST2][LCD_ON] = lrp_table[4]; pdata->lrp_temp[type].recov[ST2][LCD_ON] = lrp_table[5]; pdata->lrp_temp[type].trig[ST1][LCD_ON] = lrp_table[6]; pdata->lrp_temp[type].recov[ST1][LCD_ON] = lrp_table[7]; pdata->lrp_curr[type].st_icl[ST1] = lrp_table[8]; pdata->lrp_curr[type].st_fcc[ST1] = lrp_table[9]; pdata->lrp_curr[type].st_icl[ST2] = lrp_table[10]; pdata->lrp_curr[type].st_fcc[ST2] = lrp_table[11]; pr_info("%s: lrp_temp[%s].trig_st1=%d\n", __func__, LRP_TYPE_STRING[type], pdata->lrp_temp[type].trig[ST1][LCD_OFF]); pr_info("%s: lrp_temp[%s].trig_st2=%d\n", __func__, LRP_TYPE_STRING[type], pdata->lrp_temp[type].trig[ST2][LCD_OFF]); pr_info("%s: lrp_temp[%s].recov_st1=%d\n", __func__, LRP_TYPE_STRING[type], pdata->lrp_temp[type].recov[ST1][LCD_OFF]); pr_info("%s: lrp_temp[%s].recov_st2=%d\n", __func__, LRP_TYPE_STRING[type], pdata->lrp_temp[type].recov[ST2][LCD_OFF]); pr_info("%s: lrp_temp[%s].trig_st1_lcdon=%d\n", __func__, LRP_TYPE_STRING[type], pdata->lrp_temp[type].trig[ST1][LCD_ON]); pr_info("%s: lrp_temp[%s].trig_st2_lcdon=%d\n", __func__, LRP_TYPE_STRING[type], pdata->lrp_temp[type].trig[ST2][LCD_ON]); pr_info("%s: lrp_temp[%s].recov_st1_lcdon=%d\n", __func__, LRP_TYPE_STRING[type], pdata->lrp_temp[type].recov[ST1][LCD_ON]); pr_info("%s: lrp_temp[%s].recov_st2_lcdon=%d\n", __func__, LRP_TYPE_STRING[type], pdata->lrp_temp[type].recov[ST2][LCD_ON]); pr_info("%s: lrp_temp[%s].st1_icl=%d\n", __func__, LRP_TYPE_STRING[type], pdata->lrp_curr[type].st_icl[ST1]); pr_info("%s: lrp_temp[%s].st1_fcc=%d\n", __func__, LRP_TYPE_STRING[type], pdata->lrp_curr[type].st_fcc[ST1]); pr_info("%s: lrp_temp[%s].st2_icl=%d\n", __func__, LRP_TYPE_STRING[type], pdata->lrp_curr[type].st_icl[ST2]); pr_info("%s: lrp_temp[%s].st2_fcc=%d\n", __func__, LRP_TYPE_STRING[type], pdata->lrp_curr[type].st_fcc[ST2]); return 0; } /* ret: table size */ static int sec_bat_parse_adc_table(struct device_node *np, char *name, sec_bat_adc_table_data_t **adc_table, int offset) { char adc_str[64], data_str[64]; sec_bat_adc_table_data_t *table; const u32 *p; int i, ret, len = 0; int n_len = strlen(name); strcpy(adc_str, name); strcpy(adc_str+n_len, "temp_table_adc"); p = of_get_property(np, adc_str, &len); if (!p) return 0; len = len / sizeof(u32); table = kcalloc(len, sizeof(sec_bat_adc_table_data_t), GFP_KERNEL); strcpy(data_str, name); strcpy(data_str+n_len, "temp_table_data"); for (i = 0; i < len; i++) { u32 temp; ret = of_property_read_u32_index(np, adc_str, i, &temp); table[i].adc = (offset) ? (offset - (int)temp) : ((int)temp); if (ret) pr_info("%s : %s is Empty\n", __func__, adc_str); ret = of_property_read_u32_index(np, data_str, i, &temp); table[i].data = (int)temp; if (ret) pr_info("%s : %s is Empty\n", __func__, data_str); } *adc_table = table; return len; } __visible_for_testing void sec_bat_parse_thm_info(struct device_node *np, char *name, struct sec_bat_thm_info *info) { char buf[64]; int ret; int n_len = strlen(name); strcpy(buf, name); strcpy(buf+n_len, "thermal_source"); ret = of_property_read_u32(np, buf, &info->source); if (ret) { info->source = SEC_BATTERY_THERMAL_SOURCE_NONE; pr_info("%s : %s is Empty, %d\n", __func__, buf, ret); } strcpy(buf+n_len, "temp_offset"); ret = of_property_read_u32(np, buf, &info->offset); if (ret) pr_info("%s : %s is Empty\n", __func__, buf); info->adc_table_size = sec_bat_parse_adc_table(np, name, &info->adc_table, info->offset); strcpy(buf+n_len, "temp_check_type"); ret = of_property_read_u32(np, buf, &info->check_type); if (ret) pr_info("%s : %s is Empty %d\n", __func__, buf, ret); if (info->source == SEC_BATTERY_THERMAL_SOURCE_ADC) { ret = of_property_read_u32(np, "battery,adc_check_count", &info->check_count); if (ret) pr_info("%s : Adc check count is Empty, %d\n", __func__, ret); } info->test = 0x7FFF; } #if IS_ENABLED(CONFIG_DIRECT_CHARGING) static void sec_bat_parse_dc_thm(struct device_node *np, sec_battery_platform_data_t *pdata) { int ret = 0, len = 0, i = 0; const u32 *p; int len_step = 4; char str[256] = {0, }; sec_bat_parse_thm_info(np, "battery,dchg_", &pdata->dchg_thm_info); pdata->dctp_by_cgtp = of_property_read_bool(np, "battery,dctp_by_cgtp"); pdata->dctp_bootmode_en = of_property_read_bool(np, "battery,dctp_bootmode_en"); pdata->lrpts_by_batts = of_property_read_bool(np, "battery,lrpts_by_batts"); /* dchg_high_temp */ p = of_get_property(np, "battery,dchg_high_temp", &len); if (!p) { pr_info("%s: failed to parse dchg_high_temp!\n", __func__); for (i = 0; i < len_step; i++) pdata->dchg_high_temp[i] = 690; return; } len = len / sizeof(u32); ret = of_property_read_u32_array(np, "battery,dchg_high_temp", pdata->dchg_high_temp, len); if (len != len_step) { pr_err("%s not match size of dchg_high_temp: %d\n", __func__, len); for (i = 1; i < len_step; i++) pdata->dchg_high_temp[i] = pdata->dchg_high_temp[0]; } /* dchg_high_temp_recovery */ p = of_get_property(np, "battery,dchg_high_temp_recovery", &len); if (!p) { pr_info("%s: failed to parse dchg_high_temp_recovery!\n", __func__); for (i = 0; i < len_step; i++) pdata->dchg_high_temp_recovery[i] = 630; } len = len / sizeof(u32); ret = of_property_read_u32_array(np, "battery,dchg_high_temp_recovery", pdata->dchg_high_temp_recovery, len); if (len != len_step) { pr_err("%s not match size of dchg_high_temp_recovery: %d\n", __func__, len); for (i = 1; i < len_step; i++) pdata->dchg_high_temp_recovery[i] = pdata->dchg_high_temp_recovery[0]; } /* dchg_high_batt_temp */ p = of_get_property(np, "battery,dchg_high_batt_temp", &len); if (!p) { pr_info("%s: failed to parse dchg_high_batt_temp!\n", __func__); for (i = 0; i < len_step; i++) pdata->dchg_high_batt_temp[i] = 400; } len = len / sizeof(u32); ret = of_property_read_u32_array(np, "battery,dchg_high_batt_temp", pdata->dchg_high_batt_temp, len); if (len != len_step) { pr_err("%s not match size of dchg_high_batt_temp: %d\n", __func__, len); for (i = 1; i < len_step; i++) pdata->dchg_high_batt_temp[i] = pdata->dchg_high_batt_temp[0]; } /* dchg_high_batt_temp_recovery */ p = of_get_property(np, "battery,dchg_high_batt_temp_recovery", &len); if (!p) { pr_info("%s: failed to parse dchg_high_batt_temp_recovery!\n", __func__); for (i = 0; i < len_step; i++) pdata->dchg_high_batt_temp_recovery[i] = 380; } len = len / sizeof(u32); ret = of_property_read_u32_array(np, "battery,dchg_high_batt_temp_recovery", pdata->dchg_high_batt_temp_recovery, len); if (len != len_step) { pr_err("%s not match size of dchg_high_batt_temp_recovery: %d\n", __func__, len); for (i = 1; i < len_step; i++) pdata->dchg_high_batt_temp_recovery[i] = pdata->dchg_high_batt_temp_recovery[0]; } sprintf(str, "%s: dchg_htemp: ", __func__); for (i = 0; i < len_step; i++) sprintf(str + strlen(str), "%d ", pdata->dchg_high_temp[i]); sprintf(str + strlen(str), ",dchg_htemp_rec: "); for (i = 0; i < len_step; i++) sprintf(str + strlen(str), "%d ", pdata->dchg_high_temp_recovery[i]); sprintf(str + strlen(str), ",dchg_batt_htemp: "); for (i = 0; i < len_step; i++) sprintf(str + strlen(str), "%d ", pdata->dchg_high_batt_temp[i]); sprintf(str + strlen(str), ",dchg_batt_htemp_rec: "); for (i = 0; i < len_step; i++) sprintf(str + strlen(str), "%d ", pdata->dchg_high_batt_temp_recovery[i]); sprintf(str + strlen(str), "\n"); pr_info("%s", str); return; } #else static void sec_bat_parse_dc_thm(struct device_node *np, sec_battery_platform_data_t *pdata) { pr_info("%s: direct charging is not set\n", __func__); } #endif static void sec_bat_parse_health_condition(struct device_node *np, sec_battery_platform_data_t *pdata) { int ret = 0, len = 0; unsigned int i = 0; const u32 *p = of_get_property(np, "battery,health_condition_cycle", &len); len /= sizeof(u32); if (!p || len != BATTERY_HEALTH_MAX) { pdata->health_condition = NULL; pr_err("%s there is not health_condition, len(%d)\n", __func__, len); return; } pdata->health_condition = kzalloc(len*sizeof(battery_health_condition), GFP_KERNEL); for (i = 0; i < len; i++) { ret = of_property_read_u32_index(np, "battery,health_condition_cycle", i, &(pdata->health_condition[i].cycle)); if (ret) break; ret = of_property_read_u32_index(np, "battery,health_condition_asoc", i, &(pdata->health_condition[i].asoc)); if (ret) break; pr_err("%s: [BATTERY_HEALTH] %d: Cycle(~ %d), ASoC(~ %d)\n", __func__, i, pdata->health_condition[i].cycle, pdata->health_condition[i].asoc); } if (ret) { pr_err("%s failed to read battery->pdata->health_condition: %d\n", __func__, ret); kfree(pdata->health_condition); pdata->health_condition = NULL; } } static int sec_bat_parse_age_data_by_offset(struct device_node *np, sec_battery_platform_data_t *pdata) { int ret = 0, len = 0; u32 temp = 0, i = 0, n_len = 0; char *age_data_prefix = "battery,age_data_"; char cycle_str[64]; char full_condition_soc_str[64]; char chg_float_voltage_offset_str[64]; char full_condition_vcell_offset_str[64]; char recharge_condition_vcell_offset_str[64]; #if defined(CONFIG_BATTERY_AGE_FORECAST_B2B) char max_charging_current_offset_str[64]; #endif n_len = strlen(age_data_prefix); strcpy(cycle_str, age_data_prefix); strcpy(cycle_str + n_len, "cycle"); strcpy(full_condition_soc_str, age_data_prefix); strcpy(full_condition_soc_str + n_len, "full_condition_soc"); strcpy(chg_float_voltage_offset_str, age_data_prefix); strcpy(chg_float_voltage_offset_str + n_len, "chg_float_voltage_offset"); strcpy(full_condition_vcell_offset_str, age_data_prefix); strcpy(full_condition_vcell_offset_str + n_len, "full_condition_vcell_offset"); strcpy(recharge_condition_vcell_offset_str, age_data_prefix); strcpy(recharge_condition_vcell_offset_str + n_len, "recharge_condition_vcell_offset"); #if defined(CONFIG_BATTERY_AGE_FORECAST_B2B) strcpy(max_charging_current_offset_str, age_data_prefix); strcpy(max_charging_current_offset_str + n_len, "max_charging_current_offset"); #endif len = of_property_count_u32_elems(np, cycle_str); if (len > 0) { pdata->num_age_step = len; len = of_property_count_u32_elems(np, full_condition_soc_str); if (len != pdata->num_age_step) { pr_info("%s : %s has %d elements - expected %d\n", __func__, full_condition_soc_str, len, pdata->num_age_step); return -EINVAL; } len = of_property_count_u32_elems(np, chg_float_voltage_offset_str); if (len != pdata->num_age_step) { pr_info("%s : %s has %d elements - expected %d\n", __func__, chg_float_voltage_offset_str, len, pdata->num_age_step); return -EINVAL; } len = of_property_count_u32_elems(np, full_condition_vcell_offset_str); if (len != pdata->num_age_step) { pr_info("%s : %s has %d elements - expected %d\n", __func__, full_condition_vcell_offset_str, len, pdata->num_age_step); return -EINVAL; } len = of_property_count_u32_elems(np, recharge_condition_vcell_offset_str); if (len != pdata->num_age_step) { pr_info("%s : %s has %d elements - expected %d\n", __func__, recharge_condition_vcell_offset_str, len, pdata->num_age_step); return -EINVAL; } #if defined(CONFIG_BATTERY_AGE_FORECAST_B2B) len = of_property_count_u32_elems(np, max_charging_current_offset_str); if (len != pdata->num_age_step) { pr_info("%s : %s has %d elements - expected %d\n", __func__, max_charging_current_offset_str, len, pdata->num_age_step); return -EINVAL; } #endif } else { pr_info("%s : Error in Calculating Age Data Table Size - %d\n", __func__, len); return -EINVAL; } pdata->age_data = kzalloc(len * sizeof(sec_age_data_t), GFP_KERNEL); pr_info("%s : Read Age Data Using Offsets - Table Size %d\n", __func__, len); for (i = 0; i < len; i++) { ret = of_property_read_u32_index(np, cycle_str, i, &temp); if (ret) { pr_info("%s : %s is Empty\n", __func__, cycle_str); break; } pdata->age_data[i].cycle = temp; ret = of_property_read_u32_index(np, full_condition_soc_str, i, &temp); if (ret) { pr_info("%s : %s is Empty\n", __func__, full_condition_soc_str); break; } pdata->age_data[i].full_condition_soc = temp; ret = of_property_read_u32_index(np, chg_float_voltage_offset_str, i, &temp); if (ret) { pr_info("%s : %s is Empty\n", __func__, chg_float_voltage_offset_str); break; } pdata->age_data[i].float_voltage = pdata->chg_float_voltage - temp; ret = of_property_read_u32_index(np, full_condition_vcell_offset_str, i, &temp); if (ret) { pr_info("%s : %s is Empty\n", __func__, full_condition_vcell_offset_str); break; } pdata->age_data[i].full_condition_vcell = pdata->full_condition_vcell - temp; ret = of_property_read_u32_index(np, recharge_condition_vcell_offset_str, i, &temp); if (ret) { pr_info("%s : %s is Empty\n", __func__, recharge_condition_vcell_offset_str); break; } pdata->age_data[i].recharge_condition_vcell = pdata->recharge_condition_vcell - temp; #if defined(CONFIG_BATTERY_AGE_FORECAST_B2B) ret = of_property_read_u32_index(np, max_charging_current_offset_str, i, &temp); if (ret) { pr_info("%s : %s is Empty\n", __func__, max_charging_current_offset_str); break; } pdata->age_data[i].max_charging_current = pdata->max_charging_current - temp; #endif } return ret; } static void sec_bat_parse_age_data(struct device_node *np, sec_battery_platform_data_t *pdata) { int ret = 0, len = 0; unsigned int i = 0; const u32 *p; char str[256] = {0, }; bool age_data_by_offset = of_property_read_bool(np, "battery,age_data_by_offset"); pr_info("%s: age_data_by_offset is %s", __func__, (age_data_by_offset ? "true" : "false")); if (age_data_by_offset) { ret = sec_bat_parse_age_data_by_offset(np, pdata); } else { p = of_get_property(np, "battery,age_data", &len); if (p) { pdata->num_age_step = len / sizeof(sec_age_data_t); pdata->age_data = kzalloc(len, GFP_KERNEL); ret = of_property_read_u32_array(np, "battery,age_data", (u32 *)pdata->age_data, len/sizeof(u32)); } } if (ret) { pr_err("%s failed to read battery->pdata->age_data: %d\n", __func__, ret); kfree(pdata->age_data); pdata->age_data = NULL; pdata->num_age_step = 0; } else { pr_err("%s num_age_step : %d\n", __func__, pdata->num_age_step); for (i = 0; i < pdata->num_age_step; ++i) { memset(str, 0x0, sizeof(str)); sprintf(str + strlen(str), "[%d/%d]cycle:%d, float:%d, full_v:%d, recharge_v:%d, soc:%d", i, pdata->num_age_step-1, pdata->age_data[i].cycle, pdata->age_data[i].float_voltage, pdata->age_data[i].full_condition_vcell, pdata->age_data[i].recharge_condition_vcell, pdata->age_data[i].full_condition_soc); #if defined(CONFIG_BATTERY_AGE_FORECAST_B2B) sprintf(str + strlen(str), ", max_c:%d", pdata->age_data[i].max_charging_current); #endif pr_err("%s: %s", __func__, str); } } } int sec_bat_parse_dt(struct device *dev, struct sec_battery_info *battery) { struct device_node *np; sec_battery_platform_data_t *pdata = battery->pdata; int ret = 0, len = 0; unsigned int i = 0; const u32 *p; u32 temp = 0; np = of_find_node_by_name(NULL, "cable-info"); if (!np) { pr_err ("%s : np NULL\n", __func__); } else { struct device_node *child; u32 input_current = 0, charging_current = 0; ret = of_property_read_u32(np, "default_input_current", &input_current); ret = of_property_read_u32(np, "default_charging_current", &charging_current); ret = of_property_read_u32(np, "full_check_current_1st", &pdata->full_check_current_1st); ret = of_property_read_u32(np, "full_check_current_2nd", &pdata->full_check_current_2nd); if (!pdata->full_check_current_2nd) pdata->full_check_current_2nd = pdata->full_check_current_1st; pdata->default_input_current = input_current; pdata->default_charging_current = charging_current; for (i = 0; i < SEC_BATTERY_CABLE_MAX; i++) { pdata->charging_current[i].input_current_limit = (unsigned int)input_current; pdata->charging_current[i].fast_charging_current = (unsigned int)charging_current; } for_each_child_of_node(np, child) { ret = of_property_read_u32(child, "input_current", &input_current); ret = of_property_read_u32(child, "charging_current", &charging_current); p = of_get_property(child, "cable_number", &len); if (!p) return 1; len = len / sizeof(u32); for (i = 0; i <= len; i++) { ret = of_property_read_u32_index(child, "cable_number", i, &temp); pdata->charging_current[temp].input_current_limit = (unsigned int)input_current; pdata->charging_current[temp].fast_charging_current = (unsigned int)charging_current; } } } for (i = 0; i < SEC_BATTERY_CABLE_MAX; i++) { pr_info("%s : CABLE_NUM(%d) INPUT(%d) CHARGING(%d)\n", __func__, i, pdata->charging_current[i].input_current_limit, pdata->charging_current[i].fast_charging_current); } #if IS_ENABLED(CONFIG_WIRELESS_CHARGING) np = of_find_node_by_name(NULL, "wireless-power-info"); if (!np) { pr_err ("%s : np NULL\n", __func__); } else { struct device_node *child; u32 wireless_power_class = 0, vout = 0, input_current_limit = 0, fast_charging_current = 0, ttf_charge_current = 0, rx_power = 0; ret = of_property_read_u32(np, "count", &battery->wc20_info_len); pdata->wireless_power_info = kzalloc(sizeof(sec_wireless_rx_power_info_t) * battery->wc20_info_len, GFP_KERNEL); i = 0; for_each_child_of_node(np, child) { ret = of_property_read_u32(child, "vout", &vout); ret = of_property_read_u32(child, "input_current_limit", &input_current_limit); ret = of_property_read_u32(child, "fast_charging_current", &fast_charging_current); ret = of_property_read_u32(child, "ttf_charge_current", &ttf_charge_current); ret = of_property_read_u32(child, "rx_power", &rx_power); ret = of_property_read_u32(child, "wireless_power_class", &wireless_power_class); pdata->wireless_power_info[i].wireless_power_class = (unsigned int)wireless_power_class; pdata->wireless_power_info[i].vout = (unsigned int)vout; pdata->wireless_power_info[i].input_current_limit = (unsigned int)input_current_limit; pdata->wireless_power_info[i].fast_charging_current = (unsigned int)fast_charging_current; pdata->wireless_power_info[i].ttf_charge_current = (unsigned int)ttf_charge_current; pdata->wireless_power_info[i].rx_power = (unsigned int)rx_power; i++; } for (i = 0; i < battery->wc20_info_len; i++) { pr_info("%s : POWER_LIST(%d) POWER_CLASS(%d) VOUT(%d) INPUT(%d) CHARGING(%d) TTF(%d) POWER(%d)\n", __func__, i, pdata->wireless_power_info[i].wireless_power_class, pdata->wireless_power_info[i].vout, pdata->wireless_power_info[i].input_current_limit, pdata->wireless_power_info[i].fast_charging_current, pdata->wireless_power_info[i].ttf_charge_current, pdata->wireless_power_info[i].rx_power); } } #endif pr_info("%s : TOPOFF_1ST(%d), TOPOFF_2ND(%d)\n", __func__, pdata->full_check_current_1st, pdata->full_check_current_2nd); pdata->default_usb_input_current = pdata->charging_current[SEC_BATTERY_CABLE_USB].input_current_limit; pdata->default_usb_charging_current = pdata->charging_current[SEC_BATTERY_CABLE_USB].fast_charging_current; pdata->default_wc20_input_current = pdata->charging_current[SEC_BATTERY_CABLE_HV_WIRELESS_20].input_current_limit; pdata->default_wc20_charging_current = pdata->charging_current[SEC_BATTERY_CABLE_HV_WIRELESS_20].fast_charging_current; pdata->default_mpp_input_current = pdata->charging_current[SEC_BATTERY_CABLE_WIRELESS_MPP].input_current_limit; pdata->default_mpp_charging_current = pdata->charging_current[SEC_BATTERY_CABLE_WIRELESS_MPP].fast_charging_current; #ifdef CONFIG_SEC_FACTORY pdata->default_charging_current = 1500; pdata->charging_current[SEC_BATTERY_CABLE_TA].fast_charging_current = 1500; #endif np = of_find_node_by_name(NULL, "battery"); if (!np) { pr_info("%s: np NULL\n", __func__); return 1; } ret = of_property_read_u32(np, "battery,battery_full_capacity", &pdata->battery_full_capacity); if (ret) pr_info("%s : battery_full_capacity is Empty\n", __func__); pdata->soc_by_repcap_en = of_property_read_bool(np, "battery,soc_by_repcap_en"); #ifdef CONFIG_SEC_FACTORY ret = of_property_read_u32(np, "battery,factory_chg_limit_max", &pdata->store_mode_charging_max); if (ret) { pr_info("%s :factory_chg_limit_max is Empty\n", __func__); pdata->store_mode_charging_max = 80; } ret = of_property_read_u32(np, "battery,factory_chg_limit_min", &pdata->store_mode_charging_min); if (ret) { pr_info("%s :factory_chg_limit_min is Empty\n", __func__); pdata->store_mode_charging_min = 70; } #else ret = of_property_read_u32(np, "battery,store_mode_charging_max", &pdata->store_mode_charging_max); if (ret) { pr_info("%s :factory_chg_limit_max is Empty\n", __func__); pdata->store_mode_charging_max = 70; } ret = of_property_read_u32(np, "battery,store_mode_charging_min", &pdata->store_mode_charging_min); if (ret) { pr_info("%s :factory_chg_limit_min is Empty\n", __func__); pdata->store_mode_charging_min = 60; } /* VZW's prepaid devices has "VPP" as sales_code, not "VZW" */ if (sales_code_is("VZW") || sales_code_is("VPP")) { pr_info("%s: Sales is VZW or VPP\n", __func__); pdata->store_mode_charging_max = 35; pdata->store_mode_charging_min = 30; } #endif /*CONFIG_SEC_FACTORY */ else { pr_info("%s : battery_full_capacity : %d\n", __func__, pdata->battery_full_capacity); pdata->cisd_cap_high_thr = pdata->battery_full_capacity + 1000; /* battery_full_capacity + 1000 */ pdata->cisd_cap_low_thr = pdata->battery_full_capacity + 500; /* battery_full_capacity + 500 */ pdata->cisd_cap_limit = (pdata->battery_full_capacity * 11) / 10; /* battery_full_capacity + 10% */ } ret = of_property_read_u32(np, "battery,cisd_max_voltage_thr", &pdata->max_voltage_thr); if (ret) { pr_info("%s : cisd_max_voltage_thr is Empty\n", __func__); pdata->max_voltage_thr = 4400; } ret = of_property_read_u32(np, "battery,cisd_alg_index", &pdata->cisd_alg_index); if (ret) { pr_info("%s : cisd_alg_index is Empty. Defalut set to six\n", __func__); pdata->cisd_alg_index = 6; } else { pr_info("%s : set cisd_alg_index : %d\n", __func__, pdata->cisd_alg_index); } ret = of_property_read_u32(np, "battery,expired_time", &temp); if (ret) { pr_info("expired time is empty\n"); pdata->expired_time = 3 * 60 * 60; } else { pdata->expired_time = (unsigned int) temp; } pdata->expired_time *= 1000; battery->expired_time = pdata->expired_time; ret = of_property_read_u32(np, "battery,recharging_expired_time", &temp); if (ret) { pr_info("expired time is empty\n"); pdata->recharging_expired_time = 90 * 60; } else { pdata->recharging_expired_time = (unsigned int) temp; } pdata->recharging_expired_time *= 1000; ret = of_property_read_u32(np, "battery,standard_curr", &pdata->standard_curr); if (ret) { pr_info("standard_curr is empty\n"); pdata->standard_curr = 2150; } ret = of_property_read_string(np, "battery,vendor", (char const **)&pdata->vendor); if (ret) pr_info("%s: Vendor is Empty\n", __func__); ret = of_property_read_string(np, "battery,charger_name", (char const **)&pdata->charger_name); if (ret) pr_info("%s: Charger name is Empty\n", __func__); ret = of_property_read_string(np, "battery,otg_name", (char const **)&pdata->otg_name); if (ret) pr_info("%s: otg_name is Empty\n", __func__); ret = of_property_read_string(np, "battery,fuelgauge_name", (char const **)&pdata->fuelgauge_name); if (ret) pr_info("%s: Fuelgauge name is Empty\n", __func__); ret = of_property_read_string(np, "battery,wireless_charger_name", (char const **)&pdata->wireless_charger_name); if (ret) pr_info("%s: Wireless charger name is Empty\n", __func__); ret = of_property_read_u32(np, "battery,inbat_ocv_type", &pdata->inbat_ocv_type); if (ret) { pr_info("%s : inbat_ocv_type is Empty\n", __func__); pdata->inbat_ocv_type = SEC_BATTERY_OCV_NONE; } ret = of_property_read_string(np, "battery,fgsrc_switch_name", (char const **)&pdata->fgsrc_switch_name); if (ret) { pdata->support_fgsrc_change = false; pr_info("%s: fgsrc_switch_name is Empty\n", __func__); } else { pdata->support_fgsrc_change = true; pdata->inbat_ocv_type = SEC_BATTERY_OCV_FG_SRC_CHANGE; } pdata->dynamic_cv_factor = of_property_read_bool(np, "battery,dynamic_cv_factor"); pdata->slowcharging_usb_bootcomplete = of_property_read_bool(np, "battery,slowcharging_usb_bootcomplete"); ret = of_property_read_string(np, "battery,chip_vendor", (char const **)&pdata->chip_vendor); if (ret) pr_info("%s: Chip vendor is Empty\n", __func__); ret = of_property_read_u32(np, "battery,technology", &pdata->technology); if (ret) pr_info("%s : technology is Empty\n", __func__); ret = of_property_read_u32(np, "battery,wireless_cc_cv", &pdata->wireless_cc_cv); pdata->p2p_cv_headroom = of_property_read_bool(np, "battery,p2p_cv_headroom"); pdata->fake_capacity = of_property_read_bool(np, "battery,fake_capacity"); pdata->bc12_ifcon_wa = of_property_read_bool(np, "battery,bc12_ifcon_wa"); ret = of_property_read_u32(np, "battery,power_value", &pdata->power_value); if (ret) { pdata->power_value = 6000; pr_info("%s : power_value is Empty\n", __func__); } pdata->en_auto_shipmode_temp_ctrl = of_property_read_bool(np, "battery,en_auto_shipmode_temp_ctrl"); pdata->boosting_voltage_aicl = of_property_read_bool(np, "battery,boosting_voltage_aicl"); battery->ta_alert_wa = of_property_read_bool(np, "battery,ta_alert_wa"); #if !defined(CONFIG_SEC_FACTORY) pdata->mass_with_usb_thm = of_property_read_bool(np, "battery,mass_with_usb_thm"); pdata->usb_protection = of_property_read_bool(np, "battery,usb_protection"); #endif p = of_get_property(np, "battery,polling_time", &len); if (!p) return 1; len = len / sizeof(u32); pdata->polling_time = kzalloc(sizeof(*pdata->polling_time) * len, GFP_KERNEL); ret = of_property_read_u32_array(np, "battery,polling_time", pdata->polling_time, len); if (ret) pr_info("%s : battery,polling_time is Empty\n", __func__); ret = of_property_read_u32(np, "battery,temp_check_count", &pdata->temp_check_count); if (ret) pr_info("%s : Temp check count is Empty\n", __func__); sec_bat_parse_thm_info(np, "battery,", &pdata->bat_thm_info); pdata->bat_thm_info.channel = SEC_BAT_ADC_CHANNEL_TEMP; sec_bat_parse_thm_info(np, "battery,usb_", &pdata->usb_thm_info); pdata->usb_thm_info.channel = SEC_BAT_ADC_CHANNEL_USB_TEMP; sec_bat_parse_thm_info(np, "battery,chg_", &pdata->chg_thm_info); pdata->chg_thm_info.channel = SEC_BAT_ADC_CHANNEL_CHG_TEMP; sec_bat_parse_thm_info(np, "battery,wpc_", &pdata->wpc_thm_info); pdata->wpc_thm_info.channel = SEC_BAT_ADC_CHANNEL_WPC_TEMP; sec_bat_parse_thm_info(np, "battery,sub_bat_", &pdata->sub_bat_thm_info); pdata->sub_bat_thm_info.channel = SEC_BAT_ADC_CHANNEL_SUB_BAT_TEMP; sec_bat_parse_thm_info(np, "battery,blkt_", &pdata->blk_thm_info); pdata->blk_thm_info.channel = SEC_BAT_ADC_CHANNEL_BLKT_TEMP; ret = of_property_read_u32(np, "battery,adc_read_type", &pdata->adc_read_type); if (ret || (pdata->adc_read_type != SEC_BATTERY_ADC_PROCESSED && pdata->adc_read_type != SEC_BATTERY_ADC_RAW)) { pdata->adc_read_type = SEC_BATTERY_ADC_PROCESSED; pr_info("%s : adc_read_type is default (processed)\n", __func__); } else { pr_info("%s : adc_read_type is %s\n", __func__, (pdata->adc_read_type ? "raw" : "proc.")); } /* parse dc thm info */ sec_bat_parse_dc_thm(np, pdata); ret = of_property_read_u32(np, "battery,d2d_check_type", &pdata->d2d_check_type); if (ret) { pdata->d2d_check_type = SB_D2D_NONE; pr_info("%s : d2d_check_type is Empty\n", __func__); } pdata->support_vpdo = of_property_read_bool(np, "battery,support_vpdo"); ret = of_property_read_u32(np, "battery,lrp_temp_check_type", &pdata->lrp_temp_check_type); if (ret) pr_info("%s : lrp_temp_check_type is Empty\n", __func__); if (pdata->lrp_temp_check_type) { for (i = 0; i < LRP_MAX; i++) { if (sec_bat_parse_dt_lrp(battery, np, i) < 0) { pdata->lrp_temp[i].trig[ST1][LCD_OFF] = 375; pdata->lrp_temp[i].trig[ST2][LCD_OFF] = 375; pdata->lrp_temp[i].recov[ST1][LCD_OFF] = 365; pdata->lrp_temp[i].recov[ST2][LCD_OFF] = 365; pdata->lrp_temp[i].trig[ST1][LCD_ON] = 375; pdata->lrp_temp[i].trig[ST2][LCD_ON] = 375; pdata->lrp_temp[i].recov[ST1][LCD_ON] = 365; pdata->lrp_temp[i].recov[ST2][LCD_ON] = 365; pdata->lrp_curr[i].st_icl[0] = pdata->default_input_current; pdata->lrp_curr[i].st_fcc[0] = pdata->default_charging_current; pdata->lrp_curr[i].st_icl[1] = pdata->default_input_current; pdata->lrp_curr[i].st_fcc[1] = pdata->default_charging_current; } } pdata->sc_LRP_25W = of_property_read_bool(np, "battery,sc_LRP_25W"); } /* mix temp v2 */ pdata->enable_mix_v2 = of_property_read_bool(np, "battery,enable_mix_v2"); ret = of_property_read_u32(np, "battery,mix_v2_lrp_recov", &pdata->mix_v2_lrp_recov); if (ret) { pr_info("%s : mix_v2_lrp_recov is Empty\n", __func__); pdata->mix_v2_lrp_recov = 0; } ret = of_property_read_u32(np, "battery,mix_v2_lrp_cond", &pdata->mix_v2_lrp_cond); if (ret) { pr_info("%s : mix_v2_lrp_cond is Empty\n", __func__); pdata->mix_v2_lrp_cond = 0; } ret = of_property_read_u32(np, "battery,mix_v2_bat_cond", &pdata->mix_v2_bat_cond); if (ret) { pr_info("%s : mix_v2_bat_cond is Empty\n", __func__); pdata->mix_v2_bat_cond = 0; } ret = of_property_read_u32(np, "battery,mix_v2_chg_cond", &pdata->mix_v2_chg_cond); if (ret) { pr_info("%s : mix_v2_chg_cond is Empty\n", __func__); pdata->mix_v2_chg_cond = 0; } #if IS_ENABLED(CONFIG_DIRECT_CHARGING) ret = of_property_read_u32(np, "battery,mix_v2_dchg_cond", &pdata->mix_v2_dchg_cond); if (ret) { pr_info("%s : mix_v2_dchg_cond is Empty\n", __func__); pdata->mix_v2_dchg_cond = 0; } #else pr_info("%s : mix_v2_dchg_cond is not supported\n", __func__); pdata->mix_v2_dchg_cond = 0; #endif /* mix temp v2 */ if (pdata->chg_thm_info.check_type) { ret = of_property_read_u32(np, "battery,chg_12v_high_temp", &temp); pdata->chg_12v_high_temp = (int)temp; if (ret) pr_info("%s : chg_12v_high_temp is Empty\n", __func__); ret = of_property_read_u32(np, "battery,chg_high_temp", &temp); pdata->chg_high_temp = (int)temp; if (ret) pr_info("%s : chg_high_temp is Empty\n", __func__); ret = of_property_read_u32(np, "battery,chg_high_temp_recovery", &temp); pdata->chg_high_temp_recovery = (int)temp; if (ret) pr_info("%s : chg_temp_recovery is Empty\n", __func__); ret = of_property_read_u32(np, "battery,chg_charging_limit_current", &pdata->chg_charging_limit_current); if (ret) pr_info("%s : chg_charging_limit_current is Empty\n", __func__); ret = of_property_read_u32(np, "battery,chg_input_limit_current", &pdata->chg_input_limit_current); if (ret) pr_info("%s : chg_input_limit_current is Empty\n", __func__); ret = of_property_read_u32(np, "battery,dchg_charging_limit_current", &pdata->dchg_charging_limit_current); if (ret) { pr_info("%s : dchg_charging_limit_current is Empty\n", __func__); pdata->dchg_charging_limit_current = pdata->chg_charging_limit_current; } ret = of_property_read_u32(np, "battery,dchg_input_limit_current", &pdata->dchg_input_limit_current); if (ret) { pr_info("%s : dchg_input_limit_current is Empty\n", __func__); pdata->dchg_input_limit_current = pdata->chg_input_limit_current; } ret = of_property_read_u32(np, "battery,mix_high_temp", &temp); pdata->mix_high_temp = (int)temp; if (ret) pr_info("%s : mix_high_temp is Empty\n", __func__); ret = of_property_read_u32(np, "battery,mix_high_chg_temp", &temp); pdata->mix_high_chg_temp = (int)temp; if (ret) pr_info("%s : mix_high_chg_temp is Empty\n", __func__); ret = of_property_read_u32(np, "battery,mix_high_temp_recovery", &temp); pdata->mix_high_temp_recovery = (int)temp; if (ret) pr_info("%s : mix_high_temp_recovery is Empty\n", __func__); } if (pdata->wpc_thm_info.check_type) { ret = of_property_read_u32(np, "battery,sub_temp_control_source", &pdata->sub_temp_control_source); if (ret) { pr_info("%s : sub_temp_control_source is Empty\n", __func__); pdata->sub_temp_control_source = TEMP_CONTROL_SOURCE_BAT_THM; } ret = of_property_read_u32(np, "battery,wpc_temp_control_source", &pdata->wpc_temp_control_source); if (ret) { pr_info("%s : wpc_temp_control_source is Empty\n", __func__); pdata->wpc_temp_control_source = TEMP_CONTROL_SOURCE_CHG_THM; } ret = of_property_read_u32(np, "battery,wpc_temp_lcd_on_control_source", &pdata->wpc_temp_lcd_on_control_source); if (ret) { pr_info("%s : wpc_temp_lcd_on_control_source is Empty\n", __func__); pdata->wpc_temp_lcd_on_control_source = TEMP_CONTROL_SOURCE_CHG_THM; } ret = of_property_read_u32(np, "battery,wpc_high_temp", &pdata->wpc_high_temp); if (ret) pr_info("%s : wpc_high_temp is Empty\n", __func__); ret = of_property_read_u32(np, "battery,wpc_high_temp_recovery", &pdata->wpc_high_temp_recovery); if (ret) pr_info("%s : wpc_high_temp_recovery is Empty\n", __func__); ret = of_property_read_u32(np, "battery,wpc_high_temp_12w", &pdata->wpc_high_temp_12w); if (ret) { pr_info("%s : wpc_high_temp_12w is Empty\n", __func__); pdata->wpc_high_temp_12w = pdata->wpc_high_temp; } ret = of_property_read_u32(np, "battery,wpc_high_temp_recovery_12w", &pdata->wpc_high_temp_recovery_12w); if (ret) { pr_info("%s : wpc_high_temp_recovery_12w is Empty\n", __func__); pdata->wpc_high_temp_recovery_12w = pdata->wpc_high_temp_recovery; } ret = of_property_read_u32(np, "battery,wpc_high_temp_15w", &pdata->wpc_high_temp_15w); if (ret) { pr_info("%s : wpc_high_temp_15w is Empty\n", __func__); pdata->wpc_high_temp_15w = pdata->wpc_high_temp; } ret = of_property_read_u32(np, "battery,wpc_high_temp_recovery_15w", &pdata->wpc_high_temp_recovery_15w); if (ret) { pr_info("%s : wpc_high_temp_recovery_15w is Empty\n", __func__); pdata->wpc_high_temp_recovery_15w = pdata->wpc_high_temp_recovery; } pdata->wpc_high_check_using_lrp = of_property_read_bool(np, "battery,wpc_high_check_using_lrp"); if (pdata->wpc_high_check_using_lrp) { ret = of_property_read_u32(np, "battery,wpc_lrp_high_temp", &pdata->wpc_lrp_high_temp); if (ret) pr_info("%s : wpc_lrp_high_temp is Empty\n", __func__); ret = of_property_read_u32(np, "battery,wpc_lrp_high_temp_recovery", &pdata->wpc_lrp_high_temp_recovery); if (ret) pr_info("%s : wpc_lrp_high_temp_recovery is Empty\n", __func__); ret = of_property_read_u32(np, "battery,wpc_lrp_high_temp_12w", &pdata->wpc_lrp_high_temp_12w); if (ret) { pr_info("%s : wpc_lrp_high_temp_12w is Empty\n", __func__); pdata->wpc_lrp_high_temp_12w = pdata->wpc_lrp_high_temp; } ret = of_property_read_u32(np, "battery,wpc_lrp_high_temp_recovery_12w", &pdata->wpc_lrp_high_temp_recovery_12w); if (ret) { pr_info("%s : wpc_lrp_high_temp_recovery_12w is Empty\n", __func__); pdata->wpc_lrp_high_temp_recovery_12w = pdata->wpc_lrp_high_temp_recovery; } ret = of_property_read_u32(np, "battery,wpc_lrp_high_temp_15w", &pdata->wpc_lrp_high_temp_15w); if (ret) { pr_info("%s : wpc_lrp_high_temp_15w is Empty\n", __func__); pdata->wpc_lrp_high_temp_15w = pdata->wpc_lrp_high_temp; } ret = of_property_read_u32(np, "battery,wpc_lrp_high_temp_recovery_15w", &pdata->wpc_lrp_high_temp_recovery_15w); if (ret) { pr_info("%s : wpc_lrp_high_temp_recovery_15w is Empty\n", __func__); pdata->wpc_lrp_high_temp_recovery_15w = pdata->wpc_lrp_high_temp_recovery; } } pdata->enable_check_wpc_temp_v2 = of_property_read_bool(np, "battery,enable_check_wpc_temp_v2"); if (pdata->enable_check_wpc_temp_v2) { ret = of_property_read_u32(np, "battery,wpc_temp_v2_cond", &pdata->wpc_temp_v2_cond); if (ret) { pr_info("%s : wpc_temp_v2_cond is Empty\n", __func__); pdata->wpc_temp_v2_cond = 0; } ret = of_property_read_u32(np, "battery,wpc_temp_v2_cond_12w", &pdata->wpc_temp_v2_cond_12w); if (ret) { pr_info("%s : wpc_temp_v2_cond_12w is Empty\n", __func__); pdata->wpc_temp_v2_cond_12w = pdata->wpc_temp_v2_cond; } ret = of_property_read_u32(np, "battery,wpc_temp_v2_cond_15w", &pdata->wpc_temp_v2_cond_15w); if (ret) { pr_info("%s : wpc_temp_v2_cond_15w is Empty\n", __func__); pdata->wpc_temp_v2_cond_15w = pdata->wpc_temp_v2_cond; } if (pdata->wpc_high_check_using_lrp) { ret = of_property_read_u32(np, "battery,wpc_lrp_temp_v2_cond", &pdata->wpc_lrp_temp_v2_cond); if (ret) { pr_info("%s : wpc_lrp_temp_v2_cond is Empty\n", __func__); pdata->wpc_lrp_temp_v2_cond = 0; } ret = of_property_read_u32(np, "battery,wpc_lrp_temp_v2_cond_12w", &pdata->wpc_lrp_temp_v2_cond_12w); if (ret) { pr_info("%s : wpc_lrp_temp_v2_cond_12w is Empty\n", __func__); pdata->wpc_lrp_temp_v2_cond_12w = pdata->wpc_lrp_temp_v2_cond; } ret = of_property_read_u32(np, "battery,wpc_lrp_temp_v2_cond_15w", &pdata->wpc_lrp_temp_v2_cond_15w); if (ret) { pr_info("%s : wpc_lrp_temp_v2_cond_15w is Empty\n", __func__); pdata->wpc_lrp_temp_v2_cond_15w = pdata->wpc_lrp_temp_v2_cond; } } } ret = of_property_read_u32(np, "battery,wpc_lcd_on_high_temp", &pdata->wpc_lcd_on_high_temp); if (ret) { pr_info("%s : wpc_lcd_on_high_temp is Empty\n", __func__); pdata->wpc_lcd_on_high_temp = pdata->wpc_high_temp; } ret = of_property_read_u32(np, "battery,wpc_lcd_on_high_temp_rec", &pdata->wpc_lcd_on_high_temp_rec); if (ret) { pr_info("%s : wpc_lcd_on_high_temp_rec is Empty\n", __func__); pdata->wpc_lcd_on_high_temp_rec = pdata->wpc_high_temp_recovery; } ret = of_property_read_u32(np, "battery,wpc_lcd_on_high_temp_12w", &pdata->wpc_lcd_on_high_temp_12w); if (ret) { pr_info("%s : wpc_lcd_on_high_temp_12w is Empty\n", __func__); pdata->wpc_lcd_on_high_temp_12w = pdata->wpc_high_temp_12w; } ret = of_property_read_u32(np, "battery,wpc_lcd_on_high_temp_rec_12w", &pdata->wpc_lcd_on_high_temp_rec_12w); if (ret) { pr_info("%s : wpc_lcd_on_high_temp_rec_12w is Empty\n", __func__); pdata->wpc_lcd_on_high_temp_rec_12w = pdata->wpc_high_temp_recovery_12w; } ret = of_property_read_u32(np, "battery,wpc_lcd_on_high_temp_15w", &pdata->wpc_lcd_on_high_temp_15w); if (ret) { pr_info("%s : wpc_lcd_on_high_temp_15w is Empty\n", __func__); pdata->wpc_lcd_on_high_temp_15w = pdata->wpc_high_temp_15w; } ret = of_property_read_u32(np, "battery,wpc_lcd_on_high_temp_rec_15w", &pdata->wpc_lcd_on_high_temp_rec_15w); if (ret) { pr_info("%s : wpc_lcd_on_high_temp_rec_15w is Empty\n", __func__); pdata->wpc_lcd_on_high_temp_rec_15w = pdata->wpc_high_temp_recovery_15w; } ret = of_property_read_u32(np, "battery,wpc_input_limit_current", &pdata->wpc_input_limit_current); if (ret) pr_info("%s : wpc_input_limit_current is Empty\n", __func__); ret = of_property_read_u32(np, "battery,wpc_charging_limit_current", &pdata->wpc_charging_limit_current); if (ret) pr_info("%s : wpc_charging_limit_current is Empty\n", __func__); ret = of_property_read_u32(np, "battery,wpc_lcd_on_input_limit_current", &pdata->wpc_lcd_on_input_limit_current); if (ret) { pr_info("%s : wpc_lcd_on_input_limit_current is Empty\n", __func__); pdata->wpc_lcd_on_input_limit_current = pdata->wpc_input_limit_current; } pdata->wpc_vout_ctrl_lcd_on = of_property_read_bool(np, "battery,wpc_vout_ctrl_lcd_on"); if (pdata->wpc_vout_ctrl_lcd_on) { ret = of_property_read_u32(np, "battery,wpc_flicker_wa_input_limit_current", &pdata->wpc_flicker_wa_input_limit_current); if (ret) pr_info("%s : wpc_flicker_wa_input_limit_current is Empty\n", __func__); } len = of_property_count_u32_elems(np, "battery,wpc_step_limit_temp"); if (len > 0) { pdata->wpc_step_limit_size = len; len = of_property_count_u32_elems(np, "battery,wpc_step_limit_fcc"); if (pdata->wpc_step_limit_size != len) { pr_err("%s: not matched, wpc_step_limit_temp is %d, wpc_step_limit_fcc is %d\n", __func__, pdata->wpc_step_limit_size, len); pdata->wpc_step_limit_size = 0; } else { pdata->wpc_step_limit_temp = kcalloc(pdata->wpc_step_limit_size, sizeof(unsigned int), GFP_KERNEL); ret = of_property_read_u32_array(np, "battery,wpc_step_limit_temp", (u32 *)pdata->wpc_step_limit_temp, pdata->wpc_step_limit_size); if (ret < 0) { pr_err("%s failed to read battery,wpc_step_limit_temp: %d\n", __func__, ret); kfree(pdata->wpc_step_limit_temp); pdata->wpc_step_limit_temp = NULL; } pdata->wpc_step_limit_fcc = kcalloc(pdata->wpc_step_limit_size, sizeof(unsigned int), GFP_KERNEL); ret = of_property_read_u32_array(np, "battery,wpc_step_limit_fcc", (u32 *)pdata->wpc_step_limit_fcc, pdata->wpc_step_limit_size); if (ret < 0) { pr_err("%s failed to read battery,wpc_step_limit_fcc: %d\n", __func__, ret); kfree(pdata->wpc_step_limit_fcc); pdata->wpc_step_limit_fcc = NULL; } if (!pdata->wpc_step_limit_temp || !pdata->wpc_step_limit_fcc) { pdata->wpc_step_limit_size = 0; } else { for (i = 0; i < pdata->wpc_step_limit_size; ++i) { pr_info("%s: wpc_step temp:%d, fcc:%d\n", __func__, pdata->wpc_step_limit_temp[i], pdata->wpc_step_limit_fcc[i]); } } } len = of_property_count_u32_elems(np, "battery,wpc_step_limit_fcc_12w"); if (pdata->wpc_step_limit_size != len) { pr_err("%s: not matched, wpc_step_limit_temp is %d, wpc_step_limit_fcc_12w is %d\n", __func__, pdata->wpc_step_limit_size, len); pdata->wpc_step_limit_fcc_12w = kcalloc(pdata->wpc_step_limit_size, sizeof(unsigned int), GFP_KERNEL); for (i = 0; i < pdata->wpc_step_limit_size; ++i) { pdata->wpc_step_limit_fcc_12w[i] = pdata->wpc_step_limit_fcc[i]; pr_info("%s: wpc_step temp:%d, fcc_12w:%d\n", __func__, pdata->wpc_step_limit_temp[i], pdata->wpc_step_limit_fcc_12w[i]); } } else { pdata->wpc_step_limit_fcc_12w = kcalloc(pdata->wpc_step_limit_size, sizeof(unsigned int), GFP_KERNEL); ret = of_property_read_u32_array(np, "battery,wpc_step_limit_fcc_12w", (u32 *)pdata->wpc_step_limit_fcc_12w, pdata->wpc_step_limit_size); if (ret < 0) { pr_err("%s failed to read battery,wpc_step_limit_fcc_12w: %d\n", __func__, ret); for (i = 0; i < pdata->wpc_step_limit_size; ++i) { pdata->wpc_step_limit_fcc_12w[i] = pdata->wpc_step_limit_fcc[i]; pr_info("%s: wpc_step temp:%d, fcc_12w:%d\n", __func__, pdata->wpc_step_limit_temp[i], pdata->wpc_step_limit_fcc_12w[i]); } } else { for (i = 0; i < pdata->wpc_step_limit_size; ++i) { pr_info("%s: wpc_step temp:%d, fcc_12w:%d\n", __func__, pdata->wpc_step_limit_temp[i], pdata->wpc_step_limit_fcc_12w[i]); } } } len = of_property_count_u32_elems(np, "battery,wpc_step_limit_fcc_15w"); if (pdata->wpc_step_limit_size != len) { pr_err("%s: not matched, wpc_step_limit_temp is %d, wpc_step_limit_fcc_15w is %d\n", __func__, pdata->wpc_step_limit_size, len); pdata->wpc_step_limit_fcc_15w = kcalloc(pdata->wpc_step_limit_size, sizeof(unsigned int), GFP_KERNEL); for (i = 0; i < pdata->wpc_step_limit_size; ++i) { pdata->wpc_step_limit_fcc_15w[i] = pdata->wpc_step_limit_fcc[i]; pr_info("%s: wpc_step temp:%d, fcc_15w:%d\n", __func__, pdata->wpc_step_limit_temp[i], pdata->wpc_step_limit_fcc_15w[i]); } } else { pdata->wpc_step_limit_fcc_15w = kcalloc(pdata->wpc_step_limit_size, sizeof(unsigned int), GFP_KERNEL); ret = of_property_read_u32_array(np, "battery,wpc_step_limit_fcc_15w", (u32 *)pdata->wpc_step_limit_fcc_15w, pdata->wpc_step_limit_size); if (ret < 0) { pr_err("%s failed to read battery,wpc_step_limit_fcc_15w: %d\n", __func__, ret); for (i = 0; i < pdata->wpc_step_limit_size; ++i) { pdata->wpc_step_limit_fcc_15w[i] = pdata->wpc_step_limit_fcc[i]; pr_info("%s: wpc_step temp:%d, fcc_15w:%d\n", __func__, pdata->wpc_step_limit_temp[i], pdata->wpc_step_limit_fcc_15w[i]); } } else { for (i = 0; i < pdata->wpc_step_limit_size; ++i) { pr_info("%s: wpc_step temp:%d, fcc_15w:%d\n", __func__, pdata->wpc_step_limit_temp[i], pdata->wpc_step_limit_fcc_15w[i]); } } } } else { pdata->wpc_step_limit_size = 0; pr_info("%s : wpc_step_limit_temp is Empty. len(%d), wpc_step_limit_size(%d)\n", __func__, len, pdata->wpc_step_limit_size); } } ret = of_property_read_u32(np, "battery,wc_full_input_limit_current", &pdata->wc_full_input_limit_current); if (ret) pr_info("%s : wc_full_input_limit_current is Empty\n", __func__); ret = of_property_read_u32(np, "battery,wc_hero_stand_cc_cv", &pdata->wc_hero_stand_cc_cv); if (ret) { pr_info("%s : wc_hero_stand_cc_cv is Empty\n", __func__); pdata->wc_hero_stand_cc_cv = 70; } ret = of_property_read_u32(np, "battery,wc_hero_stand_cv_current", &pdata->wc_hero_stand_cv_current); if (ret) { pr_info("%s : wc_hero_stand_cv_current is Empty\n", __func__); pdata->wc_hero_stand_cv_current = 600; } ret = of_property_read_u32(np, "battery,wc_hero_stand_hv_cv_current", &pdata->wc_hero_stand_hv_cv_current); if (ret) { pr_info("%s : wc_hero_stand_hv_cv_current is Empty\n", __func__); pdata->wc_hero_stand_hv_cv_current = 450; } ret = of_property_read_u32(np, "battery,sleep_mode_limit_current", &pdata->sleep_mode_limit_current); if (ret) pr_info("%s : sleep_mode_limit_current is Empty\n", __func__); ret = of_property_read_u32(np, "battery,inbat_voltage", &pdata->inbat_voltage); if (ret) pr_info("%s : inbat_voltage is Empty\n", __func__); if (pdata->inbat_voltage) { p = of_get_property(np, "battery,inbat_voltage_table_adc", &len); if (!p) return 1; len = len / sizeof(u32); pdata->inbat_adc_table_size = len; pdata->inbat_adc_table = kzalloc(sizeof(sec_bat_adc_table_data_t) * pdata->inbat_adc_table_size, GFP_KERNEL); for (i = 0; i < pdata->inbat_adc_table_size; i++) { ret = of_property_read_u32_index(np, "battery,inbat_voltage_table_adc", i, &temp); pdata->inbat_adc_table[i].adc = (int)temp; if (ret) pr_info("%s : inbat_adc_table(adc) is Empty\n", __func__); ret = of_property_read_u32_index(np, "battery,inbat_voltage_table_data", i, &temp); pdata->inbat_adc_table[i].data = (int)temp; if (ret) pr_info("%s : inbat_adc_table(data) is Empty\n", __func__); } } ret = of_property_read_u32(np, "battery,pre_afc_input_current", &pdata->pre_afc_input_current); if (ret) { pr_info("%s : pre_afc_input_current is Empty\n", __func__); pdata->pre_afc_input_current = 1000; } ret = of_property_read_u32(np, "battery,select_pd_input_current", &pdata->select_pd_input_current); if (ret) { pr_info("%s : select_pd_input_current is Empty\n", __func__); pdata->select_pd_input_current = 1000; } ret = of_property_read_u32(np, "battery,pre_afc_work_delay", &pdata->pre_afc_work_delay); if (ret) { pr_info("%s : pre_afc_work_delay is Empty\n", __func__); pdata->pre_afc_work_delay = 2000; } ret = of_property_read_u32(np, "battery,pre_wc_afc_input_current", &pdata->pre_wc_afc_input_current); if (ret) { pr_info("%s : pre_wc_afc_input_current is Empty\n", __func__); pdata->pre_wc_afc_input_current = 500; /* wc input default */ } ret = of_property_read_u32(np, "battery,pre_wc_afc_work_delay", &pdata->pre_wc_afc_work_delay); if (ret) { pr_info("%s : pre_wc_afc_work_delay is Empty\n", __func__); pdata->pre_wc_afc_work_delay = 4000; } ret = of_property_read_u32(np, "battery,select_pd_input_current", &pdata->select_pd_input_current); if (ret) { pr_info("%s : select_pd_input_current is Empty\n", __func__); pdata->select_pd_input_current = 1000; } ret = of_property_read_u32(np, "battery,tx_stop_capacity", &pdata->tx_stop_capacity); if (ret) { pr_info("%s : tx_stop_capacity is Empty\n", __func__); pdata->tx_stop_capacity = 30; } ret = of_property_read_u32(np, "battery,adc_check_count", &pdata->adc_check_count); if (ret) pr_info("%s : Adc check count is Empty\n", __func__); ret = of_property_read_u32(np, "battery,cable_check_type", &pdata->cable_check_type); if (ret) pr_info("%s : Cable check type is Empty\n", __func__); ret = of_property_read_u32(np, "battery,cable_source_type", &pdata->cable_source_type); if (ret) pr_info("%s: Cable_source_type is Empty\n", __func__); #if defined(CONFIG_CHARGING_VZWCONCEPT) pdata->cable_check_type &= ~SEC_BATTERY_CABLE_CHECK_NOUSBCHARGE; pdata->cable_check_type |= SEC_BATTERY_CABLE_CHECK_NOINCOMPATIBLECHARGE; #endif ret = of_property_read_u32(np, "battery,polling_type", &pdata->polling_type); if (ret) pr_info("%s : Polling type is Empty\n", __func__); ret = of_property_read_u32(np, "battery,monitor_initial_count", &pdata->monitor_initial_count); if (ret) pr_info("%s : Monitor initial count is Empty\n", __func__); ret = of_property_read_u32(np, "battery,battery_check_type", &pdata->battery_check_type); if (ret) pr_info("%s : Battery check type is Empty\n", __func__); ret = of_property_read_u32(np, "battery,check_count", &pdata->check_count); if (ret) pr_info("%s : Check count is Empty\n", __func__); ret = of_property_read_u32(np, "battery,check_adc_max", &pdata->check_adc_max); if (ret) pr_info("%s : Check adc max is Empty\n", __func__); ret = of_property_read_u32(np, "battery,check_adc_min", &pdata->check_adc_min); if (ret) pr_info("%s : Check adc min is Empty\n", __func__); ret = of_property_read_u32(np, "battery,ovp_uvlo_check_type", &pdata->ovp_uvlo_check_type); if (ret) pr_info("%s : Ovp Uvlo check type is Empty\n", __func__); ret = of_property_read_u32(np, "battery,overheatlimit_threshold", &temp); battery->overheatlimit_threshold = (int)temp; if (ret) { pr_info("%s : overheatlimit_threshold is Empty\n", __func__); battery->overheatlimit_threshold = 700; } ret = of_property_read_u32(np, "battery,overheatlimit_recovery", &temp); battery->overheatlimit_recovery = (int)temp; if (ret) { pr_info("%s : overheatlimit_recovery is Empty\n", __func__); battery->overheatlimit_recovery = 680; } ret = of_property_read_u32(np, "battery,usb_protection_temp", &temp); battery->usb_protection_temp = (int)temp; if (ret) { pr_info("%s : usb protection temp value is Empty\n", __func__); battery->usb_protection_temp = 610; } ret = of_property_read_u32(np, "battery,temp_gap_bat_usb", &temp); battery->temp_gap_bat_usb = (int)temp; if (ret) { pr_info("%s : temp gap value is Empty\n", __func__); battery->temp_gap_bat_usb = 200; } ret = of_property_read_u32(np, "battery,wire_warm_overheat_thresh", &temp); pdata->wire_warm_overheat_thresh = (int)temp; if (ret) { pr_info("%s : wire_warm_overheat_thresh is Empty\n", __func__); pdata->wire_warm_overheat_thresh = 500; } ret = of_property_read_u32(np, "battery,wire_normal_warm_thresh", &temp); pdata->wire_normal_warm_thresh = (int)temp; if (ret) { pr_info("%s : wire_normal_warm_thresh is Empty\n", __func__); pdata->wire_normal_warm_thresh = 420; } ret = of_property_read_u32(np, "battery,wire_cool1_normal_thresh", &temp); pdata->wire_cool1_normal_thresh = (int)temp; if (ret) { pr_info("%s : wire_cool1_normal_thresh is Empty\n", __func__); pdata->wire_cool1_normal_thresh = 180; } ret = of_property_read_u32(np, "battery,wire_cool2_cool1_thresh", &temp); pdata->wire_cool2_cool1_thresh = (int)temp; if (ret) { pr_info("%s : wire_cool2_cool1_thresh is Empty\n", __func__); pdata->wire_cool2_cool1_thresh = 150; } ret = of_property_read_u32(np, "battery,wire_cool3_cool2_thresh", &temp); pdata->wire_cool3_cool2_thresh = (int)temp; if (ret) { pr_info("%s : wire_cool3_cool2_thresh is Empty\n", __func__); pdata->wire_cool3_cool2_thresh = 50; } ret = of_property_read_u32(np, "battery,wire_cold_cool3_thresh", &temp); pdata->wire_cold_cool3_thresh = (int)temp; if (ret) { pr_info("%s : wire_cold_cool3_thresh is Empty\n", __func__); pdata->wire_cold_cool3_thresh = 0; } ret = of_property_read_u32(np, "battery,wireless_warm_overheat_thresh", &temp); pdata->wireless_warm_overheat_thresh = (int)temp; if (ret) { pr_info("%s : wireless_warm_overheat_thresh is Empty\n", __func__); pdata->wireless_warm_overheat_thresh = 450; } ret = of_property_read_u32(np, "battery,wireless_normal_warm_thresh", &temp); pdata->wireless_normal_warm_thresh = (int)temp; if (ret) { pr_info("%s : wireless_normal_warm_thresh is Empty\n", __func__); pdata->wireless_normal_warm_thresh = 410; } ret = of_property_read_u32(np, "battery,wireless_cool1_normal_thresh", &temp); pdata->wireless_cool1_normal_thresh = (int)temp; if (ret) { pr_info("%s : wireless_cool1_normal_thresh is Empty\n", __func__); pdata->wireless_cool1_normal_thresh = 180; } ret = of_property_read_u32(np, "battery,wireless_cool2_cool1_thresh", &temp); pdata->wireless_cool2_cool1_thresh = (int)temp; if (ret) { pr_info("%s : wireless_cool2_cool1_thresh is Empty\n", __func__); pdata->wireless_cool2_cool1_thresh = 150; } ret = of_property_read_u32(np, "battery,wireless_cool3_cool2_thresh", &temp); pdata->wireless_cool3_cool2_thresh = (int)temp; if (ret) { pr_info("%s : wireless_cool3_cool2_thresh is Empty\n", __func__); pdata->wireless_cool3_cool2_thresh = 50; } ret = of_property_read_u32(np, "battery,wireless_cold_cool3_thresh", &temp); pdata->wireless_cold_cool3_thresh = (int)temp; if (ret) { pr_info("%s : wireless_cold_cool3_thresh is Empty\n", __func__); pdata->wireless_cold_cool3_thresh = 0; } ret = of_property_read_u32(np, "battery,wire_warm_current", &temp); pdata->wire_warm_current = (int)temp; if (ret) { pr_info("%s : wire_warm_current is Empty\n", __func__); pdata->wire_warm_current = 500; } ret = of_property_read_u32(np, "battery,wire_cool1_current", &temp); pdata->wire_cool1_current = (int)temp; if (ret) { pr_info("%s : wire_cool1_current is Empty\n", __func__); pdata->wire_cool1_current = 500; } ret = of_property_read_u32(np, "battery,wire_cool2_current", &temp); pdata->wire_cool2_current = (int)temp; if (ret) { pr_info("%s : wire_cool2_current is Empty\n", __func__); pdata->wire_cool2_current = 500; } ret = of_property_read_u32(np, "battery,wire_cool3_current", &temp); pdata->wire_cool3_current = (int)temp; if (ret) { pr_info("%s : wire_cool3_current is Empty\n", __func__); pdata->wire_cool3_current = 500; } ret = of_property_read_u32(np, "battery,wireless_warm_current", &temp); pdata->wireless_warm_current = (int)temp; if (ret) { pr_info("%s : wireless_warm_current is Empty\n", __func__); pdata->wireless_warm_current = 500; } ret = of_property_read_u32(np, "battery,wireless_cool1_current", &temp); pdata->wireless_cool1_current = (int)temp; if (ret) { pr_info("%s : wireless_cool1_current is Empty\n", __func__); pdata->wireless_cool1_current = 500; } ret = of_property_read_u32(np, "battery,wireless_cool2_current", &temp); pdata->wireless_cool2_current = (int)temp; if (ret) { pr_info("%s : wireless_cool2_current is Empty\n", __func__); pdata->wireless_cool2_current = 500; } ret = of_property_read_u32(np, "battery,wireless_cool3_current", &temp); pdata->wireless_cool3_current = (int)temp; if (ret) { pr_info("%s : wireless_cool3_current is Empty\n", __func__); pdata->wireless_cool3_current = 500; } #if IS_ENABLED(CONFIG_DUAL_BATTERY) ret = of_property_read_u32(np, "battery,limiter_main_warm_current", &pdata->limiter_main_warm_current); if (ret) pr_info("%s: limiter_main_warm_current is Empty\n", __func__); ret = of_property_read_u32(np, "battery,limiter_sub_warm_current", &pdata->limiter_sub_warm_current); if (ret) pr_info("%s: limiter_sub_warm_current is Empty\n", __func__); ret = of_property_read_u32(np, "battery,limiter_main_cool1_current", &pdata->limiter_main_cool1_current); if (ret) pr_info("%s: limiter_main_cool1_current is Empty\n", __func__); ret = of_property_read_u32(np, "battery,limiter_sub_cool1_current", &pdata->limiter_sub_cool1_current); if (ret) pr_info("%s: limiter_sub_cool1_current is Empty\n", __func__); ret = of_property_read_u32(np, "battery,limiter_main_cool2_current", &pdata->limiter_main_cool2_current); if (ret) pr_info("%s: limiter_main_cool2_current is Empty\n", __func__); ret = of_property_read_u32(np, "battery,limiter_sub_cool2_current", &pdata->limiter_sub_cool2_current); if (ret) pr_info("%s: limiter_sub_cool2_current is Empty\n", __func__); ret = of_property_read_u32(np, "battery,limiter_main_cool3_current", &pdata->limiter_main_cool3_current); if (ret) pr_info("%s: limiter_main_cool3_current is Empty\n", __func__); ret = of_property_read_u32(np, "battery,limiter_sub_cool3_current", &pdata->limiter_sub_cool3_current); if (ret) pr_info("%s: limiter_sub_cool3_current is Empty\n", __func__); ret = of_property_read_u32(np, "battery,limiter_aging_float_offset", &pdata->limiter_aging_float_offset); if (ret) pr_info("%s: limiter_aging_float_offset is Empty\n", __func__); #endif ret = of_property_read_u32(np, "battery,high_temp_float", &temp); pdata->high_temp_float = (int)temp; if (ret) { pr_info("%s : high_temp_float is Empty\n", __func__); pdata->high_temp_float = 4150; } ret = of_property_read_u32(np, "battery,low_temp_float", &temp); pdata->low_temp_float = (int)temp; if (ret) { pr_info("%s : low_temp_float is Empty\n", __func__); pdata->low_temp_float = 4350; } ret = of_property_read_u32(np, "battery,low_temp_cool3_float", &temp); pdata->low_temp_cool3_float = (int)temp; if (ret) { pr_info("%s : low_temp_cool3_float is Empty\n", __func__); pdata->low_temp_cool3_float = pdata->low_temp_float; } ret = of_property_read_u32(np, "battery,buck_recovery_margin", &temp); pdata->buck_recovery_margin = (int)temp; if (ret) { pr_info("%s : buck_recovery_margin is Empty\n", __func__); pdata->buck_recovery_margin = 50; } ret = of_property_read_u32(np, "battery,recharge_condition_vcell", &pdata->recharge_condition_vcell); if (ret) { pr_info("%s : recharge_condition_vcell is Empty\n", __func__); pdata->recharge_condition_vcell = 4270; } ret = of_property_read_u32(np, "battery,swelling_high_rechg_voltage", &temp); pdata->swelling_high_rechg_voltage = (int)temp; if (ret) { pr_info("%s : swelling_high_rechg_voltage is Empty\n", __func__); pdata->swelling_high_rechg_voltage = 4000; } ret = of_property_read_u32(np, "battery,swelling_low_rechg_voltage", &temp); pdata->swelling_low_rechg_voltage = (int)temp; if (ret) { pr_info("%s : swelling_low_rechg_voltage is Empty\n", __func__); pdata->swelling_low_rechg_voltage = 4200; } ret = of_property_read_u32(np, "battery,swelling_low_rechg_soc", &pdata->swelling_low_rechg_soc); if (ret) { pr_info("%s : swelling_low_rechg_soc is Empty\n", __func__); pdata->swelling_low_rechg_soc = 90; } ret = of_property_read_u32(np, "battery,swelling_low_cool3_rechg_voltage", &temp); pdata->swelling_low_cool3_rechg_voltage = (int)temp; if (ret) { pr_info("%s : swelling_low_cool3_rechg_voltage is Empty\n", __func__); pdata->swelling_low_cool3_rechg_voltage = pdata->swelling_low_rechg_voltage; } pdata->chgen_over_swell_rechg_vol = of_property_read_bool(np, "battery,chgen_over_swell_rechg_vol"); pr_info("%s: chgen_over_swell_rechg_vol %s.\n", __func__, pdata->chgen_over_swell_rechg_vol ? "Enabled" : "Disabled"); ret = of_property_read_u32(np, "battery,tx_high_threshold", &temp); pdata->tx_high_threshold = (int)temp; if (ret) { pr_info("%s : tx_high_threshold is Empty\n", __func__); pdata->tx_high_threshold = 450; } ret = of_property_read_u32(np, "battery,tx_high_recovery", &temp); pdata->tx_high_recovery = (int)temp; if (ret) { pr_info("%s : tx_high_recovery is Empty\n", __func__); pdata->tx_high_recovery = 400; } ret = of_property_read_u32(np, "battery,tx_low_threshold", &temp); pdata->tx_low_threshold = (int)temp; if (ret) { pr_info("%s : tx_low_threshold is Empty\n", __func__); pdata->tx_low_recovery = 0; } ret = of_property_read_u32(np, "battery,tx_low_recovery", &temp); pdata->tx_low_recovery = (int)temp; if (ret) { pr_info("%s : tx_low_recovery is Empty\n", __func__); pdata->tx_low_recovery = 50; } ret = of_property_read_u32(np, "battery,icl_by_tx_gear", &pdata->icl_by_tx_gear); if (ret) pr_info("%s : icl_by_tx_gear is Empty\n", __func__); ret = of_property_read_u32(np, "battery,fcc_by_tx", &pdata->fcc_by_tx); if (ret) pr_info("%s : fcc_by_tx is Empty\n", __func__); ret = of_property_read_u32(np, "battery,fcc_by_tx_gear", &pdata->fcc_by_tx_gear); if (ret) pr_info("%s : fcc_by_tx_gear is Empty\n", __func__); ret = of_property_read_u32(np, "battery,wpc_input_limit_by_tx_check", &pdata->wpc_input_limit_by_tx_check); if (ret) pr_info("%s : wpc_input_limit_by_tx_check is Empty\n", __func__); if (pdata->wpc_input_limit_by_tx_check) { ret = of_property_read_u32(np, "battery,wpc_input_limit_current_by_tx", &pdata->wpc_input_limit_current_by_tx); if (ret) { pr_info("%s : wpc_input_limit_current_by_tx is Empty\n", __func__); pdata->wpc_input_limit_current_by_tx = pdata->wpc_input_limit_current; } } ret = of_property_read_u32(np, "battery,full_check_type", &pdata->full_check_type); if (ret) pr_info("%s : Full check type is Empty\n", __func__); ret = of_property_read_u32(np, "battery,full_check_type_2nd", &pdata->full_check_type_2nd); if (ret) pr_info("%s : Full check type 2nd is Empty\n", __func__); ret = of_property_read_u32(np, "battery,full_check_count", &pdata->full_check_count); if (ret) pr_info("%s : Full check count is Empty\n", __func__); ret = of_property_read_u32(np, "battery,chg_gpio_full_check", &pdata->chg_gpio_full_check); if (ret) pr_info("%s : Chg gpio full check is Empty\n", __func__); ret = of_property_read_u32(np, "battery,chg_polarity_full_check", &pdata->chg_polarity_full_check); if (ret) pr_info("%s : Chg polarity full check is Empty\n", __func__); ret = of_property_read_u32(np, "battery,full_condition_type", &pdata->full_condition_type); if (ret) pr_info("%s : Full condition type is Empty\n", __func__); ret = of_property_read_u32(np, "battery,full_condition_soc", &pdata->full_condition_soc); if (ret) pr_info("%s : Full condition soc is Empty\n", __func__); ret = of_property_read_u32(np, "battery,full_condition_vcell", &pdata->full_condition_vcell); if (ret) pr_info("%s : Full condition vcell is Empty\n", __func__); ret = of_property_read_u32(np, "battery,recharge_check_count", &pdata->recharge_check_count); if (ret) pr_info("%s : Recharge check count is Empty\n", __func__); ret = of_property_read_u32(np, "battery,recharge_condition_type", &pdata->recharge_condition_type); if (ret) pr_info("%s : Recharge condition type is Empty\n", __func__); ret = of_property_read_u32(np, "battery,recharge_condition_soc", &pdata->recharge_condition_soc); if (ret) pr_info("%s : Recharge condition soc is Empty\n", __func__); ret = of_property_read_u32(np, "battery,charging_reset_time", (unsigned int *)&pdata->charging_reset_time); if (ret) pr_info("%s : Charging reset time is Empty\n", __func__); ret = of_property_read_u32(np, "battery,chg_float_voltage", (unsigned int *)&pdata->chg_float_voltage); if (ret) { pr_info("%s: chg_float_voltage is Empty\n", __func__); pdata->chg_float_voltage = 43500; } ret = of_property_read_u32(np, "battery,chg_float_voltage_conv", &pdata->chg_float_voltage_conv); if (ret) { pr_info("%s: chg_float_voltage_conv is Empty\n", __func__); pdata->chg_float_voltage_conv = 1; } sec_bat_parse_age_data(np, battery->pdata); sec_bat_parse_health_condition(np, battery->pdata); sec_bat_parse_dt_siop(battery, np); ret = of_property_read_u32(np, "battery,wireless_otg_input_current", &pdata->wireless_otg_input_current); if (ret) pdata->wireless_otg_input_current = WIRELESS_OTG_INPUT_CURRENT; ret = of_property_read_u32(np, "battery,max_input_voltage", &pdata->max_input_voltage); if (ret) pdata->max_input_voltage = 20000; ret = of_property_read_u32(np, "battery,max_input_current", &pdata->max_input_current); if (ret) pdata->max_input_current = 3000; ret = of_property_read_u32(np, "battery,pd_charging_charge_power", &pdata->pd_charging_charge_power); if (ret) { pr_err("%s: pd_charging_charge_power is Empty\n", __func__); pdata->pd_charging_charge_power = 15000; } pdata->support_fpdo_dc = of_property_read_bool(np, "battery,support_fpdo_dc"); if (pdata->support_fpdo_dc) { ret = of_property_read_u32(np, "battery,fpdo_dc_charge_power", &pdata->fpdo_dc_charge_power); if (ret) { pr_err("%s: fpdo_dc_charge_power is Empty\n", __func__); pdata->fpdo_dc_charge_power = 15000; } } ret = of_property_read_u32(np, "battery,rp_current_rp1", &pdata->rp_current_rp1); if (ret) { pr_err("%s: rp_current_rp1 is Empty\n", __func__); pdata->rp_current_rp1 = 500; } ret = of_property_read_u32(np, "battery,rp_current_rp2", &pdata->rp_current_rp2); if (ret) { pr_err("%s: rp_current_rp2 is Empty\n", __func__); pdata->rp_current_rp2 = 1500; } ret = of_property_read_u32(np, "battery,rp_current_rp3", &pdata->rp_current_rp3); if (ret) { pr_err("%s: rp_current_rp3 is Empty\n", __func__); pdata->rp_current_rp3 = 3000; } ret = of_property_read_u32(np, "battery,rp_current_rdu_rp3", &pdata->rp_current_rdu_rp3); if (ret) { pr_err("%s: rp_current_rdu_rp3 is Empty\n", __func__); pdata->rp_current_rdu_rp3 = 2100; } ret = of_property_read_u32(np, "battery,rp_current_abnormal_rp3", &pdata->rp_current_abnormal_rp3); if (ret) { pr_err("%s: rp_current_abnormal_rp3 is Empty\n", __func__); pdata->rp_current_abnormal_rp3 = 1800; } ret = of_property_read_u32(np, "battery,nv_charge_power", &pdata->nv_charge_power); if (ret) { pr_err("%s: nv_charge_power is Empty\n", __func__); pdata->nv_charge_power = mW_by_mVmA(SEC_INPUT_VOLTAGE_5V, pdata->default_input_current); } ret = of_property_read_u32(np, "battery,tx_minduty_default", &pdata->tx_minduty_default); if (ret) { pdata->tx_minduty_default = 20; pr_err("%s: tx minduty is Empty. set %d\n", __func__, pdata->tx_minduty_default); } ret = of_property_read_u32(np, "battery,tx_minduty_5V", &pdata->tx_minduty_5V); if (ret) { pdata->tx_minduty_5V = 50; pr_err("%s: tx minduty 5V is Empty. set %d\n", __func__, pdata->tx_minduty_5V); } ret = of_property_read_u32(np, "battery,tx_ping_duty_default", &pdata->tx_ping_duty_default); if (ret) { pdata->tx_ping_duty_default = 0; pr_err("%s: tx ping duty default is not changed (disabled) %d\n", __func__, pdata->tx_ping_duty_default); } ret = of_property_read_u32(np, "battery,tx_ping_duty_no_ta", &pdata->tx_ping_duty_no_ta); if (ret) { pdata->tx_ping_duty_no_ta = pdata->tx_ping_duty_default; pr_err("%s: tx ping duty no TA is default %d\n", __func__, pdata->tx_ping_duty_no_ta); } if (pdata->tx_ping_duty_default) pr_info("%s : tx_ping_duty_default: %d, tx_ping_duty_no_ta: %d\n", __func__, pdata->tx_ping_duty_default, pdata->tx_ping_duty_no_ta); ret = of_property_read_u32(np, "battery,tx_uno_vout", &pdata->tx_uno_vout); if (ret) { pdata->tx_uno_vout = WC_TX_VOUT_7500MV; pr_err("%s: tx uno vout is Empty. set %d\n", __func__, pdata->tx_uno_vout); } ret = of_property_read_u32(np, "battery,tx_ping_vout", &pdata->tx_ping_vout); if (ret) { pdata->tx_ping_vout = WC_TX_VOUT_5000MV; pr_err("%s: tx ping vout is Empty. set %d\n", __func__, pdata->tx_ping_vout); } ret = of_property_read_u32(np, "battery,tx_gear_vout", &pdata->tx_gear_vout); if (ret) { pdata->tx_gear_vout = WC_TX_VOUT_5000MV; pr_info("%s : tx gear vout is Empty. set %d\n", __func__, pdata->tx_gear_vout); } ret = of_property_read_u32(np, "battery,tx_buds_vout", &pdata->tx_buds_vout); if (ret) { pdata->tx_buds_vout = pdata->tx_uno_vout; // battery,tx_buds_vout in dt is not mandatory pr_info("%s : tx buds vout is Empty. set %d\n", __func__, pdata->tx_buds_vout); } ret = of_property_read_u32(np, "battery,tx_uno_iout", &pdata->tx_uno_iout); if (ret) { pdata->tx_uno_iout = 1500; pr_err("%s: tx uno iout is Empty. set %d\n", __func__, pdata->tx_uno_iout); } ret = of_property_read_u32(np, "battery,tx_uno_iout_gear", &pdata->tx_uno_iout_gear); if (ret) { pdata->tx_uno_iout_gear = pdata->tx_uno_iout; pr_err("%s: tx_uno_iout_gear is Empty. set %d\n", __func__, pdata->tx_uno_iout); } ret = of_property_read_u32(np, "battery,tx_uno_iout_aov_gear", &pdata->tx_uno_iout_aov_gear); if (ret) { pdata->tx_uno_iout_aov_gear = pdata->tx_uno_iout_gear; pr_err("%s: tx_uno_iout_aov_gear is Empty. set %d\n", __func__, pdata->tx_uno_iout_gear); } ret = of_property_read_u32(np, "battery,tx_mfc_iout_gear", &pdata->tx_mfc_iout_gear); if (ret) { pdata->tx_mfc_iout_gear = 1500; pr_err("%s: tx mfc iout gear is Empty. set %d\n", __func__, pdata->tx_mfc_iout_gear); } ret = of_property_read_u32(np, "battery,tx_mfc_iout_aov_gear", &pdata->tx_mfc_iout_aov_gear); if (ret) { pdata->tx_mfc_iout_aov_gear = pdata->tx_mfc_iout_gear; pr_err("%s: tx_mfc_iout_aov_gear is Empty. set %d\n", __func__, pdata->tx_mfc_iout_gear); } ret = of_property_read_u32(np, "battery,tx_mfc_iout_phone", &pdata->tx_mfc_iout_phone); if (ret) { pdata->tx_mfc_iout_phone = 1100; pr_err("%s: tx mfc iout phone is Empty. set %d\n", __func__, pdata->tx_mfc_iout_phone); } ret = of_property_read_u32(np, "battery,tx_mfc_iout_phone_5v", &pdata->tx_mfc_iout_phone_5v); if (ret) { pdata->tx_mfc_iout_phone_5v = 300; pr_err("%s: tx mfc iout phone 5v is Empty. set %d\n", __func__, pdata->tx_mfc_iout_phone_5v); } ret = of_property_read_u32(np, "battery,tx_mfc_iout_lcd_on", &pdata->tx_mfc_iout_lcd_on); if (ret) { pdata->tx_mfc_iout_lcd_on = 900; pr_err("%s: tx mfc iout lcd on is Empty. set %d\n", __func__, pdata->tx_mfc_iout_lcd_on); } pdata->tx_5v_disable = of_property_read_bool(np, "battery,tx_5v_disable"); pr_info("%s: 5V TA power sharing is %s.\n", __func__, pdata->tx_5v_disable ? "Disabled" : "Enabled"); ret = of_property_read_u32(np, "battery,phm_vout_ctrl_dev", &pdata->phm_vout_ctrl_dev); if (ret < 0) { pr_info("%s: fail to read phm_vout_ctrl_dev\n", __func__); pdata->phm_vout_ctrl_dev = 0; } pr_info("%s: phm_vout_ctrl_dev = %d\n", __func__, pdata->phm_vout_ctrl_dev); ret = of_property_read_u32(np, "battery,tx_aov_start_vout", &pdata->tx_aov_start_vout); if (ret) { pdata->tx_aov_start_vout = WC_TX_VOUT_6000MV; pr_err("%s: tx aov start vout is Empty. set %d\n", __func__, pdata->tx_aov_start_vout); } ret = of_property_read_u32(np, "battery,tx_aov_freq_low", &pdata->tx_aov_freq_low); if (ret) { pdata->tx_aov_freq_low = 125; pr_err("%s: tx aov freq low is Empty. set %d\n", __func__, pdata->tx_aov_freq_low); } ret = of_property_read_u32(np, "battery,tx_aov_freq_high", &pdata->tx_aov_freq_high); if (ret) { pdata->tx_aov_freq_high = 147; pr_err("%s: tx aov freq high is Empty. set %d\n", __func__, pdata->tx_aov_freq_high); } ret = of_property_read_u32(np, "battery,tx_aov_delay", &pdata->tx_aov_delay); if (ret) { pdata->tx_aov_delay = 3000; pr_err("%s: tx aov dealy is Empty. set %d\n", __func__, pdata->tx_aov_delay); } ret = of_property_read_u32(np, "battery,tx_aov_delay_phm_escape", &pdata->tx_aov_delay_phm_escape); if (ret) { pdata->tx_aov_delay_phm_escape = 4000; pr_err("%s: tx aov dealy phm escape is Empty. set %d\n", __func__, pdata->tx_aov_delay_phm_escape); } pdata->wpc_warm_fod = of_property_read_bool(np, "battery,wpc_warm_fod"); pr_info("%s: WPC Warm FOD %s.\n", __func__, pdata->wpc_warm_fod ? "Enabled" : "Disabled"); /* Default setting 100mA */ if (pdata->wpc_warm_fod) { ret = of_property_read_u32(np, "battery,wpc_warm_fod_icc", &pdata->wpc_warm_fod_icc); if (ret) pdata->wpc_warm_fod_icc = 100; } pdata->lr_enable = of_property_read_bool(np, "battery,lr_enable"); if (pdata->lr_enable) { ret = of_property_read_u32(np, "battery,lr_param_bat_thm", &pdata->lr_param_bat_thm); if (ret) pdata->lr_param_bat_thm = 420; ret = of_property_read_u32(np, "battery,lr_param_sub_bat_thm", &pdata->lr_param_sub_bat_thm); if (ret) pdata->lr_param_sub_bat_thm = 580; ret = of_property_read_u32(np, "battery,lr_delta", &pdata->lr_delta); if (ret) pdata->lr_delta = 16; ret = of_property_read_u32(np, "battery,lr_param_init_bat_thm", &pdata->lr_param_init_bat_thm); if (ret) pdata->lr_param_init_bat_thm = 70; ret = of_property_read_u32(np, "battery,lr_param_init_sub_bat_thm", &pdata->lr_param_init_sub_bat_thm); if (ret) pdata->lr_param_init_sub_bat_thm = 30; ret = of_property_read_u32(np, "battery,lr_round_off", &pdata->lr_round_off); if (ret) pdata->lr_round_off = 500; } pr_info("%s: vendor : %s, technology : %d, cable_check_type : %d\n" "cable_source_type : %d, polling_type: %d\n" "initial_count : %d, check_count : %d\n" "battery_check_type : %d, check_adc_max : %d, check_adc_min : %d\n" "ovp_uvlo_check_type : %d, thermal_source : %d\n" "temp_check_type : %d, temp_check_count : %d, nv_charge_power : %d\n" "full_condition_type : %d, recharge_condition_type : %d, full_check_type : %d\n", __func__, pdata->vendor, pdata->technology,pdata->cable_check_type, pdata->cable_source_type, pdata->polling_type, pdata->monitor_initial_count, pdata->check_count, pdata->battery_check_type, pdata->check_adc_max, pdata->check_adc_min, pdata->ovp_uvlo_check_type, pdata->bat_thm_info.source, pdata->bat_thm_info.check_type, pdata->temp_check_count, pdata->nv_charge_power, pdata->full_condition_type, pdata->recharge_condition_type, pdata->full_check_type ); ret = of_property_read_u32(np, "battery,batt_temp_adj_gap_inc", &pdata->batt_temp_adj_gap_inc); if (ret) { pr_err("%s: batt_temp_adj_gap_inc is Empty\n", __func__); pdata->batt_temp_adj_gap_inc = 0; } ret = of_property_read_u32(np, "battery,change_FV_after_full", &pdata->change_FV_after_full); if (ret) { pr_err("%s: change_FV_after_full is Empty\n", __func__); pdata->change_FV_after_full = 0; } pdata->loosened_unknown_temp = of_property_read_bool(np, "battery,loosened_unknown_temp"); #if defined(CONFIG_STEP_CHARGING) sec_step_charging_init(battery, dev); #endif ret = of_property_read_u32(np, "battery,max_charging_current", &pdata->max_charging_current); if (ret) { pr_err("%s: max_charging_current is Empty\n", __func__); pdata->max_charging_current = 3000; } ret = of_property_read_u32(np, "battery,max_charging_charge_power", &pdata->max_charging_charge_power); if (ret) { pr_err("%s: max_charging_charge_power is Empty\n", __func__); pdata->max_charging_charge_power = 25000; } ret = of_property_read_u32(np, "battery,apdo_max_volt", &pdata->apdo_max_volt); if (ret) { pr_err("%s: apdo_max_volt is Empty\n", __func__); pdata->apdo_max_volt = 11000; /* 11v */ } #if IS_ENABLED(CONFIG_DUAL_BATTERY) ret = of_property_read_string(np, "battery,dual_battery_name", (char const **)&pdata->dual_battery_name); if (ret) pr_info("%s: Dual battery name is Empty\n", __func__); np = of_find_node_by_name(NULL, "sec-dual-battery"); if (!np) { pr_info("%s: np NULL\n", __func__); } else { /* zone1 current ratio, 0C ~ 0.4C */ ret = of_property_read_u32(np, "battery,zone1_limiter_current", &pdata->zone1_limiter_current); if (ret) { pr_err("%s: zone1_limiter_current is Empty\n", __func__); pdata->zone1_limiter_current = 100; } ret = of_property_read_u32(np, "battery,main_zone1_current_rate", &pdata->main_zone1_current_rate); if (ret) { pr_err("%s: main_zone1_current_rate is Empty\n", __func__); pdata->main_zone1_current_rate = 50; } ret = of_property_read_u32(np, "battery,sub_zone1_current_rate", &pdata->sub_zone1_current_rate); if (ret) { pr_err("%s: sub_zone1_current_rate is Empty\n", __func__); pdata->sub_zone1_current_rate = 60; } /* zone2 current ratio, 0.4C ~ 1.1C */ ret = of_property_read_u32(np, "battery,zone2_limiter_current", &pdata->zone2_limiter_current); if (ret) { pr_err("%s: zone2_limiter_current is Empty\n", __func__); pdata->zone2_limiter_current = 1200; } ret = of_property_read_u32(np, "battery,main_zone2_current_rate", &pdata->main_zone2_current_rate); if (ret) { pr_err("%s: main_zone2_current_rate is Empty\n", __func__); pdata->main_zone2_current_rate = 50; } ret = of_property_read_u32(np, "battery,sub_zone2_current_rate", &pdata->sub_zone2_current_rate); if (ret) { pr_err("%s: sub_zone2_current_rate is Empty\n", __func__); pdata->sub_zone2_current_rate = 60; } /* zone3 current ratio, 1.1C ~ MAX */ ret = of_property_read_u32(np, "battery,zone3_limiter_current", &pdata->zone3_limiter_current); if (ret) { pr_err("%s: zone3_limiter_current is Empty\n", __func__); pdata->zone3_limiter_current = 3000; } ret = of_property_read_u32(np, "battery,main_zone3_current_rate", &pdata->main_zone3_current_rate); if (ret) { pr_err("%s: main_zone3_current_rate is Empty\n", __func__); pdata->main_zone3_current_rate = pdata->main_zone2_current_rate; } ret = of_property_read_u32(np, "battery,sub_zone3_current_rate", &pdata->sub_zone3_current_rate); if (ret) { pr_err("%s: sub_zone3_current_rate is Empty\n", __func__); pdata->sub_zone3_current_rate = pdata->sub_zone2_current_rate; } ret = of_property_read_u32(np, "battery,force_recharge_margin", &pdata->force_recharge_margin); if (ret) { pr_err("%s: force_recharge_margin is Empty\n", __func__); pdata->force_recharge_margin = 150; } ret = of_property_read_u32(np, "battery,max_main_limiter_current", &pdata->max_main_limiter_current); if (ret) { pr_err("%s: max_main_limiter_current is Empty\n", __func__); pdata->max_main_limiter_current = 1550; } ret = of_property_read_u32(np, "battery,min_main_limiter_current", &pdata->min_main_limiter_current); if (ret) { pr_err("%s: min_main_limiter_current is Empty\n", __func__); pdata->min_main_limiter_current = 450; } ret = of_property_read_u32(np, "battery,max_sub_limiter_current", &pdata->max_sub_limiter_current); if (ret) { pr_err("%s: max_sub_limiter_current is Empty\n", __func__); pdata->max_sub_limiter_current = 1300; } ret = of_property_read_u32(np, "battery,min_sub_limiter_current", &pdata->min_sub_limiter_current); if (ret) { pr_err("%s: min_sub_limiter_current is Empty\n", __func__); pdata->min_sub_limiter_current = 450; } pdata->main_fto = of_property_read_bool(np, "battery,main_fto"); pdata->sub_fto = of_property_read_bool(np, "battery,sub_fto"); if (pdata->main_fto) { ret = of_property_read_u32(np, "battery,main_fto_current_thresh", &pdata->main_fto_current_thresh); if (ret) { pr_err("%s: main_fto_current_thresh is Empty\n", __func__); pdata->main_fto_current_thresh = pdata->zone3_limiter_current; } } if (pdata->sub_fto) { ret = of_property_read_u32(np, "battery,sub_fto_current_thresh", &pdata->sub_fto_current_thresh); if (ret) { pr_err("%s: sub_fto_current_thresh is Empty\n", __func__); pdata->sub_fto_current_thresh = pdata->zone3_limiter_current; } } pr_info("%s : main ratio:%d(zn1) %d(zn2) %d(zn3), sub ratio:%d(zn1) %d(zn2) %d(zn3), recharge marging:%d, " "max main curr:%d, min main curr:%d, max sub curr:%d, min sub curr:%d, main_fto:%d, sub_fto:%d, " "main_fto_curr:%d, sub_fto_curr:%d\n", __func__, pdata->main_zone1_current_rate, pdata->main_zone2_current_rate, pdata->main_zone3_current_rate, pdata->sub_zone1_current_rate, pdata->sub_zone2_current_rate, pdata->sub_zone3_current_rate, pdata->force_recharge_margin, pdata->max_main_limiter_current, pdata->min_main_limiter_current, pdata->max_sub_limiter_current, pdata->min_sub_limiter_current, pdata->main_fto, pdata->sub_fto, pdata->main_fto_current_thresh, pdata->sub_fto_current_thresh); ret = of_property_read_string(np, "battery,main_current_limiter", (char const **)&battery->pdata->main_limiter_name); if (ret) pr_err("%s: main_current_limiter is Empty\n", __func__); else { np = of_find_node_by_name(NULL, battery->pdata->main_limiter_name); if (!np) { pr_info("%s: main_limiter_name is Empty\n", __func__); } else { /* MAIN_BATTERY_SW_EN */ ret = pdata->main_bat_enb_gpio = of_get_named_gpio(np, "limiter,main_bat_enb_gpio", 0); if (ret < 0) pr_info("%s : can't get main_bat_enb_gpio\n", __func__); /* MAIN_BATTERY_SW_EN2 */ ret = pdata->main_bat_enb2_gpio = of_get_named_gpio(np, "limiter,main_bat_enb2_gpio", 0); if (ret < 0) pr_info("%s : can't get main_bat_enb2_gpio\n", __func__); } } np = of_find_node_by_name(NULL, "sec-dual-battery"); ret = of_property_read_string(np, "battery,sub_current_limiter", (char const **)&battery->pdata->sub_limiter_name); if (ret) pr_err("%s: sub_current_limiter is Empty\n", __func__); else { np = of_find_node_by_name(NULL, battery->pdata->sub_limiter_name); if (!np) { pr_info("%s: sub_limiter_name is Empty\n", __func__); } else { /* SUB_BATTERY_SW_EN */ ret = pdata->sub_bat_enb_gpio = of_get_named_gpio(np, "limiter,sub_bat_enb_gpio", 0); if (ret < 0) pr_info("%s : can't get sub_bat_enb_gpio\n", __func__); } } } np = of_find_node_by_name(NULL, "battery"); #if IS_ENABLED(CONFIG_DUAL_FUELGAUGE) ret = of_property_read_string(np, "battery,dual_fuelgauge_name", (char const **)&pdata->dual_fuelgauge_name); if (ret) pr_info("%s: Dual fuelgauge name is Empty\n", __func__); np = of_find_node_by_name(NULL, "sec-dual-fuelgauge"); if (!np) { pr_info("%s: np NULL\n", __func__); } else { ret = of_property_read_u32(np, "battery,main_design_capacity", &pdata->main_design_capacity); if (ret) pr_err("%s: main_design_capacity is Empty\n", __func__); ret = of_property_read_u32(np, "battery,sub_design_capacity", &pdata->sub_design_capacity); if (ret) pr_err("%s: sub_design_capacity is Empty\n", __func__); } ret = of_property_read_string(np, "battery,main_fuelgauge_name", (char const **)&battery->pdata->main_fuelgauge_name); if (ret) pr_err("%s: main_fuelgauge_name is Empty\n", __func__); ret = of_property_read_string(np, "battery,sub_fuelgauge_name", (char const **)&battery->pdata->sub_fuelgauge_name); if (ret) pr_err("%s: sub_fuelgauge_name is Empty\n", __func__); np = of_find_node_by_name(NULL, "battery"); #endif #endif p = of_get_property(np, "battery,ignore_cisd_index", &len); pdata->ignore_cisd_index = kzalloc(sizeof(*pdata->ignore_cisd_index) * 2, GFP_KERNEL); if (p) { len = len / sizeof(u32); ret = of_property_read_u32_array(np, "battery,ignore_cisd_index", pdata->ignore_cisd_index, len); if (ret) pr_err("%s failed to read ignore_cisd_index: %d\n", __func__, ret); } else { pr_info("%s : battery,ignore_cisd_index is Empty\n", __func__); } p = of_get_property(np, "battery,ignore_cisd_index_d", &len); pdata->ignore_cisd_index_d = kzalloc(sizeof(*pdata->ignore_cisd_index_d) * 2, GFP_KERNEL); if (p) { len = len / sizeof(u32); ret = of_property_read_u32_array(np, "battery,ignore_cisd_index_d", pdata->ignore_cisd_index_d, len); if (ret) pr_err("%s failed to read ignore_cisd_index_d: %d\n", __func__, ret); } else { pr_info("%s : battery,ignore_cisd_index_d is Empty\n", __func__); } pdata->support_usb_conn_check = of_property_read_bool(np, "battery,support_usb_conn_check"); pr_info("%s: support_usb_conn_check(%d)\n", __func__, pdata->support_usb_conn_check); ret = of_property_read_u32(np, "battery,usb_conn_slope_avg", &pdata->usb_conn_slope_avg); if (ret) { pdata->usb_conn_slope_avg = 9; /* 0.9 degrees */ pr_err("%s: usb_conn_slope_avg is default: %d\n", __func__, pdata->usb_conn_slope_avg); } pdata->support_spsn_ctrl = of_property_read_bool(np, "battery,support_spsn_ctrl"); pr_info("%s: support_spsn_ctrl(%d)\n", __func__, pdata->support_spsn_ctrl); #if IS_ENABLED(CONFIG_WIRELESS_CHARGING) battery->disable_mfc = of_property_read_bool(np, "battery,disable_mfc"); pr_info("%s: disable_mfc(%d)\n", __func__, battery->disable_mfc); #endif return 0; } EXPORT_SYMBOL(sec_bat_parse_dt); void sec_bat_parse_mode_dt(struct sec_battery_info *battery) { struct device_node *np; sec_battery_platform_data_t *pdata = battery->pdata; int ret = 0; u32 temp = 0; np = of_find_node_by_name(NULL, "battery"); if (!np) { pr_err("%s np NULL\n", __func__); return; } if (battery->store_mode) { ret = of_property_read_u32(np, "battery,store_mode_max_input_power", &pdata->store_mode_max_input_power); if (ret) { pr_info("%s : store_mode_max_input_power is Empty\n", __func__); pdata->store_mode_max_input_power = 4000; } if (pdata->wpc_thm_info.check_type) { ret = of_property_read_u32(np, "battery,wpc_store_high_temp", &temp); if (!ret) { pdata->wpc_high_temp = temp; pdata->wpc_high_temp_12w = temp; pdata->wpc_high_temp_15w = temp; } ret = of_property_read_u32(np, "battery,wpc_store_high_temp_recovery", &temp); if (!ret) { pdata->wpc_high_temp_recovery = temp; pdata->wpc_high_temp_recovery_12w = temp; pdata->wpc_high_temp_recovery_15w = temp; } ret = of_property_read_u32(np, "battery,wpc_store_charging_limit_current", &temp); if (!ret) pdata->wpc_input_limit_current = temp; ret = of_property_read_u32(np, "battery,wpc_store_lcd_on_high_temp", &temp); if (!ret) { pdata->wpc_lcd_on_high_temp = (int)temp; pdata->wpc_lcd_on_high_temp_12w = (int)temp; pdata->wpc_lcd_on_high_temp_15w = (int)temp; } ret = of_property_read_u32(np, "battery,wpc_store_lcd_on_high_temp_rec", &temp); if (!ret) { pdata->wpc_lcd_on_high_temp_rec = (int)temp; pdata->wpc_lcd_on_high_temp_rec_12w = (int)temp; pdata->wpc_lcd_on_high_temp_rec_15w = (int)temp; } ret = of_property_read_u32(np, "battery,wpc_store_lcd_on_charging_limit_current", &temp); if (!ret) pdata->wpc_lcd_on_input_limit_current = (int)temp; pr_info("%s: update store_mode - wpc high_temp(t:%d/%d/%d, r:%d/%d/%d), " "lcd_on_high_temp(t:%d/%d%d, r:%d/%d/%d), curr(%d, %d)\n", __func__, pdata->wpc_high_temp, pdata->wpc_high_temp_12w, pdata->wpc_high_temp_15w, pdata->wpc_high_temp_recovery, pdata->wpc_high_temp_recovery_12w, pdata->wpc_high_temp_recovery_15w, pdata->wpc_lcd_on_high_temp, pdata->wpc_lcd_on_high_temp_12w, pdata->wpc_lcd_on_high_temp_12w, pdata->wpc_lcd_on_high_temp_rec, pdata->wpc_lcd_on_high_temp_rec_12w, pdata->wpc_lcd_on_high_temp_rec_12w, pdata->wpc_input_limit_current, pdata->wpc_lcd_on_input_limit_current); } ret = of_property_read_u32(np, "battery,siop_store_hv_wpc_icl", &temp); if (!ret) pdata->siop_hv_wpc_icl = temp; else pdata->siop_hv_wpc_icl = SIOP_STORE_HV_WIRELESS_CHARGING_LIMIT_CURRENT; pr_info("%s: update siop_hv_wpc_icl(%d)\n", __func__, pdata->siop_hv_wpc_icl); pdata->store_mode_buckoff = of_property_read_bool(np, "battery,store_mode_buckoff"); pr_info("%s : battery,store_mode_buckoff: %d\n", __func__, pdata->store_mode_buckoff); } } EXPORT_SYMBOL_KUNIT(sec_bat_parse_mode_dt); void sec_bat_parse_mode_dt_work(struct work_struct *work) { struct sec_battery_info *battery = container_of(work, struct sec_battery_info, parse_mode_dt_work.work); sec_bat_parse_mode_dt(battery); if (is_hv_wire_type(battery->cable_type) || (is_hv_wireless_type(battery->cable_type) && (battery->cable_type != SEC_BATTERY_CABLE_WIRELESS_MPP))) { sec_bat_set_charging_current(battery); } __pm_relax(battery->parse_mode_dt_ws); } EXPORT_SYMBOL(sec_bat_parse_mode_dt_work); #endif