/* SPDX-License-Identifier: GPL-2.0 */ /* * Copyright (c) 2019 MediaTek Inc. * Author Wy Chuang */ #ifndef __MTK_BATTERY_INTF_H__ #define __MTK_BATTERY_INTF_H__ #include #include #include #include #include #include #include #include "mtk_gauge.h" #define NETLINK_FGD 26 #define UNIT_TRANS_10 10 #define UNIT_TRANS_100 100 #define UNIT_TRANS_1000 1000 #define UNIT_TRANS_60 60 #define MAX_TABLE 10 #define BMLOG_ERROR_LEVEL 3 #define BMLOG_WARNING_LEVEL 4 #define BMLOG_NOTICE_LEVEL 5 #define BMLOG_INFO_LEVEL 6 #define BMLOG_DEBUG_LEVEL 7 #define BMLOG_TRACE_LEVEL 8 #define BMLOG_DEFAULT_LEVEL BMLOG_DEBUG_LEVEL #define bm_err(fmt, args...) \ do {\ if (bat_get_debug_level() >= BMLOG_ERROR_LEVEL) {\ pr_notice(fmt, ##args); \ } \ } while (0) #define bm_warn(fmt, args...) \ do {\ if (bat_get_debug_level() >= BMLOG_WARNING_LEVEL) {\ pr_notice(fmt, ##args); \ } \ } while (0) #define bm_notice(fmt, args...) \ do {\ if (bat_get_debug_level() >= BMLOG_NOTICE_LEVEL) {\ pr_notice(fmt, ##args); \ } \ } while (0) #define bm_info(fmt, args...) \ do {\ if (bat_get_debug_level() >= BMLOG_INFO_LEVEL) {\ pr_notice(fmt, ##args); \ } \ } while (0) #define bm_debug(fmt, args...) \ do {\ if (bat_get_debug_level() >= BMLOG_DEBUG_LEVEL) {\ pr_notice(fmt, ##args); \ } \ } while (0) #define bm_trace(fmt, args...)\ do {\ if (bat_get_debug_level() >= BMLOG_TRACE_LEVEL) {\ pr_notice(fmt, ##args);\ } \ } while (0) #define BAT_SYSFS_FIELD_RW(_name, _prop) \ { \ .attr = __ATTR(_name, 0644, bat_sysfs_show, bat_sysfs_store),\ .prop = _prop, \ .set = _name##_set, \ .get = _name##_get, \ } #define BAT_SYSFS_FIELD_RO(_name, _prop) \ { \ .attr = __ATTR(_name, 0444, bat_sysfs_show, bat_sysfs_store),\ .prop = _prop, \ .get = _name##_get, \ } #define BAT_SYSFS_FIELD_WO(_name, _prop) \ { \ .attr = __ATTR(_name, 0200, bat_sysfs_show, bat_sysfs_store),\ .prop = _prop, \ .set = _name##_set, \ } enum battery_property { BAT_PROP_TEMPERATURE, BAT_PROP_COULOMB_INT_GAP, BAT_PROP_UISOC_HT_INT_GAP, BAT_PROP_UISOC_LT_INT_GAP, BAT_PROP_ENABLE_UISOC_HT_INT, BAT_PROP_ENABLE_UISOC_LT_INT, BAT_PROP_UISOC, BAT_PROP_DISABLE, BAT_PROP_INIT_DONE, BAT_PROP_FG_RESET, BAT_PROP_LOG_LEVEL, }; struct battery_data { struct power_supply_desc psd; struct power_supply_config psy_cfg; struct power_supply *psy; struct power_supply *chg_psy; struct notifier_block battery_nb; int bat_status; int bat_health; int bat_present; int bat_technology; int bat_capacity; /* Add for Battery Service */ int bat_batt_vol; int bat_batt_temp; }; enum fg_daemon_cmds { FG_DAEMON_CMD_PRINT_LOG, FG_DAEMON_CMD_SET_DAEMON_PID, FG_DAEMON_CMD_GET_CUSTOM_SETTING, FG_DAEMON_CMD_GET_CUSTOM_TABLE, FG_DAEMON_CMD_SEND_CUSTOM_TABLE, FG_DAEMON_CMD_IS_BAT_EXIST, FG_DAEMON_CMD_GET_INIT_FLAG, FG_DAEMON_CMD_SET_INIT_FLAG, FG_DAEMON_CMD_NOTIFY_DAEMON, FG_DAEMON_CMD_CHECK_FG_DAEMON_VERSION, FG_DAEMON_CMD_FGADC_RESET, FG_DAEMON_CMD_GET_TEMPERTURE, FG_DAEMON_CMD_GET_RAC, FG_DAEMON_CMD_GET_PTIM_VBAT, FG_DAEMON_CMD_GET_PTIM_I, FG_DAEMON_CMD_IS_CHARGER_EXIST, FG_DAEMON_CMD_GET_HW_OCV, FG_DAEMON_CMD_GET_FG_HW_CAR, FG_DAEMON_CMD_SET_FG_BAT_INT1_GAP, FG_DAEMON_CMD_SET_FG_BAT_TMP_GAP, FG_DAEMON_CMD_SET_FG_BAT_INT2_HT_GAP, FG_DAEMON_CMD_ENABLE_FG_BAT_INT2_HT, FG_DAEMON_CMD_SET_FG_BAT_INT2_LT_GAP, FG_DAEMON_CMD_ENABLE_FG_BAT_INT2_LT, FG_DAEMON_CMD_IS_BAT_PLUGOUT, FG_DAEMON_CMD_IS_BAT_CHARGING, FG_DAEMON_CMD_GET_CHARGER_STATUS, FG_DAEMON_CMD_SET_SW_OCV, FG_DAEMON_CMD_GET_SHUTDOWN_DURATION_TIME, FG_DAEMON_CMD_GET_BAT_PLUG_OUT_TIME, FG_DAEMON_CMD_GET_IS_FG_INITIALIZED, FG_DAEMON_CMD_SET_IS_FG_INITIALIZED, FG_DAEMON_CMD_SET_FG_RESET_RTC_STATUS, FG_DAEMON_CMD_IS_HWOCV_UNRELIABLE, FG_DAEMON_CMD_GET_FG_CURRENT_AVG, FG_DAEMON_CMD_SET_FG_TIME, FG_DAEMON_CMD_GET_FG_TIME, FG_DAEMON_CMD_GET_ZCV, FG_DAEMON_CMD_GET_FG_SW_CAR_NAFG_CNT, FG_DAEMON_CMD_GET_FG_SW_CAR_NAFG_DLTV, FG_DAEMON_CMD_GET_FG_SW_CAR_NAFG_C_DLTV, FG_DAEMON_CMD_SET_NAG_ZCV, FG_DAEMON_CMD_SET_NAG_ZCV_EN, FG_DAEMON_CMD_SET_NAG_C_DLTV, FG_DAEMON_CMD_SET_ZCV_INTR, FG_DAEMON_CMD_SET_FG_QUSE, FG_DAEMON_CMD_SET_FG_RESISTANCE,/*remove*/ FG_DAEMON_CMD_SET_FG_DC_RATIO, FG_DAEMON_CMD_SET_BATTERY_CYCLE_THRESHOLD, FG_DAEMON_CMD_SOFF_RESET, FG_DAEMON_CMD_NCAR_RESET, FG_DAEMON_CMD_GET_IMIX, FG_DAEMON_CMD_GET_AGING_FACTOR_CUST, FG_DAEMON_CMD_GET_D0_C_SOC_CUST, FG_DAEMON_CMD_GET_D0_V_SOC_CUST, FG_DAEMON_CMD_GET_UISOC_CUST, FG_DAEMON_CMD_IS_KPOC, FG_DAEMON_CMD_GET_NAFG_VBAT, FG_DAEMON_CMD_GET_HW_INFO, FG_DAEMON_CMD_SET_KERNEL_SOC, FG_DAEMON_CMD_SET_KERNEL_UISOC, FG_DAEMON_CMD_SET_KERNEL_INIT_VBAT, FG_DAEMON_CMD_SET_BAT_PLUGOUT_INTR, FG_DAEMON_CMD_SET_IAVG_INTR, FG_DAEMON_CMD_SET_FG_SHUTDOWN_COND, FG_DAEMON_CMD_GET_FG_SHUTDOWN_COND, FG_DAEMON_CMD_ENABLE_FG_VBAT_L_INT, FG_DAEMON_CMD_ENABLE_FG_VBAT_H_INT, FG_DAEMON_CMD_SET_FG_VBAT_L_TH, FG_DAEMON_CMD_SET_FG_VBAT_H_TH, FG_DAEMON_CMD_SET_CAR_TUNE_VALUE, FG_DAEMON_CMD_GET_FG_CURRENT_IAVG_VALID, FG_DAEMON_CMD_GET_RTC_UI_SOC, FG_DAEMON_CMD_SET_RTC_UI_SOC, FG_DAEMON_CMD_GET_CON0_SOC, FG_DAEMON_CMD_SET_CON0_SOC, FG_DAEMON_CMD_GET_NVRAM_FAIL_STATUS, FG_DAEMON_CMD_SET_NVRAM_FAIL_STATUS, FG_DAEMON_CMD_SET_FG_BAT_TMP_C_GAP, FG_DAEMON_CMD_IS_BATTERY_CYCLE_RESET, FG_DAEMON_CMD_GET_RTC_TWO_SEC_REBOOT, FG_DAEMON_CMD_GET_RTC_INVALID, FG_DAEMON_CMD_GET_VBAT, FG_DAEMON_CMD_GET_DISABLE_NAFG, FG_DAEMON_CMD_DUMP_LOG, FG_DAEMON_CMD_GET_SHUTDOWN_CAR, FG_DAEMON_CMD_GET_NCAR, FG_DAEMON_CMD_GET_CURR_1, FG_DAEMON_CMD_GET_CURR_2, FG_DAEMON_CMD_GET_REFRESH, FG_DAEMON_CMD_GET_IS_AGING_RESET, FG_DAEMON_CMD_SET_SOC, FG_DAEMON_CMD_SET_C_D0_SOC, FG_DAEMON_CMD_SET_V_D0_SOC, FG_DAEMON_CMD_SET_C_SOC, FG_DAEMON_CMD_SET_V_SOC, FG_DAEMON_CMD_SET_QMAX_T_AGING, FG_DAEMON_CMD_SET_SAVED_CAR, FG_DAEMON_CMD_SET_AGING_FACTOR, FG_DAEMON_CMD_SET_QMAX, FG_DAEMON_CMD_SET_BAT_CYCLES, FG_DAEMON_CMD_SET_NCAR, FG_DAEMON_CMD_SET_OCV_MAH, FG_DAEMON_CMD_SET_OCV_VTEMP, FG_DAEMON_CMD_SET_OCV_SOC, FG_DAEMON_CMD_SET_CON0_SOFF_VALID, FG_DAEMON_CMD_SET_AGING_INFO, FG_DAEMON_CMD_GET_SOC_DECIMAL_RATE, FG_DAEMON_CMD_GET_DIFF_SOC_SET, FG_DAEMON_CMD_SET_ZCV_INTR_EN, FG_DAEMON_CMD_GET_IS_FORCE_FULL, FG_DAEMON_CMD_FROM_USER_NUMBER }; //must sync to kernel: (battery_meter.c) FG_DAEMON_CTRL_CMD_FROM_USER /* kernel cmd */ enum Fg_kernel_cmds { FG_KERNEL_CMD_NO_ACTION, FG_KERNEL_CMD_DUMP_REGULAR_LOG, FG_KERNEL_CMD_DISABLE_NAFG, FG_KERNEL_CMD_DUMP_LOG, FG_KERNEL_CMD_UISOC_UPDATE_TYPE, FG_KERNEL_CMD_CHANG_LOGLEVEL, FG_KERNEL_CMD_REQ_ALGO_DATA, FG_KERNEL_CMD_RESET_AGING_FACTOR, FG_KERNEL_CMD_BUILD_SEL_BATTEMP, FG_KERNEL_CMD_UPDATE_AVG_BATTEMP, FG_KERNEL_CMD_SAVE_DEBUG_PARAM, FG_KERNEL_CMD_REQ_CHANGE_AGING_DATA, FG_KERNEL_CMD_AG_LOG_TEST, FG_KERNEL_CMD_CHG_DECIMAL_RATE, FG_KERNEL_CMD_FROM_USER_NUMBER }; enum { NORMAL = 0, OVERHEAT, SOC_ZERO_PERCENT, UISOC_ONE_PERCENT, LOW_BAT_VOLT, DLPT_SHUTDOWN, SHUTDOWN_FACTOR_MAX }; enum gauge_event { EVT_INT_CHR_FULL, EVT_INT_ZCV, EVT_INT_BAT_CYCLE, EVT_INT_IAVG, EVT_INT_BAT_PLUGOUT, EVT_INT_NAFG, EVT_INT_BAT_INT1_HT, EVT_INT_BAT_INT1_LT, EVT_INT_BAT_INT2_HT, EVT_INT_BAT_INT2_LT, EVT_INT_VBAT_L, EVT_INT_VBAT_H, EVT_INT_NAFG_CHECK, EVB_PERIODIC_CHECK, GAUGE_EVT_MAX }; struct fuelgauge_profile_struct { unsigned int mah; unsigned short voltage; unsigned short resistance; /* Ohm*/ unsigned short resistance2; /* Ohm*/ unsigned short percentage; }; struct fuel_gauge_table { int temperature; int q_max; int q_max_h_current; int pseudo1; int pseudo100; int pmic_min_vol; int pon_iboot; int qmax_sys_vol; int shutdown_hl_zcv; int size; struct fuelgauge_profile_struct fg_profile[100]; }; struct fuel_gauge_table_cust_temperture_table { int table_ID; int tb_size; int tb_construct_temp; struct fuelgauge_profile_struct fg_profile_node[100]; }; struct fuel_gauge_table_custom_data { /* cust_battery_meter_table.h */ int active_table_number; struct fuel_gauge_table fg_profile[MAX_TABLE]; int temperature_tb0; int fg_profile_temperature_0_size; struct fuelgauge_profile_struct fg_profile_temperature_0[100]; int temperature_tb1; int fg_profile_temperature_1_size; struct fuelgauge_profile_struct fg_profile_temperature_1[100]; }; struct fuel_gauge_custom_data { int versionID1; int versionID2; int versionID3; int hardwareVersion; int low_temp_mode; int low_temp_mode_temp; /* Qmax for battery */ int q_max_L_current; int q_max_H_current; int q_max_sys_voltage; int pseudo1_en; int pseudo100_en; int pseudo100_en_dis; int pseudo1_iq_offset; /* vboot related */ int qmax_sel; int iboot_sel; int shutdown_system_iboot; /* multi temp gauge 0% */ int multi_temp_gauge0; /* hw related */ int car_tune_value; int fg_meter_resistance; int com_fg_meter_resistance; int r_fg_value; int com_r_fg_value; int mtk_chr_exist; /* Aging Compensation 1*/ int aging_one_en; int aging1_update_soc; int aging1_load_soc; int aging4_update_soc; int aging4_load_soc; int aging5_update_soc; int aging5_load_soc; int aging6_update_soc; int aging6_load_soc; int aging_temp_diff; int aging_temp_low_limit; int aging_temp_high_limit; int aging_100_en; int difference_voltage_update; /* Aging Compensation 2*/ int aging_two_en; /* Aging Compensation 3*/ int aging_third_en; int aging_4_en; int aging_5_en; int aging_6_en; /* ui_soc */ int diff_soc_setting; int keep_100_percent; int difference_full_cv; int diff_bat_temp_setting; int diff_bat_temp_setting_c; int discharge_tracking_time; int charge_tracking_time; int difference_fullocv_vth; int difference_fullocv_ith; int charge_pseudo_full_level; int over_discharge_level; int full_tracking_bat_int2_multiply; /* threshold */ int hwocv_swocv_diff; /* 0.1 mv */ int hwocv_swocv_diff_lt; /* 0.1 mv */ int hwocv_swocv_diff_lt_temp; /* degree */ int hwocv_oldocv_diff; /* 0.1 mv */ int hwocv_oldocv_diff_chr; /* 0.1 mv */ int swocv_oldocv_diff; /* 0.1 mv */ int swocv_oldocv_diff_chr; /* 0.1 mv */ int vbat_oldocv_diff; /* 0.1 mv */ int tnew_told_pon_diff; /* degree */ int tnew_told_pon_diff2;/* degree */ int pmic_shutdown_time; /* secs */ int bat_plug_out_time; /* min */ int swocv_oldocv_diff_emb; /* 0.1 mv */ int vir_oldocv_diff_emb; /* 0.1 mv */ int vir_oldocv_diff_emb_lt; int vir_oldocv_diff_emb_tmp; /* fgc & fgv threshold */ int difference_fgc_fgv_th1; int difference_fgc_fgv_th2; int difference_fgc_fgv_th3; int difference_fgc_fgv_th_soc1; int difference_fgc_fgv_th_soc2; int nafg_time_setting; int nafg_ratio; int nafg_ratio_en; int nafg_ratio_tmp_thr; int nafg_resistance; /* mode select */ int pmic_shutdown_current; int pmic_shutdown_sw_en; int force_vc_mode; int embedded_sel; int loading_1_en; int loading_2_en; int diff_iavg_th; /* ADC resister */ int r_bat_sense; /*is it used?*/ int r_i_sense; /*is it used?*/ int r_charger_1; int r_charger_2; /* pre_tracking */ int fg_pre_tracking_en; int vbat2_det_time; int vbat2_det_counter; int vbat2_det_voltage1; int vbat2_det_voltage2; int vbat2_det_voltage3; int shutdown_1_time; int shutdown_gauge0; int shutdown_gauge1_xmins; int shutdown_gauge1_mins; int shutdown_gauge0_voltage; int shutdown_gauge1_vbat_en; int shutdown_gauge1_vbat; /* ZCV update */ int zcv_suspend_time; int sleep_current_avg; int dc_ratio_sel; int dc_r_cnt; int pseudo1_sel; /* using current to limit uisoc in 100% case */ int ui_full_limit_en; int ui_full_limit_soc0; int ui_full_limit_ith0; int ui_full_limit_soc1; int ui_full_limit_ith1; int ui_full_limit_soc2; int ui_full_limit_ith2; int ui_full_limit_soc3; int ui_full_limit_ith3; int ui_full_limit_soc4; int ui_full_limit_ith4; int ui_full_limit_time; /* using voltage to limit uisoc in 1% case */ int ui_low_limit_en; int ui_low_limit_soc0; int ui_low_limit_vth0; int ui_low_limit_soc1; int ui_low_limit_vth1; int ui_low_limit_soc2; int ui_low_limit_vth2; int ui_low_limit_soc3; int ui_low_limit_vth3; int ui_low_limit_soc4; int ui_low_limit_vth4; int ui_low_limit_time; /* moving average bat_temp */ int moving_battemp_en; int moving_battemp_thr; int d0_sel; int dod_init_sel; int aging_sel; int fg_tracking_current; int fg_tracking_current_iboot_en; int ui_fast_tracking_en; int ui_fast_tracking_gap; int bat_par_i; int c_old_d0; int v_old_d0; int c_soc; int v_soc; int ui_old_soc; int dlpt_ui_remap_en; int aging_factor_min; int aging_factor_diff; int keep_100_percent_minsoc; int battery_tmp_to_disable_gm30; int battery_tmp_to_disable_nafg; int battery_tmp_to_enable_nafg; int disable_nafg; int zcv_car_gap_percentage; int uisoc_update_type; /* boot status */ int pl_charger_status; int power_on_car_chr; int power_on_car_nochr; int shutdown_car_ratio; int min_uisoc_at_kpoc; /* log_level */ int daemon_log_level; int record_log; }; struct fgd_cmd_param_t_custom { struct fuel_gauge_custom_data fg_cust_data; struct fuel_gauge_table_custom_data fg_table_cust_data; }; struct fuelgauge_temperature { signed int BatteryTemp; signed int TemperatureR; }; /* coulomb service */ struct gauge_consumer { char *name; struct device *dev; long start; long end; int variable; int (*callback)(struct gauge_consumer *consumer); struct list_head list; }; struct mtk_coulomb_service { struct list_head coulomb_head_plus; struct list_head coulomb_head_minus; struct mutex coulomb_lock; struct mutex hw_coulomb_lock; unsigned long reset_coulomb; spinlock_t slock; struct wakeup_source *wlock; wait_queue_head_t wait_que; bool coulomb_thread_timeout; int fgclog_level; int pre_coulomb; bool init; }; struct battery_temperature_table { int type; unsigned int rbat_pull_up_r; unsigned int rbat_pull_up_volt; unsigned int bif_ntc_r; }; enum Fg_interrupt_flags { FG_INTR_0 = 0, FG_INTR_TIMER_UPDATE = 1, FG_INTR_BAT_CYCLE = 2, FG_INTR_CHARGER_OUT = 4, FG_INTR_CHARGER_IN = 8, FG_INTR_FG_TIME = 16, FG_INTR_BAT_INT1_HT = 32, FG_INTR_BAT_INT1_LT = 64, FG_INTR_BAT_INT2_HT = 128, FG_INTR_BAT_INT2_LT = 256, FG_INTR_BAT_TMP_HT = 512, FG_INTR_BAT_TMP_LT = 1024, FG_INTR_BAT_TIME_INT = 2048, FG_INTR_NAG_C_DLTV = 4096, FG_INTR_FG_ZCV = 8192, FG_INTR_SHUTDOWN = 16384, FG_INTR_RESET_NVRAM = 32768, FG_INTR_BAT_PLUGOUT = 65536, FG_INTR_IAVG = 0x20000, FG_INTR_VBAT2_L = 0x40000, FG_INTR_VBAT2_H = 0x80000, FG_INTR_CHR_FULL = 0x100000, FG_INTR_DLPT_SD = 0x200000, FG_INTR_BAT_TMP_C_HT = 0x400000, FG_INTR_BAT_TMP_C_LT = 0x800000, FG_INTR_BAT_INT1_CHECK = 0x1000000, FG_INTR_KERNEL_CMD = 0x2000000, FG_INTR_BAT_INT2_CHECK = 0x4000000, }; struct mtk_battery_algo { bool active; int last_temp; int T_table; int T_table_c; /*soc only follows c_soc */ int soc; /* tempeture related*/ int fg_bat_tmp_c_gap; /* CSOC related */ int fg_c_d0_ocv; int fg_c_d0_dod; int fg_c_d0_soc; int fg_c_dod; int fg_c_soc; int fg_bat_int1_gap; int prev_car_bat0; /* UI related */ int rtc_ui_soc; int ui_soc; int ui_d0_soc; int vboot; int vboot_c; int qmax_t_0ma; /* 0.1mA */ int qmax_t_0ma_tb1; /* 0.1mA */ int qmax_t_0ma_h; int qmax_t_Nma_h; int quse_tb0; int quse_tb1; int car; int batterypseudo1_h; int batterypseudo100; int shutdown_hl_zcv; int qmax_t_0ma_h_tb1; int qmax_t_Nma_h_tb1; int qmax_t_aging; int aging_factor; int fg_resistance_bat; int DC_ratio; int ht_gap; int lt_gap; int low_tracking_enable; int fg_vbat2_lt; int fg_vbat2_ht; /* Interrupt control */ int uisoc_ht_en; int uisoc_lt_en; }; struct simulator_log { int bat_full_int; int dlpt_sd_int; int chr_in_int; int zcv_int; int zcv_current; int zcv; int chr_status; int ptim_bat; int ptim_cur; int ptim_is_charging; int phone_state; int ps_system_time; unsigned long long ps_logtime; int nafg_zcv; /* initial */ int fg_reset; int car_diff; /* rtc */ int is_gauge_initialized; int rtc_ui_soc; int is_rtc_invalid; int is_bat_plugout; int bat_plugout_time; /* system info */ int twosec_reboot; int pl_charging_status; int moniter_plchg_status; int bat_plug_status; int is_nvram_fail_mode; int con0_soc; }; /* ============================================================ */ /* power misc related */ /* ============================================================ */ #define BAT_VOLTAGE_LOW_BOUND 3400 #define BAT_VOLTAGE_HIGH_BOUND 3450 #define LOW_TMP_BAT_VOLTAGE_LOW_BOUND 3350 #define SHUTDOWN_TIME 40 #define AVGVBAT_ARRAY_SIZE 30 #define INIT_VOLTAGE 3450 #define BATTERY_SHUTDOWN_TEMPERATURE 60 struct shutdown_condition { bool is_overheat; bool is_soc_zero_percent; bool is_uisoc_one_percent; bool is_under_shutdown_voltage; bool is_dlpt_shutdown; }; struct shutdown_controller { struct alarm kthread_fgtimer; bool timeout; bool overheat; wait_queue_head_t wait_que; struct shutdown_condition shutdown_status; struct timespec pre_time[SHUTDOWN_FACTOR_MAX]; int avgvbat; bool lowbatteryshutdown; int batdata[AVGVBAT_ARRAY_SIZE]; int batidx; struct mutex lock; struct notifier_block psy_nb; int vbat_lt; int vbat_lt_lv1; int shutdown_cond_flag; }; struct BAT_EC_Struct { int fixed_temp_en; int fixed_temp_value; int debug_rac_en; int debug_rac_value; int debug_ptim_v_en; int debug_ptim_v_value; int debug_ptim_r_en; int debug_ptim_r_value; int debug_ptim_r_value_sign; int debug_fg_curr_en; int debug_fg_curr_value; int debug_bat_id_en; int debug_bat_id_value; int debug_d0_c_en; int debug_d0_c_value; int debug_d0_v_en; int debug_d0_v_value; int debug_uisoc_en; int debug_uisoc_value; int debug_kill_daemontest; }; struct mtk_battery { /*linux driver related*/ wait_queue_head_t wait_que; unsigned int fg_update_flag; struct hrtimer fg_hrtimer; struct mutex ops_lock; struct battery_data bs_data; struct mtk_coulomb_service cs; struct mtk_gauge *gauge; struct sock *mtk_battery_sk; struct mtk_battery_algo algo; u_int fgd_pid; /* adb */ int fixed_bat_tmp; int fixed_uisoc; /* for test */ struct BAT_EC_Struct Bat_EC_ctrl; int BAT_EC_cmd; int BAT_EC_param; /*battery flag*/ bool init_flag; bool is_probe_done; bool disable_nafg_int; bool disableGM30; bool ntc_disable_nafg; bool cmd_disable_nafg; /*battery full*/ bool is_force_full; /*battery plug in out*/ int chr_type; bool disable_plug_int; /*battery status*/ int soc; int ui_soc; struct timespec uisoc_oldtime; int d_saved_car; int tbat_precise; /*battery interrupt*/ /* coulomb interrupt */ int coulomb_int_gap; int coulomb_int_ht; int coulomb_int_lt; int soc_decimal_rate; struct gauge_consumer coulomb_plus; struct gauge_consumer coulomb_minus; /* uisoc interrupt */ int uisoc_int_ht_gap; int uisoc_int_lt_gap; int uisoc_int_ht_en; int uisoc_int_lt_en; struct gauge_consumer uisoc_plus; struct gauge_consumer uisoc_minus; /* charge full interrupt */ struct timespec chr_full_handler_time; bool b_EOC; /* battery temperature interrupt */ int bat_tmp_int_gap; int bat_tmp_c_int_gap; int bat_tmp_ht; int bat_tmp_lt; int bat_tmp_c_ht; int bat_tmp_c_lt; int bat_tmp_int_ht; int bat_tmp_int_lt; int cur_bat_temp; /*nafg monitor */ int last_nafg_cnt; struct timespec last_nafg_update_time; bool is_nafg_broken; /* information from LK */ signed int ptim_lk_v; signed int ptim_lk_i; int lk_boot_coulomb; int pl_bat_vol; int pl_shutdown_time; int pl_two_sec_reboot; int plug_miss_count; /* gauge timer */ struct alarm tracking_timer; struct work_struct tracking_timer_work; struct alarm one_percent_timer; struct work_struct one_percent_timer_work; /*UISOC timer for no hw*/ struct alarm sw_uisoc_timer; struct work_struct sw_uisoc_timer_work; /* battery cycle */ bool is_reset_battery_cycle; int bat_cycle; int bat_cycle_thr; int bat_cycle_car; int bat_cycle_ncar; /* power misc */ struct shutdown_controller sdc; /*sw average current*/ struct timespec sw_iavg_time; int sw_iavg_car; int sw_iavg; int sw_iavg_ht; int sw_iavg_lt; int sw_iavg_gap; /*sw low battery interrupt*/ struct lbat_user *lowbat_service; int sw_low_battery_ht_en; int sw_low_battery_ht_threshold; int sw_low_battery_lt_en; int sw_low_battery_lt_threshold; struct mutex sw_low_battery_mutex; /*simulator log*/ struct simulator_log log; /* cust req ocv data */ int algo_qmax; int algo_req_ocv; int algo_ocv_to_mah; int algo_ocv_to_soc; int algo_vtemp; /* aging */ bool is_reset_aging_factor; int aging_factor; /* bootmode */ u32 bootmode; u32 boottype; /*custom related*/ int battery_id; struct fuel_gauge_custom_data fg_cust_data; struct fuel_gauge_table_custom_data fg_table_cust_data; struct fgd_cmd_param_t_custom fg_data; /* hwocv swocv */ int ext_hwocv_swocv; int ext_hwocv_swocv_lt; int ext_hwocv_swocv_lt_temp; /* battery temperature table */ int no_bat_temp_compensate; int enable_tmp_intr_suspend; struct battery_temperature_table rbat; struct fuelgauge_temperature *tmp_table; void (*shutdown)(struct mtk_battery *gm); int (*suspend)(struct mtk_battery *gm, pm_message_t state); int (*resume)(struct mtk_battery *gm); int log_level; }; struct mtk_battery_sysfs_field_info { struct device_attribute attr; enum battery_property prop; int (*set)(struct mtk_battery *gm, struct mtk_battery_sysfs_field_info *attr, int val); int (*get)(struct mtk_battery *gm, struct mtk_battery_sysfs_field_info *attr, int *val); }; /* coulomb service */ extern void gauge_coulomb_service_init(struct mtk_battery *gm); extern void gauge_coulomb_consumer_init(struct gauge_consumer *coulomb, struct device *dev, char *name); extern void gauge_coulomb_start(struct gauge_consumer *coulomb, int car); extern void gauge_coulomb_stop(struct gauge_consumer *coulomb); extern void gauge_coulomb_dump_list(struct mtk_battery *gm); extern void gauge_coulomb_before_reset(struct mtk_battery *gm); extern void gauge_coulomb_after_reset(struct mtk_battery *gm); /* coulomb sub system end */ /*mtk_battery.c */ extern void enable_gauge_irq(struct mtk_gauge *gauge, enum gauge_irq irq); extern void disable_gauge_irq(struct mtk_gauge *gauge, enum gauge_irq irq); extern int bat_get_debug_level(void); extern int force_get_tbat(struct mtk_battery *gm, bool update); extern int force_get_tbat_internal(struct mtk_battery *gm, bool update); extern int wakeup_fg_algo_cmd(struct mtk_battery *gm, unsigned int flow_state, int cmd, int para1); extern int wakeup_fg_algo(struct mtk_battery *gm, unsigned int flow_state); extern int gauge_get_int_property(enum gauge_property gp); extern int gauge_get_property(enum gauge_property gp, int *val); extern int gauge_set_property(enum gauge_property gp, int val); extern int battery_init(struct platform_device *pdev); extern int battery_psy_init(struct platform_device *pdev); extern struct mtk_battery *get_mtk_battery(void); extern int battery_get_property(enum battery_property bp, int *val); extern int battery_get_int_property(enum battery_property bp); extern int battery_set_property(enum battery_property bp, int val); extern void battery_update(struct mtk_battery *gm); extern bool fg_interrupt_check(struct mtk_battery *gm); extern void fg_nafg_monitor(struct mtk_battery *gm); extern bool is_algo_active(struct mtk_battery *gm); extern int disable_shutdown_cond(struct mtk_battery *gm, int shutdown_cond); extern int set_shutdown_cond(struct mtk_battery *gm, int shutdown_cond); extern bool is_kernel_power_off_charging(void); extern void set_shutdown_vbat_lt(struct mtk_battery *gm, int vbat_lt, int vbat_lt_lv1); extern void fg_sw_bat_cycle_accu(struct mtk_battery *gm); extern void notify_fg_chr_full(struct mtk_battery *gm); extern int fgauge_get_profile_id(void); extern void disable_fg(struct mtk_battery *gm); extern int get_shutdown_cond(struct mtk_battery *gm); extern int get_shutdown_cond_flag(struct mtk_battery *gm); extern void set_shutdown_cond_flag(struct mtk_battery *gm, int val); /*mtk_battery.c end */ /* mtk_battery_algo.c */ extern void battery_algo_init(struct mtk_battery *gm); extern void do_fg_algo(struct mtk_battery *gm, unsigned int intr_num); extern void fg_bat_temp_int_internal(struct mtk_battery *gm); /* mtk_battery_algo.c end */ #endif /* __MTK_BATTERY_INTF_H__ */