/* SPDX-License-Identifier: GPL-2.0-only WITH Linux-syscall-note */ /* * Copyright (c) 2021, The Linux Foundation. All rights reserved. */ #ifndef __QBG_H__ #define __QBG_H__ #define MAX_FIFO_COUNT 36 #define QBG_MAX_STEP_CHG_ENTRIES 6 enum QBG_STATE { QBG_LPM, QBG_MPM, QBG_HPM, QBG_FAST_CHAR, QBG_PON_OCV, QBG_STATE_MAX, }; enum QBG_SDAM_DATA_OFFSET { QBG_ACC0_OFFSET = 0, QBG_ACC1_OFFSET = 2, QBG_ACC2_OFFSET = 4, QBG_TBAT_OFFSET = 6, QBG_IBAT_OFFSET = 8, QBG_VREF_OFFSET = 10, QBG_DATA_TAG_OFFSET = 12, QBG_QG_STS_OFFSET, QBG_STS1_OFFSET, QBG_STS2_OFFSET, QBG_STS3_OFFSET, QBG_ONE_FIFO_LENGTH, }; enum qbg { QBG_PARAM_SOC, QBG_PARAM_BATT_SOC, QBG_PARAM_SYS_SOC, QBG_PARAM_ESR, QBG_PARAM_OCV_UV, QBG_PARAM_MAX_LOAD_NOW, QBG_PARAM_MAX_LOAD_AVG, QBG_PARAM_HOLD_SOC_100PCT, QBG_PARAM_CHARGE_CYCLE_COUNT, QBG_PARAM_LEARNED_CAPACITY, QBG_PARAM_TTF_100MS, QBG_PARAM_TTE_100MS, QBG_PARAM_SOH, QBG_PARAM_TBAT, QBG_PARAM_SYS_SOC_HOLD_100PCT, QBG_PARAM_JEITA_COOL_THRESHOLD, QBG_PARAM_TOTAL_IMPEDANCE, QBG_PARAM_ESSENTIAL_PARAM_REVID, QBG_PARAM_FIFO_TIMESTAMP, QBG_PARAM_MAX, }; struct qbg_essential_params { short int msoc; short int cutoff_soc; short int full_soc; short int x0; short int x1; short int x2; short int soh_r; short int soh_c; short int theta0; short int theta1; short int theta2; short int i1full; short int i2full; short int i1cutoff; short int i2cutoff; short int syssoc; int discharge_cycle_count; int charge_cycle_count; unsigned int rtc_time; short int batt_therm; unsigned short int ocv; } __attribute__ ((__packed__)); struct fifo_data { unsigned short int v1; unsigned short int v2; unsigned short int i; unsigned short int tbat; unsigned short int ibat; unsigned short int vref; char data_tag; char qg_sts; char sts1; char sts2; char sts3; } __attribute__ ((__packed__)); struct k_fifo_data { unsigned int v1; unsigned int v2; unsigned int i; unsigned int tbat; unsigned int ibat; unsigned int vref; unsigned int data_tag; unsigned int qg_sts; unsigned int sts1; unsigned int sts2; unsigned int sts3; } __attribute__ ((__packed__)); struct qbg_config { unsigned int batt_id; unsigned int pon_ocv; unsigned int pon_ibat; unsigned int pon_tbat; unsigned int pon_soc; unsigned int float_volt_uv; unsigned int fastchg_curr_ma; unsigned int vbat_cutoff_mv; unsigned int ibat_cutoff_ma; unsigned int vph_min_mv; unsigned int iterm_ma; unsigned int rconn_mohm; unsigned long current_time; unsigned int sdam_batt_id; unsigned int essential_param_revid; unsigned long sample_time_us[QBG_STATE_MAX]; } __attribute__ ((__packed__)); struct qbg_param { unsigned int data; _Bool valid; }; struct qbg_kernel_data { unsigned int seq_no; unsigned int fifo_time; unsigned int fifo_count; struct k_fifo_data fifo[MAX_FIFO_COUNT]; struct qbg_param param[QBG_PARAM_MAX]; } __attribute__ ((__packed__)); struct qbg_user_data { struct qbg_param param[QBG_PARAM_MAX]; } __attribute__ ((__packed__)); struct range_data { int low_threshold; int high_threshold; unsigned int value; } __attribute__ ((__packed__)); struct ranges { struct range_data data[QBG_MAX_STEP_CHG_ENTRIES]; unsigned char range_count; _Bool valid; } __attribute__((__packed__)); struct qbg_step_chg_jeita_params { int jeita_full_fv_10nv; int jeita_full_iterm_10na; int jeita_warm_adc_value; int jeita_cool_adc_value; int battery_beta; int battery_therm_kohm; struct ranges step_fcc_cfg; struct ranges jeita_fcc_cfg; struct ranges jeita_fv_cfg; unsigned char ttf_calc_mode; } __attribute__ ((__packed__)); /* IOCTLs to read & write QBG config and essential params */ #define QBGIOCXCFG _IOR('B', 0x01, struct qbg_config) #define QBGIOCXEPR _IOR('B', 0x02, struct qbg_essential_params) #define QBGIOCXEPW _IOWR('B', 0x03, struct qbg_essential_params) #define QBGIOCXSTEPCHGCFG \ _IOWR('B', 0x04, struct qbg_step_chg_jeita_params) #endif