xref: /OK3568_Linux_fs/kernel/sound/soc/codecs/aw883xx/aw_device.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 // SPDX-License-Identifier: GPL-2.0+
2 
3 #include <linux/module.h>
4 #include <linux/i2c.h>
5 #include <sound/core.h>
6 #include <sound/pcm.h>
7 #include <sound/pcm_params.h>
8 #include <sound/soc.h>
9 #include <linux/of_gpio.h>
10 #include <linux/delay.h>
11 #include <linux/device.h>
12 #include <linux/firmware.h>
13 #include <linux/debugfs.h>
14 #include <linux/version.h>
15 #include <linux/workqueue.h>
16 #include <linux/syscalls.h>
17 #include <sound/control.h>
18 #include <linux/uaccess.h>
19 
20 #include "aw_data_type.h"
21 #include "aw_log.h"
22 #include "aw_device.h"
23 #include "aw_bin_parse.h"
24 #include "aw_calib.h"
25 
26 #define AW_DEV_SYSST_CHECK_MAX   (10)
27 
28 enum {
29 	AW_EXT_DSP_WRITE_NONE = 0,
30 	AW_EXT_DSP_WRITE,
31 };
32 
33 static unsigned int g_fade_in_time = AW_1000_US / 10;
34 static unsigned int g_fade_out_time = AW_1000_US >> 1;
35 static LIST_HEAD(g_dev_list);
36 static DEFINE_MUTEX(g_dev_lock);
37 
aw_dev_reg_dump(struct aw_device * aw_dev)38 static int aw_dev_reg_dump(struct aw_device *aw_dev)
39 {
40 	int reg_num = aw_dev->ops.aw_get_reg_num();
41 	uint8_t i = 0;
42 	uint16_t reg_val = 0;
43 
44 	for (i = 0; i < reg_num; i++) {
45 		if (aw_dev->ops.aw_check_rd_access(i)) {
46 			aw_dev->ops.aw_reg_read(aw_dev, i, &reg_val);
47 			aw_dev_info(aw_dev->dev, "read: reg = 0x%02x, val = 0x%04x",
48 				i, reg_val);
49 		}
50 	}
51 
52 	return 0;
53 }
54 
aw_dev_fade_in(struct aw_device * aw_dev)55 static void aw_dev_fade_in(struct aw_device *aw_dev)
56 {
57 	int i = 0;
58 	struct aw_volume_desc *desc = &aw_dev->volume_desc;
59 	int fade_step = aw_dev->fade_step;
60 
61 	if (!aw_dev->fade_en)
62 		return;
63 
64 	if (fade_step == 0 || g_fade_in_time == 0) {
65 		aw_dev->ops.aw_set_volume(aw_dev, desc->init_volume);
66 		return;
67 	}
68 	/*volume up*/
69 	for (i = desc->mute_volume; i >= desc->init_volume; i -= fade_step) {
70 		aw_dev->ops.aw_set_volume(aw_dev, i);
71 		usleep_range(g_fade_in_time, g_fade_in_time + 10);
72 	}
73 	if (i != desc->init_volume)
74 		aw_dev->ops.aw_set_volume(aw_dev, desc->init_volume);
75 
76 
77 }
78 
aw_dev_fade_out(struct aw_device * aw_dev)79 static void aw_dev_fade_out(struct aw_device *aw_dev)
80 {
81 	int i = 0;
82 	uint16_t start_volume = 0;
83 	struct aw_volume_desc *desc = &aw_dev->volume_desc;
84 	int fade_step = aw_dev->fade_step;
85 
86 	if (!aw_dev->fade_en)
87 		return;
88 
89 	if (fade_step == 0 || g_fade_out_time == 0) {
90 		aw_dev->ops.aw_set_volume(aw_dev, desc->mute_volume);
91 		return;
92 	}
93 
94 	aw_dev->ops.aw_get_volume(aw_dev, &start_volume);
95 	for (i = start_volume; i <= desc->mute_volume; i += fade_step) {
96 		aw_dev->ops.aw_set_volume(aw_dev, i);
97 		usleep_range(g_fade_out_time, g_fade_out_time + 10);
98 	}
99 	if (i != desc->mute_volume) {
100 		aw_dev->ops.aw_set_volume(aw_dev, desc->mute_volume);
101 		usleep_range(g_fade_out_time, g_fade_out_time + 10);
102 	}
103 }
104 
aw_dev_get_fade_vol_step(struct aw_device * aw_dev)105 int aw_dev_get_fade_vol_step(struct aw_device *aw_dev)
106 {
107 	return aw_dev->fade_step;
108 }
109 
aw_dev_set_fade_vol_step(struct aw_device * aw_dev,unsigned int step)110 void aw_dev_set_fade_vol_step(struct aw_device *aw_dev, unsigned int step)
111 {
112 	aw_dev->fade_step = step;
113 }
114 
aw_dev_get_fade_time(unsigned int * time,bool fade_in)115 void aw_dev_get_fade_time(unsigned int *time, bool fade_in)
116 {
117 	if (fade_in)
118 		*time = g_fade_in_time;
119 	else
120 		*time = g_fade_out_time;
121 }
122 
aw_dev_set_fade_time(unsigned int time,bool fade_in)123 void aw_dev_set_fade_time(unsigned int time, bool fade_in)
124 {
125 	if (fade_in)
126 		g_fade_in_time = time;
127 	else
128 		g_fade_out_time = time;
129 }
130 
aw_dev_dsp_crc32_reflect(uint64_t ref,uint8_t ch)131 static uint64_t aw_dev_dsp_crc32_reflect(uint64_t ref, uint8_t ch)
132 {
133 	int i;
134 	uint64_t value = 0;
135 
136 	for (i = 1; i < (ch + 1); i++) {
137 		if (ref & 1)
138 			value |= (uint64_t)1 << (ch - i);
139 
140 		ref >>= 1;
141 	}
142 
143 	return value;
144 }
145 
aw_dev_calc_dsp_cfg_crc32(uint8_t * buf,uint32_t len)146 static uint32_t aw_dev_calc_dsp_cfg_crc32(uint8_t *buf, uint32_t len)
147 {
148 	uint8_t i;
149 	uint32_t crc = 0xffffffff;
150 
151 	while (len--) {
152 		for (i = 1; i != 0; i <<= 1) {
153 			if ((crc & 0x80000000) != 0) {
154 				crc <<= 1;
155 				crc ^= 0x1EDC6F41;
156 			} else {
157 				crc <<= 1;
158 			}
159 
160 			if ((*buf & i) != 0)
161 				crc ^= 0x1EDC6F41;
162 		}
163 		buf++;
164 	}
165 
166 	return (aw_dev_dsp_crc32_reflect(crc, 32)^0xffffffff);
167 }
168 
aw_dev_set_dsp_crc32(struct aw_device * aw_dev)169 static int aw_dev_set_dsp_crc32(struct aw_device *aw_dev)
170 {
171 	uint32_t crc_value;
172 	uint32_t crc_data_len = 0;
173 	int ret = 0;
174 	struct aw_sec_data_desc *crc_dsp_cfg = &aw_dev->crc_dsp_cfg;
175 	struct aw_dsp_crc_desc *desc = &aw_dev->dsp_crc_desc;
176 
177 	/*get crc data len*/
178 	crc_data_len = (desc->dsp_reg - aw_dev->dsp_mem_desc.dsp_cfg_base_addr) * 2;
179 	if (crc_data_len > crc_dsp_cfg->len) {
180 		aw_dev_err(aw_dev->dev, "crc data len :%d > cfg_data len:%d",
181 			crc_data_len, crc_dsp_cfg->len);
182 		return ret;
183 	}
184 
185 	if (crc_data_len % 4 != 0) {
186 		aw_dev_err(aw_dev->dev, "The crc data len :%d unsupport", crc_data_len);
187 		return ret;
188 	}
189 
190 	crc_value = aw_dev_calc_dsp_cfg_crc32(crc_dsp_cfg->data, crc_data_len);
191 
192 	aw_dev_info(aw_dev->dev, "crc_value:0x%x", crc_value);
193 	ret = aw_dev->ops.aw_dsp_write(aw_dev, desc->dsp_reg, crc_value,
194 						desc->data_type);
195 	if (ret < 0) {
196 		aw_dev_err(aw_dev->dev, "set dsp crc value failed");
197 		return ret;
198 	}
199 
200 	return 0;
201 }
202 
aw_dev_dsp_crc_check_enable(struct aw_device * aw_dev,bool flag)203 static int aw_dev_dsp_crc_check_enable(struct aw_device *aw_dev, bool flag)
204 {
205 	struct aw_dsp_crc_desc *dsp_crc_desc = &aw_dev->dsp_crc_desc;
206 	int ret;
207 
208 	aw_dev_info(aw_dev->dev, "enter,flag:%d", flag);
209 	if (flag) {
210 		ret = aw_dev->ops.aw_reg_write_bits(aw_dev, dsp_crc_desc->ctl_reg,
211 				dsp_crc_desc->ctl_mask, dsp_crc_desc->ctl_enable);
212 		if (ret < 0) {
213 			aw_dev_err(aw_dev->dev, "enable dsp crc failed");
214 			return ret;
215 		}
216 	} else {
217 		ret = aw_dev->ops.aw_reg_write_bits(aw_dev, dsp_crc_desc->ctl_reg,
218 				dsp_crc_desc->ctl_mask, dsp_crc_desc->ctl_disable);
219 		if (ret < 0) {
220 			aw_dev_err(aw_dev->dev, "close dsp crc failed");
221 			return ret;
222 		}
223 	}
224 
225 	return 0;
226 }
227 
228 
aw_dev_dsp_st_check(struct aw_device * aw_dev)229 static int aw_dev_dsp_st_check(struct aw_device *aw_dev)
230 {
231 	struct aw_sysst_desc *desc = &aw_dev->sysst_desc;
232 	int ret = -1;
233 	uint16_t reg_val = 0;
234 	int i;
235 
236 	for (i = 0; i < AW_DSP_ST_CHECK_MAX; i++) {
237 		ret = aw_dev->ops.aw_reg_read(aw_dev, desc->reg, &reg_val);
238 		if (ret < 0) {
239 			aw_dev_err(aw_dev->dev, "read reg0x%x failed", desc->reg);
240 			continue;
241 		}
242 
243 		if ((reg_val & (~desc->dsp_mask)) != desc->dsp_check) {
244 			aw_dev_err(aw_dev->dev, "check dsp st fail,reg_val:0x%04x", reg_val);
245 			ret = -EINVAL;
246 			continue;
247 		} else {
248 			aw_dev_info(aw_dev->dev, "dsp st check ok, reg_val:0x%04x", reg_val);
249 			return 0;
250 		}
251 	}
252 
253 	return ret;
254 }
255 
aw_dev_dsp_crc32_check(struct aw_device * aw_dev)256 static int aw_dev_dsp_crc32_check(struct aw_device *aw_dev)
257 {
258 	int ret;
259 
260 	if (aw_dev->dsp_cfg == AW_DEV_DSP_BYPASS) {
261 		aw_dev_info(aw_dev->dev, "dsp bypass");
262 		return 0;
263 	}
264 
265 	ret = aw_dev_set_dsp_crc32(aw_dev);
266 	if (ret < 0) {
267 		aw_dev_info(aw_dev->dev, "set dsp crc32 failed");
268 		return ret;
269 	}
270 
271 	aw_dev_dsp_crc_check_enable(aw_dev, true);
272 
273 	/*dsp enable*/
274 	aw_dev_dsp_enable(aw_dev, true);
275 	usleep_range(AW_5000_US, AW_5000_US + 100);
276 
277 	ret = aw_dev_dsp_st_check(aw_dev);
278 	if (ret < 0) {
279 		aw_dev_err(aw_dev->dev, "check crc32 fail");
280 		return ret;
281 	}
282 
283 	aw_dev_dsp_crc_check_enable(aw_dev, false);
284 	aw_dev->dsp_crc_st = AW_DSP_CRC_OK;
285 	return 0;
286 }
287 
aw_dev_pwd(struct aw_device * aw_dev,bool pwd)288 static void aw_dev_pwd(struct aw_device *aw_dev, bool pwd)
289 {
290 	struct aw_pwd_desc *pwd_desc = &aw_dev->pwd_desc;
291 
292 	aw_dev_dbg(aw_dev->dev, "enter");
293 
294 	if (pwd) {
295 		aw_dev->ops.aw_reg_write_bits(aw_dev, pwd_desc->reg,
296 				pwd_desc->mask,
297 				pwd_desc->enable);
298 	} else {
299 		aw_dev->ops.aw_reg_write_bits(aw_dev, pwd_desc->reg,
300 				pwd_desc->mask,
301 				pwd_desc->disable);
302 	}
303 	aw_dev_info(aw_dev->dev, "done");
304 }
305 
aw_dev_amppd(struct aw_device * aw_dev,bool amppd)306 static void aw_dev_amppd(struct aw_device *aw_dev, bool amppd)
307 {
308 	struct aw_amppd_desc *amppd_desc = &aw_dev->amppd_desc;
309 
310 	aw_dev_dbg(aw_dev->dev, "enter");
311 	if (amppd) {
312 		aw_dev->ops.aw_reg_write_bits(aw_dev, amppd_desc->reg,
313 				amppd_desc->mask,
314 				amppd_desc->enable);
315 	} else {
316 		aw_dev->ops.aw_reg_write_bits(aw_dev, amppd_desc->reg,
317 				amppd_desc->mask,
318 				amppd_desc->disable);
319 	}
320 	aw_dev_info(aw_dev->dev, "done");
321 }
322 
323 
aw_dev_mute(struct aw_device * aw_dev,bool mute)324 void aw_dev_mute(struct aw_device *aw_dev, bool mute)
325 {
326 	struct aw_mute_desc *mute_desc = &aw_dev->mute_desc;
327 
328 	aw_dev_dbg(aw_dev->dev, "enter");
329 	if (mute || (aw_dev->cali_desc.cali_result == CALI_RESULT_ERROR)) {
330 		aw_dev_fade_out(aw_dev);
331 		aw_dev->ops.aw_reg_write_bits(aw_dev, mute_desc->reg,
332 				mute_desc->mask, mute_desc->enable);
333 	} else {
334 		aw_dev->ops.aw_reg_write_bits(aw_dev, mute_desc->reg,
335 				mute_desc->mask, mute_desc->disable);
336 		aw_dev_fade_in(aw_dev);
337 	}
338 	aw_dev_info(aw_dev->dev, "done");
339 }
340 
aw_dev_get_hmute(struct aw_device * aw_dev)341 int aw_dev_get_hmute(struct aw_device *aw_dev)
342 {
343 	uint16_t reg_val = 0;
344 	int ret;
345 	struct aw_mute_desc *desc = &aw_dev->mute_desc;
346 
347 	aw_dev_dbg(aw_dev->dev, "enter");
348 
349 	ret = aw_dev->ops.aw_reg_read(aw_dev, desc->reg, &reg_val);
350 	if (ret < 0)
351 		return ret;
352 
353 	if (reg_val & (~desc->mask))
354 		ret = 1;
355 	else
356 		ret = 0;
357 
358 	return ret;
359 }
360 
aw_dev_get_icalk(struct aw_device * aw_dev,int16_t * icalk)361 static int aw_dev_get_icalk(struct aw_device *aw_dev, int16_t *icalk)
362 {
363 	int ret = -1;
364 	uint16_t reg_val = 0;
365 	uint16_t reg_icalk = 0;
366 	struct aw_vcalb_desc *desc = &aw_dev->vcalb_desc;
367 
368 	ret = aw_dev->ops.aw_reg_read(aw_dev, desc->icalk_reg, &reg_val);
369 	if (ret < 0) {
370 		aw_dev_err(aw_dev->dev, "reg read failed");
371 		return ret;
372 	}
373 
374 	reg_icalk = reg_val & (~desc->icalk_reg_mask);
375 
376 	if (reg_icalk & (~desc->icalk_sign_mask))
377 		reg_icalk = reg_icalk | desc->icalk_neg_mask;
378 
379 	*icalk = (int16_t)reg_icalk;
380 
381 	return 0;
382 }
383 
aw_dev_get_vcalk(struct aw_device * aw_dev,int16_t * vcalk)384 static int aw_dev_get_vcalk(struct aw_device *aw_dev, int16_t *vcalk)
385 {
386 	int ret = -1;
387 	uint16_t reg_val = 0;
388 	uint16_t reg_vcalk = 0;
389 	struct aw_vcalb_desc *desc = &aw_dev->vcalb_desc;
390 
391 	ret = aw_dev->ops.aw_reg_read(aw_dev, desc->vcalk_reg, &reg_val);
392 	if (ret < 0) {
393 		aw_dev_err(aw_dev->dev, "reg read failed");
394 		return ret;
395 	}
396 
397 	reg_val = reg_val >> desc->vcalk_shift;
398 
399 	reg_vcalk = (uint16_t)reg_val & (~desc->vcalk_reg_mask);
400 
401 	if (reg_vcalk & (~desc->vcalk_sign_mask))
402 		reg_vcalk = reg_vcalk | desc->vcalk_neg_mask;
403 
404 	*vcalk = (int16_t)reg_vcalk;
405 
406 	return 0;
407 }
408 
aw_dev_get_vcalk_dac(struct aw_device * aw_dev,int16_t * vcalk)409 static int aw_dev_get_vcalk_dac(struct aw_device *aw_dev, int16_t *vcalk)
410 {
411 	int ret = -1;
412 	uint16_t reg_val = 0;
413 	uint16_t reg_vcalk = 0;
414 	struct aw_vcalb_desc *desc = &aw_dev->vcalb_desc;
415 
416 	ret = aw_dev->ops.aw_reg_read(aw_dev, desc->icalk_reg, &reg_val);
417 	if (ret < 0) {
418 		aw_dev_err(aw_dev->dev, "reg read failed");
419 		return ret;
420 	}
421 
422 	reg_vcalk = reg_val >> desc->vcalk_dac_shift;
423 
424 	if (reg_vcalk & desc->vcalk_dac_mask)
425 		reg_vcalk = reg_vcalk | desc->vcalk_dac_neg_mask;
426 
427 	*vcalk = (int16_t)reg_vcalk;
428 
429 	return 0;
430 }
431 
aw_dev_modify_dsp_cfg(struct aw_device * aw_dev,unsigned int addr,uint32_t dsp_data,unsigned char data_type)432 int aw_dev_modify_dsp_cfg(struct aw_device *aw_dev,
433 			unsigned int addr, uint32_t dsp_data, unsigned char data_type)
434 {
435 	uint32_t addr_offset = 0;
436 	int len = 0;
437 	uint8_t temp_data[4] = { 0 };
438 	struct aw_sec_data_desc *crc_dsp_cfg = &aw_dev->crc_dsp_cfg;
439 
440 	aw_dev_dbg(aw_dev->dev, "addr:0x%x, dsp_data:0x%x", addr, dsp_data);
441 	if (data_type == AW_DSP_16_DATA) {
442 		temp_data[0] = (uint8_t)(dsp_data & 0x00ff);
443 		temp_data[1] = (uint8_t)((dsp_data & 0xff00) >> 8);
444 		len = 2;
445 	} else if (data_type == AW_DSP_32_DATA) {
446 		temp_data[0] = (uint8_t)(dsp_data & 0x000000ff);
447 		temp_data[1] = (uint8_t)((dsp_data & 0x0000ff00) >> 8);
448 		temp_data[2] = (uint8_t)((dsp_data & 0x00ff0000) >> 16);
449 		temp_data[3] = (uint8_t)((dsp_data & 0xff000000) >> 24);
450 		len = 4;
451 	} else {
452 		aw_dev_err(aw_dev->dev, "data type[%d] unsupported", data_type);
453 		return -EINVAL;
454 	}
455 
456 	addr_offset = (addr - aw_dev->dsp_mem_desc.dsp_cfg_base_addr) * 2;
457 	if (addr_offset > crc_dsp_cfg->len) {
458 		aw_dev_err(aw_dev->dev, "addr_offset[%d] > crc_dsp_cfg->len[%d]",
459 				addr_offset, crc_dsp_cfg->len);
460 		return -EINVAL;
461 	}
462 
463 	memcpy(crc_dsp_cfg->data + addr_offset, temp_data, len);
464 	return 0;
465 }
466 
aw_dev_vsense_select(struct aw_device * aw_dev,int * vsense_select)467 static int aw_dev_vsense_select(struct aw_device *aw_dev, int *vsense_select)
468 {
469 	int ret = -1;
470 	struct aw_vcalb_desc *desc = &aw_dev->vcalb_desc;
471 	uint16_t vsense_reg_val;
472 
473 	ret = aw_dev->ops.aw_reg_read(aw_dev, desc->vcalb_vsense_reg, &vsense_reg_val);
474 	if (ret < 0) {
475 		aw_dev_err(aw_dev->dev, "read vsense_reg_val failed");
476 		return ret;
477 	}
478 	aw_dev_dbg(aw_dev->dev, "vsense_reg = 0x%x", vsense_reg_val);
479 
480 	if (vsense_reg_val & (~desc->vcalk_vdsel_mask)) {
481 		*vsense_select = AW_DEV_VDSEL_VSENSE;
482 		aw_dev_info(aw_dev->dev, "vsense outside");
483 		return 0;
484 	}
485 
486 	*vsense_select = AW_DEV_VDSEL_DAC;
487 	aw_dev_info(aw_dev->dev, "vsense inside");
488 	return 0;
489 }
490 
aw_dev_set_vcalb(struct aw_device * aw_dev)491 static int aw_dev_set_vcalb(struct aw_device *aw_dev)
492 {
493 	int ret = -1;
494 	uint32_t reg_val = 0;
495 	int vcalb;
496 	int icalk;
497 	int vcalk;
498 	int16_t icalk_val = 0;
499 	int16_t vcalk_val = 0;
500 	struct aw_vcalb_desc *desc = &aw_dev->vcalb_desc;
501 	uint32_t vcalb_adj;
502 	int vsense_select = -1;
503 
504 	ret = aw_dev->ops.aw_dsp_read(aw_dev, desc->vcalb_dsp_reg, &vcalb_adj, desc->data_type);
505 	if (ret < 0) {
506 		aw_dev_err(aw_dev->dev, "read vcalb_adj failed");
507 		return ret;
508 	}
509 
510 	ret = aw_dev_vsense_select(aw_dev, &vsense_select);
511 	aw_dev_dbg(aw_dev->dev, "vsense_select = %d", vsense_select);
512 	if (ret < 0) {
513 		return ret;
514 	}
515 
516 	aw_dev_get_icalk(aw_dev, &icalk_val);
517 	icalk = desc->cabl_base_value + desc->icalk_value_factor * icalk_val;
518 
519 	if (vsense_select == AW_DEV_VDSEL_VSENSE) {
520 		aw_dev_get_vcalk(aw_dev, &vcalk_val);
521 		vcalk = desc->cabl_base_value + desc->vcalk_value_factor * vcalk_val;
522 		vcalb = desc->vcal_factor * desc->vscal_factor /
523 			desc->iscal_factor * icalk / vcalk * vcalb_adj;
524 
525 		aw_dev_dbg(aw_dev->dev, "vcalk_factor=%d, vscal_factor=%d, icalk=%d, vcalk=%d",
526 				desc->vcalk_value_factor, desc->vscal_factor, icalk, vcalk);
527 	} else if (vsense_select == AW_DEV_VDSEL_DAC) {
528 		aw_dev_get_vcalk_dac(aw_dev, &vcalk_val);
529 		vcalk = desc->cabl_base_value + desc->vcalk_value_factor_vsense_in * vcalk_val;
530 		vcalb = desc->vcal_factor * desc->vscal_factor_vsense_in /
531 			desc->iscal_factor * icalk / vcalk * vcalb_adj;
532 
533 		aw_dev_dbg(aw_dev->dev, "vcalk_dac_factor=%d, vscal_dac_factor=%d, icalk=%d, vcalk=%d",
534 				desc->vcalk_value_factor_vsense_in, desc->vscal_factor_vsense_in, icalk, vcalk);
535 	} else {
536 		aw_dev_err(aw_dev->dev, "unsupport vsense status");
537 		return -EINVAL;
538 	}
539 
540 	if ((vcalk == 0) || (desc->iscal_factor == 0)) {
541 		aw_dev_err(aw_dev->dev, "vcalk:%d or desc->iscal_factor:%d unsupported",
542 			vcalk, desc->iscal_factor);
543 		return -EINVAL;
544 	}
545 
546 	vcalb = vcalb >> aw_dev->vcalb_desc.vcalb_adj_shift;
547 	reg_val = (uint32_t)vcalb;
548 
549 	aw_dev_dbg(aw_dev->dev, "vcalb=%d, reg_val=0x%x, vcalb_adj =0x%x", vcalb, reg_val, vcalb_adj);
550 
551 	ret = aw_dev->ops.aw_dsp_write(aw_dev, desc->vcalb_dsp_reg, reg_val, desc->data_type);
552 	if (ret < 0) {
553 		aw_dev_err(aw_dev->dev, "write vcalb failed");
554 		return ret;
555 	}
556 
557 	ret = aw_dev_modify_dsp_cfg(aw_dev, desc->vcalb_dsp_reg,
558 					(uint32_t)reg_val, desc->data_type);
559 	if (ret < 0) {
560 		aw_dev_err(aw_dev->dev, "modify dsp cfg failed");
561 		return ret;
562 	}
563 
564 	aw_dev_info(aw_dev->dev, "done");
565 
566 	return ret;
567 }
568 
aw_dev_get_cali_f0_delay(struct aw_device * aw_dev)569 static int aw_dev_get_cali_f0_delay(struct aw_device *aw_dev)
570 {
571 	struct aw_cali_delay_desc *desc = &aw_dev->cali_delay_desc;
572 	uint32_t cali_delay = 0;
573 	int ret = -1;
574 
575 	ret = aw_dev->ops.aw_dsp_read(aw_dev,
576 			desc->dsp_reg, &cali_delay, desc->data_type);
577 	if (ret < 0) {
578 		aw_dev_err(aw_dev->dev, "read cali delay failed, ret=%d", ret);
579 		return ret;
580 	}
581 
582 	desc->delay = AW_CALI_DELAY_CACL(cali_delay);
583 	aw_dev_info(aw_dev->dev, "read cali delay: %d ms", desc->delay);
584 
585 	return 0;
586 }
587 
aw_dev_get_int_status(struct aw_device * aw_dev,uint16_t * int_status)588 int aw_dev_get_int_status(struct aw_device *aw_dev, uint16_t *int_status)
589 {
590 	int ret = -1;
591 	uint16_t reg_val = 0;
592 
593 	ret = aw_dev->ops.aw_reg_read(aw_dev, aw_dev->int_desc.st_reg, &reg_val);
594 	if (ret < 0)
595 		aw_dev_err(aw_dev->dev, "read interrupt reg fail, ret=%d", ret);
596 	else
597 		*int_status = reg_val;
598 
599 	aw_dev_dbg(aw_dev->dev, "read interrupt reg = 0x%04x", *int_status);
600 	return ret;
601 }
602 
aw_dev_clear_int_status(struct aw_device * aw_dev)603 void aw_dev_clear_int_status(struct aw_device *aw_dev)
604 {
605 	uint16_t int_status = 0;
606 
607 	/*read int status and clear*/
608 	aw_dev_get_int_status(aw_dev, &int_status);
609 	/*make sure int status is clear*/
610 	aw_dev_get_int_status(aw_dev, &int_status);
611 	aw_dev_info(aw_dev->dev, "done");
612 }
613 
614 
aw_dev_get_iis_status(struct aw_device * aw_dev)615 int aw_dev_get_iis_status(struct aw_device *aw_dev)
616 {
617 	int ret = -1;
618 	uint16_t reg_val = 0;
619 	struct aw_sysst_desc *desc = &aw_dev->sysst_desc;
620 
621 	aw_dev_dbg(aw_dev->dev, "enter");
622 
623 	aw_dev->ops.aw_reg_read(aw_dev, desc->reg, &reg_val);
624 	if ((reg_val & desc->pll_check) == desc->pll_check)
625 		ret = 0;
626 	else
627 		aw_dev_err(aw_dev->dev, "check pll lock fail,reg_val:0x%04x", reg_val);
628 
629 	return ret;
630 }
631 
632 
aw_dev_mode1_pll_check(struct aw_device * aw_dev)633 static int aw_dev_mode1_pll_check(struct aw_device *aw_dev)
634 {
635 	int ret = -1;
636 	uint16_t i = 0;
637 
638 	for (i = 0; i < AW_DEV_SYSST_CHECK_MAX; i++) {
639 		ret = aw_dev_get_iis_status(aw_dev);
640 		if (ret < 0) {
641 			aw_dev_err(aw_dev->dev, "mode1 iis signal check error");
642 			usleep_range(AW_2000_US, AW_2000_US + 10);
643 		} else {
644 			return 0;
645 		}
646 	}
647 
648 	return ret;
649 }
650 
aw_dev_mode2_pll_check(struct aw_device * aw_dev)651 static int aw_dev_mode2_pll_check(struct aw_device *aw_dev)
652 {
653 	int ret = -1;
654 	uint16_t i = 0;
655 	uint16_t reg_val = 0;
656 	struct aw_cco_mux_desc *cco_mux_desc = &aw_dev->cco_mux_desc;
657 
658 	aw_dev->ops.aw_reg_read(aw_dev, cco_mux_desc->reg, &reg_val);
659 	reg_val &= (~cco_mux_desc->mask);
660 	if (reg_val == cco_mux_desc->divider) {
661 		aw_dev_dbg(aw_dev->dev, "CCO_MUX is already divider");
662 		return ret;
663 	}
664 
665 	/* change mode2 */
666 	aw_dev->ops.aw_reg_write_bits(aw_dev, cco_mux_desc->reg,
667 		cco_mux_desc->mask, cco_mux_desc->divider);
668 
669 	for (i = 0; i < AW_DEV_SYSST_CHECK_MAX; i++) {
670 		ret = aw_dev_get_iis_status(aw_dev);
671 		if (ret < 0) {
672 			aw_dev_err(aw_dev->dev, "mode2 iis signal check error");
673 			usleep_range(AW_2000_US, AW_2000_US + 10);
674 		} else {
675 			break;
676 		}
677 	}
678 
679 	/* change mode1*/
680 	aw_dev->ops.aw_reg_write_bits(aw_dev, cco_mux_desc->reg,
681 		cco_mux_desc->mask, cco_mux_desc->bypass);
682 
683 	if (ret == 0) {
684 		usleep_range(AW_2000_US, AW_2000_US + 10);
685 		for (i = 0; i < AW_DEV_SYSST_CHECK_MAX; i++) {
686 			ret = aw_dev_mode1_pll_check(aw_dev);
687 			if (ret < 0) {
688 				aw_dev_err(aw_dev->dev, "mode2 switch to mode1, iis signal check error");
689 				usleep_range(AW_2000_US, AW_2000_US + 10);
690 			} else {
691 				break;
692 			}
693 		}
694 	}
695 
696 	return ret;
697 }
698 
aw_dev_syspll_check(struct aw_device * aw_dev)699 int aw_dev_syspll_check(struct aw_device *aw_dev)
700 {
701 	int ret = -1;
702 
703 	ret = aw_dev_mode1_pll_check(aw_dev);
704 	if (ret < 0) {
705 		aw_dev_info(aw_dev->dev, "mode1 check iis failed try switch to mode2 check");
706 		ret = aw_dev_mode2_pll_check(aw_dev);
707 		if (ret < 0) {
708 			aw_dev_err(aw_dev->dev, "mode2 check iis failed");
709 			return ret;
710 		}
711 	}
712 
713 	return ret;
714 }
715 
aw_dev_sysst_check(struct aw_device * aw_dev)716 int aw_dev_sysst_check(struct aw_device *aw_dev)
717 {
718 	int ret = -1;
719 	unsigned char i;
720 	uint16_t reg_val = 0;
721 	struct aw_sysst_desc *desc = &aw_dev->sysst_desc;
722 
723 	for (i = 0; i < AW_DEV_SYSST_CHECK_MAX; i++) {
724 		aw_dev->ops.aw_reg_read(aw_dev, desc->reg, &reg_val);
725 		if (((reg_val & (~desc->st_mask)) & desc->st_check) == desc->st_check) {
726 			ret = 0;
727 			break;
728 		} else {
729 			aw_dev_dbg(aw_dev->dev, "check fail, cnt=%d, reg_val=0x%04x",
730 				i, reg_val);
731 			usleep_range(AW_2000_US, AW_2000_US + 10);
732 		}
733 	}
734 	if (ret < 0)
735 		aw_dev_err(aw_dev->dev, "check fail");
736 
737 	return ret;
738 }
739 
aw_dev_get_monitor_sysint_st(struct aw_device * aw_dev)740 static int aw_dev_get_monitor_sysint_st(struct aw_device *aw_dev)
741 {
742 	int ret = 0;
743 	struct aw_int_desc *desc = &aw_dev->int_desc;
744 
745 	if ((desc->intst_mask) & (desc->sysint_st)) {
746 		aw_dev_err(aw_dev->dev,
747 			"monitor check fail:0x%04x", desc->sysint_st);
748 		ret = -EINVAL;
749 	}
750 	desc->sysint_st = 0;
751 
752 	return ret;
753 }
754 
aw_dev_sysint_check(struct aw_device * aw_dev)755 static int aw_dev_sysint_check(struct aw_device *aw_dev)
756 {
757 	int ret = 0;
758 	uint16_t reg_val = 0;
759 	struct aw_int_desc *desc = &aw_dev->int_desc;
760 
761 	aw_dev_get_int_status(aw_dev, &reg_val);
762 
763 	if (reg_val & (desc->intst_mask)) {
764 		aw_dev_err(aw_dev->dev, "pa stop check fail:0x%04x", reg_val);
765 		ret = -EINVAL;
766 	}
767 
768 	return ret;
769 }
770 
aw_dev_get_cur_mode_st(struct aw_device * aw_dev)771 static void aw_dev_get_cur_mode_st(struct aw_device *aw_dev)
772 {
773 	uint16_t reg_val;
774 	struct aw_profctrl_desc *profctrl_desc = &aw_dev->profctrl_desc;
775 
776 	aw_dev->ops.aw_reg_read(aw_dev, aw_dev->pwd_desc.reg, &reg_val);
777 
778 	if ((reg_val & (~profctrl_desc->mask)) == profctrl_desc->rcv_mode_val)
779 		profctrl_desc->cur_mode = AW_RCV_MODE;
780 	else
781 		profctrl_desc->cur_mode = AW_NOT_RCV_MODE;
782 }
783 
aw_dev_set_intmask(struct aw_device * aw_dev,bool flag)784 int aw_dev_set_intmask(struct aw_device *aw_dev, bool flag)
785 {
786 	int ret = -1;
787 	struct aw_int_desc *desc = &aw_dev->int_desc;
788 
789 	if (flag)
790 		ret = aw_dev->ops.aw_reg_write(aw_dev, desc->mask_reg,
791 					desc->int_mask);
792 	else
793 		ret = aw_dev->ops.aw_reg_write(aw_dev, desc->mask_reg,
794 					desc->mask_default);
795 
796 	aw_dev_info(aw_dev->dev, "done");
797 	return ret;
798 }
799 
aw_dev_dsp_enable(struct aw_device * aw_dev,bool dsp)800 void aw_dev_dsp_enable(struct aw_device *aw_dev, bool dsp)
801 {
802 	int ret = -1;
803 	struct aw_dsp_en_desc *desc = &aw_dev->dsp_en_desc;
804 
805 	if (dsp) {
806 		ret = aw_dev->ops.aw_reg_write_bits(aw_dev, desc->reg,
807 					desc->mask, desc->enable);
808 		if (ret < 0)
809 			aw_dev_err(aw_dev->dev, "enable dsp failed");
810 	} else {
811 		ret = aw_dev->ops.aw_reg_write_bits(aw_dev, desc->reg,
812 					desc->mask, desc->disable);
813 		if (ret < 0)
814 			aw_dev_err(aw_dev->dev, "disable dsp failed");
815 	}
816 
817 	aw_dev_info(aw_dev->dev, "done");
818 }
819 
aw_dev_get_dsp_config(struct aw_device * aw_dev,unsigned char * dsp_cfg)820 static int aw_dev_get_dsp_config(struct aw_device *aw_dev, unsigned char *dsp_cfg)
821 {
822 	int ret = -1;
823 	uint16_t reg_val = 0;
824 	struct aw_dsp_en_desc *desc = &aw_dev->dsp_en_desc;
825 
826 	ret = aw_dev->ops.aw_reg_read(aw_dev, desc->reg, &reg_val);
827 	if (ret < 0) {
828 		aw_dev_err(aw_dev->dev, "reg read failed");
829 		return ret;
830 	}
831 
832 	if (reg_val & (~desc->mask))
833 		*dsp_cfg = AW_DEV_DSP_BYPASS;
834 	else
835 		*dsp_cfg = AW_DEV_DSP_WORK;
836 
837 	aw_dev_info(aw_dev->dev, "done");
838 
839 	return 0;
840 }
841 
aw_dev_memclk_select(struct aw_device * aw_dev,unsigned char flag)842 void aw_dev_memclk_select(struct aw_device *aw_dev, unsigned char flag)
843 {
844 	struct aw_memclk_desc *desc = &aw_dev->memclk_desc;
845 	int ret = -1;
846 
847 	if (flag == AW_DEV_MEMCLK_PLL) {
848 		ret = aw_dev->ops.aw_reg_write_bits(aw_dev, desc->reg,
849 					desc->mask, desc->mcu_hclk);
850 		if (ret < 0)
851 			aw_dev_err(aw_dev->dev, "memclk select pll failed");
852 
853 	} else if (flag == AW_DEV_MEMCLK_OSC) {
854 		ret = aw_dev->ops.aw_reg_write_bits(aw_dev, desc->reg,
855 					desc->mask, desc->osc_clk);
856 		if (ret < 0)
857 			aw_dev_err(aw_dev->dev, "memclk select OSC failed");
858 	} else {
859 		aw_dev_err(aw_dev->dev, "unknown memclk config, flag=0x%x", flag);
860 	}
861 
862 	aw_dev_info(aw_dev->dev, "done");
863 }
864 
aw_dev_get_dsp_status(struct aw_device * aw_dev)865 int aw_dev_get_dsp_status(struct aw_device *aw_dev)
866 {
867 	int ret = -1;
868 	uint16_t reg_val = 0;
869 	struct aw_watch_dog_desc *desc = &aw_dev->watch_dog_desc;
870 
871 	aw_dev_info(aw_dev->dev, "enter");
872 
873 	aw_dev->ops.aw_reg_read(aw_dev, desc->reg, &reg_val);
874 	if (reg_val & (~desc->mask))
875 		ret = 0;
876 
877 	return ret;
878 }
879 
aw_dev_get_vmax(struct aw_device * aw_dev,unsigned int * vmax)880 static int aw_dev_get_vmax(struct aw_device *aw_dev, unsigned int *vmax)
881 {
882 	int ret = -1;
883 	struct aw_vmax_desc *desc = &aw_dev->vmax_desc;
884 
885 	ret = aw_dev->ops.aw_dsp_read(aw_dev, desc->dsp_reg, vmax, desc->data_type);
886 	if (ret < 0) {
887 		aw_dev_err(aw_dev->dev, "get vmax failed");
888 		return ret;
889 	}
890 
891 	return 0;
892 }
893 
894 
895 /******************************************************
896  *
897  * aw_dev update cfg
898  *
899  ******************************************************/
900 
aw_dev_reg_container_update(struct aw_device * aw_dev,uint8_t * data,uint32_t len)901 static int aw_dev_reg_container_update(struct aw_device *aw_dev,
902 				uint8_t *data, uint32_t len)
903 {
904 	int i, ret = 0;
905 	uint8_t reg_addr = 0;
906 	uint16_t reg_val = 0;
907 	uint16_t read_val;
908 	struct aw_int_desc *int_desc = &aw_dev->int_desc;
909 	int16_t *reg_data = NULL;
910 	int data_len;
911 
912 	aw_dev_dbg(aw_dev->dev, "enter");
913 	reg_data = (int16_t *)data;
914 	data_len = len >> 1;
915 
916 	if (data_len % 2 != 0) {
917 		aw_dev_err(aw_dev->dev, "data len:%d unsupported",
918 				data_len);
919 		return -EINVAL;
920 	}
921 
922 	for (i = 0; i < data_len; i += 2) {
923 		reg_addr = reg_data[i];
924 		reg_val = reg_data[i + 1];
925 		aw_dev_dbg(aw_dev->dev, "reg = 0x%02x, val = 0x%04x",
926 				reg_addr, reg_val);
927 		if (reg_addr == int_desc->mask_reg) {
928 			int_desc->int_mask = reg_val;
929 			reg_val = int_desc->mask_default;
930 		}
931 		if (reg_addr == aw_dev->mute_desc.reg) {
932 			aw_dev->ops.aw_reg_read(aw_dev, reg_addr, &read_val);
933 			read_val &= (~aw_dev->mute_desc.mask);
934 			reg_val &= aw_dev->mute_desc.mask;
935 			reg_val |= read_val;
936 		}
937 		if (reg_addr == aw_dev->dsp_crc_desc.ctl_reg) {
938 			reg_val &= aw_dev->dsp_crc_desc.ctl_mask;
939 		}
940 
941 		if (reg_addr == aw_dev->chansel_desc.txchan_reg) {
942 			/*close tx*/
943 			reg_val &= aw_dev->tx_en_desc.tx_en_mask;
944 			reg_val |= aw_dev->tx_en_desc.tx_disable;
945 		}
946 
947 		ret = aw_dev->ops.aw_reg_write(aw_dev, reg_addr, reg_val);
948 		if (ret < 0)
949 			break;
950 
951 	}
952 
953 	aw_hold_reg_spin_st(&aw_dev->spin_desc);
954 
955 	aw_dev_get_cur_mode_st(aw_dev);
956 
957 	aw_dev->ops.aw_get_volume(aw_dev, (uint16_t *)&aw_dev->volume_desc.init_volume);
958 
959 	/*keep min volume*/
960 	if (aw_dev->fade_en)
961 		aw_dev->ops.aw_set_volume(aw_dev, aw_dev->volume_desc.mute_volume);
962 
963 	aw_dev_get_dsp_config(aw_dev, &aw_dev->dsp_cfg);
964 
965 	aw_dev_dbg(aw_dev->dev, "exit");
966 
967 	return ret;
968 }
969 
aw_dev_reg_update(struct aw_device * aw_dev,uint8_t * data,uint32_t len)970 static int aw_dev_reg_update(struct aw_device *aw_dev,
971 					uint8_t *data, uint32_t len)
972 {
973 
974 	aw_dev_dbg(aw_dev->dev, "reg len:%d", len);
975 
976 	if (len && (data != NULL)) {
977 		aw_dev_reg_container_update(aw_dev, data, len);
978 	} else {
979 		aw_dev_err(aw_dev->dev, "reg data is null or len is 0");
980 		return -EPERM;
981 	}
982 
983 	return 0;
984 }
985 
aw_dev_dsp_container_update(struct aw_device * aw_dev,uint8_t * data,uint32_t len,uint16_t base)986 static int aw_dev_dsp_container_update(struct aw_device *aw_dev,
987 			uint8_t *data, uint32_t len, uint16_t base)
988 {
989 	int i;
990 	struct aw_dsp_mem_desc *dsp_mem_desc = &aw_dev->dsp_mem_desc;
991 #ifdef AW_DSP_I2C_WRITES
992 	uint32_t tmp_len = 0;
993 #else
994 	uint16_t reg_val = 0;
995 #endif
996 
997 	aw_dev_dbg(aw_dev->dev, "enter");
998 	mutex_lock(aw_dev->i2c_lock);
999 #ifdef AW_DSP_I2C_WRITES
1000 	/* i2c writes */
1001 	aw_dev->ops.aw_i2c_write(aw_dev, dsp_mem_desc->dsp_madd_reg, base);
1002 
1003 	for (i = 0; i < len; i += AW_MAX_RAM_WRITE_BYTE_SIZE) {
1004 		if ((len - i) < AW_MAX_RAM_WRITE_BYTE_SIZE)
1005 			tmp_len = len - i;
1006 		else
1007 			tmp_len = AW_MAX_RAM_WRITE_BYTE_SIZE;
1008 		aw_dev->ops.aw_i2c_writes(aw_dev, dsp_mem_desc->dsp_mdat_reg,
1009 					&data[i], tmp_len);
1010 	}
1011 
1012 #else
1013 	/* i2c write */
1014 	aw_dev->ops.aw_i2c_write(aw_dev, dsp_mem_desc->dsp_madd_reg, base);
1015 	for (i = 0; i < len; i += 2) {
1016 		reg_val = (data[i] << 8) + data[i + 1];
1017 		aw_dev->ops.aw_i2c_write(aw_dev, dsp_mem_desc->dsp_mdat_reg,
1018 					reg_val);
1019 	}
1020 #endif
1021 	mutex_unlock(aw_dev->i2c_lock);
1022 	aw_dev_dbg(aw_dev->dev, "exit");
1023 
1024 	return 0;
1025 }
1026 
aw_dev_dsp_fw_update(struct aw_device * aw_dev,uint8_t * data,uint32_t len)1027 int aw_dev_dsp_fw_update(struct aw_device *aw_dev,
1028 			uint8_t *data, uint32_t len)
1029 {
1030 	struct aw_dsp_mem_desc *dsp_mem_desc = &aw_dev->dsp_mem_desc;
1031 
1032 	aw_dev_dbg(aw_dev->dev, "dsp firmware len:%d", len);
1033 
1034 	if (len && (data != NULL)) {
1035 		aw_dev_dsp_container_update(aw_dev,
1036 			data, len, dsp_mem_desc->dsp_fw_base_addr);
1037 		aw_dev->dsp_fw_len = len;
1038 	} else {
1039 		aw_dev_err(aw_dev->dev, "dsp firmware data is null or len is 0");
1040 		return -EPERM;
1041 	}
1042 
1043 	return 0;
1044 }
1045 
aw_dev_copy_to_crc_dsp_cfg(struct aw_device * aw_dev,uint8_t * data,uint32_t size)1046 static int aw_dev_copy_to_crc_dsp_cfg(struct aw_device *aw_dev,
1047 			uint8_t *data, uint32_t size)
1048 {
1049 	struct aw_sec_data_desc *crc_dsp_cfg = &aw_dev->crc_dsp_cfg;
1050 	int ret;
1051 
1052 	if (crc_dsp_cfg->data == NULL) {
1053 		crc_dsp_cfg->data = devm_kzalloc(aw_dev->dev, size, GFP_KERNEL);
1054 		if (!crc_dsp_cfg->data) {
1055 			aw_dev_err(aw_dev->dev, "error allocating memory");
1056 			return -ENOMEM;
1057 		}
1058 		crc_dsp_cfg->len = size;
1059 	} else if (crc_dsp_cfg->len < size) {
1060 		devm_kfree(aw_dev->dev, crc_dsp_cfg->data);
1061 		crc_dsp_cfg->data = NULL;
1062 		crc_dsp_cfg->data = devm_kzalloc(aw_dev->dev, size, GFP_KERNEL);
1063 		if (!crc_dsp_cfg->data) {
1064 			aw_dev_err(aw_dev->dev, "error allocating memory");
1065 			return -ENOMEM;
1066 		}
1067 	}
1068 	memcpy(crc_dsp_cfg->data, data, size);
1069 	ret = aw_dev_dsp_data_order(aw_dev, crc_dsp_cfg->data, size);
1070 	if (ret < 0)
1071 		return ret;
1072 
1073 	return 0;
1074 }
1075 
1076 
aw_dev_dsp_cfg_update(struct aw_device * aw_dev,uint8_t * data,uint32_t len)1077 int aw_dev_dsp_cfg_update(struct aw_device *aw_dev,
1078 			uint8_t *data, uint32_t len)
1079 {
1080 	struct aw_dsp_mem_desc *dsp_mem_desc = &aw_dev->dsp_mem_desc;
1081 	int ret;
1082 
1083 	aw_dev_dbg(aw_dev->dev, "dsp config len:%d", len);
1084 
1085 	if (len && (data != NULL)) {
1086 		aw_dev_dsp_container_update(aw_dev,
1087 			data, len, dsp_mem_desc->dsp_cfg_base_addr);
1088 		aw_dev->dsp_cfg_len = len;
1089 
1090 		ret = aw_dev_copy_to_crc_dsp_cfg(aw_dev, data, len);
1091 		if (ret < 0)
1092 			return ret;
1093 
1094 		aw_dev_set_vcalb(aw_dev);
1095 		aw_cali_svc_get_ra(&aw_dev->cali_desc);
1096 		aw_dev_get_cali_f0_delay(aw_dev);
1097 
1098 		if (aw_dev->ops.aw_get_hw_mon_st) {
1099 			ret = aw_dev->ops.aw_get_hw_mon_st(aw_dev,
1100 					&aw_dev->monitor_desc.hw_mon_en,
1101 					&aw_dev->monitor_desc.hw_temp_flag);
1102 			if (ret < 0)
1103 				return ret;
1104 		}
1105 
1106 		ret = aw_dev_get_vmax(aw_dev, &aw_dev->vmax_desc.init_vmax);
1107 		if (ret < 0) {
1108 			aw_dev_err(aw_dev->dev, "get vmax failed");
1109 			return ret;
1110 		} else {
1111 			aw_dev_info(aw_dev->dev, "get init vmax:0x%x",
1112 						aw_dev->vmax_desc.init_vmax);
1113 		}
1114 
1115 		aw_dev->dsp_crc_st = AW_DSP_CRC_NA;
1116 	} else {
1117 		aw_dev_err(aw_dev->dev, "dsp config data is null or len is 0");
1118 		return -EPERM;
1119 	}
1120 
1121 	return 0;
1122 }
1123 
aw_dev_sram_check(struct aw_device * aw_dev)1124 static int aw_dev_sram_check(struct aw_device *aw_dev)
1125 {
1126 	int ret = -1;
1127 	uint16_t reg_val = 0;
1128 	struct aw_dsp_mem_desc *dsp_mem_desc = &aw_dev->dsp_mem_desc;
1129 
1130 	mutex_lock(aw_dev->i2c_lock);
1131 	/*check the odd bits of reg 0x40*/
1132 	aw_dev->ops.aw_i2c_write(aw_dev, dsp_mem_desc->dsp_madd_reg,
1133 					AW_DSP_ODD_NUM_BIT_TEST);
1134 	aw_dev->ops.aw_i2c_read(aw_dev, dsp_mem_desc->dsp_madd_reg, &reg_val);
1135 	if (AW_DSP_ODD_NUM_BIT_TEST != reg_val) {
1136 		aw_dev_err(aw_dev->dev, "check reg 0x40 odd bit failed, read[0x%x] does not match write[0x%x]",
1137 				reg_val, AW_DSP_ODD_NUM_BIT_TEST);
1138 		goto error;
1139 	}
1140 
1141 	/*check the even bits of reg 0x40*/
1142 	aw_dev->ops.aw_i2c_write(aw_dev, dsp_mem_desc->dsp_madd_reg,
1143 					AW_DSP_EVEN_NUM_BIT_TEST);
1144 	aw_dev->ops.aw_i2c_read(aw_dev, dsp_mem_desc->dsp_madd_reg, &reg_val);
1145 	if (AW_DSP_EVEN_NUM_BIT_TEST != reg_val) {
1146 		aw_dev_err(aw_dev->dev, "check reg 0x40 even bit failed, read[0x%x] does not match write[0x%x]",
1147 				reg_val, AW_DSP_EVEN_NUM_BIT_TEST);
1148 		goto error;
1149 	}
1150 
1151 	/*check dsp_fw_base_addr*/
1152 	aw_dev->ops.aw_i2c_write(aw_dev, dsp_mem_desc->dsp_madd_reg,
1153 					dsp_mem_desc->dsp_fw_base_addr);
1154 	aw_dev->ops.aw_i2c_write(aw_dev, dsp_mem_desc->dsp_mdat_reg,
1155 					AW_DSP_EVEN_NUM_BIT_TEST);
1156 
1157 	aw_dev->ops.aw_i2c_write(aw_dev, dsp_mem_desc->dsp_madd_reg,
1158 					dsp_mem_desc->dsp_fw_base_addr);
1159 	aw_dev->ops.aw_i2c_read(aw_dev, dsp_mem_desc->dsp_mdat_reg, &reg_val);
1160 	if (AW_DSP_EVEN_NUM_BIT_TEST != reg_val) {
1161 		aw_dev_err(aw_dev->dev, "check dsp fw addr failed, read[0x%x] does not match write[0x%x]",
1162 						reg_val, AW_DSP_EVEN_NUM_BIT_TEST);
1163 		goto error;
1164 	}
1165 
1166 	/*check dsp_cfg_base_addr*/
1167 	aw_dev->ops.aw_i2c_write(aw_dev, dsp_mem_desc->dsp_madd_reg,
1168 					dsp_mem_desc->dsp_cfg_base_addr);
1169 	aw_dev->ops.aw_i2c_write(aw_dev, dsp_mem_desc->dsp_mdat_reg,
1170 					AW_DSP_ODD_NUM_BIT_TEST);
1171 
1172 	aw_dev->ops.aw_i2c_write(aw_dev, dsp_mem_desc->dsp_madd_reg,
1173 					dsp_mem_desc->dsp_cfg_base_addr);
1174 	aw_dev->ops.aw_i2c_read(aw_dev, dsp_mem_desc->dsp_mdat_reg, &reg_val);
1175 	if (AW_DSP_ODD_NUM_BIT_TEST != reg_val) {
1176 		aw_dev_err(aw_dev->dev, "check dsp cfg failed, read[0x%x] does not match write[0x%x]",
1177 						reg_val, AW_DSP_ODD_NUM_BIT_TEST);
1178 		goto error;
1179 	}
1180 
1181 	mutex_unlock(aw_dev->i2c_lock);
1182 	return 0;
1183 
1184 error:
1185 	mutex_unlock(aw_dev->i2c_lock);
1186 	return ret;
1187 }
1188 
aw_dev_fw_update(struct aw_device * aw_dev,bool up_dsp_fw_en,bool force_up_en)1189 int aw_dev_fw_update(struct aw_device *aw_dev, bool up_dsp_fw_en, bool force_up_en)
1190 {
1191 	int ret = -1;
1192 	struct aw_prof_desc *set_prof_desc = NULL;
1193 	struct aw_sec_data_desc *sec_desc = NULL;
1194 	char *prof_name = NULL;
1195 
1196 	if ((aw_dev->cur_prof == aw_dev->set_prof) &&
1197 			(force_up_en == AW_FORCE_UPDATE_OFF)) {
1198 		aw_dev_info(aw_dev->dev, "scene no change, not update");
1199 		return 0;
1200 	}
1201 
1202 	if (aw_dev->fw_status == AW_DEV_FW_FAILED) {
1203 		aw_dev_err(aw_dev->dev, "fw status[%d] error", aw_dev->fw_status);
1204 		return -EPERM;
1205 	}
1206 
1207 	prof_name = aw_dev_get_prof_name(aw_dev, aw_dev->set_prof);
1208 	if (prof_name == NULL)
1209 		return -ENOMEM;
1210 
1211 	aw_dev_info(aw_dev->dev, "start update %s", prof_name);
1212 
1213 	ret = aw_dev_get_prof_data(aw_dev, aw_dev->set_prof, &set_prof_desc);
1214 	if (ret < 0)
1215 		return ret;
1216 
1217 	/*update reg*/
1218 	sec_desc = set_prof_desc->sec_desc;
1219 	ret = aw_dev_reg_update(aw_dev, sec_desc[AW_DATA_TYPE_REG].data,
1220 					sec_desc[AW_DATA_TYPE_REG].len);
1221 	if (ret < 0) {
1222 		aw_dev_err(aw_dev->dev, "update reg failed");
1223 		return ret;
1224 	}
1225 
1226 	aw_dev_mute(aw_dev, true);
1227 
1228 	if (aw_dev->dsp_cfg == AW_DEV_DSP_WORK)
1229 		aw_dev_dsp_enable(aw_dev, false);
1230 
1231 	aw_dev_memclk_select(aw_dev, AW_DEV_MEMCLK_OSC);
1232 
1233 	if (up_dsp_fw_en) {
1234 		ret = aw_dev_sram_check(aw_dev);
1235 		if (ret < 0) {
1236 			aw_dev_err(aw_dev->dev, "check sram failed");
1237 			goto error;
1238 		}
1239 
1240 		/*update dsp firmware*/
1241 		aw_dev_info(aw_dev->dev, "fw_ver: [%x]", set_prof_desc->fw_ver);
1242 		ret = aw_dev_dsp_fw_update(aw_dev, sec_desc[AW_DATA_TYPE_DSP_FW].data,
1243 					sec_desc[AW_DATA_TYPE_DSP_FW].len);
1244 		if (ret < 0) {
1245 			aw_dev_err(aw_dev->dev, "update dsp fw failed");
1246 			goto error;
1247 		}
1248 	}
1249 
1250 	/*update dsp config*/
1251 	ret = aw_dev_dsp_cfg_update(aw_dev, sec_desc[AW_DATA_TYPE_DSP_CFG].data,
1252 					sec_desc[AW_DATA_TYPE_DSP_CFG].len);
1253 	if (ret < 0) {
1254 		aw_dev_err(aw_dev->dev, "update dsp cfg failed");
1255 		goto error;
1256 	}
1257 
1258 	aw_dev_memclk_select(aw_dev, AW_DEV_MEMCLK_PLL);
1259 
1260 	aw_dev->cur_prof = aw_dev->set_prof;
1261 
1262 	aw_dev_info(aw_dev->dev, "load %s done", prof_name);
1263 	return 0;
1264 
1265 error:
1266 	aw_dev_memclk_select(aw_dev, AW_DEV_MEMCLK_PLL);
1267 
1268 	return ret;
1269 }
1270 
aw_dev_dsp_check(struct aw_device * aw_dev)1271 int aw_dev_dsp_check(struct aw_device *aw_dev)
1272 {
1273 	int ret = -1;
1274 	uint16_t i = 0;
1275 
1276 	aw_dev_dbg(aw_dev->dev, "enter");
1277 
1278 	if (aw_dev->dsp_cfg == AW_DEV_DSP_BYPASS) {
1279 		aw_dev_dbg(aw_dev->dev, "dsp bypass");
1280 		return 0;
1281 	} else if (aw_dev->dsp_cfg == AW_DEV_DSP_WORK) {
1282 		for (i = 0; i < AW_DEV_DSP_CHECK_MAX; i++) {
1283 			aw_dev_dsp_enable(aw_dev, false);
1284 			aw_dev_dsp_enable(aw_dev, true);
1285 			usleep_range(AW_1000_US, AW_1000_US + 10);
1286 			ret = aw_dev_get_dsp_status(aw_dev);
1287 			if (ret < 0) {
1288 				aw_dev_err(aw_dev->dev, "dsp wdt status error=%d", ret);
1289 				usleep_range(AW_2000_US, AW_2000_US + 10);
1290 			} else {
1291 				return 0;
1292 			}
1293 		}
1294 	} else {
1295 		aw_dev_err(aw_dev->dev, "unknown dsp cfg=%d", aw_dev->dsp_cfg);
1296 		return -EINVAL;
1297 	}
1298 
1299 	return -EINVAL;
1300 }
1301 
aw_dev_set_cfg_f0_fs(struct aw_device * aw_dev)1302 static int aw_dev_set_cfg_f0_fs(struct aw_device *aw_dev)
1303 {
1304 	uint32_t f0_fs = 0;
1305 	struct aw_cfgf0_fs_desc *cfgf0_fs_desc = &aw_dev->cfgf0_fs_desc;
1306 	int ret;
1307 
1308 	if (aw_dev->ops.aw_set_cfg_f0_fs) {
1309 		aw_dev->ops.aw_set_cfg_f0_fs(aw_dev, &f0_fs);
1310 		ret = aw_dev_modify_dsp_cfg(aw_dev, cfgf0_fs_desc->dsp_reg,
1311 					f0_fs, cfgf0_fs_desc->data_type);
1312 		if (ret < 0) {
1313 			aw_dev_err(aw_dev->dev, "modify dsp cfg failed");
1314 			return ret;
1315 		}
1316 	}
1317 
1318 	return 0;
1319 }
1320 
aw_dev_cali_re_update(struct aw_cali_desc * cali_desc)1321 static void aw_dev_cali_re_update(struct aw_cali_desc *cali_desc)
1322 {
1323 	struct aw_device *aw_dev =
1324 		container_of(cali_desc, struct aw_device, cali_desc);
1325 
1326 	if (aw_dev->cali_desc.cali_re < aw_dev->re_range.re_max &&
1327 		aw_dev->cali_desc.cali_re > aw_dev->re_range.re_min) {
1328 		aw_cali_svc_set_cali_re_to_dsp(&aw_dev->cali_desc);
1329 	} else {
1330 		aw_dev_err(aw_dev->dev, "cali_re:%d out of range, no set",
1331 				aw_dev->cali_desc.cali_re);
1332 	}
1333 }
1334 
1335 
aw_device_start(struct aw_device * aw_dev)1336 int aw_device_start(struct aw_device *aw_dev)
1337 {
1338 	int ret = -1;
1339 
1340 	aw_dev_info(aw_dev->dev, "enter");
1341 
1342 	if (aw_dev->status == AW_DEV_PW_ON) {
1343 		aw_dev_info(aw_dev->dev, "already power on");
1344 		return 0;
1345 	}
1346 
1347 	/*power on*/
1348 	aw_dev_pwd(aw_dev, false);
1349 	usleep_range(AW_2000_US, AW_2000_US + 10);
1350 
1351 	ret = aw_dev_syspll_check(aw_dev);
1352 	if (ret < 0) {
1353 		aw_dev_err(aw_dev->dev, "pll check failed cannot start");
1354 		aw_dev_reg_dump(aw_dev);
1355 		goto pll_check_fail;
1356 	}
1357 
1358 	/*amppd on*/
1359 	aw_dev_amppd(aw_dev, false);
1360 	usleep_range(AW_1000_US, AW_1000_US + 50);
1361 
1362 	/*check i2s status*/
1363 	ret = aw_dev_sysst_check(aw_dev);
1364 	if (ret < 0) {
1365 		/*check failed*/
1366 		aw_dev_reg_dump(aw_dev);
1367 		goto sysst_check_fail;
1368 	}
1369 
1370 	if (aw_dev->dsp_cfg == AW_DEV_DSP_WORK) {
1371 		/*dsp bypass*/
1372 		aw_dev_dsp_enable(aw_dev, false);
1373 		if (aw_dev->ops.aw_dsp_fw_check) {
1374 			ret = aw_dev->ops.aw_dsp_fw_check(aw_dev);
1375 			if (ret < 0) {
1376 				aw_dev_reg_dump(aw_dev);
1377 				goto dsp_fw_check_fail;
1378 			}
1379 		}
1380 		aw_dev_set_cfg_f0_fs(aw_dev);
1381 
1382 		aw_dev_cali_re_update(&aw_dev->cali_desc);
1383 
1384 		if (aw_dev->dsp_crc_st != AW_DSP_CRC_OK) {
1385 			ret = aw_dev_dsp_crc32_check(aw_dev);
1386 			if (ret < 0) {
1387 				aw_dev_err(aw_dev->dev, "dsp crc check failed");
1388 				aw_dev_reg_dump(aw_dev);
1389 				goto crc_check_fail;
1390 			}
1391 		}
1392 
1393 		ret = aw_dev_dsp_check(aw_dev);
1394 		if (ret < 0) {
1395 			aw_dev_err(aw_dev->dev, "check dsp status failed");
1396 			aw_dev_reg_dump(aw_dev);
1397 			goto dsp_check_fail;
1398 		}
1399 	} else {
1400 		aw_dev_dbg(aw_dev->dev, "start pa with dsp bypass");
1401 	}
1402 
1403 	/*enable tx feedback*/
1404 	if (aw_dev->ops.aw_i2s_tx_enable)
1405 		aw_dev->ops.aw_i2s_tx_enable(aw_dev, true);
1406 
1407 	/*close mute*/
1408 	aw_dev_mute(aw_dev, false);
1409 
1410 	/*clear inturrupt*/
1411 	aw_dev_clear_int_status(aw_dev);
1412 	/*set inturrupt mask*/
1413 	aw_dev_set_intmask(aw_dev, true);
1414 
1415 	aw_monitor_start(&aw_dev->monitor_desc);
1416 
1417 	aw_dev->status = AW_DEV_PW_ON;
1418 
1419 	aw_dev_info(aw_dev->dev, "done");
1420 
1421 	return 0;
1422 
1423 dsp_check_fail:
1424 crc_check_fail:
1425 	aw_dev_dsp_enable(aw_dev, false);
1426 dsp_fw_check_fail:
1427 sysst_check_fail:
1428 	/*clear interrupt*/
1429 	aw_dev_clear_int_status(aw_dev);
1430 	aw_dev_amppd(aw_dev, true);
1431 pll_check_fail:
1432 	aw_dev_pwd(aw_dev, true);
1433 	aw_dev->status = AW_DEV_PW_OFF;
1434 	return ret;
1435 }
1436 
aw_device_stop(struct aw_device * aw_dev)1437 int aw_device_stop(struct aw_device *aw_dev)
1438 {
1439 	struct aw_sec_data_desc *dsp_cfg =
1440 		&aw_dev->prof_info.prof_desc[aw_dev->cur_prof].sec_desc[AW_DATA_TYPE_DSP_CFG];
1441 	struct aw_sec_data_desc *dsp_fw =
1442 		&aw_dev->prof_info.prof_desc[aw_dev->cur_prof].sec_desc[AW_DATA_TYPE_DSP_FW];
1443 	int int_st = 0;
1444 	int monitor_int_st = 0;
1445 
1446 	aw_dev_dbg(aw_dev->dev, "enter");
1447 
1448 	if (aw_dev->status == AW_DEV_PW_OFF) {
1449 		aw_dev_info(aw_dev->dev, "already power off");
1450 		return 0;
1451 	}
1452 
1453 	aw_dev->status = AW_DEV_PW_OFF;
1454 
1455 	aw_monitor_stop(&aw_dev->monitor_desc);
1456 
1457 	/*set mute*/
1458 	aw_dev_mute(aw_dev, true);
1459 	usleep_range(AW_4000_US, AW_4000_US + 100);
1460 
1461 	/*close tx feedback*/
1462 	if (aw_dev->ops.aw_i2s_tx_enable)
1463 		aw_dev->ops.aw_i2s_tx_enable(aw_dev, false);
1464 	usleep_range(AW_1000_US, AW_1000_US + 100);
1465 
1466 	/*set defaut int mask*/
1467 	aw_dev_set_intmask(aw_dev, false);
1468 
1469 	/*check sysint state*/
1470 	int_st = aw_dev_sysint_check(aw_dev);
1471 
1472 	/*close dsp*/
1473 	aw_dev_dsp_enable(aw_dev, false);
1474 
1475 	/*enable amppd*/
1476 	aw_dev_amppd(aw_dev, true);
1477 
1478 	/*check monitor process sysint state*/
1479 	monitor_int_st = aw_dev_get_monitor_sysint_st(aw_dev);
1480 
1481 	if (int_st < 0 || monitor_int_st < 0) {
1482 		/*system status anomaly*/
1483 		aw_dev_memclk_select(aw_dev, AW_DEV_MEMCLK_OSC);
1484 		aw_dev_dsp_cfg_update(aw_dev, dsp_cfg->data, dsp_cfg->len);
1485 		aw_dev_dsp_fw_update(aw_dev, dsp_fw->data, dsp_fw->len);
1486 		aw_dev_memclk_select(aw_dev, AW_DEV_MEMCLK_PLL);
1487 	}
1488 
1489 	/*set power down*/
1490 	aw_dev_pwd(aw_dev, true);
1491 
1492 	aw_dev_info(aw_dev->dev, "done");
1493 	return 0;
1494 }
1495 
1496 /*deinit aw_device*/
aw_dev_deinit(struct aw_device * aw_dev)1497 void aw_dev_deinit(struct aw_device *aw_dev)
1498 {
1499 	if (aw_dev == NULL)
1500 		return;
1501 
1502 	if (aw_dev->prof_info.prof_desc != NULL) {
1503 		devm_kfree(aw_dev->dev, aw_dev->prof_info.prof_desc);
1504 		aw_dev->prof_info.prof_desc = NULL;
1505 	}
1506 	aw_dev->prof_info.count = 0;
1507 
1508 	if (aw_dev->crc_dsp_cfg.data != NULL) {
1509 		aw_dev->crc_dsp_cfg.len = 0;
1510 		devm_kfree(aw_dev->dev, aw_dev->crc_dsp_cfg.data);
1511 		aw_dev->crc_dsp_cfg.data = NULL;
1512 	}
1513 
1514 }
1515 
1516 /*init aw_device*/
aw_device_init(struct aw_device * aw_dev,struct aw_container * aw_cfg)1517 int aw_device_init(struct aw_device *aw_dev, struct aw_container *aw_cfg)
1518 {
1519 	int ret;
1520 
1521 	if (aw_dev == NULL || aw_cfg == NULL) {
1522 		aw_pr_err("aw_dev is NULL or aw_cfg is NULL");
1523 		return -ENOMEM;
1524 	}
1525 
1526 	ret = aw_dev_cfg_load(aw_dev, aw_cfg);
1527 	if (ret < 0) {
1528 		aw_dev_deinit(aw_dev);
1529 		aw_dev_err(aw_dev->dev, "aw_dev acf parse failed");
1530 		return -EINVAL;
1531 	}
1532 
1533 	aw_dev->cur_prof = aw_dev->prof_info.prof_desc[0].id;
1534 	aw_dev->set_prof = aw_dev->prof_info.prof_desc[0].id;
1535 	ret = aw_dev_fw_update(aw_dev, AW_FORCE_UPDATE_ON,
1536 			AW_DSP_FW_UPDATE_ON);
1537 	if (ret < 0) {
1538 		aw_dev_err(aw_dev->dev, "fw update failed");
1539 		return ret;
1540 	}
1541 
1542 	aw_dev_set_intmask(aw_dev, false);
1543 
1544 	/*set mute*/
1545 	aw_dev_mute(aw_dev, true);
1546 
1547 	/*close tx feedback*/
1548 	if (aw_dev->ops.aw_i2s_tx_enable)
1549 		aw_dev->ops.aw_i2s_tx_enable(aw_dev, false);
1550 	usleep_range(AW_1000_US, AW_1000_US + 100);
1551 
1552 	/*enable amppd*/
1553 	aw_dev_amppd(aw_dev, true);
1554 	/*close dsp*/
1555 	aw_dev_dsp_enable(aw_dev, false);
1556 	/*set power down*/
1557 	aw_dev_pwd(aw_dev, true);
1558 
1559 	mutex_lock(&g_dev_lock);
1560 	list_add(&aw_dev->list_node, &g_dev_list);
1561 	mutex_unlock(&g_dev_lock);
1562 
1563 	aw_dev_info(aw_dev->dev, "init done");
1564 
1565 	return 0;
1566 }
1567 
aw883xx_parse_channel_dt(struct aw_device * aw_dev)1568 static void aw883xx_parse_channel_dt(struct aw_device *aw_dev)
1569 {
1570 	int ret;
1571 	uint32_t channel_value;
1572 	struct device_node *np = aw_dev->dev->of_node;
1573 
1574 	ret = of_property_read_u32(np, "sound-channel", &channel_value);
1575 	if (ret < 0) {
1576 		aw_dev_info(aw_dev->dev,
1577 			"read sound-channel failed,use default 0");
1578 		aw_dev->channel = AW_DEV_DEFAULT_CH;
1579 		return;
1580 	}
1581 
1582 	aw_dev_dbg(aw_dev->dev, "read sound-channel value is: %d",
1583 			channel_value);
1584 	aw_dev->channel = channel_value;
1585 }
1586 
aw883xx_parse_fade_enable_dt(struct aw_device * aw_dev)1587 static void aw883xx_parse_fade_enable_dt(struct aw_device *aw_dev)
1588 {
1589 	int ret = -1;
1590 	struct device_node *np = aw_dev->dev->of_node;
1591 	uint32_t fade_en;
1592 
1593 	ret = of_property_read_u32(np, "fade-enable", &fade_en);
1594 	if (ret < 0) {
1595 		aw_dev_info(aw_dev->dev,
1596 			"read fade-enable failed, close fade_in_out");
1597 		fade_en = AW_FADE_IN_OUT_DEFAULT;
1598 	} else {
1599 		aw_dev_info(aw_dev->dev, "read fade-enable value is: %d", fade_en);
1600 	}
1601 
1602 	aw_dev->fade_en = fade_en;
1603 }
1604 
aw883xx_parse_re_range_dt(struct aw_device * aw_dev)1605 static void aw883xx_parse_re_range_dt(struct aw_device *aw_dev)
1606 {
1607 	int ret;
1608 	uint32_t re_max;
1609 	uint32_t re_min;
1610 	struct device_node *np = aw_dev->dev->of_node;
1611 
1612 	ret = of_property_read_u32(np, "re-min", &re_min);
1613 	if (ret < 0) {
1614 		aw_dev->re_range.re_min = aw_dev->re_range.re_min_default;
1615 		aw_dev_info(aw_dev->dev,
1616 			"read re-min value failed, set deafult value:[%d]mohm",
1617 			aw_dev->re_range.re_min);
1618 	} else {
1619 		aw_dev_info(aw_dev->dev,
1620 			"parse re-min:[%d]", re_min);
1621 		aw_dev->re_range.re_min = re_min;
1622 	}
1623 
1624 	ret = of_property_read_u32(np, "re-max", &re_max);
1625 	if (ret < 0) {
1626 		aw_dev->re_range.re_max = aw_dev->re_range.re_max_default;
1627 		aw_dev_info(aw_dev->dev,
1628 			"read re-max failed, set deafult value:[%d]mohm",
1629 			aw_dev->re_range.re_max);
1630 	} else {
1631 		aw_dev_info(aw_dev->dev,
1632 			"parse re-max:[%d]", re_max);
1633 		aw_dev->re_range.re_max = re_max;
1634 	}
1635 }
1636 
aw_device_parse_dt(struct aw_device * aw_dev)1637 static void aw_device_parse_dt(struct aw_device *aw_dev)
1638 {
1639 	aw883xx_parse_channel_dt(aw_dev);
1640 	aw883xx_parse_fade_enable_dt(aw_dev);
1641 	aw883xx_parse_re_range_dt(aw_dev);
1642 }
1643 
aw_dev_get_list_head(struct list_head ** head)1644 int aw_dev_get_list_head(struct list_head **head)
1645 {
1646 	if (list_empty(&g_dev_list))
1647 		return -EINVAL;
1648 
1649 	*head = &g_dev_list;
1650 
1651 	return 0;
1652 }
1653 
aw_device_probe(struct aw_device * aw_dev)1654 int aw_device_probe(struct aw_device *aw_dev)
1655 {
1656 	INIT_LIST_HEAD(&aw_dev->list_node);
1657 
1658 	aw_device_parse_dt(aw_dev);
1659 
1660 	aw_cali_init(&aw_dev->cali_desc);
1661 
1662 	aw_monitor_init(&aw_dev->monitor_desc);
1663 
1664 	aw_spin_init(&aw_dev->spin_desc);
1665 
1666 	return 0;
1667 }
1668 
aw_device_remove(struct aw_device * aw_dev)1669 int aw_device_remove(struct aw_device *aw_dev)
1670 {
1671 	aw_monitor_deinit(&aw_dev->monitor_desc);
1672 
1673 	aw_cali_deinit(&aw_dev->cali_desc);
1674 
1675 	return 0;
1676 }
1677 
1678