xref: /OK3568_Linux_fs/kernel/sound/soc/codecs/aw883xx/aw_monitor.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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