xref: /OK3568_Linux_fs/kernel/sound/soc/codecs/aw87xxx/aw_acf_bin.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0+ */
2*4882a593Smuzhiyun 
3*4882a593Smuzhiyun #ifndef __AW_ACF_BIN_H__
4*4882a593Smuzhiyun #define __AW_ACF_BIN_H__
5*4882a593Smuzhiyun 
6*4882a593Smuzhiyun #include "aw_device.h"
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #define AW_PROJECT_NAME_MAX		(24)
9*4882a593Smuzhiyun #define AW_CUSTOMER_NAME_MAX		(16)
10*4882a593Smuzhiyun #define AW_CFG_VERSION_MAX		(4)
11*4882a593Smuzhiyun #define AW_TBL_VERSION_MAX		(4)
12*4882a593Smuzhiyun #define AW_DDE_DEVICE_TYPE		(0)
13*4882a593Smuzhiyun #define AW_DDE_SKT_TYPE			(1)
14*4882a593Smuzhiyun #define AW_DDE_DEFAULT_TYPE		(2)
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun #define AW_REG_ADDR_BYTE		(1)
17*4882a593Smuzhiyun #define AW_REG_DATA_BYTE		(1)
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun #define AW_ACF_FILE_ID			(0xa15f908)
20*4882a593Smuzhiyun #define AW_PROFILE_STR_MAX 		(32)
21*4882a593Smuzhiyun #define AW_POWER_OFF_NAME_SUPPORT_COUNT	(5)
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun enum aw_cfg_hdr_version {
24*4882a593Smuzhiyun 	AW_ACF_HDR_VER_0_0_0_1 = 0x00000001,
25*4882a593Smuzhiyun 	AW_ACF_HDR_VER_1_0_0_0 = 0x01000000,
26*4882a593Smuzhiyun };
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun enum aw_acf_dde_type_id {
29*4882a593Smuzhiyun 	AW_DEV_NONE_TYPE_ID = 0xFFFFFFFF,
30*4882a593Smuzhiyun 	AW_DDE_DEV_TYPE_ID = 0x00000000,
31*4882a593Smuzhiyun 	AW_DDE_SKT_TYPE_ID = 0x00000001,
32*4882a593Smuzhiyun 	AW_DDE_DEV_DEFAULT_TYPE_ID = 0x00000002,
33*4882a593Smuzhiyun 	AW_DDE_TYPE_MAX,
34*4882a593Smuzhiyun };
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun enum aw_raw_data_type_id {
37*4882a593Smuzhiyun 	AW_BIN_TYPE_REG = 0x00000000,
38*4882a593Smuzhiyun 	AW_BIN_TYPE_DSP,
39*4882a593Smuzhiyun 	AW_BIN_TYPE_DSP_CFG,
40*4882a593Smuzhiyun 	AW_BIN_TYPE_DSP_FW,
41*4882a593Smuzhiyun 	AW_BIN_TYPE_HDR_REG,
42*4882a593Smuzhiyun 	AW_BIN_TYPE_HDR_DSP_CFG,
43*4882a593Smuzhiyun 	AW_BIN_TYPE_HDR_DSP_FW,
44*4882a593Smuzhiyun 	AW_BIN_TYPE_MUTLBIN,
45*4882a593Smuzhiyun 	AW_SKT_UI_PROJECT,
46*4882a593Smuzhiyun 	AW_DSP_CFG,
47*4882a593Smuzhiyun 	AW_MONITOR,
48*4882a593Smuzhiyun 	AW_BIN_TYPE_MAX,
49*4882a593Smuzhiyun };
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun enum {
52*4882a593Smuzhiyun 	AW_DEV_TYPE_OK = 0,
53*4882a593Smuzhiyun 	AW_DEV_TYPE_NONE = 1,
54*4882a593Smuzhiyun };
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun enum aw_profile_status {
57*4882a593Smuzhiyun 	AW_PROFILE_WAIT = 0,
58*4882a593Smuzhiyun 	AW_PROFILE_OK,
59*4882a593Smuzhiyun };
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun enum aw_acf_load_status {
62*4882a593Smuzhiyun 	AW_ACF_WAIT = 0,
63*4882a593Smuzhiyun 	AW_ACF_UPDATE,
64*4882a593Smuzhiyun };
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun enum aw_bin_dev_profile_id {
67*4882a593Smuzhiyun 	AW_PROFILE_MUSIC = 0x0000,
68*4882a593Smuzhiyun 	AW_PROFILE_VOICE,
69*4882a593Smuzhiyun 	AW_PROFILE_VOIP,
70*4882a593Smuzhiyun 	AW_PROFILE_RINGTONE,
71*4882a593Smuzhiyun 	AW_PROFILE_RINGTONE_HS,
72*4882a593Smuzhiyun 	AW_PROFILE_LOWPOWER,
73*4882a593Smuzhiyun 	AW_PROFILE_BYPASS,
74*4882a593Smuzhiyun 	AW_PROFILE_MMI,
75*4882a593Smuzhiyun 	AW_PROFILE_FM,
76*4882a593Smuzhiyun 	AW_PROFILE_NOTIFICATION,
77*4882a593Smuzhiyun 	AW_PROFILE_RECEIVER,
78*4882a593Smuzhiyun 	AW_PROFILE_OFF,
79*4882a593Smuzhiyun 	AW_PROFILE_MAX,
80*4882a593Smuzhiyun };
81*4882a593Smuzhiyun 
82*4882a593Smuzhiyun struct aw_acf_hdr {
83*4882a593Smuzhiyun 	int32_t a_id;				/* acf file ID 0xa15f908 */
84*4882a593Smuzhiyun 	char project[AW_PROJECT_NAME_MAX];	/* project name */
85*4882a593Smuzhiyun 	char custom[AW_CUSTOMER_NAME_MAX];	/* custom name :huawei xiaomi vivo oppo */
86*4882a593Smuzhiyun 	uint8_t version[AW_CFG_VERSION_MAX];	/* author update version */
87*4882a593Smuzhiyun 	int32_t author_id;			/* author id */
88*4882a593Smuzhiyun 	int32_t ddt_size;			/* sub section table entry size */
89*4882a593Smuzhiyun 	int32_t dde_num;			/* sub section table entry num */
90*4882a593Smuzhiyun 	int32_t ddt_offset;			/* sub section table offset in file */
91*4882a593Smuzhiyun 	int32_t hdr_version;			/* sub section table version */
92*4882a593Smuzhiyun 	int32_t reserve[3];			/* Reserved Bits */
93*4882a593Smuzhiyun };
94*4882a593Smuzhiyun 
95*4882a593Smuzhiyun struct aw_acf_dde {
96*4882a593Smuzhiyun 	int32_t type;				/* dde type id */
97*4882a593Smuzhiyun 	char dev_name[AW_CUSTOMER_NAME_MAX];	/* customer dev name */
98*4882a593Smuzhiyun 	int16_t dev_index;			/* dev id */
99*4882a593Smuzhiyun 	int16_t dev_bus;			/* dev bus id */
100*4882a593Smuzhiyun 	int16_t dev_addr;			/* dev addr id */
101*4882a593Smuzhiyun 	int16_t dev_profile;			/* dev profile id */
102*4882a593Smuzhiyun 	int32_t data_type;			/* data type id */
103*4882a593Smuzhiyun 	int32_t data_size;			/* dde data size in block */
104*4882a593Smuzhiyun 	int32_t data_offset;			/* dde data offset in block */
105*4882a593Smuzhiyun 	int32_t data_crc;			/* dde data crc checkout */
106*4882a593Smuzhiyun 	int32_t reserve[5];			/* Reserved Bits */
107*4882a593Smuzhiyun };
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun struct aw_acf_dde_v_1_0_0_0 {
110*4882a593Smuzhiyun 	uint32_t type;				/* DDE type id */
111*4882a593Smuzhiyun 	char dev_name[AW_CUSTOMER_NAME_MAX];	/* customer dev name */
112*4882a593Smuzhiyun 	uint16_t dev_index;			/* dev id */
113*4882a593Smuzhiyun 	uint16_t dev_bus;			/* dev bus id */
114*4882a593Smuzhiyun 	uint16_t dev_addr;			/* dev addr id */
115*4882a593Smuzhiyun 	uint16_t dev_profile;			/* dev profile id*/
116*4882a593Smuzhiyun 	uint32_t data_type;			/* data type id */
117*4882a593Smuzhiyun 	uint32_t data_size;			/* dde data size in block */
118*4882a593Smuzhiyun 	uint32_t data_offset;			/* dde data offset in block */
119*4882a593Smuzhiyun 	uint32_t data_crc;			/* dde data crc checkout */
120*4882a593Smuzhiyun 	char dev_profile_str[AW_PROFILE_STR_MAX];	/* dde custom profile name */
121*4882a593Smuzhiyun 	uint32_t chip_id;			/* dde custom product chip id */
122*4882a593Smuzhiyun 	uint32_t reserve[4];
123*4882a593Smuzhiyun };
124*4882a593Smuzhiyun 
125*4882a593Smuzhiyun struct aw_data_with_header {
126*4882a593Smuzhiyun 	uint32_t check_sum;
127*4882a593Smuzhiyun 	uint32_t header_ver;
128*4882a593Smuzhiyun 	uint32_t bin_data_type;
129*4882a593Smuzhiyun 	uint32_t bin_data_ver;
130*4882a593Smuzhiyun 	uint32_t bin_data_size;
131*4882a593Smuzhiyun 	uint32_t ui_ver;
132*4882a593Smuzhiyun 	char product[8];
133*4882a593Smuzhiyun 	uint32_t addr_byte_len;
134*4882a593Smuzhiyun 	uint32_t data_byte_len;
135*4882a593Smuzhiyun 	uint32_t device_addr;
136*4882a593Smuzhiyun 	uint32_t reserve[4];
137*4882a593Smuzhiyun };
138*4882a593Smuzhiyun 
139*4882a593Smuzhiyun struct aw_data_container {
140*4882a593Smuzhiyun 	uint32_t len;
141*4882a593Smuzhiyun 	uint8_t *data;
142*4882a593Smuzhiyun };
143*4882a593Smuzhiyun 
144*4882a593Smuzhiyun struct aw_prof_desc {
145*4882a593Smuzhiyun 	uint32_t prof_st;
146*4882a593Smuzhiyun 	char *prof_name;
147*4882a593Smuzhiyun 	char dev_name[AW_CUSTOMER_NAME_MAX];
148*4882a593Smuzhiyun 	struct aw_data_container data_container;
149*4882a593Smuzhiyun };
150*4882a593Smuzhiyun 
151*4882a593Smuzhiyun struct aw_all_prof_info {
152*4882a593Smuzhiyun 	struct aw_prof_desc prof_desc[AW_PROFILE_MAX];
153*4882a593Smuzhiyun };
154*4882a593Smuzhiyun 
155*4882a593Smuzhiyun struct aw_prof_info {
156*4882a593Smuzhiyun 	int count;
157*4882a593Smuzhiyun 	int status;
158*4882a593Smuzhiyun 	int prof_type;
159*4882a593Smuzhiyun 	char (*prof_name_list)[AW_PROFILE_STR_MAX];
160*4882a593Smuzhiyun 	struct aw_prof_desc *prof_desc;
161*4882a593Smuzhiyun };
162*4882a593Smuzhiyun 
163*4882a593Smuzhiyun struct acf_bin_info {
164*4882a593Smuzhiyun 	int load_count;
165*4882a593Smuzhiyun 	int fw_size;
166*4882a593Smuzhiyun 	int16_t dev_index;
167*4882a593Smuzhiyun 	char *fw_data;
168*4882a593Smuzhiyun 	int product_cnt;
169*4882a593Smuzhiyun 	const char **product_tab;
170*4882a593Smuzhiyun 	struct aw_device *aw_dev;
171*4882a593Smuzhiyun 
172*4882a593Smuzhiyun 	struct aw_acf_hdr acf_hdr;
173*4882a593Smuzhiyun 	struct aw_prof_info prof_info;
174*4882a593Smuzhiyun };
175*4882a593Smuzhiyun 
176*4882a593Smuzhiyun 
177*4882a593Smuzhiyun void aw_acf_profile_free(struct device *dev,
178*4882a593Smuzhiyun 		struct acf_bin_info *acf_info);
179*4882a593Smuzhiyun int aw_acf_parse(struct device *dev, struct acf_bin_info *acf_info);
180*4882a593Smuzhiyun struct aw_prof_desc *aw_acf_get_prof_desc_form_name(struct device *dev,
181*4882a593Smuzhiyun 			struct acf_bin_info *acf_info, char *profile_name);
182*4882a593Smuzhiyun int aw_acf_get_prof_index_form_name(struct device *dev,
183*4882a593Smuzhiyun 			struct acf_bin_info *acf_info, char *profile_name);
184*4882a593Smuzhiyun char *aw_acf_get_prof_name_form_index(struct device *dev,
185*4882a593Smuzhiyun 			struct acf_bin_info *acf_info, int index);
186*4882a593Smuzhiyun int aw_acf_get_profile_count(struct device *dev,
187*4882a593Smuzhiyun 			struct acf_bin_info *acf_info);
188*4882a593Smuzhiyun int aw_acf_check_profile_is_off(struct device *dev,
189*4882a593Smuzhiyun 			struct acf_bin_info *acf_info, char *profile_name);
190*4882a593Smuzhiyun char *aw_acf_get_prof_off_name(struct device *dev,
191*4882a593Smuzhiyun 			struct acf_bin_info *acf_info);
192*4882a593Smuzhiyun void aw_acf_init(struct aw_device *aw_dev, struct acf_bin_info *acf_info, int index);
193*4882a593Smuzhiyun 
194*4882a593Smuzhiyun 
195*4882a593Smuzhiyun #endif
196