xref: /linux/sound/soc/codecs/aw88261.c (revision 67f8bc848ee31831336bd478e57d2f993551902e)
1 // SPDX-License-Identifier: GPL-2.0-only
2 //
3 // aw88261.c  --  AW88261 ALSA SoC Audio driver
4 //
5 // Copyright (c) 2023 awinic Technology CO., LTD
6 //
7 // Author: Jimmy Zhang <zhangjianming@awinic.com>
8 // Author: Weidong Wang <wangweidong.a@awinic.com>
9 //
10 
11 #include <linux/cleanup.h>
12 #include <linux/i2c.h>
13 #include <linux/firmware.h>
14 #include <linux/bitops.h>
15 #include <linux/regmap.h>
16 #include <linux/regulator/consumer.h>
17 #include <sound/soc.h>
18 #include <sound/pcm_params.h>
19 #include <sound/tlv.h>
20 #include "aw88261.h"
21 #include "aw88395/aw88395_data_type.h"
22 #include "aw88395/aw88395_device.h"
23 
24 static const struct regmap_config aw88261_remap_config = {
25 	.val_bits = 16,
26 	.reg_bits = 8,
27 	.max_register = AW88261_REG_MAX,
28 	.reg_format_endian = REGMAP_ENDIAN_LITTLE,
29 	.val_format_endian = REGMAP_ENDIAN_BIG,
30 };
31 
32 static void aw88261_dev_set_volume(struct aw_device *aw_dev, unsigned int value)
33 {
34 	unsigned int volume = min(value, (unsigned int)AW88261_MUTE_VOL);
35 
36 	regmap_update_bits(aw_dev->regmap, AW88261_SYSCTRL2_REG,
37 		~AW88261_VOL_MASK, DB_TO_REG_VAL(volume));
38 }
39 
40 static void aw88261_dev_i2s_tx_enable(struct aw_device *aw_dev, bool flag)
41 {
42 	if (flag)
43 		regmap_update_bits(aw_dev->regmap, AW88261_I2SCFG1_REG,
44 			~AW88261_I2STXEN_MASK, AW88261_I2STXEN_ENABLE_VALUE);
45 	else
46 		regmap_update_bits(aw_dev->regmap, AW88261_I2SCFG1_REG,
47 			~AW88261_I2STXEN_MASK, AW88261_I2STXEN_DISABLE_VALUE);
48 }
49 
50 static void aw88261_dev_pwd(struct aw_device *aw_dev, bool pwd)
51 {
52 	if (pwd)
53 		regmap_update_bits(aw_dev->regmap, AW88261_SYSCTRL_REG,
54 				~AW88261_PWDN_MASK, AW88261_PWDN_POWER_DOWN_VALUE);
55 	else
56 		regmap_update_bits(aw_dev->regmap, AW88261_SYSCTRL_REG,
57 				~AW88261_PWDN_MASK, AW88261_PWDN_WORKING_VALUE);
58 }
59 
60 static void aw88261_dev_amppd(struct aw_device *aw_dev, bool amppd)
61 {
62 	if (amppd)
63 		regmap_update_bits(aw_dev->regmap, AW88261_SYSCTRL_REG,
64 				~AW88261_AMPPD_MASK, AW88261_AMPPD_POWER_DOWN_VALUE);
65 	else
66 		regmap_update_bits(aw_dev->regmap, AW88261_SYSCTRL_REG,
67 				~AW88261_AMPPD_MASK, AW88261_AMPPD_WORKING_VALUE);
68 }
69 
70 static void aw88261_dev_mute(struct aw_device *aw_dev, bool is_mute)
71 {
72 	if (is_mute) {
73 		aw88261_dev_set_volume(aw_dev, AW88261_MUTE_VOL);
74 		regmap_update_bits(aw_dev->regmap, AW88261_SYSCTRL_REG,
75 				~AW88261_HMUTE_MASK, AW88261_HMUTE_ENABLE_VALUE);
76 	} else {
77 		regmap_update_bits(aw_dev->regmap, AW88261_SYSCTRL_REG,
78 				~AW88261_HMUTE_MASK, AW88261_HMUTE_DISABLE_VALUE);
79 		aw88261_dev_set_volume(aw_dev, aw_dev->volume_desc.ctl_volume);
80 	}
81 }
82 
83 static void aw88261_dev_clear_int_status(struct aw_device *aw_dev)
84 {
85 	unsigned int int_status;
86 
87 	/* read int status and clear */
88 	regmap_read(aw_dev->regmap, AW88261_SYSINT_REG, &int_status);
89 	/* make sure int status is clear */
90 	regmap_read(aw_dev->regmap, AW88261_SYSINT_REG, &int_status);
91 
92 	dev_dbg(aw_dev->dev, "read interrupt reg = 0x%04x", int_status);
93 }
94 
95 static int aw88261_dev_get_iis_status(struct aw_device *aw_dev)
96 {
97 	unsigned int reg_val;
98 	int ret;
99 
100 	ret = regmap_read(aw_dev->regmap, AW88261_SYSST_REG, &reg_val);
101 	if (ret)
102 		return ret;
103 	if ((reg_val & AW88261_BIT_PLL_CHECK) != AW88261_BIT_PLL_CHECK) {
104 		dev_dbg(aw_dev->dev, "check pll lock fail,reg_val:0x%04x", reg_val);
105 		return -EINVAL;
106 	}
107 
108 	return ret;
109 }
110 
111 static int aw88261_dev_check_pll(struct aw_device *aw_dev)
112 {
113 	int ret, i;
114 
115 	for (i = 0; i < AW88261_DEV_SYSST_CHECK_MAX; i++) {
116 		ret = aw88261_dev_get_iis_status(aw_dev);
117 		if (ret) {
118 			dev_dbg(aw_dev->dev, "mode1 iis signal check error");
119 			usleep_range(AW88261_2000_US, AW88261_2000_US + 10);
120 		} else {
121 			return ret;
122 		}
123 	}
124 
125 	return -EPERM;
126 }
127 
128 static int aw88261_dev_configure_syspll(struct aw88261 *aw88261)
129 {
130 	struct aw_device *aw_dev = aw88261->aw_pa;
131 	int ret;
132 
133 	/* Configure TDM slots (I2S is represented as no slots) */
134 	ret = regmap_update_bits(aw_dev->regmap, AW88261_I2SCTRL2_REG,
135 			~AW88261_SLOT_NUM_MASK, aw88261->slot_num_value);
136 	if (ret)
137 		return ret;
138 
139 	ret = regmap_update_bits(aw_dev->regmap, AW88261_I2SCTRL2_REG,
140 			~AW88261_I2S_TX_SLOTVLD_MASK,
141 			aw88261->tx_slotvld_mask);
142 	if (ret)
143 		return ret;
144 
145 	ret = regmap_update_bits(aw_dev->regmap, AW88261_I2SCTRL2_REG,
146 			~AW88261_I2S_RXL_SLOTVLD_MASK,
147 			aw88261->rxl_slotvld_mask);
148 	if (ret)
149 		return ret;
150 
151 	ret = regmap_update_bits(aw_dev->regmap, AW88261_I2SCTRL2_REG,
152 			~AW88261_I2S_RXR_SLOTVLD_MASK,
153 			aw88261->rxr_slotvld_mask);
154 	if (ret)
155 		return ret;
156 
157 	/* PLL divider must be used for 8/16/32 kHz modes */
158 	ret = regmap_update_bits(aw_dev->regmap, AW88261_PLLCTRL1_REG,
159 			~AW88261_CCO_MUX_MASK, aw88261->cco_mux_value);
160 	if (ret)
161 		return ret;
162 
163 	/* The word clock (WCK) defines the beginning of a frame */
164 	ret = regmap_update_bits(aw_dev->regmap, AW88261_I2SCTRL1_REG,
165 			~AW88261_I2SSR_MASK, aw88261->sr_value);
166 	if (ret)
167 		return ret;
168 
169 	/* The bit clock (BCK) defines the length of a frame */
170 	ret = regmap_update_bits(aw_dev->regmap, AW88261_I2SCTRL1_REG,
171 			~AW88261_I2SBCK_MASK,
172 			(aw88261->tdm_bck_value != AW88261_TDM_BCK_UNSET)
173 			? aw88261->tdm_bck_value : aw88261->bck_value);
174 	if (ret)
175 		return ret;
176 
177 	/* The logical frame size is the width of data for 1 slot */
178 	ret = regmap_update_bits(aw_dev->regmap, AW88261_I2SCTRL1_REG,
179 			~AW88261_I2SFS_MASK, aw88261->fs_value);
180 	if (ret)
181 		return ret;
182 
183 	/* The I2S interface mode (Philips standard, LSB/MSB justified) */
184 	ret = regmap_update_bits(aw_dev->regmap, AW88261_I2SCTRL1_REG,
185 			~AW88261_I2SMD_MASK, aw88261->md_value);
186 	if (ret)
187 		return ret;
188 
189 	/* The polarity of the bit clock (BCK) */
190 	ret = regmap_update_bits(aw_dev->regmap, AW88261_SYSCTRL_REG,
191 			~AW88261_BCKINV_MASK, aw88261->bck_inv_value);
192 	if (ret)
193 		return ret;
194 
195 	return aw88261_dev_check_pll(aw_dev);
196 }
197 
198 static int aw88261_dev_check_sysst(struct aw_device *aw_dev)
199 {
200 	unsigned int check_val;
201 	unsigned int reg_val;
202 	int ret, i;
203 
204 	for (i = 0; i < AW88261_DEV_SYSST_CHECK_MAX; i++) {
205 		ret = regmap_read(aw_dev->regmap, AW88261_SYSST_REG, &reg_val);
206 		if (ret)
207 			return ret;
208 
209 		check_val = reg_val & (~AW88261_BIT_SYSST_CHECK_MASK)
210 							& AW88261_BIT_PLL_CHECK;
211 		if (check_val != AW88261_BIT_PLL_CHECK) {
212 			dev_dbg(aw_dev->dev, "check sysst fail, reg_val=0x%04x, check:0x%x",
213 				reg_val, AW88261_BIT_PLL_CHECK);
214 			usleep_range(AW88261_2000_US, AW88261_2000_US + 10);
215 		} else {
216 			return 0;
217 		}
218 	}
219 
220 	return -EPERM;
221 }
222 
223 static void aw88261_dev_uls_hmute(struct aw_device *aw_dev, bool uls_hmute)
224 {
225 	if (uls_hmute)
226 		regmap_update_bits(aw_dev->regmap, AW88261_SYSCTRL_REG,
227 				~AW88261_ULS_HMUTE_MASK,
228 				AW88261_ULS_HMUTE_ENABLE_VALUE);
229 	else
230 		regmap_update_bits(aw_dev->regmap, AW88261_SYSCTRL_REG,
231 				~AW88261_ULS_HMUTE_MASK,
232 				AW88261_ULS_HMUTE_DISABLE_VALUE);
233 }
234 
235 static void aw88261_reg_force_set(struct aw88261 *aw88261)
236 {
237 	if (aw88261->frcset_en == AW88261_FRCSET_ENABLE) {
238 		/* set FORCE_PWM */
239 		regmap_update_bits(aw88261->regmap, AW88261_BSTCTRL3_REG,
240 				~AW88261_FORCE_PWM_MASK, AW88261_FORCE_PWM_FORCEMINUS_PWM_VALUE);
241 		/* set BOOST_OS_WIDTH */
242 		regmap_update_bits(aw88261->regmap, AW88261_BSTCTRL5_REG,
243 				~AW88261_BST_OS_WIDTH_MASK, AW88261_BST_OS_WIDTH_50NS_VALUE);
244 		/* set BURST_LOOPR */
245 		regmap_update_bits(aw88261->regmap, AW88261_BSTCTRL6_REG,
246 				~AW88261_BST_LOOPR_MASK, AW88261_BST_LOOPR_340K_VALUE);
247 		/* set RSQN_DLY */
248 		regmap_update_bits(aw88261->regmap, AW88261_BSTCTRL7_REG,
249 				~AW88261_RSQN_DLY_MASK, AW88261_RSQN_DLY_35NS_VALUE);
250 		/* set BURST_SSMODE */
251 		regmap_update_bits(aw88261->regmap, AW88261_BSTCTRL8_REG,
252 				~AW88261_BURST_SSMODE_MASK, AW88261_BURST_SSMODE_FAST_VALUE);
253 		/* set BST_BURST */
254 		regmap_update_bits(aw88261->regmap, AW88261_BSTCTRL9_REG,
255 				~AW88261_BST_BURST_MASK, AW88261_BST_BURST_30MA_VALUE);
256 	} else {
257 		dev_dbg(aw88261->aw_pa->dev, "needn't set reg value");
258 	}
259 }
260 
261 static int aw88261_dev_get_icalk(struct aw_device *aw_dev, int16_t *icalk)
262 {
263 	u16 reg_icalk, reg_icalkl;
264 	unsigned int reg_val;
265 	int ret;
266 
267 	ret = regmap_read(aw_dev->regmap, AW88261_EFRH4_REG, &reg_val);
268 	if (ret)
269 		return ret;
270 
271 	reg_icalk = reg_val & (~AW88261_EF_ISN_GESLP_H_MASK);
272 
273 	ret = regmap_read(aw_dev->regmap, AW88261_EFRL4_REG, &reg_val);
274 	if (ret)
275 		return ret;
276 
277 	reg_icalkl = reg_val & (~AW88261_EF_ISN_GESLP_L_MASK);
278 
279 	reg_icalk = (reg_icalk >> AW88261_ICALK_SHIFT) & (reg_icalkl >> AW88261_ICALKL_SHIFT);
280 
281 	if (reg_icalk & (~AW88261_EF_ISN_GESLP_SIGN_MASK))
282 		reg_icalk = reg_icalk | ~AW88261_EF_ISN_GESLP_NEG;
283 
284 	*icalk = (int16_t)reg_icalk;
285 
286 	return ret;
287 }
288 
289 static int aw88261_dev_get_vcalk(struct aw_device *aw_dev, int16_t *vcalk)
290 {
291 	u16 reg_vcalk, reg_vcalkl;
292 	unsigned int reg_val;
293 	int ret;
294 
295 	ret = regmap_read(aw_dev->regmap, AW88261_EFRH3_REG, &reg_val);
296 	if (ret)
297 		return ret;
298 
299 	reg_vcalk = (u16)reg_val & (~AW88261_EF_VSN_GESLP_H_MASK);
300 
301 	ret = regmap_read(aw_dev->regmap, AW88261_EFRL3_REG, &reg_val);
302 	if (ret)
303 		return ret;
304 
305 	reg_vcalkl = (u16)reg_val & (~AW88261_EF_VSN_GESLP_L_MASK);
306 
307 	reg_vcalk = (reg_vcalk >> AW88261_VCALK_SHIFT) & (reg_vcalkl >> AW88261_VCALKL_SHIFT);
308 
309 	if (reg_vcalk & AW88261_EF_VSN_GESLP_SIGN_MASK)
310 		reg_vcalk = reg_vcalk | (~AW88261_EF_VSN_GESLP_NEG);
311 	*vcalk = (int16_t)reg_vcalk;
312 
313 	return ret;
314 }
315 
316 static int aw88261_dev_set_vcalb(struct aw_device *aw_dev)
317 {
318 	int16_t icalk_val, vcalk_val;
319 	int icalk, vcalk, vcalb;
320 	u32 reg_val;
321 	int ret;
322 
323 	ret = aw88261_dev_get_icalk(aw_dev, &icalk_val);
324 	if (ret)
325 		return ret;
326 
327 	ret = aw88261_dev_get_vcalk(aw_dev, &vcalk_val);
328 	if (ret)
329 		return ret;
330 
331 	icalk = AW88261_CABL_BASE_VALUE + AW88261_ICABLK_FACTOR * icalk_val;
332 	vcalk = AW88261_CABL_BASE_VALUE + AW88261_VCABLK_FACTOR * vcalk_val;
333 	if (!vcalk)
334 		return -EINVAL;
335 
336 	vcalb = AW88261_VCAL_FACTOR * icalk / vcalk;
337 	reg_val = (unsigned int)vcalb;
338 
339 	dev_dbg(aw_dev->dev, "icalk=%d, vcalk=%d, vcalb=%d, reg_val=0x%04x",
340 			icalk, vcalk, vcalb, reg_val);
341 	ret = regmap_write(aw_dev->regmap, AW88261_VSNTM1_REG, reg_val);
342 
343 	return ret;
344 }
345 
346 static int aw88261_dev_reg_update(struct aw88261 *aw88261,
347 					unsigned char *data, unsigned int len)
348 {
349 	struct aw_device *aw_dev = aw88261->aw_pa;
350 	struct aw_volume_desc *vol_desc = &aw_dev->volume_desc;
351 	unsigned int read_val, efcheck_val, read_vol;
352 	int data_len, i, ret;
353 	int16_t *reg_data;
354 	u16 reg_val;
355 	u8 reg_addr;
356 
357 	if (!len || !data) {
358 		dev_err(aw_dev->dev, "reg data is null or len is 0");
359 		return -EINVAL;
360 	}
361 
362 	reg_data = (int16_t *)data;
363 	data_len = len >> 1;
364 
365 	if (data_len & 0x1) {
366 		dev_err(aw_dev->dev, "data len:%d unsupported",	data_len);
367 		return -EINVAL;
368 	}
369 
370 	for (i = 0; i < data_len; i += 2) {
371 		reg_addr = reg_data[i];
372 		reg_val = reg_data[i + 1];
373 
374 		if (reg_addr == AW88261_SYSCTRL_REG) {
375 			aw88261->amppd_st = reg_val & (~AW88261_AMPPD_MASK);
376 			ret = regmap_read(aw_dev->regmap, reg_addr, &read_val);
377 			if (ret)
378 				break;
379 
380 			/* keep all three bits from current hw status */
381 			read_val &= (~AW88261_AMPPD_MASK) | (~AW88261_PWDN_MASK) |
382 								(~AW88261_HMUTE_MASK);
383 			reg_val &= (AW88261_AMPPD_MASK & AW88261_PWDN_MASK & AW88261_HMUTE_MASK);
384 			reg_val |= read_val;
385 
386 			/* enable uls hmute */
387 			reg_val &= AW88261_ULS_HMUTE_MASK;
388 			reg_val |= AW88261_ULS_HMUTE_ENABLE_VALUE;
389 		}
390 
391 		if (reg_addr == AW88261_DBGCTRL_REG) {
392 			efcheck_val = reg_val & (~AW88261_EF_DBMD_MASK);
393 			if (efcheck_val == AW88261_OR_VALUE)
394 				aw88261->efuse_check = AW88261_EF_OR_CHECK;
395 			else
396 				aw88261->efuse_check = AW88261_EF_AND_CHECK;
397 		}
398 
399 		/* i2stxen */
400 		if (reg_addr == AW88261_I2SCTRL3_REG) {
401 			/* close tx */
402 			reg_val &= AW88261_I2STXEN_MASK;
403 			reg_val |= AW88261_I2STXEN_DISABLE_VALUE;
404 		}
405 
406 		if (reg_addr == AW88261_SYSCTRL2_REG) {
407 			read_vol = (reg_val & (~AW88261_VOL_MASK)) >>
408 				AW88261_VOL_START_BIT;
409 			aw_dev->volume_desc.init_volume =
410 				REG_VAL_TO_DB(read_vol);
411 		}
412 
413 		if (reg_addr == AW88261_VSNTM1_REG)
414 			continue;
415 
416 		ret = regmap_write(aw_dev->regmap, reg_addr, reg_val);
417 		if (ret)
418 			break;
419 	}
420 
421 	ret = aw88261_dev_set_vcalb(aw_dev);
422 	if (ret)
423 		return ret;
424 
425 	if (aw_dev->prof_cur != aw_dev->prof_index)
426 		vol_desc->ctl_volume = 0;
427 
428 	/* keep min volume */
429 	aw88261_dev_set_volume(aw_dev, vol_desc->mute_volume);
430 
431 	return ret;
432 }
433 
434 static int aw88261_dev_get_prof_name(struct aw_device *aw_dev, int index, char **prof_name)
435 {
436 	struct aw_prof_info *prof_info = &aw_dev->prof_info;
437 	struct aw_prof_desc *prof_desc;
438 
439 	if ((index >= aw_dev->prof_info.count) || (index < 0)) {
440 		dev_err(aw_dev->dev, "index[%d] overflow count[%d]",
441 			index, aw_dev->prof_info.count);
442 		return -EINVAL;
443 	}
444 
445 	prof_desc = &aw_dev->prof_info.prof_desc[index];
446 
447 	*prof_name = prof_info->prof_name_list[prof_desc->id];
448 
449 	return 0;
450 }
451 
452 static int aw88261_dev_get_prof_data(struct aw_device *aw_dev, int index,
453 			struct aw_prof_desc **prof_desc)
454 {
455 	if ((index >= aw_dev->prof_info.count) || (index < 0)) {
456 		dev_err(aw_dev->dev, "%s: index[%d] overflow count[%d]\n",
457 				__func__, index, aw_dev->prof_info.count);
458 		return -EINVAL;
459 	}
460 
461 	*prof_desc = &aw_dev->prof_info.prof_desc[index];
462 
463 	return 0;
464 }
465 
466 static int aw88261_dev_fw_update(struct aw88261 *aw88261)
467 {
468 	struct aw_device *aw_dev = aw88261->aw_pa;
469 	struct aw_prof_desc *prof_index_desc;
470 	struct aw_sec_data_desc *sec_desc;
471 	char *prof_name;
472 	int ret;
473 
474 	ret = aw88261_dev_get_prof_name(aw_dev, aw_dev->prof_index, &prof_name);
475 	if (ret) {
476 		dev_err(aw_dev->dev, "get prof name failed");
477 		return -EINVAL;
478 	}
479 
480 	dev_dbg(aw_dev->dev, "start update %s", prof_name);
481 
482 	ret = aw88261_dev_get_prof_data(aw_dev, aw_dev->prof_index, &prof_index_desc);
483 	if (ret)
484 		return ret;
485 
486 	/* update reg */
487 	sec_desc = prof_index_desc->sec_desc;
488 	ret = aw88261_dev_reg_update(aw88261, sec_desc[AW88395_DATA_TYPE_REG].data,
489 					sec_desc[AW88395_DATA_TYPE_REG].len);
490 	if (ret) {
491 		dev_err(aw_dev->dev, "update reg failed");
492 		return ret;
493 	}
494 
495 	aw_dev->prof_cur = aw_dev->prof_index;
496 
497 	return ret;
498 }
499 
500 static int aw88261_dev_start(struct aw88261 *aw88261)
501 {
502 	struct aw_device *aw_dev = aw88261->aw_pa;
503 	int ret;
504 
505 	if (aw_dev->status == AW88261_DEV_PW_ON) {
506 		dev_dbg(aw_dev->dev, "already power on");
507 		return 0;
508 	}
509 
510 	/* power on */
511 	aw88261_dev_pwd(aw_dev, false);
512 	usleep_range(AW88261_2000_US, AW88261_2000_US + 10);
513 
514 	ret = aw88261_dev_configure_syspll(aw88261);
515 	if (ret) {
516 		dev_dbg(aw_dev->dev, "pll check failed");
517 		goto pll_check_fail;
518 	}
519 
520 	/* amppd on */
521 	aw88261_dev_amppd(aw_dev, false);
522 	usleep_range(AW88261_1000_US, AW88261_1000_US + 50);
523 
524 	/* check i2s status */
525 	ret = aw88261_dev_check_sysst(aw_dev);
526 	if (ret) {
527 		dev_dbg(aw_dev->dev, "sysst check failed");
528 		goto sysst_check_fail;
529 	}
530 
531 	/* enable tx feedback */
532 	aw88261_dev_i2s_tx_enable(aw_dev, true);
533 
534 	if (aw88261->amppd_st)
535 		aw88261_dev_amppd(aw_dev, true);
536 
537 	aw88261_reg_force_set(aw88261);
538 
539 	/* close uls mute */
540 	aw88261_dev_uls_hmute(aw_dev, false);
541 
542 	/* close mute */
543 	if (!aw88261->mute_st)
544 		aw88261_dev_mute(aw_dev, false);
545 
546 	/* clear inturrupt */
547 	aw88261_dev_clear_int_status(aw_dev);
548 	aw_dev->status = AW88261_DEV_PW_ON;
549 
550 	return 0;
551 
552 sysst_check_fail:
553 	aw88261_dev_i2s_tx_enable(aw_dev, false);
554 	aw88261_dev_clear_int_status(aw_dev);
555 	aw88261_dev_amppd(aw_dev, true);
556 pll_check_fail:
557 	aw88261_dev_pwd(aw_dev, true);
558 	aw_dev->status = AW88261_DEV_PW_OFF;
559 
560 	return ret;
561 }
562 
563 static int aw88261_dev_stop(struct aw_device *aw_dev)
564 {
565 	if (aw_dev->status == AW88261_DEV_PW_OFF) {
566 		dev_info(aw_dev->dev, "already power off");
567 		return 0;
568 	}
569 
570 	aw_dev->status = AW88261_DEV_PW_OFF;
571 
572 	/* clear inturrupt */
573 	aw88261_dev_clear_int_status(aw_dev);
574 
575 	aw88261_dev_uls_hmute(aw_dev, true);
576 	/* set mute */
577 	aw88261_dev_mute(aw_dev, true);
578 
579 	/* close tx feedback */
580 	aw88261_dev_i2s_tx_enable(aw_dev, false);
581 	usleep_range(AW88261_1000_US, AW88261_1000_US + 100);
582 
583 	/* enable amppd */
584 	aw88261_dev_amppd(aw_dev, true);
585 
586 	/* set power down */
587 	aw88261_dev_pwd(aw_dev, true);
588 
589 	return 0;
590 }
591 
592 static int aw88261_reg_update(struct aw88261 *aw88261, bool force)
593 {
594 	struct aw_device *aw_dev = aw88261->aw_pa;
595 	int ret;
596 
597 	if (force) {
598 		ret = regmap_write(aw_dev->regmap,
599 					AW88261_ID_REG, AW88261_SOFT_RESET_VALUE);
600 		if (ret)
601 			return ret;
602 
603 		ret = aw88261_dev_fw_update(aw88261);
604 		if (ret)
605 			return ret;
606 	} else {
607 		if (aw_dev->prof_cur != aw_dev->prof_index) {
608 			ret = aw88261_dev_fw_update(aw88261);
609 			if (ret)
610 				return ret;
611 		} else {
612 			ret = 0;
613 		}
614 	}
615 
616 	aw_dev->prof_cur = aw_dev->prof_index;
617 
618 	return ret;
619 }
620 
621 static void aw88261_start_pa(struct aw88261 *aw88261)
622 {
623 	int ret, i;
624 
625 	for (i = 0; i < AW88261_START_RETRIES; i++) {
626 		ret = aw88261_reg_update(aw88261, aw88261->phase_sync);
627 		if (ret) {
628 			dev_dbg(aw88261->aw_pa->dev,
629 				"aw88261_reg_update failed, cnt:%d, ret:%d\n", i, ret);
630 			continue;
631 		}
632 		ret = aw88261_dev_start(aw88261);
633 		if (ret) {
634 			dev_dbg(aw88261->aw_pa->dev,
635 				"aw88261_dev_start failed, cnt:%d, ret:%d\n", i, ret);
636 			continue;
637 		} else {
638 			dev_dbg(aw88261->aw_pa->dev, "start success\n");
639 			break;
640 		}
641 	}
642 	if (ret != 0)
643 		dev_err(aw88261->aw_pa->dev, "start failure (%d)\n", ret);
644 }
645 
646 static void aw88261_start(struct aw88261 *aw88261)
647 {
648 	if (aw88261->aw_pa->fw_status != AW88261_DEV_FW_OK)
649 		return;
650 
651 	if (aw88261->aw_pa->status == AW88261_DEV_PW_ON)
652 		return;
653 
654 	aw88261_start_pa(aw88261);
655 }
656 
657 static int aw88261_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
658 {
659 	struct snd_soc_component *component = dai->component;
660 	struct aw88261 *aw88261 = snd_soc_component_get_drvdata(component);
661 
662 	switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
663 	case SND_SOC_DAIFMT_NB_NF:
664 		aw88261->bck_inv_value = AW88261_BCKINV_NOT_INVERT_VALUE;
665 		break;
666 	case SND_SOC_DAIFMT_IB_NF:
667 		aw88261->bck_inv_value = AW88261_BCKINV_INVERTED_VALUE;
668 		break;
669 	default:
670 		dev_err(aw88261->aw_pa->dev, "unsupported invert mode 0x%x\n",
671 			fmt & SND_SOC_DAIFMT_INV_MASK);
672 		return -EINVAL;
673 	}
674 
675 	switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
676 	case SND_SOC_DAIFMT_I2S:
677 	case SND_SOC_DAIFMT_DSP_A:
678 		aw88261->md_value = AW88261_I2SMD_PHILIPS_STANDARD_VALUE;
679 		break;
680 	case SND_SOC_DAIFMT_MSB:
681 	case SND_SOC_DAIFMT_DSP_B:
682 		aw88261->md_value = AW88261_I2SMD_MSB_JUSTIFIED_VALUE;
683 		break;
684 	case SND_SOC_DAIFMT_LSB:
685 		aw88261->md_value = AW88261_I2SMD_LSB_JUSTIFIED_VALUE;
686 		break;
687 	default:
688 		dev_err(aw88261->aw_pa->dev, "unsupported DAI format 0x%x\n",
689 			fmt & SND_SOC_DAIFMT_FORMAT_MASK);
690 		return -EINVAL;
691 	}
692 
693 	return 0;
694 }
695 
696 static int aw88261_hw_params(struct snd_pcm_substream *substream,
697 	struct snd_pcm_hw_params *params,
698 	struct snd_soc_dai *dai)
699 {
700 	struct snd_soc_component *component = dai->component;
701 	struct aw88261 *aw88261 = snd_soc_component_get_drvdata(component);
702 
703 	if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
704 		return 0;
705 
706 	aw88261->cco_mux_value = AW88261_CCO_MUX_BYPASS_VALUE;
707 	switch (params_rate(params)) {
708 	case 8000:
709 		aw88261->sr_value = AW88261_I2SSR_8KHZ_VALUE;
710 		aw88261->cco_mux_value = AW88261_CCO_MUX_DIVIDED_VALUE;
711 		break;
712 	case 11025:
713 		aw88261->sr_value = AW88261_I2SSR_11P025KHZ_VALUE;
714 		break;
715 	case 12000:
716 		aw88261->sr_value = AW88261_I2SSR_12KHZ_VALUE;
717 		break;
718 	case 16000:
719 		aw88261->sr_value = AW88261_I2SSR_16KHZ_VALUE;
720 		aw88261->cco_mux_value = AW88261_CCO_MUX_DIVIDED_VALUE;
721 		break;
722 	case 22050:
723 		aw88261->sr_value = AW88261_I2SSR_22P05KHZ_VALUE;
724 		break;
725 	case 24000:
726 		aw88261->sr_value = AW88261_I2SSR_24KHZ_VALUE;
727 		break;
728 	case 32000:
729 		aw88261->sr_value = AW88261_I2SSR_32KHZ_VALUE;
730 		aw88261->cco_mux_value = AW88261_CCO_MUX_DIVIDED_VALUE;
731 		break;
732 	case 44100:
733 		aw88261->sr_value = AW88261_I2SSR_44P1KHZ_VALUE;
734 		break;
735 	case 48000:
736 		aw88261->sr_value = AW88261_I2SSR_48KHZ_VALUE;
737 		break;
738 	case 96000:
739 		aw88261->sr_value = AW88261_I2SSR_96KHZ_VALUE;
740 		break;
741 	case 192000:
742 		aw88261->sr_value = AW88261_I2SSR_192KHZ_VALUE;
743 		break;
744 	default:
745 		dev_err(aw88261->aw_pa->dev, "unsupported sample rate %d\n",
746 			params_rate(params));
747 		return -EINVAL;
748 	}
749 
750 	switch (params_width(params)) {
751 	case 16:
752 		aw88261->fs_value = AW88261_I2SFS_16_BITS_VALUE;
753 		break;
754 	case 20:
755 		aw88261->fs_value = AW88261_I2SFS_20_BITS_VALUE;
756 		break;
757 	case 24:
758 		aw88261->fs_value = AW88261_I2SFS_24_BITS_VALUE;
759 		break;
760 	case 32:
761 		aw88261->fs_value = AW88261_I2SFS_32_BITS_VALUE;
762 		break;
763 	default:
764 		dev_err(aw88261->aw_pa->dev, "unsupported bit width %d\n",
765 			params_width(params));
766 		return -EINVAL;
767 	}
768 
769 	switch (params_physical_width(params)) {
770 	case 16:
771 		aw88261->bck_value = AW88261_I2SBCK_32FS_VALUE;
772 		break;
773 	case 24:
774 		aw88261->bck_value = AW88261_I2SBCK_48FS_VALUE;
775 		break;
776 	case 32:
777 		aw88261->bck_value = AW88261_I2SBCK_64FS_VALUE;
778 		break;
779 	default:
780 		dev_err(aw88261->aw_pa->dev, "unsupported physical bit width %d\n",
781 			params_physical_width(params));
782 		return -EINVAL;
783 	}
784 
785 	return 0;
786 }
787 
788 static int aw88261_set_tdm_slot(struct snd_soc_dai *dai,
789 	unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width)
790 {
791 	struct snd_soc_component *component = dai->component;
792 	struct aw88261 *aw88261 = snd_soc_component_get_drvdata(component);
793 	int chan;
794 
795 	switch (slots) {
796 	case 0:
797 		/* Just reset everything TDM related to I2S values */
798 		aw88261->slot_num_value = AW88261_SLOT_NUM_I2S_MODE_VALUE;
799 		aw88261->tdm_bck_value = AW88261_TDM_BCK_UNSET;
800 		aw88261->tx_slotvld_mask = 0 << AW88261_I2S_TX_SLOTVLD_START_BIT;
801 		aw88261->rxl_slotvld_mask = 0 << AW88261_I2S_RXL_SLOTVLD_START_BIT;
802 		aw88261->rxr_slotvld_mask = 1 << AW88261_I2S_RXR_SLOTVLD_START_BIT;
803 		return 0;
804 	case 1:
805 		aw88261->slot_num_value = AW88261_SLOT_NUM_TDM1S_VALUE;
806 		break;
807 	case 2:
808 		aw88261->slot_num_value = AW88261_SLOT_NUM_TDM2S_VALUE;
809 		break;
810 	case 4:
811 		aw88261->slot_num_value = AW88261_SLOT_NUM_TDM4S_VALUE;
812 		break;
813 	case 6:
814 		aw88261->slot_num_value = AW88261_SLOT_NUM_TDM6S_VALUE;
815 		break;
816 	case 8:
817 		aw88261->slot_num_value = AW88261_SLOT_NUM_TDM8S_VALUE;
818 		break;
819 	case 16:
820 		aw88261->slot_num_value = AW88261_SLOT_NUM_TDM16S_VALUE;
821 		break;
822 	default:
823 		dev_err(aw88261->aw_pa->dev, "unsupported slot count %d\n", slots);
824 		return -EINVAL;
825 	}
826 
827 	switch (slot_width) {
828 	case 16:
829 		aw88261->tdm_bck_value = AW88261_I2SBCK_32FS_VALUE;
830 		break;
831 	case 20:
832 	case 24:
833 		aw88261->tdm_bck_value = AW88261_I2SBCK_48FS_VALUE;
834 		break;
835 	case 32:
836 		aw88261->tdm_bck_value = AW88261_I2SBCK_64FS_VALUE;
837 		break;
838 	default:
839 		dev_err(aw88261->aw_pa->dev, "unsupported slot width %d\n",
840 			slot_width);
841 		return -EINVAL;
842 	}
843 
844 	if (tx_mask != 0) {
845 		if ((chan = __ffs(tx_mask)) > 16)
846 			return -EINVAL;
847 
848 		aw88261->tx_slotvld_mask = chan << AW88261_I2S_TX_SLOTVLD_START_BIT;
849 	}
850 
851 	if (rx_mask != 0) {
852 		if ((chan = __ffs(rx_mask)) > 16)
853 			return -EINVAL;
854 
855 		aw88261->rxl_slotvld_mask = chan << AW88261_I2S_RXL_SLOTVLD_START_BIT;
856 	}
857 
858 	if ((rx_mask & ~BIT(chan)) != 0) {
859 		if ((chan = __ffs(rx_mask & ~BIT(chan))) > 16)
860 			return -EINVAL;
861 
862 		aw88261->rxr_slotvld_mask = chan << AW88261_I2S_RXR_SLOTVLD_START_BIT;
863 	}
864 
865 	return 0;
866 }
867 
868 static const struct snd_soc_dai_ops aw88261_dai_ops = {
869 	.set_fmt = aw88261_set_fmt,
870 	.hw_params = aw88261_hw_params,
871 	.set_tdm_slot = aw88261_set_tdm_slot,
872 };
873 
874 static struct snd_soc_dai_driver aw88261_dai[] = {
875 	{
876 		.name = "aw88261-aif",
877 		.id = 1,
878 		.playback = {
879 			.stream_name = "Speaker_Playback",
880 			.channels_min = 1,
881 			.channels_max = 2,
882 			.rates = AW88261_RATES,
883 			.formats = AW88261_FORMATS,
884 		},
885 		.capture = {
886 			.stream_name = "Speaker_Capture",
887 			.channels_min = 1,
888 			.channels_max = 2,
889 			.rates = AW88261_RATES,
890 			.formats = AW88261_FORMATS,
891 		},
892 		.ops = &aw88261_dai_ops,
893 	},
894 };
895 
896 static int aw88261_dev_set_profile_index(struct aw_device *aw_dev, int index)
897 {
898 	/* check the index whether is valid */
899 	if ((index >= aw_dev->prof_info.count) || (index < 0))
900 		return -EINVAL;
901 	/* check the index whether change */
902 	if (aw_dev->prof_index == index)
903 		return -EPERM;
904 
905 	aw_dev->prof_index = index;
906 
907 	return 0;
908 }
909 
910 static int aw88261_profile_info(struct snd_kcontrol *kcontrol,
911 			 struct snd_ctl_elem_info *uinfo)
912 {
913 	struct snd_soc_component *codec = snd_kcontrol_chip(kcontrol);
914 	struct aw88261 *aw88261 = snd_soc_component_get_drvdata(codec);
915 	char *prof_name;
916 	int count, ret;
917 
918 	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
919 	uinfo->count = 1;
920 
921 	count = aw88261->aw_pa->prof_info.count;
922 	if (count <= 0) {
923 		uinfo->value.enumerated.items = 0;
924 		return 0;
925 	}
926 
927 	uinfo->value.enumerated.items = count;
928 
929 	if (uinfo->value.enumerated.item >= count)
930 		uinfo->value.enumerated.item = count - 1;
931 
932 	count = uinfo->value.enumerated.item;
933 
934 	ret = aw88261_dev_get_prof_name(aw88261->aw_pa, count, &prof_name);
935 	if (ret) {
936 		strscpy(uinfo->value.enumerated.name, "null");
937 		return 0;
938 	}
939 
940 	strscpy(uinfo->value.enumerated.name, prof_name);
941 
942 	return 0;
943 }
944 
945 static int aw88261_profile_get(struct snd_kcontrol *kcontrol,
946 			struct snd_ctl_elem_value *ucontrol)
947 {
948 	struct snd_soc_component *codec = snd_kcontrol_chip(kcontrol);
949 	struct aw88261 *aw88261 = snd_soc_component_get_drvdata(codec);
950 
951 	ucontrol->value.integer.value[0] = aw88261->aw_pa->prof_index;
952 
953 	return 0;
954 }
955 
956 static int aw88261_profile_set(struct snd_kcontrol *kcontrol,
957 		struct snd_ctl_elem_value *ucontrol)
958 {
959 	struct snd_soc_component *codec = snd_kcontrol_chip(kcontrol);
960 	struct aw88261 *aw88261 = snd_soc_component_get_drvdata(codec);
961 	int ret;
962 
963 	/* pa stop or stopping just set profile */
964 	guard(mutex)(&aw88261->lock);
965 	ret = aw88261_dev_set_profile_index(aw88261->aw_pa, ucontrol->value.integer.value[0]);
966 	if (ret) {
967 		dev_dbg(codec->dev, "profile index does not change");
968 		return 0;
969 	}
970 
971 	if (aw88261->aw_pa->status) {
972 		aw88261_dev_stop(aw88261->aw_pa);
973 		aw88261_start(aw88261);
974 	}
975 
976 	return 1;
977 }
978 
979 static int aw88261_volume_get(struct snd_kcontrol *kcontrol,
980 				struct snd_ctl_elem_value *ucontrol)
981 {
982 	struct snd_soc_component *codec = snd_kcontrol_chip(kcontrol);
983 	struct aw88261 *aw88261 = snd_soc_component_get_drvdata(codec);
984 	struct aw_volume_desc *vol_desc = &aw88261->aw_pa->volume_desc;
985 
986 	ucontrol->value.integer.value[0] =
987 		(AW88261_MUTE_VOL - vol_desc->ctl_volume) / 2;
988 
989 	return 0;
990 }
991 
992 static int aw88261_volume_set(struct snd_kcontrol *kcontrol,
993 				struct snd_ctl_elem_value *ucontrol)
994 {
995 	struct snd_soc_component *codec = snd_kcontrol_chip(kcontrol);
996 	struct aw88261 *aw88261 = snd_soc_component_get_drvdata(codec);
997 	struct aw_volume_desc *vol_desc = &aw88261->aw_pa->volume_desc;
998 	struct soc_mixer_control *mc =
999 		(struct soc_mixer_control *)kcontrol->private_value;
1000 	int value = ucontrol->value.integer.value[0];
1001 
1002 	if (value < mc->min || value > mc->max)
1003 		return -EINVAL;
1004 
1005 	value = AW88261_MUTE_VOL - (value * 2);
1006 
1007 	if (vol_desc->ctl_volume != value) {
1008 		vol_desc->ctl_volume = value;
1009 		aw88261_dev_set_volume(aw88261->aw_pa, vol_desc->ctl_volume);
1010 
1011 		return 1;
1012 	}
1013 
1014 	return 0;
1015 }
1016 
1017 /*
1018  * The field contains 4 bits in units of 6dB + 6 bits in units of 0.125dB
1019  * which is too precise for TLV (!) so we have to multiply the scale by 2.
1020  *
1021  * The range is clamped at -90dB to prevent overflowing the 4-bit part.
1022  */
1023 static const DECLARE_TLV_DB_SCALE(volume_tlv, -9000, 25, 0);
1024 
1025 static const struct snd_kcontrol_new aw88261_controls[] = {
1026 	SOC_SINGLE_EXT_TLV("PCM Playback Volume", AW88261_SYSCTRL2_REG,
1027 		6, AW88261_CTL_MAX_VOL, 1,
1028 		aw88261_volume_get, aw88261_volume_set, volume_tlv),
1029 	AW88261_PROFILE_EXT("Profile Set", aw88261_profile_info,
1030 		aw88261_profile_get, aw88261_profile_set),
1031 };
1032 
1033 static int aw88261_playback_event(struct snd_soc_dapm_widget *w,
1034 				struct snd_kcontrol *k, int event)
1035 {
1036 	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
1037 	struct aw88261 *aw88261 = snd_soc_component_get_drvdata(component);
1038 
1039 	guard(mutex)(&aw88261->lock);
1040 	switch (event) {
1041 	case SND_SOC_DAPM_PRE_PMU:
1042 		aw88261_start(aw88261);
1043 		break;
1044 	case SND_SOC_DAPM_POST_PMD:
1045 		aw88261_dev_stop(aw88261->aw_pa);
1046 		break;
1047 	default:
1048 		break;
1049 	}
1050 
1051 	return 0;
1052 }
1053 
1054 static const struct snd_soc_dapm_widget aw88261_dapm_widgets[] = {
1055 	 /* playback */
1056 	SND_SOC_DAPM_AIF_IN_E("AIF_RX", "Speaker_Playback", 0, 0, 0, 0,
1057 					aw88261_playback_event,
1058 					SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
1059 	SND_SOC_DAPM_OUTPUT("DAC Output"),
1060 
1061 	/* capture */
1062 	SND_SOC_DAPM_AIF_OUT("AIF_TX", "Speaker_Capture", 0, SND_SOC_NOPM, 0, 0),
1063 	SND_SOC_DAPM_INPUT("ADC Input"),
1064 };
1065 
1066 static const struct snd_soc_dapm_route aw88261_audio_map[] = {
1067 	{"DAC Output", NULL, "AIF_RX"},
1068 	{"AIF_TX", NULL, "ADC Input"},
1069 };
1070 
1071 static int aw88261_frcset_check(struct aw88261 *aw88261)
1072 {
1073 	unsigned int reg_val;
1074 	u16 temh, teml, tem;
1075 	int ret;
1076 
1077 	ret = regmap_read(aw88261->regmap, AW88261_EFRH3_REG, &reg_val);
1078 	if (ret)
1079 		return ret;
1080 	temh = ((u16)reg_val & (~AW88261_TEMH_MASK));
1081 
1082 	ret = regmap_read(aw88261->regmap, AW88261_EFRL3_REG, &reg_val);
1083 	if (ret)
1084 		return ret;
1085 	teml = ((u16)reg_val & (~AW88261_TEML_MASK));
1086 
1087 	if (aw88261->efuse_check == AW88261_EF_OR_CHECK)
1088 		tem = (temh | teml);
1089 	else
1090 		tem = (temh & teml);
1091 
1092 	if (tem == AW88261_DEFAULT_CFG)
1093 		aw88261->frcset_en = AW88261_FRCSET_ENABLE;
1094 	else
1095 		aw88261->frcset_en = AW88261_FRCSET_DISABLE;
1096 
1097 	dev_dbg(aw88261->aw_pa->dev, "tem is 0x%04x, frcset_en is %d",
1098 						tem, aw88261->frcset_en);
1099 
1100 	return ret;
1101 }
1102 
1103 static int aw88261_dev_init(struct aw88261 *aw88261, struct aw_container *aw_cfg)
1104 {
1105 	struct aw_device *aw_dev = aw88261->aw_pa;
1106 	int ret;
1107 
1108 	ret = aw88395_dev_cfg_load(aw_dev, aw_cfg);
1109 	if (ret) {
1110 		dev_err(aw_dev->dev, "aw_dev acf parse failed");
1111 		return -EINVAL;
1112 	}
1113 
1114 	ret = regmap_write(aw_dev->regmap, AW88261_ID_REG, AW88261_SOFT_RESET_VALUE);
1115 	if (ret)
1116 		return ret;
1117 
1118 	aw_dev->prof_cur = AW88261_INIT_PROFILE;
1119 	aw_dev->prof_index = AW88261_INIT_PROFILE;
1120 
1121 	ret = aw88261_dev_fw_update(aw88261);
1122 	if (ret) {
1123 		dev_err(aw_dev->dev, "fw update failed ret = %d\n", ret);
1124 		return ret;
1125 	}
1126 
1127 	ret = aw88261_frcset_check(aw88261);
1128 	if (ret) {
1129 		dev_err(aw_dev->dev, "aw88261_frcset_check ret = %d\n", ret);
1130 		return ret;
1131 	}
1132 
1133 	aw88261_dev_clear_int_status(aw_dev);
1134 
1135 	aw88261_dev_uls_hmute(aw_dev, true);
1136 
1137 	aw88261_dev_mute(aw_dev, true);
1138 
1139 	aw88261_dev_i2s_tx_enable(aw_dev, false);
1140 
1141 	usleep_range(AW88261_1000_US, AW88261_1000_US + 100);
1142 
1143 	aw88261_dev_amppd(aw_dev, true);
1144 
1145 	aw88261_dev_pwd(aw_dev, true);
1146 
1147 	return 0;
1148 }
1149 
1150 static int aw88261_request_firmware_file(struct aw88261 *aw88261)
1151 {
1152 	const struct firmware *cont __free(firmware) = NULL;
1153 	struct aw_container *aw_cfg;
1154 	const char *fw_name;
1155 	int ret;
1156 
1157 	aw88261->aw_pa->fw_status = AW88261_DEV_FW_FAILED;
1158 
1159 	ret = device_property_read_string(aw88261->aw_pa->dev, "firmware-name", &fw_name);
1160 	if (ret)
1161 		fw_name = AW88261_ACF_FILE;
1162 
1163 	ret = request_firmware(&cont, fw_name, aw88261->aw_pa->dev);
1164 	if (ret)
1165 		return dev_err_probe(aw88261->aw_pa->dev, ret,
1166 					"load [%s] failed!", fw_name);
1167 
1168 	dev_info(aw88261->aw_pa->dev, "loaded %s - size: %zu\n",
1169 			fw_name, cont ? cont->size : 0);
1170 
1171 	aw_cfg = devm_kzalloc(aw88261->aw_pa->dev, struct_size(aw_cfg, data, cont->size), GFP_KERNEL);
1172 	if (!aw_cfg)
1173 		return -ENOMEM;
1174 
1175 	aw_cfg->len = (int)cont->size;
1176 	memcpy(aw_cfg->data, cont->data, cont->size);
1177 
1178 	aw88261->aw_cfg = aw_cfg;
1179 
1180 	ret = aw88395_dev_load_acf_check(aw88261->aw_pa, aw88261->aw_cfg);
1181 	if (ret) {
1182 		dev_err(aw88261->aw_pa->dev, "load [%s] failed !", fw_name);
1183 		return ret;
1184 	}
1185 
1186 	scoped_guard(mutex, &aw88261->lock) {
1187 		/* aw device init */
1188 		ret = aw88261_dev_init(aw88261, aw88261->aw_cfg);
1189 		if (ret)
1190 			dev_err(aw88261->aw_pa->dev, "dev init failed");
1191 	}
1192 
1193 	return ret;
1194 }
1195 
1196 static int aw88261_codec_probe(struct snd_soc_component *component)
1197 {
1198 	struct snd_soc_dapm_context *dapm = snd_soc_component_to_dapm(component);
1199 	struct aw88261 *aw88261 = snd_soc_component_get_drvdata(component);
1200 	int ret;
1201 
1202 	ret = aw88261_request_firmware_file(aw88261);
1203 	if (ret)
1204 		return dev_err_probe(aw88261->aw_pa->dev, ret,
1205 				"aw88261_request_firmware_file failed\n");
1206 
1207 	/* add widgets */
1208 	ret = snd_soc_dapm_new_controls(dapm, aw88261_dapm_widgets,
1209 							ARRAY_SIZE(aw88261_dapm_widgets));
1210 	if (ret)
1211 		return ret;
1212 
1213 	/* add route */
1214 	ret = snd_soc_dapm_add_routes(dapm, aw88261_audio_map,
1215 							ARRAY_SIZE(aw88261_audio_map));
1216 	if (ret)
1217 		return ret;
1218 
1219 	ret = snd_soc_add_component_controls(component, aw88261_controls,
1220 							ARRAY_SIZE(aw88261_controls));
1221 
1222 	return ret;
1223 }
1224 
1225 static const struct snd_soc_component_driver soc_codec_dev_aw88261 = {
1226 	.probe = aw88261_codec_probe,
1227 };
1228 
1229 static void aw88261_parse_channel_dt(struct aw88261 *aw88261)
1230 {
1231 	struct aw_device *aw_dev = aw88261->aw_pa;
1232 	struct device_node *np = aw_dev->dev->of_node;
1233 	u32 channel_value = AW88261_DEV_DEFAULT_CH;
1234 
1235 	of_property_read_u32(np, "awinic,audio-channel", &channel_value);
1236 	aw88261->phase_sync = of_property_read_bool(np, "awinic,sync-flag");
1237 
1238 	aw_dev->channel = channel_value;
1239 }
1240 
1241 static int aw88261_init(struct aw88261 *aw88261, struct i2c_client *i2c, struct regmap *regmap)
1242 {
1243 	struct aw_device *aw_dev;
1244 	unsigned int chip_id;
1245 	int ret;
1246 
1247 	ret = devm_regulator_get_enable(&i2c->dev, "dvdd");
1248 	if (ret)
1249 		return dev_err_probe(&i2c->dev, ret, "Failed to enable dvdd supply\n");
1250 
1251 	/* read chip id */
1252 	ret = regmap_read(regmap, AW88261_ID_REG, &chip_id);
1253 	if (ret) {
1254 		dev_err(&i2c->dev, "%s read chipid error. ret = %d", __func__, ret);
1255 		return ret;
1256 	}
1257 	if (chip_id != AW88261_CHIP_ID) {
1258 		dev_err(&i2c->dev, "unsupported device id = %x", chip_id);
1259 		return -ENXIO;
1260 	}
1261 
1262 	dev_info(&i2c->dev, "chip id = %x\n", chip_id);
1263 
1264 	aw_dev = devm_kzalloc(&i2c->dev, sizeof(*aw_dev), GFP_KERNEL);
1265 	if (!aw_dev)
1266 		return -ENOMEM;
1267 
1268 	aw88261->aw_pa = aw_dev;
1269 	aw_dev->i2c = i2c;
1270 	aw_dev->regmap = regmap;
1271 	aw_dev->dev = &i2c->dev;
1272 	aw_dev->chip_id = AW88261_CHIP_ID;
1273 	aw_dev->acf = NULL;
1274 	aw_dev->prof_info.prof_desc = NULL;
1275 	aw_dev->prof_info.count = 0;
1276 	aw_dev->prof_info.prof_type = AW88395_DEV_NONE_TYPE_ID;
1277 	aw_dev->channel = 0;
1278 	aw_dev->fw_status = AW88261_DEV_FW_FAILED;
1279 	aw_dev->volume_desc.ctl_volume = AW88261_CTL_DEFAULT_VOL;
1280 	aw_dev->volume_desc.mute_volume = AW88261_MUTE_VOL;
1281 	aw88261_parse_channel_dt(aw88261);
1282 
1283 	return ret;
1284 }
1285 
1286 static int aw88261_i2c_probe(struct i2c_client *i2c)
1287 {
1288 	struct aw88261 *aw88261;
1289 	int ret;
1290 
1291 	if (!i2c_check_functionality(i2c->adapter, I2C_FUNC_I2C))
1292 		return dev_err_probe(&i2c->dev, -ENXIO, "check_functionality failed");
1293 
1294 	aw88261 = devm_kzalloc(&i2c->dev, sizeof(*aw88261), GFP_KERNEL);
1295 	if (!aw88261)
1296 		return -ENOMEM;
1297 
1298 	/* set defaults */
1299 	aw88261->slot_num_value = AW88261_SLOT_NUM_I2S_MODE_VALUE;
1300 	aw88261->sr_value = AW88261_I2SSR_48KHZ_VALUE;
1301 	aw88261->cco_mux_value = AW88261_CCO_MUX_BYPASS_VALUE;
1302 	aw88261->fs_value = AW88261_I2SFS_24_BITS_VALUE;
1303 	aw88261->bck_value = AW88261_I2SBCK_64FS_VALUE;
1304 	aw88261->bck_inv_value = AW88261_BCKINV_NOT_INVERT_VALUE;
1305 	aw88261->tdm_bck_value = AW88261_TDM_BCK_UNSET;
1306 	aw88261->md_value = AW88261_I2SMD_PHILIPS_STANDARD_VALUE;
1307 	aw88261->rxr_slotvld_mask = 1 << AW88261_I2S_RXR_SLOTVLD_START_BIT;
1308 
1309 	mutex_init(&aw88261->lock);
1310 
1311 	i2c_set_clientdata(i2c, aw88261);
1312 
1313 	aw88261->regmap = devm_regmap_init_i2c(i2c, &aw88261_remap_config);
1314 	if (IS_ERR(aw88261->regmap)) {
1315 		ret = PTR_ERR(aw88261->regmap);
1316 		return dev_err_probe(&i2c->dev, ret, "failed to init regmap: %d\n", ret);
1317 	}
1318 
1319 	/* aw pa init */
1320 	ret = aw88261_init(aw88261, i2c, aw88261->regmap);
1321 	if (ret)
1322 		return ret;
1323 
1324 	ret = devm_snd_soc_register_component(&i2c->dev,
1325 			&soc_codec_dev_aw88261,
1326 			aw88261_dai, ARRAY_SIZE(aw88261_dai));
1327 	if (ret)
1328 		dev_err(&i2c->dev, "failed to register aw88261: %d", ret);
1329 
1330 	return ret;
1331 }
1332 
1333 static const struct i2c_device_id aw88261_i2c_id[] = {
1334 	{ .name = "aw88261" },
1335 	{ }
1336 };
1337 MODULE_DEVICE_TABLE(i2c, aw88261_i2c_id);
1338 
1339 static const struct of_device_id aw88261_of_table[] = {
1340 	{ .compatible = "awinic,aw88261" },
1341 	{ }
1342 };
1343 MODULE_DEVICE_TABLE(of, aw88261_of_table);
1344 
1345 static struct i2c_driver aw88261_i2c_driver = {
1346 	.driver = {
1347 		.name = "aw88261",
1348 		.of_match_table = aw88261_of_table,
1349 	},
1350 	.probe = aw88261_i2c_probe,
1351 	.id_table = aw88261_i2c_id,
1352 };
1353 module_i2c_driver(aw88261_i2c_driver);
1354 
1355 MODULE_DESCRIPTION("ASoC AW88261 Smart PA Driver");
1356 MODULE_LICENSE("GPL v2");
1357