1 // SPDX-License-Identifier: GPL-2.0
3 // rt711.c -- rt711 ALSA SoC audio driver
5 // Copyright(c) 2019 Realtek Semiconductor Corp.
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>
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/sdw.h>
23 #include <sound/soc.h>
24 #include <sound/soc-dapm.h>
25 #include <sound/initval.h>
26 #include <sound/tlv.h>
27 #include <sound/hda_verbs.h>
28 #include <sound/jack.h>
32 static int rt711_index_write(struct regmap
*regmap
,
33 unsigned int nid
, unsigned int reg
, unsigned int value
)
36 unsigned int addr
= ((RT711_PRIV_INDEX_W_H
| nid
) << 8) | reg
;
38 ret
= regmap_write(regmap
, addr
, value
);
40 pr_err("%s: Failed to set private value: %06x <= %04x ret=%d\n",
41 __func__
, addr
, value
, ret
);
46 static int rt711_index_read(struct regmap
*regmap
,
47 unsigned int nid
, unsigned int reg
, unsigned int *value
)
50 unsigned int addr
= ((RT711_PRIV_INDEX_W_H
| nid
) << 8) | reg
;
53 ret
= regmap_read(regmap
, addr
, value
);
55 pr_err("%s: Failed to get private value: %06x => %04x ret=%d\n",
56 __func__
, addr
, *value
, ret
);
61 static int rt711_index_update_bits(struct regmap
*regmap
, unsigned int nid
,
62 unsigned int reg
, unsigned int mask
, unsigned int val
)
64 unsigned int tmp
, orig
;
67 ret
= rt711_index_read(regmap
, nid
, reg
, &orig
);
74 return rt711_index_write(regmap
, nid
, reg
, tmp
);
77 static void rt711_reset(struct regmap
*regmap
)
79 regmap_write(regmap
, RT711_FUNC_RESET
, 0);
80 rt711_index_update_bits(regmap
, RT711_VENDOR_REG
,
81 RT711_PARA_VERB_CTL
, RT711_HIDDEN_REG_SW_RESET
,
82 RT711_HIDDEN_REG_SW_RESET
);
85 static int rt711_calibration(struct rt711_priv
*rt711
)
87 unsigned int val
, loop
= 0;
89 struct regmap
*regmap
= rt711
->regmap
;
92 mutex_lock(&rt711
->calibrate_mutex
);
93 regmap_write(rt711
->regmap
,
94 RT711_SET_AUDIO_POWER_STATE
, AC_PWRST_D0
);
96 dev
= regmap_get_device(regmap
);
98 /* Calibration manual mode */
99 rt711_index_update_bits(regmap
, RT711_VENDOR_REG
, RT711_FSM_CTL
,
103 rt711_index_update_bits(regmap
, RT711_VENDOR_CALI
,
104 RT711_DAC_DC_CALI_CTL1
, RT711_DAC_DC_CALI_TRIGGER
,
105 RT711_DAC_DC_CALI_TRIGGER
);
107 /* wait for calibration process */
108 rt711_index_read(regmap
, RT711_VENDOR_CALI
,
109 RT711_DAC_DC_CALI_CTL1
, &val
);
111 while (val
& RT711_DAC_DC_CALI_TRIGGER
) {
113 pr_err("%s, calibration time-out!\n",
120 usleep_range(10000, 11000);
121 rt711_index_read(regmap
, RT711_VENDOR_CALI
,
122 RT711_DAC_DC_CALI_CTL1
, &val
);
126 rt711_index_update_bits(regmap
, RT711_VENDOR_REG
,
127 RT711_FSM_CTL
, 0xf, RT711_DEPOP_CTL
);
129 regmap_write(rt711
->regmap
,
130 RT711_SET_AUDIO_POWER_STATE
, AC_PWRST_D3
);
131 mutex_unlock(&rt711
->calibrate_mutex
);
133 dev_dbg(dev
, "%s calibration complete, ret=%d\n", __func__
, ret
);
137 static unsigned int rt711_button_detect(struct rt711_priv
*rt711
)
139 unsigned int btn_type
= 0, val80
, val81
;
142 ret
= rt711_index_read(rt711
->regmap
, RT711_VENDOR_REG
,
143 RT711_IRQ_FLAG_TABLE1
, &val80
);
146 ret
= rt711_index_read(rt711
->regmap
, RT711_VENDOR_REG
,
147 RT711_IRQ_FLAG_TABLE2
, &val81
);
158 btn_type
|= SND_JACK_BTN_0
;
161 btn_type
|= SND_JACK_BTN_3
;
168 btn_type
|= SND_JACK_BTN_1
;
173 btn_type
|= SND_JACK_BTN_2
;
177 btn_type
|= SND_JACK_BTN_3
;
184 static int rt711_headset_detect(struct rt711_priv
*rt711
)
186 unsigned int buf
, loop
= 0;
188 unsigned int jack_status
= 0, reg
;
190 ret
= rt711_index_read(rt711
->regmap
, RT711_VENDOR_REG
,
191 RT711_COMBO_JACK_AUTO_CTL2
, &buf
);
196 (buf
& RT711_COMBOJACK_AUTO_DET_STATUS
) == 0) {
199 usleep_range(9000, 10000);
200 ret
= rt711_index_read(rt711
->regmap
, RT711_VENDOR_REG
,
201 RT711_COMBO_JACK_AUTO_CTL2
, &buf
);
205 reg
= RT711_VERB_GET_PIN_SENSE
| RT711_HP_OUT
;
206 ret
= regmap_read(rt711
->regmap
, reg
, &jack_status
);
209 if ((jack_status
& (1 << 31)) == 0)
216 if (buf
& RT711_COMBOJACK_AUTO_DET_TRS
)
217 rt711
->jack_type
= SND_JACK_HEADPHONE
;
218 else if ((buf
& RT711_COMBOJACK_AUTO_DET_CTIA
) ||
219 (buf
& RT711_COMBOJACK_AUTO_DET_OMTP
))
220 rt711
->jack_type
= SND_JACK_HEADSET
;
226 pr_err_ratelimited("Time-out error in %s\n", __func__
);
229 pr_err_ratelimited("IO error in %s, ret %d\n", __func__
, ret
);
232 pr_err_ratelimited("Jack removal in %s\n", __func__
);
236 static void rt711_jack_detect_handler(struct work_struct
*work
)
238 struct rt711_priv
*rt711
=
239 container_of(work
, struct rt711_priv
, jack_detect_work
.work
);
240 int btn_type
= 0, ret
;
241 unsigned int jack_status
= 0, reg
;
246 if (!snd_soc_card_is_instantiated(rt711
->component
->card
))
249 if (pm_runtime_status_suspended(rt711
->slave
->dev
.parent
)) {
250 dev_dbg(&rt711
->slave
->dev
,
251 "%s: parent device is pm_runtime_status_suspended, skipping jack detection\n",
256 reg
= RT711_VERB_GET_PIN_SENSE
| RT711_HP_OUT
;
257 ret
= regmap_read(rt711
->regmap
, reg
, &jack_status
);
262 if (jack_status
& (1 << 31)) {
264 if (rt711
->jack_type
== 0) {
265 ret
= rt711_headset_detect(rt711
);
268 if (rt711
->jack_type
== SND_JACK_HEADSET
)
269 btn_type
= rt711_button_detect(rt711
);
270 } else if (rt711
->jack_type
== SND_JACK_HEADSET
) {
271 /* jack is already in, report button event */
272 btn_type
= rt711_button_detect(rt711
);
276 rt711
->jack_type
= 0;
279 dev_dbg(&rt711
->slave
->dev
,
280 "in %s, jack_type=0x%x\n", __func__
, rt711
->jack_type
);
281 dev_dbg(&rt711
->slave
->dev
,
282 "in %s, btn_type=0x%x\n", __func__
, btn_type
);
284 snd_soc_jack_report(rt711
->hs_jack
, rt711
->jack_type
| btn_type
,
286 SND_JACK_BTN_0
| SND_JACK_BTN_1
|
287 SND_JACK_BTN_2
| SND_JACK_BTN_3
);
290 /* button released */
291 snd_soc_jack_report(rt711
->hs_jack
, rt711
->jack_type
,
293 SND_JACK_BTN_0
| SND_JACK_BTN_1
|
294 SND_JACK_BTN_2
| SND_JACK_BTN_3
);
296 mod_delayed_work(system_power_efficient_wq
,
297 &rt711
->jack_btn_check_work
, msecs_to_jiffies(200));
303 pr_err_ratelimited("IO error in %s, ret %d\n", __func__
, ret
);
306 static void rt711_btn_check_handler(struct work_struct
*work
)
308 struct rt711_priv
*rt711
= container_of(work
, struct rt711_priv
,
309 jack_btn_check_work
.work
);
310 int btn_type
= 0, ret
;
311 unsigned int jack_status
= 0, reg
;
313 reg
= RT711_VERB_GET_PIN_SENSE
| RT711_HP_OUT
;
314 ret
= regmap_read(rt711
->regmap
, reg
, &jack_status
);
319 if (jack_status
& (1 << 31)) {
320 if (rt711
->jack_type
== SND_JACK_HEADSET
) {
321 /* jack is already in, report button event */
322 btn_type
= rt711_button_detect(rt711
);
325 rt711
->jack_type
= 0;
329 ret
= rt711_index_read(rt711
->regmap
, RT711_VENDOR_REG
,
330 RT711_COMBO_JACK_AUTO_CTL2
, ®
);
334 if ((reg
& 0xf0) == 0xf0)
337 dev_dbg(&rt711
->slave
->dev
,
338 "%s, btn_type=0x%x\n", __func__
, btn_type
);
339 snd_soc_jack_report(rt711
->hs_jack
, rt711
->jack_type
| btn_type
,
341 SND_JACK_BTN_0
| SND_JACK_BTN_1
|
342 SND_JACK_BTN_2
| SND_JACK_BTN_3
);
345 /* button released */
346 snd_soc_jack_report(rt711
->hs_jack
, rt711
->jack_type
,
348 SND_JACK_BTN_0
| SND_JACK_BTN_1
|
349 SND_JACK_BTN_2
| SND_JACK_BTN_3
);
351 mod_delayed_work(system_power_efficient_wq
,
352 &rt711
->jack_btn_check_work
, msecs_to_jiffies(200));
358 pr_err_ratelimited("IO error in %s, ret %d\n", __func__
, ret
);
361 static void rt711_jack_init(struct rt711_priv
*rt711
)
363 struct snd_soc_dapm_context
*dapm
=
364 snd_soc_component_get_dapm(rt711
->component
);
366 mutex_lock(&rt711
->calibrate_mutex
);
368 if (dapm
->bias_level
<= SND_SOC_BIAS_STANDBY
)
369 regmap_write(rt711
->regmap
,
370 RT711_SET_AUDIO_POWER_STATE
, AC_PWRST_D0
);
372 if (rt711
->hs_jack
) {
373 /* unsolicited response & IRQ control */
374 regmap_write(rt711
->regmap
,
375 RT711_SET_MIC2_UNSOLICITED_ENABLE
, 0x82);
376 regmap_write(rt711
->regmap
,
377 RT711_SET_HP_UNSOLICITED_ENABLE
, 0x81);
378 regmap_write(rt711
->regmap
,
379 RT711_SET_INLINE_UNSOLICITED_ENABLE
, 0x83);
380 rt711_index_write(rt711
->regmap
, RT711_VENDOR_REG
,
382 rt711_index_write(rt711
->regmap
, RT711_VENDOR_REG
,
385 switch (rt711
->jd_src
) {
387 /* default settings was already for JD1 */
390 rt711_index_update_bits(rt711
->regmap
, RT711_VENDOR_REG
,
391 RT711_JD_CTL2
, RT711_JD2_2PORT_200K_DECODE_HP
|
393 RT711_JD2_2PORT_200K_DECODE_HP
|
394 RT711_HP_JD_SEL_JD2
);
395 rt711_index_update_bits(rt711
->regmap
, RT711_VENDOR_REG
,
397 RT711_HP_JD_FINAL_RESULT_CTL_JD12
,
398 RT711_HP_JD_FINAL_RESULT_CTL_JD12
);
401 rt711_index_update_bits(rt711
->regmap
, RT711_VENDOR_REG
,
402 RT711_JD_CTL2
, RT711_JD2_2PORT_100K_DECODE
| RT711_JD2_1PORT_TYPE_DECODE
|
403 RT711_HP_JD_SEL_JD2
| RT711_JD1_2PORT_TYPE_100K_DECODE
,
404 RT711_JD2_2PORT_100K_DECODE_HP
| RT711_JD2_1PORT_JD_HP
|
405 RT711_HP_JD_SEL_JD2
| RT711_JD1_2PORT_JD_RESERVED
);
406 rt711_index_update_bits(rt711
->regmap
, RT711_VENDOR_REG
,
408 RT711_HP_JD_FINAL_RESULT_CTL_JD12
,
409 RT711_HP_JD_FINAL_RESULT_CTL_JD12
);
411 case RT711_JD2_1P8V_1PORT
:
412 rt711_index_update_bits(rt711
->regmap
, RT711_VENDOR_REG
,
413 RT711_JD_CTL1
, RT711_JD2_DIGITAL_JD_MODE_SEL
,
414 RT711_JD2_1_JD_MODE
);
415 rt711_index_update_bits(rt711
->regmap
, RT711_VENDOR_REG
,
416 RT711_JD_CTL2
, RT711_JD2_1PORT_TYPE_DECODE
|
418 RT711_JD2_1PORT_JD_HP
|
419 RT711_HP_JD_SEL_JD2
);
420 rt711_index_update_bits(rt711
->regmap
, RT711_VENDOR_REG
,
421 RT711_JD_CTL4
, RT711_JD2_PAD_PULL_UP_MASK
|
422 RT711_JD2_MODE_SEL_MASK
,
423 RT711_JD2_PAD_PULL_UP
|
424 RT711_JD2_MODE2_1P8V_1PORT
);
425 rt711_index_update_bits(rt711
->regmap
, RT711_VENDOR_REG
,
427 RT711_HP_JD_FINAL_RESULT_CTL_JD12
,
428 RT711_HP_JD_FINAL_RESULT_CTL_JD12
);
431 dev_warn(rt711
->component
->dev
, "%s: Wrong JD source\n", __func__
);
435 dev_dbg(&rt711
->slave
->dev
, "in %s enable\n", __func__
);
437 mod_delayed_work(system_power_efficient_wq
,
438 &rt711
->jack_detect_work
, msecs_to_jiffies(250));
440 regmap_write(rt711
->regmap
,
441 RT711_SET_MIC2_UNSOLICITED_ENABLE
, 0x00);
442 regmap_write(rt711
->regmap
,
443 RT711_SET_HP_UNSOLICITED_ENABLE
, 0x00);
444 regmap_write(rt711
->regmap
,
445 RT711_SET_INLINE_UNSOLICITED_ENABLE
, 0x00);
447 dev_dbg(&rt711
->slave
->dev
, "in %s disable\n", __func__
);
451 if (dapm
->bias_level
<= SND_SOC_BIAS_STANDBY
)
452 regmap_write(rt711
->regmap
,
453 RT711_SET_AUDIO_POWER_STATE
, AC_PWRST_D3
);
454 mutex_unlock(&rt711
->calibrate_mutex
);
457 static int rt711_set_jack_detect(struct snd_soc_component
*component
,
458 struct snd_soc_jack
*hs_jack
, void *data
)
460 struct rt711_priv
*rt711
= snd_soc_component_get_drvdata(component
);
463 rt711
->hs_jack
= hs_jack
;
465 /* we can only resume if the device was initialized at least once */
466 if (!rt711
->first_hw_init
)
469 ret
= pm_runtime_resume_and_get(component
->dev
);
471 if (ret
!= -EACCES
) {
472 dev_err(component
->dev
, "%s: failed to resume %d\n", __func__
, ret
);
476 /* pm_runtime not enabled yet */
477 dev_dbg(component
->dev
, "%s: skipping jack init for now\n", __func__
);
481 rt711_jack_init(rt711
);
483 pm_runtime_mark_last_busy(component
->dev
);
484 pm_runtime_put_autosuspend(component
->dev
);
489 static void rt711_get_gain(struct rt711_priv
*rt711
, unsigned int addr_h
,
490 unsigned int addr_l
, unsigned int val_h
,
491 unsigned int *r_val
, unsigned int *l_val
)
494 *r_val
= (val_h
<< 8);
495 regmap_read(rt711
->regmap
, addr_l
, r_val
);
499 *l_val
= (val_h
<< 8);
500 regmap_read(rt711
->regmap
, addr_h
, l_val
);
503 /* For Verb-Set Amplifier Gain (Verb ID = 3h) */
504 static int rt711_set_amp_gain_put(struct snd_kcontrol
*kcontrol
,
505 struct snd_ctl_elem_value
*ucontrol
)
507 struct snd_soc_component
*component
= snd_kcontrol_chip(kcontrol
);
508 struct snd_soc_dapm_context
*dapm
=
509 snd_soc_component_get_dapm(component
);
510 struct soc_mixer_control
*mc
=
511 (struct soc_mixer_control
*)kcontrol
->private_value
;
512 struct rt711_priv
*rt711
= snd_soc_component_get_drvdata(component
);
513 unsigned int addr_h
, addr_l
, val_h
, val_ll
, val_lr
;
514 unsigned int read_ll
, read_rl
;
517 mutex_lock(&rt711
->calibrate_mutex
);
519 /* Can't use update bit function, so read the original value first */
522 if (mc
->shift
== RT711_DIR_OUT_SFT
) /* output */
527 rt711_get_gain(rt711
, addr_h
, addr_l
, val_h
, &read_rl
, &read_ll
);
531 /* for mute/unmute */
532 val_ll
= (mc
->max
- ucontrol
->value
.integer
.value
[0])
535 read_ll
= read_ll
& 0x7f;
539 val_ll
= ((ucontrol
->value
.integer
.value
[0]) & 0x7f);
540 if (val_ll
> mc
->max
)
542 /* keep mute status */
543 read_ll
= read_ll
& (1 << RT711_MUTE_SFT
);
547 if (dapm
->bias_level
<= SND_SOC_BIAS_STANDBY
)
548 regmap_write(rt711
->regmap
,
549 RT711_SET_AUDIO_POWER_STATE
, AC_PWRST_D0
);
553 /* for mute/unmute */
554 val_lr
= (mc
->max
- ucontrol
->value
.integer
.value
[1])
557 read_rl
= read_rl
& 0x7f;
561 val_lr
= ((ucontrol
->value
.integer
.value
[1]) & 0x7f);
562 if (val_lr
> mc
->max
)
564 /* keep mute status */
565 read_rl
= read_rl
& (1 << RT711_MUTE_SFT
);
569 for (i
= 0; i
< 3; i
++) { /* retry 3 times at most */
571 if (val_ll
== val_lr
) {
572 /* Set both L/R channels at the same time */
573 val_h
= (1 << mc
->shift
) | (3 << 4);
574 regmap_write(rt711
->regmap
,
575 addr_h
, (val_h
<< 8 | val_ll
));
576 regmap_write(rt711
->regmap
,
577 addr_l
, (val_h
<< 8 | val_ll
));
580 val_h
= (1 << mc
->shift
) | (1 << 5);
581 regmap_write(rt711
->regmap
,
582 addr_h
, (val_h
<< 8 | val_ll
));
585 val_h
= (1 << mc
->shift
) | (1 << 4);
586 regmap_write(rt711
->regmap
,
587 addr_l
, (val_h
<< 8 | val_lr
));
590 if (mc
->shift
== RT711_DIR_OUT_SFT
) /* output */
595 rt711_get_gain(rt711
, addr_h
, addr_l
, val_h
,
597 if (read_rl
== val_lr
&& read_ll
== val_ll
)
601 if (dapm
->bias_level
<= SND_SOC_BIAS_STANDBY
)
602 regmap_write(rt711
->regmap
,
603 RT711_SET_AUDIO_POWER_STATE
, AC_PWRST_D3
);
605 mutex_unlock(&rt711
->calibrate_mutex
);
609 static int rt711_set_amp_gain_get(struct snd_kcontrol
*kcontrol
,
610 struct snd_ctl_elem_value
*ucontrol
)
612 struct snd_soc_component
*component
= snd_kcontrol_chip(kcontrol
);
613 struct rt711_priv
*rt711
= snd_soc_component_get_drvdata(component
);
614 struct soc_mixer_control
*mc
=
615 (struct soc_mixer_control
*)kcontrol
->private_value
;
616 unsigned int addr_h
, addr_l
, val_h
;
617 unsigned int read_ll
, read_rl
;
619 /* switch to get command */
622 if (mc
->shift
== RT711_DIR_OUT_SFT
) /* output */
627 rt711_get_gain(rt711
, addr_h
, addr_l
, val_h
, &read_rl
, &read_ll
);
630 /* mute/unmute for switch controls */
631 read_ll
= !((read_ll
& 0x80) >> RT711_MUTE_SFT
);
632 read_rl
= !((read_rl
& 0x80) >> RT711_MUTE_SFT
);
634 /* for gain volume controls */
635 read_ll
= read_ll
& 0x7f;
636 read_rl
= read_rl
& 0x7f;
638 ucontrol
->value
.integer
.value
[0] = read_ll
;
639 ucontrol
->value
.integer
.value
[1] = read_rl
;
644 static const DECLARE_TLV_DB_SCALE(out_vol_tlv
, -6525, 75, 0);
645 static const DECLARE_TLV_DB_SCALE(in_vol_tlv
, -1725, 75, 0);
646 static const DECLARE_TLV_DB_SCALE(mic_vol_tlv
, 0, 1000, 0);
648 static const struct snd_kcontrol_new rt711_snd_controls
[] = {
649 SOC_DOUBLE_R_EXT_TLV("DAC Surr Playback Volume",
650 RT711_SET_GAIN_DAC2_H
, RT711_SET_GAIN_DAC2_L
,
651 RT711_DIR_OUT_SFT
, 0x57, 0,
652 rt711_set_amp_gain_get
, rt711_set_amp_gain_put
, out_vol_tlv
),
653 SOC_DOUBLE_R_EXT("ADC 08 Capture Switch",
654 RT711_SET_GAIN_ADC2_H
, RT711_SET_GAIN_ADC2_L
,
655 RT711_DIR_IN_SFT
, 1, 1,
656 rt711_set_amp_gain_get
, rt711_set_amp_gain_put
),
657 SOC_DOUBLE_R_EXT("ADC 09 Capture Switch",
658 RT711_SET_GAIN_ADC1_H
, RT711_SET_GAIN_ADC1_L
,
659 RT711_DIR_IN_SFT
, 1, 1,
660 rt711_set_amp_gain_get
, rt711_set_amp_gain_put
),
661 SOC_DOUBLE_R_EXT_TLV("ADC 08 Capture Volume",
662 RT711_SET_GAIN_ADC2_H
, RT711_SET_GAIN_ADC2_L
,
663 RT711_DIR_IN_SFT
, 0x3f, 0,
664 rt711_set_amp_gain_get
, rt711_set_amp_gain_put
, in_vol_tlv
),
665 SOC_DOUBLE_R_EXT_TLV("ADC 09 Capture Volume",
666 RT711_SET_GAIN_ADC1_H
, RT711_SET_GAIN_ADC1_L
,
667 RT711_DIR_IN_SFT
, 0x3f, 0,
668 rt711_set_amp_gain_get
, rt711_set_amp_gain_put
, in_vol_tlv
),
669 SOC_DOUBLE_R_EXT_TLV("AMIC Volume",
670 RT711_SET_GAIN_AMIC_H
, RT711_SET_GAIN_AMIC_L
,
671 RT711_DIR_IN_SFT
, 3, 0,
672 rt711_set_amp_gain_get
, rt711_set_amp_gain_put
, mic_vol_tlv
),
673 SOC_DOUBLE_R_EXT_TLV("DMIC1 Volume",
674 RT711_SET_GAIN_DMIC1_H
, RT711_SET_GAIN_DMIC1_L
,
675 RT711_DIR_IN_SFT
, 3, 0,
676 rt711_set_amp_gain_get
, rt711_set_amp_gain_put
, mic_vol_tlv
),
677 SOC_DOUBLE_R_EXT_TLV("DMIC2 Volume",
678 RT711_SET_GAIN_DMIC2_H
, RT711_SET_GAIN_DMIC2_L
,
679 RT711_DIR_IN_SFT
, 3, 0,
680 rt711_set_amp_gain_get
, rt711_set_amp_gain_put
, mic_vol_tlv
),
683 static int rt711_mux_get(struct snd_kcontrol
*kcontrol
,
684 struct snd_ctl_elem_value
*ucontrol
)
686 struct snd_soc_component
*component
=
687 snd_soc_dapm_kcontrol_component(kcontrol
);
688 struct rt711_priv
*rt711
= snd_soc_component_get_drvdata(component
);
689 unsigned int reg
, val
= 0, nid
;
692 if (strstr(ucontrol
->id
.name
, "ADC 22 Mux"))
693 nid
= RT711_MIXER_IN1
;
694 else if (strstr(ucontrol
->id
.name
, "ADC 23 Mux"))
695 nid
= RT711_MIXER_IN2
;
700 reg
= RT711_VERB_SET_CONNECT_SEL
| nid
;
701 ret
= regmap_read(rt711
->regmap
, reg
, &val
);
703 dev_err(component
->dev
, "%s: sdw read failed: %d\n",
708 ucontrol
->value
.enumerated
.item
[0] = val
;
713 static int rt711_mux_put(struct snd_kcontrol
*kcontrol
,
714 struct snd_ctl_elem_value
*ucontrol
)
716 struct snd_soc_component
*component
=
717 snd_soc_dapm_kcontrol_component(kcontrol
);
718 struct snd_soc_dapm_context
*dapm
=
719 snd_soc_dapm_kcontrol_dapm(kcontrol
);
720 struct rt711_priv
*rt711
= snd_soc_component_get_drvdata(component
);
721 struct soc_enum
*e
= (struct soc_enum
*)kcontrol
->private_value
;
722 unsigned int *item
= ucontrol
->value
.enumerated
.item
;
723 unsigned int val
, val2
= 0, change
, reg
, nid
;
726 if (item
[0] >= e
->items
)
729 if (strstr(ucontrol
->id
.name
, "ADC 22 Mux"))
730 nid
= RT711_MIXER_IN1
;
731 else if (strstr(ucontrol
->id
.name
, "ADC 23 Mux"))
732 nid
= RT711_MIXER_IN2
;
736 /* Verb ID = 0x701h */
737 val
= snd_soc_enum_item_to_val(e
, item
[0]) << e
->shift_l
;
739 reg
= RT711_VERB_SET_CONNECT_SEL
| nid
;
740 ret
= regmap_read(rt711
->regmap
, reg
, &val2
);
742 dev_err(component
->dev
, "%s: sdw read failed: %d\n",
753 reg
= RT711_VERB_SET_CONNECT_SEL
| nid
;
754 regmap_write(rt711
->regmap
, reg
, val
);
757 snd_soc_dapm_mux_update_power(dapm
, kcontrol
,
763 static const char * const adc_mux_text
[] = {
770 static SOC_ENUM_SINGLE_DECL(
771 rt711_adc22_enum
, SND_SOC_NOPM
, 0, adc_mux_text
);
773 static SOC_ENUM_SINGLE_DECL(
774 rt711_adc23_enum
, SND_SOC_NOPM
, 0, adc_mux_text
);
776 static const struct snd_kcontrol_new rt711_adc22_mux
=
777 SOC_DAPM_ENUM_EXT("ADC 22 Mux", rt711_adc22_enum
,
778 rt711_mux_get
, rt711_mux_put
);
780 static const struct snd_kcontrol_new rt711_adc23_mux
=
781 SOC_DAPM_ENUM_EXT("ADC 23 Mux", rt711_adc23_enum
,
782 rt711_mux_get
, rt711_mux_put
);
784 static int rt711_dac_surround_event(struct snd_soc_dapm_widget
*w
,
785 struct snd_kcontrol
*kcontrol
, int event
)
787 struct snd_soc_component
*component
=
788 snd_soc_dapm_to_component(w
->dapm
);
789 struct rt711_priv
*rt711
= snd_soc_component_get_drvdata(component
);
790 unsigned int val_h
= (1 << RT711_DIR_OUT_SFT
) | (0x3 << 4);
794 case SND_SOC_DAPM_POST_PMU
:
795 regmap_write(rt711
->regmap
,
796 RT711_SET_STREAMID_DAC2
, 0x10);
799 regmap_write(rt711
->regmap
,
800 RT711_SET_GAIN_HP_H
, (val_h
<< 8 | val_l
));
802 case SND_SOC_DAPM_PRE_PMD
:
803 val_l
= (1 << RT711_MUTE_SFT
);
804 regmap_write(rt711
->regmap
,
805 RT711_SET_GAIN_HP_H
, (val_h
<< 8 | val_l
));
806 usleep_range(50000, 55000);
808 regmap_write(rt711
->regmap
,
809 RT711_SET_STREAMID_DAC2
, 0x00);
815 static int rt711_adc_09_event(struct snd_soc_dapm_widget
*w
,
816 struct snd_kcontrol
*kcontrol
, int event
)
818 struct snd_soc_component
*component
=
819 snd_soc_dapm_to_component(w
->dapm
);
820 struct rt711_priv
*rt711
= snd_soc_component_get_drvdata(component
);
823 case SND_SOC_DAPM_POST_PMU
:
824 regmap_write(rt711
->regmap
,
825 RT711_SET_STREAMID_ADC1
, 0x10);
827 case SND_SOC_DAPM_PRE_PMD
:
828 regmap_write(rt711
->regmap
,
829 RT711_SET_STREAMID_ADC1
, 0x00);
835 static int rt711_adc_08_event(struct snd_soc_dapm_widget
*w
,
836 struct snd_kcontrol
*kcontrol
, int event
)
838 struct snd_soc_component
*component
=
839 snd_soc_dapm_to_component(w
->dapm
);
840 struct rt711_priv
*rt711
= snd_soc_component_get_drvdata(component
);
843 case SND_SOC_DAPM_POST_PMU
:
844 regmap_write(rt711
->regmap
,
845 RT711_SET_STREAMID_ADC2
, 0x10);
847 case SND_SOC_DAPM_PRE_PMD
:
848 regmap_write(rt711
->regmap
,
849 RT711_SET_STREAMID_ADC2
, 0x00);
855 static const struct snd_soc_dapm_widget rt711_dapm_widgets
[] = {
856 SND_SOC_DAPM_OUTPUT("HP"),
857 SND_SOC_DAPM_INPUT("MIC2"),
858 SND_SOC_DAPM_INPUT("DMIC1"),
859 SND_SOC_DAPM_INPUT("DMIC2"),
860 SND_SOC_DAPM_INPUT("LINE1"),
861 SND_SOC_DAPM_INPUT("LINE2"),
863 SND_SOC_DAPM_DAC_E("DAC Surround", NULL
, SND_SOC_NOPM
, 0, 0,
864 rt711_dac_surround_event
,
865 SND_SOC_DAPM_POST_PMU
| SND_SOC_DAPM_PRE_PMD
),
866 SND_SOC_DAPM_ADC_E("ADC 09", NULL
, SND_SOC_NOPM
, 0, 0,
868 SND_SOC_DAPM_POST_PMU
| SND_SOC_DAPM_PRE_PMD
),
869 SND_SOC_DAPM_ADC_E("ADC 08", NULL
, SND_SOC_NOPM
, 0, 0,
871 SND_SOC_DAPM_POST_PMU
| SND_SOC_DAPM_PRE_PMD
),
872 SND_SOC_DAPM_MUX("ADC 22 Mux", SND_SOC_NOPM
, 0, 0,
874 SND_SOC_DAPM_MUX("ADC 23 Mux", SND_SOC_NOPM
, 0, 0,
877 SND_SOC_DAPM_AIF_IN("DP3RX", "DP3 Playback", 0, SND_SOC_NOPM
, 0, 0),
878 SND_SOC_DAPM_AIF_OUT("DP2TX", "DP2 Capture", 0, SND_SOC_NOPM
, 0, 0),
879 SND_SOC_DAPM_AIF_OUT("DP4TX", "DP4 Capture", 0, SND_SOC_NOPM
, 0, 0),
882 static const struct snd_soc_dapm_route rt711_audio_map
[] = {
883 {"DAC Surround", NULL
, "DP3RX"},
884 {"DP2TX", NULL
, "ADC 09"},
885 {"DP4TX", NULL
, "ADC 08"},
887 {"ADC 09", NULL
, "ADC 22 Mux"},
888 {"ADC 08", NULL
, "ADC 23 Mux"},
889 {"ADC 22 Mux", "DMIC", "DMIC1"},
890 {"ADC 22 Mux", "LINE1", "LINE1"},
891 {"ADC 22 Mux", "LINE2", "LINE2"},
892 {"ADC 22 Mux", "MIC2", "MIC2"},
893 {"ADC 23 Mux", "DMIC", "DMIC2"},
894 {"ADC 23 Mux", "LINE1", "LINE1"},
895 {"ADC 23 Mux", "LINE2", "LINE2"},
896 {"ADC 23 Mux", "MIC2", "MIC2"},
898 {"HP", NULL
, "DAC Surround"},
901 static int rt711_set_bias_level(struct snd_soc_component
*component
,
902 enum snd_soc_bias_level level
)
904 struct snd_soc_dapm_context
*dapm
=
905 snd_soc_component_get_dapm(component
);
906 struct rt711_priv
*rt711
= snd_soc_component_get_drvdata(component
);
909 case SND_SOC_BIAS_PREPARE
:
910 if (dapm
->bias_level
== SND_SOC_BIAS_STANDBY
) {
911 regmap_write(rt711
->regmap
,
912 RT711_SET_AUDIO_POWER_STATE
,
917 case SND_SOC_BIAS_STANDBY
:
918 mutex_lock(&rt711
->calibrate_mutex
);
919 regmap_write(rt711
->regmap
,
920 RT711_SET_AUDIO_POWER_STATE
,
922 mutex_unlock(&rt711
->calibrate_mutex
);
932 static int rt711_parse_dt(struct rt711_priv
*rt711
, struct device
*dev
)
934 device_property_read_u32(dev
, "realtek,jd-src",
940 static int rt711_probe(struct snd_soc_component
*component
)
942 struct rt711_priv
*rt711
= snd_soc_component_get_drvdata(component
);
945 rt711_parse_dt(rt711
, &rt711
->slave
->dev
);
946 rt711
->component
= component
;
948 if (!rt711
->first_hw_init
)
951 ret
= pm_runtime_resume(component
->dev
);
952 if (ret
< 0 && ret
!= -EACCES
)
958 static const struct snd_soc_component_driver soc_codec_dev_rt711
= {
959 .probe
= rt711_probe
,
960 .set_bias_level
= rt711_set_bias_level
,
961 .controls
= rt711_snd_controls
,
962 .num_controls
= ARRAY_SIZE(rt711_snd_controls
),
963 .dapm_widgets
= rt711_dapm_widgets
,
964 .num_dapm_widgets
= ARRAY_SIZE(rt711_dapm_widgets
),
965 .dapm_routes
= rt711_audio_map
,
966 .num_dapm_routes
= ARRAY_SIZE(rt711_audio_map
),
967 .set_jack
= rt711_set_jack_detect
,
971 static int rt711_set_sdw_stream(struct snd_soc_dai
*dai
, void *sdw_stream
,
974 snd_soc_dai_dma_data_set(dai
, direction
, sdw_stream
);
979 static void rt711_shutdown(struct snd_pcm_substream
*substream
,
980 struct snd_soc_dai
*dai
)
982 snd_soc_dai_set_dma_data(dai
, substream
, NULL
);
985 static int rt711_pcm_hw_params(struct snd_pcm_substream
*substream
,
986 struct snd_pcm_hw_params
*params
,
987 struct snd_soc_dai
*dai
)
989 struct snd_soc_component
*component
= dai
->component
;
990 struct rt711_priv
*rt711
= snd_soc_component_get_drvdata(component
);
991 struct sdw_stream_config stream_config
= {0};
992 struct sdw_port_config port_config
= {0};
993 struct sdw_stream_runtime
*sdw_stream
;
995 unsigned int val
= 0;
997 dev_dbg(dai
->dev
, "%s %s", __func__
, dai
->name
);
998 sdw_stream
= snd_soc_dai_get_dma_data(dai
, substream
);
1006 /* SoundWire specific configuration */
1007 snd_sdw_params_to_config(substream
, params
, &stream_config
, &port_config
);
1009 if (substream
->stream
== SNDRV_PCM_STREAM_PLAYBACK
) {
1010 port_config
.num
= 3;
1012 if (dai
->id
== RT711_AIF1
)
1013 port_config
.num
= 4;
1014 else if (dai
->id
== RT711_AIF2
)
1015 port_config
.num
= 2;
1020 retval
= sdw_stream_add_slave(rt711
->slave
, &stream_config
,
1021 &port_config
, 1, sdw_stream
);
1023 dev_err(dai
->dev
, "%s: Unable to configure port\n", __func__
);
1027 if (params_channels(params
) <= 16) {
1028 /* bit 3:0 Number of Channel */
1029 val
|= (params_channels(params
) - 1);
1031 dev_err(component
->dev
, "%s: Unsupported channels %d\n",
1032 __func__
, params_channels(params
));
1036 switch (params_width(params
)) {
1037 /* bit 6:4 Bits per Sample */
1057 regmap_write(rt711
->regmap
, RT711_DAC_FORMAT_H
, val
);
1058 regmap_write(rt711
->regmap
, RT711_ADC1_FORMAT_H
, val
);
1059 regmap_write(rt711
->regmap
, RT711_ADC2_FORMAT_H
, val
);
1064 static int rt711_pcm_hw_free(struct snd_pcm_substream
*substream
,
1065 struct snd_soc_dai
*dai
)
1067 struct snd_soc_component
*component
= dai
->component
;
1068 struct rt711_priv
*rt711
= snd_soc_component_get_drvdata(component
);
1069 struct sdw_stream_runtime
*sdw_stream
=
1070 snd_soc_dai_get_dma_data(dai
, substream
);
1075 sdw_stream_remove_slave(rt711
->slave
, sdw_stream
);
1079 #define RT711_STEREO_RATES (SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000)
1080 #define RT711_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \
1081 SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S8)
1083 static const struct snd_soc_dai_ops rt711_ops
= {
1084 .hw_params
= rt711_pcm_hw_params
,
1085 .hw_free
= rt711_pcm_hw_free
,
1086 .set_stream
= rt711_set_sdw_stream
,
1087 .shutdown
= rt711_shutdown
,
1090 static struct snd_soc_dai_driver rt711_dai
[] = {
1092 .name
= "rt711-aif1",
1095 .stream_name
= "DP3 Playback",
1098 .rates
= RT711_STEREO_RATES
,
1099 .formats
= RT711_FORMATS
,
1102 .stream_name
= "DP4 Capture",
1105 .rates
= RT711_STEREO_RATES
,
1106 .formats
= RT711_FORMATS
,
1111 .name
= "rt711-aif2",
1114 .stream_name
= "DP2 Capture",
1117 .rates
= RT711_STEREO_RATES
,
1118 .formats
= RT711_FORMATS
,
1124 /* Bus clock frequency */
1125 #define RT711_CLK_FREQ_9600000HZ 9600000
1126 #define RT711_CLK_FREQ_12000000HZ 12000000
1127 #define RT711_CLK_FREQ_6000000HZ 6000000
1128 #define RT711_CLK_FREQ_4800000HZ 4800000
1129 #define RT711_CLK_FREQ_2400000HZ 2400000
1130 #define RT711_CLK_FREQ_12288000HZ 12288000
1132 int rt711_clock_config(struct device
*dev
)
1134 struct rt711_priv
*rt711
= dev_get_drvdata(dev
);
1135 unsigned int clk_freq
, value
;
1137 clk_freq
= (rt711
->params
.curr_dr_freq
>> 1);
1140 case RT711_CLK_FREQ_12000000HZ
:
1143 case RT711_CLK_FREQ_6000000HZ
:
1146 case RT711_CLK_FREQ_9600000HZ
:
1149 case RT711_CLK_FREQ_4800000HZ
:
1152 case RT711_CLK_FREQ_2400000HZ
:
1155 case RT711_CLK_FREQ_12288000HZ
:
1162 regmap_write(rt711
->regmap
, 0xe0, value
);
1163 regmap_write(rt711
->regmap
, 0xf0, value
);
1165 dev_dbg(dev
, "%s complete, clk_freq=%d\n", __func__
, clk_freq
);
1170 static void rt711_calibration_work(struct work_struct
*work
)
1172 struct rt711_priv
*rt711
=
1173 container_of(work
, struct rt711_priv
, calibration_work
);
1175 rt711_calibration(rt711
);
1178 int rt711_init(struct device
*dev
, struct regmap
*sdw_regmap
,
1179 struct regmap
*regmap
, struct sdw_slave
*slave
)
1181 struct rt711_priv
*rt711
;
1184 rt711
= devm_kzalloc(dev
, sizeof(*rt711
), GFP_KERNEL
);
1188 dev_set_drvdata(dev
, rt711
);
1189 rt711
->slave
= slave
;
1190 rt711
->sdw_regmap
= sdw_regmap
;
1191 rt711
->regmap
= regmap
;
1193 regcache_cache_only(rt711
->regmap
, true);
1195 mutex_init(&rt711
->calibrate_mutex
);
1196 mutex_init(&rt711
->disable_irq_lock
);
1198 INIT_DELAYED_WORK(&rt711
->jack_detect_work
, rt711_jack_detect_handler
);
1199 INIT_DELAYED_WORK(&rt711
->jack_btn_check_work
, rt711_btn_check_handler
);
1200 INIT_WORK(&rt711
->calibration_work
, rt711_calibration_work
);
1203 * Mark hw_init to false
1204 * HW init will be performed when device reports present
1206 rt711
->hw_init
= false;
1207 rt711
->first_hw_init
= false;
1209 /* JD source uses JD2 in default */
1210 rt711
->jd_src
= RT711_JD2
;
1212 ret
= devm_snd_soc_register_component(dev
,
1213 &soc_codec_dev_rt711
,
1215 ARRAY_SIZE(rt711_dai
));
1219 /* set autosuspend parameters */
1220 pm_runtime_set_autosuspend_delay(dev
, 3000);
1221 pm_runtime_use_autosuspend(dev
);
1223 /* make sure the device does not suspend immediately */
1224 pm_runtime_mark_last_busy(dev
);
1226 pm_runtime_enable(dev
);
1228 /* important note: the device is NOT tagged as 'active' and will remain
1229 * 'suspended' until the hardware is enumerated/initialized. This is required
1230 * to make sure the ASoC framework use of pm_runtime_get_sync() does not silently
1231 * fail with -EACCESS because of race conditions between card creation and enumeration
1234 dev_dbg(dev
, "%s\n", __func__
);
1239 int rt711_io_init(struct device
*dev
, struct sdw_slave
*slave
)
1241 struct rt711_priv
*rt711
= dev_get_drvdata(dev
);
1243 rt711
->disable_irq
= false;
1248 regcache_cache_only(rt711
->regmap
, false);
1249 if (rt711
->first_hw_init
)
1250 regcache_cache_bypass(rt711
->regmap
, true);
1253 * PM runtime status is marked as 'active' only when a Slave reports as Attached
1255 if (!rt711
->first_hw_init
)
1256 /* update count of parent 'active' children */
1257 pm_runtime_set_active(&slave
->dev
);
1259 pm_runtime_get_noresume(&slave
->dev
);
1261 rt711_reset(rt711
->regmap
);
1264 regmap_write(rt711
->regmap
, RT711_SET_AUDIO_POWER_STATE
, AC_PWRST_D0
);
1266 /* Set Pin Widget */
1267 regmap_write(rt711
->regmap
, RT711_SET_PIN_MIC2
, 0x25);
1268 regmap_write(rt711
->regmap
, RT711_SET_PIN_HP
, 0xc0);
1269 regmap_write(rt711
->regmap
, RT711_SET_PIN_DMIC1
, 0x20);
1270 regmap_write(rt711
->regmap
, RT711_SET_PIN_DMIC2
, 0x20);
1271 regmap_write(rt711
->regmap
, RT711_SET_PIN_LINE1
, 0x20);
1272 regmap_write(rt711
->regmap
, RT711_SET_PIN_LINE2
, 0x20);
1274 /* Mute HP/ADC1/ADC2 */
1275 regmap_write(rt711
->regmap
, RT711_SET_GAIN_HP_H
, 0xa080);
1276 regmap_write(rt711
->regmap
, RT711_SET_GAIN_HP_H
, 0x9080);
1277 regmap_write(rt711
->regmap
, RT711_SET_GAIN_ADC2_H
, 0x6080);
1278 regmap_write(rt711
->regmap
, RT711_SET_GAIN_ADC2_H
, 0x5080);
1279 regmap_write(rt711
->regmap
, RT711_SET_GAIN_ADC1_H
, 0x6080);
1280 regmap_write(rt711
->regmap
, RT711_SET_GAIN_ADC1_H
, 0x5080);
1282 /* Set Configuration Default */
1283 regmap_write(rt711
->regmap
, 0x4f12, 0x91);
1284 regmap_write(rt711
->regmap
, 0x4e12, 0xd6);
1285 regmap_write(rt711
->regmap
, 0x4d12, 0x11);
1286 regmap_write(rt711
->regmap
, 0x4c12, 0x20);
1287 regmap_write(rt711
->regmap
, 0x4f13, 0x91);
1288 regmap_write(rt711
->regmap
, 0x4e13, 0xd6);
1289 regmap_write(rt711
->regmap
, 0x4d13, 0x11);
1290 regmap_write(rt711
->regmap
, 0x4c13, 0x21);
1291 regmap_write(rt711
->regmap
, 0x4c21, 0xf0);
1292 regmap_write(rt711
->regmap
, 0x4d21, 0x11);
1293 regmap_write(rt711
->regmap
, 0x4e21, 0x11);
1294 regmap_write(rt711
->regmap
, 0x4f21, 0x01);
1296 /* Data port arrangement */
1297 rt711_index_write(rt711
->regmap
, RT711_VENDOR_REG
,
1298 RT711_TX_RX_MUX_CTL
, 0x0154);
1301 rt711_index_write(rt711
->regmap
, RT711_VENDOR_REG
,
1302 RT711_DIGITAL_MISC_CTRL4
, 0x201b);
1303 rt711_index_write(rt711
->regmap
, RT711_VENDOR_REG
,
1304 RT711_COMBO_JACK_AUTO_CTL1
, 0x5089);
1305 rt711_index_write(rt711
->regmap
, RT711_VENDOR_REG
,
1306 RT711_VREFOUT_CTL
, 0x5064);
1307 rt711_index_write(rt711
->regmap
, RT711_VENDOR_REG
,
1308 RT711_INLINE_CMD_CTL
, 0xd249);
1310 /* Finish Initial Settings, set power to D3 */
1311 regmap_write(rt711
->regmap
, RT711_SET_AUDIO_POWER_STATE
, AC_PWRST_D3
);
1313 if (rt711
->first_hw_init
)
1314 rt711_calibration(rt711
);
1316 schedule_work(&rt711
->calibration_work
);
1319 * if set_jack callback occurred early than io_init,
1320 * we set up the jack detection function now
1323 rt711_jack_init(rt711
);
1325 if (rt711
->first_hw_init
) {
1326 regcache_cache_bypass(rt711
->regmap
, false);
1327 regcache_mark_dirty(rt711
->regmap
);
1329 rt711
->first_hw_init
= true;
1331 /* Mark Slave initialization complete */
1332 rt711
->hw_init
= true;
1334 pm_runtime_mark_last_busy(&slave
->dev
);
1335 pm_runtime_put_autosuspend(&slave
->dev
);
1337 dev_dbg(&slave
->dev
, "%s hw_init complete\n", __func__
);
1341 MODULE_DESCRIPTION("ASoC RT711 SDW driver");
1342 MODULE_AUTHOR("Shuming Fan <shumingf@realtek.com>");
1343 MODULE_LICENSE("GPL");