blob: dc9049a5acc831e22b1429e394cd699b783cdaa1 [file] [log] [blame]
/*
* 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 "include/sec_battery.h"
#include "include/sec_battery_dt.h"
#ifdef CONFIG_OF
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);
pdata->default_input_current = input_current;
pdata->default_charging_current = charging_current;
pdata->charging_current =
kzalloc(sizeof(sec_charging_current_t) * SEC_BATTERY_CABLE_MAX,
GFP_KERNEL);
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);
}
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;
#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__);
#if defined(CONFIG_BATTERY_CISD)
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);
}
#endif
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,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_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;
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->fake_capacity = of_property_read_bool(np,
"battery,fake_capacity");
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__);
/* battery thermistor */
ret = of_property_read_u32(np, "battery,thermal_source",
&pdata->thermal_source);
if (ret)
pr_info("%s : Thermal source is Empty\n", __func__);
if (pdata->thermal_source == SEC_BATTERY_THERMAL_SOURCE_ADC) {
p = of_get_property(np, "battery,temp_table_adc", &len);
if (!p)
return 1;
len = len / sizeof(u32);
pdata->temp_adc_table_size = len;
pdata->temp_amb_adc_table_size = len;
pdata->temp_adc_table =
kzalloc(sizeof(sec_bat_adc_table_data_t) *
pdata->temp_adc_table_size, GFP_KERNEL);
pdata->temp_amb_adc_table =
kzalloc(sizeof(sec_bat_adc_table_data_t) *
pdata->temp_adc_table_size, GFP_KERNEL);
for(i = 0; i < pdata->temp_adc_table_size; i++) {
ret = of_property_read_u32_index(np,
"battery,temp_table_adc", i, &temp);
pdata->temp_adc_table[i].adc = (int)temp;
if (ret)
pr_info("%s : Temp_adc_table(adc) is Empty\n",
__func__);
ret = of_property_read_u32_index(np,
"battery,temp_table_data", i, &temp);
pdata->temp_adc_table[i].data = (int)temp;
if (ret)
pr_info("%s : Temp_adc_table(data) is Empty\n",
__func__);
ret = of_property_read_u32_index(np,
"battery,temp_table_adc", i, &temp);
pdata->temp_amb_adc_table[i].adc = (int)temp;
if (ret)
pr_info("%s : Temp_amb_adc_table(adc) is Empty\n",
__func__);
ret = of_property_read_u32_index(np,
"battery,temp_table_data", i, &temp);
pdata->temp_amb_adc_table[i].data = (int)temp;
if (ret)
pr_info("%s : Temp_amb_adc_table(data) is Empty\n",
__func__);
}
}
ret = of_property_read_u32(np, "battery,temp_check_type",
&pdata->temp_check_type);
if (ret)
pr_info("%s : Temp check type 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__);
/* usb thermistor */
ret = of_property_read_u32(np, "battery,usb_thermal_source",
&pdata->usb_thermal_source);
if (ret)
pr_info("%s : usb_thermal_source is Empty\n", __func__);
if(pdata->usb_thermal_source == SEC_BATTERY_THERMAL_SOURCE_ADC) {
p = of_get_property(np, "battery,usb_temp_table_adc", &len);
if (!p)
return 1;
len = len / sizeof(u32);
pdata->usb_temp_adc_table_size = len;
pdata->usb_temp_adc_table =
kzalloc(sizeof(sec_bat_adc_table_data_t) *
pdata->usb_temp_adc_table_size, GFP_KERNEL);
for(i = 0; i < pdata->usb_temp_adc_table_size; i++) {
ret = of_property_read_u32_index(np,
"battery,usb_temp_table_adc", i, &temp);
pdata->usb_temp_adc_table[i].adc = (int)temp;
if (ret)
pr_info("%s : Usb_Temp_adc_table(adc) is Empty\n",
__func__);
ret = of_property_read_u32_index(np,
"battery,usb_temp_table_data", i, &temp);
pdata->usb_temp_adc_table[i].data = (int)temp;
if (ret)
pr_info("%s : Usb_Temp_adc_table(data) is Empty\n",
__func__);
}
}
ret = of_property_read_u32(np, "battery,usb_temp_check_type",
&pdata->usb_temp_check_type);
if (ret)
pr_info("%s : usb_temp_check_type is Empty\n", __func__);
/* chg thermistor */
ret = of_property_read_u32(np, "battery,chg_thermal_source",
&pdata->chg_thermal_source);
if (ret)
pr_info("%s : chg_thermal_source is Empty\n", __func__);
if(pdata->chg_thermal_source == SEC_BATTERY_THERMAL_SOURCE_ADC) {
p = of_get_property(np, "battery,chg_temp_table_adc", &len);
if (!p)
return 1;
len = len / sizeof(u32);
pdata->chg_temp_adc_table_size = len;
pdata->chg_temp_adc_table =
kzalloc(sizeof(sec_bat_adc_table_data_t) *
pdata->chg_temp_adc_table_size, GFP_KERNEL);
for(i = 0; i < pdata->chg_temp_adc_table_size; i++) {
ret = of_property_read_u32_index(np,
"battery,chg_temp_table_adc", i, &temp);
pdata->chg_temp_adc_table[i].adc = (int)temp;
if (ret)
pr_info("%s : CHG_Temp_adc_table(adc) is Empty\n",
__func__);
ret = of_property_read_u32_index(np,
"battery,chg_temp_table_data", i, &temp);
pdata->chg_temp_adc_table[i].data = (int)temp;
if (ret)
pr_info("%s : CHG_Temp_adc_table(data) is Empty\n",
__func__);
}
}
ret = of_property_read_u32(np, "battery,chg_temp_check_type",
&pdata->chg_temp_check_type);
if (ret)
pr_info("%s : chg_temp_check_type is Empty\n", __func__);
#if defined(CONFIG_DIRECT_CHARGING)
/* direct chg thermistor */
ret = of_property_read_u32(np, "battery,dchg_thermal_source",
&pdata->dchg_thermal_source);
if (ret)
pr_info("%s : dchg_thermal_source is Empty\n", __func__);
if(pdata->dchg_thermal_source == SEC_BATTERY_THERMAL_SOURCE_CHG_ADC) {
p = of_get_property(np, "battery,dchg_temp_table_adc", &len);
if (!p)
return 1;
len = len / sizeof(u32);
pdata->dchg_temp_adc_table_size = len;
pdata->dchg_temp_adc_table =
kzalloc(sizeof(sec_bat_adc_table_data_t) *
pdata->dchg_temp_adc_table_size, GFP_KERNEL);
for(i = 0; i < pdata->dchg_temp_adc_table_size; i++) {
ret = of_property_read_u32_index(np,
"battery,dchg_temp_table_adc", i, &temp);
pdata->dchg_temp_adc_table[i].adc = (int)temp;
if (ret)
pr_info("%s : DIRECT CHG_Temp_adc_table(adc) is Empty\n",
__func__);
ret = of_property_read_u32_index(np,
"battery,dchg_temp_table_data", i, &temp);
pdata->dchg_temp_adc_table[i].data = (int)temp;
if (ret)
pr_info("%s : DIRECT CHG_Temp_adc_table(data) is Empty\n",
__func__);
}
}
ret = of_property_read_u32(np, "battery,dchg_temp_check_type",
&pdata->dchg_temp_check_type);
if (ret)
pr_info("%s : dchg_temp_check_type is Empty\n", __func__);
ret = of_property_read_u32(np, "battery,dchg_high_temp", &temp);
pdata->dchg_high_temp = (int)temp;
if (ret) {
pr_info("%s : dchg_high_temp is Empty\n", __func__);
pdata->dchg_high_temp = pdata->chg_high_temp;
}
ret = of_property_read_u32(np, "battery,dchg_high_temp_recovery",
&temp);
pdata->dchg_high_temp_recovery = (int)temp;
if (ret) {
pr_info("%s : dchg_temp_recovery is Empty\n", __func__);
pdata->dchg_high_temp_recovery = pdata->chg_high_temp_recovery;
}
ret = of_property_read_u32(np, "battery,dchg_high_batt_temp",
&temp);
pdata->dchg_high_batt_temp = (int)temp;
if (ret) {
pr_info("%s : dchg_high_batt_temp is Empty\n", __func__);
pdata->dchg_high_batt_temp = pdata->chg_high_temp;
}
ret = of_property_read_u32(np, "battery,dchg_high_batt_temp_recovery",
&temp);
pdata->dchg_high_batt_temp_recovery = (int)temp;
if (ret) {
pr_info("%s : dchg_high_batt_temp_recovery is Empty\n", __func__);
pdata->dchg_high_batt_temp_recovery = pdata->chg_high_temp_recovery;
}
#endif
/* wpc thermistor */
ret = of_property_read_u32(np, "battery,wpc_thermal_source",
&pdata->wpc_thermal_source);
if (ret)
pr_info("%s : wpc_thermal_source is Empty\n", __func__);
if(pdata->wpc_thermal_source == SEC_BATTERY_THERMAL_SOURCE_ADC) {
p = of_get_property(np, "battery,wpc_temp_table_adc", &len);
if (!p) {
pr_info("%s : wpc_temp_table_adc(adc) is Empty\n",__func__);
} else {
len = len / sizeof(u32);
pdata->wpc_temp_adc_table_size = len;
pdata->wpc_temp_adc_table =
kzalloc(sizeof(sec_bat_adc_table_data_t) *
pdata->wpc_temp_adc_table_size, GFP_KERNEL);
for(i = 0; i < pdata->wpc_temp_adc_table_size; i++) {
ret = of_property_read_u32_index(np,
"battery,wpc_temp_table_adc", i, &temp);
pdata->wpc_temp_adc_table[i].adc = (int)temp;
if (ret)
pr_info("%s : WPC_Temp_adc_table(adc) is Empty\n",
__func__);
ret = of_property_read_u32_index(np,
"battery,wpc_temp_table_data", i, &temp);
pdata->wpc_temp_adc_table[i].data = (int)temp;
if (ret)
pr_info("%s : WPC_Temp_adc_table(data) is Empty\n",
__func__);
}
}
}
ret = of_property_read_u32(np, "battery,wpc_temp_check_type",
&pdata->wpc_temp_check_type);
if (ret)
pr_info("%s : wpc_temp_check_type is Empty\n", __func__);
/* sub bat thermistor */
ret = of_property_read_u32(np, "battery,sub_bat_thermal_source",
&pdata->sub_bat_thermal_source);
if (ret)
pr_info("%s : sub_bat_thermal_source is Empty\n", __func__);
if(pdata->sub_bat_thermal_source) {
p = of_get_property(np, "battery,sub_bat_temp_table_adc", &len);
if (!p) {
pr_info("%s : sub_bat_temp_table_adc(adc) is Empty\n",__func__);
} else {
len = len / sizeof(u32);
pdata->sub_bat_temp_adc_table_size = len;
pdata->sub_bat_temp_adc_table =
kzalloc(sizeof(sec_bat_adc_table_data_t) *
pdata->sub_bat_temp_adc_table_size, GFP_KERNEL);
for(i = 0; i < pdata->sub_bat_temp_adc_table_size; i++) {
ret = of_property_read_u32_index(np,
"battery,sub_bat_temp_table_adc", i, &temp);
pdata->sub_bat_temp_adc_table[i].adc = (int)temp;
if (ret)
pr_info("%s : sub_bat_adc_table(adc) is Empty\n",
__func__);
ret = of_property_read_u32_index(np,
"battery,sub_bat_temp_table_data", i, &temp);
pdata->sub_bat_temp_adc_table[i].data = (int)temp;
if (ret)
pr_info("%s : sub_bat_temp_adc_table(data) is Empty\n",
__func__);
}
}
}
ret = of_property_read_u32(np, "battery,sub_bat_temp_check_type",
&pdata->sub_bat_temp_check_type);
if (ret)
pr_info("%s : sub_bat_temp_check_type is Empty\n", __func__);
/* slave thermistor */
ret = of_property_read_u32(np, "battery,slave_thermal_source",
&pdata->slave_thermal_source);
if (ret)
pr_info("%s : slave_thermal_source is Empty\n", __func__);
if(pdata->slave_thermal_source == SEC_BATTERY_THERMAL_SOURCE_ADC) {
p = of_get_property(np, "battery,slave_chg_temp_table_adc", &len);
if (!p)
return 1;
len = len / sizeof(u32);
pdata->slave_chg_temp_adc_table_size = len;
pdata->slave_chg_temp_adc_table =
kzalloc(sizeof(sec_bat_adc_table_data_t) *
pdata->slave_chg_temp_adc_table_size, GFP_KERNEL);
for(i = 0; i < pdata->slave_chg_temp_adc_table_size; i++) {
ret = of_property_read_u32_index(np,
"battery,slave_chg_temp_table_adc", i, &temp);
pdata->slave_chg_temp_adc_table[i].adc = (int)temp;
if (ret)
pr_info("%s : slave_chg_temp_adc_table(adc) is Empty\n",
__func__);
ret = of_property_read_u32_index(np,
"battery,slave_chg_temp_table_data", i, &temp);
pdata->slave_chg_temp_adc_table[i].data = (int)temp;
if (ret)
pr_info("%s : slave_chg_temp_adc_table(data) is Empty\n",
__func__);
}
}
ret = of_property_read_u32(np, "battery,slave_chg_temp_check_type",
&pdata->slave_chg_temp_check_type);
if (ret)
pr_info("%s : slave_chg_temp_check_type is Empty\n", __func__);
/* blkt thermistor */
ret = of_property_read_u32(np, "battery,blkt_thermal_source",
&pdata->blkt_thermal_source);
if (ret)
pr_info("%s : blkt_thermal_source is Empty\n", __func__);
if(pdata->blkt_thermal_source == SEC_BATTERY_THERMAL_SOURCE_ADC) {
p = of_get_property(np, "battery,blkt_temp_table_adc", &len);
if (!p)
return 1;
len = len / sizeof(u32);
pdata->blkt_temp_adc_table_size = len;
pdata->blkt_temp_adc_table =
kzalloc(sizeof(sec_bat_adc_table_data_t) *
pdata->blkt_temp_adc_table_size, GFP_KERNEL);
for(i = 0; i < pdata->blkt_temp_adc_table_size; i++) {
ret = of_property_read_u32_index(np,
"battery,blkt_temp_table_adc", i, &temp);
pdata->blkt_temp_adc_table[i].adc = (int)temp;
if (ret)
pr_info("%s : blkt_temp_adc_table(adc) is Empty\n",
__func__);
ret = of_property_read_u32_index(np,
"battery,blkt_temp_table_data", i, &temp);
pdata->blkt_temp_adc_table[i].data = (int)temp;
if (ret)
pr_info("%s : blkt_temp_adc_table(data) is Empty\n",
__func__);
}
}
ret = of_property_read_u32(np, "battery,blkt_temp_check_type",
&pdata->blkt_temp_check_type);
if (ret)
pr_info("%s : blkt_temp_check_type is Empty\n", __func__);
if (pdata->chg_temp_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_temp_check_type) {
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_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_high_temp",
&pdata->wpc_lcd_on_high_temp);
if (ret)
pr_info("%s : wpc_lcd_on_high_temp is Empty\n", __func__);
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__);
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;
}
}
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,prepare_ta_delay",
&pdata->prepare_ta_delay);
if (ret) {
pr_info("%s : prepare_ta_delay is Empty\n", __func__);
pdata->prepare_ta_delay = 500;
}
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,temp_adc_type",
&pdata->temp_adc_type);
if (ret)
pr_info("%s : Temp adc type 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;
}
#if defined(CONFIG_PREVENT_USB_CONN_OVERHEAT)
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;
}
#endif
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 = 410;
}
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;
}
ret = of_property_read_u32(np, "battery,high_temp_topoff", &temp);
pdata->high_temp_topoff = (int)temp;
if (ret) {
pr_info("%s : high_temp_topoff is Empty\n", __func__);
pdata->high_temp_topoff = 250;
}
ret = of_property_read_u32(np, "battery,low_temp_topoff", &temp);
pdata->low_temp_topoff = (int)temp;
if (ret) {
pr_info("%s : low_temp_topoff is Empty\n", __func__);
pdata->low_temp_topoff = 250;
}
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,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,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,charging_limit_by_tx_check",
&pdata->charging_limit_by_tx_check);
if (ret)
pr_info("%s : charging_limit_by_tx_check is Empty\n", __func__);
if(pdata->charging_limit_by_tx_check) {
ret = of_property_read_u32(np, "battery,charging_limit_current_by_tx",
&pdata->charging_limit_current_by_tx);
if (ret) {
pr_info("%s : charging_limit_current_by_tx is Empty\n", __func__);
pdata->charging_limit_current_by_tx = 1000;
}
}
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_total_time",
(unsigned int *)&pdata->charging_total_time);
if (ret)
pr_info("%s : Charging total time is Empty\n", __func__);
ret = of_property_read_u32(np, "battery,hv_charging_total_time",
&pdata->hv_charging_total_time);
if (ret) {
pdata->hv_charging_total_time = 3 * 60 * 60;
pr_info("%s : HV Charging total time is %d\n",
__func__, pdata->hv_charging_total_time);
}
ret = of_property_read_u32(np, "battery,normal_charging_total_time",
&pdata->normal_charging_total_time);
if (ret) {
pdata->normal_charging_total_time = 5 * 60 * 60;
pr_info("%s : Normal(WC) Charging total time is %d\n",
__func__, pdata->normal_charging_total_time);
}
ret = of_property_read_u32(np, "battery,usb_charging_total_time",
&pdata->usb_charging_total_time);
if (ret) {
pdata->usb_charging_total_time = 10 * 60 * 60;
pr_info("%s : USB Charging total time is %d\n",
__func__, pdata->usb_charging_total_time);
}
ret = of_property_read_u32(np, "battery,recharging_total_time",
(unsigned int *)&pdata->recharging_total_time);
if (ret)
pr_info("%s : Recharging total time 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;
}
/* wpc_en */
ret = pdata->wpc_en = of_get_named_gpio(np, "battery,wpc_en", 0);
if (ret < 0) {
pr_info("%s : can't get wpc_en\n", __func__);
pdata->wpc_en = 0;
}
#if defined(CONFIG_BATTERY_AGE_FORECAST)
p = of_get_property(np, "battery,age_data", &len);
if (p) {
battery->pdata->num_age_step = len / sizeof(sec_age_data_t);
battery->pdata->age_data = kzalloc(len, GFP_KERNEL);
ret = of_property_read_u32_array(np, "battery,age_data",
(u32 *)battery->pdata->age_data, len/sizeof(u32));
if (ret) {
pr_err("%s failed to read battery->pdata->age_data: %d\n",
__func__, ret);
kfree(battery->pdata->age_data);
battery->pdata->age_data = NULL;
battery->pdata->num_age_step = 0;
}
pr_err("%s num_age_step : %d\n", __func__, battery->pdata->num_age_step);
for (len = 0; len < battery->pdata->num_age_step; ++len) {
pr_err("[%d/%d]cycle:%d, float:%d, full_v:%d, recharge_v:%d, soc:%d\n",
len, battery->pdata->num_age_step-1,
battery->pdata->age_data[len].cycle,
battery->pdata->age_data[len].float_voltage,
battery->pdata->age_data[len].full_condition_vcell,
battery->pdata->age_data[len].recharge_condition_vcell,
battery->pdata->age_data[len].full_condition_soc);
}
} else {
battery->pdata->num_age_step = 0;
pr_err("%s there is not age_data\n", __func__);
}
#endif
p = of_get_property(np, "battery,health_condition", &len);
if (p || (len / sizeof(battery_health_condition)) == BATTERY_HEALTH_MAX) {
battery->pdata->health_condition = kzalloc(len, GFP_KERNEL);
ret = of_property_read_u32_array(np, "battery,health_condition",
(u32 *)battery->pdata->health_condition, len/sizeof(u32));
if (ret) {
pr_err("%s failed to read battery->pdata->health_condition: %d\n",
__func__, ret);
kfree(battery->pdata->health_condition);
battery->pdata->health_condition = NULL;
} else {
for (i = 0; i < BATTERY_HEALTH_MAX; i++) {
pr_err("%s: [BATTERY_HEALTH] %d: Cycle(~ %d), ASoC(~ %d)\n",
__func__, i,
battery->pdata->health_condition[i].cycle,
battery->pdata->health_condition[i].asoc);
}
}
} else {
battery->pdata->health_condition = NULL;
pr_err("%s there is not health_condition, len(%d)\n", __func__, len);
}
ret = of_property_read_u32(np, "battery,siop_input_limit_current",
&pdata->siop_input_limit_current);
if (ret)
pdata->siop_input_limit_current = SIOP_INPUT_LIMIT_CURRENT;
ret = of_property_read_u32(np, "battery,siop_charging_limit_current",
&pdata->siop_charging_limit_current);
if (ret)
pdata->siop_charging_limit_current = SIOP_CHARGING_LIMIT_CURRENT;
ret = of_property_read_u32(np, "battery,siop_hv_12v_input_limit_current",
&pdata->siop_hv_12v_input_limit_current);
if (ret)
pdata->siop_hv_12v_input_limit_current = SIOP_HV_12V_INPUT_LIMIT_CURRENT;
ret = of_property_read_u32(np, "battery,siop_hv_12v_charging_limit_current",
&pdata->siop_hv_12v_charging_limit_current);
if (ret)
pdata->siop_hv_12v_charging_limit_current = SIOP_HV_12V_CHARGING_LIMIT_CURRENT;
ret = of_property_read_u32(np, "battery,siop_hv_input_limit_current",
&pdata->siop_hv_input_limit_current);
if (ret)
pdata->siop_hv_input_limit_current = SIOP_HV_INPUT_LIMIT_CURRENT;
ret = of_property_read_u32(np, "battery,siop_hv_input_limit_current_2nd",
&pdata->siop_hv_input_limit_current_2nd);
if (ret)
pdata->siop_hv_input_limit_current_2nd = SIOP_HV_INPUT_LIMIT_CURRENT;
ret = of_property_read_u32(np, "battery,siop_hv_charging_limit_current",
&pdata->siop_hv_charging_limit_current);
if (ret)
pdata->siop_hv_charging_limit_current = SIOP_HV_CHARGING_LIMIT_CURRENT;
ret = of_property_read_u32(np, "battery,siop_apdo_input_limit_current",
&pdata->siop_apdo_input_limit_current);
if (ret)
pdata->siop_apdo_input_limit_current = SIOP_APDO_INPUT_LIMIT_CURRENT;
ret = of_property_read_u32(np, "battery,siop_apdo_charging_limit_current",
&pdata->siop_apdo_charging_limit_current);
if (ret)
pdata->siop_apdo_charging_limit_current = SIOP_APDO_CHARGING_LIMIT_CURRENT;
ret = of_property_read_u32(np, "battery,siop_wireless_input_limit_current",
&pdata->siop_wireless_input_limit_current);
if (ret)
pdata->siop_wireless_input_limit_current = SIOP_WIRELESS_INPUT_LIMIT_CURRENT;
ret = of_property_read_u32(np, "battery,siop_wireless_charging_limit_current",
&pdata->siop_wireless_charging_limit_current);
if (ret)
pdata->siop_wireless_charging_limit_current = SIOP_WIRELESS_CHARGING_LIMIT_CURRENT;
ret = of_property_read_u32(np, "battery,siop_hv_wireless_input_limit_current",
&pdata->siop_hv_wireless_input_limit_current);
if (ret)
pdata->siop_hv_wireless_input_limit_current = SIOP_HV_WIRELESS_INPUT_LIMIT_CURRENT;
ret = of_property_read_u32(np, "battery,siop_hv_wireless_charging_limit_current",
&pdata->siop_hv_wireless_charging_limit_current);
if (ret)
pdata->siop_hv_wireless_charging_limit_current = SIOP_HV_WIRELESS_CHARGING_LIMIT_CURRENT;
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 = 12000;
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;
}
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_rdu_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 =
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_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_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_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);
}
pr_info("%s: vendor : %s, technology : %d, cable_check_type : %d\n"
"cable_source_type : %d, temp_adc_type: %d\n"
"polling_type : %d, initial_count : %d, check_count : %d\n"
"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->temp_adc_type,
pdata->polling_type, pdata->monitor_initial_count,
pdata->check_count, pdata->check_adc_max, pdata->check_adc_min,
pdata->ovp_uvlo_check_type, pdata->thermal_source,
pdata->temp_check_type, pdata->temp_check_count, pdata->nv_charge_power,
pdata->full_condition_type, pdata->recharge_condition_type, pdata->full_check_type
);
#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;
}
#if defined(CONFIG_DUAL_BATTERY)
ret = of_property_read_u32(np,
"battery,support_dual_battery", &temp);
if (ret) {
pr_info("support_dual_battery is empty\n");
pdata->support_dual_battery = 0;
} else
pdata->support_dual_battery = temp;
if (pdata->support_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__);
ret = of_property_read_string(np,
"battery,main_limiter_name", (char const **)&pdata->main_limiter_name);
if (ret)
pr_info("%s: Main limiter name is Empty\n", __func__);
ret = of_property_read_string(np,
"battery,sub_limiter_name", (char const **)&pdata->sub_limiter_name);
if (ret)
pr_info("%s: Sub limiter 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 {
/* MAIN_BATTERY_SW_EN_AP */
ret = pdata->main_bat_enb_gpio = of_get_named_gpio(np, "battery,main_bat_enb_gpio", 0);
if (ret < 0) {
pr_info("%s : can't get main_bat_enb_gpio\n", __func__);
}
/* SUB_BATTERY_SW_EN */
ret = pdata->sub_bat_enb_gpio = of_get_named_gpio(np, "battery,sub_bat_enb_gpio", 0);
if (ret < 0) {
pr_info("%s : can't get sub_bat_enb_gpio\n", __func__);
}
ret = of_property_read_u32(np, "battery,main_charging_rate",
&pdata->main_charging_rate);
if (ret) {
pr_err("%s: main_charging_rate is Empty\n", __func__);
pdata->main_charging_rate = 60;
}
ret = of_property_read_u32(np, "battery,sub_charging_rate",
&pdata->sub_charging_rate);
if (ret) {
pr_err("%s: sub_charging_rate is Empty\n", __func__);
pdata->sub_charging_rate = 50;
}
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_charging_current",
&pdata->max_main_charging_current);
if (ret) {
pr_err("%s: max_main_charging_current is Empty\n", __func__);
pdata->max_main_charging_current = 1550;
}
ret = of_property_read_u32(np, "battery,min_main_charging_current",
&pdata->min_main_charging_current);
if (ret) {
pr_err("%s: min_main_charging_current is Empty\n", __func__);
pdata->min_main_charging_current = 450;
}
ret = of_property_read_u32(np, "battery,max_sub_charging_current",
&pdata->max_sub_charging_current);
if (ret) {
pr_err("%s: max_sub_charging_current is Empty\n", __func__);
pdata->max_sub_charging_current = 1300;
}
ret = of_property_read_u32(np, "battery,min_sub_charging_current",
&pdata->min_sub_charging_current);
if (ret) {
pr_err("%s: min_sub_charging_current is Empty\n", __func__);
pdata->min_sub_charging_current = 450;
}
pr_info("%s : main rate:%d, sub rate:%d, recharge marging:%d, "
"max main curr:%d, min main curr:%d, max sub curr:%d, min sub curr:%d \n",
__func__, pdata->main_charging_rate, pdata->sub_charging_rate,
pdata->force_recharge_margin, pdata->max_main_charging_current, pdata->min_main_charging_current,
pdata->max_sub_charging_current, pdata->min_sub_charging_current);
}
#endif
#if defined(CONFIG_BATTERY_CISD)
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);
} 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);
} else {
pr_info("%s : battery,ignore_cisd_index_d is Empty\n", __func__);
}
#endif
#if defined(CONFIG_DIRECT_CHARGING)
sec_direct_chg_init(battery, dev);
#endif
return 0;
}
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_temp_check_type) {
ret = of_property_read_u32(np, "battery,wpc_store_high_temp",
&temp);
if (!ret)
pdata->wpc_high_temp = temp;
ret = of_property_read_u32(np, "battery,wpc_store_high_temp_recovery",
&temp);
if (!ret)
pdata->wpc_high_temp_recovery = 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;
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;
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, r:%d), lcd_on_high_temp(t:%d, r:%d), curr(%d, %d)\n",
__func__,
pdata->wpc_high_temp, pdata->wpc_high_temp_recovery,
pdata->wpc_lcd_on_high_temp, pdata->wpc_lcd_on_high_temp_rec,
pdata->wpc_input_limit_current,
pdata->wpc_lcd_on_input_limit_current);
}
ret = of_property_read_u32(np, "battery,siop_store_hv_wireless_input_limit_current",
&temp);
if (!ret)
pdata->siop_hv_wireless_input_limit_current = temp;
else
pdata->siop_hv_wireless_input_limit_current = SIOP_STORE_HV_WIRELESS_CHARGING_LIMIT_CURRENT;
pr_info("%s: update siop_hv_wireless_input_limit_current(%d)\n",
__func__, pdata->siop_hv_wireless_input_limit_current);
}
}
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)) {
sec_bat_set_charging_current(battery);
}
wake_unlock(&battery->parse_mode_dt_wake_lock);
}
#endif