1// SPDX-License-Identifier: GPL-2.0
2/*
3 * rt715.c -- rt715 ALSA SoC audio driver
4 *
5 * Copyright(c) 2019 Realtek Semiconductor Corp.
6 *
7 * ALC715 ASoC Codec Driver based Intel Dummy SdW codec driver
8 *
9 */
10
11#include <linux/module.h>
12#include <linux/kernel.h>
13#include <linux/init.h>
14#include <linux/delay.h>
15#include <linux/i2c.h>
16#include <linux/pm_runtime.h>
17#include <linux/pm.h>
18#include <linux/soundwire/sdw.h>
19#include <linux/regmap.h>
20#include <linux/slab.h>
21#include <linux/platform_device.h>
22#include <linux/regulator/consumer.h>
23#include <sound/core.h>
24#include <sound/pcm.h>
25#include <sound/pcm_params.h>
26#include <sound/sdw.h>
27#include <sound/soc.h>
28#include <sound/soc-dapm.h>
29#include <sound/initval.h>
30#include <sound/tlv.h>
31#include <sound/hda_verbs.h>
32
33#include "rt715.h"
34
35static int rt715_index_write(struct regmap *regmap, unsigned int reg,
36		unsigned int value)
37{
38	int ret;
39	unsigned int addr = ((RT715_PRIV_INDEX_W_H) << 8) | reg;
40
41	ret = regmap_write(regmap, addr, value);
42	if (ret < 0) {
43		pr_err("%s: Failed to set private value: %08x <= %04x %d\n",
44		       __func__, addr, value, ret);
45	}
46
47	return ret;
48}
49
50static int rt715_index_write_nid(struct regmap *regmap,
51		unsigned int nid, unsigned int reg, unsigned int value)
52{
53	int ret;
54	unsigned int addr = ((RT715_PRIV_INDEX_W_H_2 | nid) << 8) | reg;
55
56	ret = regmap_write(regmap, addr, value);
57	if (ret < 0)
58		pr_err("%s: Failed to set private value: %06x <= %04x ret=%d\n",
59		       __func__, addr, value, ret);
60
61	return ret;
62}
63
64static int rt715_index_read_nid(struct regmap *regmap,
65		unsigned int nid, unsigned int reg, unsigned int *value)
66{
67	int ret;
68	unsigned int addr = ((RT715_PRIV_INDEX_W_H_2 | nid) << 8) | reg;
69
70	*value = 0;
71	ret = regmap_read(regmap, addr, value);
72	if (ret < 0)
73		pr_err("%s: Failed to get private value: %06x => %04x ret=%d\n",
74		       __func__, addr, *value, ret);
75
76	return ret;
77}
78
79static int rt715_index_update_bits(struct regmap *regmap, unsigned int nid,
80			unsigned int reg, unsigned int mask, unsigned int val)
81{
82	unsigned int tmp, orig;
83	int ret;
84
85	ret = rt715_index_read_nid(regmap, nid, reg, &orig);
86	if (ret < 0)
87		return ret;
88
89	tmp = orig & ~mask;
90	tmp |= val & mask;
91
92	return rt715_index_write_nid(regmap, nid, reg, tmp);
93}
94
95static void rt715_reset(struct regmap *regmap)
96{
97	regmap_write(regmap, RT715_FUNC_RESET, 0);
98	rt715_index_update_bits(regmap, RT715_VENDOR_REGISTERS,
99		RT715_VD_CLEAR_CTRL, RT715_CLEAR_HIDDEN_REG,
100		RT715_CLEAR_HIDDEN_REG);
101}
102
103
104static void rt715_get_gain(struct rt715_priv *rt715, unsigned int addr_h,
105				unsigned int addr_l, unsigned int val_h,
106				unsigned int *r_val, unsigned int *l_val)
107{
108	int ret;
109	/* R Channel */
110	*r_val = val_h << 8;
111	ret = regmap_read(rt715->regmap, addr_l, r_val);
112	if (ret < 0)
113		pr_err("Failed to get R channel gain.\n");
114
115	/* L Channel */
116	val_h |= 0x20;
117	*l_val = val_h << 8;
118	ret = regmap_read(rt715->regmap, addr_h, l_val);
119	if (ret < 0)
120		pr_err("Failed to get L channel gain.\n");
121}
122
123/* For Verb-Set Amplifier Gain (Verb ID = 3h) */
124static int rt715_set_amp_gain_put(struct snd_kcontrol *kcontrol,
125					struct snd_ctl_elem_value *ucontrol)
126{
127	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
128	struct snd_soc_dapm_context *dapm =
129		snd_soc_component_get_dapm(component);
130	struct soc_mixer_control *mc =
131		(struct soc_mixer_control *)kcontrol->private_value;
132	struct rt715_priv *rt715 = snd_soc_component_get_drvdata(component);
133	unsigned int addr_h, addr_l, val_h, val_ll, val_lr;
134	unsigned int read_ll, read_rl, i;
135	unsigned int k_vol_changed = 0;
136
137	for (i = 0; i < 2; i++) {
138		if (ucontrol->value.integer.value[i] != rt715->kctl_2ch_vol_ori[i]) {
139			k_vol_changed = 1;
140			break;
141		}
142	}
143
144	/* Can't use update bit function, so read the original value first */
145	addr_h = mc->reg;
146	addr_l = mc->rreg;
147
148	if (mc->shift == RT715_DIR_OUT_SFT) /* output */
149		val_h = 0x80;
150	else /* input */
151		val_h = 0x0;
152
153	rt715_get_gain(rt715, addr_h, addr_l, val_h, &read_rl, &read_ll);
154
155	if (dapm->bias_level <= SND_SOC_BIAS_STANDBY)
156		regmap_write(rt715->regmap,
157				RT715_SET_AUDIO_POWER_STATE, AC_PWRST_D0);
158
159	/* L Channel */
160	rt715->kctl_2ch_vol_ori[0] = ucontrol->value.integer.value[0];
161	/* for gain */
162	val_ll = ((ucontrol->value.integer.value[0]) & 0x7f);
163	if (val_ll > mc->max)
164		val_ll = mc->max;
165	/* keep mute status */
166	val_ll |= read_ll & 0x80;
167
168	/* R Channel */
169	rt715->kctl_2ch_vol_ori[1] = ucontrol->value.integer.value[1];
170	/* for gain */
171	val_lr = ((ucontrol->value.integer.value[1]) & 0x7f);
172	if (val_lr > mc->max)
173		val_lr = mc->max;
174	/* keep mute status */
175	val_lr |= read_rl & 0x80;
176
177	for (i = 0; i < 3; i++) { /* retry 3 times at most */
178
179		if (val_ll == val_lr) {
180			/* Set both L/R channels at the same time */
181			val_h = (1 << mc->shift) | (3 << 4);
182			regmap_write(rt715->regmap, addr_h,
183				(val_h << 8) | val_ll);
184			regmap_write(rt715->regmap, addr_l,
185				(val_h << 8) | val_ll);
186		} else {
187			/* Lch*/
188			val_h = (1 << mc->shift) | (1 << 5);
189			regmap_write(rt715->regmap, addr_h,
190				(val_h << 8) | val_ll);
191			/* Rch */
192			val_h = (1 << mc->shift) | (1 << 4);
193			regmap_write(rt715->regmap, addr_l,
194				(val_h << 8) | val_lr);
195		}
196		/* check result */
197		if (mc->shift == RT715_DIR_OUT_SFT) /* output */
198			val_h = 0x80;
199		else /* input */
200			val_h = 0x0;
201
202		rt715_get_gain(rt715, addr_h, addr_l, val_h,
203				&read_rl, &read_ll);
204		if (read_rl == val_lr && read_ll == val_ll)
205			break;
206	}
207
208	/* D0:power on state, D3: power saving mode */
209	if (dapm->bias_level <= SND_SOC_BIAS_STANDBY)
210		regmap_write(rt715->regmap,
211				RT715_SET_AUDIO_POWER_STATE, AC_PWRST_D3);
212	return k_vol_changed;
213}
214
215static int rt715_set_amp_gain_get(struct snd_kcontrol *kcontrol,
216				  struct snd_ctl_elem_value *ucontrol)
217{
218	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
219	struct rt715_priv *rt715 = snd_soc_component_get_drvdata(component);
220	struct soc_mixer_control *mc =
221		(struct soc_mixer_control *)kcontrol->private_value;
222	unsigned int addr_h, addr_l, val_h;
223	unsigned int read_ll, read_rl;
224
225	addr_h = mc->reg;
226	addr_l = mc->rreg;
227	if (mc->shift == RT715_DIR_OUT_SFT) /* output */
228		val_h = 0x80;
229	else /* input */
230		val_h = 0x0;
231
232	rt715_get_gain(rt715, addr_h, addr_l, val_h, &read_rl, &read_ll);
233
234	if (mc->invert) {
235		/* for mute status */
236		read_ll = !(read_ll & 0x80);
237		read_rl = !(read_rl & 0x80);
238	} else {
239		/* for gain */
240		read_ll = read_ll & 0x7f;
241		read_rl = read_rl & 0x7f;
242	}
243	ucontrol->value.integer.value[0] = read_ll;
244	ucontrol->value.integer.value[1] = read_rl;
245
246	return 0;
247}
248
249static int rt715_set_main_switch_put(struct snd_kcontrol *kcontrol,
250					struct snd_ctl_elem_value *ucontrol)
251{
252	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
253	struct snd_soc_dapm_context *dapm =
254		snd_soc_component_get_dapm(component);
255	struct rt715_priv *rt715 = snd_soc_component_get_drvdata(component);
256	static const unsigned int capture_reg_H[] = {
257		RT715_SET_GAIN_MIC_ADC_H, RT715_SET_GAIN_LINE_ADC_H,
258		RT715_SET_GAIN_MIX_ADC_H, RT715_SET_GAIN_MIX_ADC2_H };
259	static const unsigned int capture_reg_L[] = {
260		RT715_SET_GAIN_MIC_ADC_L, RT715_SET_GAIN_LINE_ADC_L,
261		RT715_SET_GAIN_MIX_ADC_L, RT715_SET_GAIN_MIX_ADC2_L };
262	unsigned int addr_h, addr_l, val_h = 0x0, val_ll, val_lr;
263	unsigned int k_shift = RT715_DIR_IN_SFT, k_changed = 0;
264	unsigned int read_ll, read_rl, i, j, loop_cnt = 4;
265
266	for (i = 0; i < 8; i++) {
267		if (ucontrol->value.integer.value[i] != rt715->kctl_8ch_switch_ori[i])
268			k_changed = 1;
269	}
270
271	for (j = 0; j < loop_cnt; j++) {
272		/* Can't use update bit function, so read the original value first */
273		addr_h = capture_reg_H[j];
274		addr_l = capture_reg_L[j];
275		rt715_get_gain(rt715, addr_h, addr_l, val_h, &read_rl, &read_ll);
276
277		if (dapm->bias_level <= SND_SOC_BIAS_STANDBY)
278			regmap_write(rt715->regmap,
279					RT715_SET_AUDIO_POWER_STATE, AC_PWRST_D0);
280
281		/* L Channel */
282		/* for mute */
283		rt715->kctl_8ch_switch_ori[j * 2] =
284			ucontrol->value.integer.value[j * 2];
285		val_ll = (!ucontrol->value.integer.value[j * 2]) << 7;
286		/* keep gain */
287		val_ll |= read_ll & 0x7f;
288
289		/* R Channel */
290		/* for mute */
291		rt715->kctl_8ch_switch_ori[j * 2 + 1] =
292			ucontrol->value.integer.value[j * 2 + 1];
293		val_lr = (!ucontrol->value.integer.value[j * 2 + 1]) << 7;
294		/* keep gain */
295		val_lr |= read_rl & 0x7f;
296
297		for (i = 0; i < 3; i++) { /* retry 3 times at most */
298
299			if (val_ll == val_lr) {
300				/* Set both L/R channels at the same time */
301				val_h = (1 << k_shift) | (3 << 4);
302				regmap_write(rt715->regmap, addr_h,
303					(val_h << 8) | val_ll);
304				regmap_write(rt715->regmap, addr_l,
305					(val_h << 8) | val_ll);
306			} else {
307				/* Lch*/
308				val_h = (1 << k_shift) | (1 << 5);
309				regmap_write(rt715->regmap, addr_h,
310					(val_h << 8) | val_ll);
311				/* Rch */
312				val_h = (1 << k_shift) | (1 << 4);
313				regmap_write(rt715->regmap, addr_l,
314					(val_h << 8) | val_lr);
315			}
316			val_h = 0x0;
317			rt715_get_gain(rt715, addr_h, addr_l, val_h,
318					&read_rl, &read_ll);
319			if (read_rl == val_lr && read_ll == val_ll)
320				break;
321		}
322	}
323
324	/* D0:power on state, D3: power saving mode */
325	if (dapm->bias_level <= SND_SOC_BIAS_STANDBY)
326		regmap_write(rt715->regmap,
327				RT715_SET_AUDIO_POWER_STATE, AC_PWRST_D3);
328	return k_changed;
329}
330
331static int rt715_set_main_switch_get(struct snd_kcontrol *kcontrol,
332				  struct snd_ctl_elem_value *ucontrol)
333{
334	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
335	struct rt715_priv *rt715 = snd_soc_component_get_drvdata(component);
336	static const unsigned int capture_reg_H[] = {
337		RT715_SET_GAIN_MIC_ADC_H, RT715_SET_GAIN_LINE_ADC_H,
338		RT715_SET_GAIN_MIX_ADC_H, RT715_SET_GAIN_MIX_ADC2_H };
339	static const unsigned int capture_reg_L[] = {
340		RT715_SET_GAIN_MIC_ADC_L, RT715_SET_GAIN_LINE_ADC_L,
341		RT715_SET_GAIN_MIX_ADC_L, RT715_SET_GAIN_MIX_ADC2_L };
342	unsigned int addr_h, addr_l, val_h = 0x0, i, loop_cnt = 4;
343	unsigned int read_ll, read_rl;
344
345	for (i = 0; i < loop_cnt; i++) {
346		addr_h = capture_reg_H[i];
347		addr_l = capture_reg_L[i];
348		rt715_get_gain(rt715, addr_h, addr_l, val_h, &read_rl, &read_ll);
349
350		ucontrol->value.integer.value[i * 2] = !(read_ll & 0x80);
351		ucontrol->value.integer.value[i * 2 + 1] = !(read_rl & 0x80);
352	}
353
354	return 0;
355}
356
357static int rt715_set_main_vol_put(struct snd_kcontrol *kcontrol,
358					struct snd_ctl_elem_value *ucontrol)
359{
360	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
361	struct snd_soc_dapm_context *dapm =
362		snd_soc_component_get_dapm(component);
363	struct rt715_priv *rt715 = snd_soc_component_get_drvdata(component);
364	static const unsigned int capture_reg_H[] = {
365		RT715_SET_GAIN_MIC_ADC_H, RT715_SET_GAIN_LINE_ADC_H,
366		RT715_SET_GAIN_MIX_ADC_H, RT715_SET_GAIN_MIX_ADC2_H };
367	static const unsigned int capture_reg_L[] = {
368		RT715_SET_GAIN_MIC_ADC_L, RT715_SET_GAIN_LINE_ADC_L,
369		RT715_SET_GAIN_MIX_ADC_L, RT715_SET_GAIN_MIX_ADC2_L};
370	unsigned int addr_h, addr_l, val_h = 0x0, val_ll, val_lr;
371	unsigned int read_ll, read_rl, i, j, loop_cnt = 4, k_changed = 0;
372	unsigned int k_shift = RT715_DIR_IN_SFT, k_max = 0x3f;
373
374	for (i = 0; i < 8; i++) {
375		if (ucontrol->value.integer.value[i] != rt715->kctl_8ch_vol_ori[i])
376			k_changed = 1;
377	}
378
379	for (j = 0; j < loop_cnt; j++) {
380		addr_h = capture_reg_H[j];
381		addr_l = capture_reg_L[j];
382		rt715_get_gain(rt715, addr_h, addr_l, val_h, &read_rl, &read_ll);
383
384		if (dapm->bias_level <= SND_SOC_BIAS_STANDBY)
385			regmap_write(rt715->regmap,
386					RT715_SET_AUDIO_POWER_STATE, AC_PWRST_D0);
387
388		/* L Channel */
389		/* for gain */
390		rt715->kctl_8ch_vol_ori[j * 2] = ucontrol->value.integer.value[j * 2];
391		val_ll = ((ucontrol->value.integer.value[j * 2]) & 0x7f);
392		if (val_ll > k_max)
393			val_ll = k_max;
394		/* keep mute status */
395		val_ll |= read_ll & 0x80;
396
397		/* R Channel */
398		/* for gain */
399		rt715->kctl_8ch_vol_ori[j * 2 + 1] =
400			ucontrol->value.integer.value[j * 2 + 1];
401		val_lr = ((ucontrol->value.integer.value[j * 2 + 1]) & 0x7f);
402		if (val_lr > k_max)
403			val_lr = k_max;
404		/* keep mute status */
405		val_lr |= read_rl & 0x80;
406
407		for (i = 0; i < 3; i++) { /* retry 3 times at most */
408			if (val_ll == val_lr) {
409				/* Set both L/R channels at the same time */
410				val_h = (1 << k_shift) | (3 << 4);
411				regmap_write(rt715->regmap, addr_h,
412					(val_h << 8) | val_ll);
413				regmap_write(rt715->regmap, addr_l,
414					(val_h << 8) | val_ll);
415			} else {
416				/* Lch*/
417				val_h = (1 << k_shift) | (1 << 5);
418				regmap_write(rt715->regmap, addr_h,
419					(val_h << 8) | val_ll);
420				/* Rch */
421				val_h = (1 << k_shift) | (1 << 4);
422				regmap_write(rt715->regmap, addr_l,
423					(val_h << 8) | val_lr);
424			}
425			val_h = 0x0;
426			rt715_get_gain(rt715, addr_h, addr_l, val_h,
427					&read_rl, &read_ll);
428			if (read_rl == val_lr && read_ll == val_ll)
429				break;
430		}
431	}
432
433	/* D0:power on state, D3: power saving mode */
434	if (dapm->bias_level <= SND_SOC_BIAS_STANDBY)
435		regmap_write(rt715->regmap,
436				RT715_SET_AUDIO_POWER_STATE, AC_PWRST_D3);
437	return k_changed;
438}
439
440static int rt715_set_main_vol_get(struct snd_kcontrol *kcontrol,
441				  struct snd_ctl_elem_value *ucontrol)
442{
443	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
444	struct rt715_priv *rt715 = snd_soc_component_get_drvdata(component);
445	static const unsigned int capture_reg_H[] = {
446		RT715_SET_GAIN_MIC_ADC_H, RT715_SET_GAIN_LINE_ADC_H,
447		RT715_SET_GAIN_MIX_ADC_H, RT715_SET_GAIN_MIX_ADC2_H };
448	static const unsigned int capture_reg_L[] = {
449		RT715_SET_GAIN_MIC_ADC_L, RT715_SET_GAIN_LINE_ADC_L,
450		RT715_SET_GAIN_MIX_ADC_L, RT715_SET_GAIN_MIX_ADC2_L };
451	unsigned int addr_h, addr_l, val_h = 0x0, i, loop_cnt = 4;
452	unsigned int read_ll, read_rl;
453
454	for (i = 0; i < loop_cnt; i++) {
455		addr_h = capture_reg_H[i];
456		addr_l = capture_reg_L[i];
457		rt715_get_gain(rt715, addr_h, addr_l, val_h, &read_rl, &read_ll);
458
459		ucontrol->value.integer.value[i * 2] = read_ll & 0x7f;
460		ucontrol->value.integer.value[i * 2 + 1] = read_rl & 0x7f;
461	}
462
463	return 0;
464}
465
466static const DECLARE_TLV_DB_SCALE(in_vol_tlv, -1725, 75, 0);
467static const DECLARE_TLV_DB_SCALE(mic_vol_tlv, 0, 1000, 0);
468
469static int rt715_switch_info(struct snd_kcontrol *kcontrol,
470	struct snd_ctl_elem_info *uinfo)
471{
472	uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
473	uinfo->count = 8;
474	uinfo->value.integer.min = 0;
475	uinfo->value.integer.max = 1;
476	return 0;
477}
478
479static int rt715_vol_info(struct snd_kcontrol *kcontrol,
480	struct snd_ctl_elem_info *uinfo)
481{
482	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
483	uinfo->count = 8;
484	uinfo->value.integer.min = 0;
485	uinfo->value.integer.max = 0x3f;
486	return 0;
487}
488
489#define SOC_DOUBLE_R_EXT(xname, reg_left, reg_right, xshift, xmax, xinvert,\
490	 xhandler_get, xhandler_put) \
491{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \
492	.info = snd_soc_info_volsw, \
493	.get = xhandler_get, .put = xhandler_put, \
494	.private_value = SOC_DOUBLE_R_VALUE(reg_left, reg_right, xshift, \
495					    xmax, xinvert) }
496
497#define RT715_MAIN_SWITCH_EXT(xname, xhandler_get, xhandler_put) \
498{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \
499	.info = rt715_switch_info, \
500	.get = xhandler_get, .put = xhandler_put, \
501}
502
503#define RT715_MAIN_VOL_EXT_TLV(xname, xhandler_get, xhandler_put, tlv_array) \
504{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \
505	.access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
506		 SNDRV_CTL_ELEM_ACCESS_READWRITE, \
507	.tlv.p = (tlv_array), \
508	.info = rt715_vol_info, \
509	.get = xhandler_get, .put = xhandler_put, \
510}
511
512static const struct snd_kcontrol_new rt715_snd_controls[] = {
513	/* Capture switch */
514	RT715_MAIN_SWITCH_EXT("Capture Switch",
515			rt715_set_main_switch_get, rt715_set_main_switch_put),
516	/* Volume Control */
517	RT715_MAIN_VOL_EXT_TLV("Capture Volume",
518			rt715_set_main_vol_get, rt715_set_main_vol_put, in_vol_tlv),
519	/* MIC Boost Control */
520	SOC_DOUBLE_R_EXT_TLV("DMIC1 Boost", RT715_SET_GAIN_DMIC1_H,
521			RT715_SET_GAIN_DMIC1_L, RT715_DIR_IN_SFT, 3, 0,
522			rt715_set_amp_gain_get, rt715_set_amp_gain_put,
523			mic_vol_tlv),
524	SOC_DOUBLE_R_EXT_TLV("DMIC2 Boost", RT715_SET_GAIN_DMIC2_H,
525			RT715_SET_GAIN_DMIC2_L, RT715_DIR_IN_SFT, 3, 0,
526			rt715_set_amp_gain_get, rt715_set_amp_gain_put,
527			mic_vol_tlv),
528	SOC_DOUBLE_R_EXT_TLV("DMIC3 Boost", RT715_SET_GAIN_DMIC3_H,
529			RT715_SET_GAIN_DMIC3_L, RT715_DIR_IN_SFT, 3, 0,
530			rt715_set_amp_gain_get, rt715_set_amp_gain_put,
531			mic_vol_tlv),
532	SOC_DOUBLE_R_EXT_TLV("DMIC4 Boost", RT715_SET_GAIN_DMIC4_H,
533			RT715_SET_GAIN_DMIC4_L, RT715_DIR_IN_SFT, 3, 0,
534			rt715_set_amp_gain_get, rt715_set_amp_gain_put,
535			mic_vol_tlv),
536	SOC_DOUBLE_R_EXT_TLV("MIC1 Boost", RT715_SET_GAIN_MIC1_H,
537			RT715_SET_GAIN_MIC1_L, RT715_DIR_IN_SFT, 3, 0,
538			rt715_set_amp_gain_get, rt715_set_amp_gain_put,
539			mic_vol_tlv),
540	SOC_DOUBLE_R_EXT_TLV("MIC2 Boost", RT715_SET_GAIN_MIC2_H,
541			RT715_SET_GAIN_MIC2_L, RT715_DIR_IN_SFT, 3, 0,
542			rt715_set_amp_gain_get, rt715_set_amp_gain_put,
543			mic_vol_tlv),
544	SOC_DOUBLE_R_EXT_TLV("LINE1 Boost", RT715_SET_GAIN_LINE1_H,
545			RT715_SET_GAIN_LINE1_L, RT715_DIR_IN_SFT, 3, 0,
546			rt715_set_amp_gain_get, rt715_set_amp_gain_put,
547			mic_vol_tlv),
548	SOC_DOUBLE_R_EXT_TLV("LINE2 Boost", RT715_SET_GAIN_LINE2_H,
549			RT715_SET_GAIN_LINE2_L, RT715_DIR_IN_SFT, 3, 0,
550			rt715_set_amp_gain_get, rt715_set_amp_gain_put,
551			mic_vol_tlv),
552};
553
554static int rt715_mux_get(struct snd_kcontrol *kcontrol,
555			struct snd_ctl_elem_value *ucontrol)
556{
557	struct snd_soc_component *component =
558		snd_soc_dapm_kcontrol_component(kcontrol);
559	struct rt715_priv *rt715 = snd_soc_component_get_drvdata(component);
560	struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
561	unsigned int reg, val;
562	int ret;
563
564	/* nid = e->reg, vid = 0xf01 */
565	reg = RT715_VERB_SET_CONNECT_SEL | e->reg;
566	ret = regmap_read(rt715->regmap, reg, &val);
567	if (ret < 0) {
568		dev_err(component->dev, "%s: sdw read failed: %d\n",
569			__func__, ret);
570		return ret;
571	}
572
573	/*
574	 * The first two indices of ADC Mux 24/25 are routed to the same
575	 * hardware source. ie, ADC Mux 24 0/1 will both connect to MIC2.
576	 * To have a unique set of inputs, we skip the index1 of the muxes.
577	 */
578	if ((e->reg == RT715_MUX_IN3 || e->reg == RT715_MUX_IN4) && (val > 0))
579		val -= 1;
580	ucontrol->value.enumerated.item[0] = val;
581
582	return 0;
583}
584
585static int rt715_mux_put(struct snd_kcontrol *kcontrol,
586			struct snd_ctl_elem_value *ucontrol)
587{
588	struct snd_soc_component *component =
589		snd_soc_dapm_kcontrol_component(kcontrol);
590	struct snd_soc_dapm_context *dapm =
591				snd_soc_dapm_kcontrol_dapm(kcontrol);
592	struct rt715_priv *rt715 = snd_soc_component_get_drvdata(component);
593	struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
594	unsigned int *item = ucontrol->value.enumerated.item;
595	unsigned int val, val2 = 0, change, reg;
596	int ret;
597
598	if (item[0] >= e->items)
599		return -EINVAL;
600
601	/* Verb ID = 0x701h, nid = e->reg */
602	val = snd_soc_enum_item_to_val(e, item[0]) << e->shift_l;
603
604	reg = RT715_VERB_SET_CONNECT_SEL | e->reg;
605	ret = regmap_read(rt715->regmap, reg, &val2);
606	if (ret < 0) {
607		dev_err(component->dev, "%s: sdw read failed: %d\n",
608			__func__, ret);
609		return ret;
610	}
611
612	if (val == val2)
613		change = 0;
614	else
615		change = 1;
616
617	if (change) {
618		reg = RT715_VERB_SET_CONNECT_SEL | e->reg;
619		regmap_write(rt715->regmap, reg, val);
620	}
621
622	snd_soc_dapm_mux_update_power(dapm, kcontrol,
623						item[0], e, NULL);
624
625	return change;
626}
627
628static const char * const adc_22_23_mux_text[] = {
629	"MIC1",
630	"MIC2",
631	"LINE1",
632	"LINE2",
633	"DMIC1",
634	"DMIC2",
635	"DMIC3",
636	"DMIC4",
637};
638
639/*
640 * Due to mux design for nid 24 (MUX_IN3)/25 (MUX_IN4), connection index 0 and
641 * 1 will be connected to the same dmic source, therefore we skip index 1 to
642 * avoid misunderstanding on usage of dapm routing.
643 */
644static const unsigned int rt715_adc_24_25_values[] = {
645	0,
646	2,
647	3,
648	4,
649	5,
650};
651
652static const char * const adc_24_mux_text[] = {
653	"MIC2",
654	"DMIC1",
655	"DMIC2",
656	"DMIC3",
657	"DMIC4",
658};
659
660static const char * const adc_25_mux_text[] = {
661	"MIC1",
662	"DMIC1",
663	"DMIC2",
664	"DMIC3",
665	"DMIC4",
666};
667
668static SOC_ENUM_SINGLE_DECL(
669	rt715_adc22_enum, RT715_MUX_IN1, 0, adc_22_23_mux_text);
670
671static SOC_ENUM_SINGLE_DECL(
672	rt715_adc23_enum, RT715_MUX_IN2, 0, adc_22_23_mux_text);
673
674static SOC_VALUE_ENUM_SINGLE_DECL(rt715_adc24_enum,
675	RT715_MUX_IN3, 0, 0xf,
676	adc_24_mux_text, rt715_adc_24_25_values);
677
678static SOC_VALUE_ENUM_SINGLE_DECL(rt715_adc25_enum,
679	RT715_MUX_IN4, 0, 0xf,
680	adc_25_mux_text, rt715_adc_24_25_values);
681
682static const struct snd_kcontrol_new rt715_adc22_mux =
683	SOC_DAPM_ENUM_EXT("ADC 22 Mux", rt715_adc22_enum,
684			rt715_mux_get, rt715_mux_put);
685
686static const struct snd_kcontrol_new rt715_adc23_mux =
687	SOC_DAPM_ENUM_EXT("ADC 23 Mux", rt715_adc23_enum,
688			rt715_mux_get, rt715_mux_put);
689
690static const struct snd_kcontrol_new rt715_adc24_mux =
691	SOC_DAPM_ENUM_EXT("ADC 24 Mux", rt715_adc24_enum,
692			rt715_mux_get, rt715_mux_put);
693
694static const struct snd_kcontrol_new rt715_adc25_mux =
695	SOC_DAPM_ENUM_EXT("ADC 25 Mux", rt715_adc25_enum,
696			rt715_mux_get, rt715_mux_put);
697
698static const struct snd_soc_dapm_widget rt715_dapm_widgets[] = {
699	SND_SOC_DAPM_INPUT("DMIC1"),
700	SND_SOC_DAPM_INPUT("DMIC2"),
701	SND_SOC_DAPM_INPUT("DMIC3"),
702	SND_SOC_DAPM_INPUT("DMIC4"),
703	SND_SOC_DAPM_INPUT("MIC1"),
704	SND_SOC_DAPM_INPUT("MIC2"),
705	SND_SOC_DAPM_INPUT("LINE1"),
706	SND_SOC_DAPM_INPUT("LINE2"),
707	SND_SOC_DAPM_ADC("ADC 07", NULL, RT715_SET_STREAMID_MIC_ADC, 4, 0),
708	SND_SOC_DAPM_ADC("ADC 08", NULL, RT715_SET_STREAMID_LINE_ADC, 4, 0),
709	SND_SOC_DAPM_ADC("ADC 09", NULL, RT715_SET_STREAMID_MIX_ADC, 4, 0),
710	SND_SOC_DAPM_ADC("ADC 27", NULL, RT715_SET_STREAMID_MIX_ADC2, 4, 0),
711	SND_SOC_DAPM_MUX("ADC 22 Mux", SND_SOC_NOPM, 0, 0,
712		&rt715_adc22_mux),
713	SND_SOC_DAPM_MUX("ADC 23 Mux", SND_SOC_NOPM, 0, 0,
714		&rt715_adc23_mux),
715	SND_SOC_DAPM_MUX("ADC 24 Mux", SND_SOC_NOPM, 0, 0,
716		&rt715_adc24_mux),
717	SND_SOC_DAPM_MUX("ADC 25 Mux", SND_SOC_NOPM, 0, 0,
718		&rt715_adc25_mux),
719	SND_SOC_DAPM_AIF_OUT("DP4TX", "DP4 Capture", 0, SND_SOC_NOPM, 0, 0),
720	SND_SOC_DAPM_AIF_OUT("DP6TX", "DP6 Capture", 0, SND_SOC_NOPM, 0, 0),
721};
722
723static const struct snd_soc_dapm_route rt715_audio_map[] = {
724	{"DP6TX", NULL, "ADC 09"},
725	{"DP6TX", NULL, "ADC 08"},
726	{"DP4TX", NULL, "ADC 07"},
727	{"DP4TX", NULL, "ADC 27"},
728	{"ADC 09", NULL, "ADC 22 Mux"},
729	{"ADC 08", NULL, "ADC 23 Mux"},
730	{"ADC 07", NULL, "ADC 24 Mux"},
731	{"ADC 27", NULL, "ADC 25 Mux"},
732	{"ADC 22 Mux", "MIC1", "MIC1"},
733	{"ADC 22 Mux", "MIC2", "MIC2"},
734	{"ADC 22 Mux", "LINE1", "LINE1"},
735	{"ADC 22 Mux", "LINE2", "LINE2"},
736	{"ADC 22 Mux", "DMIC1", "DMIC1"},
737	{"ADC 22 Mux", "DMIC2", "DMIC2"},
738	{"ADC 22 Mux", "DMIC3", "DMIC3"},
739	{"ADC 22 Mux", "DMIC4", "DMIC4"},
740	{"ADC 23 Mux", "MIC1", "MIC1"},
741	{"ADC 23 Mux", "MIC2", "MIC2"},
742	{"ADC 23 Mux", "LINE1", "LINE1"},
743	{"ADC 23 Mux", "LINE2", "LINE2"},
744	{"ADC 23 Mux", "DMIC1", "DMIC1"},
745	{"ADC 23 Mux", "DMIC2", "DMIC2"},
746	{"ADC 23 Mux", "DMIC3", "DMIC3"},
747	{"ADC 23 Mux", "DMIC4", "DMIC4"},
748	{"ADC 24 Mux", "MIC2", "MIC2"},
749	{"ADC 24 Mux", "DMIC1", "DMIC1"},
750	{"ADC 24 Mux", "DMIC2", "DMIC2"},
751	{"ADC 24 Mux", "DMIC3", "DMIC3"},
752	{"ADC 24 Mux", "DMIC4", "DMIC4"},
753	{"ADC 25 Mux", "MIC1", "MIC1"},
754	{"ADC 25 Mux", "DMIC1", "DMIC1"},
755	{"ADC 25 Mux", "DMIC2", "DMIC2"},
756	{"ADC 25 Mux", "DMIC3", "DMIC3"},
757	{"ADC 25 Mux", "DMIC4", "DMIC4"},
758};
759
760static int rt715_set_bias_level(struct snd_soc_component *component,
761				enum snd_soc_bias_level level)
762{
763	struct snd_soc_dapm_context *dapm =
764		snd_soc_component_get_dapm(component);
765	struct rt715_priv *rt715 = snd_soc_component_get_drvdata(component);
766
767	switch (level) {
768	case SND_SOC_BIAS_PREPARE:
769		if (dapm->bias_level == SND_SOC_BIAS_STANDBY) {
770			regmap_write(rt715->regmap,
771						RT715_SET_AUDIO_POWER_STATE,
772						AC_PWRST_D0);
773			msleep(RT715_POWER_UP_DELAY_MS);
774		}
775		break;
776
777	case SND_SOC_BIAS_STANDBY:
778		regmap_write(rt715->regmap,
779					RT715_SET_AUDIO_POWER_STATE,
780					AC_PWRST_D3);
781		break;
782
783	default:
784		break;
785	}
786	dapm->bias_level = level;
787	return 0;
788}
789
790static int rt715_probe(struct snd_soc_component *component)
791{
792	struct rt715_priv *rt715 = snd_soc_component_get_drvdata(component);
793	int ret;
794
795	if (!rt715->first_hw_init)
796		return 0;
797
798	ret = pm_runtime_resume(component->dev);
799	if (ret < 0 && ret != -EACCES)
800		return ret;
801
802	return 0;
803}
804
805static const struct snd_soc_component_driver soc_codec_dev_rt715 = {
806	.probe = rt715_probe,
807	.set_bias_level = rt715_set_bias_level,
808	.controls = rt715_snd_controls,
809	.num_controls = ARRAY_SIZE(rt715_snd_controls),
810	.dapm_widgets = rt715_dapm_widgets,
811	.num_dapm_widgets = ARRAY_SIZE(rt715_dapm_widgets),
812	.dapm_routes = rt715_audio_map,
813	.num_dapm_routes = ARRAY_SIZE(rt715_audio_map),
814	.endianness = 1,
815};
816
817static int rt715_set_sdw_stream(struct snd_soc_dai *dai, void *sdw_stream,
818				int direction)
819{
820
821	snd_soc_dai_dma_data_set(dai, direction, sdw_stream);
822
823	return 0;
824}
825
826static void rt715_shutdown(struct snd_pcm_substream *substream,
827				struct snd_soc_dai *dai)
828
829{
830	snd_soc_dai_set_dma_data(dai, substream, NULL);
831}
832
833static int rt715_pcm_hw_params(struct snd_pcm_substream *substream,
834				struct snd_pcm_hw_params *params,
835				struct snd_soc_dai *dai)
836{
837	struct snd_soc_component *component = dai->component;
838	struct rt715_priv *rt715 = snd_soc_component_get_drvdata(component);
839	struct sdw_stream_config stream_config = {0};
840	struct sdw_port_config port_config = {0};
841	struct sdw_stream_runtime *sdw_stream;
842	int retval;
843	unsigned int val = 0;
844
845	sdw_stream = snd_soc_dai_get_dma_data(dai, substream);
846
847	if (!sdw_stream)
848		return -EINVAL;
849
850	if (!rt715->slave)
851		return -EINVAL;
852
853	snd_sdw_params_to_config(substream, params, &stream_config, &port_config);
854
855	switch (dai->id) {
856	case RT715_AIF1:
857		port_config.num = 6;
858		rt715_index_write(rt715->regmap, RT715_SDW_INPUT_SEL, 0xa500);
859		break;
860	case RT715_AIF2:
861		port_config.num = 4;
862		rt715_index_write(rt715->regmap, RT715_SDW_INPUT_SEL, 0xa000);
863		break;
864	default:
865		dev_err(component->dev, "%s: Invalid DAI id %d\n", __func__, dai->id);
866		return -EINVAL;
867	}
868
869	retval = sdw_stream_add_slave(rt715->slave, &stream_config,
870					&port_config, 1, sdw_stream);
871	if (retval) {
872		dev_err(dai->dev, "%s: Unable to configure port\n", __func__);
873		return retval;
874	}
875
876	switch (params_rate(params)) {
877	/* bit 14 0:48K 1:44.1K */
878	/* bit 15 Stream Type 0:PCM 1:Non-PCM, should always be PCM */
879	case 44100:
880		val |= 0x40 << 8;
881		break;
882	case 48000:
883		val |= 0x0 << 8;
884		break;
885	default:
886		dev_err(component->dev, "%s: Unsupported sample rate %d\n",
887			__func__, params_rate(params));
888		return -EINVAL;
889	}
890
891	if (params_channels(params) <= 16) {
892		/* bit 3:0 Number of Channel */
893		val |= (params_channels(params) - 1);
894	} else {
895		dev_err(component->dev, "%s: Unsupported channels %d\n",
896			__func__, params_channels(params));
897		return -EINVAL;
898	}
899
900	switch (params_width(params)) {
901	/* bit 6:4 Bits per Sample */
902	case 8:
903		break;
904	case 16:
905		val |= (0x1 << 4);
906		break;
907	case 20:
908		val |= (0x2 << 4);
909		break;
910	case 24:
911		val |= (0x3 << 4);
912		break;
913	case 32:
914		val |= (0x4 << 4);
915		break;
916	default:
917		return -EINVAL;
918	}
919
920	regmap_write(rt715->regmap, RT715_MIC_ADC_FORMAT_H, val);
921	regmap_write(rt715->regmap, RT715_MIC_LINE_FORMAT_H, val);
922	regmap_write(rt715->regmap, RT715_MIX_ADC_FORMAT_H, val);
923	regmap_write(rt715->regmap, RT715_MIX_ADC2_FORMAT_H, val);
924
925	return retval;
926}
927
928static int rt715_pcm_hw_free(struct snd_pcm_substream *substream,
929				struct snd_soc_dai *dai)
930{
931	struct snd_soc_component *component = dai->component;
932	struct rt715_priv *rt715 = snd_soc_component_get_drvdata(component);
933	struct sdw_stream_runtime *sdw_stream =
934		snd_soc_dai_get_dma_data(dai, substream);
935
936	if (!rt715->slave)
937		return -EINVAL;
938
939	sdw_stream_remove_slave(rt715->slave, sdw_stream);
940	return 0;
941}
942
943#define RT715_STEREO_RATES (SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000)
944#define RT715_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \
945			SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S8)
946
947static const struct snd_soc_dai_ops rt715_ops = {
948	.hw_params	= rt715_pcm_hw_params,
949	.hw_free	= rt715_pcm_hw_free,
950	.set_stream	= rt715_set_sdw_stream,
951	.shutdown	= rt715_shutdown,
952};
953
954static struct snd_soc_dai_driver rt715_dai[] = {
955	{
956		.name = "rt715-aif1",
957		.id = RT715_AIF1,
958		.capture = {
959			.stream_name = "DP6 Capture",
960			.channels_min = 1,
961			.channels_max = 2,
962			.rates = RT715_STEREO_RATES,
963			.formats = RT715_FORMATS,
964		},
965		.ops = &rt715_ops,
966	},
967	{
968		.name = "rt715-aif2",
969		.id = RT715_AIF2,
970		.capture = {
971			.stream_name = "DP4 Capture",
972			.channels_min = 1,
973			.channels_max = 2,
974			.rates = RT715_STEREO_RATES,
975			.formats = RT715_FORMATS,
976		},
977		.ops = &rt715_ops,
978	},
979};
980
981/* Bus clock frequency */
982#define RT715_CLK_FREQ_9600000HZ 9600000
983#define RT715_CLK_FREQ_12000000HZ 12000000
984#define RT715_CLK_FREQ_6000000HZ 6000000
985#define RT715_CLK_FREQ_4800000HZ 4800000
986#define RT715_CLK_FREQ_2400000HZ 2400000
987#define RT715_CLK_FREQ_12288000HZ 12288000
988
989int rt715_clock_config(struct device *dev)
990{
991	struct rt715_priv *rt715 = dev_get_drvdata(dev);
992	unsigned int clk_freq, value;
993
994	clk_freq = (rt715->params.curr_dr_freq >> 1);
995
996	switch (clk_freq) {
997	case RT715_CLK_FREQ_12000000HZ:
998		value = 0x0;
999		break;
1000	case RT715_CLK_FREQ_6000000HZ:
1001		value = 0x1;
1002		break;
1003	case RT715_CLK_FREQ_9600000HZ:
1004		value = 0x2;
1005		break;
1006	case RT715_CLK_FREQ_4800000HZ:
1007		value = 0x3;
1008		break;
1009	case RT715_CLK_FREQ_2400000HZ:
1010		value = 0x4;
1011		break;
1012	case RT715_CLK_FREQ_12288000HZ:
1013		value = 0x5;
1014		break;
1015	default:
1016		return -EINVAL;
1017	}
1018
1019	regmap_write(rt715->regmap, 0xe0, value);
1020	regmap_write(rt715->regmap, 0xf0, value);
1021
1022	return 0;
1023}
1024
1025int rt715_init(struct device *dev, struct regmap *sdw_regmap,
1026	struct regmap *regmap, struct sdw_slave *slave)
1027{
1028	struct rt715_priv *rt715;
1029	int ret;
1030
1031	rt715 = devm_kzalloc(dev, sizeof(*rt715), GFP_KERNEL);
1032	if (!rt715)
1033		return -ENOMEM;
1034
1035	dev_set_drvdata(dev, rt715);
1036	rt715->slave = slave;
1037	rt715->regmap = regmap;
1038	rt715->sdw_regmap = sdw_regmap;
1039
1040	regcache_cache_only(rt715->regmap, true);
1041
1042	/*
1043	 * Mark hw_init to false
1044	 * HW init will be performed when device reports present
1045	 */
1046	rt715->hw_init = false;
1047	rt715->first_hw_init = false;
1048
1049	ret = devm_snd_soc_register_component(dev,
1050						&soc_codec_dev_rt715,
1051						rt715_dai,
1052						ARRAY_SIZE(rt715_dai));
1053	if (ret < 0)
1054		return ret;
1055
1056	/* set autosuspend parameters */
1057	pm_runtime_set_autosuspend_delay(dev, 3000);
1058	pm_runtime_use_autosuspend(dev);
1059
1060	/* make sure the device does not suspend immediately */
1061	pm_runtime_mark_last_busy(dev);
1062
1063	pm_runtime_enable(dev);
1064
1065	/* important note: the device is NOT tagged as 'active' and will remain
1066	 * 'suspended' until the hardware is enumerated/initialized. This is required
1067	 * to make sure the ASoC framework use of pm_runtime_get_sync() does not silently
1068	 * fail with -EACCESS because of race conditions between card creation and enumeration
1069	 */
1070
1071	return 0;
1072}
1073
1074int rt715_io_init(struct device *dev, struct sdw_slave *slave)
1075{
1076	struct rt715_priv *rt715 = dev_get_drvdata(dev);
1077
1078	if (rt715->hw_init)
1079		return 0;
1080
1081	regcache_cache_only(rt715->regmap, false);
1082
1083	/*
1084	 *  PM runtime status is marked as 'active' only when a Slave reports as Attached
1085	 */
1086	if (!rt715->first_hw_init)
1087		/* update count of parent 'active' children */
1088		pm_runtime_set_active(&slave->dev);
1089
1090	pm_runtime_get_noresume(&slave->dev);
1091
1092	rt715_reset(rt715->regmap);
1093
1094	/* Mute nid=08h/09h */
1095	regmap_write(rt715->regmap, RT715_SET_GAIN_LINE_ADC_H, 0xb080);
1096	regmap_write(rt715->regmap, RT715_SET_GAIN_MIX_ADC_H, 0xb080);
1097	/* Mute nid=07h/27h */
1098	regmap_write(rt715->regmap, RT715_SET_GAIN_MIC_ADC_H, 0xb080);
1099	regmap_write(rt715->regmap, RT715_SET_GAIN_MIX_ADC2_H, 0xb080);
1100
1101	/* Set Pin Widget */
1102	regmap_write(rt715->regmap, RT715_SET_PIN_DMIC1, 0x20);
1103	regmap_write(rt715->regmap, RT715_SET_PIN_DMIC2, 0x20);
1104	regmap_write(rt715->regmap, RT715_SET_PIN_DMIC3, 0x20);
1105	regmap_write(rt715->regmap, RT715_SET_PIN_DMIC4, 0x20);
1106	/* Set Converter Stream */
1107	regmap_write(rt715->regmap, RT715_SET_STREAMID_LINE_ADC, 0x10);
1108	regmap_write(rt715->regmap, RT715_SET_STREAMID_MIX_ADC, 0x10);
1109	regmap_write(rt715->regmap, RT715_SET_STREAMID_MIC_ADC, 0x10);
1110	regmap_write(rt715->regmap, RT715_SET_STREAMID_MIX_ADC2, 0x10);
1111	/* Set Configuration Default */
1112	regmap_write(rt715->regmap, RT715_SET_DMIC1_CONFIG_DEFAULT1, 0xd0);
1113	regmap_write(rt715->regmap, RT715_SET_DMIC1_CONFIG_DEFAULT2, 0x11);
1114	regmap_write(rt715->regmap, RT715_SET_DMIC1_CONFIG_DEFAULT3, 0xa1);
1115	regmap_write(rt715->regmap, RT715_SET_DMIC1_CONFIG_DEFAULT4, 0x81);
1116	regmap_write(rt715->regmap, RT715_SET_DMIC2_CONFIG_DEFAULT1, 0xd1);
1117	regmap_write(rt715->regmap, RT715_SET_DMIC2_CONFIG_DEFAULT2, 0x11);
1118	regmap_write(rt715->regmap, RT715_SET_DMIC2_CONFIG_DEFAULT3, 0xa1);
1119	regmap_write(rt715->regmap, RT715_SET_DMIC2_CONFIG_DEFAULT4, 0x81);
1120	regmap_write(rt715->regmap, RT715_SET_DMIC3_CONFIG_DEFAULT1, 0xd0);
1121	regmap_write(rt715->regmap, RT715_SET_DMIC3_CONFIG_DEFAULT2, 0x11);
1122	regmap_write(rt715->regmap, RT715_SET_DMIC3_CONFIG_DEFAULT3, 0xa1);
1123	regmap_write(rt715->regmap, RT715_SET_DMIC3_CONFIG_DEFAULT4, 0x81);
1124	regmap_write(rt715->regmap, RT715_SET_DMIC4_CONFIG_DEFAULT1, 0xd1);
1125	regmap_write(rt715->regmap, RT715_SET_DMIC4_CONFIG_DEFAULT2, 0x11);
1126	regmap_write(rt715->regmap, RT715_SET_DMIC4_CONFIG_DEFAULT3, 0xa1);
1127	regmap_write(rt715->regmap, RT715_SET_DMIC4_CONFIG_DEFAULT4, 0x81);
1128
1129	/* Finish Initial Settings, set power to D3 */
1130	regmap_write(rt715->regmap, RT715_SET_AUDIO_POWER_STATE, AC_PWRST_D3);
1131
1132	if (rt715->first_hw_init)
1133		regcache_mark_dirty(rt715->regmap);
1134	else
1135		rt715->first_hw_init = true;
1136
1137	/* Mark Slave initialization complete */
1138	rt715->hw_init = true;
1139
1140	pm_runtime_mark_last_busy(&slave->dev);
1141	pm_runtime_put_autosuspend(&slave->dev);
1142
1143	return 0;
1144}
1145
1146MODULE_DESCRIPTION("ASoC rt715 driver");
1147MODULE_DESCRIPTION("ASoC rt715 driver SDW");
1148MODULE_AUTHOR("Jack Yu <jack.yu@realtek.com>");
1149MODULE_LICENSE("GPL v2");
1150