1// SPDX-License-Identifier: GPL-2.0-only
2//
3// aw88399.c --  ALSA SoC AW88399 codec support
4//
5// Copyright (c) 2023 AWINIC Technology CO., LTD
6//
7// Author: Weidong Wang <wangweidong.a@awinic.com>
8//
9
10#include <linux/crc32.h>
11#include <linux/i2c.h>
12#include <linux/firmware.h>
13#include <linux/of_gpio.h>
14#include <linux/regmap.h>
15#include <sound/soc.h>
16#include "aw88399.h"
17#include "aw88395/aw88395_device.h"
18
19static const struct regmap_config aw88399_remap_config = {
20	.val_bits = 16,
21	.reg_bits = 8,
22	.max_register = AW88399_REG_MAX,
23	.reg_format_endian = REGMAP_ENDIAN_LITTLE,
24	.val_format_endian = REGMAP_ENDIAN_BIG,
25};
26
27static int aw_dev_dsp_write_16bit(struct aw_device *aw_dev,
28		unsigned short dsp_addr, unsigned int dsp_data)
29{
30	int ret;
31
32	ret = regmap_write(aw_dev->regmap, AW88399_DSPMADD_REG, dsp_addr);
33	if (ret) {
34		dev_err(aw_dev->dev, "%s write addr error, ret=%d", __func__, ret);
35		return ret;
36	}
37
38	ret = regmap_write(aw_dev->regmap, AW88399_DSPMDAT_REG, (u16)dsp_data);
39	if (ret) {
40		dev_err(aw_dev->dev, "%s write data error, ret=%d", __func__, ret);
41		return ret;
42	}
43
44	return 0;
45}
46
47static int aw_dev_dsp_read_16bit(struct aw_device *aw_dev,
48		unsigned short dsp_addr, unsigned int *dsp_data)
49{
50	unsigned int temp_data;
51	int ret;
52
53	ret = regmap_write(aw_dev->regmap, AW88399_DSPMADD_REG, dsp_addr);
54	if (ret) {
55		dev_err(aw_dev->dev, "%s write error, ret=%d", __func__, ret);
56		return ret;
57	}
58
59	ret = regmap_read(aw_dev->regmap, AW88399_DSPMDAT_REG, &temp_data);
60	if (ret) {
61		dev_err(aw_dev->dev, "%s read error, ret=%d", __func__, ret);
62		return ret;
63	}
64	*dsp_data = temp_data;
65
66	return 0;
67}
68
69static int aw_dev_dsp_read_32bit(struct aw_device *aw_dev,
70		unsigned short dsp_addr, unsigned int *dsp_data)
71{
72	unsigned int temp_data;
73	int ret;
74
75	ret = regmap_write(aw_dev->regmap, AW88399_DSPMADD_REG, dsp_addr);
76	if (ret) {
77		dev_err(aw_dev->dev, "%s write error, ret=%d", __func__, ret);
78		return ret;
79	}
80
81	ret = regmap_read(aw_dev->regmap, AW88399_DSPMDAT_REG, &temp_data);
82	if (ret) {
83		dev_err(aw_dev->dev, "%s read error, ret=%d", __func__, ret);
84		return ret;
85	}
86	*dsp_data = temp_data;
87
88	ret = regmap_read(aw_dev->regmap, AW88399_DSPMDAT_REG, &temp_data);
89	if (ret) {
90		dev_err(aw_dev->dev, "%s read error, ret=%d", __func__, ret);
91		return ret;
92	}
93	*dsp_data |= (temp_data << 16);
94
95	return 0;
96}
97
98static int aw_dev_dsp_read(struct aw_device *aw_dev,
99		unsigned short dsp_addr, unsigned int *dsp_data, unsigned char data_type)
100{
101	u32 reg_value;
102	int ret;
103
104	mutex_lock(&aw_dev->dsp_lock);
105	switch (data_type) {
106	case AW88399_DSP_16_DATA:
107		ret = aw_dev_dsp_read_16bit(aw_dev, dsp_addr, dsp_data);
108		if (ret)
109			dev_err(aw_dev->dev, "read dsp_addr[0x%x] 16-bit dsp_data[0x%x] failed",
110					(u32)dsp_addr, *dsp_data);
111		break;
112	case AW88399_DSP_32_DATA:
113		ret = aw_dev_dsp_read_32bit(aw_dev, dsp_addr, dsp_data);
114		if (ret)
115			dev_err(aw_dev->dev, "read dsp_addr[0x%x] 32r-bit dsp_data[0x%x] failed",
116					(u32)dsp_addr, *dsp_data);
117		break;
118	default:
119		dev_err(aw_dev->dev, "data type[%d] unsupported", data_type);
120		ret = -EINVAL;
121		break;
122	}
123
124	/* clear dsp chip select state */
125	if (regmap_read(aw_dev->regmap, AW88399_ID_REG, &reg_value))
126		dev_err(aw_dev->dev, "%s fail to clear chip state. ret=%d\n", __func__, ret);
127	mutex_unlock(&aw_dev->dsp_lock);
128
129	return ret;
130}
131
132static void aw_dev_pwd(struct aw_device *aw_dev, bool pwd)
133{
134	int ret;
135
136	if (pwd)
137		ret = regmap_update_bits(aw_dev->regmap, AW88399_SYSCTRL_REG,
138				~AW88399_PWDN_MASK, AW88399_PWDN_POWER_DOWN_VALUE);
139	else
140		ret = regmap_update_bits(aw_dev->regmap, AW88399_SYSCTRL_REG,
141				~AW88399_PWDN_MASK, AW88399_PWDN_WORKING_VALUE);
142
143	if (ret)
144		dev_dbg(aw_dev->dev, "%s failed", __func__);
145}
146
147static void aw_dev_get_int_status(struct aw_device *aw_dev, unsigned short *int_status)
148{
149	unsigned int reg_val;
150	int ret;
151
152	ret = regmap_read(aw_dev->regmap, AW88399_SYSINT_REG, &reg_val);
153	if (ret)
154		dev_err(aw_dev->dev, "read interrupt reg fail, ret=%d", ret);
155	else
156		*int_status = reg_val;
157
158	dev_dbg(aw_dev->dev, "read interrupt reg=0x%04x", *int_status);
159}
160
161static void aw_dev_clear_int_status(struct aw_device *aw_dev)
162{
163	u16 int_status;
164
165	/* read int status and clear */
166	aw_dev_get_int_status(aw_dev, &int_status);
167	/* make sure int status is clear */
168	aw_dev_get_int_status(aw_dev, &int_status);
169	if (int_status)
170		dev_dbg(aw_dev->dev, "int status(%d) is not cleaned.\n", int_status);
171}
172
173static int aw_dev_get_iis_status(struct aw_device *aw_dev)
174{
175	unsigned int reg_val;
176	int ret;
177
178	ret = regmap_read(aw_dev->regmap, AW88399_SYSST_REG, &reg_val);
179	if (ret)
180		return ret;
181	if ((reg_val & AW88399_BIT_PLL_CHECK) != AW88399_BIT_PLL_CHECK) {
182		dev_err(aw_dev->dev, "check pll lock fail, reg_val:0x%04x", reg_val);
183		return -EINVAL;
184	}
185
186	return 0;
187}
188
189static int aw_dev_check_mode1_pll(struct aw_device *aw_dev)
190{
191	int ret, i;
192
193	for (i = 0; i < AW88399_DEV_SYSST_CHECK_MAX; i++) {
194		ret = aw_dev_get_iis_status(aw_dev);
195		if (ret) {
196			dev_err(aw_dev->dev, "mode1 iis signal check error");
197			usleep_range(AW88399_2000_US, AW88399_2000_US + 10);
198		} else {
199			return 0;
200		}
201	}
202
203	return -EPERM;
204}
205
206static int aw_dev_check_mode2_pll(struct aw_device *aw_dev)
207{
208	unsigned int reg_val;
209	int ret, i;
210
211	ret = regmap_read(aw_dev->regmap, AW88399_PLLCTRL2_REG, &reg_val);
212	if (ret)
213		return ret;
214
215	reg_val &= (~AW88399_CCO_MUX_MASK);
216	if (reg_val == AW88399_CCO_MUX_DIVIDED_VALUE) {
217		dev_dbg(aw_dev->dev, "CCO_MUX is already divider");
218		return -EPERM;
219	}
220
221	/* change mode2 */
222	ret = regmap_update_bits(aw_dev->regmap, AW88399_PLLCTRL2_REG,
223			~AW88399_CCO_MUX_MASK, AW88399_CCO_MUX_DIVIDED_VALUE);
224	if (ret)
225		return ret;
226
227	for (i = 0; i < AW88399_DEV_SYSST_CHECK_MAX; i++) {
228		ret = aw_dev_get_iis_status(aw_dev);
229		if (ret) {
230			dev_err(aw_dev->dev, "mode2 iis signal check error");
231			usleep_range(AW88399_2000_US, AW88399_2000_US + 10);
232		} else {
233			break;
234		}
235	}
236
237	/* change mode1 */
238	regmap_update_bits(aw_dev->regmap, AW88399_PLLCTRL2_REG,
239			~AW88399_CCO_MUX_MASK, AW88399_CCO_MUX_BYPASS_VALUE);
240	if (ret == 0) {
241		usleep_range(AW88399_2000_US, AW88399_2000_US + 10);
242		for (i = 0; i < AW88399_DEV_SYSST_CHECK_MAX; i++) {
243			ret = aw_dev_get_iis_status(aw_dev);
244			if (ret) {
245				dev_err(aw_dev->dev, "mode2 switch to mode1, iis signal check error");
246				usleep_range(AW88399_2000_US, AW88399_2000_US + 10);
247			} else {
248				break;
249			}
250		}
251	}
252
253	return ret;
254}
255
256static int aw_dev_check_syspll(struct aw_device *aw_dev)
257{
258	int ret;
259
260	ret = aw_dev_check_mode1_pll(aw_dev);
261	if (ret) {
262		dev_dbg(aw_dev->dev, "mode1 check iis failed try switch to mode2 check");
263		ret = aw_dev_check_mode2_pll(aw_dev);
264		if (ret) {
265			dev_err(aw_dev->dev, "mode2 check iis failed");
266			return ret;
267		}
268	}
269
270	return 0;
271}
272
273static int aw_dev_check_sysst(struct aw_device *aw_dev)
274{
275	unsigned int check_val;
276	unsigned int reg_val;
277	int ret, i;
278
279	ret = regmap_read(aw_dev->regmap, AW88399_PWMCTRL3_REG, &reg_val);
280	if (ret)
281		return ret;
282
283	if (reg_val & (~AW88399_NOISE_GATE_EN_MASK))
284		check_val = AW88399_BIT_SYSST_NOSWS_CHECK;
285	else
286		check_val = AW88399_BIT_SYSST_SWS_CHECK;
287
288	for (i = 0; i < AW88399_DEV_SYSST_CHECK_MAX; i++) {
289		ret = regmap_read(aw_dev->regmap, AW88399_SYSST_REG, &reg_val);
290		if (ret)
291			return ret;
292
293		if ((reg_val & (~AW88399_BIT_SYSST_CHECK_MASK) & check_val) != check_val) {
294			dev_err(aw_dev->dev, "check sysst fail, cnt=%d, reg_val=0x%04x, check:0x%x",
295				i, reg_val, AW88399_BIT_SYSST_NOSWS_CHECK);
296			usleep_range(AW88399_2000_US, AW88399_2000_US + 10);
297		} else {
298			return 0;
299		}
300	}
301
302	return -EPERM;
303}
304
305static void aw_dev_amppd(struct aw_device *aw_dev, bool amppd)
306{
307	int ret;
308
309	if (amppd)
310		ret = regmap_update_bits(aw_dev->regmap, AW88399_SYSCTRL_REG,
311				~AW88399_AMPPD_MASK, AW88399_AMPPD_POWER_DOWN_VALUE);
312	else
313		ret = regmap_update_bits(aw_dev->regmap, AW88399_SYSCTRL_REG,
314				~AW88399_AMPPD_MASK, AW88399_AMPPD_WORKING_VALUE);
315
316	if (ret)
317		dev_dbg(aw_dev->dev, "%s failed", __func__);
318}
319
320static void aw_dev_dsp_enable(struct aw_device *aw_dev, bool is_enable)
321{
322	int ret;
323
324	if (is_enable)
325		ret = regmap_update_bits(aw_dev->regmap, AW88399_SYSCTRL_REG,
326					~AW88399_DSPBY_MASK, AW88399_DSPBY_WORKING_VALUE);
327	else
328		ret = regmap_update_bits(aw_dev->regmap, AW88399_SYSCTRL_REG,
329					~AW88399_DSPBY_MASK, AW88399_DSPBY_BYPASS_VALUE);
330
331	if (ret)
332		dev_dbg(aw_dev->dev, "%s failed\n", __func__);
333}
334
335static int aw88399_dev_get_icalk(struct aw88399 *aw88399, int16_t *icalk)
336{
337	uint16_t icalkh_val, icalkl_val, icalk_val;
338	struct aw_device *aw_dev = aw88399->aw_pa;
339	unsigned int reg_val;
340	int ret;
341
342	ret = regmap_read(aw_dev->regmap, AW88399_EFRH4_REG, &reg_val);
343	if (ret)
344		return ret;
345	icalkh_val = reg_val & (~AW88399_EF_ISN_GESLP_H_MASK);
346
347	ret = regmap_read(aw_dev->regmap, AW88399_EFRL4_REG, &reg_val);
348	if (ret)
349		return ret;
350	icalkl_val = reg_val & (~AW88399_EF_ISN_GESLP_L_MASK);
351
352	if (aw88399->check_val == AW_EF_AND_CHECK)
353		icalk_val = icalkh_val & icalkl_val;
354	else
355		icalk_val = icalkh_val | icalkl_val;
356
357	if (icalk_val & (~AW88399_EF_ISN_GESLP_SIGN_MASK))
358		icalk_val = icalk_val | AW88399_EF_ISN_GESLP_SIGN_NEG;
359	*icalk = (int16_t)icalk_val;
360
361	return 0;
362}
363
364static int aw88399_dev_get_vcalk(struct aw88399 *aw88399, int16_t *vcalk)
365{
366	uint16_t vcalkh_val, vcalkl_val, vcalk_val;
367	struct aw_device *aw_dev = aw88399->aw_pa;
368	unsigned int reg_val;
369	int ret;
370
371	ret = regmap_read(aw_dev->regmap, AW88399_EFRH3_REG, &reg_val);
372	if (ret)
373		return ret;
374
375	vcalkh_val = reg_val & (~AW88399_EF_VSN_GESLP_H_MASK);
376
377	ret = regmap_read(aw_dev->regmap, AW88399_EFRL3_REG, &reg_val);
378	if (ret)
379		return ret;
380
381	vcalkl_val = reg_val & (~AW88399_EF_VSN_GESLP_L_MASK);
382
383	if (aw88399->check_val == AW_EF_AND_CHECK)
384		vcalk_val = vcalkh_val & vcalkl_val;
385	else
386		vcalk_val = vcalkh_val | vcalkl_val;
387
388	if (vcalk_val & AW88399_EF_VSN_GESLP_SIGN_MASK)
389		vcalk_val = vcalk_val | AW88399_EF_VSN_GESLP_SIGN_NEG;
390	*vcalk = (int16_t)vcalk_val;
391
392	return 0;
393}
394
395static int aw88399_dev_get_internal_vcalk(struct aw88399 *aw88399, int16_t *vcalk)
396{
397	uint16_t vcalkh_val, vcalkl_val, vcalk_val;
398	struct aw_device *aw_dev = aw88399->aw_pa;
399	unsigned int reg_val;
400	int ret;
401
402	ret = regmap_read(aw_dev->regmap, AW88399_EFRH2_REG, &reg_val);
403	if (ret)
404		return ret;
405	vcalkh_val = reg_val & (~AW88399_INTERNAL_VSN_TRIM_H_MASK);
406
407	ret = regmap_read(aw_dev->regmap, AW88399_EFRL2_REG, &reg_val);
408	if (ret)
409		return ret;
410	vcalkl_val = reg_val & (~AW88399_INTERNAL_VSN_TRIM_L_MASK);
411
412	if (aw88399->check_val == AW_EF_AND_CHECK)
413		vcalk_val = (vcalkh_val >> AW88399_INTERNAL_VSN_TRIM_H_START_BIT) &
414				(vcalkl_val >> AW88399_INTERNAL_VSN_TRIM_L_START_BIT);
415	else
416		vcalk_val = (vcalkh_val >> AW88399_INTERNAL_VSN_TRIM_H_START_BIT) |
417				(vcalkl_val >> AW88399_INTERNAL_VSN_TRIM_L_START_BIT);
418
419	if (vcalk_val & (~AW88399_TEM4_SIGN_MASK))
420		vcalk_val = vcalk_val | AW88399_TEM4_SIGN_NEG;
421
422	*vcalk = (int16_t)vcalk_val;
423
424	return 0;
425}
426
427static int aw_dev_set_vcalb(struct aw88399 *aw88399)
428{
429	struct aw_device *aw_dev = aw88399->aw_pa;
430	unsigned int vsense_select, vsense_value;
431	int32_t ical_k, vcal_k, vcalb;
432	int16_t icalk, vcalk;
433	uint16_t reg_val;
434	int ret;
435
436	ret = regmap_read(aw_dev->regmap, AW88399_VSNCTRL1_REG, &vsense_value);
437	if (ret)
438		return ret;
439
440	vsense_select = vsense_value & (~AW88399_VDSEL_MASK);
441
442	ret = aw88399_dev_get_icalk(aw88399, &icalk);
443	if (ret) {
444		dev_err(aw_dev->dev, "get icalk failed\n");
445		return ret;
446	}
447
448	ical_k = icalk * AW88399_ICABLK_FACTOR + AW88399_CABL_BASE_VALUE;
449
450	switch (vsense_select) {
451	case AW88399_DEV_VDSEL_VSENSE:
452		ret = aw88399_dev_get_vcalk(aw88399, &vcalk);
453		vcal_k = vcalk * AW88399_VCABLK_FACTOR + AW88399_CABL_BASE_VALUE;
454		vcalb = AW88399_VCALB_ACCURACY * AW88399_VSCAL_FACTOR / AW88399_ISCAL_FACTOR /
455			ical_k / vcal_k * aw88399->vcalb_init_val;
456		break;
457	case AW88399_DEV_VDSEL_DAC:
458		ret = aw88399_dev_get_internal_vcalk(aw88399, &vcalk);
459		vcal_k = vcalk * AW88399_VCABLK_DAC_FACTOR + AW88399_CABL_BASE_VALUE;
460		vcalb = AW88399_VCALB_ACCURACY * AW88399_VSCAL_DAC_FACTOR /
461					AW88399_ISCAL_DAC_FACTOR / ical_k /
462					vcal_k * aw88399->vcalb_init_val;
463		break;
464	default:
465		dev_err(aw_dev->dev, "%s: unsupport vsense\n", __func__);
466		ret = -EINVAL;
467		break;
468	}
469	if (ret)
470		return ret;
471
472	vcalb = vcalb >> AW88399_VCALB_ADJ_FACTOR;
473	reg_val = (uint32_t)vcalb;
474
475	regmap_write(aw_dev->regmap, AW88399_DSPVCALB_REG, reg_val);
476
477	return 0;
478}
479
480static int aw_dev_update_cali_re(struct aw_cali_desc *cali_desc)
481{
482	struct aw_device *aw_dev =
483		container_of(cali_desc, struct aw_device, cali_desc);
484	uint16_t re_lbits, re_hbits;
485	u32 cali_re;
486	int ret;
487
488	if ((aw_dev->cali_desc.cali_re >= AW88399_CALI_RE_MAX) ||
489			(aw_dev->cali_desc.cali_re <= AW88399_CALI_RE_MIN))
490		return -EINVAL;
491
492	cali_re = AW88399_SHOW_RE_TO_DSP_RE((aw_dev->cali_desc.cali_re +
493				aw_dev->cali_desc.ra), AW88399_DSP_RE_SHIFT);
494
495	re_hbits = (cali_re & (~AW88399_CALI_RE_HBITS_MASK)) >> AW88399_CALI_RE_HBITS_SHIFT;
496	re_lbits = (cali_re & (~AW88399_CALI_RE_LBITS_MASK)) >> AW88399_CALI_RE_LBITS_SHIFT;
497
498	ret = regmap_write(aw_dev->regmap, AW88399_ACR1_REG, re_hbits);
499	if (ret) {
500		dev_err(aw_dev->dev, "set cali re error");
501		return ret;
502	}
503
504	ret = regmap_write(aw_dev->regmap, AW88399_ACR2_REG, re_lbits);
505	if (ret)
506		dev_err(aw_dev->dev, "set cali re error");
507
508	return ret;
509}
510
511static int aw_dev_fw_crc_check(struct aw_device *aw_dev)
512{
513	uint16_t check_val, fw_len_val;
514	unsigned int reg_val;
515	int ret;
516
517	/* calculate fw_end_addr */
518	fw_len_val = ((aw_dev->dsp_fw_len / AW_FW_ADDR_LEN) - 1) + AW88399_CRC_FW_BASE_ADDR;
519
520	/* write fw_end_addr to crc_end_addr */
521	ret = regmap_update_bits(aw_dev->regmap, AW88399_CRCCTRL_REG,
522					~AW88399_CRC_END_ADDR_MASK, fw_len_val);
523	if (ret)
524		return ret;
525	/* enable fw crc check */
526	ret = regmap_update_bits(aw_dev->regmap, AW88399_CRCCTRL_REG,
527		~AW88399_CRC_CODE_EN_MASK, AW88399_CRC_CODE_EN_ENABLE_VALUE);
528
529	usleep_range(AW88399_2000_US, AW88399_2000_US + 10);
530
531	/* read crc check result */
532	regmap_read(aw_dev->regmap, AW88399_HAGCST_REG, &reg_val);
533	if (ret)
534		return ret;
535
536	check_val = (reg_val & (~AW88399_CRC_CHECK_BITS_MASK)) >> AW88399_CRC_CHECK_START_BIT;
537
538	/* disable fw crc check */
539	ret = regmap_update_bits(aw_dev->regmap, AW88399_CRCCTRL_REG,
540		~AW88399_CRC_CODE_EN_MASK, AW88399_CRC_CODE_EN_DISABLE_VALUE);
541	if (ret)
542		return ret;
543
544	if (check_val != AW88399_CRC_CHECK_PASS_VAL) {
545		dev_err(aw_dev->dev, "%s failed, check_val 0x%x != 0x%x",
546				__func__, check_val, AW88399_CRC_CHECK_PASS_VAL);
547		ret = -EINVAL;
548	}
549
550	return ret;
551}
552
553static int aw_dev_cfg_crc_check(struct aw_device *aw_dev)
554{
555	uint16_t check_val, cfg_len_val;
556	unsigned int reg_val;
557	int ret;
558
559	/* calculate cfg end addr */
560	cfg_len_val = ((aw_dev->dsp_cfg_len / AW_FW_ADDR_LEN) - 1) + AW88399_CRC_CFG_BASE_ADDR;
561
562	/* write cfg_end_addr to crc_end_addr */
563	ret = regmap_update_bits(aw_dev->regmap, AW88399_CRCCTRL_REG,
564				~AW88399_CRC_END_ADDR_MASK, cfg_len_val);
565	if (ret)
566		return ret;
567
568	/* enable cfg crc check */
569	ret = regmap_update_bits(aw_dev->regmap, AW88399_CRCCTRL_REG,
570			~AW88399_CRC_CFG_EN_MASK, AW88399_CRC_CFG_EN_ENABLE_VALUE);
571	if (ret)
572		return ret;
573
574	usleep_range(AW88399_1000_US, AW88399_1000_US + 10);
575
576	/* read crc check result */
577	ret = regmap_read(aw_dev->regmap, AW88399_HAGCST_REG, &reg_val);
578	if (ret)
579		return ret;
580
581	check_val = (reg_val & (~AW88399_CRC_CHECK_BITS_MASK)) >> AW88399_CRC_CHECK_START_BIT;
582
583	/* disable cfg crc check */
584	ret = regmap_update_bits(aw_dev->regmap, AW88399_CRCCTRL_REG,
585			~AW88399_CRC_CFG_EN_MASK, AW88399_CRC_CFG_EN_DISABLE_VALUE);
586	if (ret)
587		return ret;
588
589	if (check_val != AW88399_CRC_CHECK_PASS_VAL) {
590		dev_err(aw_dev->dev, "crc_check failed, check val 0x%x != 0x%x",
591						check_val, AW88399_CRC_CHECK_PASS_VAL);
592		ret = -EINVAL;
593	}
594
595	return ret;
596}
597
598static int aw_dev_hw_crc_check(struct aw88399 *aw88399)
599{
600	struct aw_device *aw_dev = aw88399->aw_pa;
601	int ret;
602
603	ret = regmap_update_bits(aw_dev->regmap, AW88399_I2SCFG1_REG,
604		~AW88399_RAM_CG_BYP_MASK, AW88399_RAM_CG_BYP_BYPASS_VALUE);
605	if (ret)
606		return ret;
607
608	ret = aw_dev_fw_crc_check(aw_dev);
609	if (ret) {
610		dev_err(aw_dev->dev, "fw_crc_check failed\n");
611		goto crc_check_failed;
612	}
613
614	ret = aw_dev_cfg_crc_check(aw_dev);
615	if (ret) {
616		dev_err(aw_dev->dev, "cfg_crc_check failed\n");
617		goto crc_check_failed;
618	}
619
620	ret = regmap_write(aw_dev->regmap, AW88399_CRCCTRL_REG, aw88399->crc_init_val);
621	if (ret)
622		return ret;
623
624	ret = regmap_update_bits(aw_dev->regmap, AW88399_I2SCFG1_REG,
625		~AW88399_RAM_CG_BYP_MASK, AW88399_RAM_CG_BYP_WORK_VALUE);
626
627	return ret;
628
629crc_check_failed:
630	regmap_update_bits(aw_dev->regmap, AW88399_I2SCFG1_REG,
631		~AW88399_RAM_CG_BYP_MASK, AW88399_RAM_CG_BYP_WORK_VALUE);
632	return ret;
633}
634
635static void aw_dev_i2s_tx_enable(struct aw_device *aw_dev, bool flag)
636{
637	int ret;
638
639	if (flag)
640		ret = regmap_update_bits(aw_dev->regmap, AW88399_I2SCTRL3_REG,
641			~AW88399_I2STXEN_MASK, AW88399_I2STXEN_ENABLE_VALUE);
642	else
643		ret = regmap_update_bits(aw_dev->regmap, AW88399_I2SCFG1_REG,
644			~AW88399_I2STXEN_MASK, AW88399_I2STXEN_DISABLE_VALUE);
645
646	if (ret)
647		dev_dbg(aw_dev->dev, "%s failed", __func__);
648}
649
650static int aw_dev_get_dsp_status(struct aw_device *aw_dev)
651{
652	unsigned int reg_val;
653	int ret;
654
655	ret = regmap_read(aw_dev->regmap, AW88399_WDT_REG, &reg_val);
656	if (ret)
657		return ret;
658	if (!(reg_val & (~AW88399_WDT_CNT_MASK)))
659		ret = -EPERM;
660
661	return 0;
662}
663
664static int aw_dev_dsp_check(struct aw_device *aw_dev)
665{
666	int ret, i;
667
668	switch (aw_dev->dsp_cfg) {
669	case AW88399_DEV_DSP_BYPASS:
670		dev_dbg(aw_dev->dev, "dsp bypass");
671		ret = 0;
672		break;
673	case AW88399_DEV_DSP_WORK:
674		aw_dev_dsp_enable(aw_dev, false);
675		aw_dev_dsp_enable(aw_dev, true);
676		usleep_range(AW88399_1000_US, AW88399_1000_US + 10);
677		for (i = 0; i < AW88399_DEV_DSP_CHECK_MAX; i++) {
678			ret = aw_dev_get_dsp_status(aw_dev);
679			if (ret) {
680				dev_err(aw_dev->dev, "dsp wdt status error=%d", ret);
681				usleep_range(AW88399_2000_US, AW88399_2000_US + 10);
682			}
683		}
684		break;
685	default:
686		dev_err(aw_dev->dev, "unknown dsp cfg=%d", aw_dev->dsp_cfg);
687		ret = -EINVAL;
688		break;
689	}
690
691	return ret;
692}
693
694static int aw_dev_set_volume(struct aw_device *aw_dev, unsigned int value)
695{
696	struct aw_volume_desc *vol_desc = &aw_dev->volume_desc;
697	unsigned int reg_value;
698	u16 real_value;
699	int ret;
700
701	real_value = min((value + vol_desc->init_volume), (unsigned int)AW88399_MUTE_VOL);
702
703	ret = regmap_read(aw_dev->regmap, AW88399_SYSCTRL2_REG, &reg_value);
704	if (ret)
705		return ret;
706
707	dev_dbg(aw_dev->dev, "value 0x%x , reg:0x%x", value, real_value);
708
709	real_value = (real_value << AW88399_VOL_START_BIT) | (reg_value & AW88399_VOL_MASK);
710
711	ret = regmap_write(aw_dev->regmap, AW88399_SYSCTRL2_REG, real_value);
712
713	return ret;
714}
715
716static void aw_dev_fade_in(struct aw_device *aw_dev)
717{
718	struct aw_volume_desc *desc = &aw_dev->volume_desc;
719	u16 fade_in_vol = desc->ctl_volume;
720	int fade_step = aw_dev->fade_step;
721	int i;
722
723	if (fade_step == 0 || aw_dev->fade_in_time == 0) {
724		aw_dev_set_volume(aw_dev, fade_in_vol);
725		return;
726	}
727
728	for (i = AW88399_MUTE_VOL; i >= fade_in_vol; i -= fade_step) {
729		aw_dev_set_volume(aw_dev, i);
730		usleep_range(aw_dev->fade_in_time, aw_dev->fade_in_time + 10);
731	}
732
733	if (i != fade_in_vol)
734		aw_dev_set_volume(aw_dev, fade_in_vol);
735}
736
737static void aw_dev_fade_out(struct aw_device *aw_dev)
738{
739	struct aw_volume_desc *desc = &aw_dev->volume_desc;
740	int fade_step = aw_dev->fade_step;
741	int i;
742
743	if (fade_step == 0 || aw_dev->fade_out_time == 0) {
744		aw_dev_set_volume(aw_dev, AW88399_MUTE_VOL);
745		return;
746	}
747
748	for (i = desc->ctl_volume; i <= AW88399_MUTE_VOL; i += fade_step) {
749		aw_dev_set_volume(aw_dev, i);
750		usleep_range(aw_dev->fade_out_time, aw_dev->fade_out_time + 10);
751	}
752
753	if (i != AW88399_MUTE_VOL) {
754		aw_dev_set_volume(aw_dev, AW88399_MUTE_VOL);
755		usleep_range(aw_dev->fade_out_time, aw_dev->fade_out_time + 10);
756	}
757}
758
759static void aw88399_dev_mute(struct aw_device *aw_dev, bool is_mute)
760{
761	if (is_mute) {
762		aw_dev_fade_out(aw_dev);
763		regmap_update_bits(aw_dev->regmap, AW88399_SYSCTRL_REG,
764				~AW88399_HMUTE_MASK, AW88399_HMUTE_ENABLE_VALUE);
765	} else {
766		regmap_update_bits(aw_dev->regmap, AW88399_SYSCTRL_REG,
767				~AW88399_HMUTE_MASK, AW88399_HMUTE_DISABLE_VALUE);
768		aw_dev_fade_in(aw_dev);
769	}
770}
771
772static void aw88399_dev_set_dither(struct aw88399 *aw88399, bool dither)
773{
774	struct aw_device *aw_dev = aw88399->aw_pa;
775
776	if (dither)
777		regmap_update_bits(aw_dev->regmap, AW88399_DBGCTRL_REG,
778				~AW88399_DITHER_EN_MASK, AW88399_DITHER_EN_ENABLE_VALUE);
779	else
780		regmap_update_bits(aw_dev->regmap, AW88399_DBGCTRL_REG,
781				~AW88399_DITHER_EN_MASK, AW88399_DITHER_EN_DISABLE_VALUE);
782}
783
784static int aw88399_dev_start(struct aw88399 *aw88399)
785{
786	struct aw_device *aw_dev = aw88399->aw_pa;
787	int ret;
788
789	if (aw_dev->status == AW88399_DEV_PW_ON) {
790		dev_dbg(aw_dev->dev, "already power on");
791		return 0;
792	}
793
794	aw88399_dev_set_dither(aw88399, false);
795
796	/* power on */
797	aw_dev_pwd(aw_dev, false);
798	usleep_range(AW88399_2000_US, AW88399_2000_US + 10);
799
800	ret = aw_dev_check_syspll(aw_dev);
801	if (ret) {
802		dev_err(aw_dev->dev, "pll check failed cannot start");
803		goto pll_check_fail;
804	}
805
806	/* amppd on */
807	aw_dev_amppd(aw_dev, false);
808	usleep_range(AW88399_1000_US, AW88399_1000_US + 50);
809
810	/* check i2s status */
811	ret = aw_dev_check_sysst(aw_dev);
812	if (ret) {
813		dev_err(aw_dev->dev, "sysst check failed");
814		goto sysst_check_fail;
815	}
816
817	if (aw_dev->dsp_cfg == AW88399_DEV_DSP_WORK) {
818		ret = aw_dev_hw_crc_check(aw88399);
819		if (ret) {
820			dev_err(aw_dev->dev, "dsp crc check failed");
821			goto crc_check_fail;
822		}
823		aw_dev_dsp_enable(aw_dev, false);
824		aw_dev_set_vcalb(aw88399);
825		aw_dev_update_cali_re(&aw_dev->cali_desc);
826
827		ret = aw_dev_dsp_check(aw_dev);
828		if (ret) {
829			dev_err(aw_dev->dev, "dsp status check failed");
830			goto dsp_check_fail;
831		}
832	} else {
833		dev_dbg(aw_dev->dev, "start pa with dsp bypass");
834	}
835
836	/* enable tx feedback */
837	aw_dev_i2s_tx_enable(aw_dev, true);
838
839	if (aw88399->dither_st == AW88399_DITHER_EN_ENABLE_VALUE)
840		aw88399_dev_set_dither(aw88399, true);
841
842	/* close mute */
843	aw88399_dev_mute(aw_dev, false);
844	/* clear inturrupt */
845	aw_dev_clear_int_status(aw_dev);
846	aw_dev->status = AW88399_DEV_PW_ON;
847
848	return 0;
849
850dsp_check_fail:
851crc_check_fail:
852	aw_dev_dsp_enable(aw_dev, false);
853sysst_check_fail:
854	aw_dev_clear_int_status(aw_dev);
855	aw_dev_amppd(aw_dev, true);
856pll_check_fail:
857	aw_dev_pwd(aw_dev, true);
858	aw_dev->status = AW88399_DEV_PW_OFF;
859
860	return ret;
861}
862
863static int aw_dev_dsp_update_container(struct aw_device *aw_dev,
864			unsigned char *data, unsigned int len, unsigned short base)
865{
866	u32 tmp_len;
867	int i, ret;
868
869	mutex_lock(&aw_dev->dsp_lock);
870	ret = regmap_write(aw_dev->regmap, AW88399_DSPMADD_REG, base);
871	if (ret)
872		goto error_operation;
873
874	for (i = 0; i < len; i += AW88399_MAX_RAM_WRITE_BYTE_SIZE) {
875		if ((len - i) < AW88399_MAX_RAM_WRITE_BYTE_SIZE)
876			tmp_len = len - i;
877		else
878			tmp_len = AW88399_MAX_RAM_WRITE_BYTE_SIZE;
879
880		ret = regmap_raw_write(aw_dev->regmap, AW88399_DSPMDAT_REG,
881					&data[i], tmp_len);
882		if (ret)
883			goto error_operation;
884	}
885	mutex_unlock(&aw_dev->dsp_lock);
886
887	return 0;
888
889error_operation:
890	mutex_unlock(&aw_dev->dsp_lock);
891	return ret;
892}
893
894static int aw_dev_get_ra(struct aw_cali_desc *cali_desc)
895{
896	struct aw_device *aw_dev =
897		container_of(cali_desc, struct aw_device, cali_desc);
898	u32 dsp_ra;
899	int ret;
900
901	ret = aw_dev_dsp_read(aw_dev, AW88399_DSP_REG_CFG_ADPZ_RA,
902				&dsp_ra, AW88399_DSP_32_DATA);
903	if (ret) {
904		dev_err(aw_dev->dev, "read ra error");
905		return ret;
906	}
907
908	cali_desc->ra = AW88399_DSP_RE_TO_SHOW_RE(dsp_ra,
909					AW88399_DSP_RE_SHIFT);
910
911	return 0;
912}
913
914static int aw_dev_dsp_update_cfg(struct aw_device *aw_dev,
915			unsigned char *data, unsigned int len)
916{
917	int ret;
918
919	dev_dbg(aw_dev->dev, "dsp config len:%d", len);
920
921	if (!len || !data) {
922		dev_err(aw_dev->dev, "dsp config data is null or len is 0");
923		return -EINVAL;
924	}
925
926	ret = aw_dev_dsp_update_container(aw_dev, data, len, AW88399_DSP_CFG_ADDR);
927	if (ret)
928		return ret;
929
930	aw_dev->dsp_cfg_len = len;
931
932	ret = aw_dev_get_ra(&aw_dev->cali_desc);
933
934	return ret;
935}
936
937static int aw_dev_dsp_update_fw(struct aw_device *aw_dev,
938			unsigned char *data, unsigned int len)
939{
940	int ret;
941
942	dev_dbg(aw_dev->dev, "dsp firmware len:%d", len);
943
944	if (!len || !data) {
945		dev_err(aw_dev->dev, "dsp firmware data is null or len is 0");
946		return -EINVAL;
947	}
948
949	aw_dev->dsp_fw_len = len;
950	ret = aw_dev_dsp_update_container(aw_dev, data, len, AW88399_DSP_FW_ADDR);
951
952	return ret;
953}
954
955static int aw_dev_check_sram(struct aw_device *aw_dev)
956{
957	unsigned int reg_val;
958
959	mutex_lock(&aw_dev->dsp_lock);
960	/* read dsp_rom_check_reg */
961	aw_dev_dsp_read_16bit(aw_dev, AW88399_DSP_ROM_CHECK_ADDR, &reg_val);
962	if (reg_val != AW88399_DSP_ROM_CHECK_DATA) {
963		dev_err(aw_dev->dev, "check dsp rom failed, read[0x%x] != check[0x%x]",
964						reg_val, AW88399_DSP_ROM_CHECK_DATA);
965		goto error;
966	}
967
968	/* check dsp_cfg_base_addr */
969	aw_dev_dsp_write_16bit(aw_dev, AW88399_DSP_CFG_ADDR, AW88399_DSP_ODD_NUM_BIT_TEST);
970	aw_dev_dsp_read_16bit(aw_dev, AW88399_DSP_CFG_ADDR, &reg_val);
971	if (reg_val != AW88399_DSP_ODD_NUM_BIT_TEST) {
972		dev_err(aw_dev->dev, "check dsp cfg failed, read[0x%x] != write[0x%x]",
973						reg_val, AW88399_DSP_ODD_NUM_BIT_TEST);
974		goto error;
975	}
976	mutex_unlock(&aw_dev->dsp_lock);
977
978	return 0;
979error:
980	mutex_unlock(&aw_dev->dsp_lock);
981	return -EPERM;
982}
983
984static void aw_dev_select_memclk(struct aw_device *aw_dev, unsigned char flag)
985{
986	int ret;
987
988	switch (flag) {
989	case AW88399_DEV_MEMCLK_PLL:
990		ret = regmap_update_bits(aw_dev->regmap, AW88399_DBGCTRL_REG,
991					~AW88399_MEM_CLKSEL_MASK,
992					AW88399_MEM_CLKSEL_DAPHCLK_VALUE);
993		if (ret)
994			dev_err(aw_dev->dev, "memclk select pll failed");
995		break;
996	case AW88399_DEV_MEMCLK_OSC:
997		ret = regmap_update_bits(aw_dev->regmap, AW88399_DBGCTRL_REG,
998					~AW88399_MEM_CLKSEL_MASK,
999					AW88399_MEM_CLKSEL_OSCCLK_VALUE);
1000		if (ret)
1001			dev_err(aw_dev->dev, "memclk select OSC failed");
1002		break;
1003	default:
1004		dev_err(aw_dev->dev, "unknown memclk config, flag=0x%x", flag);
1005		break;
1006	}
1007}
1008
1009static void aw_dev_get_cur_mode_st(struct aw_device *aw_dev)
1010{
1011	struct aw_profctrl_desc *profctrl_desc = &aw_dev->profctrl_desc;
1012	unsigned int reg_val;
1013	int ret;
1014
1015	ret = regmap_read(aw_dev->regmap, AW88399_SYSCTRL_REG, &reg_val);
1016	if (ret) {
1017		dev_dbg(aw_dev->dev, "%s failed", __func__);
1018		return;
1019	}
1020	if ((reg_val & (~AW88399_RCV_MODE_MASK)) == AW88399_RCV_MODE_RECEIVER_VALUE)
1021		profctrl_desc->cur_mode = AW88399_RCV_MODE;
1022	else
1023		profctrl_desc->cur_mode = AW88399_NOT_RCV_MODE;
1024}
1025
1026static int aw_dev_update_reg_container(struct aw88399 *aw88399,
1027				unsigned char *data, unsigned int len)
1028{
1029	struct aw_device *aw_dev = aw88399->aw_pa;
1030	struct aw_volume_desc *vol_desc = &aw_dev->volume_desc;
1031	u16 read_vol, reg_val;
1032	int data_len, i, ret;
1033	int16_t *reg_data;
1034	u8 reg_addr;
1035
1036	reg_data = (int16_t *)data;
1037	data_len = len >> 1;
1038
1039	if (data_len & 0x1) {
1040		dev_err(aw_dev->dev, "data len:%d unsupported",	data_len);
1041		return -EINVAL;
1042	}
1043
1044	for (i = 0; i < data_len; i += 2) {
1045		reg_addr = reg_data[i];
1046		reg_val = reg_data[i + 1];
1047
1048		if (reg_addr == AW88399_DSPVCALB_REG) {
1049			aw88399->vcalb_init_val = reg_val;
1050			continue;
1051		}
1052
1053		if (reg_addr == AW88399_SYSCTRL_REG) {
1054			if (reg_val & (~AW88399_DSPBY_MASK))
1055				aw_dev->dsp_cfg = AW88399_DEV_DSP_BYPASS;
1056			else
1057				aw_dev->dsp_cfg = AW88399_DEV_DSP_WORK;
1058
1059			reg_val &= (AW88399_HMUTE_MASK | AW88399_PWDN_MASK |
1060						AW88399_DSPBY_MASK);
1061			reg_val |= (AW88399_HMUTE_ENABLE_VALUE | AW88399_PWDN_POWER_DOWN_VALUE |
1062						AW88399_DSPBY_BYPASS_VALUE);
1063		}
1064
1065		if (reg_addr == AW88399_I2SCTRL3_REG) {
1066			reg_val &= AW88399_I2STXEN_MASK;
1067			reg_val |= AW88399_I2STXEN_DISABLE_VALUE;
1068		}
1069
1070		if (reg_addr == AW88399_SYSCTRL2_REG) {
1071			read_vol = (reg_val & (~AW88399_VOL_MASK)) >>
1072				AW88399_VOL_START_BIT;
1073			aw_dev->volume_desc.init_volume = read_vol;
1074		}
1075
1076		if (reg_addr == AW88399_DBGCTRL_REG) {
1077			if ((reg_val & (~AW88399_EF_DBMD_MASK)) == AW88399_EF_DBMD_OR_VALUE)
1078				aw88399->check_val = AW_EF_OR_CHECK;
1079			else
1080				aw88399->check_val = AW_EF_AND_CHECK;
1081
1082			aw88399->dither_st = reg_val & (~AW88399_DITHER_EN_MASK);
1083		}
1084
1085		if (reg_addr == AW88399_CRCCTRL_REG)
1086			aw88399->crc_init_val = reg_val;
1087
1088		ret = regmap_write(aw_dev->regmap, reg_addr, reg_val);
1089		if (ret)
1090			return ret;
1091	}
1092
1093	aw_dev_pwd(aw_dev, false);
1094	usleep_range(AW88399_1000_US, AW88399_1000_US + 10);
1095
1096	aw_dev_get_cur_mode_st(aw_dev);
1097
1098	if (aw_dev->prof_cur != aw_dev->prof_index)
1099		vol_desc->ctl_volume = 0;
1100	else
1101		aw_dev_set_volume(aw_dev, vol_desc->ctl_volume);
1102
1103	return 0;
1104}
1105
1106static int aw_dev_reg_update(struct aw88399 *aw88399,
1107					unsigned char *data, unsigned int len)
1108{
1109	int ret;
1110
1111	if (!len || !data) {
1112		dev_err(aw88399->aw_pa->dev, "reg data is null or len is 0");
1113		return -EINVAL;
1114	}
1115
1116	ret = aw_dev_update_reg_container(aw88399, data, len);
1117	if (ret)
1118		dev_err(aw88399->aw_pa->dev, "reg update failed");
1119
1120	return ret;
1121}
1122
1123static int aw88399_dev_get_prof_name(struct aw_device *aw_dev, int index, char **prof_name)
1124{
1125	struct aw_prof_info *prof_info = &aw_dev->prof_info;
1126	struct aw_prof_desc *prof_desc;
1127
1128	if ((index >= aw_dev->prof_info.count) || (index < 0)) {
1129		dev_err(aw_dev->dev, "index[%d] overflow count[%d]",
1130			index, aw_dev->prof_info.count);
1131		return -EINVAL;
1132	}
1133
1134	prof_desc = &aw_dev->prof_info.prof_desc[index];
1135
1136	*prof_name = prof_info->prof_name_list[prof_desc->id];
1137
1138	return 0;
1139}
1140
1141static int aw88399_dev_get_prof_data(struct aw_device *aw_dev, int index,
1142			struct aw_prof_desc **prof_desc)
1143{
1144	if ((index >= aw_dev->prof_info.count) || (index < 0)) {
1145		dev_err(aw_dev->dev, "%s: index[%d] overflow count[%d]\n",
1146				__func__, index, aw_dev->prof_info.count);
1147		return -EINVAL;
1148	}
1149
1150	*prof_desc = &aw_dev->prof_info.prof_desc[index];
1151
1152	return 0;
1153}
1154
1155static int aw88399_dev_fw_update(struct aw88399 *aw88399, bool up_dsp_fw_en, bool force_up_en)
1156{
1157	struct aw_device *aw_dev = aw88399->aw_pa;
1158	struct aw_prof_desc *prof_index_desc;
1159	struct aw_sec_data_desc *sec_desc;
1160	char *prof_name;
1161	int ret;
1162
1163	if ((aw_dev->prof_cur == aw_dev->prof_index) &&
1164			(force_up_en == AW88399_FORCE_UPDATE_OFF)) {
1165		dev_dbg(aw_dev->dev, "scene no change, not update");
1166		return 0;
1167	}
1168
1169	if (aw_dev->fw_status == AW88399_DEV_FW_FAILED) {
1170		dev_err(aw_dev->dev, "fw status[%d] error", aw_dev->fw_status);
1171		return -EPERM;
1172	}
1173
1174	ret = aw88399_dev_get_prof_name(aw_dev, aw_dev->prof_index, &prof_name);
1175	if (ret)
1176		return ret;
1177
1178	dev_dbg(aw_dev->dev, "start update %s", prof_name);
1179
1180	ret = aw88399_dev_get_prof_data(aw_dev, aw_dev->prof_index, &prof_index_desc);
1181	if (ret)
1182		return ret;
1183
1184	/* update reg */
1185	sec_desc = prof_index_desc->sec_desc;
1186	ret = aw_dev_reg_update(aw88399, sec_desc[AW88395_DATA_TYPE_REG].data,
1187					sec_desc[AW88395_DATA_TYPE_REG].len);
1188	if (ret) {
1189		dev_err(aw_dev->dev, "update reg failed");
1190		return ret;
1191	}
1192
1193	aw88399_dev_mute(aw_dev, true);
1194
1195	if (aw_dev->dsp_cfg == AW88399_DEV_DSP_WORK)
1196		aw_dev_dsp_enable(aw_dev, false);
1197
1198	aw_dev_select_memclk(aw_dev, AW88399_DEV_MEMCLK_OSC);
1199
1200	ret = aw_dev_check_sram(aw_dev);
1201	if (ret) {
1202		dev_err(aw_dev->dev, "check sram failed");
1203		goto error;
1204	}
1205
1206	if (up_dsp_fw_en) {
1207		dev_dbg(aw_dev->dev, "fw_ver: [%x]", prof_index_desc->fw_ver);
1208		ret = aw_dev_dsp_update_fw(aw_dev, sec_desc[AW88395_DATA_TYPE_DSP_FW].data,
1209					sec_desc[AW88395_DATA_TYPE_DSP_FW].len);
1210		if (ret) {
1211			dev_err(aw_dev->dev, "update dsp fw failed");
1212			goto error;
1213		}
1214	}
1215
1216	/* update dsp config */
1217	ret = aw_dev_dsp_update_cfg(aw_dev, sec_desc[AW88395_DATA_TYPE_DSP_CFG].data,
1218					sec_desc[AW88395_DATA_TYPE_DSP_CFG].len);
1219	if (ret) {
1220		dev_err(aw_dev->dev, "update dsp cfg failed");
1221		goto error;
1222	}
1223
1224	aw_dev_select_memclk(aw_dev, AW88399_DEV_MEMCLK_PLL);
1225
1226	aw_dev->prof_cur = aw_dev->prof_index;
1227
1228	return 0;
1229
1230error:
1231	aw_dev_select_memclk(aw_dev, AW88399_DEV_MEMCLK_PLL);
1232	return ret;
1233}
1234
1235static void aw88399_start_pa(struct aw88399 *aw88399)
1236{
1237	int ret, i;
1238
1239	for (i = 0; i < AW88399_START_RETRIES; i++) {
1240		ret = aw88399_dev_start(aw88399);
1241		if (ret) {
1242			dev_err(aw88399->aw_pa->dev, "aw88399 device start failed. retry = %d", i);
1243			ret = aw88399_dev_fw_update(aw88399, AW88399_DSP_FW_UPDATE_ON, true);
1244			if (ret) {
1245				dev_err(aw88399->aw_pa->dev, "fw update failed");
1246				continue;
1247			}
1248		} else {
1249			dev_dbg(aw88399->aw_pa->dev, "start success\n");
1250			break;
1251		}
1252	}
1253}
1254
1255static void aw88399_startup_work(struct work_struct *work)
1256{
1257	struct aw88399 *aw88399 =
1258		container_of(work, struct aw88399, start_work.work);
1259
1260	mutex_lock(&aw88399->lock);
1261	aw88399_start_pa(aw88399);
1262	mutex_unlock(&aw88399->lock);
1263}
1264
1265static void aw88399_start(struct aw88399 *aw88399, bool sync_start)
1266{
1267	int ret;
1268
1269	if (aw88399->aw_pa->fw_status != AW88399_DEV_FW_OK)
1270		return;
1271
1272	if (aw88399->aw_pa->status == AW88399_DEV_PW_ON)
1273		return;
1274
1275	ret = aw88399_dev_fw_update(aw88399, AW88399_DSP_FW_UPDATE_OFF, true);
1276	if (ret) {
1277		dev_err(aw88399->aw_pa->dev, "fw update failed.");
1278		return;
1279	}
1280
1281	if (sync_start == AW88399_SYNC_START)
1282		aw88399_start_pa(aw88399);
1283	else
1284		queue_delayed_work(system_wq,
1285			&aw88399->start_work,
1286			AW88399_START_WORK_DELAY_MS);
1287}
1288
1289static int aw_dev_check_sysint(struct aw_device *aw_dev)
1290{
1291	u16 reg_val;
1292
1293	aw_dev_get_int_status(aw_dev, &reg_val);
1294	if (reg_val & AW88399_BIT_SYSINT_CHECK) {
1295		dev_err(aw_dev->dev, "pa stop check fail:0x%04x", reg_val);
1296		return -EINVAL;
1297	}
1298
1299	return 0;
1300}
1301
1302static int aw88399_stop(struct aw_device *aw_dev)
1303{
1304	struct aw_sec_data_desc *dsp_cfg =
1305		&aw_dev->prof_info.prof_desc[aw_dev->prof_cur].sec_desc[AW88395_DATA_TYPE_DSP_CFG];
1306	struct aw_sec_data_desc *dsp_fw =
1307		&aw_dev->prof_info.prof_desc[aw_dev->prof_cur].sec_desc[AW88395_DATA_TYPE_DSP_FW];
1308	int int_st;
1309
1310	if (aw_dev->status == AW88399_DEV_PW_OFF) {
1311		dev_dbg(aw_dev->dev, "already power off");
1312		return 0;
1313	}
1314
1315	aw_dev->status = AW88399_DEV_PW_OFF;
1316
1317	aw88399_dev_mute(aw_dev, true);
1318	usleep_range(AW88399_4000_US, AW88399_4000_US + 100);
1319
1320	aw_dev_i2s_tx_enable(aw_dev, false);
1321	usleep_range(AW88399_1000_US, AW88399_1000_US + 100);
1322
1323	int_st = aw_dev_check_sysint(aw_dev);
1324
1325	aw_dev_dsp_enable(aw_dev, false);
1326
1327	aw_dev_amppd(aw_dev, true);
1328
1329	if (int_st) {
1330		aw_dev_select_memclk(aw_dev, AW88399_DEV_MEMCLK_OSC);
1331		aw_dev_dsp_update_fw(aw_dev, dsp_fw->data, dsp_fw->len);
1332		aw_dev_dsp_update_cfg(aw_dev, dsp_cfg->data, dsp_cfg->len);
1333		aw_dev_select_memclk(aw_dev, AW88399_DEV_MEMCLK_PLL);
1334	}
1335
1336	aw_dev_pwd(aw_dev, true);
1337
1338	return 0;
1339}
1340
1341static struct snd_soc_dai_driver aw88399_dai[] = {
1342	{
1343		.name = "aw88399-aif",
1344		.id = 1,
1345		.playback = {
1346			.stream_name = "Speaker_Playback",
1347			.channels_min = 1,
1348			.channels_max = 2,
1349			.rates = AW88399_RATES,
1350			.formats = AW88399_FORMATS,
1351		},
1352		.capture = {
1353			.stream_name = "Speaker_Capture",
1354			.channels_min = 1,
1355			.channels_max = 2,
1356			.rates = AW88399_RATES,
1357			.formats = AW88399_FORMATS,
1358		},
1359	},
1360};
1361
1362static int aw88399_get_fade_in_time(struct snd_kcontrol *kcontrol,
1363	struct snd_ctl_elem_value *ucontrol)
1364{
1365	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
1366	struct aw88399 *aw88399 = snd_soc_component_get_drvdata(component);
1367	struct aw_device *aw_dev = aw88399->aw_pa;
1368
1369	ucontrol->value.integer.value[0] = aw_dev->fade_in_time;
1370
1371	return 0;
1372}
1373
1374static int aw88399_set_fade_in_time(struct snd_kcontrol *kcontrol,
1375	struct snd_ctl_elem_value *ucontrol)
1376{
1377	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
1378	struct aw88399 *aw88399 = snd_soc_component_get_drvdata(component);
1379	struct soc_mixer_control *mc =
1380		(struct soc_mixer_control *)kcontrol->private_value;
1381	struct aw_device *aw_dev = aw88399->aw_pa;
1382	int time;
1383
1384	time = ucontrol->value.integer.value[0];
1385
1386	if (time < mc->min || time > mc->max)
1387		return -EINVAL;
1388
1389	if (time != aw_dev->fade_in_time) {
1390		aw_dev->fade_in_time = time;
1391		return 1;
1392	}
1393
1394	return 0;
1395}
1396
1397static int aw88399_get_fade_out_time(struct snd_kcontrol *kcontrol,
1398	struct snd_ctl_elem_value *ucontrol)
1399{
1400	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
1401	struct aw88399 *aw88399 = snd_soc_component_get_drvdata(component);
1402	struct aw_device *aw_dev = aw88399->aw_pa;
1403
1404	ucontrol->value.integer.value[0] = aw_dev->fade_out_time;
1405
1406	return 0;
1407}
1408
1409static int aw88399_set_fade_out_time(struct snd_kcontrol *kcontrol,
1410	struct snd_ctl_elem_value *ucontrol)
1411{
1412	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
1413	struct aw88399 *aw88399 = snd_soc_component_get_drvdata(component);
1414	struct soc_mixer_control *mc =
1415		(struct soc_mixer_control *)kcontrol->private_value;
1416	struct aw_device *aw_dev = aw88399->aw_pa;
1417	int time;
1418
1419	time = ucontrol->value.integer.value[0];
1420	if (time < mc->min || time > mc->max)
1421		return -EINVAL;
1422
1423	if (time != aw_dev->fade_out_time) {
1424		aw_dev->fade_out_time = time;
1425		return 1;
1426	}
1427
1428	return 0;
1429}
1430
1431static int aw88399_dev_set_profile_index(struct aw_device *aw_dev, int index)
1432{
1433	/* check the index whether is valid */
1434	if ((index >= aw_dev->prof_info.count) || (index < 0))
1435		return -EINVAL;
1436	/* check the index whether change */
1437	if (aw_dev->prof_index == index)
1438		return -EINVAL;
1439
1440	aw_dev->prof_index = index;
1441	dev_dbg(aw_dev->dev, "set prof[%s]",
1442		aw_dev->prof_info.prof_name_list[aw_dev->prof_info.prof_desc[index].id]);
1443
1444	return 0;
1445}
1446
1447static int aw88399_profile_info(struct snd_kcontrol *kcontrol,
1448			 struct snd_ctl_elem_info *uinfo)
1449{
1450	struct snd_soc_component *codec = snd_soc_kcontrol_component(kcontrol);
1451	struct aw88399 *aw88399 = snd_soc_component_get_drvdata(codec);
1452	char *prof_name, *name;
1453	int count, ret;
1454
1455	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
1456	uinfo->count = 1;
1457
1458	count = aw88399->aw_pa->prof_info.count;
1459	if (count <= 0) {
1460		uinfo->value.enumerated.items = 0;
1461		return 0;
1462	}
1463
1464	uinfo->value.enumerated.items = count;
1465
1466	if (uinfo->value.enumerated.item >= count)
1467		uinfo->value.enumerated.item = count - 1;
1468
1469	name = uinfo->value.enumerated.name;
1470	count = uinfo->value.enumerated.item;
1471
1472	ret = aw88399_dev_get_prof_name(aw88399->aw_pa, count, &prof_name);
1473	if (ret) {
1474		strscpy(uinfo->value.enumerated.name, "null",
1475						strlen("null") + 1);
1476		return 0;
1477	}
1478
1479	strscpy(name, prof_name, sizeof(uinfo->value.enumerated.name));
1480
1481	return 0;
1482}
1483
1484static int aw88399_profile_get(struct snd_kcontrol *kcontrol,
1485			struct snd_ctl_elem_value *ucontrol)
1486{
1487	struct snd_soc_component *codec = snd_soc_kcontrol_component(kcontrol);
1488	struct aw88399 *aw88399 = snd_soc_component_get_drvdata(codec);
1489
1490	ucontrol->value.integer.value[0] = aw88399->aw_pa->prof_index;
1491
1492	return 0;
1493}
1494
1495static int aw88399_profile_set(struct snd_kcontrol *kcontrol,
1496		struct snd_ctl_elem_value *ucontrol)
1497{
1498	struct snd_soc_component *codec = snd_soc_kcontrol_component(kcontrol);
1499	struct aw88399 *aw88399 = snd_soc_component_get_drvdata(codec);
1500	int ret;
1501
1502	mutex_lock(&aw88399->lock);
1503	ret = aw88399_dev_set_profile_index(aw88399->aw_pa, ucontrol->value.integer.value[0]);
1504	if (ret) {
1505		dev_dbg(codec->dev, "profile index does not change");
1506		mutex_unlock(&aw88399->lock);
1507		return 0;
1508	}
1509
1510	if (aw88399->aw_pa->status) {
1511		aw88399_stop(aw88399->aw_pa);
1512		aw88399_start(aw88399, AW88399_SYNC_START);
1513	}
1514
1515	mutex_unlock(&aw88399->lock);
1516
1517	return 1;
1518}
1519
1520static int aw88399_volume_get(struct snd_kcontrol *kcontrol,
1521				struct snd_ctl_elem_value *ucontrol)
1522{
1523	struct snd_soc_component *codec = snd_soc_kcontrol_component(kcontrol);
1524	struct aw88399 *aw88399 = snd_soc_component_get_drvdata(codec);
1525	struct aw_volume_desc *vol_desc = &aw88399->aw_pa->volume_desc;
1526
1527	ucontrol->value.integer.value[0] = vol_desc->ctl_volume;
1528
1529	return 0;
1530}
1531
1532static int aw88399_volume_set(struct snd_kcontrol *kcontrol,
1533				struct snd_ctl_elem_value *ucontrol)
1534{
1535	struct snd_soc_component *codec = snd_soc_kcontrol_component(kcontrol);
1536	struct aw88399 *aw88399 = snd_soc_component_get_drvdata(codec);
1537	struct aw_volume_desc *vol_desc = &aw88399->aw_pa->volume_desc;
1538	struct soc_mixer_control *mc =
1539		(struct soc_mixer_control *)kcontrol->private_value;
1540	int value;
1541
1542	value = ucontrol->value.integer.value[0];
1543	if (value < mc->min || value > mc->max)
1544		return -EINVAL;
1545
1546	if (vol_desc->ctl_volume != value) {
1547		vol_desc->ctl_volume = value;
1548		aw_dev_set_volume(aw88399->aw_pa, vol_desc->ctl_volume);
1549
1550		return 1;
1551	}
1552
1553	return 0;
1554}
1555
1556static int aw88399_get_fade_step(struct snd_kcontrol *kcontrol,
1557				struct snd_ctl_elem_value *ucontrol)
1558{
1559	struct snd_soc_component *codec = snd_soc_kcontrol_component(kcontrol);
1560	struct aw88399 *aw88399 = snd_soc_component_get_drvdata(codec);
1561
1562	ucontrol->value.integer.value[0] = aw88399->aw_pa->fade_step;
1563
1564	return 0;
1565}
1566
1567static int aw88399_set_fade_step(struct snd_kcontrol *kcontrol,
1568				struct snd_ctl_elem_value *ucontrol)
1569{
1570	struct snd_soc_component *codec = snd_soc_kcontrol_component(kcontrol);
1571	struct aw88399 *aw88399 = snd_soc_component_get_drvdata(codec);
1572	struct soc_mixer_control *mc =
1573		(struct soc_mixer_control *)kcontrol->private_value;
1574	int value;
1575
1576	value = ucontrol->value.integer.value[0];
1577	if (value < mc->min || value > mc->max)
1578		return -EINVAL;
1579
1580	if (aw88399->aw_pa->fade_step != value) {
1581		aw88399->aw_pa->fade_step = value;
1582		return 1;
1583	}
1584
1585	return 0;
1586}
1587
1588static int aw88399_re_get(struct snd_kcontrol *kcontrol,
1589				struct snd_ctl_elem_value *ucontrol)
1590{
1591	struct snd_soc_component *codec = snd_soc_kcontrol_component(kcontrol);
1592	struct aw88399 *aw88399 = snd_soc_component_get_drvdata(codec);
1593	struct aw_device *aw_dev = aw88399->aw_pa;
1594
1595	ucontrol->value.integer.value[0] = aw_dev->cali_desc.cali_re;
1596
1597	return 0;
1598}
1599
1600static int aw88399_re_set(struct snd_kcontrol *kcontrol,
1601				struct snd_ctl_elem_value *ucontrol)
1602{
1603	struct snd_soc_component *codec = snd_soc_kcontrol_component(kcontrol);
1604	struct aw88399 *aw88399 = snd_soc_component_get_drvdata(codec);
1605	struct soc_mixer_control *mc =
1606		(struct soc_mixer_control *)kcontrol->private_value;
1607	struct aw_device *aw_dev = aw88399->aw_pa;
1608	int value;
1609
1610	value = ucontrol->value.integer.value[0];
1611	if (value < mc->min || value > mc->max)
1612		return -EINVAL;
1613
1614	if (aw_dev->cali_desc.cali_re != value) {
1615		aw_dev->cali_desc.cali_re = value;
1616		return 1;
1617	}
1618
1619	return 0;
1620}
1621
1622static int aw88399_dev_init(struct aw88399 *aw88399, struct aw_container *aw_cfg)
1623{
1624	struct aw_device *aw_dev = aw88399->aw_pa;
1625	int ret;
1626
1627	ret = aw88395_dev_cfg_load(aw_dev, aw_cfg);
1628	if (ret) {
1629		dev_err(aw_dev->dev, "aw_dev acf parse failed");
1630		return -EINVAL;
1631	}
1632	aw_dev->fade_in_time = AW88399_1000_US / 10;
1633	aw_dev->fade_out_time = AW88399_1000_US >> 1;
1634	aw_dev->prof_cur = aw_dev->prof_info.prof_desc[0].id;
1635	aw_dev->prof_index = aw_dev->prof_info.prof_desc[0].id;
1636
1637	ret = aw88399_dev_fw_update(aw88399, AW88399_FORCE_UPDATE_ON, AW88399_DSP_FW_UPDATE_ON);
1638	if (ret) {
1639		dev_err(aw_dev->dev, "fw update failed ret = %d\n", ret);
1640		return ret;
1641	}
1642
1643	aw88399_dev_mute(aw_dev, true);
1644
1645	/* close tx feedback */
1646	aw_dev_i2s_tx_enable(aw_dev, false);
1647	usleep_range(AW88399_1000_US, AW88399_1000_US + 100);
1648
1649	/* enable amppd */
1650	aw_dev_amppd(aw_dev, true);
1651
1652	/* close dsp */
1653	aw_dev_dsp_enable(aw_dev, false);
1654	/* set power down */
1655	aw_dev_pwd(aw_dev, true);
1656
1657	return 0;
1658}
1659
1660static int aw88399_request_firmware_file(struct aw88399 *aw88399)
1661{
1662	const struct firmware *cont = NULL;
1663	int ret;
1664
1665	aw88399->aw_pa->fw_status = AW88399_DEV_FW_FAILED;
1666
1667	ret = request_firmware(&cont, AW88399_ACF_FILE, aw88399->aw_pa->dev);
1668	if (ret) {
1669		dev_err(aw88399->aw_pa->dev, "request [%s] failed!", AW88399_ACF_FILE);
1670		return ret;
1671	}
1672
1673	dev_dbg(aw88399->aw_pa->dev, "loaded %s - size: %zu\n",
1674			AW88399_ACF_FILE, cont ? cont->size : 0);
1675
1676	aw88399->aw_cfg = devm_kzalloc(aw88399->aw_pa->dev,
1677			struct_size(aw88399->aw_cfg, data, cont->size), GFP_KERNEL);
1678	if (!aw88399->aw_cfg) {
1679		release_firmware(cont);
1680		return -ENOMEM;
1681	}
1682	aw88399->aw_cfg->len = (int)cont->size;
1683	memcpy(aw88399->aw_cfg->data, cont->data, cont->size);
1684	release_firmware(cont);
1685
1686	ret = aw88395_dev_load_acf_check(aw88399->aw_pa, aw88399->aw_cfg);
1687	if (ret) {
1688		dev_err(aw88399->aw_pa->dev, "load [%s] failed!", AW88399_ACF_FILE);
1689		return ret;
1690	}
1691
1692	mutex_lock(&aw88399->lock);
1693	/* aw device init */
1694	ret = aw88399_dev_init(aw88399, aw88399->aw_cfg);
1695	if (ret)
1696		dev_err(aw88399->aw_pa->dev, "dev init failed");
1697	mutex_unlock(&aw88399->lock);
1698
1699	return ret;
1700}
1701
1702static const struct snd_kcontrol_new aw88399_controls[] = {
1703	SOC_SINGLE_EXT("PCM Playback Volume", AW88399_SYSCTRL2_REG,
1704		6, AW88399_MUTE_VOL, 0, aw88399_volume_get,
1705		aw88399_volume_set),
1706	SOC_SINGLE_EXT("Fade Step", 0, 0, AW88399_MUTE_VOL, 0,
1707		aw88399_get_fade_step, aw88399_set_fade_step),
1708	SOC_SINGLE_EXT("Volume Ramp Up Step", 0, 0, FADE_TIME_MAX, FADE_TIME_MIN,
1709		aw88399_get_fade_in_time, aw88399_set_fade_in_time),
1710	SOC_SINGLE_EXT("Volume Ramp Down Step", 0, 0, FADE_TIME_MAX, FADE_TIME_MIN,
1711		aw88399_get_fade_out_time, aw88399_set_fade_out_time),
1712	SOC_SINGLE_EXT("Calib", 0, 0, AW88399_CALI_RE_MAX, 0,
1713		aw88399_re_get, aw88399_re_set),
1714	AW88399_PROFILE_EXT("AW88399 Profile Set", aw88399_profile_info,
1715		aw88399_profile_get, aw88399_profile_set),
1716};
1717
1718static int aw88399_playback_event(struct snd_soc_dapm_widget *w,
1719				struct snd_kcontrol *k, int event)
1720{
1721	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
1722	struct aw88399 *aw88399 = snd_soc_component_get_drvdata(component);
1723
1724	mutex_lock(&aw88399->lock);
1725	switch (event) {
1726	case SND_SOC_DAPM_PRE_PMU:
1727		aw88399_start(aw88399, AW88399_ASYNC_START);
1728		break;
1729	case SND_SOC_DAPM_POST_PMD:
1730		aw88399_stop(aw88399->aw_pa);
1731		break;
1732	default:
1733		break;
1734	}
1735	mutex_unlock(&aw88399->lock);
1736
1737	return 0;
1738}
1739
1740static const struct snd_soc_dapm_widget aw88399_dapm_widgets[] = {
1741	 /* playback */
1742	SND_SOC_DAPM_AIF_IN_E("AIF_RX", "Speaker_Playback", 0, 0, 0, 0,
1743					aw88399_playback_event,
1744					SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
1745	SND_SOC_DAPM_OUTPUT("DAC Output"),
1746
1747	/* capture */
1748	SND_SOC_DAPM_AIF_OUT("AIF_TX", "Speaker_Capture", 0, SND_SOC_NOPM, 0, 0),
1749	SND_SOC_DAPM_INPUT("ADC Input"),
1750};
1751
1752static const struct snd_soc_dapm_route aw88399_audio_map[] = {
1753	{"DAC Output", NULL, "AIF_RX"},
1754	{"AIF_TX", NULL, "ADC Input"},
1755};
1756
1757static int aw88399_codec_probe(struct snd_soc_component *component)
1758{
1759	struct aw88399 *aw88399 = snd_soc_component_get_drvdata(component);
1760	int ret;
1761
1762	INIT_DELAYED_WORK(&aw88399->start_work, aw88399_startup_work);
1763
1764	ret = aw88399_request_firmware_file(aw88399);
1765	if (ret)
1766		dev_err(aw88399->aw_pa->dev, "%s failed\n", __func__);
1767
1768	return ret;
1769}
1770
1771static void aw88399_codec_remove(struct snd_soc_component *aw_codec)
1772{
1773	struct aw88399 *aw88399 = snd_soc_component_get_drvdata(aw_codec);
1774
1775	cancel_delayed_work_sync(&aw88399->start_work);
1776}
1777
1778static const struct snd_soc_component_driver soc_codec_dev_aw88399 = {
1779	.probe = aw88399_codec_probe,
1780	.remove = aw88399_codec_remove,
1781	.dapm_widgets = aw88399_dapm_widgets,
1782	.num_dapm_widgets = ARRAY_SIZE(aw88399_dapm_widgets),
1783	.dapm_routes = aw88399_audio_map,
1784	.num_dapm_routes = ARRAY_SIZE(aw88399_audio_map),
1785	.controls = aw88399_controls,
1786	.num_controls = ARRAY_SIZE(aw88399_controls),
1787};
1788
1789static void aw88399_hw_reset(struct aw88399 *aw88399)
1790{
1791	if (aw88399->reset_gpio) {
1792		gpiod_set_value_cansleep(aw88399->reset_gpio, 1);
1793		usleep_range(AW88399_1000_US, AW88399_1000_US + 10);
1794		gpiod_set_value_cansleep(aw88399->reset_gpio, 0);
1795		usleep_range(AW88399_1000_US, AW88399_1000_US + 10);
1796		gpiod_set_value_cansleep(aw88399->reset_gpio, 1);
1797		usleep_range(AW88399_1000_US, AW88399_1000_US + 10);
1798	}
1799}
1800
1801static void aw88399_parse_channel_dt(struct aw_device *aw_dev)
1802{
1803	struct device_node *np = aw_dev->dev->of_node;
1804	u32 channel_value;
1805
1806	of_property_read_u32(np, "awinic,audio-channel", &channel_value);
1807	aw_dev->channel = channel_value;
1808}
1809
1810static int aw88399_init(struct aw88399 *aw88399, struct i2c_client *i2c, struct regmap *regmap)
1811{
1812	struct aw_device *aw_dev;
1813	unsigned int chip_id;
1814	int ret;
1815
1816	ret = regmap_read(regmap, AW88399_ID_REG, &chip_id);
1817	if (ret) {
1818		dev_err(&i2c->dev, "%s read chipid error. ret = %d", __func__, ret);
1819		return ret;
1820	}
1821	if (chip_id != AW88399_CHIP_ID) {
1822		dev_err(&i2c->dev, "unsupported device");
1823		return -ENXIO;
1824	}
1825	dev_dbg(&i2c->dev, "chip id = %x\n", chip_id);
1826
1827	aw_dev = devm_kzalloc(&i2c->dev, sizeof(*aw_dev), GFP_KERNEL);
1828	if (!aw_dev)
1829		return -ENOMEM;
1830	aw88399->aw_pa = aw_dev;
1831
1832	aw_dev->i2c = i2c;
1833	aw_dev->dev = &i2c->dev;
1834	aw_dev->regmap = regmap;
1835	mutex_init(&aw_dev->dsp_lock);
1836
1837	aw_dev->chip_id = chip_id;
1838	aw_dev->acf = NULL;
1839	aw_dev->prof_info.prof_desc = NULL;
1840	aw_dev->prof_info.count = 0;
1841	aw_dev->prof_info.prof_type = AW88395_DEV_NONE_TYPE_ID;
1842	aw_dev->channel = AW88399_DEV_DEFAULT_CH;
1843	aw_dev->fw_status = AW88399_DEV_FW_FAILED;
1844
1845	aw_dev->fade_step = AW88399_VOLUME_STEP_DB;
1846	aw_dev->volume_desc.ctl_volume = AW88399_VOL_DEFAULT_VALUE;
1847
1848	aw88399_parse_channel_dt(aw_dev);
1849
1850	return 0;
1851}
1852
1853static int aw88399_i2c_probe(struct i2c_client *i2c)
1854{
1855	struct aw88399 *aw88399;
1856	int ret;
1857
1858	if (!i2c_check_functionality(i2c->adapter, I2C_FUNC_I2C))
1859		return dev_err_probe(&i2c->dev, -ENXIO, "check_functionality failed");
1860
1861	aw88399 = devm_kzalloc(&i2c->dev, sizeof(*aw88399), GFP_KERNEL);
1862	if (!aw88399)
1863		return -ENOMEM;
1864
1865	mutex_init(&aw88399->lock);
1866
1867	i2c_set_clientdata(i2c, aw88399);
1868
1869	aw88399->reset_gpio = devm_gpiod_get_optional(&i2c->dev, "reset", GPIOD_OUT_LOW);
1870	if (IS_ERR(aw88399->reset_gpio))
1871		return dev_err_probe(&i2c->dev, PTR_ERR(aw88399->reset_gpio),
1872							"reset gpio not defined\n");
1873	aw88399_hw_reset(aw88399);
1874
1875	aw88399->regmap = devm_regmap_init_i2c(i2c, &aw88399_remap_config);
1876	if (IS_ERR(aw88399->regmap))
1877		return dev_err_probe(&i2c->dev, PTR_ERR(aw88399->regmap),
1878							"failed to init regmap\n");
1879
1880	/* aw pa init */
1881	ret = aw88399_init(aw88399, i2c, aw88399->regmap);
1882	if (ret)
1883		return ret;
1884
1885	ret = devm_snd_soc_register_component(&i2c->dev,
1886			&soc_codec_dev_aw88399,
1887			aw88399_dai, ARRAY_SIZE(aw88399_dai));
1888	if (ret)
1889		dev_err(&i2c->dev, "failed to register aw88399: %d", ret);
1890
1891	return ret;
1892}
1893
1894static const struct i2c_device_id aw88399_i2c_id[] = {
1895	{ AW88399_I2C_NAME, 0 },
1896	{ }
1897};
1898MODULE_DEVICE_TABLE(i2c, aw88399_i2c_id);
1899
1900static struct i2c_driver aw88399_i2c_driver = {
1901	.driver = {
1902		.name = AW88399_I2C_NAME,
1903	},
1904	.probe = aw88399_i2c_probe,
1905	.id_table = aw88399_i2c_id,
1906};
1907module_i2c_driver(aw88399_i2c_driver);
1908
1909MODULE_DESCRIPTION("ASoC AW88399 Smart PA Driver");
1910MODULE_LICENSE("GPL v2");
1911