1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0+ */ 2*4882a593Smuzhiyun 3*4882a593Smuzhiyun #ifndef __AW_MONITOR_H__ 4*4882a593Smuzhiyun #define __AW_MONITOR_H__ 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun /*#define AW_DEBUG*/ 7*4882a593Smuzhiyun /*#define AW_SYS_BATTERY_ST*/ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun struct aw_table; 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #define AW_TABLE_SIZE sizeof(struct aw_table) 12*4882a593Smuzhiyun #define AW_MONITOR_DEFAULT_FLAG (0) 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun #define IPEAK_NONE (0xFF) 15*4882a593Smuzhiyun #define GAIN_NONE (0xFF) 16*4882a593Smuzhiyun #define VMAX_NONE (0xFFFFFFFF) 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun #define AW_GET_32_DATA(w, x, y, z) \ 20*4882a593Smuzhiyun ((uint32_t)((((uint8_t)w) << 24) | (((uint8_t)x) << 16) | (((uint8_t)y) << 8) | ((uint8_t)z))) 21*4882a593Smuzhiyun #define AW_GET_16_DATA(x, y) \ 22*4882a593Smuzhiyun ((uint16_t)((((uint8_t)x) << 8) | (uint8_t)y)) 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun enum { 25*4882a593Smuzhiyun AW_MON_LOGIC_OR = 0, 26*4882a593Smuzhiyun AW_MON_LOGIC_AND = 1, 27*4882a593Smuzhiyun }; 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun enum { 30*4882a593Smuzhiyun AW_FIRST_ENTRY = 0, 31*4882a593Smuzhiyun AW_NOT_FIRST_ENTRY = 1, 32*4882a593Smuzhiyun }; 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun enum aw_monitor_hdr_ver { 35*4882a593Smuzhiyun AW_MONITOR_HDR_VER_0_1_1 = 0x00010100, 36*4882a593Smuzhiyun }; 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun enum aw_monitor_init { 39*4882a593Smuzhiyun AW_MON_CFG_ST = 0, 40*4882a593Smuzhiyun AW_MON_CFG_OK = 1, 41*4882a593Smuzhiyun }; 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun #define MONITOR_EN_MASK 0x01 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun enum { 46*4882a593Smuzhiyun MONITOR_EN_BIT = 0, 47*4882a593Smuzhiyun MONITOR_LOGIC_BIT = 1, 48*4882a593Smuzhiyun MONITOR_IPEAK_EN_BIT = 2, 49*4882a593Smuzhiyun MONITOR_GAIN_EN_BIT = 3, 50*4882a593Smuzhiyun MONITOR_VMAX_EN_BIT = 4, 51*4882a593Smuzhiyun MONITOR_TEMP_EN_BIT = 5, 52*4882a593Smuzhiyun MONITOR_VOL_EN_BIT = 6, 53*4882a593Smuzhiyun }; 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun enum { 56*4882a593Smuzhiyun AW_INTERNAL_TEMP = 0, 57*4882a593Smuzhiyun AW_EXTERNAL_TEMP = 1, 58*4882a593Smuzhiyun }; 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun struct aw_monitor_hdr_v_0_1_1 { 61*4882a593Smuzhiyun uint32_t check_sum; 62*4882a593Smuzhiyun uint32_t monitor_ver; 63*4882a593Smuzhiyun char chip_type[16]; 64*4882a593Smuzhiyun uint32_t ui_ver; 65*4882a593Smuzhiyun uint32_t monitor_time; 66*4882a593Smuzhiyun uint32_t monitor_count; 67*4882a593Smuzhiyun uint32_t enable_flag; 68*4882a593Smuzhiyun /* [bit 31:7]*/ 69*4882a593Smuzhiyun /* [bit 6: vol en]*/ 70*4882a593Smuzhiyun /* [bit 5: temp en]*/ 71*4882a593Smuzhiyun /* [bit 4: vmax en]*/ 72*4882a593Smuzhiyun /* [bit 3: gain en]*/ 73*4882a593Smuzhiyun /* [bit 2: ipeak en]*/ 74*4882a593Smuzhiyun /* [bit 1: & or | flag]*/ 75*4882a593Smuzhiyun /* [bit 0: monitor en]*/ 76*4882a593Smuzhiyun uint32_t temp_aplha; 77*4882a593Smuzhiyun uint32_t temp_num; 78*4882a593Smuzhiyun uint32_t single_temp_size; 79*4882a593Smuzhiyun uint32_t temp_offset; 80*4882a593Smuzhiyun uint32_t vol_aplha; 81*4882a593Smuzhiyun uint32_t vol_num; 82*4882a593Smuzhiyun uint32_t single_vol_size; 83*4882a593Smuzhiyun uint32_t vol_offset; 84*4882a593Smuzhiyun uint32_t reserver[3]; 85*4882a593Smuzhiyun }; 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun struct aw_table { 88*4882a593Smuzhiyun int16_t min_val; 89*4882a593Smuzhiyun int16_t max_val; 90*4882a593Smuzhiyun uint16_t ipeak; 91*4882a593Smuzhiyun uint16_t gain; 92*4882a593Smuzhiyun uint32_t vmax; 93*4882a593Smuzhiyun }; 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun struct aw_table_info { 96*4882a593Smuzhiyun uint8_t table_num; 97*4882a593Smuzhiyun struct aw_table *aw_table; 98*4882a593Smuzhiyun }; 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun struct aw_monitor_cfg { 101*4882a593Smuzhiyun uint8_t monitor_status; 102*4882a593Smuzhiyun uint32_t monitor_switch; 103*4882a593Smuzhiyun uint32_t monitor_time; 104*4882a593Smuzhiyun uint32_t monitor_count; 105*4882a593Smuzhiyun uint32_t logic_switch; 106*4882a593Smuzhiyun uint32_t temp_switch; 107*4882a593Smuzhiyun uint32_t temp_aplha; 108*4882a593Smuzhiyun uint32_t vol_switch; 109*4882a593Smuzhiyun uint32_t vol_aplha; 110*4882a593Smuzhiyun uint32_t ipeak_switch; 111*4882a593Smuzhiyun uint32_t gain_switch; 112*4882a593Smuzhiyun uint32_t vmax_switch; 113*4882a593Smuzhiyun struct aw_table_info temp_info; 114*4882a593Smuzhiyun struct aw_table_info vol_info; 115*4882a593Smuzhiyun }; 116*4882a593Smuzhiyun 117*4882a593Smuzhiyun struct aw_monitor_trace { 118*4882a593Smuzhiyun int32_t pre_val; 119*4882a593Smuzhiyun int32_t sum_val; 120*4882a593Smuzhiyun struct aw_table aw_table; 121*4882a593Smuzhiyun }; 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun 124*4882a593Smuzhiyun /****************************************************************** 125*4882a593Smuzhiyun * struct aw882xx monitor 126*4882a593Smuzhiyun *******************************************************************/ 127*4882a593Smuzhiyun struct aw_monitor_desc { 128*4882a593Smuzhiyun struct delayed_work delay_work; 129*4882a593Smuzhiyun struct delayed_work hw_monitor_work; 130*4882a593Smuzhiyun struct aw_monitor_cfg monitor_cfg; 131*4882a593Smuzhiyun bool hw_mon_en; 132*4882a593Smuzhiyun 133*4882a593Smuzhiyun uint8_t hw_temp_flag; 134*4882a593Smuzhiyun uint8_t first_entry; 135*4882a593Smuzhiyun uint8_t samp_count; 136*4882a593Smuzhiyun uint32_t pre_vmax; 137*4882a593Smuzhiyun uint32_t hw_monitor_delay; 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun struct aw_monitor_trace temp_trace; 140*4882a593Smuzhiyun struct aw_monitor_trace vol_trace; 141*4882a593Smuzhiyun 142*4882a593Smuzhiyun #ifdef AW_DEBUG 143*4882a593Smuzhiyun uint16_t test_vol; 144*4882a593Smuzhiyun int16_t test_temp; 145*4882a593Smuzhiyun #endif 146*4882a593Smuzhiyun }; 147*4882a593Smuzhiyun 148*4882a593Smuzhiyun /****************************************************************** 149*4882a593Smuzhiyun * aw882xx monitor functions 150*4882a593Smuzhiyun *******************************************************************/ 151*4882a593Smuzhiyun void aw_monitor_start(struct aw_monitor_desc *monitor_desc); 152*4882a593Smuzhiyun int aw_monitor_stop(struct aw_monitor_desc *monitor_desc); 153*4882a593Smuzhiyun void aw_monitor_init(struct aw_monitor_desc *monitor_desc); 154*4882a593Smuzhiyun void aw_monitor_deinit(struct aw_monitor_desc *monitor_desc); 155*4882a593Smuzhiyun int aw_monitor_parse_fw(struct aw_monitor_desc *monitor_desc, 156*4882a593Smuzhiyun uint8_t *data, uint32_t data_len); 157*4882a593Smuzhiyun 158*4882a593Smuzhiyun #endif 159*4882a593Smuzhiyun 160