xref: /kernel/linux/linux-5.10/sound/soc/codecs/rt711.c (revision 8c2ecf20)
1// SPDX-License-Identifier: GPL-2.0
2//
3// rt711.c -- rt711 ALSA SoC audio driver
4//
5// Copyright(c) 2019 Realtek Semiconductor Corp.
6//
7//
8
9#include <linux/module.h>
10#include <linux/moduleparam.h>
11#include <linux/kernel.h>
12#include <linux/init.h>
13#include <linux/delay.h>
14#include <linux/pm_runtime.h>
15#include <linux/pm.h>
16#include <linux/soundwire/sdw.h>
17#include <linux/regmap.h>
18#include <linux/slab.h>
19#include <sound/core.h>
20#include <sound/pcm.h>
21#include <sound/pcm_params.h>
22#include <sound/soc.h>
23#include <sound/soc-dapm.h>
24#include <sound/initval.h>
25#include <sound/tlv.h>
26#include <sound/hda_verbs.h>
27#include <sound/jack.h>
28
29#include "rt711.h"
30
31static int rt711_index_write(struct regmap *regmap,
32		unsigned int nid, unsigned int reg, unsigned int value)
33{
34	int ret;
35	unsigned int addr = ((RT711_PRIV_INDEX_W_H | nid) << 8) | reg;
36
37	ret = regmap_write(regmap, addr, value);
38	if (ret < 0)
39		pr_err("Failed to set private value: %06x <= %04x ret=%d\n",
40			addr, value, ret);
41
42	return ret;
43}
44
45static int rt711_index_read(struct regmap *regmap,
46		unsigned int nid, unsigned int reg, unsigned int *value)
47{
48	int ret;
49	unsigned int addr = ((RT711_PRIV_INDEX_W_H | nid) << 8) | reg;
50
51	*value = 0;
52	ret = regmap_read(regmap, addr, value);
53	if (ret < 0)
54		pr_err("Failed to get private value: %06x => %04x ret=%d\n",
55			addr, *value, ret);
56
57	return ret;
58}
59
60static int rt711_index_update_bits(struct regmap *regmap, unsigned int nid,
61			unsigned int reg, unsigned int mask, unsigned int val)
62{
63	unsigned int tmp, orig;
64	int ret;
65
66	ret = rt711_index_read(regmap, nid, reg, &orig);
67	if (ret < 0)
68		return ret;
69
70	tmp = orig & ~mask;
71	tmp |= val & mask;
72
73	return rt711_index_write(regmap, nid, reg, tmp);
74}
75
76static void rt711_reset(struct regmap *regmap)
77{
78	regmap_write(regmap, RT711_FUNC_RESET, 0);
79	rt711_index_update_bits(regmap, RT711_VENDOR_REG,
80		RT711_PARA_VERB_CTL, RT711_HIDDEN_REG_SW_RESET,
81		RT711_HIDDEN_REG_SW_RESET);
82}
83
84static int rt711_calibration(struct rt711_priv *rt711)
85{
86	unsigned int val, loop = 0;
87	struct device *dev;
88	struct regmap *regmap = rt711->regmap;
89	int ret = 0;
90
91	mutex_lock(&rt711->calibrate_mutex);
92	regmap_write(rt711->regmap,
93		RT711_SET_AUDIO_POWER_STATE, AC_PWRST_D0);
94
95	dev = regmap_get_device(regmap);
96
97	/* Calibration manual mode */
98	rt711_index_update_bits(regmap, RT711_VENDOR_REG, RT711_FSM_CTL,
99		0xf, 0x0);
100
101	/* trigger */
102	rt711_index_update_bits(regmap, RT711_VENDOR_CALI,
103		RT711_DAC_DC_CALI_CTL1, RT711_DAC_DC_CALI_TRIGGER,
104		RT711_DAC_DC_CALI_TRIGGER);
105
106	/* wait for calibration process */
107	rt711_index_read(regmap, RT711_VENDOR_CALI,
108		RT711_DAC_DC_CALI_CTL1, &val);
109
110	while (val & RT711_DAC_DC_CALI_TRIGGER) {
111		if (loop >= 500) {
112			pr_err("%s, calibration time-out!\n",
113							__func__);
114			ret = -ETIMEDOUT;
115			break;
116		}
117		loop++;
118
119		usleep_range(10000, 11000);
120		rt711_index_read(regmap, RT711_VENDOR_CALI,
121			RT711_DAC_DC_CALI_CTL1, &val);
122	}
123
124	/* depop mode */
125	rt711_index_update_bits(regmap, RT711_VENDOR_REG,
126		RT711_FSM_CTL, 0xf, RT711_DEPOP_CTL);
127
128	regmap_write(rt711->regmap,
129		RT711_SET_AUDIO_POWER_STATE, AC_PWRST_D3);
130	mutex_unlock(&rt711->calibrate_mutex);
131
132	dev_dbg(dev, "%s calibration complete, ret=%d\n", __func__, ret);
133	return ret;
134}
135
136static unsigned int rt711_button_detect(struct rt711_priv *rt711)
137{
138	unsigned int btn_type = 0, val80, val81;
139	int ret;
140
141	ret = rt711_index_read(rt711->regmap, RT711_VENDOR_REG,
142				RT711_IRQ_FLAG_TABLE1, &val80);
143	if (ret < 0)
144		goto read_error;
145	ret = rt711_index_read(rt711->regmap, RT711_VENDOR_REG,
146					RT711_IRQ_FLAG_TABLE2, &val81);
147	if (ret < 0)
148		goto read_error;
149
150	val80 &= 0x0381;
151	val81 &= 0xff00;
152
153	switch (val80) {
154	case 0x0200:
155	case 0x0100:
156	case 0x0080:
157		btn_type |= SND_JACK_BTN_0;
158		break;
159	case 0x0001:
160		btn_type |= SND_JACK_BTN_3;
161		break;
162	}
163	switch (val81) {
164	case 0x8000:
165	case 0x4000:
166	case 0x2000:
167		btn_type |= SND_JACK_BTN_1;
168		break;
169	case 0x1000:
170	case 0x0800:
171	case 0x0400:
172		btn_type |= SND_JACK_BTN_2;
173		break;
174	case 0x0200:
175	case 0x0100:
176		btn_type |= SND_JACK_BTN_3;
177		break;
178	}
179read_error:
180	return btn_type;
181}
182
183static int rt711_headset_detect(struct rt711_priv *rt711)
184{
185	unsigned int buf, loop = 0;
186	int ret;
187	unsigned int jack_status = 0, reg;
188
189	ret = rt711_index_read(rt711->regmap, RT711_VENDOR_REG,
190				RT711_COMBO_JACK_AUTO_CTL2, &buf);
191	if (ret < 0)
192		goto io_error;
193
194	while (loop < 500 &&
195		(buf & RT711_COMBOJACK_AUTO_DET_STATUS) == 0) {
196		loop++;
197
198		usleep_range(9000, 10000);
199		ret = rt711_index_read(rt711->regmap, RT711_VENDOR_REG,
200					RT711_COMBO_JACK_AUTO_CTL2, &buf);
201		if (ret < 0)
202			goto io_error;
203
204		reg = RT711_VERB_GET_PIN_SENSE | RT711_HP_OUT;
205		ret = regmap_read(rt711->regmap, reg, &jack_status);
206		if (ret < 0)
207			goto io_error;
208		if ((jack_status & (1 << 31)) == 0)
209			goto remove_error;
210	}
211
212	if (loop >= 500)
213		goto to_error;
214
215	if (buf & RT711_COMBOJACK_AUTO_DET_TRS)
216		rt711->jack_type = SND_JACK_HEADPHONE;
217	else if ((buf & RT711_COMBOJACK_AUTO_DET_CTIA) ||
218		(buf & RT711_COMBOJACK_AUTO_DET_OMTP))
219		rt711->jack_type = SND_JACK_HEADSET;
220
221	return 0;
222
223to_error:
224	ret = -ETIMEDOUT;
225	pr_err_ratelimited("Time-out error in %s\n", __func__);
226	return ret;
227io_error:
228	pr_err_ratelimited("IO error in %s, ret %d\n", __func__, ret);
229	return ret;
230remove_error:
231	pr_err_ratelimited("Jack removal in %s\n", __func__);
232	return -ENODEV;
233}
234
235static void rt711_jack_detect_handler(struct work_struct *work)
236{
237	struct rt711_priv *rt711 =
238		container_of(work, struct rt711_priv, jack_detect_work.work);
239	int btn_type = 0, ret;
240	unsigned int jack_status = 0, reg;
241
242	if (!rt711->hs_jack)
243		return;
244
245	if (!rt711->component->card->instantiated)
246		return;
247
248	reg = RT711_VERB_GET_PIN_SENSE | RT711_HP_OUT;
249	ret = regmap_read(rt711->regmap, reg, &jack_status);
250	if (ret < 0)
251		goto io_error;
252
253	/* pin attached */
254	if (jack_status & (1 << 31)) {
255		/* jack in */
256		if (rt711->jack_type == 0) {
257			ret = rt711_headset_detect(rt711);
258			if (ret < 0)
259				return;
260			if (rt711->jack_type == SND_JACK_HEADSET)
261				btn_type = rt711_button_detect(rt711);
262		} else if (rt711->jack_type == SND_JACK_HEADSET) {
263			/* jack is already in, report button event */
264			btn_type = rt711_button_detect(rt711);
265		}
266	} else {
267		/* jack out */
268		rt711->jack_type = 0;
269	}
270
271	dev_dbg(&rt711->slave->dev,
272		"in %s, jack_type=0x%x\n", __func__, rt711->jack_type);
273	dev_dbg(&rt711->slave->dev,
274		"in %s, btn_type=0x%x\n", __func__, btn_type);
275
276	snd_soc_jack_report(rt711->hs_jack, rt711->jack_type | btn_type,
277			SND_JACK_HEADSET |
278			SND_JACK_BTN_0 | SND_JACK_BTN_1 |
279			SND_JACK_BTN_2 | SND_JACK_BTN_3);
280
281	if (btn_type) {
282		/* button released */
283		snd_soc_jack_report(rt711->hs_jack, rt711->jack_type,
284			SND_JACK_HEADSET |
285			SND_JACK_BTN_0 | SND_JACK_BTN_1 |
286			SND_JACK_BTN_2 | SND_JACK_BTN_3);
287
288		mod_delayed_work(system_power_efficient_wq,
289			&rt711->jack_btn_check_work, msecs_to_jiffies(200));
290	}
291
292	return;
293
294io_error:
295	pr_err_ratelimited("IO error in %s, ret %d\n", __func__, ret);
296}
297
298static void rt711_btn_check_handler(struct work_struct *work)
299{
300	struct rt711_priv *rt711 = container_of(work, struct rt711_priv,
301		jack_btn_check_work.work);
302	int btn_type = 0, ret;
303	unsigned int jack_status = 0, reg;
304
305	reg = RT711_VERB_GET_PIN_SENSE | RT711_HP_OUT;
306	ret = regmap_read(rt711->regmap, reg, &jack_status);
307	if (ret < 0)
308		goto io_error;
309
310	/* pin attached */
311	if (jack_status & (1 << 31)) {
312		if (rt711->jack_type == SND_JACK_HEADSET) {
313			/* jack is already in, report button event */
314			btn_type = rt711_button_detect(rt711);
315		}
316	} else {
317		rt711->jack_type = 0;
318	}
319
320	/* cbj comparator */
321	ret = rt711_index_read(rt711->regmap, RT711_VENDOR_REG,
322		RT711_COMBO_JACK_AUTO_CTL2, &reg);
323	if (ret < 0)
324		goto io_error;
325
326	if ((reg & 0xf0) == 0xf0)
327		btn_type = 0;
328
329	dev_dbg(&rt711->slave->dev,
330		"%s, btn_type=0x%x\n",	__func__, btn_type);
331	snd_soc_jack_report(rt711->hs_jack, rt711->jack_type | btn_type,
332			SND_JACK_HEADSET |
333			SND_JACK_BTN_0 | SND_JACK_BTN_1 |
334			SND_JACK_BTN_2 | SND_JACK_BTN_3);
335
336	if (btn_type) {
337		/* button released */
338		snd_soc_jack_report(rt711->hs_jack, rt711->jack_type,
339			SND_JACK_HEADSET |
340			SND_JACK_BTN_0 | SND_JACK_BTN_1 |
341			SND_JACK_BTN_2 | SND_JACK_BTN_3);
342
343		mod_delayed_work(system_power_efficient_wq,
344			&rt711->jack_btn_check_work, msecs_to_jiffies(200));
345	}
346
347	return;
348
349io_error:
350	pr_err_ratelimited("IO error in %s, ret %d\n", __func__, ret);
351}
352
353static void rt711_jack_init(struct rt711_priv *rt711)
354{
355	struct snd_soc_dapm_context *dapm =
356		snd_soc_component_get_dapm(rt711->component);
357
358	mutex_lock(&rt711->calibrate_mutex);
359	/* power on */
360	if (dapm->bias_level <= SND_SOC_BIAS_STANDBY)
361		regmap_write(rt711->regmap,
362			RT711_SET_AUDIO_POWER_STATE, AC_PWRST_D0);
363
364	if (rt711->hs_jack) {
365		/* unsolicited response & IRQ control */
366		regmap_write(rt711->regmap,
367			RT711_SET_MIC2_UNSOLICITED_ENABLE, 0x82);
368		regmap_write(rt711->regmap,
369			RT711_SET_HP_UNSOLICITED_ENABLE, 0x81);
370		regmap_write(rt711->regmap,
371			RT711_SET_INLINE_UNSOLICITED_ENABLE, 0x83);
372		rt711_index_write(rt711->regmap, RT711_VENDOR_REG,
373			0x10, 0x2420);
374		rt711_index_write(rt711->regmap, RT711_VENDOR_REG,
375			0x19, 0x2e11);
376
377		switch (rt711->jd_src) {
378		case RT711_JD1:
379			/* default settings was already for JD1 */
380			break;
381		case RT711_JD2:
382			rt711_index_update_bits(rt711->regmap, RT711_VENDOR_REG,
383				RT711_JD_CTL2, RT711_JD2_2PORT_200K_DECODE_HP |
384				RT711_HP_JD_SEL_JD2,
385				RT711_JD2_2PORT_200K_DECODE_HP |
386				RT711_HP_JD_SEL_JD2);
387			rt711_index_update_bits(rt711->regmap, RT711_VENDOR_REG,
388				RT711_CC_DET1,
389				RT711_HP_JD_FINAL_RESULT_CTL_JD12,
390				RT711_HP_JD_FINAL_RESULT_CTL_JD12);
391			break;
392		case RT711_JD2_100K:
393			rt711_index_update_bits(rt711->regmap, RT711_VENDOR_REG,
394				RT711_JD_CTL2, RT711_JD2_2PORT_100K_DECODE | RT711_JD2_1PORT_TYPE_DECODE |
395				RT711_HP_JD_SEL_JD2 | RT711_JD1_2PORT_TYPE_100K_DECODE,
396				RT711_JD2_2PORT_100K_DECODE_HP | RT711_JD2_1PORT_JD_HP |
397				RT711_HP_JD_SEL_JD2 | RT711_JD1_2PORT_JD_RESERVED);
398			rt711_index_update_bits(rt711->regmap, RT711_VENDOR_REG,
399				RT711_CC_DET1,
400				RT711_HP_JD_FINAL_RESULT_CTL_JD12,
401				RT711_HP_JD_FINAL_RESULT_CTL_JD12);
402			break;
403		case RT711_JD2_1P8V_1PORT:
404			rt711_index_update_bits(rt711->regmap, RT711_VENDOR_REG,
405				RT711_JD_CTL1, RT711_JD2_DIGITAL_JD_MODE_SEL,
406				RT711_JD2_1_JD_MODE);
407			rt711_index_update_bits(rt711->regmap, RT711_VENDOR_REG,
408				RT711_JD_CTL2, RT711_JD2_1PORT_TYPE_DECODE |
409				RT711_HP_JD_SEL_JD2,
410				RT711_JD2_1PORT_JD_HP |
411				RT711_HP_JD_SEL_JD2);
412			rt711_index_update_bits(rt711->regmap, RT711_VENDOR_REG,
413				RT711_JD_CTL4, RT711_JD2_PAD_PULL_UP_MASK |
414				RT711_JD2_MODE_SEL_MASK,
415				RT711_JD2_PAD_PULL_UP |
416				RT711_JD2_MODE2_1P8V_1PORT);
417			rt711_index_update_bits(rt711->regmap, RT711_VENDOR_REG,
418				RT711_CC_DET1,
419				RT711_HP_JD_FINAL_RESULT_CTL_JD12,
420				RT711_HP_JD_FINAL_RESULT_CTL_JD12);
421			break;
422		default:
423			dev_warn(rt711->component->dev, "Wrong JD source\n");
424			break;
425		}
426
427		dev_dbg(&rt711->slave->dev, "in %s enable\n", __func__);
428
429		mod_delayed_work(system_power_efficient_wq,
430			&rt711->jack_detect_work, msecs_to_jiffies(250));
431	} else {
432		regmap_write(rt711->regmap,
433			RT711_SET_MIC2_UNSOLICITED_ENABLE, 0x00);
434		regmap_write(rt711->regmap,
435			RT711_SET_HP_UNSOLICITED_ENABLE, 0x00);
436		regmap_write(rt711->regmap,
437			RT711_SET_INLINE_UNSOLICITED_ENABLE, 0x00);
438
439		dev_dbg(&rt711->slave->dev, "in %s disable\n", __func__);
440	}
441
442	/* power off */
443	if (dapm->bias_level <= SND_SOC_BIAS_STANDBY)
444		regmap_write(rt711->regmap,
445			RT711_SET_AUDIO_POWER_STATE, AC_PWRST_D3);
446	mutex_unlock(&rt711->calibrate_mutex);
447}
448
449static int rt711_set_jack_detect(struct snd_soc_component *component,
450	struct snd_soc_jack *hs_jack, void *data)
451{
452	struct rt711_priv *rt711 = snd_soc_component_get_drvdata(component);
453
454	rt711->hs_jack = hs_jack;
455
456	if (!rt711->hw_init) {
457		dev_dbg(&rt711->slave->dev,
458			"%s hw_init not ready yet\n", __func__);
459		return 0;
460	}
461
462	rt711_jack_init(rt711);
463
464	return 0;
465}
466
467static void rt711_get_gain(struct rt711_priv *rt711, unsigned int addr_h,
468				unsigned int addr_l, unsigned int val_h,
469				unsigned int *r_val, unsigned int *l_val)
470{
471	/* R Channel */
472	*r_val = (val_h << 8);
473	regmap_read(rt711->regmap, addr_l, r_val);
474
475	/* L Channel */
476	val_h |= 0x20;
477	*l_val = (val_h << 8);
478	regmap_read(rt711->regmap, addr_h, l_val);
479}
480
481/* For Verb-Set Amplifier Gain (Verb ID = 3h) */
482static int rt711_set_amp_gain_put(struct snd_kcontrol *kcontrol,
483		struct snd_ctl_elem_value *ucontrol)
484{
485	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
486	struct snd_soc_dapm_context *dapm =
487		snd_soc_component_get_dapm(component);
488	struct soc_mixer_control *mc =
489		(struct soc_mixer_control *)kcontrol->private_value;
490	struct rt711_priv *rt711 = snd_soc_component_get_drvdata(component);
491	unsigned int addr_h, addr_l, val_h, val_ll, val_lr;
492	unsigned int read_ll, read_rl;
493	int i;
494
495	mutex_lock(&rt711->calibrate_mutex);
496
497	/* Can't use update bit function, so read the original value first */
498	addr_h = mc->reg;
499	addr_l = mc->rreg;
500	if (mc->shift == RT711_DIR_OUT_SFT) /* output */
501		val_h = 0x80;
502	else /* input */
503		val_h = 0x0;
504
505	rt711_get_gain(rt711, addr_h, addr_l, val_h, &read_rl, &read_ll);
506
507	/* L Channel */
508	if (mc->invert) {
509		/* for mute/unmute */
510		val_ll = (mc->max - ucontrol->value.integer.value[0])
511					<< RT711_MUTE_SFT;
512		/* keep gain */
513		read_ll = read_ll & 0x7f;
514		val_ll |= read_ll;
515	} else {
516		/* for gain */
517		val_ll = ((ucontrol->value.integer.value[0]) & 0x7f);
518		if (val_ll > mc->max)
519			val_ll = mc->max;
520		/* keep mute status */
521		read_ll = read_ll & (1 << RT711_MUTE_SFT);
522		val_ll |= read_ll;
523	}
524
525	if (dapm->bias_level <= SND_SOC_BIAS_STANDBY)
526		regmap_write(rt711->regmap,
527				RT711_SET_AUDIO_POWER_STATE, AC_PWRST_D0);
528
529	/* R Channel */
530	if (mc->invert) {
531		/* for mute/unmute */
532		val_lr = (mc->max - ucontrol->value.integer.value[1])
533					<< RT711_MUTE_SFT;
534		/* keep gain */
535		read_rl = read_rl & 0x7f;
536		val_lr |= read_rl;
537	} else {
538		/* for gain */
539		val_lr = ((ucontrol->value.integer.value[1]) & 0x7f);
540		if (val_lr > mc->max)
541			val_lr = mc->max;
542		/* keep mute status */
543		read_rl = read_rl & (1 << RT711_MUTE_SFT);
544		val_lr |= read_rl;
545	}
546
547	for (i = 0; i < 3; i++) { /* retry 3 times at most */
548
549		if (val_ll == val_lr) {
550			/* Set both L/R channels at the same time */
551			val_h = (1 << mc->shift) | (3 << 4);
552			regmap_write(rt711->regmap,
553				addr_h, (val_h << 8 | val_ll));
554			regmap_write(rt711->regmap,
555				addr_l, (val_h << 8 | val_ll));
556		} else {
557			/* Lch*/
558			val_h = (1 << mc->shift) | (1 << 5);
559			regmap_write(rt711->regmap,
560				addr_h, (val_h << 8 | val_ll));
561
562			/* Rch */
563			val_h = (1 << mc->shift) | (1 << 4);
564			regmap_write(rt711->regmap,
565				addr_l, (val_h << 8 | val_lr));
566		}
567		/* check result */
568		if (mc->shift == RT711_DIR_OUT_SFT) /* output */
569			val_h = 0x80;
570		else /* input */
571			val_h = 0x0;
572
573		rt711_get_gain(rt711, addr_h, addr_l, val_h,
574					&read_rl, &read_ll);
575		if (read_rl == val_lr && read_ll == val_ll)
576			break;
577	}
578
579	if (dapm->bias_level <= SND_SOC_BIAS_STANDBY)
580		regmap_write(rt711->regmap,
581				RT711_SET_AUDIO_POWER_STATE, AC_PWRST_D3);
582
583	mutex_unlock(&rt711->calibrate_mutex);
584	return 0;
585}
586
587static int rt711_set_amp_gain_get(struct snd_kcontrol *kcontrol,
588		struct snd_ctl_elem_value *ucontrol)
589{
590	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
591	struct rt711_priv *rt711 = snd_soc_component_get_drvdata(component);
592	struct soc_mixer_control *mc =
593		(struct soc_mixer_control *)kcontrol->private_value;
594	unsigned int addr_h, addr_l, val_h;
595	unsigned int read_ll, read_rl;
596
597	/* switch to get command */
598	addr_h = mc->reg;
599	addr_l = mc->rreg;
600	if (mc->shift == RT711_DIR_OUT_SFT) /* output */
601		val_h = 0x80;
602	else /* input */
603		val_h = 0x0;
604
605	rt711_get_gain(rt711, addr_h, addr_l, val_h, &read_rl, &read_ll);
606
607	if (mc->invert) {
608		/* mute/unmute for switch controls */
609		read_ll = !((read_ll & 0x80) >> RT711_MUTE_SFT);
610		read_rl = !((read_rl & 0x80) >> RT711_MUTE_SFT);
611	} else {
612		/* for gain volume controls */
613		read_ll = read_ll & 0x7f;
614		read_rl = read_rl & 0x7f;
615	}
616	ucontrol->value.integer.value[0] = read_ll;
617	ucontrol->value.integer.value[1] = read_rl;
618
619	return 0;
620}
621
622static const DECLARE_TLV_DB_SCALE(out_vol_tlv, -6525, 75, 0);
623static const DECLARE_TLV_DB_SCALE(in_vol_tlv, -1725, 75, 0);
624static const DECLARE_TLV_DB_SCALE(mic_vol_tlv, 0, 1000, 0);
625
626static const struct snd_kcontrol_new rt711_snd_controls[] = {
627	SOC_DOUBLE_R_EXT_TLV("DAC Surr Playback Volume",
628		RT711_SET_GAIN_DAC2_H, RT711_SET_GAIN_DAC2_L,
629		RT711_DIR_OUT_SFT, 0x57, 0,
630		rt711_set_amp_gain_get, rt711_set_amp_gain_put, out_vol_tlv),
631	SOC_DOUBLE_R_EXT("ADC 08 Capture Switch",
632		RT711_SET_GAIN_ADC2_H, RT711_SET_GAIN_ADC2_L,
633		RT711_DIR_IN_SFT, 1, 1,
634		rt711_set_amp_gain_get, rt711_set_amp_gain_put),
635	SOC_DOUBLE_R_EXT("ADC 09 Capture Switch",
636		RT711_SET_GAIN_ADC1_H, RT711_SET_GAIN_ADC1_L,
637		RT711_DIR_IN_SFT, 1, 1,
638		rt711_set_amp_gain_get, rt711_set_amp_gain_put),
639	SOC_DOUBLE_R_EXT_TLV("ADC 08 Capture Volume",
640		RT711_SET_GAIN_ADC2_H, RT711_SET_GAIN_ADC2_L,
641		RT711_DIR_IN_SFT, 0x3f, 0,
642		rt711_set_amp_gain_get, rt711_set_amp_gain_put, in_vol_tlv),
643	SOC_DOUBLE_R_EXT_TLV("ADC 09 Capture Volume",
644		RT711_SET_GAIN_ADC1_H, RT711_SET_GAIN_ADC1_L,
645		RT711_DIR_IN_SFT, 0x3f, 0,
646		rt711_set_amp_gain_get, rt711_set_amp_gain_put, in_vol_tlv),
647	SOC_DOUBLE_R_EXT_TLV("AMIC Volume",
648		RT711_SET_GAIN_AMIC_H, RT711_SET_GAIN_AMIC_L,
649		RT711_DIR_IN_SFT, 3, 0,
650		rt711_set_amp_gain_get, rt711_set_amp_gain_put, mic_vol_tlv),
651	SOC_DOUBLE_R_EXT_TLV("DMIC1 Volume",
652		RT711_SET_GAIN_DMIC1_H, RT711_SET_GAIN_DMIC1_L,
653		RT711_DIR_IN_SFT, 3, 0,
654		rt711_set_amp_gain_get, rt711_set_amp_gain_put, mic_vol_tlv),
655	SOC_DOUBLE_R_EXT_TLV("DMIC2 Volume",
656		RT711_SET_GAIN_DMIC2_H, RT711_SET_GAIN_DMIC2_L,
657		RT711_DIR_IN_SFT, 3, 0,
658		rt711_set_amp_gain_get, rt711_set_amp_gain_put, mic_vol_tlv),
659};
660
661static int rt711_mux_get(struct snd_kcontrol *kcontrol,
662			struct snd_ctl_elem_value *ucontrol)
663{
664	struct snd_soc_component *component =
665		snd_soc_dapm_kcontrol_component(kcontrol);
666	struct rt711_priv *rt711 = snd_soc_component_get_drvdata(component);
667	unsigned int reg, val = 0, nid;
668	int ret;
669
670	if (strstr(ucontrol->id.name, "ADC 22 Mux"))
671		nid = RT711_MIXER_IN1;
672	else if (strstr(ucontrol->id.name, "ADC 23 Mux"))
673		nid = RT711_MIXER_IN2;
674	else
675		return -EINVAL;
676
677	/* vid = 0xf01 */
678	reg = RT711_VERB_SET_CONNECT_SEL | nid;
679	ret = regmap_read(rt711->regmap, reg, &val);
680	if (ret < 0) {
681		dev_err(component->dev, "%s: sdw read failed: %d\n",
682			__func__, ret);
683		return ret;
684	}
685
686	ucontrol->value.enumerated.item[0] = val;
687
688	return 0;
689}
690
691static int rt711_mux_put(struct snd_kcontrol *kcontrol,
692			struct snd_ctl_elem_value *ucontrol)
693{
694	struct snd_soc_component *component =
695		snd_soc_dapm_kcontrol_component(kcontrol);
696	struct snd_soc_dapm_context *dapm =
697		snd_soc_dapm_kcontrol_dapm(kcontrol);
698	struct rt711_priv *rt711 = snd_soc_component_get_drvdata(component);
699	struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
700	unsigned int *item = ucontrol->value.enumerated.item;
701	unsigned int val, val2 = 0, change, reg, nid;
702	int ret;
703
704	if (item[0] >= e->items)
705		return -EINVAL;
706
707	if (strstr(ucontrol->id.name, "ADC 22 Mux"))
708		nid = RT711_MIXER_IN1;
709	else if (strstr(ucontrol->id.name, "ADC 23 Mux"))
710		nid = RT711_MIXER_IN2;
711	else
712		return -EINVAL;
713
714	/* Verb ID = 0x701h */
715	val = snd_soc_enum_item_to_val(e, item[0]) << e->shift_l;
716
717	reg = RT711_VERB_SET_CONNECT_SEL | nid;
718	ret = regmap_read(rt711->regmap, reg, &val2);
719	if (ret < 0) {
720		dev_err(component->dev, "%s: sdw read failed: %d\n",
721			__func__, ret);
722		return ret;
723	}
724
725	if (val == val2)
726		change = 0;
727	else
728		change = 1;
729
730	if (change) {
731		reg = RT711_VERB_SET_CONNECT_SEL | nid;
732		regmap_write(rt711->regmap, reg, val);
733	}
734
735	snd_soc_dapm_mux_update_power(dapm, kcontrol,
736						item[0], e, NULL);
737
738	return change;
739}
740
741static const char * const adc_mux_text[] = {
742	"MIC2",
743	"LINE1",
744	"LINE2",
745	"DMIC",
746};
747
748static SOC_ENUM_SINGLE_DECL(
749	rt711_adc22_enum, SND_SOC_NOPM, 0, adc_mux_text);
750
751static SOC_ENUM_SINGLE_DECL(
752	rt711_adc23_enum, SND_SOC_NOPM, 0, adc_mux_text);
753
754static const struct snd_kcontrol_new rt711_adc22_mux =
755	SOC_DAPM_ENUM_EXT("ADC 22 Mux", rt711_adc22_enum,
756			rt711_mux_get, rt711_mux_put);
757
758static const struct snd_kcontrol_new rt711_adc23_mux =
759	SOC_DAPM_ENUM_EXT("ADC 23 Mux", rt711_adc23_enum,
760			rt711_mux_get, rt711_mux_put);
761
762static int rt711_dac_surround_event(struct snd_soc_dapm_widget *w,
763	struct snd_kcontrol *kcontrol, int event)
764{
765	struct snd_soc_component *component =
766		snd_soc_dapm_to_component(w->dapm);
767	struct rt711_priv *rt711 = snd_soc_component_get_drvdata(component);
768	unsigned int val_h = (1 << RT711_DIR_OUT_SFT) | (0x3 << 4);
769	unsigned int val_l;
770
771	switch (event) {
772	case SND_SOC_DAPM_POST_PMU:
773		regmap_write(rt711->regmap,
774			RT711_SET_STREAMID_DAC2, 0x10);
775
776		val_l = 0x00;
777		regmap_write(rt711->regmap,
778			RT711_SET_GAIN_HP_H, (val_h << 8 | val_l));
779		break;
780	case SND_SOC_DAPM_PRE_PMD:
781		val_l = (1 << RT711_MUTE_SFT);
782		regmap_write(rt711->regmap,
783			RT711_SET_GAIN_HP_H, (val_h << 8 | val_l));
784		usleep_range(50000, 55000);
785
786		regmap_write(rt711->regmap,
787			RT711_SET_STREAMID_DAC2, 0x00);
788		break;
789	}
790	return 0;
791}
792
793static int rt711_adc_09_event(struct snd_soc_dapm_widget *w,
794	struct snd_kcontrol *kcontrol, int event)
795{
796	struct snd_soc_component *component =
797		snd_soc_dapm_to_component(w->dapm);
798	struct rt711_priv *rt711 = snd_soc_component_get_drvdata(component);
799
800	switch (event) {
801	case SND_SOC_DAPM_POST_PMU:
802		regmap_write(rt711->regmap,
803			RT711_SET_STREAMID_ADC1, 0x10);
804		break;
805	case SND_SOC_DAPM_PRE_PMD:
806		regmap_write(rt711->regmap,
807			RT711_SET_STREAMID_ADC1, 0x00);
808		break;
809	}
810	return 0;
811}
812
813static int rt711_adc_08_event(struct snd_soc_dapm_widget *w,
814	struct snd_kcontrol *kcontrol, int event)
815{
816	struct snd_soc_component *component =
817		snd_soc_dapm_to_component(w->dapm);
818	struct rt711_priv *rt711 = snd_soc_component_get_drvdata(component);
819
820	switch (event) {
821	case SND_SOC_DAPM_POST_PMU:
822		regmap_write(rt711->regmap,
823			RT711_SET_STREAMID_ADC2, 0x10);
824		break;
825	case SND_SOC_DAPM_PRE_PMD:
826		regmap_write(rt711->regmap,
827			RT711_SET_STREAMID_ADC2, 0x00);
828		break;
829	}
830	return 0;
831}
832
833static const struct snd_soc_dapm_widget rt711_dapm_widgets[] = {
834	SND_SOC_DAPM_OUTPUT("HP"),
835	SND_SOC_DAPM_INPUT("MIC2"),
836	SND_SOC_DAPM_INPUT("DMIC1"),
837	SND_SOC_DAPM_INPUT("DMIC2"),
838	SND_SOC_DAPM_INPUT("LINE1"),
839	SND_SOC_DAPM_INPUT("LINE2"),
840
841	SND_SOC_DAPM_DAC_E("DAC Surround", NULL, SND_SOC_NOPM, 0, 0,
842		rt711_dac_surround_event,
843		SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
844	SND_SOC_DAPM_ADC_E("ADC 09", NULL, SND_SOC_NOPM, 0, 0,
845		rt711_adc_09_event,
846		SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
847	SND_SOC_DAPM_ADC_E("ADC 08", NULL, SND_SOC_NOPM, 0, 0,
848		rt711_adc_08_event,
849		SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
850	SND_SOC_DAPM_MUX("ADC 22 Mux", SND_SOC_NOPM, 0, 0,
851		&rt711_adc22_mux),
852	SND_SOC_DAPM_MUX("ADC 23 Mux", SND_SOC_NOPM, 0, 0,
853		&rt711_adc23_mux),
854
855	SND_SOC_DAPM_AIF_IN("DP3RX", "DP3 Playback", 0, SND_SOC_NOPM, 0, 0),
856	SND_SOC_DAPM_AIF_OUT("DP2TX", "DP2 Capture", 0, SND_SOC_NOPM, 0, 0),
857	SND_SOC_DAPM_AIF_OUT("DP4TX", "DP4 Capture", 0, SND_SOC_NOPM, 0, 0),
858};
859
860static const struct snd_soc_dapm_route rt711_audio_map[] = {
861	{"DAC Surround", NULL, "DP3RX"},
862	{"DP2TX", NULL, "ADC 09"},
863	{"DP4TX", NULL, "ADC 08"},
864
865	{"ADC 09", NULL, "ADC 22 Mux"},
866	{"ADC 08", NULL, "ADC 23 Mux"},
867	{"ADC 22 Mux", "DMIC", "DMIC1"},
868	{"ADC 22 Mux", "LINE1", "LINE1"},
869	{"ADC 22 Mux", "LINE2", "LINE2"},
870	{"ADC 22 Mux", "MIC2", "MIC2"},
871	{"ADC 23 Mux", "DMIC", "DMIC2"},
872	{"ADC 23 Mux", "LINE1", "LINE1"},
873	{"ADC 23 Mux", "LINE2", "LINE2"},
874	{"ADC 23 Mux", "MIC2", "MIC2"},
875
876	{"HP", NULL, "DAC Surround"},
877};
878
879static int rt711_set_bias_level(struct snd_soc_component *component,
880				enum snd_soc_bias_level level)
881{
882	struct snd_soc_dapm_context *dapm =
883		snd_soc_component_get_dapm(component);
884	struct rt711_priv *rt711 = snd_soc_component_get_drvdata(component);
885
886	switch (level) {
887	case SND_SOC_BIAS_PREPARE:
888		if (dapm->bias_level == SND_SOC_BIAS_STANDBY) {
889			regmap_write(rt711->regmap,
890				RT711_SET_AUDIO_POWER_STATE,
891				AC_PWRST_D0);
892		}
893		break;
894
895	case SND_SOC_BIAS_STANDBY:
896		mutex_lock(&rt711->calibrate_mutex);
897		regmap_write(rt711->regmap,
898			RT711_SET_AUDIO_POWER_STATE,
899			AC_PWRST_D3);
900		mutex_unlock(&rt711->calibrate_mutex);
901		break;
902
903	default:
904		break;
905	}
906
907	return 0;
908}
909
910static int rt711_parse_dt(struct rt711_priv *rt711, struct device *dev)
911{
912	device_property_read_u32(dev, "realtek,jd-src",
913		&rt711->jd_src);
914
915	return 0;
916}
917
918static int rt711_probe(struct snd_soc_component *component)
919{
920	struct rt711_priv *rt711 = snd_soc_component_get_drvdata(component);
921
922	rt711_parse_dt(rt711, &rt711->slave->dev);
923	rt711->component = component;
924
925	return 0;
926}
927
928static void rt711_remove(struct snd_soc_component *component)
929{
930	struct rt711_priv *rt711 = snd_soc_component_get_drvdata(component);
931
932	regcache_cache_only(rt711->regmap, true);
933}
934
935static const struct snd_soc_component_driver soc_codec_dev_rt711 = {
936	.probe = rt711_probe,
937	.set_bias_level = rt711_set_bias_level,
938	.controls = rt711_snd_controls,
939	.num_controls = ARRAY_SIZE(rt711_snd_controls),
940	.dapm_widgets = rt711_dapm_widgets,
941	.num_dapm_widgets = ARRAY_SIZE(rt711_dapm_widgets),
942	.dapm_routes = rt711_audio_map,
943	.num_dapm_routes = ARRAY_SIZE(rt711_audio_map),
944	.set_jack = rt711_set_jack_detect,
945	.remove = rt711_remove,
946};
947
948static int rt711_set_sdw_stream(struct snd_soc_dai *dai, void *sdw_stream,
949				int direction)
950{
951	struct sdw_stream_data *stream;
952
953	if (!sdw_stream)
954		return 0;
955
956	stream = kzalloc(sizeof(*stream), GFP_KERNEL);
957	if (!stream)
958		return -ENOMEM;
959
960	stream->sdw_stream = (struct sdw_stream_runtime *)sdw_stream;
961
962	/* Use tx_mask or rx_mask to configure stream tag and set dma_data */
963	if (direction == SNDRV_PCM_STREAM_PLAYBACK)
964		dai->playback_dma_data = stream;
965	else
966		dai->capture_dma_data = stream;
967
968	return 0;
969}
970
971static void rt711_shutdown(struct snd_pcm_substream *substream,
972				struct snd_soc_dai *dai)
973{
974	struct sdw_stream_data *stream;
975
976	stream = snd_soc_dai_get_dma_data(dai, substream);
977	snd_soc_dai_set_dma_data(dai, substream, NULL);
978	kfree(stream);
979}
980
981static int rt711_pcm_hw_params(struct snd_pcm_substream *substream,
982				struct snd_pcm_hw_params *params,
983				struct snd_soc_dai *dai)
984{
985	struct snd_soc_component *component = dai->component;
986	struct rt711_priv *rt711 = snd_soc_component_get_drvdata(component);
987	struct sdw_stream_config stream_config;
988	struct sdw_port_config port_config;
989	enum sdw_data_direction direction;
990	struct sdw_stream_data *stream;
991	int retval, port, num_channels;
992	unsigned int val = 0;
993
994	dev_dbg(dai->dev, "%s %s", __func__, dai->name);
995	stream = snd_soc_dai_get_dma_data(dai, substream);
996
997	if (!stream)
998		return -EINVAL;
999
1000	if (!rt711->slave)
1001		return -EINVAL;
1002
1003	/* SoundWire specific configuration */
1004	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
1005		direction = SDW_DATA_DIR_RX;
1006		port = 3;
1007	} else {
1008		direction = SDW_DATA_DIR_TX;
1009		if (dai->id == RT711_AIF1)
1010			port = 4;
1011		else if (dai->id == RT711_AIF2)
1012			port = 2;
1013		else
1014			return -EINVAL;
1015	}
1016
1017	stream_config.frame_rate = params_rate(params);
1018	stream_config.ch_count = params_channels(params);
1019	stream_config.bps = snd_pcm_format_width(params_format(params));
1020	stream_config.direction = direction;
1021
1022	num_channels = params_channels(params);
1023	port_config.ch_mask = (1 << (num_channels)) - 1;
1024	port_config.num = port;
1025
1026	retval = sdw_stream_add_slave(rt711->slave, &stream_config,
1027					&port_config, 1, stream->sdw_stream);
1028	if (retval) {
1029		dev_err(dai->dev, "Unable to configure port\n");
1030		return retval;
1031	}
1032
1033	if (params_channels(params) <= 16) {
1034		/* bit 3:0 Number of Channel */
1035		val |= (params_channels(params) - 1);
1036	} else {
1037		dev_err(component->dev, "Unsupported channels %d\n",
1038			params_channels(params));
1039		return -EINVAL;
1040	}
1041
1042	switch (params_width(params)) {
1043	/* bit 6:4 Bits per Sample */
1044	case 8:
1045		break;
1046	case 16:
1047		val |= (0x1 << 4);
1048		break;
1049	case 20:
1050		val |= (0x2 << 4);
1051		break;
1052	case 24:
1053		val |= (0x3 << 4);
1054		break;
1055	case 32:
1056		val |= (0x4 << 4);
1057		break;
1058	default:
1059		return -EINVAL;
1060	}
1061
1062	/* 48Khz */
1063	regmap_write(rt711->regmap, RT711_DAC_FORMAT_H, val);
1064	regmap_write(rt711->regmap, RT711_ADC1_FORMAT_H, val);
1065	regmap_write(rt711->regmap, RT711_ADC2_FORMAT_H, val);
1066
1067	return retval;
1068}
1069
1070static int rt711_pcm_hw_free(struct snd_pcm_substream *substream,
1071				struct snd_soc_dai *dai)
1072{
1073	struct snd_soc_component *component = dai->component;
1074	struct rt711_priv *rt711 = snd_soc_component_get_drvdata(component);
1075	struct sdw_stream_data *stream =
1076		snd_soc_dai_get_dma_data(dai, substream);
1077
1078	if (!rt711->slave)
1079		return -EINVAL;
1080
1081	sdw_stream_remove_slave(rt711->slave, stream->sdw_stream);
1082	return 0;
1083}
1084
1085#define RT711_STEREO_RATES (SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000)
1086#define RT711_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \
1087			SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S8)
1088
1089static struct snd_soc_dai_ops rt711_ops = {
1090	.hw_params	= rt711_pcm_hw_params,
1091	.hw_free	= rt711_pcm_hw_free,
1092	.set_stream	= rt711_set_sdw_stream,
1093	.shutdown	= rt711_shutdown,
1094};
1095
1096static struct snd_soc_dai_driver rt711_dai[] = {
1097	{
1098		.name = "rt711-aif1",
1099		.id = RT711_AIF1,
1100		.playback = {
1101			.stream_name = "DP3 Playback",
1102			.channels_min = 1,
1103			.channels_max = 2,
1104			.rates = RT711_STEREO_RATES,
1105			.formats = RT711_FORMATS,
1106		},
1107		.capture = {
1108			.stream_name = "DP4 Capture",
1109			.channels_min = 1,
1110			.channels_max = 2,
1111			.rates = RT711_STEREO_RATES,
1112			.formats = RT711_FORMATS,
1113		},
1114		.ops = &rt711_ops,
1115	},
1116	{
1117		.name = "rt711-aif2",
1118		.id = RT711_AIF2,
1119		.capture = {
1120			.stream_name = "DP2 Capture",
1121			.channels_min = 1,
1122			.channels_max = 2,
1123			.rates = RT711_STEREO_RATES,
1124			.formats = RT711_FORMATS,
1125		},
1126		.ops = &rt711_ops,
1127	}
1128};
1129
1130/* Bus clock frequency */
1131#define RT711_CLK_FREQ_9600000HZ 9600000
1132#define RT711_CLK_FREQ_12000000HZ 12000000
1133#define RT711_CLK_FREQ_6000000HZ 6000000
1134#define RT711_CLK_FREQ_4800000HZ 4800000
1135#define RT711_CLK_FREQ_2400000HZ 2400000
1136#define RT711_CLK_FREQ_12288000HZ 12288000
1137
1138int rt711_clock_config(struct device *dev)
1139{
1140	struct rt711_priv *rt711 = dev_get_drvdata(dev);
1141	unsigned int clk_freq, value;
1142
1143	clk_freq = (rt711->params.curr_dr_freq >> 1);
1144
1145	switch (clk_freq) {
1146	case RT711_CLK_FREQ_12000000HZ:
1147		value = 0x0;
1148		break;
1149	case RT711_CLK_FREQ_6000000HZ:
1150		value = 0x1;
1151		break;
1152	case RT711_CLK_FREQ_9600000HZ:
1153		value = 0x2;
1154		break;
1155	case RT711_CLK_FREQ_4800000HZ:
1156		value = 0x3;
1157		break;
1158	case RT711_CLK_FREQ_2400000HZ:
1159		value = 0x4;
1160		break;
1161	case RT711_CLK_FREQ_12288000HZ:
1162		value = 0x5;
1163		break;
1164	default:
1165		return -EINVAL;
1166	}
1167
1168	regmap_write(rt711->regmap, 0xe0, value);
1169	regmap_write(rt711->regmap, 0xf0, value);
1170
1171	dev_dbg(dev, "%s complete, clk_freq=%d\n", __func__, clk_freq);
1172
1173	return 0;
1174}
1175
1176static void rt711_calibration_work(struct work_struct *work)
1177{
1178	struct rt711_priv *rt711 =
1179		container_of(work, struct rt711_priv, calibration_work);
1180
1181	rt711_calibration(rt711);
1182}
1183
1184int rt711_init(struct device *dev, struct regmap *sdw_regmap,
1185			struct regmap *regmap, struct sdw_slave *slave)
1186{
1187	struct rt711_priv *rt711;
1188	int ret;
1189
1190	rt711 = devm_kzalloc(dev, sizeof(*rt711), GFP_KERNEL);
1191	if (!rt711)
1192		return -ENOMEM;
1193
1194	dev_set_drvdata(dev, rt711);
1195	rt711->slave = slave;
1196	rt711->sdw_regmap = sdw_regmap;
1197	rt711->regmap = regmap;
1198
1199	/*
1200	 * Mark hw_init to false
1201	 * HW init will be performed when device reports present
1202	 */
1203	rt711->hw_init = false;
1204	rt711->first_hw_init = false;
1205
1206	/* JD source uses JD2 in default */
1207	rt711->jd_src = RT711_JD2;
1208
1209	ret =  devm_snd_soc_register_component(dev,
1210				&soc_codec_dev_rt711,
1211				rt711_dai,
1212				ARRAY_SIZE(rt711_dai));
1213
1214	dev_dbg(&slave->dev, "%s\n", __func__);
1215
1216	return ret;
1217}
1218
1219int rt711_io_init(struct device *dev, struct sdw_slave *slave)
1220{
1221	struct rt711_priv *rt711 = dev_get_drvdata(dev);
1222
1223	if (rt711->hw_init)
1224		return 0;
1225
1226	if (rt711->first_hw_init) {
1227		regcache_cache_only(rt711->regmap, false);
1228		regcache_cache_bypass(rt711->regmap, true);
1229	}
1230
1231	/*
1232	 * PM runtime is only enabled when a Slave reports as Attached
1233	 */
1234	if (!rt711->first_hw_init) {
1235		/* set autosuspend parameters */
1236		pm_runtime_set_autosuspend_delay(&slave->dev, 3000);
1237		pm_runtime_use_autosuspend(&slave->dev);
1238
1239		/* update count of parent 'active' children */
1240		pm_runtime_set_active(&slave->dev);
1241
1242		/* make sure the device does not suspend immediately */
1243		pm_runtime_mark_last_busy(&slave->dev);
1244
1245		pm_runtime_enable(&slave->dev);
1246	}
1247
1248	pm_runtime_get_noresume(&slave->dev);
1249
1250	rt711_reset(rt711->regmap);
1251
1252	/* power on */
1253	regmap_write(rt711->regmap, RT711_SET_AUDIO_POWER_STATE, AC_PWRST_D0);
1254
1255	/* Set Pin Widget */
1256	regmap_write(rt711->regmap, RT711_SET_PIN_MIC2, 0x25);
1257	regmap_write(rt711->regmap, RT711_SET_PIN_HP, 0xc0);
1258	regmap_write(rt711->regmap, RT711_SET_PIN_DMIC1, 0x20);
1259	regmap_write(rt711->regmap, RT711_SET_PIN_DMIC2, 0x20);
1260	regmap_write(rt711->regmap, RT711_SET_PIN_LINE1, 0x20);
1261	regmap_write(rt711->regmap, RT711_SET_PIN_LINE2, 0x20);
1262
1263	/* Mute HP/ADC1/ADC2 */
1264	regmap_write(rt711->regmap, RT711_SET_GAIN_HP_H, 0xa080);
1265	regmap_write(rt711->regmap, RT711_SET_GAIN_HP_H, 0x9080);
1266	regmap_write(rt711->regmap, RT711_SET_GAIN_ADC2_H, 0x6080);
1267	regmap_write(rt711->regmap, RT711_SET_GAIN_ADC2_H, 0x5080);
1268	regmap_write(rt711->regmap, RT711_SET_GAIN_ADC1_H, 0x6080);
1269	regmap_write(rt711->regmap, RT711_SET_GAIN_ADC1_H, 0x5080);
1270
1271	/* Set Configuration Default */
1272	regmap_write(rt711->regmap, 0x4f12, 0x91);
1273	regmap_write(rt711->regmap, 0x4e12, 0xd6);
1274	regmap_write(rt711->regmap, 0x4d12, 0x11);
1275	regmap_write(rt711->regmap, 0x4c12, 0x20);
1276	regmap_write(rt711->regmap, 0x4f13, 0x91);
1277	regmap_write(rt711->regmap, 0x4e13, 0xd6);
1278	regmap_write(rt711->regmap, 0x4d13, 0x11);
1279	regmap_write(rt711->regmap, 0x4c13, 0x21);
1280	regmap_write(rt711->regmap, 0x4c21, 0xf0);
1281	regmap_write(rt711->regmap, 0x4d21, 0x11);
1282	regmap_write(rt711->regmap, 0x4e21, 0x11);
1283	regmap_write(rt711->regmap, 0x4f21, 0x01);
1284
1285	/* Data port arrangement */
1286	rt711_index_write(rt711->regmap, RT711_VENDOR_REG,
1287		RT711_TX_RX_MUX_CTL, 0x0154);
1288
1289	/* Set index */
1290	rt711_index_write(rt711->regmap, RT711_VENDOR_REG,
1291		RT711_DIGITAL_MISC_CTRL4, 0x201b);
1292	rt711_index_write(rt711->regmap, RT711_VENDOR_REG,
1293		RT711_COMBO_JACK_AUTO_CTL1, 0x5089);
1294	rt711_index_write(rt711->regmap, RT711_VENDOR_REG,
1295		RT711_VREFOUT_CTL, 0x5064);
1296	rt711_index_write(rt711->regmap, RT711_VENDOR_REG,
1297		RT711_INLINE_CMD_CTL, 0xd249);
1298
1299	/* Finish Initial Settings, set power to D3 */
1300	regmap_write(rt711->regmap, RT711_SET_AUDIO_POWER_STATE, AC_PWRST_D3);
1301
1302	if (rt711->first_hw_init)
1303		rt711_calibration(rt711);
1304	else {
1305		INIT_DELAYED_WORK(&rt711->jack_detect_work,
1306			rt711_jack_detect_handler);
1307		INIT_DELAYED_WORK(&rt711->jack_btn_check_work,
1308			rt711_btn_check_handler);
1309		mutex_init(&rt711->calibrate_mutex);
1310		INIT_WORK(&rt711->calibration_work, rt711_calibration_work);
1311		schedule_work(&rt711->calibration_work);
1312	}
1313
1314	/*
1315	 * if set_jack callback occurred early than io_init,
1316	 * we set up the jack detection function now
1317	 */
1318	if (rt711->hs_jack)
1319		rt711_jack_init(rt711);
1320
1321	if (rt711->first_hw_init) {
1322		regcache_cache_bypass(rt711->regmap, false);
1323		regcache_mark_dirty(rt711->regmap);
1324	} else
1325		rt711->first_hw_init = true;
1326
1327	/* Mark Slave initialization complete */
1328	rt711->hw_init = true;
1329
1330	pm_runtime_mark_last_busy(&slave->dev);
1331	pm_runtime_put_autosuspend(&slave->dev);
1332
1333	dev_dbg(&slave->dev, "%s hw_init complete\n", __func__);
1334	return 0;
1335}
1336
1337MODULE_DESCRIPTION("ASoC RT711 SDW driver");
1338MODULE_AUTHOR("Shuming Fan <shumingf@realtek.com>");
1339MODULE_LICENSE("GPL");
1340