1757 lines
60 KiB
C
1757 lines
60 KiB
C
|
/*
|
||
|
* 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);
|
||
|
}
|
||
|
|
||
|
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;
|
||
|
|
||
|
pdata->wireless_power_info =
|
||
|
kzalloc(sizeof(sec_wireless_rx_power_info_t) * SEC_WIRELESS_RX_POWER_MAX,
|
||
|
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 < SEC_WIRELESS_RX_POWER_MAX; 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);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
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;
|
||
|
#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__);
|
||
|
|
||
|
pdata->enable_water_resistance = of_property_read_bool(np,
|
||
|
"battery,enable_water_resistance");
|
||
|
|
||
|
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");
|
||
|
|
||
|
pdata->dis_auto_shipmode_temp_ctrl = of_property_read_bool(np,
|
||
|
"battery,dis_auto_shipmode_temp_ctrl");
|
||
|
|
||
|
battery->ta_alert_wa = of_property_read_bool(np, "battery,ta_alert_wa");
|
||
|
|
||
|
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__);
|
||
|
|
||
|
/* 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__);
|
||
|
|
||
|
if (pdata->chg_temp_check_type) {
|
||
|
ret = of_property_read_u32(np, "battery,chg_heating_prevention_method",
|
||
|
&pdata->chg_heating_prevention_method);
|
||
|
if (ret) {
|
||
|
pr_info("%s : chg_heating_prevention_method is Empty\n", __func__);
|
||
|
pdata->chg_heating_prevention_method = 0;
|
||
|
}
|
||
|
|
||
|
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,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;
|
||
|
}
|
||
|
|
||
|
battery->wpc_vout_ctrl_lcd_on = of_property_read_bool(np,
|
||
|
"battery,wpc_vout_ctrl_lcd_on");
|
||
|
}
|
||
|
|
||
|
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,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,temp_highlimit_threshold_normal",
|
||
|
&temp);
|
||
|
pdata->temp_highlimit_threshold_normal = (int)temp;
|
||
|
if (ret)
|
||
|
pr_info("%s : Temp highlimit threshold normal is Empty\n", __func__);
|
||
|
|
||
|
ret = of_property_read_u32(np, "battery,temp_highlimit_recovery_normal",
|
||
|
&temp);
|
||
|
pdata->temp_highlimit_recovery_normal = (int)temp;
|
||
|
if (ret)
|
||
|
pr_info("%s : Temp highlimit recovery normal is Empty\n", __func__);
|
||
|
|
||
|
ret = of_property_read_u32(np, "battery,temp_high_threshold_normal",
|
||
|
&temp);
|
||
|
pdata->temp_high_threshold_normal = (int)temp;
|
||
|
if (ret)
|
||
|
pr_info("%s : Temp high threshold normal is Empty\n", __func__);
|
||
|
|
||
|
ret = of_property_read_u32(np, "battery,temp_high_recovery_normal",
|
||
|
&temp);
|
||
|
pdata->temp_high_recovery_normal = (int)temp;
|
||
|
if (ret)
|
||
|
pr_info("%s : Temp high recovery normal is Empty\n", __func__);
|
||
|
|
||
|
ret = of_property_read_u32(np, "battery,temp_low_threshold_normal",
|
||
|
&temp);
|
||
|
pdata->temp_low_threshold_normal = (int)temp;
|
||
|
if (ret)
|
||
|
pr_info("%s : Temp low threshold normal is Empty\n", __func__);
|
||
|
|
||
|
ret = of_property_read_u32(np, "battery,temp_low_recovery_normal",
|
||
|
&temp);
|
||
|
pdata->temp_low_recovery_normal = (int)temp;
|
||
|
if (ret)
|
||
|
pr_info("%s : Temp low recovery normal is Empty\n", __func__);
|
||
|
|
||
|
ret = of_property_read_u32(np, "battery,temp_highlimit_threshold_lpm",
|
||
|
&temp);
|
||
|
pdata->temp_highlimit_threshold_lpm = (int)temp;
|
||
|
if (ret)
|
||
|
pr_info("%s : Temp highlimit threshold lpm is Empty\n", __func__);
|
||
|
|
||
|
ret = of_property_read_u32(np, "battery,temp_highlimit_recovery_lpm",
|
||
|
&temp);
|
||
|
pdata->temp_highlimit_recovery_lpm = (int)temp;
|
||
|
if (ret)
|
||
|
pr_info("%s : Temp highlimit recovery lpm is Empty\n", __func__);
|
||
|
|
||
|
ret = of_property_read_u32(np, "battery,temp_high_threshold_lpm",
|
||
|
&temp);
|
||
|
pdata->temp_high_threshold_lpm = (int)temp;
|
||
|
if (ret)
|
||
|
pr_info("%s : Temp high threshold lpm is Empty\n", __func__);
|
||
|
|
||
|
ret = of_property_read_u32(np, "battery,temp_high_recovery_lpm",
|
||
|
&temp);
|
||
|
pdata->temp_high_recovery_lpm = (int)temp;
|
||
|
if (ret)
|
||
|
pr_info("%s : Temp high recovery lpm is Empty\n", __func__);
|
||
|
|
||
|
ret = of_property_read_u32(np, "battery,temp_low_threshold_lpm",
|
||
|
&temp);
|
||
|
pdata->temp_low_threshold_lpm = (int)temp;
|
||
|
if (ret)
|
||
|
pr_info("%s : Temp low threshold lpm is Empty\n", __func__);
|
||
|
|
||
|
ret = of_property_read_u32(np, "battery,temp_low_recovery_lpm",
|
||
|
&temp);
|
||
|
pdata->temp_low_recovery_lpm = (int)temp;
|
||
|
if (ret)
|
||
|
pr_info("%s : Temp low recovery lpm is Empty\n", __func__);
|
||
|
|
||
|
pr_info("%s : HIGHLIMIT_THRESHOLD_NOLMAL(%d), HIGHLIMIT_RECOVERY_NORMAL(%d)\n"
|
||
|
"HIGH_THRESHOLD_NORMAL(%d), HIGH_RECOVERY_NORMAL(%d) LOW_THRESHOLD_NORMAL(%d), LOW_RECOVERY_NORMAL(%d)\n"
|
||
|
"HIGHLIMIT_THRESHOLD_LPM(%d), HIGHLIMIT_RECOVERY_LPM(%d)\n"
|
||
|
"HIGH_THRESHOLD_LPM(%d), HIGH_RECOVERY_LPM(%d) LOW_THRESHOLD_LPM(%d), LOW_RECOVERY_LPM(%d)\n",
|
||
|
__func__,
|
||
|
pdata->temp_highlimit_threshold_normal, pdata->temp_highlimit_recovery_normal,
|
||
|
pdata->temp_high_threshold_normal, pdata->temp_high_recovery_normal,
|
||
|
pdata->temp_low_threshold_normal, pdata->temp_low_recovery_normal,
|
||
|
pdata->temp_highlimit_threshold_lpm, pdata->temp_highlimit_recovery_lpm,
|
||
|
pdata->temp_high_threshold_lpm, pdata->temp_high_recovery_lpm,
|
||
|
pdata->temp_low_threshold_lpm, pdata->temp_low_recovery_lpm);
|
||
|
|
||
|
ret = of_property_read_u32(np, "battery,wpc_high_threshold_normal",
|
||
|
&temp);
|
||
|
pdata->wpc_high_threshold_normal = (int)temp;
|
||
|
if (ret)
|
||
|
pr_info("%s : wpc_high_threshold_normal is Empty\n", __func__);
|
||
|
|
||
|
ret = of_property_read_u32(np, "battery,wpc_high_recovery_normal",
|
||
|
&temp);
|
||
|
pdata->wpc_high_recovery_normal = (int)temp;
|
||
|
if (ret)
|
||
|
pr_info("%s : wpc_high_recovery_normal is Empty\n", __func__);
|
||
|
|
||
|
ret = of_property_read_u32(np, "battery,wpc_low_threshold_normal",
|
||
|
&temp);
|
||
|
pdata->wpc_low_threshold_normal = (int)temp;
|
||
|
if (ret)
|
||
|
pr_info("%s : wpc_low_threshold_normal is Empty\n", __func__);
|
||
|
|
||
|
ret = of_property_read_u32(np, "battery,wpc_low_recovery_normal",
|
||
|
&temp);
|
||
|
pdata->wpc_low_recovery_normal = (int)temp;
|
||
|
if (ret)
|
||
|
pr_info("%s : wpc_low_recovery_normal is Empty\n", __func__);
|
||
|
|
||
|
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,recharge_condition_vcell",
|
||
|
&pdata->recharge_condition_vcell);
|
||
|
if (ret)
|
||
|
pr_info("%s : Recharge condition vcell 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;
|
||
|
}
|
||
|
#if defined(CONFIG_BATTERY_SWELLING)
|
||
|
ret = of_property_read_u32(np, "battery,chg_float_voltage",
|
||
|
(unsigned int *)&pdata->swelling_normal_float_voltage);
|
||
|
if (ret)
|
||
|
pr_info("%s: chg_float_voltage is Empty\n", __func__);
|
||
|
|
||
|
ret = of_property_read_u32(np, "battery,swelling_high_temp_block",
|
||
|
&temp);
|
||
|
pdata->swelling_high_temp_block = (int)temp;
|
||
|
if (ret)
|
||
|
pr_info("%s: swelling high temp block is Empty\n", __func__);
|
||
|
|
||
|
ret = of_property_read_u32(np, "battery,swelling_high_temp_recov",
|
||
|
&temp);
|
||
|
pdata->swelling_high_temp_recov = (int)temp;
|
||
|
if (ret)
|
||
|
pr_info("%s: swelling high temp recovery is Empty\n", __func__);
|
||
|
|
||
|
ret = of_property_read_u32(np, "battery,swelling_wc_high_temp_block",
|
||
|
&temp);
|
||
|
pdata->swelling_wc_high_temp_block = (int)temp;
|
||
|
if (ret) {
|
||
|
pdata->swelling_wc_high_temp_block = pdata->swelling_high_temp_block;
|
||
|
pr_info("%s: swelling wireless high temp block is %d\n",
|
||
|
__func__, pdata->swelling_wc_high_temp_block);
|
||
|
}
|
||
|
|
||
|
ret = of_property_read_u32(np, "battery,swelling_wc_high_temp_recov",
|
||
|
&temp);
|
||
|
pdata->swelling_wc_high_temp_recov = (int)temp;
|
||
|
if (ret) {
|
||
|
pdata->swelling_wc_high_temp_recov = pdata->swelling_high_temp_recov;
|
||
|
pr_info("%s: swelling wireless high temp recovery is %d\n",
|
||
|
__func__, pdata->swelling_wc_high_temp_recov);
|
||
|
}
|
||
|
|
||
|
ret = of_property_read_u32(np, "battery,swelling_low_temp_block_1st",
|
||
|
&temp);
|
||
|
pdata->swelling_low_temp_block_1st = (int)temp;
|
||
|
if (ret)
|
||
|
pr_info("%s: swelling low temp block is Empty\n", __func__);
|
||
|
|
||
|
ret = of_property_read_u32(np, "battery,swelling_low_temp_recov_1st",
|
||
|
&temp);
|
||
|
pdata->swelling_low_temp_recov_1st = (int)temp;
|
||
|
if (ret)
|
||
|
pr_info("%s: swelling low temp recovery is Empty\n", __func__);
|
||
|
|
||
|
ret = of_property_read_u32(np, "battery,swelling_low_temp_block_2nd",
|
||
|
&temp);
|
||
|
pdata->swelling_low_temp_block_2nd = (int)temp;
|
||
|
if (ret)
|
||
|
pr_info("%s: swelling low temp block is Empty\n", __func__);
|
||
|
|
||
|
ret = of_property_read_u32(np, "battery,swelling_low_temp_recov_2nd",
|
||
|
&temp);
|
||
|
pdata->swelling_low_temp_recov_2nd = (int)temp;
|
||
|
if (ret)
|
||
|
pr_info("%s: swelling low temp recovery 2nd is Empty\n", __func__);
|
||
|
|
||
|
ret = of_property_read_u32(np, "battery,swelling_low_temp_current",
|
||
|
&pdata->swelling_low_temp_current);
|
||
|
if (ret) {
|
||
|
pr_info("%s: swelling_low_temp_current is Empty, Defualt value 600mA \n", __func__);
|
||
|
pdata->swelling_low_temp_current = 600;
|
||
|
}
|
||
|
|
||
|
ret = of_property_read_u32(np, "battery,swelling_low_temp_current_2nd",
|
||
|
&pdata->swelling_low_temp_current_2nd);
|
||
|
if (ret) {
|
||
|
pr_info("%s: swelling_low_temp_current_2nd is Empty, set swelling_low_temp_current value \n", __func__);
|
||
|
pdata->swelling_low_temp_current_2nd = pdata->swelling_low_temp_current;
|
||
|
}
|
||
|
|
||
|
ret = of_property_read_u32(np, "battery,swelling_low_temp_topoff",
|
||
|
&pdata->swelling_low_temp_topoff);
|
||
|
if (ret) {
|
||
|
pr_info("%s: swelling_low_temp_topoff is Empty, Defualt value 200mA \n", __func__);
|
||
|
pdata->swelling_low_temp_topoff = 200;
|
||
|
}
|
||
|
|
||
|
ret = of_property_read_u32(np, "battery,swelling_high_temp_current",
|
||
|
&pdata->swelling_high_temp_current);
|
||
|
if (ret) {
|
||
|
pr_info("%s: swelling_high_temp_current is Empty, Defualt value 1300mA \n", __func__);
|
||
|
pdata->swelling_high_temp_current = 1300;
|
||
|
}
|
||
|
|
||
|
ret = of_property_read_u32(np, "battery,swelling_high_temp_topoff",
|
||
|
&pdata->swelling_high_temp_topoff);
|
||
|
if (ret) {
|
||
|
pr_info("%s: swelling_high_temp_topoff is Empty, Defualt value 200mA \n", __func__);
|
||
|
pdata->swelling_high_temp_topoff = 200;
|
||
|
}
|
||
|
|
||
|
ret = of_property_read_u32(np, "battery,swelling_wc_high_temp_current",
|
||
|
&pdata->swelling_wc_high_temp_current);
|
||
|
if (ret) {
|
||
|
pr_info("%s: swelling_wc_high_temp_current is Empty, Defualt value 600mA \n", __func__);
|
||
|
pdata->swelling_wc_high_temp_current = 600;
|
||
|
}
|
||
|
|
||
|
ret = of_property_read_u32(np, "battery,swelling_wc_low_temp_current",
|
||
|
&pdata->swelling_wc_low_temp_current);
|
||
|
if (ret) {
|
||
|
pr_info("%s: swelling_wc_low_temp_current is Empty, Defualt value 600mA \n", __func__);
|
||
|
pdata->swelling_wc_low_temp_current = 600;
|
||
|
}
|
||
|
|
||
|
ret = of_property_read_u32(np, "battery,swelling_wc_low_temp_current_2nd",
|
||
|
&pdata->swelling_wc_low_temp_current_2nd);
|
||
|
if (ret) {
|
||
|
pr_info("%s: swelling_wc_low_temp_current_2nd is Empty, set swelling_wc_low_temp_current \n", __func__);
|
||
|
pdata->swelling_wc_low_temp_current_2nd = pdata->swelling_low_temp_current;
|
||
|
}
|
||
|
|
||
|
pdata->swelling_drop_float_voltage_lowtemp = of_property_read_bool(np,
|
||
|
"battery,swelling_drop_float_voltage_lowtemp");
|
||
|
if (pdata->swelling_drop_float_voltage_lowtemp) {
|
||
|
pr_info("%s: swellingdrop float voltage in low temp mode\n", __func__);
|
||
|
|
||
|
ret = of_property_read_u32(np, "battery,swelling_low_rechg_voltage",
|
||
|
&pdata->swelling_low_rechg_voltage);
|
||
|
if (ret) {
|
||
|
pr_info("%s: swelling_low_rechg_voltage is Empty, Default value 4000mV \n", __func__);
|
||
|
pdata->swelling_low_rechg_voltage = 4000;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
battery->swelling_low_temp_3rd_ctrl = of_property_read_bool(np,
|
||
|
"battery,swelling_low_temp_3rd_ctrl");
|
||
|
if (battery->swelling_low_temp_3rd_ctrl) {
|
||
|
ret = of_property_read_u32(np, "battery,swelling_low_temp_block_3rd",
|
||
|
&temp);
|
||
|
pdata->swelling_low_temp_block_3rd = (int)temp;
|
||
|
if (ret) {
|
||
|
pr_info("%s: swelling low temp block is Empty\n", __func__);
|
||
|
pdata->swelling_low_temp_block_3rd = pdata->swelling_low_temp_block_2nd;
|
||
|
}
|
||
|
|
||
|
ret = of_property_read_u32(np, "battery,swelling_low_temp_recov_3rd",
|
||
|
&temp);
|
||
|
pdata->swelling_low_temp_recov_3rd = (int)temp;
|
||
|
if (ret) {
|
||
|
pr_info("%s: swelling low temp recovery 3rd is Empty\n", __func__);
|
||
|
pdata->swelling_low_temp_recov_3rd = pdata->swelling_low_temp_recov_2nd;
|
||
|
}
|
||
|
|
||
|
ret = of_property_read_u32(np, "battery,swelling_low_temp_current_3rd",
|
||
|
&pdata->swelling_low_temp_current_3rd);
|
||
|
if (ret) {
|
||
|
pr_info("%s: swelling_low_temp_current_3rd is Empty, set swelling_low_temp_current value \n", __func__);
|
||
|
pdata->swelling_low_temp_current_3rd = pdata->swelling_low_temp_current_2nd;
|
||
|
}
|
||
|
|
||
|
ret = of_property_read_u32(np, "battery,swelling_wc_low_temp_current_3rd",
|
||
|
&pdata->swelling_wc_low_temp_current_3rd);
|
||
|
if (ret) {
|
||
|
pr_info("%s: swelling_wc_low_temp_current_3rd is Empty, set swelling_wc_low_temp_current \n", __func__);
|
||
|
pdata->swelling_wc_low_temp_current_3rd = pdata->swelling_low_temp_current_2nd;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
ret = of_property_read_u32(np, "battery,swelling_drop_float_voltage",
|
||
|
(unsigned int *)&pdata->swelling_drop_float_voltage);
|
||
|
if (ret) {
|
||
|
pr_info("%s: swelling drop float voltage is Empty, Default value 4250mV \n", __func__);
|
||
|
pdata->swelling_drop_float_voltage = 4250;
|
||
|
pdata->swelling_drop_voltage_condition = 4250;
|
||
|
} else {
|
||
|
pdata->swelling_drop_voltage_condition = (pdata->swelling_drop_float_voltage > 10000) ?
|
||
|
(pdata->swelling_drop_float_voltage / 10) : (pdata->swelling_drop_float_voltage);
|
||
|
pr_info("%s : swelling drop voltage(set : %d, condition : %d)\n", __func__,
|
||
|
pdata->swelling_drop_float_voltage, pdata->swelling_drop_voltage_condition);
|
||
|
}
|
||
|
|
||
|
ret = of_property_read_u32(np, "battery,swelling_high_rechg_voltage",
|
||
|
(unsigned int *)&pdata->swelling_high_rechg_voltage);
|
||
|
if (ret) {
|
||
|
pr_info("%s: swelling_high_rechg_voltage is Empty\n", __func__);
|
||
|
pdata->swelling_high_rechg_voltage = 4150;
|
||
|
}
|
||
|
|
||
|
ret = of_property_read_u32(np, "battery,swelling_low_rechg_voltage",
|
||
|
(unsigned int *)&pdata->swelling_low_rechg_voltage);
|
||
|
if (ret) {
|
||
|
pr_info("%s: swelling_low_rechg_voltage is Empty\n", __func__);
|
||
|
pdata->swelling_low_rechg_voltage = 4000;
|
||
|
}
|
||
|
|
||
|
ret = of_property_read_u32(np, "battery,swelling_low_rechg_thr",
|
||
|
(unsigned int *)&pdata->swelling_low_rechg_thr);
|
||
|
if (ret) {
|
||
|
pr_info("%s: swelling_low_rechg_thr is Empty\n", __func__);
|
||
|
pdata->swelling_low_rechg_thr = 150;
|
||
|
}
|
||
|
|
||
|
pr_info("%s : SWELLING_HIGH_TEMP(%d) SWELLING_HIGH_TEMP_RECOVERY(%d)\n"
|
||
|
"SWELLING_LOW_TEMP_1st(%d) SWELLING_LOW_TEMP_RECOVERY_1st(%d) "
|
||
|
"SWELLING_LOW_TEMP_2nd(%d) SWELLING_LOW_TEMP_RECOVERY_2nd(%d) "
|
||
|
"SWELLING_LOW_CURRENT(%d, %d), SWELLING_HIGH_CURRENT(%d, %d)\n"
|
||
|
"SWELLING_HIGH_TEMP_RCHG_VOL(%d), SWELLING_LOW_TEMP_RCHG_THRESHOLD(%d)\n",
|
||
|
__func__, pdata->swelling_high_temp_block, pdata->swelling_high_temp_recov,
|
||
|
pdata->swelling_low_temp_block_1st, pdata->swelling_low_temp_recov_1st,
|
||
|
pdata->swelling_low_temp_block_2nd, pdata->swelling_low_temp_recov_2nd,
|
||
|
pdata->swelling_low_temp_current, pdata->swelling_low_temp_topoff,
|
||
|
pdata->swelling_high_temp_current, pdata->swelling_high_temp_topoff,
|
||
|
pdata->swelling_high_rechg_voltage, pdata->swelling_low_rechg_thr);
|
||
|
#endif
|
||
|
|
||
|
#if defined(CONFIG_CALC_TIME_TO_FULL)
|
||
|
ret = of_property_read_u32(np, "battery,ttf_hv_12v_charge_current",
|
||
|
&pdata->ttf_hv_12v_charge_current);
|
||
|
if (ret) {
|
||
|
pdata->ttf_hv_12v_charge_current =
|
||
|
pdata->charging_current[SEC_BATTERY_CABLE_12V_TA].fast_charging_current;
|
||
|
pr_info("%s: ttf_hv_12v_charge_current is Empty, Defualt value %d \n",
|
||
|
__func__, pdata->ttf_hv_12v_charge_current);
|
||
|
}
|
||
|
ret = of_property_read_u32(np, "battery,ttf_hv_charge_current",
|
||
|
&pdata->ttf_hv_charge_current);
|
||
|
if (ret) {
|
||
|
pdata->ttf_hv_charge_current =
|
||
|
pdata->charging_current[SEC_BATTERY_CABLE_9V_TA].fast_charging_current;
|
||
|
pr_info("%s: ttf_hv_charge_current is Empty, Defualt value %d \n",
|
||
|
__func__, pdata->ttf_hv_charge_current);
|
||
|
}
|
||
|
|
||
|
ret = of_property_read_u32(np, "battery,ttf_hv_wireless_charge_current",
|
||
|
&pdata->ttf_hv_wireless_charge_current);
|
||
|
if (ret) {
|
||
|
pr_info("%s: ttf_hv_wireless_charge_current is Empty, Defualt value 0 \n", __func__);
|
||
|
pdata->ttf_hv_wireless_charge_current =
|
||
|
pdata->charging_current[SEC_BATTERY_CABLE_HV_WIRELESS].fast_charging_current - 300;
|
||
|
}
|
||
|
|
||
|
ret = of_property_read_u32(np, "battery,ttf_hv_12v_wireless_charge_current",
|
||
|
&pdata->ttf_hv_12v_wireless_charge_current);
|
||
|
if (ret) {
|
||
|
pr_info("%s: ttf_hv_12v_wireless_charge_current is Empty, Defualt value 0 \n", __func__);
|
||
|
pdata->ttf_hv_12v_wireless_charge_current =
|
||
|
pdata->charging_current[SEC_BATTERY_CABLE_HV_WIRELESS_20].fast_charging_current - 300;
|
||
|
}
|
||
|
|
||
|
ret = of_property_read_u32(np, "battery,ttf_wireless_charge_current",
|
||
|
&pdata->ttf_wireless_charge_current);
|
||
|
if (ret) {
|
||
|
pr_info("%s: ttf_wireless_charge_current is Empty, Defualt value 0 \n", __func__);
|
||
|
pdata->ttf_wireless_charge_current =
|
||
|
pdata->charging_current[SEC_BATTERY_CABLE_WIRELESS].input_current_limit;
|
||
|
}
|
||
|
|
||
|
ret = of_property_read_u32(np, "battery,ttf_dc25_charge_current",
|
||
|
&pdata->ttf_dc25_charge_current);
|
||
|
if (ret) {
|
||
|
pr_info("%s: ttf_dc25_charge_current is Empty, Defualt value 0 \n", __func__);
|
||
|
pdata->ttf_dc25_charge_current =
|
||
|
pdata->charging_current[SEC_BATTERY_CABLE_9V_TA].fast_charging_current;
|
||
|
}
|
||
|
|
||
|
ret = of_property_read_u32(np, "battery,ttf_dc45_charge_current",
|
||
|
&pdata->ttf_dc45_charge_current);
|
||
|
if (ret) {
|
||
|
pr_info("%s: ttf_dc45_charge_current is Empty, Defualt value 0 \n", __func__);
|
||
|
pdata->ttf_dc45_charge_current = pdata->ttf_dc25_charge_current;
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#if defined(CONFIG_WIRELESS_FIRMWARE_UPDATE)
|
||
|
/* wpc_det */
|
||
|
ret = pdata->wpc_det = of_get_named_gpio(np, "battery,wpc_det", 0);
|
||
|
if (ret < 0) {
|
||
|
pr_info("%s : can't get wpc_det\n", __func__);
|
||
|
}
|
||
|
|
||
|
/* mst_pwr_en */
|
||
|
ret = pdata->mst_pwr_en = of_get_named_gpio(np, "battery,mst_pwr_en", 0);
|
||
|
if (ret < 0) {
|
||
|
pr_info("%s : can't get mst_pwr_en\n", __func__);
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
/* 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);
|
||
|
#if defined(CONFIG_BATTERY_AGE_FORECAST_B2B)
|
||
|
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, max_c:%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,
|
||
|
battery->pdata->age_data[len].max_charging_current);
|
||
|
}
|
||
|
#else
|
||
|
#if defined(CONFIG_STEP_CHARGING)
|
||
|
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, step charging condition:%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,
|
||
|
battery->pdata->age_data[len].step_charging_condition);
|
||
|
}
|
||
|
#else
|
||
|
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);
|
||
|
}
|
||
|
#endif
|
||
|
#endif
|
||
|
} 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 = pdata->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_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,input_current_by_siop_20", &pdata->input_current_by_siop_20);
|
||
|
if (ret) {
|
||
|
pr_info("%s : input_current_by_siop_20 is Empty\n", __func__);
|
||
|
pdata->input_current_by_siop_20 = 0;
|
||
|
}
|
||
|
|
||
|
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, event_waiting_time : %d\n"
|
||
|
"polling_type : %d, initial_count : %d\n"
|
||
|
"battery_check_type : %d, check_count : %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",
|
||
|
__func__,
|
||
|
pdata->vendor, pdata->technology,pdata->cable_check_type,
|
||
|
pdata->cable_source_type, pdata->event_waiting_time,
|
||
|
pdata->polling_type, pdata->monitor_initial_count,
|
||
|
pdata->battery_check_type, 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);
|
||
|
|
||
|
#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_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
|
||
|
|
||
|
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
|