Lines Matching +full:mux +full:- +full:int +full:- +full:port
1 // SPDX-License-Identifier: GPL-2.0-only
3 // rt722-sdca.c -- rt722 SDCA ALSA SoC audio driver
23 #include <sound/soc-dapm.h>
26 #include "rt722-sdca.h"
30 int rt722_sdca_index_write(struct rt722_sdca_priv *rt722, in rt722_sdca_index_write()
31 unsigned int nid, unsigned int reg, unsigned int value) in rt722_sdca_index_write()
33 struct regmap *regmap = rt722->regmap; in rt722_sdca_index_write()
34 unsigned int addr = RT722_NID_ADDR(nid, reg); in rt722_sdca_index_write()
35 int ret; in rt722_sdca_index_write()
39 dev_err(&rt722->slave->dev, in rt722_sdca_index_write()
46 int rt722_sdca_index_read(struct rt722_sdca_priv *rt722, in rt722_sdca_index_read()
47 unsigned int nid, unsigned int reg, unsigned int *value) in rt722_sdca_index_read()
49 int ret; in rt722_sdca_index_read()
50 struct regmap *regmap = rt722->regmap; in rt722_sdca_index_read()
51 unsigned int addr = RT722_NID_ADDR(nid, reg); in rt722_sdca_index_read()
55 dev_err(&rt722->slave->dev, in rt722_sdca_index_read()
62 static int rt722_sdca_index_update_bits(struct rt722_sdca_priv *rt722, in rt722_sdca_index_update_bits()
63 unsigned int nid, unsigned int reg, unsigned int mask, unsigned int val) in rt722_sdca_index_update_bits()
65 unsigned int tmp; in rt722_sdca_index_update_bits()
66 int ret; in rt722_sdca_index_update_bits()
76 static int rt722_sdca_btn_type(unsigned char *buffer) in rt722_sdca_btn_type()
94 static unsigned int rt722_sdca_button_detect(struct rt722_sdca_priv *rt722) in rt722_sdca_button_detect()
96 unsigned int btn_type = 0, offset, idx, val, owner; in rt722_sdca_button_detect()
97 int ret; in rt722_sdca_button_detect()
101 ret = regmap_read(rt722->regmap, in rt722_sdca_button_detect()
112 ret = regmap_read(rt722->regmap, in rt722_sdca_button_detect()
119 ret = regmap_read(rt722->regmap, in rt722_sdca_button_detect()
133 regmap_write(rt722->regmap, in rt722_sdca_button_detect()
140 static int rt722_sdca_headset_detect(struct rt722_sdca_priv *rt722) in rt722_sdca_headset_detect()
142 unsigned int det_mode; in rt722_sdca_headset_detect()
143 int ret; in rt722_sdca_headset_detect()
146 ret = regmap_read(rt722->regmap, in rt722_sdca_headset_detect()
154 rt722->jack_type = 0; in rt722_sdca_headset_detect()
157 rt722->jack_type = SND_JACK_HEADPHONE; in rt722_sdca_headset_detect()
160 rt722->jack_type = SND_JACK_HEADSET; in rt722_sdca_headset_detect()
166 ret = regmap_write(rt722->regmap, in rt722_sdca_headset_detect()
173 dev_dbg(&rt722->slave->dev, in rt722_sdca_headset_detect()
187 int btn_type = 0, ret; in rt722_sdca_jack_detect_handler()
189 if (!rt722->hs_jack) in rt722_sdca_jack_detect_handler()
192 if (!rt722->component->card || !rt722->component->card->instantiated) in rt722_sdca_jack_detect_handler()
196 if (rt722->scp_sdca_stat1 & SDW_SCP_SDCA_INT_SDCA_0) { in rt722_sdca_jack_detect_handler()
203 if (rt722->scp_sdca_stat2 & SDW_SCP_SDCA_INT_SDCA_8) in rt722_sdca_jack_detect_handler()
206 if (rt722->jack_type == 0) in rt722_sdca_jack_detect_handler()
209 dev_dbg(&rt722->slave->dev, in rt722_sdca_jack_detect_handler()
210 "in %s, jack_type=%d\n", __func__, rt722->jack_type); in rt722_sdca_jack_detect_handler()
211 dev_dbg(&rt722->slave->dev, in rt722_sdca_jack_detect_handler()
213 dev_dbg(&rt722->slave->dev, in rt722_sdca_jack_detect_handler()
215 rt722->scp_sdca_stat1, rt722->scp_sdca_stat2); in rt722_sdca_jack_detect_handler()
217 snd_soc_jack_report(rt722->hs_jack, rt722->jack_type | btn_type, in rt722_sdca_jack_detect_handler()
224 snd_soc_jack_report(rt722->hs_jack, rt722->jack_type, in rt722_sdca_jack_detect_handler()
230 &rt722->jack_btn_check_work, msecs_to_jiffies(200)); in rt722_sdca_jack_detect_handler()
238 int btn_type = 0, ret, idx; in rt722_sdca_btn_check_handler()
239 unsigned int det_mode, offset, val; in rt722_sdca_btn_check_handler()
242 ret = regmap_read(rt722->regmap, in rt722_sdca_btn_check_handler()
251 ret = regmap_read(rt722->regmap, in rt722_sdca_btn_check_handler()
258 ret = regmap_read(rt722->regmap, in rt722_sdca_btn_check_handler()
268 rt722->jack_type = 0; in rt722_sdca_btn_check_handler()
270 dev_dbg(&rt722->slave->dev, "%s, btn_type=0x%x\n", __func__, btn_type); in rt722_sdca_btn_check_handler()
271 snd_soc_jack_report(rt722->hs_jack, rt722->jack_type | btn_type, in rt722_sdca_btn_check_handler()
278 snd_soc_jack_report(rt722->hs_jack, rt722->jack_type, in rt722_sdca_btn_check_handler()
284 &rt722->jack_btn_check_work, msecs_to_jiffies(200)); in rt722_sdca_btn_check_handler()
295 mutex_lock(&rt722->calibrate_mutex); in rt722_sdca_jack_init()
296 if (rt722->hs_jack) { in rt722_sdca_jack_init()
298 sdw_write_no_pm(rt722->slave, SDW_SCP_SDCA_INTMASK1, in rt722_sdca_jack_init()
301 sdw_write_no_pm(rt722->slave, SDW_SCP_SDCA_INTMASK2, in rt722_sdca_jack_init()
303 dev_dbg(&rt722->slave->dev, "in %s enable\n", __func__); in rt722_sdca_jack_init()
307 regmap_write(rt722->regmap, in rt722_sdca_jack_init()
310 regmap_write(rt722->regmap, in rt722_sdca_jack_init()
318 mutex_unlock(&rt722->calibrate_mutex); in rt722_sdca_jack_init()
321 static int rt722_sdca_set_jack_detect(struct snd_soc_component *component, in rt722_sdca_set_jack_detect()
325 int ret; in rt722_sdca_set_jack_detect()
327 rt722->hs_jack = hs_jack; in rt722_sdca_set_jack_detect()
329 ret = pm_runtime_resume_and_get(component->dev); in rt722_sdca_set_jack_detect()
331 if (ret != -EACCES) { in rt722_sdca_set_jack_detect()
332 dev_err(component->dev, "%s: failed to resume %d\n", __func__, ret); in rt722_sdca_set_jack_detect()
336 dev_dbg(component->dev, "%s: skipping jack init for now\n", __func__); in rt722_sdca_set_jack_detect()
342 pm_runtime_mark_last_busy(component->dev); in rt722_sdca_set_jack_detect()
343 pm_runtime_put_autosuspend(component->dev); in rt722_sdca_set_jack_detect()
349 static int rt722_sdca_set_gain_put(struct snd_kcontrol *kcontrol, in rt722_sdca_set_gain_put()
354 (struct soc_mixer_control *)kcontrol->private_value; in rt722_sdca_set_gain_put()
356 unsigned int read_l, read_r, gain_l_val, gain_r_val; in rt722_sdca_set_gain_put()
357 unsigned int adc_vol_flag = 0, changed = 0; in rt722_sdca_set_gain_put()
358 unsigned int lvalue, rvalue; in rt722_sdca_set_gain_put()
359 const unsigned int interval_offset = 0xc0; in rt722_sdca_set_gain_put()
360 const unsigned int tendB = 0xa00; in rt722_sdca_set_gain_put()
362 if (strstr(ucontrol->id.name, "FU1E Capture Volume") || in rt722_sdca_set_gain_put()
363 strstr(ucontrol->id.name, "FU0F Capture Volume")) in rt722_sdca_set_gain_put()
366 regmap_read(rt722->regmap, mc->reg, &lvalue); in rt722_sdca_set_gain_put()
367 regmap_read(rt722->regmap, mc->rreg, &rvalue); in rt722_sdca_set_gain_put()
370 gain_l_val = ucontrol->value.integer.value[0]; in rt722_sdca_set_gain_put()
371 if (gain_l_val > mc->max) in rt722_sdca_set_gain_put()
372 gain_l_val = mc->max; in rt722_sdca_set_gain_put()
374 if (mc->shift == 8) /* boost gain */ in rt722_sdca_set_gain_put()
379 gain_l_val = 0x1e00 - ((mc->max - gain_l_val) * interval_offset); in rt722_sdca_set_gain_put()
381 gain_l_val = 0 - ((mc->max - gain_l_val) * interval_offset); in rt722_sdca_set_gain_put()
386 gain_r_val = ucontrol->value.integer.value[1]; in rt722_sdca_set_gain_put()
387 if (gain_r_val > mc->max) in rt722_sdca_set_gain_put()
388 gain_r_val = mc->max; in rt722_sdca_set_gain_put()
390 if (mc->shift == 8) /* boost gain */ in rt722_sdca_set_gain_put()
395 gain_r_val = 0x1e00 - ((mc->max - gain_r_val) * interval_offset); in rt722_sdca_set_gain_put()
397 gain_r_val = 0 - ((mc->max - gain_r_val) * interval_offset); in rt722_sdca_set_gain_put()
407 regmap_write(rt722->regmap, mc->reg, gain_l_val); in rt722_sdca_set_gain_put()
410 regmap_write(rt722->regmap, mc->rreg, gain_r_val); in rt722_sdca_set_gain_put()
412 regmap_read(rt722->regmap, mc->reg, &read_l); in rt722_sdca_set_gain_put()
413 regmap_read(rt722->regmap, mc->rreg, &read_r); in rt722_sdca_set_gain_put()
417 return -EIO; in rt722_sdca_set_gain_put()
420 static int rt722_sdca_set_gain_get(struct snd_kcontrol *kcontrol, in rt722_sdca_set_gain_get()
426 (struct soc_mixer_control *)kcontrol->private_value; in rt722_sdca_set_gain_get()
427 unsigned int read_l, read_r, ctl_l = 0, ctl_r = 0; in rt722_sdca_set_gain_get()
428 unsigned int adc_vol_flag = 0; in rt722_sdca_set_gain_get()
429 const unsigned int interval_offset = 0xc0; in rt722_sdca_set_gain_get()
430 const unsigned int tendB = 0xa00; in rt722_sdca_set_gain_get()
432 if (strstr(ucontrol->id.name, "FU1E Capture Volume") || in rt722_sdca_set_gain_get()
433 strstr(ucontrol->id.name, "FU0F Capture Volume")) in rt722_sdca_set_gain_get()
436 regmap_read(rt722->regmap, mc->reg, &read_l); in rt722_sdca_set_gain_get()
437 regmap_read(rt722->regmap, mc->rreg, &read_r); in rt722_sdca_set_gain_get()
439 if (mc->shift == 8) /* boost gain */ in rt722_sdca_set_gain_get()
443 ctl_l = mc->max - (((0x1e00 - read_l) & 0xffff) / interval_offset); in rt722_sdca_set_gain_get()
445 ctl_l = mc->max - (((0 - read_l) & 0xffff) / interval_offset); in rt722_sdca_set_gain_get()
449 if (mc->shift == 8) /* boost gain */ in rt722_sdca_set_gain_get()
453 ctl_r = mc->max - (((0x1e00 - read_r) & 0xffff) / interval_offset); in rt722_sdca_set_gain_get()
455 ctl_r = mc->max - (((0 - read_r) & 0xffff) / interval_offset); in rt722_sdca_set_gain_get()
461 ucontrol->value.integer.value[0] = ctl_l; in rt722_sdca_set_gain_get()
462 ucontrol->value.integer.value[1] = ctl_r; in rt722_sdca_set_gain_get()
467 static int rt722_sdca_set_fu1e_capture_ctl(struct rt722_sdca_priv *rt722) in rt722_sdca_set_fu1e_capture_ctl()
469 int err, i; in rt722_sdca_set_fu1e_capture_ctl()
470 unsigned int ch_mute; in rt722_sdca_set_fu1e_capture_ctl()
472 for (i = 0; i < ARRAY_SIZE(rt722->fu1e_mixer_mute); i++) { in rt722_sdca_set_fu1e_capture_ctl()
473 ch_mute = rt722->fu1e_dapm_mute || rt722->fu1e_mixer_mute[i]; in rt722_sdca_set_fu1e_capture_ctl()
474 err = regmap_write(rt722->regmap, in rt722_sdca_set_fu1e_capture_ctl()
484 static int rt722_sdca_fu1e_capture_get(struct snd_kcontrol *kcontrol, in rt722_sdca_fu1e_capture_get()
490 (struct rt722_sdca_dmic_kctrl_priv *)kcontrol->private_value; in rt722_sdca_fu1e_capture_get()
491 unsigned int i; in rt722_sdca_fu1e_capture_get()
493 for (i = 0; i < p->count; i++) in rt722_sdca_fu1e_capture_get()
494 ucontrol->value.integer.value[i] = !rt722->fu1e_mixer_mute[i]; in rt722_sdca_fu1e_capture_get()
499 static int rt722_sdca_fu1e_capture_put(struct snd_kcontrol *kcontrol, in rt722_sdca_fu1e_capture_put()
505 (struct rt722_sdca_dmic_kctrl_priv *)kcontrol->private_value; in rt722_sdca_fu1e_capture_put()
506 int err, changed = 0, i; in rt722_sdca_fu1e_capture_put()
508 for (i = 0; i < p->count; i++) { in rt722_sdca_fu1e_capture_put()
509 if (rt722->fu1e_mixer_mute[i] != !ucontrol->value.integer.value[i]) in rt722_sdca_fu1e_capture_put()
511 rt722->fu1e_mixer_mute[i] = !ucontrol->value.integer.value[i]; in rt722_sdca_fu1e_capture_put()
521 static int rt722_sdca_set_fu0f_capture_ctl(struct rt722_sdca_priv *rt722) in rt722_sdca_set_fu0f_capture_ctl()
523 int err; in rt722_sdca_set_fu0f_capture_ctl()
524 unsigned int ch_l, ch_r; in rt722_sdca_set_fu0f_capture_ctl()
526 ch_l = (rt722->fu0f_dapm_mute || rt722->fu0f_mixer_l_mute) ? 0x01 : 0x00; in rt722_sdca_set_fu0f_capture_ctl()
527 ch_r = (rt722->fu0f_dapm_mute || rt722->fu0f_mixer_r_mute) ? 0x01 : 0x00; in rt722_sdca_set_fu0f_capture_ctl()
529 err = regmap_write(rt722->regmap, in rt722_sdca_set_fu0f_capture_ctl()
535 err = regmap_write(rt722->regmap, in rt722_sdca_set_fu0f_capture_ctl()
544 static int rt722_sdca_fu0f_capture_get(struct snd_kcontrol *kcontrol, in rt722_sdca_fu0f_capture_get()
550 ucontrol->value.integer.value[0] = !rt722->fu0f_mixer_l_mute; in rt722_sdca_fu0f_capture_get()
551 ucontrol->value.integer.value[1] = !rt722->fu0f_mixer_r_mute; in rt722_sdca_fu0f_capture_get()
555 static int rt722_sdca_fu0f_capture_put(struct snd_kcontrol *kcontrol, in rt722_sdca_fu0f_capture_put()
560 int err, changed = 0; in rt722_sdca_fu0f_capture_put()
562 if (rt722->fu0f_mixer_l_mute != !ucontrol->value.integer.value[0] || in rt722_sdca_fu0f_capture_put()
563 rt722->fu0f_mixer_r_mute != !ucontrol->value.integer.value[1]) in rt722_sdca_fu0f_capture_put()
566 rt722->fu0f_mixer_l_mute = !ucontrol->value.integer.value[0]; in rt722_sdca_fu0f_capture_put()
567 rt722->fu0f_mixer_r_mute = !ucontrol->value.integer.value[1]; in rt722_sdca_fu0f_capture_put()
575 static int rt722_sdca_fu_info(struct snd_kcontrol *kcontrol, in rt722_sdca_fu_info()
579 (struct rt722_sdca_dmic_kctrl_priv *)kcontrol->private_value; in rt722_sdca_fu_info()
581 if (p->max == 1) in rt722_sdca_fu_info()
582 uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; in rt722_sdca_fu_info()
584 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; in rt722_sdca_fu_info()
585 uinfo->count = p->count; in rt722_sdca_fu_info()
586 uinfo->value.integer.min = 0; in rt722_sdca_fu_info()
587 uinfo->value.integer.max = p->max; in rt722_sdca_fu_info()
591 static int rt722_sdca_dmic_set_gain_get(struct snd_kcontrol *kcontrol, in rt722_sdca_dmic_set_gain_get()
597 (struct rt722_sdca_dmic_kctrl_priv *)kcontrol->private_value; in rt722_sdca_dmic_set_gain_get()
598 unsigned int boost_step = 0x0a00; in rt722_sdca_dmic_set_gain_get()
599 unsigned int vol_max = 0x1e00; in rt722_sdca_dmic_set_gain_get()
600 unsigned int regvalue, ctl, i; in rt722_sdca_dmic_set_gain_get()
601 unsigned int adc_vol_flag = 0; in rt722_sdca_dmic_set_gain_get()
602 const unsigned int interval_offset = 0xc0; in rt722_sdca_dmic_set_gain_get()
604 if (strstr(ucontrol->id.name, "FU1E Capture Volume")) in rt722_sdca_dmic_set_gain_get()
608 for (i = 0; i < p->count; i++) { in rt722_sdca_dmic_set_gain_get()
609 regmap_read(rt722->regmap, p->reg_base + i, ®value); in rt722_sdca_dmic_set_gain_get()
614 ctl = p->max - (((vol_max - regvalue) & 0xffff) / interval_offset); in rt722_sdca_dmic_set_gain_get()
616 ucontrol->value.integer.value[i] = ctl; in rt722_sdca_dmic_set_gain_get()
622 static int rt722_sdca_dmic_set_gain_put(struct snd_kcontrol *kcontrol, in rt722_sdca_dmic_set_gain_put()
627 (struct rt722_sdca_dmic_kctrl_priv *)kcontrol->private_value; in rt722_sdca_dmic_set_gain_put()
629 unsigned int boost_step = 0x0a00; in rt722_sdca_dmic_set_gain_put()
630 unsigned int vol_max = 0x1e00; in rt722_sdca_dmic_set_gain_put()
631 unsigned int gain_val[4]; in rt722_sdca_dmic_set_gain_put()
632 unsigned int i, adc_vol_flag = 0, changed = 0; in rt722_sdca_dmic_set_gain_put()
633 unsigned int regvalue[4]; in rt722_sdca_dmic_set_gain_put()
634 const unsigned int interval_offset = 0xc0; in rt722_sdca_dmic_set_gain_put()
635 int err; in rt722_sdca_dmic_set_gain_put()
637 if (strstr(ucontrol->id.name, "FU1E Capture Volume")) in rt722_sdca_dmic_set_gain_put()
641 for (i = 0; i < p->count; i++) { in rt722_sdca_dmic_set_gain_put()
642 regmap_read(rt722->regmap, p->reg_base + i, ®value[i]); in rt722_sdca_dmic_set_gain_put()
644 gain_val[i] = ucontrol->value.integer.value[i]; in rt722_sdca_dmic_set_gain_put()
645 if (gain_val[i] > p->max) in rt722_sdca_dmic_set_gain_put()
646 gain_val[i] = p->max; in rt722_sdca_dmic_set_gain_put()
651 gain_val[i] = vol_max - ((p->max - gain_val[i]) * interval_offset); in rt722_sdca_dmic_set_gain_put()
662 for (i = 0; i < p->count; i++) { in rt722_sdca_dmic_set_gain_put()
663 err = regmap_write(rt722->regmap, p->reg_base + i, gain_val[i]); in rt722_sdca_dmic_set_gain_put()
665 dev_err(&rt722->slave->dev, "%s: %#08x can't be set\n", in rt722_sdca_dmic_set_gain_put()
666 __func__, p->reg_base + i); in rt722_sdca_dmic_set_gain_put()
694 static const DECLARE_TLV_DB_SCALE(out_vol_tlv, -6525, 75, 0);
695 static const DECLARE_TLV_DB_SCALE(mic_vol_tlv, -1725, 75, 0);
768 SOC_DAPM_ENUM("ADC 22 Mux", rt722_adc22_enum);
771 SOC_DAPM_ENUM("ADC 24 Mux", rt722_adc24_enum);
774 SOC_DAPM_ENUM("ADC 25 Mux", rt722_adc25_enum);
776 static int rt722_sdca_fu42_event(struct snd_soc_dapm_widget *w, in rt722_sdca_fu42_event()
777 struct snd_kcontrol *kcontrol, int event) in rt722_sdca_fu42_event()
780 snd_soc_dapm_to_component(w->dapm); in rt722_sdca_fu42_event()
786 regmap_write(rt722->regmap, in rt722_sdca_fu42_event()
789 regmap_write(rt722->regmap, in rt722_sdca_fu42_event()
794 regmap_write(rt722->regmap, in rt722_sdca_fu42_event()
797 regmap_write(rt722->regmap, in rt722_sdca_fu42_event()
805 static int rt722_sdca_fu21_event(struct snd_soc_dapm_widget *w, in rt722_sdca_fu21_event()
806 struct snd_kcontrol *kcontrol, int event) in rt722_sdca_fu21_event()
809 snd_soc_dapm_to_component(w->dapm); in rt722_sdca_fu21_event()
815 regmap_write(rt722->regmap, in rt722_sdca_fu21_event()
818 regmap_write(rt722->regmap, in rt722_sdca_fu21_event()
823 regmap_write(rt722->regmap, in rt722_sdca_fu21_event()
826 regmap_write(rt722->regmap, in rt722_sdca_fu21_event()
834 static int rt722_sdca_fu113_event(struct snd_soc_dapm_widget *w, in rt722_sdca_fu113_event()
835 struct snd_kcontrol *kcontrol, int event) in rt722_sdca_fu113_event()
838 snd_soc_dapm_to_component(w->dapm); in rt722_sdca_fu113_event()
843 rt722->fu1e_dapm_mute = false; in rt722_sdca_fu113_event()
848 rt722->fu1e_dapm_mute = true; in rt722_sdca_fu113_event()
855 static int rt722_sdca_fu36_event(struct snd_soc_dapm_widget *w, in rt722_sdca_fu36_event()
856 struct snd_kcontrol *kcontrol, int event) in rt722_sdca_fu36_event()
859 snd_soc_dapm_to_component(w->dapm); in rt722_sdca_fu36_event()
864 rt722->fu0f_dapm_mute = false; in rt722_sdca_fu36_event()
868 rt722->fu0f_dapm_mute = true; in rt722_sdca_fu36_event()
878 unsigned int delay = 1000, val; in rt722_pde_transition_delay()
880 pm_runtime_mark_last_busy(&rt722->slave->dev); in rt722_pde_transition_delay()
884 regmap_read(rt722->regmap, in rt722_pde_transition_delay()
890 delay--; in rt722_pde_transition_delay()
893 dev_warn(&rt722->slave->dev, "%s PDE to %s is NOT ready", __func__, ps?"PS3":"PS0"); in rt722_pde_transition_delay()
897 static int rt722_sdca_pde47_event(struct snd_soc_dapm_widget *w, in rt722_sdca_pde47_event()
898 struct snd_kcontrol *kcontrol, int event) in rt722_sdca_pde47_event()
901 snd_soc_dapm_to_component(w->dapm); in rt722_sdca_pde47_event()
907 regmap_write(rt722->regmap, in rt722_sdca_pde47_event()
913 regmap_write(rt722->regmap, in rt722_sdca_pde47_event()
922 static int rt722_sdca_pde23_event(struct snd_soc_dapm_widget *w, in rt722_sdca_pde23_event()
923 struct snd_kcontrol *kcontrol, int event) in rt722_sdca_pde23_event()
926 snd_soc_dapm_to_component(w->dapm); in rt722_sdca_pde23_event()
932 regmap_write(rt722->regmap, in rt722_sdca_pde23_event()
938 regmap_write(rt722->regmap, in rt722_sdca_pde23_event()
947 static int rt722_sdca_pde11_event(struct snd_soc_dapm_widget *w, in rt722_sdca_pde11_event()
948 struct snd_kcontrol *kcontrol, int event) in rt722_sdca_pde11_event()
951 snd_soc_dapm_to_component(w->dapm); in rt722_sdca_pde11_event()
957 regmap_write(rt722->regmap, in rt722_sdca_pde11_event()
963 regmap_write(rt722->regmap, in rt722_sdca_pde11_event()
972 static int rt722_sdca_pde12_event(struct snd_soc_dapm_widget *w, in rt722_sdca_pde12_event()
973 struct snd_kcontrol *kcontrol, int event) in rt722_sdca_pde12_event()
976 snd_soc_dapm_to_component(w->dapm); in rt722_sdca_pde12_event()
982 regmap_write(rt722->regmap, in rt722_sdca_pde12_event()
988 regmap_write(rt722->regmap, in rt722_sdca_pde12_event()
1031 SND_SOC_DAPM_MUX("ADC 22 Mux", SND_SOC_NOPM, 0, 0,
1033 SND_SOC_DAPM_MUX("ADC 24 Mux", SND_SOC_NOPM, 0, 0,
1035 SND_SOC_DAPM_MUX("ADC 25 Mux", SND_SOC_NOPM, 0, 0,
1048 {"ADC 22 Mux", "MIC2", "MIC2"},
1049 {"ADC 22 Mux", "LINE1", "LINE1"},
1050 {"ADC 22 Mux", "LINE2", "LINE2"},
1051 {"ADC 24 Mux", "DMIC1", "DMIC1_2"},
1052 {"ADC 24 Mux", "DMIC2", "DMIC3_4"},
1053 {"ADC 25 Mux", "DMIC1", "DMIC1_2"},
1054 {"ADC 25 Mux", "DMIC2", "DMIC3_4"},
1056 {"FU 36", NULL, "ADC 22 Mux"},
1058 {"FU 113", NULL, "ADC 24 Mux"},
1059 {"FU 113", NULL, "ADC 25 Mux"},
1069 static int rt722_sdca_parse_dt(struct rt722_sdca_priv *rt722, struct device *dev) in rt722_sdca_parse_dt()
1071 device_property_read_u32(dev, "realtek,jd-src", &rt722->jd_src); in rt722_sdca_parse_dt()
1076 static int rt722_sdca_probe(struct snd_soc_component *component) in rt722_sdca_probe()
1079 int ret; in rt722_sdca_probe()
1081 rt722_sdca_parse_dt(rt722, &rt722->slave->dev); in rt722_sdca_probe()
1082 rt722->component = component; in rt722_sdca_probe()
1084 ret = pm_runtime_resume(component->dev); in rt722_sdca_probe()
1085 if (ret < 0 && ret != -EACCES) in rt722_sdca_probe()
1103 static int rt722_sdca_set_sdw_stream(struct snd_soc_dai *dai, void *sdw_stream, in rt722_sdca_set_sdw_stream()
1104 int direction) in rt722_sdca_set_sdw_stream()
1117 static int rt722_sdca_pcm_hw_params(struct snd_pcm_substream *substream, in rt722_sdca_pcm_hw_params()
1121 struct snd_soc_component *component = dai->component; in rt722_sdca_pcm_hw_params()
1127 int retval, port, num_channels; in rt722_sdca_pcm_hw_params() local
1128 unsigned int sampling_rate; in rt722_sdca_pcm_hw_params()
1130 dev_dbg(dai->dev, "%s %s", __func__, dai->name); in rt722_sdca_pcm_hw_params()
1134 return -EINVAL; in rt722_sdca_pcm_hw_params()
1136 if (!rt722->slave) in rt722_sdca_pcm_hw_params()
1137 return -EINVAL; in rt722_sdca_pcm_hw_params()
1140 * RT722_AIF1 with port = 1 for headphone playback in rt722_sdca_pcm_hw_params()
1141 * RT722_AIF1 with port = 2 for headset-mic capture in rt722_sdca_pcm_hw_params()
1142 * RT722_AIF2 with port = 3 for speaker playback in rt722_sdca_pcm_hw_params()
1143 * RT722_AIF3 with port = 6 for digital-mic capture in rt722_sdca_pcm_hw_params()
1145 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { in rt722_sdca_pcm_hw_params()
1147 if (dai->id == RT722_AIF1) in rt722_sdca_pcm_hw_params()
1148 port = 1; in rt722_sdca_pcm_hw_params()
1149 else if (dai->id == RT722_AIF2) in rt722_sdca_pcm_hw_params()
1150 port = 3; in rt722_sdca_pcm_hw_params()
1152 return -EINVAL; in rt722_sdca_pcm_hw_params()
1155 if (dai->id == RT722_AIF1) in rt722_sdca_pcm_hw_params()
1156 port = 2; in rt722_sdca_pcm_hw_params()
1157 else if (dai->id == RT722_AIF3) in rt722_sdca_pcm_hw_params()
1158 port = 6; in rt722_sdca_pcm_hw_params()
1160 return -EINVAL; in rt722_sdca_pcm_hw_params()
1168 port_config.ch_mask = GENMASK(num_channels - 1, 0); in rt722_sdca_pcm_hw_params()
1169 port_config.num = port; in rt722_sdca_pcm_hw_params()
1171 retval = sdw_stream_add_slave(rt722->slave, &stream_config, in rt722_sdca_pcm_hw_params()
1174 dev_err(dai->dev, "%s: Unable to configure port\n", __func__); in rt722_sdca_pcm_hw_params()
1179 dev_err(component->dev, "%s: Unsupported channels %d\n", in rt722_sdca_pcm_hw_params()
1181 return -EINVAL; in rt722_sdca_pcm_hw_params()
1199 dev_err(component->dev, "%s: Rate %d is not supported\n", in rt722_sdca_pcm_hw_params()
1201 return -EINVAL; in rt722_sdca_pcm_hw_params()
1205 if (dai->id == RT722_AIF1) { in rt722_sdca_pcm_hw_params()
1206 regmap_write(rt722->regmap, in rt722_sdca_pcm_hw_params()
1209 regmap_write(rt722->regmap, in rt722_sdca_pcm_hw_params()
1214 if (dai->id == RT722_AIF2) in rt722_sdca_pcm_hw_params()
1215 regmap_write(rt722->regmap, in rt722_sdca_pcm_hw_params()
1219 if (dai->id == RT722_AIF3) in rt722_sdca_pcm_hw_params()
1220 regmap_write(rt722->regmap, in rt722_sdca_pcm_hw_params()
1227 static int rt722_sdca_pcm_hw_free(struct snd_pcm_substream *substream, in rt722_sdca_pcm_hw_free()
1230 struct snd_soc_component *component = dai->component; in rt722_sdca_pcm_hw_free()
1235 if (!rt722->slave) in rt722_sdca_pcm_hw_free()
1236 return -EINVAL; in rt722_sdca_pcm_hw_free()
1238 sdw_stream_remove_slave(rt722->slave, sdw_stream); in rt722_sdca_pcm_hw_free()
1256 .name = "rt722-sdca-aif1",
1275 .name = "rt722-sdca-aif2",
1287 .name = "rt722-sdca-aif3",
1300 int rt722_sdca_init(struct device *dev, struct regmap *regmap, struct sdw_slave *slave) in rt722_sdca_init()
1306 return -ENOMEM; in rt722_sdca_init()
1309 rt722->slave = slave; in rt722_sdca_init()
1310 rt722->regmap = regmap; in rt722_sdca_init()
1312 regcache_cache_only(rt722->regmap, true); in rt722_sdca_init()
1314 mutex_init(&rt722->calibrate_mutex); in rt722_sdca_init()
1315 mutex_init(&rt722->disable_irq_lock); in rt722_sdca_init()
1317 INIT_DELAYED_WORK(&rt722->jack_detect_work, rt722_sdca_jack_detect_handler); in rt722_sdca_init()
1318 INIT_DELAYED_WORK(&rt722->jack_btn_check_work, rt722_sdca_btn_check_handler); in rt722_sdca_init()
1324 rt722->hw_init = false; in rt722_sdca_init()
1325 rt722->first_hw_init = false; in rt722_sdca_init()
1326 rt722->fu1e_dapm_mute = true; in rt722_sdca_init()
1327 rt722->fu0f_dapm_mute = true; in rt722_sdca_init()
1328 rt722->fu0f_mixer_l_mute = rt722->fu0f_mixer_r_mute = true; in rt722_sdca_init()
1329 rt722->fu1e_mixer_mute[0] = rt722->fu1e_mixer_mute[1] = in rt722_sdca_init()
1330 rt722->fu1e_mixer_mute[2] = rt722->fu1e_mixer_mute[3] = true; in rt722_sdca_init()
1338 unsigned int mic_func_status; in rt722_sdca_dmic_preset()
1339 struct device *dev = &rt722->slave->dev; in rt722_sdca_dmic_preset()
1341 regmap_read(rt722->regmap, in rt722_sdca_dmic_preset()
1345 if ((mic_func_status & FUNCTION_NEEDS_INITIALIZATION) || (!rt722->first_hw_init)) { in rt722_sdca_dmic_preset()
1374 regmap_write(rt722->regmap, in rt722_sdca_dmic_preset()
1378 regmap_write(rt722->regmap, 0x2f5c, 0x25); in rt722_sdca_dmic_preset()
1380 regmap_write(rt722->regmap, 0x2f03, 0x06); in rt722_sdca_dmic_preset()
1383 regmap_write(rt722->regmap, in rt722_sdca_dmic_preset()
1391 unsigned int amp_func_status; in rt722_sdca_amp_preset()
1392 struct device *dev = &rt722->slave->dev; in rt722_sdca_amp_preset()
1394 regmap_read(rt722->regmap, in rt722_sdca_amp_preset()
1398 if ((amp_func_status & FUNCTION_NEEDS_INITIALIZATION) || (!rt722->first_hw_init)) { in rt722_sdca_amp_preset()
1415 regmap_write(rt722->regmap, in rt722_sdca_amp_preset()
1420 regmap_write(rt722->regmap, in rt722_sdca_amp_preset()
1428 int loop_check, chk_cnt = 100, ret; in rt722_sdca_jack_preset()
1429 unsigned int calib_status = 0; in rt722_sdca_jack_preset()
1430 unsigned int jack_func_status; in rt722_sdca_jack_preset()
1431 struct device *dev = &rt722->slave->dev; in rt722_sdca_jack_preset()
1433 regmap_read(rt722->regmap, in rt722_sdca_jack_preset()
1437 if ((jack_func_status & FUNCTION_NEEDS_INITIALIZATION) || (!rt722->first_hw_init)) { in rt722_sdca_jack_preset()
1456 /* Set JD de-bounce clock control */ in rt722_sdca_jack_preset()
1474 dev_dbg(&rt722->slave->dev, "calibration failed!, ret=%d\n", ret); in rt722_sdca_jack_preset()
1480 dev_dbg(&rt722->slave->dev, "%s, calibration time-out!\n", __func__); in rt722_sdca_jack_preset()
1499 regmap_write(rt722->regmap, 0x2f58, 0x07); in rt722_sdca_jack_preset()
1500 regmap_write(rt722->regmap, 0x2f03, 0x06); in rt722_sdca_jack_preset()
1506 /* Release HP-JD, EN_CBJ_TIE_GL/R open, en_osw gating auto done bit */ in rt722_sdca_jack_preset()
1511 regmap_write(rt722->regmap, in rt722_sdca_jack_preset()
1517 int rt722_sdca_io_init(struct device *dev, struct sdw_slave *slave) in rt722_sdca_io_init()
1521 rt722->disable_irq = false; in rt722_sdca_io_init()
1523 if (rt722->hw_init) in rt722_sdca_io_init()
1526 regcache_cache_only(rt722->regmap, false); in rt722_sdca_io_init()
1527 if (rt722->first_hw_init) { in rt722_sdca_io_init()
1528 regcache_cache_bypass(rt722->regmap, true); in rt722_sdca_io_init()
1535 pm_runtime_set_autosuspend_delay(&slave->dev, 3000); in rt722_sdca_io_init()
1536 pm_runtime_use_autosuspend(&slave->dev); in rt722_sdca_io_init()
1539 pm_runtime_set_active(&slave->dev); in rt722_sdca_io_init()
1542 pm_runtime_mark_last_busy(&slave->dev); in rt722_sdca_io_init()
1544 pm_runtime_enable(&slave->dev); in rt722_sdca_io_init()
1547 pm_runtime_get_noresume(&slave->dev); in rt722_sdca_io_init()
1553 if (rt722->first_hw_init) { in rt722_sdca_io_init()
1554 regcache_cache_bypass(rt722->regmap, false); in rt722_sdca_io_init()
1555 regcache_mark_dirty(rt722->regmap); in rt722_sdca_io_init()
1557 rt722->first_hw_init = true; in rt722_sdca_io_init()
1560 rt722->hw_init = true; in rt722_sdca_io_init()
1562 pm_runtime_mark_last_busy(&slave->dev); in rt722_sdca_io_init()
1563 pm_runtime_put_autosuspend(&slave->dev); in rt722_sdca_io_init()
1565 dev_dbg(&slave->dev, "%s hw_init complete\n", __func__); in rt722_sdca_io_init()