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, ®_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, ®_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, ®_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, ®_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, ®_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, ®_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, ®_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, ®_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, ®_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, ®_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, ®_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, ®_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, ®_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, ®_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, ®_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, ®_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, ®_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, ®_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