kernel_samsung_a34x-permissive/drivers/battery/common/sec_battery_sysfs.c

4445 lines
136 KiB
C
Raw Normal View History

/*
* sec_battery_sysfs.c
* Samsung Mobile Battery Driver
*
* Copyright (C) 2018 Samsung Electronics
*
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
#include "sec_battery.h"
#include "sec_battery_sysfs.h"
#if IS_ENABLED(CONFIG_SEC_ABC)
#include <linux/sti/abc_common.h>
#endif
static struct device_attribute sec_battery_attrs[] = {
SEC_BATTERY_ATTR(batt_reset_soc),
SEC_BATTERY_ATTR(batt_read_raw_soc),
SEC_BATTERY_ATTR(batt_read_adj_soc),
SEC_BATTERY_ATTR(batt_type),
SEC_BATTERY_ATTR(batt_vfocv),
SEC_BATTERY_ATTR(batt_vol_adc),
SEC_BATTERY_ATTR(batt_vol_adc_cal),
SEC_BATTERY_ATTR(batt_vol_aver),
SEC_BATTERY_ATTR(batt_vol_adc_aver),
SEC_BATTERY_ATTR(batt_voltage_now),
SEC_BATTERY_ATTR(batt_current_ua_now),
SEC_BATTERY_ATTR(batt_current_ua_avg),
SEC_BATTERY_ATTR(batt_filter_cfg),
SEC_BATTERY_ATTR(batt_temp),
SEC_BATTERY_ATTR(batt_temp_raw),
SEC_BATTERY_ATTR(batt_temp_adc),
SEC_BATTERY_ATTR(batt_temp_aver),
SEC_BATTERY_ATTR(batt_temp_adc_aver),
SEC_BATTERY_ATTR(usb_temp),
SEC_BATTERY_ATTR(usb_temp_adc),
SEC_BATTERY_ATTR(chg_temp),
SEC_BATTERY_ATTR(chg_temp_adc),
SEC_BATTERY_ATTR(sub_bat_temp),
SEC_BATTERY_ATTR(sub_bat_temp_adc),
SEC_BATTERY_ATTR(sub_chg_temp),
SEC_BATTERY_ATTR(sub_chg_temp_adc),
#if IS_ENABLED(CONFIG_DIRECT_CHARGING)
SEC_BATTERY_ATTR(dchg_adc_mode_ctrl),
SEC_BATTERY_ATTR(dchg_temp),
SEC_BATTERY_ATTR(dchg_temp_adc),
#endif
SEC_BATTERY_ATTR(blkt_temp),
SEC_BATTERY_ATTR(blkt_temp_adc),
SEC_BATTERY_ATTR(batt_vf_adc),
SEC_BATTERY_ATTR(batt_slate_mode),
SEC_BATTERY_ATTR(batt_lp_charging),
SEC_BATTERY_ATTR(siop_activated),
SEC_BATTERY_ATTR(siop_level),
SEC_BATTERY_ATTR(siop_event),
SEC_BATTERY_ATTR(batt_charging_source),
SEC_BATTERY_ATTR(fg_reg_dump),
SEC_BATTERY_ATTR(fg_reset_cap),
SEC_BATTERY_ATTR(fg_capacity),
SEC_BATTERY_ATTR(fg_asoc),
SEC_BATTERY_ATTR(auth),
SEC_BATTERY_ATTR(chg_current_adc),
SEC_BATTERY_ATTR(wc_adc),
SEC_BATTERY_ATTR(wc_status),
SEC_BATTERY_ATTR(wc_enable),
SEC_BATTERY_ATTR(wc_control),
SEC_BATTERY_ATTR(wc_control_cnt),
SEC_BATTERY_ATTR(led_cover),
SEC_BATTERY_ATTR(hv_charger_status),
SEC_BATTERY_ATTR(hv_wc_charger_status),
SEC_BATTERY_ATTR(hv_charger_set),
SEC_BATTERY_ATTR(factory_mode),
SEC_BATTERY_ATTR(store_mode),
SEC_BATTERY_ATTR(update),
SEC_BATTERY_ATTR(test_mode),
SEC_BATTERY_ATTR(call),
SEC_BATTERY_ATTR(2g_call),
SEC_BATTERY_ATTR(talk_gsm),
SEC_BATTERY_ATTR(3g_call),
SEC_BATTERY_ATTR(talk_wcdma),
SEC_BATTERY_ATTR(music),
SEC_BATTERY_ATTR(video),
SEC_BATTERY_ATTR(browser),
SEC_BATTERY_ATTR(hotspot),
SEC_BATTERY_ATTR(camera),
SEC_BATTERY_ATTR(camcorder),
SEC_BATTERY_ATTR(data_call),
SEC_BATTERY_ATTR(wifi),
SEC_BATTERY_ATTR(wibro),
SEC_BATTERY_ATTR(lte),
SEC_BATTERY_ATTR(lcd),
#if defined(CONFIG_ISDB_CHARGING_CONTROL)
SEC_BATTERY_ATTR(batt_event_isdb),
#endif
SEC_BATTERY_ATTR(gps),
SEC_BATTERY_ATTR(event),
SEC_BATTERY_ATTR(batt_temp_table),
SEC_BATTERY_ATTR(batt_high_current_usb),
#if defined(CONFIG_ENG_BATTERY_CONCEPT)
SEC_BATTERY_ATTR(test_charge_current),
#if defined(CONFIG_STEP_CHARGING)
SEC_BATTERY_ATTR(test_step_condition),
#endif
#endif
SEC_BATTERY_ATTR(set_stability_test),
SEC_BATTERY_ATTR(batt_capacity_max),
SEC_BATTERY_ATTR(batt_repcap_1st),
SEC_BATTERY_ATTR(batt_inbat_voltage),
SEC_BATTERY_ATTR(batt_inbat_voltage_ocv),
SEC_BATTERY_ATTR(batt_inbat_voltage_adc),
SEC_BATTERY_ATTR(vbyp_voltage),
SEC_BATTERY_ATTR(check_sub_chg),
SEC_BATTERY_ATTR(batt_inbat_wireless_cs100),
SEC_BATTERY_ATTR(hmt_ta_connected),
SEC_BATTERY_ATTR(hmt_ta_charge),
#if defined(CONFIG_SEC_FACTORY)
SEC_BATTERY_ATTR(afc_test_fg_mode),
#endif
#if defined(CONFIG_BATTERY_AGE_FORECAST)
SEC_BATTERY_ATTR(fg_cycle),
SEC_BATTERY_ATTR(fg_full_voltage),
SEC_BATTERY_ATTR(fg_fullcapnom),
SEC_BATTERY_ATTR(battery_cycle),
#if defined(CONFIG_BATTERY_AGE_FORECAST_DETACHABLE)
SEC_BATTERY_ATTR(batt_after_manufactured),
#endif
SEC_BATTERY_ATTR(battery_cycle_test),
#endif
SEC_BATTERY_ATTR(batt_wpc_temp),
SEC_BATTERY_ATTR(batt_wpc_temp_adc),
SEC_BATTERY_ATTR(mst_switch_test), /* MFC MST switch test */
#if defined(CONFIG_WIRELESS_FIRMWARE_UPDATE)
SEC_BATTERY_ATTR(batt_wireless_firmware_update),
SEC_BATTERY_ATTR(otp_firmware_result),
SEC_BATTERY_ATTR(wc_ic_grade),
SEC_BATTERY_ATTR(wc_ic_chip_id),
SEC_BATTERY_ATTR(otp_firmware_ver_bin),
SEC_BATTERY_ATTR(otp_firmware_ver),
#endif
SEC_BATTERY_ATTR(wc_vout),
SEC_BATTERY_ATTR(wc_vrect),
SEC_BATTERY_ATTR(wc_tx_en),
SEC_BATTERY_ATTR(wc_tx_vout),
SEC_BATTERY_ATTR(batt_hv_wireless_status),
SEC_BATTERY_ATTR(batt_hv_wireless_pad_ctrl),
SEC_BATTERY_ATTR(wc_tx_id),
SEC_BATTERY_ATTR(wc_op_freq),
SEC_BATTERY_ATTR(wc_cmd_info),
SEC_BATTERY_ATTR(wc_rx_connected),
SEC_BATTERY_ATTR(wc_rx_connected_dev),
SEC_BATTERY_ATTR(wc_tx_mfc_vin_from_uno),
SEC_BATTERY_ATTR(wc_tx_mfc_iin_from_uno),
#if defined(CONFIG_WIRELESS_TX_MODE)
SEC_BATTERY_ATTR(wc_tx_avg_curr),
SEC_BATTERY_ATTR(wc_tx_total_pwr),
#endif
SEC_BATTERY_ATTR(wc_tx_stop_capacity),
SEC_BATTERY_ATTR(wc_tx_timer_en),
#if defined(CONFIG_ENG_BATTERY_CONCEPT)
SEC_BATTERY_ATTR(batt_tune_float_voltage),
SEC_BATTERY_ATTR(batt_tune_input_charge_current),
SEC_BATTERY_ATTR(batt_tune_fast_charge_current),
SEC_BATTERY_ATTR(batt_tune_wireless_vout_current),
SEC_BATTERY_ATTR(batt_tune_ui_term_cur_1st),
SEC_BATTERY_ATTR(batt_tune_ui_term_cur_2nd),
SEC_BATTERY_ATTR(batt_tune_temp_high_normal),
SEC_BATTERY_ATTR(batt_tune_temp_high_rec_normal),
SEC_BATTERY_ATTR(batt_tune_temp_low_normal),
SEC_BATTERY_ATTR(batt_tune_temp_low_rec_normal),
SEC_BATTERY_ATTR(batt_tune_chg_temp_high),
SEC_BATTERY_ATTR(batt_tune_chg_temp_rec),
SEC_BATTERY_ATTR(batt_tune_chg_limit_cur),
SEC_BATTERY_ATTR(batt_tune_lrp_temp_high_lcdon),
SEC_BATTERY_ATTR(batt_tune_lrp_temp_high_lcdoff),
SEC_BATTERY_ATTR(batt_tune_coil_temp_high),
SEC_BATTERY_ATTR(batt_tune_coil_temp_rec),
SEC_BATTERY_ATTR(batt_tune_coil_limit_cur),
SEC_BATTERY_ATTR(batt_tune_wpc_temp_high),
SEC_BATTERY_ATTR(batt_tune_wpc_temp_high_rec),
SEC_BATTERY_ATTR(batt_tune_dchg_temp_high),
SEC_BATTERY_ATTR(batt_tune_dchg_temp_high_rec),
SEC_BATTERY_ATTR(batt_tune_dchg_batt_temp_high),
SEC_BATTERY_ATTR(batt_tune_dchg_batt_temp_high_rec),
SEC_BATTERY_ATTR(batt_tune_dchg_limit_input_cur),
SEC_BATTERY_ATTR(batt_tune_dchg_limit_chg_cur),
#if defined(CONFIG_WIRELESS_TX_MODE)
SEC_BATTERY_ATTR(batt_tune_tx_mfc_iout_gear),
SEC_BATTERY_ATTR(batt_tune_tx_mfc_iout_phone),
#endif
#endif
#if defined(CONFIG_UPDATE_BATTERY_DATA)
SEC_BATTERY_ATTR(batt_update_data),
#endif
SEC_BATTERY_ATTR(batt_misc_event),
SEC_BATTERY_ATTR(batt_tx_event),
SEC_BATTERY_ATTR(batt_ext_dev_chg),
SEC_BATTERY_ATTR(batt_wdt_control),
SEC_BATTERY_ATTR(mode),
SEC_BATTERY_ATTR(check_ps_ready),
SEC_BATTERY_ATTR(batt_chip_id),
SEC_BATTERY_ATTR(error_cause),
SEC_BATTERY_ATTR(cisd_fullcaprep_max),
#if defined(CONFIG_BATTERY_CISD)
SEC_BATTERY_ATTR(cisd_data),
SEC_BATTERY_ATTR(cisd_data_json),
SEC_BATTERY_ATTR(cisd_data_d_json),
SEC_BATTERY_ATTR(cisd_wire_count),
SEC_BATTERY_ATTR(cisd_wc_data),
SEC_BATTERY_ATTR(cisd_wc_data_json),
SEC_BATTERY_ATTR(cisd_power_data),
SEC_BATTERY_ATTR(cisd_power_data_json),
SEC_BATTERY_ATTR(cisd_pd_data),
SEC_BATTERY_ATTR(cisd_pd_data_json),
SEC_BATTERY_ATTR(cisd_cable_data),
SEC_BATTERY_ATTR(cisd_cable_data_json),
SEC_BATTERY_ATTR(cisd_tx_data),
SEC_BATTERY_ATTR(cisd_tx_data_json),
SEC_BATTERY_ATTR(cisd_event_data),
SEC_BATTERY_ATTR(cisd_event_data_json),
SEC_BATTERY_ATTR(prev_battery_data),
SEC_BATTERY_ATTR(prev_battery_info),
#endif
SEC_BATTERY_ATTR(safety_timer_set),
SEC_BATTERY_ATTR(batt_swelling_control),
SEC_BATTERY_ATTR(batt_battery_id),
#if IS_ENABLED(CONFIG_DUAL_BATTERY)
SEC_BATTERY_ATTR(batt_sub_battery_id),
#endif
SEC_BATTERY_ATTR(batt_temp_control_test),
SEC_BATTERY_ATTR(safety_timer_info),
SEC_BATTERY_ATTR(batt_shipmode_test),
SEC_BATTERY_ATTR(batt_misc_test),
SEC_BATTERY_ATTR(batt_temp_test),
SEC_BATTERY_ATTR(batt_current_event),
SEC_BATTERY_ATTR(batt_jig_gpio),
SEC_BATTERY_ATTR(cc_info),
#if defined(CONFIG_WIRELESS_AUTH)
SEC_BATTERY_ATTR(wc_auth_adt_sent),
#endif
SEC_BATTERY_ATTR(wc_duo_rx_power),
#if IS_ENABLED(CONFIG_DUAL_BATTERY)
SEC_BATTERY_ATTR(batt_main_voltage),
SEC_BATTERY_ATTR(batt_sub_voltage),
SEC_BATTERY_ATTR(batt_main_current_ma),
SEC_BATTERY_ATTR(batt_sub_current_ma),
SEC_BATTERY_ATTR(batt_main_con_det),
SEC_BATTERY_ATTR(batt_sub_con_det),
#if IS_ENABLED(CONFIG_LIMITER_S2ASL01)
SEC_BATTERY_ATTR(batt_main_enb),
SEC_BATTERY_ATTR(batt_main_enb2),
SEC_BATTERY_ATTR(batt_sub_enb),
SEC_BATTERY_ATTR(batt_sub_pwr_mode2),
#endif
SEC_BATTERY_ATTR(batt_main_shipmode),
SEC_BATTERY_ATTR(batt_sub_shipmode),
#if IS_ENABLED(CONFIG_DUAL_FUELGAUGE)
SEC_BATTERY_ATTR(batt_main_soc),
SEC_BATTERY_ATTR(batt_sub_soc),
SEC_BATTERY_ATTR(batt_main_repcap),
SEC_BATTERY_ATTR(batt_sub_repcap),
SEC_BATTERY_ATTR(batt_main_fullcaprep),
SEC_BATTERY_ATTR(batt_sub_fullcaprep),
#endif
#endif
SEC_BATTERY_ATTR(ext_event),
SEC_BATTERY_ATTR(direct_charging_status),
#if IS_ENABLED(CONFIG_DIRECT_CHARGING)
SEC_BATTERY_ATTR(direct_charging_step),
SEC_BATTERY_ATTR(direct_charging_iin),
SEC_BATTERY_ATTR(direct_charging_chg_status),
SEC_BATTERY_ATTR(switch_charging_source),
#endif
SEC_BATTERY_ATTR(charging_type),
SEC_BATTERY_ATTR(batt_factory_mode),
SEC_BATTERY_ATTR(boot_completed),
SEC_BATTERY_ATTR(pd_disable),
SEC_BATTERY_ATTR(factory_mode_relieve),
SEC_BATTERY_ATTR(factory_mode_bypass),
SEC_BATTERY_ATTR(normal_mode_bypass),
SEC_BATTERY_ATTR(factory_voltage_regulation),
SEC_BATTERY_ATTR(factory_mode_disable),
SEC_BATTERY_ATTR(usb_conf_test),
SEC_BATTERY_ATTR(charge_otg_control),
SEC_BATTERY_ATTR(charge_uno_control),
SEC_BATTERY_ATTR(charge_counter_shadow),
SEC_BATTERY_ATTR(voter_status),
#if defined(CONFIG_WIRELESS_IC_PARAM)
SEC_BATTERY_ATTR(wc_param_info),
#endif
SEC_BATTERY_ATTR(chg_info),
SEC_BATTERY_ATTR(batt_full_capacity),
SEC_BATTERY_ATTR(lrp),
SEC_BATTERY_ATTR(hp_d2d),
SEC_BATTERY_ATTR(charger_ic_name),
SEC_BATTERY_ATTR(dc_rb_en),
SEC_BATTERY_ATTR(dc_op_mode),
SEC_BATTERY_ATTR(dc_adc_mode),
SEC_BATTERY_ATTR(dc_vbus),
SEC_BATTERY_ATTR(chg_type),
SEC_BATTERY_ATTR(mst_en),
SEC_BATTERY_ATTR(spsn_test),
SEC_BATTERY_ATTR(chg_soc_lim),
};
static struct device_attribute sec_pogo_attrs[] = {
SEC_POGO_ATTR(sec_type),
};
static struct device_attribute sec_otg_attrs[] = {
SEC_OTG_ATTR(sec_type),
};
ssize_t sec_bat_show_attrs(struct device *dev,
struct device_attribute *attr, char *buf)
{
struct power_supply *psy = dev_get_drvdata(dev);
struct sec_battery_info *battery = power_supply_get_drvdata(psy);
const ptrdiff_t offset = attr - sec_battery_attrs;
union power_supply_propval value = {0, };
int i = 0;
int ret = 0;
switch (offset) {
case BATT_RESET_SOC:
break;
case BATT_READ_RAW_SOC:
{
value.intval =
SEC_FUELGAUGE_CAPACITY_TYPE_RAW;
psy_do_property(battery->pdata->fuelgauge_name, get,
POWER_SUPPLY_PROP_CAPACITY, value);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
value.intval);
}
break;
case BATT_READ_ADJ_SOC:
break;
case BATT_TYPE:
i += scnprintf(buf + i, PAGE_SIZE - i, "%s\n",
battery->batt_type);
break;
case BATT_VFOCV:
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
battery->voltage_ocv);
break;
case BATT_VOL_ADC:
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
battery->inbat_adc);
break;
case BATT_VOL_ADC_CAL:
break;
case BATT_VOL_AVER:
break;
case BATT_VOL_ADC_AVER:
break;
case BATT_VOLTAGE_NOW:
{
value.intval = SEC_BATTERY_VOLTAGE_MV;
psy_do_property(battery->pdata->fuelgauge_name, get,
POWER_SUPPLY_PROP_VOLTAGE_NOW, value);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
value.intval * 1000);
}
break;
case BATT_CURRENT_UA_NOW:
{
value.intval = SEC_BATTERY_CURRENT_UA;
psy_do_property(battery->pdata->fuelgauge_name, get,
POWER_SUPPLY_PROP_CURRENT_NOW, value);
#if defined(CONFIG_SEC_FACTORY)
pr_err("%s: batt_current_ua_now (%d)\n",
__func__, value.intval);
#endif
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
value.intval);
}
break;
case BATT_CURRENT_UA_AVG:
{
value.intval = SEC_BATTERY_CURRENT_UA;
psy_do_property(battery->pdata->fuelgauge_name, get,
POWER_SUPPLY_PROP_CURRENT_AVG, value);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
value.intval);
}
break;
case BATT_FILTER_CFG:
{
psy_do_property(battery->pdata->fuelgauge_name, get,
POWER_SUPPLY_EXT_PROP_FILTER_CFG, value);
i += scnprintf(buf + i, PAGE_SIZE - i, "%x\n",
value.intval);
}
break;
case BATT_TEMP:
value.intval = sec_bat_get_temperature(battery->dev,
&battery->pdata->bat_thm_info, 0,
battery->pdata->charger_name, battery->pdata->fuelgauge_name);
#if !defined(CONFIG_SEC_FACTORY)
if (battery->pdata->lr_enable) {
int sub_bat_temp = sec_bat_get_temperature(battery->dev,
&battery->pdata->sub_bat_thm_info, 0,
battery->pdata->charger_name, battery->pdata->fuelgauge_name);
value.intval = adjust_bat_temp(battery, value.intval, sub_bat_temp);
}
#endif
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
value.intval);
break;
case BATT_TEMP_RAW:
value.intval = sec_bat_get_temperature(battery->dev,
&battery->pdata->bat_thm_info, 0,
battery->pdata->charger_name, battery->pdata->fuelgauge_name);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
value.intval);
break;
case BATT_TEMP_ADC:
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
battery->pdata->bat_thm_info.adc);
break;
case BATT_TEMP_AVER:
break;
case BATT_TEMP_ADC_AVER:
break;
case USB_TEMP:
value.intval = sec_bat_get_temperature(battery->dev, &battery->pdata->usb_thm_info, 0,
battery->pdata->charger_name, battery->pdata->fuelgauge_name);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
value.intval);
break;
case USB_TEMP_ADC:
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
battery->pdata->usb_thm_info.adc);
break;
case BATT_CHG_TEMP:
value.intval = sec_bat_get_temperature(battery->dev,
&battery->pdata->chg_thm_info, 0,
battery->pdata->charger_name, battery->pdata->fuelgauge_name);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
value.intval);
break;
case BATT_CHG_TEMP_ADC:
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
battery->pdata->chg_thm_info.adc);
break;
case SUB_BAT_TEMP:
value.intval = sec_bat_get_temperature(battery->dev, &battery->pdata->sub_bat_thm_info, 0,
battery->pdata->charger_name, battery->pdata->fuelgauge_name);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
value.intval);
break;
case SUB_BAT_TEMP_ADC:
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
battery->pdata->sub_bat_thm_info.adc);
break;
#if IS_ENABLED(CONFIG_DIRECT_CHARGING)
case DCHG_ADC_MODE_CTRL:
break;
case DCHG_TEMP:
{
if (battery->pdata->dctp_by_cgtp)
battery->dchg_temp = battery->chg_temp;
else
battery->dchg_temp = sec_bat_get_temperature(battery->dev,
&battery->pdata->dchg_thm_info, 0,
battery->pdata->charger_name, battery->pdata->fuelgauge_name);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
battery->dchg_temp);
}
break;
case DCHG_TEMP_ADC:
{
switch (battery->pdata->dchg_thm_info.source) {
case SEC_BATTERY_THERMAL_SOURCE_CHG_ADC:
psy_do_property(battery->pdata->charger_name, get,
POWER_SUPPLY_PROP_TEMP, value);
break;
default:
value.intval = -1;
break;
}
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
value.intval);
}
break;
#endif
case BLKT_TEMP:
value.intval = sec_bat_get_temperature(battery->dev, &battery->pdata->blk_thm_info, 0,
battery->pdata->charger_name, battery->pdata->fuelgauge_name);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
value.intval);
break;
case BLKT_TEMP_ADC:
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
battery->pdata->blk_thm_info.adc);
break;
case BATT_VF_ADC:
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
battery->check_adc_value);
break;
case BATT_SLATE_MODE:
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
is_slate_mode(battery));
break;
case BATT_LP_CHARGING:
if (sec_bat_get_lpmode())
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n", sec_bat_get_lpmode());
break;
case SIOP_ACTIVATED:
break;
case SIOP_LEVEL:
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
battery->siop_level);
break;
case SIOP_EVENT:
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
0);
break;
case BATT_CHARGING_SOURCE:
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
battery->cable_type);
break;
case FG_REG_DUMP:
break;
case FG_RESET_CAP:
break;
case FG_CAPACITY:
{
value.intval =
SEC_BATTERY_CAPACITY_DESIGNED;
psy_do_property(battery->pdata->fuelgauge_name, get,
POWER_SUPPLY_PROP_ENERGY_NOW, value);
i += scnprintf(buf + i, PAGE_SIZE - i, "0x%04x ",
value.intval);
value.intval =
SEC_BATTERY_CAPACITY_ABSOLUTE;
psy_do_property(battery->pdata->fuelgauge_name, get,
POWER_SUPPLY_PROP_ENERGY_NOW, value);
i += scnprintf(buf + i, PAGE_SIZE - i, "0x%04x ",
value.intval);
value.intval =
SEC_BATTERY_CAPACITY_TEMPERARY;
psy_do_property(battery->pdata->fuelgauge_name, get,
POWER_SUPPLY_PROP_ENERGY_NOW, value);
i += scnprintf(buf + i, PAGE_SIZE - i, "0x%04x ",
value.intval);
value.intval =
SEC_BATTERY_CAPACITY_CURRENT;
psy_do_property(battery->pdata->fuelgauge_name, get,
POWER_SUPPLY_PROP_ENERGY_NOW, value);
i += scnprintf(buf + i, PAGE_SIZE - i, "0x%04x\n",
value.intval);
}
break;
case FG_ASOC:
value.intval = -1;
{
struct power_supply *psy_fg = NULL;
psy_fg = get_power_supply_by_name(battery->pdata->fuelgauge_name);
if (!psy_fg) {
pr_err("%s: Fail to get psy (%s)\n",
__func__, battery->pdata->fuelgauge_name);
} else {
if (psy_fg->desc->get_property != NULL) {
ret = psy_fg->desc->get_property(psy_fg,
POWER_SUPPLY_PROP_ENERGY_FULL, &value);
if (ret < 0) {
pr_err("%s: Fail to %s get (%d=>%d)\n",
__func__, battery->pdata->fuelgauge_name,
POWER_SUPPLY_PROP_ENERGY_FULL, ret);
}
#if IS_ENABLED(CONFIG_SEC_ABC) && !defined(CONFIG_SEC_FACTORY)
if (!value.intval)
sec_abc_send_event("MODULE=battery@WARN=show_fg_asoc0");
#endif
}
}
}
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
value.intval);
break;
case AUTH:
break;
case CHG_CURRENT_ADC:
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
battery->current_adc);
break;
case WC_ADC:
break;
case WC_STATUS:
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
is_wireless_type(battery->cable_type) ? 1: 0);
break;
case WC_ENABLE:
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
battery->wc_enable);
break;
case WC_CONTROL:
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
battery->wc_enable);
break;
case WC_CONTROL_CNT:
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
battery->wc_enable_cnt_value);
break;
case LED_COVER:
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
battery->led_cover);
break;
case HV_CHARGER_STATUS:
{
int check_val = 0;
check_val = get_chg_power_type(
battery->cable_type, battery->wire_status,
battery->pd_max_charge_power,
battery->max_charge_power);
pr_info("%s : HV_CHARGER_STATUS(%d), max_charger_power(%d), pd_max charge power(%d)\n",
__func__, check_val, battery->max_charge_power, battery->pd_max_charge_power);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n", check_val);
}
break;
case HV_WC_CHARGER_STATUS:
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
is_hv_wireless_type(battery->cable_type) ? 1 : 0);
break;
case HV_CHARGER_SET:
break;
case FACTORY_MODE:
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
battery->factory_mode);
break;
case STORE_MODE:
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
battery->store_mode);
break;
case UPDATE:
break;
case TEST_MODE:
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
battery->test_mode);
break;
case BATT_EVENT_CALL:
break;
case BATT_EVENT_2G_CALL:
break;
case BATT_EVENT_TALK_GSM:
break;
case BATT_EVENT_3G_CALL:
break;
case BATT_EVENT_TALK_WCDMA:
break;
case BATT_EVENT_MUSIC:
break;
case BATT_EVENT_VIDEO:
break;
case BATT_EVENT_BROWSER:
break;
case BATT_EVENT_HOTSPOT:
break;
case BATT_EVENT_CAMERA:
break;
case BATT_EVENT_CAMCORDER:
break;
case BATT_EVENT_DATA_CALL:
break;
case BATT_EVENT_WIFI:
break;
case BATT_EVENT_WIBRO:
break;
case BATT_EVENT_LTE:
break;
case BATT_EVENT_LCD:
break;
#if defined(CONFIG_ISDB_CHARGING_CONTROL)
case BATT_EVENT_ISDB:
break;
#endif
case BATT_EVENT_GPS:
break;
case BATT_EVENT:
break;
case BATT_HIGH_CURRENT_USB:
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
battery->is_hc_usb);
break;
#if defined(CONFIG_ENG_BATTERY_CONCEPT)
case TEST_CHARGE_CURRENT:
{
psy_do_property(battery->pdata->charger_name, get,
POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT, value);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
value.intval);
}
break;
#if defined(CONFIG_STEP_CHARGING)
case TEST_STEP_CONDITION:
{
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
battery->test_step_condition);
}
break;
#endif
#endif
case SET_STABILITY_TEST:
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
battery->stability_test);
break;
case BATT_CAPACITY_MAX:
psy_do_property(battery->pdata->fuelgauge_name, get,
POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN, value);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n", value.intval);
break;
case BATT_REPCAP_1ST:
if (battery->pdata->soc_by_repcap_en) {
psy_do_property(battery->pdata->fuelgauge_name, get,
POWER_SUPPLY_EXT_PROP_CHARGE_FULL_REPCAP, value);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n", value.intval);
} else
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n", -1);
break;
case BATT_INBAT_VOLTAGE:
case BATT_INBAT_VOLTAGE_OCV:
ret = sec_bat_get_inbat_vol_ocv(battery);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
ret);
break;
case BATT_INBAT_VOLTAGE_ADC:
/* run twice */
ret = (sec_bat_get_inbat_vol_by_adc(battery) +\
sec_bat_get_inbat_vol_by_adc(battery)) / 2;
dev_info(battery->dev, "in-battery voltage adc(%d)\n", ret);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
ret);
break;
case BATT_VBYP_VOLTAGE:
value.intval = SEC_BATTERY_VBYP;
psy_do_property(battery->pdata->fuelgauge_name, get,
POWER_SUPPLY_EXT_PROP_MEASURE_INPUT, value);
pr_info("%s: vbyp(%d)mV\n", __func__, value.intval);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
value.intval);
break;
case CHECK_SUB_CHG:
psy_do_property(battery->pdata->charger_name, get,
POWER_SUPPLY_EXT_PROP_CHECK_SUB_CHG_I2C, value);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
value.intval);
pr_info("%s : CHECK_SUB_CHG=%d\n",__func__,value.intval);
break;
case BATT_INBAT_WIRELESS_CS100:
psy_do_property(battery->pdata->wireless_charger_name, get,
POWER_SUPPLY_PROP_STATUS, value);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n", value.intval);
break;
case HMT_TA_CONNECTED:
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
(battery->cable_type == SEC_BATTERY_CABLE_HMT_CONNECTED) ? 1 : 0);
break;
case HMT_TA_CHARGE:
#if IS_ENABLED(CONFIG_PDIC_NOTIFIER) || IS_ENABLED(CONFIG_CCIC_NOTIFIER)
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
(battery->current_event & SEC_BAT_CURRENT_EVENT_CHARGE_DISABLE) ? 0 : 1);
#else
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
(battery->cable_type == SEC_BATTERY_CABLE_HMT_CHARGE) ? 1 : 0);
#endif
break;
#if defined(CONFIG_SEC_FACTORY)
case AFC_TEST_FG_MODE:
break;
#endif
#if defined(CONFIG_BATTERY_AGE_FORECAST)
case FG_CYCLE:
value.intval = SEC_BATTERY_CAPACITY_CYCLE;
psy_do_property(battery->pdata->fuelgauge_name, get,
POWER_SUPPLY_PROP_ENERGY_NOW, value);
value.intval = value.intval / 100;
dev_info(battery->dev, "fg cycle(%d)\n", value.intval);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n", value.intval);
break;
case FG_FULL_VOLTAGE:
{
int recharging_voltage = battery->pdata->recharge_condition_vcell;
if (battery->current_event & SEC_BAT_CURRENT_EVENT_SWELLING_MODE) {
if (battery->current_event & SEC_BAT_CURRENT_EVENT_HIGH_TEMP_SWELLING)
recharging_voltage = battery->pdata->swelling_high_rechg_voltage;
else if (battery->current_event & SEC_BAT_CURRENT_EVENT_LOW_TEMP_SWELLING_COOL3)
recharging_voltage = battery->pdata->swelling_low_cool3_rechg_voltage;
else /* cool1 cool2 */
recharging_voltage = battery->pdata->swelling_low_rechg_voltage;
}
psy_do_property(battery->pdata->charger_name, get,
POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE, value);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d %d\n",
value.intval, recharging_voltage);
break;
}
case FG_FULLCAPNOM:
value.intval =
SEC_BATTERY_CAPACITY_AGEDCELL;
psy_do_property(battery->pdata->fuelgauge_name, get,
POWER_SUPPLY_PROP_ENERGY_NOW, value);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n", value.intval);
break;
#if defined(CONFIG_BATTERY_AGE_FORECAST_DETACHABLE)
case BATT_AFTER_MANUFACTURED:
#endif
case BATTERY_CYCLE:
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n", battery->batt_cycle);
break;
case BATTERY_CYCLE_TEST:
break;
#endif
case BATT_WPC_TEMP:
value.intval = sec_bat_get_temperature(battery->dev, &battery->pdata->wpc_thm_info, 0,
battery->pdata->charger_name, battery->pdata->fuelgauge_name);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
value.intval);
break;
case BATT_WPC_TEMP_ADC:
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
battery->pdata->wpc_thm_info.adc);
break;
case BATT_WIRELESS_MST_SWITCH_TEST:
value.intval = SEC_WIRELESS_MST_SWITCH_VERIFY;
psy_do_property(battery->pdata->wireless_charger_name, get,
POWER_SUPPLY_PROP_MANUFACTURER, value);
pr_info("%s MST switch verify. result: %x\n", __func__, value.intval);
i += scnprintf(buf + i, PAGE_SIZE - i, "%x\n", value.intval);
break;
#if defined(CONFIG_WIRELESS_FIRMWARE_UPDATE)
case BATT_WIRELESS_FIRMWARE_UPDATE:
value.intval = SEC_WIRELESS_OTP_FIRM_VERIFY;
psy_do_property(battery->pdata->wireless_charger_name, get,
POWER_SUPPLY_PROP_MANUFACTURER, value);
pr_info("%s RX firmware verify. result: %d\n", __func__, value.intval);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n", value.intval);
break;
case OTP_FIRMWARE_RESULT:
value.intval = SEC_WIRELESS_OTP_FIRM_RESULT;
psy_do_property(battery->pdata->wireless_charger_name, get,
POWER_SUPPLY_PROP_MANUFACTURER, value);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n", value.intval);
break;
case WC_IC_GRADE:
value.intval = SEC_WIRELESS_IC_GRADE;
psy_do_property(battery->pdata->wireless_charger_name, get,
POWER_SUPPLY_PROP_MANUFACTURER, value);
i += scnprintf(buf + i, PAGE_SIZE - i, "0x%x ", value.intval);
value.intval = SEC_WIRELESS_IC_REVISION;
psy_do_property(battery->pdata->wireless_charger_name, get,
POWER_SUPPLY_PROP_MANUFACTURER, value);
i += scnprintf(buf + i, PAGE_SIZE - i, "0x%x\n", value.intval);
break;
case WC_IC_CHIP_ID:
value.intval = SEC_WIRELESS_IC_CHIP_ID;
psy_do_property(battery->pdata->wireless_charger_name, get,
POWER_SUPPLY_PROP_MANUFACTURER, value);
i += scnprintf(buf + i, PAGE_SIZE - i, "%x\n", value.intval);
break;
case OTP_FIRMWARE_VER_BIN:
value.intval = SEC_WIRELESS_OTP_FIRM_VER_BIN;
psy_do_property(battery->pdata->wireless_charger_name, get,
POWER_SUPPLY_PROP_MANUFACTURER, value);
i += scnprintf(buf + i, PAGE_SIZE - i, "%x\n", value.intval);
break;
case OTP_FIRMWARE_VER:
value.intval = SEC_WIRELESS_OTP_FIRM_VER;
psy_do_property(battery->pdata->wireless_charger_name, get,
POWER_SUPPLY_PROP_MANUFACTURER, value);
i += scnprintf(buf + i, PAGE_SIZE - i, "%x\n", value.intval);
break;
#endif
case WC_VOUT:
psy_do_property(battery->pdata->wireless_charger_name, get,
POWER_SUPPLY_PROP_ENERGY_NOW, value);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n", value.intval);
break;
case WC_VRECT:
psy_do_property(battery->pdata->wireless_charger_name, get,
POWER_SUPPLY_PROP_ENERGY_AVG, value);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n", value.intval);
break;
case WC_TX_EN:
pr_info("%s wc tx enable(%d)",__func__, battery->wc_tx_enable);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
battery->wc_tx_enable);
break;
case WC_TX_VOUT:
pr_info("%s wc tx vout(%d)",__func__, battery->wc_tx_vout);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
battery->wc_tx_vout);
break;
case BATT_HV_WIRELESS_STATUS:
psy_do_property(battery->pdata->wireless_charger_name, get,
POWER_SUPPLY_EXT_PROP_INPUT_VOLTAGE_REGULATION, value);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n", value.intval);
break;
case BATT_HV_WIRELESS_PAD_CTRL:
break;
case WC_TX_ID:
psy_do_property(battery->pdata->wireless_charger_name, get,
POWER_SUPPLY_EXT_PROP_WIRELESS_TX_ID, value);
pr_info("%s TX ID (%d)",__func__, value.intval);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n", value.intval);
break;
case WC_OP_FREQ:
psy_do_property(battery->pdata->wireless_charger_name, get,
POWER_SUPPLY_EXT_PROP_WIRELESS_OP_FREQ, value);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n", value.intval);
break;
case WC_CMD_INFO:
psy_do_property(battery->pdata->wireless_charger_name, get,
POWER_SUPPLY_EXT_PROP_WIRELESS_TRX_CMD, value);
i += scnprintf(buf + i, PAGE_SIZE - i, "0x%02x ",
value.intval);
psy_do_property(battery->pdata->wireless_charger_name, get,
POWER_SUPPLY_EXT_PROP_WIRELESS_TRX_VAL, value);
i += scnprintf(buf + i, PAGE_SIZE - i, "0x%02x ",
value.intval);
break;
case WC_RX_CONNECTED:
pr_info("%s RX Connected (%d)",__func__, battery->wc_rx_connected);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n", battery->wc_rx_connected);
break;
case WC_RX_CONNECTED_DEV:
pr_info("%s RX Type (%d)",__func__, battery->wc_rx_type);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n", battery->wc_rx_type);
break;
case WC_TX_MFC_VIN_FROM_UNO:
psy_do_property(battery->pdata->wireless_charger_name, get,
POWER_SUPPLY_EXT_PROP_WIRELESS_TX_UNO_VIN, value);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
value.intval);
break;
case WC_TX_MFC_IIN_FROM_UNO:
psy_do_property(battery->pdata->wireless_charger_name, get,
POWER_SUPPLY_EXT_PROP_WIRELESS_TX_UNO_IIN, value);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
value.intval);
break;
#if defined(CONFIG_WIRELESS_TX_MODE)
case WC_TX_AVG_CURR:
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
battery->tx_avg_curr);
break;
case WC_TX_TOTAL_PWR:
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
battery->tx_total_power);
/* If PMS read this value, average Tx current will be reset */
battery->tx_time_cnt = 0;
battery->tx_avg_curr = 0;
battery->tx_total_power = 0;
break;
#endif
case WC_TX_STOP_CAPACITY:
ret = battery->pdata->tx_stop_capacity;
pr_info("%s tx stop capacity = %d%%", __func__, ret);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
ret);
break;
case WC_TX_TIMER_EN:
break;
#if defined(CONFIG_ENG_BATTERY_CONCEPT)
case BATT_TUNE_FLOAT_VOLTAGE:
ret = get_sec_vote_result(battery->fv_vote);
pr_info("%s float voltage = %d mA",__func__, ret);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
ret);
break;
case BATT_TUNE_INPUT_CHARGE_CURRENT:
ret = battery->pdata->charging_current[i].input_current_limit;
pr_info("%s input charge current = %d mA",__func__, ret);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
ret);
break;
case BATT_TUNE_FAST_CHARGE_CURRENT:
ret = battery->pdata->charging_current[i].fast_charging_current;
pr_info("%s fast charge current = %d mA",__func__, ret);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
ret);
break;
case BATT_TUNE_WIRELESS_VOUT_CURRENT:
ret = battery->pdata->wireless_power_info[i].vout;
pr_info("%s vout(%d) input_current(%d)",__func__, ret,
battery->pdata->wireless_power_info[i].input_current_limit);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
ret);
break;
case BATT_TUNE_UI_TERM_CURRENT_1ST:
ret = battery->pdata->full_check_current_1st;
pr_info("%s ui term current = %d mA",__func__, ret);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
ret);
break;
case BATT_TUNE_UI_TERM_CURRENT_2ND:
ret = battery->pdata->full_check_current_2nd;
pr_info("%s ui term current = %d mA",__func__, ret);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
ret);
break;
case BATT_TUNE_CHG_TEMP_HIGH:
ret = battery->pdata->chg_high_temp;
pr_info("%s chg_high_temp = %d ",__func__, ret);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
ret);
break;
case BATT_TUNE_CHG_TEMP_REC:
ret = battery->pdata->chg_high_temp_recovery;
pr_info("%s chg_high_temp_recovery = %d ",__func__, ret);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
ret);
break;
case BATT_TUNE_CHG_LIMIT_CUR:
ret = battery->pdata->chg_charging_limit_current;
pr_info("%s chg_charging_limit_current = %d ",__func__, ret);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
ret);
break;
case BATT_TUNE_LRP_TEMP_HIGH_LCDON:
{
char temp_buf[1024] = {0,};
int j = 0;
int size = 0;
snprintf(temp_buf, sizeof(temp_buf), "%d %d %d %d\n",
battery->pdata->lrp_temp[LRP_NORMAL].trig[ST2][LCD_ON],
battery->pdata->lrp_temp[LRP_NORMAL].recov[ST2][LCD_ON],
battery->pdata->lrp_temp[LRP_NORMAL].trig[ST1][LCD_ON],
battery->pdata->lrp_temp[LRP_NORMAL].recov[ST1][LCD_ON]);
size = sizeof(temp_buf) - strlen(temp_buf);
for (j = LRP_NORMAL + 1; j < LRP_MAX; j++) {
snprintf(temp_buf+strlen(temp_buf),
size, "%d %d %d %d\n",
battery->pdata->lrp_temp[j].trig[ST2][LCD_ON],
battery->pdata->lrp_temp[j].recov[ST2][LCD_ON],
battery->pdata->lrp_temp[j].trig[ST1][LCD_ON],
battery->pdata->lrp_temp[j].recov[ST1][LCD_ON]);
size = sizeof(temp_buf) - strlen(temp_buf);
}
i += scnprintf(buf + i, PAGE_SIZE - i, "%s\n", temp_buf);
}
break;
case BATT_TUNE_LRP_TEMP_HIGH_LCDOFF:
{
char temp_buf[1024] = {0,};
int j = 0;
int size = 0;
snprintf(temp_buf, sizeof(temp_buf), "%d %d %d %d\n",
battery->pdata->lrp_temp[LRP_NORMAL].trig[ST2][LCD_OFF],
battery->pdata->lrp_temp[LRP_NORMAL].recov[ST2][LCD_OFF],
battery->pdata->lrp_temp[LRP_NORMAL].trig[ST1][LCD_OFF],
battery->pdata->lrp_temp[LRP_NORMAL].recov[ST1][LCD_OFF]);
size = sizeof(temp_buf) - strlen(temp_buf);
for (j = LRP_NORMAL + 1; j < LRP_MAX; j++) {
snprintf(temp_buf+strlen(temp_buf),
size, "%d %d %d %d\n",
battery->pdata->lrp_temp[j].trig[ST2][LCD_OFF],
battery->pdata->lrp_temp[j].recov[ST2][LCD_OFF],
battery->pdata->lrp_temp[j].trig[ST1][LCD_OFF],
battery->pdata->lrp_temp[j].recov[ST1][LCD_OFF]);
size = sizeof(temp_buf) - strlen(temp_buf);
}
i += scnprintf(buf + i, PAGE_SIZE - i, "%s\n", temp_buf);
}
break;
case BATT_TUNE_COIL_TEMP_HIGH:
break;
case BATT_TUNE_COIL_TEMP_REC:
break;
case BATT_TUNE_COIL_LIMIT_CUR:
break;
case BATT_TUNE_WPC_TEMP_HIGH:
ret = battery->pdata->wpc_high_temp;
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
ret);
break;
case BATT_TUNE_WPC_TEMP_HIGH_REC:
ret = battery->pdata->wpc_high_temp_recovery;
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
ret);
break;
case BATT_TUNE_DCHG_TEMP_HIGH:
i += scnprintf(buf + i, PAGE_SIZE - i, "%d %d %d %d\n",
battery->pdata->dchg_high_temp[0],
battery->pdata->dchg_high_temp[1],
battery->pdata->dchg_high_temp[2],
battery->pdata->dchg_high_temp[3]);
break;
case BATT_TUNE_DCHG_TEMP_HIGH_REC:
i += scnprintf(buf + i, PAGE_SIZE - i, "%d %d %d %d\n",
battery->pdata->dchg_high_temp_recovery[0],
battery->pdata->dchg_high_temp_recovery[1],
battery->pdata->dchg_high_temp_recovery[2],
battery->pdata->dchg_high_temp_recovery[3]);
break;
case BATT_TUNE_DCHG_BATT_TEMP_HIGH:
i += scnprintf(buf + i, PAGE_SIZE - i, "%d %d %d %d\n",
battery->pdata->dchg_high_batt_temp[0],
battery->pdata->dchg_high_batt_temp[1],
battery->pdata->dchg_high_batt_temp[2],
battery->pdata->dchg_high_batt_temp[3]);
break;
case BATT_TUNE_DCHG_BATT_TEMP_HIGH_REC:
i += scnprintf(buf + i, PAGE_SIZE - i, "%d %d %d %d\n",
battery->pdata->dchg_high_batt_temp_recovery[0],
battery->pdata->dchg_high_batt_temp_recovery[1],
battery->pdata->dchg_high_batt_temp_recovery[2],
battery->pdata->dchg_high_batt_temp_recovery[3]);
break;
case BATT_TUNE_DCHG_LIMIT_INPUT_CUR:
ret = battery->pdata->dchg_input_limit_current;
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
ret);
break;
case BATT_TUNE_DCHG_LIMIT_CHG_CUR:
ret = battery->pdata->dchg_charging_limit_current;
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
ret);
break;
#if defined(CONFIG_WIRELESS_TX_MODE)
case BATT_TUNE_TX_MFC_IOUT_GEAR:
ret = battery->pdata->tx_mfc_iout_gear;
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
ret);
break;
case BATT_TUNE_TX_MFC_IOUT_PHONE:
ret = battery->pdata->tx_mfc_iout_phone;
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
ret);
break;
#endif
#endif
#if defined(CONFIG_UPDATE_BATTERY_DATA)
case BATT_UPDATE_DATA:
i += scnprintf(buf + i, PAGE_SIZE - i, "%s\n",
battery->data_path ? "OK" : "NOK");
break;
#endif
case BATT_MISC_EVENT:
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
battery->misc_event);
break;
case BATT_TX_EVENT:
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
battery->tx_event);
if (battery->tx_event & BATT_TX_EVENT_WIRELESS_TX_ERR) {
/* clear tx all event */
sec_bat_set_tx_event(battery, 0, BATT_TX_EVENT_WIRELESS_ALL_MASK);
}
break;
case BATT_EXT_DEV_CHG:
break;
case BATT_WDT_CONTROL:
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
battery->wdt_kick_disable);
break;
case MODE:
value.strval = NULL;
psy_do_property(battery->pdata->charger_name, get,
POWER_SUPPLY_EXT_PROP_MULTI_CHARGER_MODE, value);
i += scnprintf(buf + i, PAGE_SIZE - i, "%s\n",
(value.strval) ? value.strval : "main");
break;
case CHECK_PS_READY:
value.intval = battery->pdic_ps_rdy;
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
value.intval);
pr_info("%s : CHECK_PS_READY=%d\n",__func__,value.intval);
break;
case BATT_CHIP_ID:
psy_do_property(battery->pdata->charger_name, get,
POWER_SUPPLY_EXT_PROP_CHIP_ID, value);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
value.intval);
break;
case ERROR_CAUSE:
{
int error_cause = SEC_BAT_ERROR_CAUSE_NONE;
psy_do_property(battery->pdata->fuelgauge_name, get,
POWER_SUPPLY_EXT_PROP_ERROR_CAUSE, value);
error_cause |= value.intval;
pr_info("%s: ERROR_CAUSE = 0x%X ",__func__, error_cause);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
error_cause);
}
break;
case CISD_FULLCAPREP_MAX:
{
union power_supply_propval fullcaprep_val;
fullcaprep_val.intval = SEC_BATTERY_CAPACITY_FULL;
psy_do_property(battery->pdata->fuelgauge_name, get,
POWER_SUPPLY_PROP_ENERGY_NOW, fullcaprep_val);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
fullcaprep_val.intval);
}
break;
#if defined(CONFIG_BATTERY_CISD)
case CISD_DATA:
{
struct cisd *pcisd = &battery->cisd;
char temp_buf[1024] = {0,};
int j = 0;
int size = 0;
snprintf(temp_buf, sizeof(temp_buf), "%d", pcisd->data[CISD_DATA_RESET_ALG]);
size = sizeof(temp_buf) - strlen(temp_buf);
for (j = CISD_DATA_RESET_ALG + 1; j < CISD_DATA_MAX_PER_DAY; j++) {
snprintf(temp_buf+strlen(temp_buf), size, " %d", pcisd->data[j]);
size = sizeof(temp_buf) - strlen(temp_buf);
}
i += scnprintf(buf + i, PAGE_SIZE - i, "%s\n", temp_buf);
}
break;
case CISD_DATA_JSON:
{
struct cisd *pcisd = &battery->cisd;
char temp_buf[1024] = {0,};
int j = 0;
int size = 0;
snprintf(temp_buf, sizeof(temp_buf), "\"%s\":\"%d\"",
cisd_data_str[CISD_DATA_RESET_ALG], pcisd->data[CISD_DATA_RESET_ALG]);
size = sizeof(temp_buf) - strlen(temp_buf);
for (j = CISD_DATA_RESET_ALG + 1; j < CISD_DATA_MAX; j++) {
if (battery->pdata->ignore_cisd_index[j / 32] & (0x1 << (j % 32)))
continue;
snprintf(temp_buf+strlen(temp_buf), size, ",\"%s\":\"%d\"", cisd_data_str[j], pcisd->data[j]);
size = sizeof(temp_buf) - strlen(temp_buf);
}
i += scnprintf(buf + i, PAGE_SIZE - i, "%s\n", temp_buf);
}
break;
case CISD_DATA_D_JSON:
{
struct cisd *pcisd = &battery->cisd;
char temp_buf[1024] = {0,};
int j = 0;
int size = 0;
snprintf(temp_buf, sizeof(temp_buf), "\"%s\":\"%d\"",
cisd_data_str_d[CISD_DATA_FULL_COUNT_PER_DAY-CISD_DATA_MAX],
pcisd->data[CISD_DATA_FULL_COUNT_PER_DAY]);
size = sizeof(temp_buf) - strlen(temp_buf);
for (j = CISD_DATA_FULL_COUNT_PER_DAY + 1; j < CISD_DATA_MAX_PER_DAY; j++) {
if (battery->pdata->ignore_cisd_index_d[(j - CISD_DATA_FULL_COUNT_PER_DAY) / 32] & (0x1 << ((j - CISD_DATA_FULL_COUNT_PER_DAY) % 32)))
continue;
snprintf(temp_buf+strlen(temp_buf), size, ",\"%s\":\"%d\"",
cisd_data_str_d[j-CISD_DATA_MAX], pcisd->data[j]);
size = sizeof(temp_buf) - strlen(temp_buf);
}
/* Clear Daily Data */
for (j = CISD_DATA_FULL_COUNT_PER_DAY; j < CISD_DATA_MAX_PER_DAY; j++)
pcisd->data[j] = 0;
pcisd->data[CISD_DATA_FULL_COUNT_PER_DAY] = 1;
pcisd->data[CISD_DATA_BATT_TEMP_MAX_PER_DAY] = -300;
pcisd->data[CISD_DATA_SUB_BATT_TEMP_MAX_PER_DAY] = -300;
pcisd->data[CISD_DATA_CHG_TEMP_MAX_PER_DAY] = -300;
pcisd->data[CISD_DATA_USB_TEMP_MAX_PER_DAY] = -300;
pcisd->data[CISD_DATA_BATT_TEMP_MIN_PER_DAY] = 1000;
pcisd->data[CISD_DATA_SUB_BATT_TEMP_MIN_PER_DAY] = 1000;
pcisd->data[CISD_DATA_CHG_TEMP_MIN_PER_DAY] = 1000;
pcisd->data[CISD_DATA_USB_TEMP_MIN_PER_DAY] = 1000;
pcisd->data[CISD_DATA_CHG_BATT_TEMP_MAX_PER_DAY] = -300;
pcisd->data[CISD_DATA_CHG_SUB_BATT_TEMP_MAX_PER_DAY] = -300;
pcisd->data[CISD_DATA_CHG_CHG_TEMP_MAX_PER_DAY] = -300;
pcisd->data[CISD_DATA_CHG_USB_TEMP_MAX_PER_DAY] = -300;
pcisd->data[CISD_DATA_CHG_BATT_TEMP_MIN_PER_DAY] = 1000;
pcisd->data[CISD_DATA_CHG_SUB_BATT_TEMP_MIN_PER_DAY] = 1000;
pcisd->data[CISD_DATA_CHG_CHG_TEMP_MIN_PER_DAY] = 1000;
pcisd->data[CISD_DATA_CHG_USB_TEMP_MIN_PER_DAY] = 1000;
pcisd->data[CISD_DATA_CHG_RETENTION_TIME_PER_DAY] = 0;
pcisd->data[CISD_DATA_TOTAL_CHG_RETENTION_TIME_PER_DAY] = 0;
pcisd->data[CISD_DATA_CAP_MIN_PER_DAY] = 0xFFFF;
i += scnprintf(buf + i, PAGE_SIZE - i, "%s\n", temp_buf);
}
break;
case CISD_WIRE_COUNT:
{
struct cisd *pcisd = &battery->cisd;
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
pcisd->data[CISD_DATA_WIRE_COUNT]);
}
break;
case CISD_WC_DATA:
{
struct cisd *pcisd = &battery->cisd;
struct pad_data *pad_data = NULL;
char temp_buf[1024] = {0,};
int j = 0, size = 1024;
mutex_lock(&pcisd->padlock);
pad_data = pcisd->pad_array;
snprintf(temp_buf, size, "%d", pcisd->pad_count);
while ((pad_data != NULL) && ((pad_data = pad_data->next) != NULL) &&
(pad_data->id < MAX_PAD_ID) && (j++ < pcisd->pad_count)) {
snprintf(temp_buf+strlen(temp_buf), size, " 0x%02x:%d", pad_data->id, pad_data->count);
size = sizeof(temp_buf) - strlen(temp_buf);
}
mutex_unlock(&pcisd->padlock);
i += scnprintf(buf + i, PAGE_SIZE - i, "%s\n", temp_buf);
}
break;
case CISD_WC_DATA_JSON:
{
struct cisd *pcisd = &battery->cisd;
struct pad_data *pad_data = NULL;
char temp_buf[1024] = {0,};
int j = 0, size = 1024;
mutex_lock(&pcisd->padlock);
pad_data = pcisd->pad_array;
snprintf(temp_buf+strlen(temp_buf), size, "\"%s\":\"%d\"",
PAD_INDEX_STRING, pcisd->pad_count);
while ((pad_data != NULL) && ((pad_data = pad_data->next) != NULL) &&
(pad_data->id < MAX_PAD_ID) && (j++ < pcisd->pad_count)) {
snprintf(temp_buf+strlen(temp_buf), size, ",\"%s%02x\":\"%d\"",
PAD_JSON_STRING, pad_data->id, pad_data->count);
size = sizeof(temp_buf) - strlen(temp_buf);
}
mutex_unlock(&pcisd->padlock);
i += scnprintf(buf + i, PAGE_SIZE - i, "%s\n", temp_buf);
}
break;
case CISD_POWER_DATA:
{
struct cisd *pcisd = &battery->cisd;
struct power_data *power_data = NULL;
char temp_buf[1024] = {0,};
int j = 0, size = 1024;
mutex_lock(&pcisd->powerlock);
power_data = pcisd->power_array;
snprintf(temp_buf+strlen(temp_buf), size, "%d", pcisd->power_count);
while ((power_data != NULL) && ((power_data = power_data->next) != NULL) &&
(power_data->power < MAX_CHARGER_POWER) && (j++ < pcisd->power_count)) {
snprintf(temp_buf+strlen(temp_buf), size, " %d:%d", power_data->power, power_data->count);
size = sizeof(temp_buf) - strlen(temp_buf);
}
mutex_unlock(&pcisd->powerlock);
i += scnprintf(buf + i, PAGE_SIZE - i, "%s\n", temp_buf);
}
break;
case CISD_POWER_DATA_JSON:
{
struct cisd *pcisd = &battery->cisd;
struct power_data *power_data = NULL;
char temp_buf[1024] = {0,};
int j = 0, size = 1024;
mutex_lock(&pcisd->powerlock);
power_data = pcisd->power_array;
snprintf(temp_buf+strlen(temp_buf), size, "\"%s\":\"%d\"",
POWER_COUNT_JSON_STRING, pcisd->power_count);
while ((power_data != NULL) && ((power_data = power_data->next) != NULL) &&
(power_data->power < MAX_CHARGER_POWER) && (j++ < pcisd->power_count)) {
snprintf(temp_buf+strlen(temp_buf), size, ",\"%s%d\":\"%d\"",
POWER_JSON_STRING, power_data->power, power_data->count);
size = sizeof(temp_buf) - strlen(temp_buf);
}
mutex_unlock(&pcisd->powerlock);
/* clear daily power data */
init_cisd_power_data(&battery->cisd);
i += scnprintf(buf + i, PAGE_SIZE - i, "%s\n", temp_buf);
}
break;
case CISD_PD_DATA:
{
struct cisd *pcisd = &battery->cisd;
struct pd_data *pd_data = NULL;
char temp_buf[1024] = {0,};
int j = 0, size = 1024;
mutex_lock(&pcisd->pdlock);
pd_data = pcisd->pd_array;
snprintf(temp_buf+strlen(temp_buf), size, "%d", pcisd->pd_count);
while ((pd_data != NULL) && ((pd_data = pd_data->next) != NULL) &&
(pd_data->pid < MAX_SS_PD_PID) && (j++ < pcisd->pd_count)) {
snprintf(temp_buf+strlen(temp_buf), size, " 0x%04x:%d", pd_data->pid, pd_data->count);
size = sizeof(temp_buf) - strlen(temp_buf);
}
mutex_unlock(&pcisd->pdlock);
i += scnprintf(buf + i, PAGE_SIZE - i, "%s\n", temp_buf);
}
break;
case CISD_PD_DATA_JSON:
{
struct cisd *pcisd = &battery->cisd;
struct pd_data *pd_data = NULL;
char temp_buf[1024] = {0,};
int j = 0, size = 1024;
mutex_lock(&pcisd->pdlock);
pd_data = pcisd->pd_array;
snprintf(temp_buf+strlen(temp_buf), size, "\"%s\":\"%d\"",
PD_COUNT_JSON_STRING, pcisd->pd_count);
while ((pd_data != NULL) && ((pd_data = pd_data->next) != NULL) &&
(pd_data->pid < MAX_SS_PD_PID) && (j++ < pcisd->pd_count)) {
if (pd_data->pid == 0x0)
snprintf(temp_buf+strlen(temp_buf), size, ",\"PID_OTHER\":\"%d\"",
pd_data->count);
else
snprintf(temp_buf+strlen(temp_buf), size, ",\"%s%04x\":\"%d\"",
PD_JSON_STRING, pd_data->pid, pd_data->count);
size = sizeof(temp_buf) - strlen(temp_buf);
}
mutex_unlock(&pcisd->pdlock);
i += scnprintf(buf + i, PAGE_SIZE - i, "%s\n", temp_buf);
}
break;
case CISD_CABLE_DATA:
{
struct cisd *pcisd = &battery->cisd;
char temp_buf[1024] = {0,};
int j = 0;
int size = 0;
snprintf(temp_buf, sizeof(temp_buf), "%d", pcisd->cable_data[CISD_CABLE_TA]);
size = sizeof(temp_buf) - strlen(temp_buf);
for (j = CISD_CABLE_TA + 1; j < CISD_CABLE_TYPE_MAX; j++) {
snprintf(temp_buf+strlen(temp_buf), size, " %d", pcisd->cable_data[j]);
size = sizeof(temp_buf) - strlen(temp_buf);
}
i += scnprintf(buf + i, PAGE_SIZE - i, "%s\n", temp_buf);
}
break;
case CISD_CABLE_DATA_JSON:
{
struct cisd *pcisd = &battery->cisd;
char temp_buf[1024] = {0,};
int j = 0;
int size = 0;
snprintf(temp_buf, sizeof(temp_buf), "\"%s\":\"%d\"",
cisd_cable_data_str[CISD_CABLE_TA], pcisd->cable_data[CISD_CABLE_TA]);
size = sizeof(temp_buf) - strlen(temp_buf);
for (j = CISD_CABLE_TA + 1; j < CISD_CABLE_TYPE_MAX; j++) {
snprintf(temp_buf+strlen(temp_buf), size, ",\"%s\":\"%d\"",
cisd_cable_data_str[j], pcisd->cable_data[j]);
size = sizeof(temp_buf) - strlen(temp_buf);
}
/* Clear Daily Cable Data */
for (j = CISD_CABLE_TA; j < CISD_CABLE_TYPE_MAX; j++)
pcisd->cable_data[j] = 0;
i += scnprintf(buf + i, PAGE_SIZE - i, "%s\n", temp_buf);
}
break;
case CISD_TX_DATA:
{
struct cisd *pcisd = &battery->cisd;
char temp_buf[1024] = {0,};
int j = 0;
int size = 0;
snprintf(temp_buf, sizeof(temp_buf), "%d", pcisd->tx_data[TX_ON]);
size = sizeof(temp_buf) - strlen(temp_buf);
for (j = TX_ON + 1; j < TX_DATA_MAX; j++) {
snprintf(temp_buf+strlen(temp_buf), size, " %d", pcisd->tx_data[j]);
size = sizeof(temp_buf) - strlen(temp_buf);
}
i += scnprintf(buf + i, PAGE_SIZE - i, "%s\n", temp_buf);
}
break;
case CISD_TX_DATA_JSON:
{
struct cisd *pcisd = &battery->cisd;
char temp_buf[1024] = {0,};
int j = 0;
int size = 0;
snprintf(temp_buf, sizeof(temp_buf), "\"%s\":\"%d\"",
cisd_tx_data_str[TX_ON], pcisd->tx_data[TX_ON]);
size = sizeof(temp_buf) - strlen(temp_buf);
for (j = TX_ON + 1; j < TX_DATA_MAX; j++) {
snprintf(temp_buf+strlen(temp_buf), size, ",\"%s\":\"%d\"",
cisd_tx_data_str[j], pcisd->tx_data[j]);
size = sizeof(temp_buf) - strlen(temp_buf);
}
/* Clear Daily Tx Data */
for (j = TX_ON; j < TX_DATA_MAX; j++)
pcisd->tx_data[j] = 0;
i += scnprintf(buf + i, PAGE_SIZE - i, "%s\n", temp_buf);
}
break;
case CISD_EVENT_DATA:
{
struct cisd *pcisd = &battery->cisd;
char temp_buf[1024] = {0,};
int j = 0;
int size = 0;
snprintf(temp_buf, sizeof(temp_buf), "%d", pcisd->event_data[EVENT_DC_ERR]);
size = sizeof(temp_buf) - strlen(temp_buf);
for (j = EVENT_DC_ERR + 1; j < EVENT_DATA_MAX; j++) {
snprintf(temp_buf+strlen(temp_buf), size, " %d", pcisd->event_data[j]);
size = sizeof(temp_buf) - strlen(temp_buf);
}
i += scnprintf(buf + i, PAGE_SIZE - i, "%s\n", temp_buf);
}
break;
case CISD_EVENT_DATA_JSON:
{
struct cisd *pcisd = &battery->cisd;
char temp_buf[1024] = {0,};
int j = 0;
int size = 0;
snprintf(temp_buf, sizeof(temp_buf), "\"%s\":\"%d\"",
cisd_event_data_str[EVENT_DC_ERR], pcisd->event_data[EVENT_DC_ERR]);
size = sizeof(temp_buf) - strlen(temp_buf);
for (j = EVENT_DC_ERR + 1; j < EVENT_DATA_MAX; j++) {
snprintf(temp_buf+strlen(temp_buf), size, ",\"%s\":\"%d\"",
cisd_event_data_str[j], pcisd->event_data[j]);
size = sizeof(temp_buf) - strlen(temp_buf);
}
/* Clear Daily Event Data */
for (j = EVENT_DC_ERR; j < EVENT_DATA_MAX; j++)
pcisd->event_data[j] = 0;
i += scnprintf(buf + i, PAGE_SIZE - i, "%s\n", temp_buf);
}
break;
case PREV_BATTERY_DATA:
{
if (battery->enable_update_data)
i += scnprintf(buf + i, PAGE_SIZE - i, "%d, %d, %d, %d\n",
battery->voltage_now, battery->temperature, battery->is_jig_on,
(battery->charger_mode == SEC_BAT_CHG_MODE_CHARGING) ? 1 : 0);
}
break;
case PREV_BATTERY_INFO:
{
i += scnprintf(buf + i, PAGE_SIZE - i, "%d,%d,%d,%d\n",
battery->prev_volt, battery->prev_temp,
battery->prev_jig_on, battery->prev_chg_on);
pr_info("%s: Read Prev Battery Info : %d, %d, %d, %d\n", __func__,
battery->prev_volt, battery->prev_temp,
battery->prev_jig_on, battery->prev_chg_on);
}
break;
#endif
case SAFETY_TIMER_SET:
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
battery->safety_timer_set);
break;
case BATT_SWELLING_CONTROL:
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
battery->skip_swelling);
break;
case BATT_BATTERY_ID:
value.intval = 0;
psy_do_property(battery->pdata->fuelgauge_name, get,
POWER_SUPPLY_EXT_PROP_BATTERY_ID, value);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
value.intval);
break;
#if IS_ENABLED(CONFIG_DUAL_BATTERY)
case BATT_SUB_BATTERY_ID:
value.intval = SEC_DUAL_BATTERY_SUB;
psy_do_property(battery->pdata->fuelgauge_name, get,
POWER_SUPPLY_EXT_PROP_BATTERY_ID, value);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
value.intval);
break;
#endif
case BATT_TEMP_CONTROL_TEST:
{
int temp_ctrl_t = 0;
if (battery->current_event & SEC_BAT_CURRENT_EVENT_TEMP_CTRL_TEST)
temp_ctrl_t = 1;
else
temp_ctrl_t = 0;
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
temp_ctrl_t);
}
break;
case SAFETY_TIMER_INFO:
i += scnprintf(buf + i, PAGE_SIZE - i, "%ld\n",
battery->cal_safety_time);
break;
case BATT_SHIPMODE_TEST:
value.intval = 0;
ret = psy_do_property(battery->pdata->charger_name, get,
POWER_SUPPLY_EXT_PROP_SHIPMODE_TEST, value);
if (ret < 0) {
pr_info("%s: not support BATT_SHIPMODE_TEST\n", __func__);
value.intval = 0;
} else {
pr_info("%s: show BATT_SHIPMODE_TEST(%d)\n", __func__, value.intval);
}
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n", value.intval);
break;
case BATT_MISC_TEST:
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
battery->display_test);
break;
#if IS_ENABLED(CONFIG_DUAL_BATTERY)
case BATT_TEMP_TEST:
i += scnprintf(buf + i, PAGE_SIZE - i, "%d %d %d %d %d\n",
battery->pdata->bat_thm_info.test,
battery->pdata->usb_thm_info.test,
battery->pdata->wpc_thm_info.test,
battery->pdata->chg_thm_info.test,
battery->pdata->sub_bat_thm_info.test);
break;
#else
case BATT_TEMP_TEST:
i += scnprintf(buf + i, PAGE_SIZE - i, "%d %d %d %d %d %d %d\n",
battery->pdata->bat_thm_info.test,
battery->pdata->usb_thm_info.test,
battery->pdata->wpc_thm_info.test,
battery->pdata->chg_thm_info.test,
battery->pdata->dchg_thm_info.test,
battery->pdata->blk_thm_info.test,
battery->lrp_test);
break;
#endif
case BATT_CURRENT_EVENT:
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
battery->current_event);
break;
case BATT_JIG_GPIO:
value.intval = 0;
ret = psy_do_property(battery->pdata->fuelgauge_name, get,
POWER_SUPPLY_EXT_PROP_JIG_GPIO, value);
if (value.intval < 0 || ret < 0) {
value.intval = -1;
pr_info("%s: does not support JIG GPIO PIN READ\n", __func__);
}
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
value.intval);
break;
case CC_INFO:
{
union power_supply_propval cc_val;
cc_val.intval = SEC_BATTERY_CAPACITY_QH;
psy_do_property(battery->pdata->fuelgauge_name, get,
POWER_SUPPLY_PROP_ENERGY_NOW, cc_val);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
cc_val.intval);
}
break;
#if defined(CONFIG_WIRELESS_AUTH)
case WC_AUTH_ADT_SENT:
{
//union power_supply_propval val = {0, };
u8 auth_mode;
psy_do_property(battery->pdata->wireless_charger_name, get,
POWER_SUPPLY_EXT_PROP_WIRELESS_AUTH_ADT_STATUS, value);
auth_mode = value.intval;
if (auth_mode == WIRELESS_AUTH_WAIT)
value.strval = "None";
else if (auth_mode == WIRELESS_AUTH_START)
value.strval = "Start";
else if (auth_mode == WIRELESS_AUTH_SENT)
value.strval = "Sent";
else if (auth_mode == WIRELESS_AUTH_RECEIVED)
value.strval = "Received";
else if (auth_mode == WIRELESS_AUTH_FAIL)
value.strval = "Fail";
else if (auth_mode == WIRELESS_AUTH_PASS)
value.strval = "Pass";
else
value.strval = "None";
i += scnprintf(buf + i, PAGE_SIZE - i, "%s\n", value.strval);
}
break;
#endif
case WC_DUO_RX_POWER:
psy_do_property(battery->pdata->wireless_charger_name, get,
POWER_SUPPLY_EXT_PROP_WIRELESS_RX_POWER, value);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
value.intval);
break;
#if IS_ENABLED(CONFIG_DUAL_BATTERY)
case BATT_MAIN_VOLTAGE:
{
value.intval = SEC_DUAL_BATTERY_MAIN;
psy_do_property(battery->pdata->dual_battery_name, get,
POWER_SUPPLY_PROP_VOLTAGE_AVG, value);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
value.intval);
}
break;
case BATT_SUB_VOLTAGE:
{
value.intval = SEC_DUAL_BATTERY_SUB;
psy_do_property(battery->pdata->dual_battery_name, get,
POWER_SUPPLY_PROP_VOLTAGE_AVG, value);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
value.intval);
}
break;
case BATT_MAIN_CURRENT_MA:
{
value.intval = SEC_DUAL_BATTERY_MAIN;
psy_do_property(battery->pdata->dual_battery_name, get,
POWER_SUPPLY_PROP_CURRENT_AVG, value);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
value.intval);
}
break;
case BATT_SUB_CURRENT_MA:
{
value.intval = SEC_DUAL_BATTERY_SUB;
psy_do_property(battery->pdata->dual_battery_name, get,
POWER_SUPPLY_PROP_CURRENT_AVG, value);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
value.intval);
}
break;
case BATT_MAIN_CON_DET:
{
value.intval = SEC_DUAL_BATTERY_MAIN;
psy_do_property(battery->pdata->dual_battery_name, get,
POWER_SUPPLY_EXT_PROP_DUAL_BAT_DET, value);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
value.intval);
}
break;
case BATT_SUB_CON_DET:
{
value.intval = SEC_DUAL_BATTERY_SUB;
psy_do_property(battery->pdata->dual_battery_name, get,
POWER_SUPPLY_EXT_PROP_DUAL_BAT_DET, value);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
value.intval);
}
break;
#if IS_ENABLED(CONFIG_LIMITER_S2ASL01)
case BATT_MAIN_ENB: /* This pin is reversed by FET */
{
if (battery->pdata->main_bat_enb_gpio)
value.intval = !gpio_get_value(battery->pdata->main_bat_enb_gpio);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
value.intval);
}
break;
case BATT_MAIN_ENB2:
{
if (battery->pdata->main_bat_enb2_gpio)
value.intval = gpio_get_value(battery->pdata->main_bat_enb2_gpio);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
value.intval);
}
break;
case BATT_SUB_ENB:
{
if (battery->pdata->sub_bat_enb_gpio)
value.intval = gpio_get_value(battery->pdata->sub_bat_enb_gpio);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
value.intval);
}
break;
case BATT_SUB_PWR_MODE2:
{
psy_do_property(battery->pdata->sub_limiter_name, get,
POWER_SUPPLY_EXT_PROP_POWER_MODE2, value);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
value.intval);
}
break;
#endif
case BATT_MAIN_SHIPMODE:
{
value.intval = 0;
ret = psy_do_property(battery->pdata->main_limiter_name, get,
POWER_SUPPLY_EXT_PROP_MAIN_SHIPMODE, value);
if (ret < 0) {
pr_info("%s: not support BATT_MAIN_SHIPMODE\n", __func__);
value.intval = 0;
} else {
pr_info("%s: show BATT_MAIN_SHIPMODE(%d)\n", __func__, value.intval);
}
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n", value.intval);
}
break;
case BATT_SUB_SHIPMODE:
{
value.intval = 0;
ret = psy_do_property(battery->pdata->sub_limiter_name, get,
POWER_SUPPLY_EXT_PROP_SUB_SHIPMODE, value);
if (ret < 0) {
pr_info("%s: not support BATT_SUB_SHIPMODE\n", __func__);
value.intval = 0;
} else {
pr_info("%s: show BATT_SUB_SHIPMODE(%d)\n", __func__, value.intval);
}
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n", value.intval);
}
break;
#if IS_ENABLED(CONFIG_DUAL_FUELGAUGE)
case BATT_MAIN_SOC:
{
value.intval = SEC_DUAL_BATTERY_MAIN;
psy_do_property(battery->pdata->dual_fuelgauge_name, get,
POWER_SUPPLY_EXT_PROP_REPSOC, value);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
value.intval);
}
break;
case BATT_SUB_SOC:
{
value.intval = SEC_DUAL_BATTERY_SUB;
psy_do_property(battery->pdata->dual_fuelgauge_name, get,
POWER_SUPPLY_EXT_PROP_REPSOC, value);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
value.intval);
}
break;
case BATT_MAIN_REPCAP:
{
value.intval = SEC_DUAL_BATTERY_MAIN;
psy_do_property(battery->pdata->dual_fuelgauge_name, get,
POWER_SUPPLY_EXT_PROP_REPCAP, value);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
value.intval);
}
break;
case BATT_SUB_REPCAP:
{
value.intval = SEC_DUAL_BATTERY_SUB;
psy_do_property(battery->pdata->dual_fuelgauge_name, get,
POWER_SUPPLY_EXT_PROP_REPCAP, value);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
value.intval);
}
break;
case BATT_MAIN_FULLCAPREP:
{
value.intval = SEC_DUAL_BATTERY_MAIN;
psy_do_property(battery->pdata->dual_fuelgauge_name, get,
POWER_SUPPLY_EXT_PROP_FULLCAPREP, value);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
value.intval);
}
break;
case BATT_SUB_FULLCAPREP:
{
value.intval = SEC_DUAL_BATTERY_SUB;
psy_do_property(battery->pdata->dual_fuelgauge_name, get,
POWER_SUPPLY_EXT_PROP_FULLCAPREP, value);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
value.intval);
}
break;
#endif
#endif
case EXT_EVENT:
break;
#if IS_ENABLED(CONFIG_DIRECT_CHARGING)
case DIRECT_CHARGING_STATUS:
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
battery->pd_list.now_isApdo);
break;
case DIRECT_CHARGING_STEP:
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
battery->step_chg_status);
break;
case DIRECT_CHARGING_IIN:
if (is_pd_apdo_wire_type(battery->wire_status)) {
value.intval = SEC_BATTERY_IIN_UA;
psy_do_property(battery->pdata->charger_name, get,
POWER_SUPPLY_EXT_PROP_MEASURE_INPUT, value);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
value.intval);
} else {
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
0);
}
break;
case DIRECT_CHARGING_CHG_STATUS:
psy_do_property(battery->pdata->charger_name, get,
POWER_SUPPLY_EXT_PROP_DIRECT_CHARGER_CHG_STATUS, value);
i += scnprintf(buf + i, PAGE_SIZE - i, "%s\n",
value.strval);
break;
case SWITCH_CHARGING_SOURCE:
psy_do_property(battery->pdata->charger_name, get,
POWER_SUPPLY_EXT_PROP_CHANGE_CHARGING_SOURCE, value);
pr_info("%s Test Charging Source(%d) ",__func__, value.intval);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n", value.intval);
break;
#else
case DIRECT_CHARGING_STATUS:
ret = -1; /* DC not supported model returns -1 */
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n", ret);
break;
#endif
case CHARGING_TYPE:
{
if (battery->cable_type > 0 && battery->cable_type < SEC_BATTERY_CABLE_MAX) {
value.strval = sb_get_ct_str(battery->cable_type);
#if IS_ENABLED(CONFIG_DIRECT_CHARGING)
if (is_pd_apdo_wire_type(battery->cable_type) &&
battery->current_event & SEC_BAT_CURRENT_EVENT_DC_ERR)
value.strval = "PDIC";
#endif
} else
value.strval = "UNKNOWN";
pr_info("%s: CHARGING_TYPE = %s\n",__func__, value.strval);
i += scnprintf(buf + i, PAGE_SIZE - i, "%s\n", value.strval);
}
break;
case BATT_FACTORY_MODE:
#if IS_ENABLED(CONFIG_USB_FACTORY_MODE)
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
battery->usb_factory_init ? battery->usb_factory_mode : sec_bat_get_facmode());
#else
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n", sec_bat_get_facmode());
#endif
break;
case PD_DISABLE:
if (battery->pd_disable)
value.strval = "PD Disabled";
else
value.strval = "PD Enabled";
pr_info("%s: PD = %s\n",__func__, value.strval);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n", battery->pd_disable);
break;
case FACTORY_MODE_RELIEVE:
break;
case FACTORY_MODE_BYPASS:
break;
case NORMAL_MODE_BYPASS:
break;
case FACTORY_VOLTAGE_REGULATION:
break;
case FACTORY_MODE_DISABLE:
break;
case CHARGE_OTG_CONTROL:
break;
case CHARGE_UNO_CONTROL:
break;
case CHARGE_COUNTER_SHADOW:
psy_do_property("battery", get,
POWER_SUPPLY_EXT_PROP_CHARGE_COUNTER_SHADOW, value);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n", value.intval);
break;
case VOTER_STATUS:
i = show_sec_vote_status(buf, PAGE_SIZE);
break;
#if defined(CONFIG_WIRELESS_IC_PARAM)
case WC_PARAM_INFO:
ret = psy_do_property(battery->pdata->wireless_charger_name, get,
POWER_SUPPLY_EXT_PROP_WIRELESS_PARAM_INFO, value);
if (ret < 0) {
i = -EINVAL;
} else {
pr_info("%s: WC_PARAM_INFO(0x%08x)\n", __func__, value.intval);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n", value.intval);
}
break;
#endif
case CHG_INFO:
{
unsigned short vid = 0, pid = 0;
unsigned int xid = 0;
sec_pd_get_vid_pid(&vid, &pid, &xid);
i += scnprintf(buf + i, PAGE_SIZE - i, "%04x %04x %08x\n", vid, pid, xid);
}
break;
case BATT_FULL_CAPACITY:
pr_info("%s: BATT_FULL_CAPACITY = %d\n", __func__, battery->batt_full_capacity);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n", battery->batt_full_capacity);
break;
case LRP:
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n", battery->lrp);
break;
case HP_D2D:
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n", battery->hp_d2d);
break;
case CHARGER_IC_NAME:
ret = psy_do_property(battery->pdata->charger_name, get,
POWER_SUPPLY_EXT_PROP_CHARGER_IC_NAME, value);
if (ret < 0) {
pr_info("%s: read fail\n", __func__);
i += scnprintf(buf + i, PAGE_SIZE - i, "%s\n", "NONAME");
} else {
pr_info("%s: CHARGER_IC_NAME: %s\n", __func__, value.strval);
i += scnprintf(buf + i, PAGE_SIZE - i, "%s\n", value.strval);
}
break;
case DC_RB_EN:
psy_do_property(battery->pdata->charger_name, get,
POWER_SUPPLY_EXT_PROP_D2D_REVERSE_VOLTAGE, value);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n", value.intval);
break;
case DC_OP_MODE:
psy_do_property(battery->pdata->charger_name, get,
POWER_SUPPLY_EXT_PROP_DC_OP_MODE, value);
i += scnprintf(buf + i, PAGE_SIZE - i, "%x\n", value.intval);
break;
case DC_ADC_MODE:
break;
case DC_VBUS:
psy_do_property(battery->pdata->charger_name, get,
POWER_SUPPLY_EXT_PROP_D2D_REVERSE_VBUS, value);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n", value.intval);
break;
case CHG_TYPE:
{
char temp_buf[20] = {0,};
value.strval = sb_get_ct_str(battery->cable_type);
strncpy(temp_buf, value.strval, sizeof(temp_buf) - 1);
if (is_pd_apdo_wire_type(battery->cable_type))
snprintf(temp_buf+strlen(temp_buf), sizeof(temp_buf), "_%d", battery->pd_rated_power);
pr_info("%s: CHG_TYPE = %s\n", __func__, temp_buf);
i += scnprintf(buf + i, PAGE_SIZE - i, "%s\n", temp_buf);
}
break;
case MST_EN:
psy_do_property("battery", get,
POWER_SUPPLY_EXT_PROP_MST_EN, value);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n", value.intval);
break;
case SPSN_TEST:
/* Only MD15 supports this function (2022y 10m 12d) */
ret = psy_do_property(battery->pdata->charger_name, get,
POWER_SUPPLY_EXT_PROP_SPSN_TEST, value);
if (ret < 0) {
pr_info("%s: Does not support SPSN_TEST(%d)\n", __func__, ret);
i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n", ret);
} else {
pr_info("%s: SPSN_DTLS: 0x%x\n", __func__, value.intval);
i += scnprintf(buf + i, PAGE_SIZE - i, "%x\n", value.intval);
}
break;
case CHG_SOC_LIM:
i += scnprintf(buf + i, PAGE_SIZE - i, "%d %d\n",
battery->pdata->store_mode_charging_min,
battery->pdata->store_mode_charging_max);
break;
default:
i = -EINVAL;
break;
}
return i;
}
ssize_t sec_bat_store_attrs(
struct device *dev,
struct device_attribute *attr,
const char *buf, size_t count)
{
struct power_supply *psy = dev_get_drvdata(dev);
struct sec_battery_info *battery = power_supply_get_drvdata(psy);
const ptrdiff_t offset = attr - sec_battery_attrs;
int ret = -EINVAL;
int x = 0;
#if defined(CONFIG_ENG_BATTERY_CONCEPT) || defined(CONFIG_BATTERY_CISD)
int i = 0;
#endif
#if IS_ENABLED(CONFIG_DIRECT_CHARGING)
char direct_charging_source_status[2] = {0, };
#endif
union power_supply_propval value = {0, };
switch (offset) {
case BATT_RESET_SOC:
/* Do NOT reset fuel gauge in charging mode */
#if IS_ENABLED(CONFIG_USB_FACTORY_MODE)
if (battery->is_jig_on || battery->batt_f_mode != NO_MODE) {
#else
if (battery->is_jig_on) {
#endif
sec_bat_set_misc_event(battery, BATT_MISC_EVENT_BATT_RESET_SOC, BATT_MISC_EVENT_BATT_RESET_SOC);
value.intval =
SEC_FUELGAUGE_CAPACITY_TYPE_RESET;
psy_do_property(battery->pdata->fuelgauge_name, set,
POWER_SUPPLY_PROP_CAPACITY, value);
dev_info(battery->dev,"do reset SOC\n");
/* update battery info */
sec_bat_get_battery_info(battery);
}
ret = count;
break;
case BATT_READ_RAW_SOC:
break;
case BATT_READ_ADJ_SOC:
break;
case BATT_TYPE:
strncpy(battery->batt_type, buf, sizeof(battery->batt_type) - 1);
battery->batt_type[sizeof(battery->batt_type)-1] = '\0';
ret = count;
break;
case BATT_VFOCV:
break;
case BATT_VOL_ADC:
break;
case BATT_VOL_ADC_CAL:
break;
case BATT_VOL_AVER:
break;
case BATT_VOL_ADC_AVER:
break;
case BATT_VOLTAGE_NOW:
break;
case BATT_CURRENT_UA_NOW:
break;
case BATT_CURRENT_UA_AVG:
break;
case BATT_FILTER_CFG:
if (sscanf(buf, "%10d\n", &x) == 1) {
value.intval = x;
psy_do_property(battery->pdata->fuelgauge_name, set,
POWER_SUPPLY_EXT_PROP_FILTER_CFG, value);
ret = count;
}
break;
case BATT_TEMP:
#if defined(CONFIG_ENG_BATTERY_CONCEPT) || defined(CONFIG_SEC_FACTORY)
if (sscanf(buf, "%10d\n", &x) == 1) {
dev_info(battery->dev, "%s: skip check thermal mode %s\n",
__func__, (x ? "enable" : "disable"));
if (x == 0)
battery->skip_swelling = true;
else
battery->skip_swelling = false;
ret = count;
}
#endif
break;
case BATT_TEMP_RAW:
break;
case BATT_TEMP_ADC:
break;
case BATT_TEMP_AVER:
break;
case BATT_TEMP_ADC_AVER:
break;
case USB_TEMP:
break;
case USB_TEMP_ADC:
break;
case BATT_CHG_TEMP:
break;
case BATT_CHG_TEMP_ADC:
break;
case SUB_BAT_TEMP:
break;
case SUB_BAT_TEMP_ADC:
break;
case SUB_CHG_TEMP:
break;
case SUB_CHG_TEMP_ADC:
break;
#if IS_ENABLED(CONFIG_DIRECT_CHARGING)
case DCHG_ADC_MODE_CTRL:
if (sscanf(buf, "%10d\n", &x) == 1) {
dev_info(battery->dev,
"%s : direct charger adc mode cntl : %d\n", __func__, x);
value.intval = x;
psy_do_property(battery->pdata->charger_name, set,
POWER_SUPPLY_EXT_PROP_DIRECT_ADC_CTRL, value);
ret = count;
}
break;
case DCHG_TEMP:
case DCHG_TEMP_ADC:
break;
#endif
case BLKT_TEMP:
break;
case BLKT_TEMP_ADC:
break;
case BATT_VF_ADC:
break;
case BATT_SLATE_MODE:
if (sscanf(buf, "%10d\n", &x) == 1) {
if (x == 2) {
sec_bat_set_current_event(battery, SEC_BAT_CURRENT_EVENT_SLATE, SEC_BAT_CURRENT_EVENT_SLATE);
sec_vote(battery->chgen_vote, VOTER_SMART_SLATE, true, SEC_BAT_CHG_MODE_BUCK_OFF);
sec_bat_set_mfc_off(battery, WPC_EN_SLATE, false);
#if IS_ENABLED(CONFIG_USB_FACTORY_MODE) && defined(CONFIG_SEC_FACTORY)
battery->usb_factory_slate_mode = true;
#endif
dev_info(battery->dev,
"%s: enable smart switch slate mode : %d\n", __func__, x);
} else if (x == 1) {
sec_bat_set_current_event(battery, SEC_BAT_CURRENT_EVENT_SLATE, SEC_BAT_CURRENT_EVENT_SLATE);
sec_vote(battery->chgen_vote, VOTER_SLATE, true, SEC_BAT_CHG_MODE_BUCK_OFF);
dev_info(battery->dev,
"%s: enable slate mode : %d\n", __func__, x);
} else if (x == 0) {
sec_bat_set_current_event(battery, 0, SEC_BAT_CURRENT_EVENT_SLATE);
sec_vote(battery->chgen_vote, VOTER_SLATE, false, 0);
sec_vote(battery->chgen_vote, VOTER_SMART_SLATE, false, 0);
sec_bat_set_mfc_on(battery, WPC_EN_SLATE);
dev_info(battery->dev,
"%s: disable slate mode : %d\n", __func__, x);
} else {
dev_info(battery->dev,
"%s: SLATE MODE unknown command\n", __func__);
return -EINVAL;
}
__pm_stay_awake(battery->cable_ws);
queue_delayed_work(battery->monitor_wqueue,
&battery->cable_work, 0);
ret = count;
}
break;
case BATT_LP_CHARGING:
break;
case SIOP_ACTIVATED:
break;
case SIOP_LEVEL:
if (sscanf(buf, "%10d\n", &x) == 1) {
dev_info(battery->dev,
"%s: siop level: %d\n", __func__, x);
battery->wc_heating_start_time = 0;
if (x == battery->siop_level) {
dev_info(battery->dev,
"%s: skip same siop level: %d\n", __func__, x);
return count;
} else if (x >= 0 && x <= 100 && battery->pdata->bat_thm_info.check_type) {
battery->siop_level = x;
if (battery->siop_level == 0)
sec_bat_set_current_event(battery, SEC_BAT_CURRENT_EVENT_SIOP_LIMIT,
SEC_BAT_CURRENT_EVENT_SIOP_LIMIT);
else
sec_bat_set_current_event(battery, 0, SEC_BAT_CURRENT_EVENT_SIOP_LIMIT);
} else {
battery->siop_level = 100;
}
__pm_stay_awake(battery->siop_level_ws);
#if !defined(CONFIG_SEC_FACTORY)
if (battery->siop_level == 100)
if (!is_nocharge_type(battery->cable_type))
sec_bat_check_temp_ctrl_by_cable(battery);
#endif
queue_delayed_work(battery->monitor_wqueue, &battery->siop_level_work, 0);
ret = count;
}
break;
case SIOP_EVENT:
if (sscanf(buf, "%10d\n", &x) == 1) {
ret = count;
}
break;
case BATT_CHARGING_SOURCE:
break;
case FG_REG_DUMP:
break;
case FG_RESET_CAP:
break;
case FG_CAPACITY:
break;
case FG_ASOC:
if (sscanf(buf, "%d\n", &x) == 1) {
if (x >= 0 && x <= 100) {
dev_info(battery->dev, "%s: batt_asoc(%d)\n", __func__, x);
#if IS_ENABLED(CONFIG_SEC_ABC) && !defined(CONFIG_SEC_FACTORY)
if (!x)
sec_abc_send_event("MODULE=battery@WARN=store_fg_asoc0");
#endif
battery->batt_asoc = x;
#if defined(CONFIG_BATTERY_CISD)
battery->cisd.data[CISD_DATA_ASOC] = x;
#endif
#if defined(CONFIG_BATTERY_AGE_FORECAST)
sec_bat_check_battery_health(battery);
#endif
}
ret = count;
}
break;
case AUTH:
break;
case CHG_CURRENT_ADC:
break;
case WC_ADC:
break;
case WC_STATUS:
break;
case WC_ENABLE:
if (sscanf(buf, "%10d\n", &x) == 1) {
if (x == 0) {
mutex_lock(&battery->wclock);
battery->wc_enable = false;
battery->wc_enable_cnt = 0;
mutex_unlock(&battery->wclock);
} else if (x == 1) {
mutex_lock(&battery->wclock);
battery->wc_enable = true;
battery->wc_enable_cnt = 0;
mutex_unlock(&battery->wclock);
} else {
dev_info(battery->dev,
"%s: WPC ENABLE unknown command\n",
__func__);
return -EINVAL;
}
__pm_stay_awake(battery->cable_ws);
queue_delayed_work(battery->monitor_wqueue,
&battery->cable_work, 0);
ret = count;
}
break;
case WC_CONTROL:
if (sscanf(buf, "%10d\n", &x) == 1) {
char wpc_en_status[2];
wpc_en_status[0] = WPC_EN_SYSFS;
if (x == 0) {
mutex_lock(&battery->wclock);
battery->wc_enable = false;
battery->wc_enable_cnt = 0;
value.intval = 0;
psy_do_property(battery->pdata->wireless_charger_name, set,
POWER_SUPPLY_EXT_PROP_WC_CONTROL, value);
wpc_en_status[1] = false;
value.strval= wpc_en_status;
psy_do_property(battery->pdata->wireless_charger_name, set,
POWER_SUPPLY_EXT_PROP_WPC_EN, value);
pr_info("@DIS_MFC %s: WC CONTROL: Disable\n", __func__);
mutex_unlock(&battery->wclock);
} else if (x == 1) {
mutex_lock(&battery->wclock);
battery->wc_enable = true;
battery->wc_enable_cnt = 0;
value.intval = 1;
psy_do_property(battery->pdata->wireless_charger_name, set,
POWER_SUPPLY_EXT_PROP_WC_CONTROL, value);
wpc_en_status[1] = true;
value.strval= wpc_en_status;
psy_do_property(battery->pdata->wireless_charger_name, set,
POWER_SUPPLY_EXT_PROP_WPC_EN, value);
pr_info("@DIS_MFC %s: WC CONTROL: Enable\n", __func__);
mutex_unlock(&battery->wclock);
} else {
dev_info(battery->dev,
"%s: WC CONTROL unknown command\n",
__func__);
return -EINVAL;
}
ret = count;
}
break;
case WC_CONTROL_CNT:
if (sscanf(buf, "%10d\n", &x) == 1) {
battery->wc_enable_cnt_value = x;
ret = count;
}
break;
case LED_COVER:
if (sscanf(buf, "%10d\n", &x) == 1) {
pr_info("%s: MFC, LED_COVER(%d)\n", __func__, x);
battery->led_cover = x;
value.intval = battery->led_cover;
psy_do_property(battery->pdata->wireless_charger_name, set,
POWER_SUPPLY_EXT_PROP_FILTER_CFG, value);
ret = count;
}
break;
case HV_CHARGER_STATUS:
break;
case HV_WC_CHARGER_STATUS:
break;
case HV_CHARGER_SET:
if (sscanf(buf, "%10d\n", &x) == 1) {
dev_info(battery->dev,
"%s: HV_CHARGER_SET(%d)\n", __func__, x);
if (x == 1) {
battery->wire_status = SEC_BATTERY_CABLE_9V_TA;
__pm_stay_awake(battery->cable_ws);
queue_delayed_work(battery->monitor_wqueue, &battery->cable_work, 0);
} else {
battery->wire_status = SEC_BATTERY_CABLE_NONE;
__pm_stay_awake(battery->cable_ws);
queue_delayed_work(battery->monitor_wqueue, &battery->cable_work, 0);
}
ret = count;
}
break;
case FACTORY_MODE:
if (sscanf(buf, "%10d\n", &x) == 1) {
battery->factory_mode = x ? true : false;
ret = count;
}
break;
case STORE_MODE:
if (sscanf(buf, "%10d\n", &x) == 1) {
#if !defined(CONFIG_SEC_FACTORY)
if (x) {
battery->store_mode = true;
__pm_stay_awake(battery->parse_mode_dt_ws);
queue_delayed_work(battery->monitor_wqueue,
&battery->parse_mode_dt_work, 0);
#if IS_ENABLED(CONFIG_DIRECT_CHARGING)
direct_charging_source_status[0] = SEC_STORE_MODE;
direct_charging_source_status[1] = SEC_CHARGING_SOURCE_SWITCHING;
value.strval = direct_charging_source_status;
psy_do_property(battery->pdata->charger_name, set,
POWER_SUPPLY_EXT_PROP_CHANGE_CHARGING_SOURCE, value);
#endif
}
#endif
ret = count;
}
break;
case UPDATE:
if (sscanf(buf, "%10d\n", &x) == 1) {
/* update battery info */
sec_bat_get_battery_info(battery);
ret = count;
}
break;
case TEST_MODE:
if (sscanf(buf, "%10d\n", &x) == 1) {
battery->test_mode = x;
__pm_stay_awake(battery->monitor_ws);
queue_delayed_work(battery->monitor_wqueue,
&battery->monitor_work, 0);
ret = count;
}
break;
case BATT_EVENT_CALL:
case BATT_EVENT_2G_CALL:
case BATT_EVENT_TALK_GSM:
case BATT_EVENT_3G_CALL:
case BATT_EVENT_TALK_WCDMA:
if (sscanf(buf, "%10d\n", &x) == 1) {
#if defined(CONFIG_LIMIT_CHARGING_DURING_CALL)
if (x)
sec_bat_set_current_event(battery, SEC_BAT_CURRENT_EVENT_CALL, SEC_BAT_CURRENT_EVENT_CALL);
else
sec_bat_set_current_event(battery, 0, SEC_BAT_CURRENT_EVENT_CALL);
__pm_stay_awake(battery->monitor_ws);
queue_delayed_work(battery->monitor_wqueue, &battery->monitor_work, 0);
#endif
ret = count;
}
break;
case BATT_EVENT_MUSIC:
if (sscanf(buf, "%10d\n", &x) == 1) {
ret = count;
}
break;
case BATT_EVENT_VIDEO:
if (sscanf(buf, "%10d\n", &x) == 1) {
ret = count;
}
break;
case BATT_EVENT_BROWSER:
if (sscanf(buf, "%10d\n", &x) == 1) {
ret = count;
}
break;
case BATT_EVENT_HOTSPOT:
if (sscanf(buf, "%10d\n", &x) == 1) {
ret = count;
}
break;
case BATT_EVENT_CAMERA:
if (sscanf(buf, "%10d\n", &x) == 1) {
ret = count;
}
break;
case BATT_EVENT_CAMCORDER:
if (sscanf(buf, "%10d\n", &x) == 1) {
ret = count;
}
break;
case BATT_EVENT_DATA_CALL:
if (sscanf(buf, "%10d\n", &x) == 1) {
ret = count;
}
break;
case BATT_EVENT_WIFI:
if (sscanf(buf, "%10d\n", &x) == 1) {
ret = count;
}
break;
case BATT_EVENT_WIBRO:
if (sscanf(buf, "%10d\n", &x) == 1) {
ret = count;
}
break;
case BATT_EVENT_LTE:
if (sscanf(buf, "%10d\n", &x) == 1) {
ret = count;
}
break;
case BATT_EVENT_LCD:
if (sscanf(buf, "%10d\n", &x) == 1) {
#if !defined(CONFIG_SEC_FACTORY)
struct timespec64 ts;
ts = ktime_to_timespec64(ktime_get_boottime());
if (x) {
battery->lcd_status = true;
} else {
battery->lcd_status = false;
}
pr_info("%s : lcd_status (%d)\n", __func__, battery->lcd_status);
if (battery->wc_tx_enable || battery->pdata->wpc_vout_ctrl_lcd_on ||
(battery->d2d_auth == D2D_AUTH_SRC)) {
battery->polling_short = false;
__pm_stay_awake(battery->monitor_ws);
queue_delayed_work(battery->monitor_wqueue,
&battery->monitor_work, 0);
}
#endif
ret = count;
}
break;
#if defined(CONFIG_ISDB_CHARGING_CONTROL)
case BATT_EVENT_ISDB:
if (sscanf(buf, "%10d\n", &x) == 1) {
dev_info(battery->dev,
"%s: ISDB EVENT %d\n", __func__, x);
if (x) {
pr_info("%s: ISDB ON\n", __func__);
sec_bat_set_current_event(battery, SEC_BAT_CURRENT_EVENT_ISDB,
SEC_BAT_CURRENT_EVENT_ISDB);
if (is_hv_wireless_type(battery->cable_type)) {
pr_info("%s: set vout 5.5V with ISDB\n", __func__);
value.intval = WIRELESS_VOUT_5_5V_STEP; // 5.5V
psy_do_property(battery->pdata->wireless_charger_name, set,
POWER_SUPPLY_EXT_PROP_INPUT_VOLTAGE_REGULATION, value);
sec_bat_set_charging_current(battery);
} else if (is_hv_wire_type(battery->cable_type) ||
(is_pd_wire_type(battery->cable_type) &&
battery->pd_max_charge_power >= HV_CHARGER_STATUS_STANDARD1 &&
battery->pdic_info.sink_status.available_pdo_num > 1) ||
battery->max_charge_power >= HV_CHARGER_STATUS_STANDARD1)
sec_bat_set_charging_current(battery);
} else {
pr_info("%s: ISDB OFF\n", __func__);
sec_bat_set_current_event(battery, 0,
SEC_BAT_CURRENT_EVENT_ISDB);
if (is_hv_wireless_type(battery->cable_type)) {
pr_info("%s: recover vout 10V with ISDB\n", __func__);
value.intval = WIRELESS_VOUT_10V; // 10V
psy_do_property(battery->pdata->wireless_charger_name, set,
POWER_SUPPLY_EXT_PROP_INPUT_VOLTAGE_REGULATION, value);
sec_bat_set_charging_current(battery);
} else if (is_hv_wire_type(battery->cable_type))
sec_bat_set_charging_current(battery);
}
ret = count;
}
break;
#endif
case BATT_EVENT_GPS:
if (sscanf(buf, "%10d\n", &x) == 1) {
ret = count;
}
break;
case BATT_HIGH_CURRENT_USB:
if (sscanf(buf, "%10d\n", &x) == 1) {
battery->is_hc_usb = x ? true : false;
value.intval = battery->is_hc_usb;
pr_info("%s: is_hc_usb (%d)\n", __func__, battery->is_hc_usb);
ret = count;
}
break;
#if defined(CONFIG_ENG_BATTERY_CONCEPT)
case TEST_CHARGE_CURRENT:
if (sscanf(buf, "%10d\n", &x) == 1) {
if (x >= 0 && x <= 2000) {
dev_err(battery->dev,
"%s: BATT_TEST_CHARGE_CURRENT(%d)\n", __func__, x);
battery->pdata->charging_current[
SEC_BATTERY_CABLE_USB].input_current_limit = x;
battery->pdata->charging_current[
SEC_BATTERY_CABLE_USB].fast_charging_current = x;
if (x > 500) {
battery->eng_not_full_status = true;
battery->pdata->bat_thm_info.check_type =
SEC_BATTERY_TEMP_CHECK_NONE;
}
if (battery->cable_type == SEC_BATTERY_CABLE_USB) {
value.intval = x;
psy_do_property(battery->pdata->charger_name, set,
POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT,
value);
}
}
ret = count;
}
break;
#if defined(CONFIG_STEP_CHARGING)
case TEST_STEP_CONDITION:
if (sscanf(buf, "%10d\n", &x) == 1) {
if (x >= 0 && x <= 100) {
dev_err(battery->dev,
"%s: TEST_STEP_CONDITION(%d)\n", __func__, x);
battery->test_step_condition = x;
}
ret = count;
}
break;
#endif
#endif
case SET_STABILITY_TEST:
if (sscanf(buf, "%10d\n", &x) == 1) {
dev_err(battery->dev,
"%s: BATT_STABILITY_TEST(%d)\n", __func__, x);
if (x) {
battery->stability_test = true;
battery->eng_not_full_status = true;
}
else {
battery->stability_test = false;
battery->eng_not_full_status = false;
}
ret = count;
}
break;
case BATT_CAPACITY_MAX:
if (sscanf(buf, "%10d\n", &x) == 1) {
dev_err(battery->dev,
"%s: BATT_CAPACITY_MAX(%d), fg_reset(%d)\n", __func__, x, sec_bat_get_fgreset());
if (!sec_bat_get_fgreset() && !battery->store_mode) {
value.intval = x;
psy_do_property(battery->pdata->fuelgauge_name, set,
POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN, value);
/* update soc */
value.intval = 0;
psy_do_property(battery->pdata->fuelgauge_name, get,
POWER_SUPPLY_PROP_CAPACITY, value);
battery->capacity = value.intval;
} else {
#if !defined(CONFIG_SAMSUNG_PRODUCT_SHIP)
battery->fg_reset = 1;
#endif
}
ret = count;
}
break;
case BATT_REPCAP_1ST:
if ((sscanf(buf, "%10d\n", &x) == 1) && (battery->pdata->soc_by_repcap_en)) {
dev_info(battery->dev,
"%s: BATT_REPCAP(%d), fg_reset(%d)\n", __func__, x, sec_bat_get_fgreset());
/* Maximum value check should be added in FG driver file */
if (!sec_bat_get_fgreset() && !battery->store_mode && x >= 0) {
value.intval = x;
psy_do_property(battery->pdata->fuelgauge_name, set,
POWER_SUPPLY_EXT_PROP_CHARGE_FULL_REPCAP, value);
/* update soc */
value.intval = 0;
psy_do_property(battery->pdata->fuelgauge_name, get,
POWER_SUPPLY_PROP_CAPACITY, value);
battery->capacity = value.intval;
} else {
#if !defined(CONFIG_SAMSUNG_PRODUCT_SHIP)
battery->fg_reset = 1;
#endif
}
ret = count;
}
break;
case BATT_INBAT_VOLTAGE:
break;
case BATT_INBAT_VOLTAGE_OCV:
break;
case BATT_VBYP_VOLTAGE:
break;
case CHECK_SUB_CHG:
break;
case BATT_INBAT_WIRELESS_CS100:
if (sscanf(buf, "%10d\n", &x) == 1) {
pr_info("%s send cs100 command\n", __func__);
value.intval = POWER_SUPPLY_STATUS_FULL;
psy_do_property(battery->pdata->wireless_charger_name, set,
POWER_SUPPLY_PROP_STATUS, value);
ret = count;
}
break;
case HMT_TA_CONNECTED:
if (sscanf(buf, "%10d\n", &x) == 1) {
#if !IS_ENABLED(CONFIG_PDIC_NOTIFIER) && !IS_ENABLED(CONFIG_CCIC_NOTIFIER)
dev_info(battery->dev,
"%s: HMT_TA_CONNECTED(%d)\n", __func__, x);
if (x) {
value.intval = false;
psy_do_property(battery->pdata->charger_name, set,
POWER_SUPPLY_EXT_PROP_CHARGE_OTG_CONTROL,
value);
dev_info(battery->dev,
"%s: changed to OTG cable detached\n", __func__);
battery->wire_status = SEC_BATTERY_CABLE_HMT_CONNECTED;
__pm_stay_awake(battery->cable_ws);
queue_delayed_work(battery->monitor_wqueue, &battery->cable_work, 0);
} else {
value.intval = true;
psy_do_property(battery->pdata->charger_name, set,
POWER_SUPPLY_EXT_PROP_CHARGE_OTG_CONTROL,
value);
dev_info(battery->dev,
"%s: changed to OTG cable attached\n", __func__);
battery->wire_status = SEC_BATTERY_CABLE_OTG;
__pm_stay_awake(battery->cable_ws);
queue_delayed_work(battery->monitor_wqueue, &battery->cable_work, 0);
}
#endif
ret = count;
}
break;
case HMT_TA_CHARGE:
if (sscanf(buf, "%10d\n", &x) == 1) {
#if IS_ENABLED(CONFIG_PDIC_NOTIFIER) || IS_ENABLED(CONFIG_CCIC_NOTIFIER)
dev_info(battery->dev,
"%s: HMT_TA_CHARGE(%d)\n", __func__, x);
/* do not charge off without cable type, since wdt could be expired */
if (x) {
sec_bat_set_current_event(battery, 0, SEC_BAT_CURRENT_EVENT_CHARGE_DISABLE);
sec_vote(battery->chgen_vote, VOTER_HMT, false, 0);
} else if (!x && !is_nocharge_type(battery->cable_type)) {
sec_bat_set_current_event(battery, SEC_BAT_CURRENT_EVENT_CHARGE_DISABLE,
SEC_BAT_CURRENT_EVENT_CHARGE_DISABLE);
sec_vote(battery->chgen_vote, VOTER_HMT, true, SEC_BAT_CHG_MODE_CHARGING_OFF);
} else
dev_info(battery->dev, "%s: Wrong HMT control\n", __func__);
ret = count;
#else
dev_info(battery->dev,
"%s: HMT_TA_CHARGE(%d)\n", __func__, x);
psy_do_property(battery->pdata->charger_name, get,
POWER_SUPPLY_EXT_PROP_CHARGE_OTG_CONTROL, value);
if (value.intval) {
dev_info(battery->dev,
"%s: ignore HMT_TA_CHARGE(%d)\n", __func__, x);
} else {
if (x) {
value.intval = false;
psy_do_property(battery->pdata->charger_name, set,
POWER_SUPPLY_EXT_PROP_CHARGE_OTG_CONTROL,
value);
dev_info(battery->dev,
"%s: changed to OTG cable detached\n", __func__);
battery->wire_status = SEC_BATTERY_CABLE_HMT_CHARGE;
__pm_stay_awake(battery->cable_ws);
queue_delayed_work(battery->monitor_wqueue, &battery->cable_work, 0);
} else {
value.intval = false;
psy_do_property(battery->pdata->charger_name, set,
POWER_SUPPLY_EXT_PROP_CHARGE_OTG_CONTROL,
value);
dev_info(battery->dev,
"%s: changed to OTG cable detached\n", __func__);
battery->wire_status = SEC_BATTERY_CABLE_HMT_CONNECTED;
__pm_stay_awake(battery->cable_ws);
queue_delayed_work(battery->monitor_wqueue, &battery->cable_work, 0);
}
}
ret = count;
#endif
}
break;
#if defined(CONFIG_SEC_FACTORY)
case AFC_TEST_FG_MODE:
if (sscanf(buf, "%10d\n", &x) == 1) {
value.intval = x;
psy_do_property(battery->pdata->fuelgauge_name, set,
POWER_SUPPLY_EXT_PROP_AFC_TEST_FG_MODE, value);
ret = count;
}
break;
#endif
#if defined(CONFIG_BATTERY_AGE_FORECAST)
case FG_CYCLE:
break;
case FG_FULL_VOLTAGE:
break;
case FG_FULLCAPNOM:
break;
#if defined(CONFIG_BATTERY_AGE_FORECAST_DETACHABLE)
case BATT_AFTER_MANUFACTURED:
#else
case BATTERY_CYCLE:
#endif
if (sscanf(buf, "%10d\n", &x) == 1) {
dev_info(battery->dev, "%s: %s(%d)\n", __func__,
(offset == BATTERY_CYCLE) ?
"BATTERY_CYCLE" : "BATTERY_CYCLE(W)", x);
if (x >= 0) {
int prev_battery_cycle = battery->batt_cycle;
battery->batt_cycle = x;
#if defined(CONFIG_BATTERY_CISD)
battery->cisd.data[CISD_DATA_CYCLE] = x;
#endif
if (prev_battery_cycle < 0) {
sec_bat_aging_check(battery);
}
#if defined(CONFIG_BATTERY_AGE_FORECAST)
sec_bat_check_battery_health(battery);
#endif
}
ret = count;
}
break;
case BATTERY_CYCLE_TEST:
sec_bat_aging_check(battery);
break;
#endif
case BATT_WPC_TEMP:
break;
case BATT_WPC_TEMP_ADC:
break;
#if defined(CONFIG_WIRELESS_FIRMWARE_UPDATE)
case BATT_WIRELESS_FIRMWARE_UPDATE:
if (sscanf(buf, "%10d\n", &x) == 1) {
if (sec_bat_check_boost_mfc_condition(battery, x)) {
if (x == SEC_WIRELESS_FW_UPDATE_SDCARD_MODE) {
pr_info("%s fw mode is SDCARD\n", __func__);
sec_bat_fw_update(battery, x);
} else if (x == SEC_WIRELESS_FW_UPDATE_BUILTIN_MODE) {
pr_info("%s fw mode is BUILD IN\n", __func__);
sec_bat_fw_update(battery, x);
} else if (x == SEC_WIRELESS_FW_UPDATE_SPU_MODE) {
pr_info("%s fw mode is SPU\n", __func__);
sec_bat_fw_update(battery, x);
} else if (x == SEC_WIRELESS_FW_UPDATE_SPU_MODE) {
pr_info("%s fw mode is SPU VERIFY\n", __func__);
sec_bat_fw_update(battery, x);
} else {
dev_info(battery->dev, "%s: wireless firmware unknown command\n", __func__);
return -EINVAL;
}
} else
pr_info("%s: skip fw update at this time\n", __func__);
ret = count;
}
break;
case OTP_FIRMWARE_RESULT:
if (sscanf(buf, "%10d\n", &x) == 1) {
if (x == 2) {
value.intval = x;
pr_info("%s RX firmware update ready!\n", __func__);
psy_do_property(battery->pdata->wireless_charger_name, set,
POWER_SUPPLY_PROP_MANUFACTURER, value);
} else {
dev_info(battery->dev, "%s: firmware unknown command\n", __func__);
return -EINVAL;
}
ret = count;
}
break;
case WC_IC_GRADE:
break;
case WC_IC_CHIP_ID:
break;
case OTP_FIRMWARE_VER_BIN:
break;
case OTP_FIRMWARE_VER:
break;
#endif
case WC_VOUT:
break;
case WC_VRECT:
break;
case WC_RX_CONNECTED:
break;
case WC_RX_CONNECTED_DEV:
break;
case WC_TX_MFC_VIN_FROM_UNO:
break;
case WC_TX_MFC_IIN_FROM_UNO:
break;
#if defined(CONFIG_WIRELESS_TX_MODE)
case WC_TX_AVG_CURR:
break;
case WC_TX_TOTAL_PWR:
break;
#endif
case WC_TX_STOP_CAPACITY:
if (sscanf(buf, "%10d\n", &x) == 1) {
pr_info("%s : tx stop capacity (%d)%%\n", __func__, x);
if (x >= 0 && x <= 100)
battery->pdata->tx_stop_capacity = x;
ret = count;
}
break;
case WC_TX_TIMER_EN:
if (sscanf(buf, "%10d\n", &x) == 1) {
pr_info("%s : tx receiver detecting timer (%d)%%\n", __func__, x);
value.intval = x;
psy_do_property(battery->pdata->wireless_charger_name, set,
POWER_SUPPLY_EXT_PROP_WIRELESS_TIMER_ON, value);
ret = count;
}
break;
case WC_TX_EN:
if (sscanf(buf, "%10d\n", &x) == 1) {
if (battery->mfc_fw_update) {
pr_info("@Tx_Mode %s : skip Tx by mfc_fw_update\n", __func__);
return count;
}
#if defined(CONFIG_WIRELESS_TX_MODE)
/* x value is written by ONEUI 2.5 PMS when tx_event is changed */
if (x && is_wireless_fake_type(battery->cable_type)) {
pr_info("@Tx_Mode %s : Can't enable Tx mode during wireless charging\n", __func__);
return count;
} else {
pr_info("@Tx_Mode %s: Set TX Enable (%d)\n", __func__, x);
sec_wireless_set_tx_enable(battery, x);
if (!x) {
/* clear tx all event */
sec_bat_set_tx_event(battery, 0, BATT_TX_EVENT_WIRELESS_ALL_MASK);
}
#if defined(CONFIG_BATTERY_CISD)
if (x)
battery->cisd.tx_data[TX_ON]++;
#endif
}
#endif
ret = count;
}
break;
case WC_TX_VOUT:
if (sscanf(buf, "%10d\n", &x) == 1) {
pr_info("@Tx_Mode %s: Set TX Vout (%d)\n", __func__, x);
battery->wc_tx_vout = value.intval = x;
if (battery->wc_tx_enable) {
pr_info("@Tx_Mode %s: set TX Vout (%d)\n", __func__, value.intval);
psy_do_property("otg", set,
POWER_SUPPLY_EXT_PROP_WIRELESS_TX_VOUT, value);
} else {
pr_info("@Tx_Mode %s: TX mode turned off now\n", __func__);
}
ret = count;
}
break;
case BATT_HV_WIRELESS_STATUS:
if (sscanf(buf, "%10d\n", &x) == 1) {
if (x == 1 && is_hv_wireless_type(battery->cable_type)) {
#ifdef CONFIG_SEC_FACTORY
int input_current, charging_current;
pr_info("%s change cable type HV WIRELESS -> WIRELESS\n", __func__);
battery->wc_status = battery->cable_type = SEC_BATTERY_CABLE_WIRELESS;
input_current = battery->pdata->charging_current[battery->cable_type].input_current_limit;
charging_current = battery->pdata->charging_current[battery->cable_type].fast_charging_current;
sec_vote(battery->fcc_vote, VOTER_SLEEP_MODE, true, charging_current);
sec_vote(battery->input_vote, VOTER_SLEEP_MODE, true, input_current);
#endif
pr_info("%s HV_WIRELESS_STATUS set to 1. Vout set to 5V.\n", __func__);
value.intval = WIRELESS_VOUT_5V;
__pm_stay_awake(battery->cable_ws);
psy_do_property(battery->pdata->wireless_charger_name, set,
POWER_SUPPLY_EXT_PROP_INPUT_VOLTAGE_REGULATION, value);
__pm_relax(battery->cable_ws);
} else if (x == 3 && is_hv_wireless_type(battery->cable_type)) {
pr_info("%s HV_WIRELESS_STATUS set to 3. Vout set to 10V.\n", __func__);
value.intval = WIRELESS_VOUT_10V;
psy_do_property(battery->pdata->wireless_charger_name, set,
POWER_SUPPLY_EXT_PROP_INPUT_VOLTAGE_REGULATION, value);
} else {
dev_info(battery->dev, "%s: HV_WIRELESS_STATUS unknown command\n", __func__);
return -EINVAL;
}
ret = count;
}
break;
case BATT_HV_WIRELESS_PAD_CTRL:
if (sscanf(buf, "%10d\n", &x) == 1) {
pr_err("%s: x : %d\n", __func__, x);
if (x == 1) {
pr_info("%s: hv wireless charging is disabled\n", __func__);
battery->sleep_mode = true;
value.intval = battery->sleep_mode;
psy_do_property(battery->pdata->wireless_charger_name, set,
POWER_SUPPLY_EXT_PROP_SLEEP_MODE, value);
if (is_hv_wireless_type(battery->cable_type))
sec_vote(battery->input_vote, VOTER_SLEEP_MODE, true, battery->pdata->sleep_mode_limit_current);
} else if (x == 2) {
pr_info("%s: hv wireless charging is enabled\n", __func__);
battery->auto_mode = false;
battery->sleep_mode = false;
value.intval = battery->sleep_mode;
psy_do_property(battery->pdata->wireless_charger_name, set,
POWER_SUPPLY_EXT_PROP_SLEEP_MODE, value);
value.intval = WIRELESS_SLEEP_MODE_DISABLE;
psy_do_property(battery->pdata->wireless_charger_name, set,
POWER_SUPPLY_EXT_PROP_WIRELESS_RX_CONTROL, value);
sec_vote(battery->input_vote, VOTER_SLEEP_MODE, false, 0);
} else if (x == 3) {
pr_info("%s led off\n", __func__);
value.intval = WIRELESS_PAD_LED_OFF;
psy_do_property(battery->pdata->wireless_charger_name, set,
POWER_SUPPLY_EXT_PROP_WIRELESS_RX_CONTROL, value);
} else if (x == 4) {
pr_info("%s led on\n", __func__);
value.intval = WIRELESS_PAD_LED_ON;
psy_do_property(battery->pdata->wireless_charger_name, set,
POWER_SUPPLY_EXT_PROP_WIRELESS_RX_CONTROL, value);
} else if ((x == 5) || (x == 6)) {
if (battery->pdata->wpc_vout_ctrl_lcd_on) {
battery->wpc_vout_ctrl_mode = (x == 5) ? true : false;
pr_info("%s: %s display flicker wa\n",
__func__, (x == 5) ? "enable" : "disable");
}
battery->polling_short = false;
__pm_stay_awake(battery->monitor_ws);
queue_delayed_work(battery->monitor_wqueue,
&battery->monitor_work, 0);
} else {
dev_info(battery->dev, "%s: BATT_HV_WIRELESS_PAD_CTRL unknown command\n", __func__);
return -EINVAL;
}
ret = count;
}
break;
case WC_TX_ID:
break;
#if defined(CONFIG_ENG_BATTERY_CONCEPT)
case BATT_TUNE_FLOAT_VOLTAGE:
sscanf(buf, "%10d\n", &x);
pr_info("%s float voltage = %d mV",__func__, x);
sec_vote(battery->fv_vote, VOTER_CABLE, true, x);
break;
case BATT_TUNE_INPUT_CHARGE_CURRENT:
sscanf(buf, "%10d\n", &x);
pr_info("%s input charge current = %d mA",__func__, x);
if (x >= 0 && x <= 4000 ){
battery->test_max_current = true;
for (i = 0; i < SEC_BATTERY_CABLE_MAX; i++) {
if (i != SEC_BATTERY_CABLE_USB)
battery->pdata->charging_current[i].input_current_limit = x;
pr_info("%s [%d] = %d mA",__func__, i, battery->pdata->charging_current[i].input_current_limit);
}
if (battery->cable_type != SEC_BATTERY_CABLE_USB) {
value.intval = x;
psy_do_property(battery->pdata->charger_name, set,
POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT, value);
}
}
break;
case BATT_TUNE_FAST_CHARGE_CURRENT:
sscanf(buf, "%10d\n", &x);
pr_info("%s fast charge current = %d mA",__func__, x);
if (x >= 0 && x <= 4000 ){
battery->test_charge_current = true;
for (i = 0; i < SEC_BATTERY_CABLE_MAX; i++) {
if (i != SEC_BATTERY_CABLE_USB)
battery->pdata->charging_current[i].fast_charging_current = x;
pr_info("%s [%d] = %d mA",__func__, i, battery->pdata->charging_current[i].fast_charging_current);
}
if (battery->cable_type != SEC_BATTERY_CABLE_USB) {
value.intval = x;
psy_do_property(battery->pdata->charger_name, set,
POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT, value);
}
}
break;
case BATT_TUNE_WIRELESS_VOUT_CURRENT:
#if IS_ENABLED(CONFIG_WIRELESS_CHARGING)
{
int vout, input_current, offset;
sscanf(buf, "%10d %10d\n", &offset, &input_current);
switch (offset) {
case 5500:
vout = WIRELESS_VOUT_5V;
break;
case 9000:
vout = WIRELESS_VOUT_9V;
break;
case 10000:
vout = WIRELESS_VOUT_10V;
break;
case 11000:
vout = WIRELESS_VOUT_11V;
break;
case 12000:
vout = WIRELESS_VOUT_12V;
break;
case 12500:
vout = WIRELESS_VOUT_12_5V;
break;
default:
pr_info("%s vout(%d) you entered is not supported\n", __func__, offset);
vout = 0;
break;
}
if (input_current >= 100 && input_current <= 4000 && vout > 0) {
for (i = 0; i < battery->wc20_info_len; i++) {
if (battery->pdata->wireless_power_info[i].vout != 0) {
battery->pdata->wireless_power_info[i].vout = offset;
battery->pdata->wireless_power_info[i].input_current_limit = input_current;
}
}
value.intval = vout;
psy_do_property(battery->pdata->wireless_charger_name, set,
POWER_SUPPLY_EXT_PROP_WIRELESS_VOUT, value);
pr_info("%s vout(%d, %d) input_current(%d)",__func__, offset, vout, input_current);
}
}
#endif
break;
case BATT_TUNE_UI_TERM_CURRENT_1ST:
sscanf(buf, "%10d\n", &x);
pr_info("%s ui term current = %d mA",__func__, x);
if (x > 0 && x < 1000 ){
battery->pdata->full_check_current_1st = x;
}
break;
case BATT_TUNE_UI_TERM_CURRENT_2ND:
sscanf(buf, "%10d\n", &x);
pr_info("%s ui term current = %d mA",__func__, x);
if (x > 0 && x < 1000 ){
battery->pdata->full_check_current_2nd = x;
}
break;
case BATT_TUNE_CHG_TEMP_HIGH:
sscanf(buf, "%10d\n", &x);
pr_info("%s chg_high_temp = %d ",__func__, x);
if (x < 1000 && x >= -200)
battery->pdata->chg_high_temp = x;
break;
case BATT_TUNE_CHG_TEMP_REC:
sscanf(buf, "%10d\n", &x);
pr_info("%s chg_high_temp_recovery = %d ",__func__, x);
if (x < 1000 && x >= -200)
battery->pdata->chg_high_temp_recovery = x;
break;
case BATT_TUNE_CHG_LIMIT_CUR:
sscanf(buf, "%10d\n", &x);
pr_info("%s chg_charging_limit_current = %d ",__func__, x);
if (x < 3000 && x > 0)
{
battery->pdata->chg_charging_limit_current = x;
battery->pdata->charging_current[SEC_BATTERY_CABLE_9V_ERR].input_current_limit= x;
battery->pdata->charging_current[SEC_BATTERY_CABLE_9V_UNKNOWN].input_current_limit= x;
battery->pdata->charging_current[SEC_BATTERY_CABLE_9V_TA].input_current_limit= x;
}
break;
case BATT_TUNE_LRP_TEMP_HIGH_LCDON:
{
int lrp_m = 0, lrp_t[4] = {0, };
int lrp_pt = LRP_NORMAL;
if (sscanf(buf, "%10d %10d %10d %10d %10d\n",
&lrp_m, &lrp_t[0], &lrp_t[1], &lrp_t[2], &lrp_t[3]) == 5) {
pr_info("%s : lrp_high_temp_lcd on lrp_m: %c, temp: %d %d %d %d\n",
__func__, lrp_m, lrp_t[0], lrp_t[1], lrp_t[2], lrp_t[3]);
if (lrp_m == 45)
lrp_pt = LRP_45W;
else if (lrp_m == 25)
lrp_pt = LRP_25W;
if (x < 1000 && x >= -200) {
battery->pdata->lrp_temp[lrp_pt].trig[ST2][LCD_ON] = lrp_t[0];
battery->pdata->lrp_temp[lrp_pt].recov[ST2][LCD_ON] = lrp_t[1];
battery->pdata->lrp_temp[lrp_pt].trig[ST1][LCD_ON] = lrp_t[2];
battery->pdata->lrp_temp[lrp_pt].recov[ST1][LCD_ON] = lrp_t[3];
}
}
break;
}
case BATT_TUNE_LRP_TEMP_HIGH_LCDOFF:
{
int lrp_m = 0, lrp_t[4] = {0, };
int lrp_pt = LRP_NORMAL;
if (sscanf(buf, "%10d %10d %10d %10d %10d\n",
&lrp_m, &lrp_t[0], &lrp_t[1], &lrp_t[2], &lrp_t[3]) == 5) {
pr_info("%s : lrp_high_temp_lcd off lrp_m: %dW, temp: %d %d %d %d\n",
__func__, lrp_m, lrp_t[0], lrp_t[1], lrp_t[2], lrp_t[3]);
if (lrp_m == 45)
lrp_pt = LRP_45W;
else if (lrp_m == 25)
lrp_pt = LRP_25W;
if (x < 1000 && x >= -200) {
battery->pdata->lrp_temp[lrp_pt].trig[ST2][LCD_OFF] = lrp_t[0];
battery->pdata->lrp_temp[lrp_pt].recov[ST2][LCD_OFF] = lrp_t[1];
battery->pdata->lrp_temp[lrp_pt].trig[ST1][LCD_OFF] = lrp_t[2];
battery->pdata->lrp_temp[lrp_pt].recov[ST1][LCD_OFF] = lrp_t[3];
}
}
break;
}
case BATT_TUNE_COIL_TEMP_HIGH:
break;
case BATT_TUNE_COIL_TEMP_REC:
break;
case BATT_TUNE_COIL_LIMIT_CUR:
sscanf(buf, "%10d\n", &x);
pr_info("%s wpc_input_limit_current = %d ",__func__, x);
if (x < 3000 && x > 0)
{
battery->pdata->charging_current[SEC_BATTERY_CABLE_9V_ERR].input_current_limit= x;
battery->pdata->charging_current[SEC_BATTERY_CABLE_9V_UNKNOWN].input_current_limit= x;
battery->pdata->charging_current[SEC_BATTERY_CABLE_9V_TA].input_current_limit= x;
}
break;
case BATT_TUNE_WPC_TEMP_HIGH:
sscanf(buf, "%10d\n", &x);
pr_info("%s wpc_high_temp = %d ",__func__, x);
battery->pdata->wpc_high_temp = x;
break;
case BATT_TUNE_WPC_TEMP_HIGH_REC:
sscanf(buf, "%10d\n", &x);
pr_info("%s wpc_high_temp_recovery = %d ",__func__, x);
battery->pdata->wpc_high_temp_recovery = x;
break;
case BATT_TUNE_DCHG_TEMP_HIGH:
{
int dchg_t[4] = {0, };
sscanf(buf, "%10d %10d %10d %10d\n",
&dchg_t[0], &dchg_t[1], &dchg_t[2], &dchg_t[3]);
pr_info("%s dchg_high_temp = %d %d %d %d", __func__,
dchg_t[0], dchg_t[1], dchg_t[2], dchg_t[3]);
for (i = 0; i < 4; i++) {
battery->pdata->dchg_high_temp[i] = dchg_t[i];
}
break;
}
case BATT_TUNE_DCHG_TEMP_HIGH_REC:
{
int dchg_t[4] = {0, };
sscanf(buf, "%10d %10d %10d %10d\n",
&dchg_t[0], &dchg_t[1], &dchg_t[2], &dchg_t[3]);
pr_info("%s dchg_high_temp_recovery = %d %d %d %d", __func__,
dchg_t[0], dchg_t[1], dchg_t[2], dchg_t[3]);
for (i = 0; i < 4; i++) {
battery->pdata->dchg_high_temp_recovery[i] = dchg_t[i];
}
break;
}
case BATT_TUNE_DCHG_BATT_TEMP_HIGH:
{
int dchg_t[4] = {0, };
sscanf(buf, "%10d %10d %10d %10d\n",
&dchg_t[0], &dchg_t[1], &dchg_t[2], &dchg_t[3]);
pr_info("%s dchg_high_batt_temp = %d %d %d %d", __func__,
dchg_t[0], dchg_t[1], dchg_t[2], dchg_t[3]);
for (i = 0; i < 4; i++) {
battery->pdata->dchg_high_batt_temp[i] = dchg_t[i];
}
break;
}
case BATT_TUNE_DCHG_BATT_TEMP_HIGH_REC:
{
int dchg_t[4] = {0, };
sscanf(buf, "%10d %10d %10d %10d\n",
&dchg_t[0], &dchg_t[1], &dchg_t[2], &dchg_t[3]);
pr_info("%s dchg_high_batt_temp_recovery = %d %d %d %d", __func__,
dchg_t[0], dchg_t[1], dchg_t[2], dchg_t[3]);
for (i = 0; i < 4; i++) {
battery->pdata->dchg_high_batt_temp_recovery[i] = dchg_t[i];
}
break;
}
case BATT_TUNE_DCHG_LIMIT_INPUT_CUR:
sscanf(buf, "%10d\n", &x);
pr_info("%s dchg_input_limit_current = %d ",__func__, x);
battery->pdata->dchg_input_limit_current = x;
break;
case BATT_TUNE_DCHG_LIMIT_CHG_CUR:
sscanf(buf, "%10d\n", &x);
pr_info("%s dchg_charging_limit_current = %d ",__func__, x);
battery->pdata->dchg_charging_limit_current = x;
break;
#if defined(CONFIG_WIRELESS_TX_MODE)
case BATT_TUNE_TX_MFC_IOUT_GEAR:
sscanf(buf, "%10d\n", &x);
pr_info("%s tx_mfc_iout_gear = %d", __func__, x);
battery->pdata->tx_mfc_iout_gear = x;
break;
case BATT_TUNE_TX_MFC_IOUT_PHONE:
sscanf(buf, "%10d\n", &x);
pr_info("%s tx_mfc_iout_phone = %d", __func__, x);
battery->pdata->tx_mfc_iout_phone = x;
break;
#endif
#endif
#if defined(CONFIG_UPDATE_BATTERY_DATA)
case BATT_UPDATE_DATA:
if (!battery->data_path && (count * sizeof(char)) < 256) {
battery->data_path = kzalloc((count * sizeof(char) + 1), GFP_KERNEL);
if (battery->data_path) {
sscanf(buf, "%s\n", battery->data_path);
cancel_delayed_work(&battery->batt_data_work);
__pm_stay_awake(battery->batt_data_ws);
queue_delayed_work(battery->monitor_wqueue,
&battery->batt_data_work, msecs_to_jiffies(100));
} else {
pr_info("%s: failed to alloc data_path buffer\n", __func__);
}
}
ret = count;
break;
#endif
case BATT_MISC_EVENT:
if (sscanf(buf, "%10d\n", &x) == 1) {
pr_info("%s: PMS sevice hiccup read done : %d ", __func__, x);
if (battery->misc_event &
(BATT_MISC_EVENT_WATER_HICCUP_TYPE |
BATT_MISC_EVENT_TEMP_HICCUP_TYPE)) {
if (!battery->hiccup_status) {
sec_bat_set_misc_event(battery,
0, (BATT_MISC_EVENT_WATER_HICCUP_TYPE |
BATT_MISC_EVENT_TEMP_HICCUP_TYPE));
} else {
battery->hiccup_clear = true;
pr_info("%s : Hiccup event doesn't clear. Hiccup clear bit set (%d)\n",
__func__, battery->hiccup_clear);
}
}
}
ret = count;
break;
case BATT_EXT_DEV_CHG:
if (sscanf(buf, "%10d\n", &x) == 1) {
pr_info("%s: Connect Ext Device : %d ",__func__, x);
switch (x) {
case EXT_DEV_NONE:
battery->wire_status = SEC_BATTERY_CABLE_NONE;
value.intval = 0;
break;
case EXT_DEV_GAMEPAD_CHG:
battery->wire_status = SEC_BATTERY_CABLE_TA;
value.intval = 0;
break;
case EXT_DEV_GAMEPAD_OTG:
battery->wire_status = SEC_BATTERY_CABLE_OTG;
value.intval = 1;
break;
default:
break;
}
psy_do_property(battery->pdata->charger_name, set,
POWER_SUPPLY_EXT_PROP_CHARGE_OTG_CONTROL,
value);
queue_delayed_work(battery->monitor_wqueue,
&battery->cable_work, 0);
ret = count;
}
break;
case BATT_WDT_CONTROL:
if (sscanf(buf, "%10d\n", &x) == 1) {
pr_info("%s: Charger WDT Set : %d\n", __func__, x);
battery->wdt_kick_disable = x;
#if IS_ENABLED(CONFIG_DIRECT_CHARGING)
value.intval = x;
psy_do_property(battery->pdata->charger_name, set,
POWER_SUPPLY_EXT_PROP_DIRECT_WDT_CONTROL, value);
#endif
}
ret = count;
break;
case MODE:
if (sscanf(buf, "%10d\n", &x) == 1) {
value.intval = x;
psy_do_property(battery->pdata->charger_name, set,
POWER_SUPPLY_EXT_PROP_MULTI_CHARGER_MODE, value);
ret = count;
}
break;
case CHECK_PS_READY:
break;
case BATT_CHIP_ID:
break;
case ERROR_CAUSE:
break;
case CISD_FULLCAPREP_MAX:
break;
#if defined(CONFIG_BATTERY_CISD)
case CISD_DATA:
{
struct cisd *pcisd = &battery->cisd;
int temp_data[CISD_DATA_MAX_PER_DAY] = {0,};
sscanf(buf, "%10d\n", &temp_data[0]);
if (temp_data[CISD_DATA_RESET_ALG] > 0) {
if (sscanf(buf, "%10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d\n",
&temp_data[0], &temp_data[1], &temp_data[2],
&temp_data[3], &temp_data[4], &temp_data[5],
&temp_data[6], &temp_data[7], &temp_data[8],
&temp_data[9], &temp_data[10], &temp_data[11],
&temp_data[12], &temp_data[13], &temp_data[14],
&temp_data[15], &temp_data[16], &temp_data[17],
&temp_data[18], &temp_data[19], &temp_data[20],
&temp_data[21], &temp_data[22], &temp_data[23],
&temp_data[24], &temp_data[25], &temp_data[26],
&temp_data[27], &temp_data[28], &temp_data[29],
&temp_data[30], &temp_data[31], &temp_data[32],
&temp_data[33], &temp_data[34], &temp_data[35],
&temp_data[36], &temp_data[37], &temp_data[38],
&temp_data[39], &temp_data[40], &temp_data[41],
&temp_data[42], &temp_data[43], &temp_data[44],
&temp_data[45], &temp_data[46], &temp_data[47],
&temp_data[48], &temp_data[49], &temp_data[50],
&temp_data[51], &temp_data[52], &temp_data[53],
&temp_data[54], &temp_data[55], &temp_data[56],
&temp_data[57], &temp_data[58], &temp_data[59],
&temp_data[60], &temp_data[61], &temp_data[62],
&temp_data[63], &temp_data[64], &temp_data[65],
&temp_data[66], &temp_data[67], &temp_data[68],
&temp_data[69], &temp_data[70], &temp_data[71],
&temp_data[72], &temp_data[73], &temp_data[74],
&temp_data[75], &temp_data[76]) <= CISD_DATA_MAX_PER_DAY) {
for (i = 0; i < CISD_DATA_MAX_PER_DAY; i++)
pcisd->data[i] = 0;
pcisd->data[CISD_DATA_ALG_INDEX] = battery->pdata->cisd_alg_index;
pcisd->data[CISD_DATA_FULL_COUNT] = temp_data[0];
pcisd->data[CISD_DATA_CAP_MAX] = temp_data[1];
pcisd->data[CISD_DATA_CAP_MIN] = temp_data[2];
pcisd->data[CISD_DATA_VALERT_COUNT] = temp_data[16];
pcisd->data[CISD_DATA_CYCLE] = temp_data[17];
pcisd->data[CISD_DATA_WIRE_COUNT] = temp_data[18];
pcisd->data[CISD_DATA_WIRELESS_COUNT] = temp_data[19];
pcisd->data[CISD_DATA_HIGH_TEMP_SWELLING] = temp_data[20];
pcisd->data[CISD_DATA_LOW_TEMP_SWELLING] = temp_data[21];
pcisd->data[CISD_DATA_WC_HIGH_TEMP_SWELLING] = temp_data[22];
pcisd->data[CISD_DATA_AICL_COUNT] = temp_data[26];
pcisd->data[CISD_DATA_BATT_TEMP_MAX] = temp_data[27];
pcisd->data[CISD_DATA_BATT_TEMP_MIN] = temp_data[28];
pcisd->data[CISD_DATA_CHG_TEMP_MAX] = temp_data[29];
pcisd->data[CISD_DATA_CHG_TEMP_MIN] = temp_data[30];
pcisd->data[CISD_DATA_WPC_TEMP_MAX] = temp_data[31];
pcisd->data[CISD_DATA_WPC_TEMP_MIN] = temp_data[32];
pcisd->data[CISD_DATA_UNSAFETY_VOLTAGE] = temp_data[33];
pcisd->data[CISD_DATA_UNSAFETY_TEMPERATURE] = temp_data[34];
pcisd->data[CISD_DATA_SAFETY_TIMER] = temp_data[35];
pcisd->data[CISD_DATA_VSYS_OVP] = temp_data[36];
pcisd->data[CISD_DATA_VBAT_OVP] = temp_data[37];
}
} else {
const char *p = buf;
pr_info("%s: %s\n", __func__, buf);
for (i = CISD_DATA_RESET_ALG; i < CISD_DATA_MAX_PER_DAY; i++) {
if (sscanf(p, "%10d%n", &pcisd->data[i], &x) > 0) {
p += (size_t)x;
if (pcisd->data[CISD_DATA_ALG_INDEX] != battery->pdata->cisd_alg_index) {
pr_info("%s: ALG_INDEX is changed %d -> %d\n", __func__,
pcisd->data[CISD_DATA_ALG_INDEX], battery->pdata->cisd_alg_index);
temp_data[CISD_DATA_RESET_ALG] = -1;
break;
}
} else {
pr_info("%s: NO DATA (cisd_data)\n", __func__);
temp_data[CISD_DATA_RESET_ALG] = -1;
break;
}
}
pr_info("%s: %s cisd data\n", __func__,
((temp_data[CISD_DATA_RESET_ALG] < 0 || battery->fg_reset) ?
"init" : "update"));
if (temp_data[CISD_DATA_RESET_ALG] < 0 || battery->fg_reset) {
/* initialize data */
for (i = CISD_DATA_RESET_ALG; i < CISD_DATA_MAX_PER_DAY; i++)
pcisd->data[i] = 0;
battery->fg_reset = 0;
pcisd->data[CISD_DATA_ALG_INDEX] = battery->pdata->cisd_alg_index;
pcisd->data[CISD_DATA_FULL_COUNT] = 1;
pcisd->data[CISD_DATA_BATT_TEMP_MAX] = -300;
pcisd->data[CISD_DATA_CHG_TEMP_MAX] = -300;
pcisd->data[CISD_DATA_WPC_TEMP_MAX] = -300;
pcisd->data[CISD_DATA_USB_TEMP_MAX] = -300;
pcisd->data[CISD_DATA_BATT_TEMP_MIN] = 1000;
pcisd->data[CISD_DATA_CHG_TEMP_MIN] = 1000;
pcisd->data[CISD_DATA_WPC_TEMP_MIN] = 1000;
pcisd->data[CISD_DATA_USB_TEMP_MIN] = 1000;
pcisd->data[CISD_DATA_CAP_MIN] = 0xFFFF;
pcisd->data[CISD_DATA_FULL_COUNT_PER_DAY] = 1;
pcisd->data[CISD_DATA_BATT_TEMP_MAX_PER_DAY] = -300;
pcisd->data[CISD_DATA_SUB_BATT_TEMP_MAX_PER_DAY] = -300;
pcisd->data[CISD_DATA_CHG_TEMP_MAX_PER_DAY] = -300;
pcisd->data[CISD_DATA_USB_TEMP_MAX_PER_DAY] = -300;
pcisd->data[CISD_DATA_BATT_TEMP_MIN_PER_DAY] = 1000;
pcisd->data[CISD_DATA_SUB_BATT_TEMP_MIN_PER_DAY] = 1000;
pcisd->data[CISD_DATA_CHG_TEMP_MIN_PER_DAY] = 1000;
pcisd->data[CISD_DATA_USB_TEMP_MIN_PER_DAY] = 1000;
pcisd->data[CISD_DATA_CHG_BATT_TEMP_MAX] = -300;
pcisd->data[CISD_DATA_CHG_CHG_TEMP_MAX] = -300;
pcisd->data[CISD_DATA_CHG_WPC_TEMP_MAX] = -300;
pcisd->data[CISD_DATA_CHG_USB_TEMP_MAX] = -300;
pcisd->data[CISD_DATA_CHG_BATT_TEMP_MIN] = 1000;
pcisd->data[CISD_DATA_CHG_CHG_TEMP_MIN] = 1000;
pcisd->data[CISD_DATA_CHG_WPC_TEMP_MIN] = 1000;
pcisd->data[CISD_DATA_CHG_USB_TEMP_MIN] = 1000;
pcisd->data[CISD_DATA_CHG_BATT_TEMP_MAX_PER_DAY] = -300;
pcisd->data[CISD_DATA_CHG_SUB_BATT_TEMP_MAX_PER_DAY] = -300;
pcisd->data[CISD_DATA_CHG_CHG_TEMP_MAX_PER_DAY] = -300;
pcisd->data[CISD_DATA_CHG_USB_TEMP_MAX_PER_DAY] = -300;
pcisd->data[CISD_DATA_CHG_BATT_TEMP_MIN_PER_DAY] = 1000;
pcisd->data[CISD_DATA_CHG_SUB_BATT_TEMP_MIN_PER_DAY] = 1000;
pcisd->data[CISD_DATA_CHG_CHG_TEMP_MIN_PER_DAY] = 1000;
pcisd->data[CISD_DATA_CHG_USB_TEMP_MIN_PER_DAY] = 1000;
pcisd->data[CISD_DATA_CAP_MIN_PER_DAY] = 0xFFFF;
pcisd->data[CISD_DATA_USB_OVERHEAT_RAPID_CHANGE] = 0;
pcisd->data[CISD_DATA_USB_OVERHEAT_RAPID_CHANGE_PER_DAY] = 0;
pcisd->data[CISD_DATA_USB_OVERHEAT_ALONE] = 0;
/* initialize pad data */
init_cisd_pad_data(&battery->cisd);
/* initialize power data */
init_cisd_power_data(&battery->cisd);
/* initialize pd data */
init_cisd_pd_data(&battery->cisd);
}
}
ret = count;
__pm_stay_awake(battery->monitor_ws);
queue_delayed_work(battery->monitor_wqueue, &battery->monitor_work, 0);
}
break;
case CISD_DATA_JSON:
{
char tc;
struct cisd *pcisd = &battery->cisd;
if (sscanf(buf, "%1c\n", &tc) == 1) {
if (tc == 'c') {
for (i = 0; i < CISD_DATA_MAX; i++)
pcisd->data[i] = 0;
pcisd->data[CISD_DATA_FULL_COUNT] = 1;
pcisd->data[CISD_DATA_BATT_TEMP_MAX] = -300;
pcisd->data[CISD_DATA_CHG_TEMP_MAX] = -300;
pcisd->data[CISD_DATA_WPC_TEMP_MAX] = -300;
pcisd->data[CISD_DATA_USB_TEMP_MAX] = -300;
pcisd->data[CISD_DATA_BATT_TEMP_MIN] = 1000;
pcisd->data[CISD_DATA_CHG_TEMP_MIN] = 1000;
pcisd->data[CISD_DATA_WPC_TEMP_MIN] = 1000;
pcisd->data[CISD_DATA_USB_TEMP_MIN] = 1000;
pcisd->data[CISD_DATA_CAP_MIN] = 0xFFFF;
pcisd->data[CISD_DATA_FULL_COUNT_PER_DAY] = 1;
pcisd->data[CISD_DATA_BATT_TEMP_MAX_PER_DAY] = -300;
pcisd->data[CISD_DATA_SUB_BATT_TEMP_MAX_PER_DAY] = -300;
pcisd->data[CISD_DATA_CHG_TEMP_MAX_PER_DAY] = -300;
pcisd->data[CISD_DATA_USB_TEMP_MAX_PER_DAY] = -300;
pcisd->data[CISD_DATA_BATT_TEMP_MIN_PER_DAY] = 1000;
pcisd->data[CISD_DATA_SUB_BATT_TEMP_MIN_PER_DAY] = 1000;
pcisd->data[CISD_DATA_CHG_TEMP_MIN_PER_DAY] = 1000;
pcisd->data[CISD_DATA_USB_TEMP_MIN_PER_DAY] = 1000;
pcisd->data[CISD_DATA_CHG_BATT_TEMP_MAX] = -300;
pcisd->data[CISD_DATA_CHG_CHG_TEMP_MAX] = -300;
pcisd->data[CISD_DATA_CHG_WPC_TEMP_MAX] = -300;
pcisd->data[CISD_DATA_CHG_USB_TEMP_MAX] = -300;
pcisd->data[CISD_DATA_CHG_BATT_TEMP_MIN] = 1000;
pcisd->data[CISD_DATA_CHG_CHG_TEMP_MIN] = 1000;
pcisd->data[CISD_DATA_CHG_WPC_TEMP_MIN] = 1000;
pcisd->data[CISD_DATA_CHG_USB_TEMP_MIN] = 1000;
pcisd->data[CISD_DATA_CHG_BATT_TEMP_MAX_PER_DAY] = -300;
pcisd->data[CISD_DATA_CHG_SUB_BATT_TEMP_MAX_PER_DAY] = -300;
pcisd->data[CISD_DATA_CHG_CHG_TEMP_MAX_PER_DAY] = -300;
pcisd->data[CISD_DATA_CHG_USB_TEMP_MAX_PER_DAY] = -300;
pcisd->data[CISD_DATA_CHG_BATT_TEMP_MIN_PER_DAY] = 1000;
pcisd->data[CISD_DATA_CHG_SUB_BATT_TEMP_MIN_PER_DAY] = 1000;
pcisd->data[CISD_DATA_CHG_CHG_TEMP_MIN_PER_DAY] = 1000;
pcisd->data[CISD_DATA_CHG_USB_TEMP_MIN_PER_DAY] = 1000;
pcisd->data[CISD_DATA_CAP_MIN_PER_DAY] = 0xFFFF;
pcisd->data[CISD_DATA_USB_OVERHEAT_RAPID_CHANGE] = 0;
pcisd->data[CISD_DATA_USB_OVERHEAT_RAPID_CHANGE_PER_DAY] = 0;
pcisd->data[CISD_DATA_USB_OVERHEAT_ALONE] = 0;
}
}
ret = count;
}
break;
case CISD_DATA_D_JSON:
break;
case CISD_WIRE_COUNT:
if (sscanf(buf, "%10d\n", &x) == 1) {
struct cisd *pcisd = &battery->cisd;
pr_info("%s: Wire Count : %d\n", __func__, x);
pcisd->data[CISD_DATA_WIRE_COUNT] = x;
pcisd->data[CISD_DATA_WIRE_COUNT_PER_DAY]++;
}
ret = count;
break;
case CISD_WC_DATA:
set_cisd_pad_data(battery, buf);
ret = count;
break;
case CISD_WC_DATA_JSON:
break;
case CISD_POWER_DATA:
set_cisd_power_data(battery, buf);
ret = count;
break;
case CISD_POWER_DATA_JSON:
break;
case CISD_PD_DATA:
set_cisd_pd_data(battery, buf);
ret = count;
break;
case CISD_PD_DATA_JSON:
break;
case CISD_CABLE_DATA:
{
struct cisd *pcisd = &battery->cisd;
const char *p = buf;
pr_info("%s: %s\n", __func__, buf);
for (i = CISD_CABLE_TA; i < CISD_CABLE_TYPE_MAX; i++) {
if (sscanf(p, "%10d%n", &pcisd->cable_data[i], &x) > 0) {
p += (size_t)x;
} else {
pr_info("%s: NO DATA (CISD_CABLE_TYPE)\n", __func__);
pcisd->cable_data[i] = 0;
break;
}
}
}
ret = count;
break;
case CISD_CABLE_DATA_JSON:
break;
case CISD_TX_DATA:
{
struct cisd *pcisd = &battery->cisd;
const char *p = buf;
pr_info("%s: %s\n", __func__, buf);
for (i = TX_ON; i < TX_DATA_MAX; i++) {
if (sscanf(p, "%10d%n", &pcisd->tx_data[i], &x) > 0) {
p += (size_t)x;
} else {
pr_info("%s: NO DATA (CISD_TX_DATA)\n", __func__);
pcisd->tx_data[i] = 0;
break;
}
}
}
ret = count;
break;
case CISD_TX_DATA_JSON:
break;
case CISD_EVENT_DATA:
{
struct cisd *pcisd = &battery->cisd;
const char *p = buf;
pr_info("%s: %s\n", __func__, buf);
for (i = EVENT_DC_ERR; i < EVENT_DATA_MAX; i++) {
if (sscanf(p, "%10d%n", &pcisd->event_data[i], &x) > 0) {
p += (size_t)x;
} else {
pr_info("%s: NO DATA (CISD_EVENT_DATA)\n", __func__);
pcisd->event_data[i] = 0;
break;
}
}
}
ret = count;
break;
case CISD_EVENT_DATA_JSON:
break;
case PREV_BATTERY_DATA:
if (sscanf(buf, "%10d, %10d, %10d, %10d\n",
&battery->prev_volt, &battery->prev_temp,
&battery->prev_jig_on, &battery->prev_chg_on) >= 4) {
pr_info("%s: prev voltage : %d, prev_temp : %d, prev_jig_on : %d, prev_chg_on : %d\n",
__func__, battery->prev_volt, battery->prev_temp,
battery->prev_jig_on, battery->prev_chg_on);
if (battery->prev_volt >= 3700 && battery->prev_temp >= 150 &&
!battery->prev_jig_on && battery->fg_reset)
pr_info("%s: Battery have been Removed\n", __func__);
ret = count;
}
battery->enable_update_data = 1;
break;
case PREV_BATTERY_INFO:
break;
#endif
case SAFETY_TIMER_SET:
if (sscanf(buf, "%10d\n", &x) == 1) {
if (x) {
battery->safety_timer_set = true;
} else {
battery->safety_timer_set = false;
}
ret = count;
}
break;
case BATT_SWELLING_CONTROL:
if (sscanf(buf, "%10d\n", &x) == 1) {
if (x) {
pr_info("%s : 15TEST START!! SWELLING MODE DISABLE\n", __func__);
battery->skip_swelling = true;
} else {
pr_info("%s : 15TEST END!! SWELLING MODE END\n", __func__);
battery->skip_swelling = false;
}
ret = count;
}
break;
case BATT_BATTERY_ID:
#if IS_ENABLED(CONFIG_DUAL_BATTERY)
case BATT_SUB_BATTERY_ID:
#endif
break;
case BATT_TEMP_CONTROL_TEST:
if (sscanf(buf, "%10d\n", &x) == 1) {
if (x)
sec_bat_set_temp_control_test(battery, true);
else
sec_bat_set_temp_control_test(battery, false);
ret = count;
}
break;
case SAFETY_TIMER_INFO:
break;
case BATT_SHIPMODE_TEST:
if (sscanf(buf, "%10d\n", &x) == 1) {
pr_info("%s ship mode test %d\n", __func__, x);
value.intval = x;
psy_do_property(battery->pdata->charger_name, set,
POWER_SUPPLY_EXT_PROP_SHIPMODE_TEST, value);
ret = count;
}
break;
case BATT_MISC_TEST:
if (sscanf(buf, "%10d\n", &x) == 1) {
pr_info("%s batt_misc_test %d\n", __func__, x);
switch (x) {
case MISC_TEST_RESET:
pr_info("%s RESET MISC_TEST command\n", __func__);
battery->display_test = false;
battery->store_mode = false;
battery->skip_swelling = false;
battery->pdata->bat_thm_info.check_type = SEC_BATTERY_TEMP_CHECK_TEMP;
battery->pdata->usb_thm_info.check_type = SEC_BATTERY_TEMP_CHECK_TEMP;
battery->pdata->chg_thm_info.check_type = SEC_BATTERY_TEMP_CHECK_TEMP;
battery->pdata->wpc_thm_info.check_type = SEC_BATTERY_TEMP_CHECK_TEMP;
battery->pdata->sub_bat_thm_info.check_type = SEC_BATTERY_TEMP_CHECK_TEMP;
battery->pdata->blk_thm_info.check_type = SEC_BATTERY_TEMP_CHECK_TEMP;
#if IS_ENABLED(CONFIG_DIRECT_CHARGING)
battery->pdata->dchg_thm_info.check_type = SEC_BATTERY_TEMP_CHECK_TEMP;
#endif
break;
case MISC_TEST_DISPLAY:
pr_info("%s START DISPLAY_TEST command\n", __func__);
battery->display_test = true; /* block for display test */
battery->store_mode = true; /* enter store mode for prevent 100% full charge */
battery->skip_swelling = true; /* restore thermal_zone to NORMAL */
battery->pdata->bat_thm_info.check_type = SEC_BATTERY_TEMP_CHECK_NONE;
battery->pdata->usb_thm_info.check_type = SEC_BATTERY_TEMP_CHECK_NONE;
battery->pdata->chg_thm_info.check_type = SEC_BATTERY_TEMP_CHECK_NONE;
battery->pdata->wpc_thm_info.check_type = SEC_BATTERY_TEMP_CHECK_NONE;
battery->pdata->sub_bat_thm_info.check_type = SEC_BATTERY_TEMP_CHECK_NONE;
battery->pdata->blk_thm_info.check_type = SEC_BATTERY_TEMP_CHECK_NONE;
#if IS_ENABLED(CONFIG_DIRECT_CHARGING)
battery->pdata->dchg_thm_info.check_type = SEC_BATTERY_TEMP_CHECK_NONE;
#endif
break;
case MISC_TEST_EPT_UNKNOWN:
#if defined(CONFIG_SEC_FACTORY) && IS_ENABLED(CONFIG_WIRELESS_CHARGING)
pr_info("%s START EPT_UNKNOWN command\n", __func__);
value.intval = 1;
psy_do_property(battery->pdata->wireless_charger_name, set,
POWER_SUPPLY_EXT_PROP_WC_EPT_UNKNOWN, value);
#else
pr_info("%s not support EPT_UNKNOWN command\n", __func__);
#endif
break;
case MISC_TEST_MAX:
default:
pr_info("%s Wrong MISC_TEST command\n", __func__);
break;
}
ret = count;
}
break;
case BATT_TEMP_TEST:
{
char tc;
if (sscanf(buf, "%c %10d\n", &tc, &x) == 2) {
pr_info("%s : temperature t: %c, temp: %d\n", __func__, tc, x);
if (tc == 'u') {
if (x > 900)
battery->pdata->usb_thm_info.check_type = 0;
else
battery->pdata->usb_thm_info.test = x;
} else if (tc == 'w') {
if (x > 900)
battery->pdata->wpc_thm_info.check_type = 0;
else
battery->pdata->wpc_thm_info.test = x;
} else if (tc == 'b') {
if (x > 900)
battery->pdata->bat_thm_info.check_type = 0;
else
battery->pdata->bat_thm_info.test = x;
} else if (tc == 'c') {
if (x > 900)
battery->pdata->chg_thm_info.check_type = 0;
else
battery->pdata->chg_thm_info.test = x;
} else if (tc == 's') {
if (x > 900)
battery->pdata->sub_bat_thm_info.check_type = 0;
else
battery->pdata->sub_bat_thm_info.test = x;
#if IS_ENABLED(CONFIG_DIRECT_CHARGING)
} else if (tc == 'd') {
if (x > 900)
battery->pdata->dchg_thm_info.check_type = 0;
else
battery->pdata->dchg_thm_info.test = x;
#endif
} else if (tc == 'k') {
battery->pdata->blk_thm_info.test = x;
} else if (tc == 'r') {
battery->lrp_test = x;
battery->lrp = x;
}
ret = count;
}
break;
}
case BATT_CURRENT_EVENT:
break;
case BATT_JIG_GPIO:
break;
case CC_INFO:
break;
#if defined(CONFIG_WIRELESS_AUTH)
case WC_AUTH_ADT_SENT:
break;
#endif
#if IS_ENABLED(CONFIG_DUAL_BATTERY)
case BATT_MAIN_VOLTAGE:
case BATT_SUB_VOLTAGE:
case BATT_MAIN_CURRENT_MA:
case BATT_SUB_CURRENT_MA:
case BATT_MAIN_CON_DET:
case BATT_SUB_CON_DET:
break;
#if IS_ENABLED(CONFIG_LIMITER_S2ASL01)
case BATT_MAIN_ENB: /* Can control This pin with 523k jig only, high active pin because it is reversed */
if (sscanf(buf, "%10d\n", &x) == 1) {
if (battery->pdata->main_bat_enb_gpio) {
pr_info("%s main battery enb = %d\n", __func__, x);
if (x == 0) {
union power_supply_propval value = {0, };
/* activate main limiter */
gpio_direction_output(battery->pdata->main_bat_enb_gpio, 1);
msleep(100);
value.intval = 1;
psy_do_property(battery->pdata->main_limiter_name, set,
POWER_SUPPLY_EXT_PROP_POWERMETER_ENABLE, value);
} else if (x == 1) {
/* deactivate main limiter */
gpio_direction_output(battery->pdata->main_bat_enb_gpio, 0);
}
pr_info("%s main enb = %d, main enb2 = %d, sub enb = %d\n",
__func__,
gpio_get_value(battery->pdata->main_bat_enb_gpio),
gpio_get_value(battery->pdata->main_bat_enb2_gpio),
gpio_get_value(battery->pdata->sub_bat_enb_gpio));
}
ret = count;
}
break;
case BATT_MAIN_ENB2: /* Low active pin */
if (sscanf(buf, "%10d\n", &x) == 1) {
if (battery->pdata->main_bat_enb2_gpio) {
pr_info("%s main battery enb2 = %d\n", __func__, x);
if (x == 0) {
union power_supply_propval value = {0, };
/* activate main limiter */
gpio_direction_output(battery->pdata->main_bat_enb2_gpio, 0);
msleep(100);
value.intval = 1;
psy_do_property(battery->pdata->main_limiter_name, set,
POWER_SUPPLY_EXT_PROP_POWERMETER_ENABLE, value);
} else if (x == 1) {
/* deactivate main limiter */
gpio_direction_output(battery->pdata->main_bat_enb2_gpio, 1);
}
pr_info("%s main enb = %d, main enb2 = %d, sub enb = %d\n",
__func__,
gpio_get_value(battery->pdata->main_bat_enb_gpio),
gpio_get_value(battery->pdata->main_bat_enb2_gpio),
gpio_get_value(battery->pdata->sub_bat_enb_gpio));
}
ret = count;
}
break;
case BATT_SUB_ENB: /* Low active pin */
if (sscanf(buf, "%10d\n", &x) == 1) {
if (battery->pdata->sub_bat_enb_gpio) {
pr_info("%s sub battery enb = %d\n", __func__, x);
if (x == 0) {
union power_supply_propval value = {0, };
/* activate sub limiter */
gpio_direction_output(battery->pdata->sub_bat_enb_gpio, 0);
msleep(100);
value.intval = 1;
psy_do_property(battery->pdata->sub_limiter_name, set,
POWER_SUPPLY_EXT_PROP_POWERMETER_ENABLE, value);
} else if (x == 1) {
/* deactivate sub limiter */
gpio_direction_output(battery->pdata->sub_bat_enb_gpio, 1);
}
pr_info("%s main enb = %d, sub enb = %d\n",
__func__,
gpio_get_value(battery->pdata->main_bat_enb_gpio),
gpio_get_value(battery->pdata->sub_bat_enb_gpio));
}
ret = count;
}
break;
case BATT_SUB_PWR_MODE2:
if (sscanf(buf, "%10d\n", &x) == 1) {
union power_supply_propval value = {0, };
pr_info("%s sub pwr mode2 = %d\n", __func__, x);
if (x == 0) {
value.intval = 0;
psy_do_property(battery->pdata->sub_limiter_name, set,
POWER_SUPPLY_EXT_PROP_POWER_MODE2, value);
} else if (x == 1) {
value.intval = 1;
psy_do_property(battery->pdata->sub_limiter_name, set,
POWER_SUPPLY_EXT_PROP_POWER_MODE2, value);
}
ret = count;
}
break;
#endif
case BATT_MAIN_SHIPMODE:
if (sscanf(buf, "%10d\n", &x) == 1)
if (battery->pdata->sub_bat_enb_gpio) {
pr_info("%s main shipmode = %d\n", __func__, x);
ret = count;
}
break;
case BATT_SUB_SHIPMODE:
if (sscanf(buf, "%10d\n", &x) == 1) {
pr_info("%s sub shipmode = %d\n", __func__, x);
ret = count;
}
break;
#endif
case EXT_EVENT:
if (sscanf(buf, "%10d\n", &x) == 1) {
pr_info("%s: ext event 0x%x\n", __func__, x);
battery->ext_event = x;
__pm_stay_awake(battery->ext_event_ws);
queue_delayed_work(battery->monitor_wqueue, &battery->ext_event_work, 0);
ret = count;
}
break;
#if IS_ENABLED(CONFIG_DIRECT_CHARGING)
case DIRECT_CHARGING_STATUS:
break;
case DIRECT_CHARGING_STEP:
break;
case DIRECT_CHARGING_IIN:
break;
case DIRECT_CHARGING_CHG_STATUS:
break;
case SWITCH_CHARGING_SOURCE:
if (sscanf(buf, "%10d\n", &x) == 1) {
if (is_pd_apdo_wire_type(battery->cable_type)) {
dev_info(battery->dev, "%s: Request Change Charging Source : %s\n",
__func__, x == 0 ? "Switch Charger" : "Direct Charger");
direct_charging_source_status[0] = SEC_TEST_MODE;
direct_charging_source_status[1] =
(x == 0) ? SEC_CHARGING_SOURCE_SWITCHING : SEC_CHARGING_SOURCE_DIRECT;
if (battery->current_event & SEC_BAT_CURRENT_EVENT_HIGH_TEMP_SWELLING) {
direct_charging_source_status[1] = SEC_CHARGING_SOURCE_SWITCHING;
pr_info("%s : Change Charging Source to S/C because of Swelling\n", __func__);
}
value.strval = direct_charging_source_status;
psy_do_property(battery->pdata->charger_name, set,
POWER_SUPPLY_EXT_PROP_CHANGE_CHARGING_SOURCE, value);
}
ret = count;
}
break;
#endif
case CHARGING_TYPE:
break;
case BATT_FACTORY_MODE:
#if IS_ENABLED(CONFIG_USB_FACTORY_MODE)
if (sscanf(buf, "%10d\n", &x) == 1) {
value.intval = x;
battery->usb_factory_mode = value.intval;
battery->usb_factory_init = true;
psy_do_property(battery->pdata->charger_name, set,
POWER_SUPPLY_EXT_PROP_BATT_F_MODE, value);
ret = count;
}
#endif
break;
case BOOT_COMPLETED:
if (sscanf(buf, "%10d\n", &x) == 1) {
dev_info(battery->dev,
"%s: boot completed(%d)\n", __func__, x);
#if defined(CONFIG_WIRELESS_IC_PARAM)
value.intval = x;
psy_do_property(battery->pdata->wireless_charger_name, set,
POWER_SUPPLY_EXT_PROP_BOOT_COMPLETE, value);
psy_do_property(battery->pdata->wireless_charger_name, set,
POWER_SUPPLY_EXT_PROP_WIRELESS_PARAM_INFO, value);
#endif
ret = count;
}
break;
case PD_DISABLE:
if (sscanf(buf, "%10d\n", &x) == 1) {
pr_info("%s: PD wired charging mode is %s\n",
__func__, ((x == 1) ? "disabled" : "enabled"));
if (x == 1) {
battery->pd_disable = true;
sec_bat_set_current_event(battery,
SEC_BAT_CURRENT_EVENT_HV_DISABLE, SEC_BAT_CURRENT_EVENT_HV_DISABLE);
if (is_pd_wire_type(battery->cable_type)) {
battery->update_pd_list = true;
pr_info("%s: update pd list\n", __func__);
#if IS_ENABLED(CONFIG_DIRECT_CHARGING)
if (is_pd_apdo_wire_type(battery->cable_type))
psy_do_property(battery->pdata->charger_name, set,
POWER_SUPPLY_EXT_PROP_REFRESH_CHARGING_SOURCE, value);
#endif
sec_vote_refresh(battery->iv_vote);
}
} else {
battery->pd_disable = false;
sec_bat_set_current_event(battery,
0, SEC_BAT_CURRENT_EVENT_HV_DISABLE);
if (is_pd_wire_type(battery->cable_type)) {
battery->update_pd_list = true;
pr_info("%s: update pd list\n", __func__);
#if IS_ENABLED(CONFIG_DIRECT_CHARGING)
if (is_pd_apdo_wire_type(battery->cable_type))
psy_do_property(battery->pdata->charger_name, set,
POWER_SUPPLY_EXT_PROP_REFRESH_CHARGING_SOURCE, value);
#endif
sec_vote_refresh(battery->iv_vote);
}
}
ret = count;
}
break;
case FACTORY_MODE_RELIEVE:
if (sscanf(buf, "%10d\n", &x) == 1) {
value.intval = x;
psy_do_property(battery->pdata->charger_name, set,
POWER_SUPPLY_EXT_PROP_INPUT_VOLTAGE_REGULATION, value);
ret = count;
}
break;
case FACTORY_MODE_BYPASS:
pr_info("%s: factory mode bypass\n", __func__);
if (sscanf(buf, "%10d\n", &x) == 1) {
value.intval = x;
psy_do_property(battery->pdata->charger_name, set,
POWER_SUPPLY_PROP_AUTHENTIC, value);
ret = count;
}
break;
case NORMAL_MODE_BYPASS:
pr_info("%s: normal mode bypass for current measure\n", __func__);
if (sscanf(buf, "%10d\n", &x) == 1) {
// if (battery->pdata->detect_moisture && x) {
// sec_bat_set_charging_status(battery, POWER_SUPPLY_STATUS_DISCHARGING);
// sec_bat_set_charge(battery, SEC_BAT_CHG_MODE_BUCK_OFF);
// }
value.intval = x;
psy_do_property(battery->pdata->charger_name, set,
POWER_SUPPLY_EXT_PROP_CURRENT_MEASURE, value);
ret = count;
}
break;
case FACTORY_VOLTAGE_REGULATION:
{
sscanf(buf, "%10d\n", &x);
value.intval = x;
psy_do_property(battery->pdata->charger_name, set,
POWER_SUPPLY_EXT_PROP_FACTORY_VOLTAGE_REGULATION, value);
value.intval =
SEC_FUELGAUGE_CAPACITY_TYPE_RESET;
psy_do_property(battery->pdata->fuelgauge_name, set,
POWER_SUPPLY_PROP_CAPACITY, value);
dev_info(battery->dev,"do reset SOC\n");
/* update battery info */
sec_bat_get_battery_info(battery);
}
ret = count;
break;
case FACTORY_MODE_DISABLE:
if (sscanf(buf, "%10d\n", &x) == 1) {
value.intval = x;
psy_do_property(battery->pdata->charger_name, set,
POWER_SUPPLY_EXT_PROP_DISABLE_FACTORY_MODE, value);
ret = count;
}
break;
case USB_CONF:
if (sscanf(buf, "%10d\n", &x) == 1) {
value.intval = x;
psy_do_property("battery", set,
POWER_SUPPLY_EXT_PROP_USB_CONFIGURE, value);
ret = count;
}
break;
case CHARGE_OTG_CONTROL:
if (sscanf(buf, "%10d\n", &x) == 1) {
value.intval = x;
psy_do_property("battery", set,
POWER_SUPPLY_EXT_PROP_CHARGE_OTG_CONTROL, value);
ret = count;
}
break;
case CHARGE_UNO_CONTROL:
if (sscanf(buf, "%10d\n", &x) == 1) {
if (x && (is_hv_wire_type(battery->cable_type) ||
is_hv_pdo_wire_type(battery->cable_type, battery->hv_pdo))) {
pr_info("%s: Skip uno control during HV wired charging\n", __func__);
break;
}
value.intval = x;
psy_do_property("battery", set,
POWER_SUPPLY_EXT_PROP_CHARGE_UNO_CONTROL, value);
ret = count;
}
break;
case CHARGE_COUNTER_SHADOW:
break;
case VOTER_STATUS:
break;
#if defined(CONFIG_WIRELESS_IC_PARAM)
case WC_PARAM_INFO:
break;
#endif
case LRP:
if (sscanf(buf, "%10d\n", &x) == 1) {
dev_info(battery->dev, "%s: LRP(%d)\n", __func__, x);
if ((x >= -200 && x <= 900) && (battery->lrp_test == 0))
battery->lrp = x;
ret = count;
}
break;
case HP_D2D:
if (sscanf(buf, "%10d\n", &x) == 1) {
dev_info(battery->dev, "%s: set high power d2d(%d)\n", __func__, x);
battery->hp_d2d = x;
ret = count;
}
break;
case BATT_FULL_CAPACITY:
if (sscanf(buf, "%10d\n", &x) == 1) {
if (x >= 0 && x <= 100) {
pr_info("%s: update BATT_FULL_CAPACITY(%d)\n", __func__, x);
battery->batt_full_capacity = x;
__pm_stay_awake(battery->monitor_ws);
queue_delayed_work(battery->monitor_wqueue,
&battery->monitor_work, 0);
} else {
pr_info("%s: out of range(%d)\n", __func__, x);
}
ret = count;
}
break;
case DC_RB_EN:
if (sscanf(buf, "%10d\n", &x) == 1) {
value.intval = x;
pr_info("%s: en reverse boost(%d)\n", __func__, value.intval);
psy_do_property("battery", set,
POWER_SUPPLY_EXT_PROP_CHARGE_OTG_CONTROL, value);
ret = count;
}
break;
case DC_OP_MODE:
if (sscanf(buf, "%10d\n", &x) == 1) {
value.intval = x;
pr_info("%s: en dc op mode(%d)\n", __func__, value.intval);
psy_do_property(battery->pdata->charger_name, set,
POWER_SUPPLY_EXT_PROP_DC_OP_MODE, value);
ret = count;
}
break;
case DC_ADC_MODE:
if (sscanf(buf, "%10d\n", &x) == 1) {
value.intval = x;
pr_info("%s: en adc mode(%d)\n", __func__, value.intval);
psy_do_property(battery->pdata->charger_name, set,
POWER_SUPPLY_EXT_PROP_ADC_MODE, value);
ret = count;
}
break;
case DC_VBUS:
break;
case CHG_TYPE:
break;
case MST_EN:
if (sscanf(buf, "%10d\n", &x) == 1) {
value.intval = x;
pr_info("%s: mst en(%d)\n", __func__, value.intval);
psy_do_property("battery", set,
POWER_SUPPLY_EXT_PROP_MST_EN, value);
ret = count;
}
break;
case SPSN_TEST:
break;
case CHG_SOC_LIM:
{
#if defined(CONFIG_SEC_FACTORY)
int y = 0;
if (sscanf(buf, "%10d %10d\n", &x, &y) == 2) {
if (x >= y) {
pr_info("%s: min SOC (%d) higher/equal to max SOC (%d)\n",
__func__, x, y);
} else if (x >= 0 && y >= 0 && x <= 100 && y <= 100) {
battery->pdata->store_mode_charging_min = x;
battery->pdata->store_mode_charging_max = y;
} else {
pr_info("%s: Invalid min/max SOC (%d/%d)\n", __func__, x, y);
}
ret = count;
}
#endif
break;
}
default:
ret = -EINVAL;
break;
}
return ret;
}
int sec_bat_create_attrs(struct device *dev)
{
unsigned long i = 0;
int rc = 0;
for (i = 0; i < ARRAY_SIZE(sec_battery_attrs); i++) {
rc = device_create_file(dev, &sec_battery_attrs[i]);
if (rc)
goto create_attrs_failed;
}
goto create_attrs_succeed;
create_attrs_failed:
while (i--)
device_remove_file(dev, &sec_battery_attrs[i]);
create_attrs_succeed:
return rc;
}
EXPORT_SYMBOL(sec_bat_create_attrs);
ssize_t sec_pogo_show_attrs(struct device *dev,
struct device_attribute *attr, char *buf)
{
const ptrdiff_t offset = attr - sec_pogo_attrs;
int i = 0;
switch (offset) {
case POGO_SEC_TYPE:
i += scnprintf(buf + i, PAGE_SIZE - i, "POGO\n");
break;
default:
i = -EINVAL;
break;
}
return i;
}
int sec_pogo_create_attrs(struct device *dev)
{
unsigned long i = 0;
int rc = 0;
for (i = 0; i < ARRAY_SIZE(sec_pogo_attrs); i++) {
rc = device_create_file(dev, &sec_pogo_attrs[i]);
if (rc)
goto create_attrs_failed;
}
goto create_attrs_succeed;
create_attrs_failed:
while (i--)
device_remove_file(dev, &sec_pogo_attrs[i]);
create_attrs_succeed:
return rc;
}
EXPORT_SYMBOL(sec_pogo_create_attrs);
ssize_t sec_otg_show_attrs(struct device *dev,
struct device_attribute *attr, char *buf)
{
const ptrdiff_t offset = attr - sec_otg_attrs;
int i = 0;
switch (offset) {
case OTG_SEC_TYPE:
i += scnprintf(buf + i, PAGE_SIZE - i, "OTG\n");
break;
default:
i = -EINVAL;
break;
}
return i;
}
int sec_otg_create_attrs(struct device *dev)
{
unsigned long i = 0;
int rc = 0;
for (i = 0; i < ARRAY_SIZE(sec_otg_attrs); i++) {
rc = device_create_file(dev, &sec_otg_attrs[i]);
if (rc)
goto create_attrs_failed;
}
goto create_attrs_succeed;
create_attrs_failed:
while (i--)
device_remove_file(dev, &sec_otg_attrs[i]);
create_attrs_succeed:
return rc;
}
EXPORT_SYMBOL(sec_otg_create_attrs);