Lines Matching +full:adc +full:- +full:mux

1 // SPDX-License-Identifier: GPL-2.0-only
3 // rt721-sdca.c -- rt721 SDCA ALSA SoC audio driver
23 #include <sound/soc-dapm.h>
26 #include "rt721-sdca.h"
27 #include "rt-sdw-common.h"
35 if (!rt721->hs_jack) in rt721_sdca_jack_detect_handler()
38 if (!rt721->component->card || !rt721->component->card->instantiated) in rt721_sdca_jack_detect_handler()
42 if (rt721->scp_sdca_stat1 & SDW_SCP_SDCA_INT_SDCA_0) { in rt721_sdca_jack_detect_handler()
43 rt721->jack_type = rt_sdca_headset_detect(rt721->regmap, in rt721_sdca_jack_detect_handler()
45 if (rt721->jack_type < 0) in rt721_sdca_jack_detect_handler()
50 if (rt721->scp_sdca_stat2 & SDW_SCP_SDCA_INT_SDCA_8) in rt721_sdca_jack_detect_handler()
51 btn_type = rt_sdca_button_detect(rt721->regmap, in rt721_sdca_jack_detect_handler()
55 if (rt721->jack_type == 0) in rt721_sdca_jack_detect_handler()
58 dev_dbg(&rt721->slave->dev, in rt721_sdca_jack_detect_handler()
59 "in %s, jack_type=%d\n", __func__, rt721->jack_type); in rt721_sdca_jack_detect_handler()
60 dev_dbg(&rt721->slave->dev, in rt721_sdca_jack_detect_handler()
62 dev_dbg(&rt721->slave->dev, in rt721_sdca_jack_detect_handler()
64 rt721->scp_sdca_stat1, rt721->scp_sdca_stat2); in rt721_sdca_jack_detect_handler()
66 snd_soc_jack_report(rt721->hs_jack, rt721->jack_type | btn_type, in rt721_sdca_jack_detect_handler()
73 snd_soc_jack_report(rt721->hs_jack, rt721->jack_type, in rt721_sdca_jack_detect_handler()
79 &rt721->jack_btn_check_work, msecs_to_jiffies(200)); in rt721_sdca_jack_detect_handler()
91 ret = regmap_read(rt721->regmap, in rt721_sdca_btn_check_handler()
100 ret = regmap_read(rt721->regmap, in rt721_sdca_btn_check_handler()
107 ret = regmap_read(rt721->regmap, in rt721_sdca_btn_check_handler()
117 rt721->jack_type = 0; in rt721_sdca_btn_check_handler()
119 dev_dbg(&rt721->slave->dev, "%s, btn_type=0x%x\n", __func__, btn_type); in rt721_sdca_btn_check_handler()
120 snd_soc_jack_report(rt721->hs_jack, rt721->jack_type | btn_type, in rt721_sdca_btn_check_handler()
127 snd_soc_jack_report(rt721->hs_jack, rt721->jack_type, in rt721_sdca_btn_check_handler()
133 &rt721->jack_btn_check_work, msecs_to_jiffies(200)); in rt721_sdca_btn_check_handler()
144 rt_sdca_index_write(rt721->mbq_regmap, RT721_VENDOR_ANA_CTL, in rt721_sdca_dmic_preset()
146 rt_sdca_index_write(rt721->mbq_regmap, RT721_ANA_POW_PART, in rt721_sdca_dmic_preset()
148 rt_sdca_index_write(rt721->mbq_regmap, RT721_VENDOR_ANA_CTL, in rt721_sdca_dmic_preset()
150 rt_sdca_index_write(rt721->mbq_regmap, RT721_HDA_SDCA_FLOAT, in rt721_sdca_dmic_preset()
152 rt_sdca_index_write(rt721->mbq_regmap, RT721_HDA_SDCA_FLOAT, in rt721_sdca_dmic_preset()
154 rt_sdca_index_write(rt721->mbq_regmap, RT721_HDA_SDCA_FLOAT, in rt721_sdca_dmic_preset()
156 rt_sdca_index_write(rt721->mbq_regmap, RT721_HDA_SDCA_FLOAT, in rt721_sdca_dmic_preset()
158 rt_sdca_index_write(rt721->mbq_regmap, RT721_HDA_SDCA_FLOAT, in rt721_sdca_dmic_preset()
160 rt_sdca_index_write(rt721->mbq_regmap, RT721_HDA_SDCA_FLOAT, in rt721_sdca_dmic_preset()
162 rt_sdca_index_write(rt721->mbq_regmap, RT721_HDA_SDCA_FLOAT, in rt721_sdca_dmic_preset()
164 rt_sdca_index_write(rt721->mbq_regmap, RT721_HDA_SDCA_FLOAT, in rt721_sdca_dmic_preset()
166 rt_sdca_index_write(rt721->mbq_regmap, RT721_HDA_SDCA_FLOAT, in rt721_sdca_dmic_preset()
168 regmap_write(rt721->regmap, in rt721_sdca_dmic_preset()
171 regmap_write(rt721->mbq_regmap, 0x5910009, 0x2e01); in rt721_sdca_dmic_preset()
172 rt_sdca_index_write(rt721->mbq_regmap, RT721_RC_CALIB_CTRL, in rt721_sdca_dmic_preset()
174 rt_sdca_index_write(rt721->mbq_regmap, RT721_RC_CALIB_CTRL, in rt721_sdca_dmic_preset()
176 regmap_write(rt721->regmap, 0x2f5c, 0x25); in rt721_sdca_dmic_preset()
181 rt_sdca_index_write(rt721->mbq_regmap, RT721_VENDOR_ANA_CTL, in rt721_sdca_amp_preset()
183 rt_sdca_index_write(rt721->mbq_regmap, RT721_ANA_POW_PART, in rt721_sdca_amp_preset()
185 rt_sdca_index_write(rt721->mbq_regmap, RT721_VENDOR_ANA_CTL, in rt721_sdca_amp_preset()
187 regmap_write(rt721->mbq_regmap, 0x5810000, 0x6420); in rt721_sdca_amp_preset()
188 regmap_write(rt721->mbq_regmap, 0x5810000, 0x6421); in rt721_sdca_amp_preset()
189 regmap_write(rt721->mbq_regmap, 0x5810000, 0xe421); in rt721_sdca_amp_preset()
190 rt_sdca_index_write(rt721->mbq_regmap, RT721_HDA_SDCA_FLOAT, in rt721_sdca_amp_preset()
192 rt_sdca_index_write(rt721->mbq_regmap, RT721_VENDOR_REG, in rt721_sdca_amp_preset()
194 regmap_write(rt721->regmap, in rt721_sdca_amp_preset()
197 regmap_write(rt721->regmap, in rt721_sdca_amp_preset()
200 regmap_write(rt721->regmap, in rt721_sdca_amp_preset()
203 regmap_write(rt721->regmap, in rt721_sdca_amp_preset()
206 regmap_write(rt721->regmap, in rt721_sdca_amp_preset()
213 rt_sdca_index_write(rt721->mbq_regmap, RT721_VENDOR_ANA_CTL, in rt721_sdca_jack_preset()
215 rt_sdca_index_write(rt721->mbq_regmap, RT721_ANA_POW_PART, in rt721_sdca_jack_preset()
217 rt_sdca_index_write(rt721->mbq_regmap, RT721_VENDOR_ANA_CTL, in rt721_sdca_jack_preset()
219 rt_sdca_index_write(rt721->mbq_regmap, RT721_HDA_SDCA_FLOAT, in rt721_sdca_jack_preset()
221 rt_sdca_index_write(rt721->mbq_regmap, RT721_HDA_SDCA_FLOAT, in rt721_sdca_jack_preset()
223 rt_sdca_index_write(rt721->mbq_regmap, RT721_HDA_SDCA_FLOAT, in rt721_sdca_jack_preset()
225 rt_sdca_index_write(rt721->mbq_regmap, RT721_HDA_SDCA_FLOAT, in rt721_sdca_jack_preset()
227 rt_sdca_index_write(rt721->mbq_regmap, RT721_HDA_SDCA_FLOAT, in rt721_sdca_jack_preset()
229 rt_sdca_index_write(rt721->mbq_regmap, RT721_JD_CTRL, in rt721_sdca_jack_preset()
231 rt_sdca_index_write(rt721->mbq_regmap, RT721_RC_CALIB_CTRL, in rt721_sdca_jack_preset()
233 rt_sdca_index_write(rt721->mbq_regmap, RT721_RC_CALIB_CTRL, in rt721_sdca_jack_preset()
235 rt_sdca_index_write(rt721->mbq_regmap, RT721_VENDOR_ANA_CTL, in rt721_sdca_jack_preset()
237 regmap_write(rt721->mbq_regmap, 0x5810035, 0x0036); in rt721_sdca_jack_preset()
238 regmap_write(rt721->mbq_regmap, 0x5810030, 0xee00); in rt721_sdca_jack_preset()
239 rt_sdca_index_write(rt721->mbq_regmap, RT721_CAP_PORT_CTRL, in rt721_sdca_jack_preset()
241 regmap_write(rt721->mbq_regmap, 0x5810000, 0x0021); in rt721_sdca_jack_preset()
242 regmap_write(rt721->mbq_regmap, 0x5810000, 0x8021); in rt721_sdca_jack_preset()
243 rt_sdca_index_write(rt721->mbq_regmap, RT721_CAP_PORT_CTRL, in rt721_sdca_jack_preset()
245 regmap_write(rt721->mbq_regmap, 0x5b10007, 0x2000); in rt721_sdca_jack_preset()
246 regmap_write(rt721->mbq_regmap, 0x5B10017, 0x1b0f); in rt721_sdca_jack_preset()
247 rt_sdca_index_write(rt721->mbq_regmap, RT721_CBJ_CTRL, in rt721_sdca_jack_preset()
249 rt_sdca_index_write(rt721->mbq_regmap, RT721_CAP_PORT_CTRL, in rt721_sdca_jack_preset()
251 rt_sdca_index_write(rt721->mbq_regmap, RT721_VENDOR_ANA_CTL, in rt721_sdca_jack_preset()
253 regmap_write(rt721->mbq_regmap, 0x310400, 0x3023); in rt721_sdca_jack_preset()
254 rt_sdca_index_write(rt721->mbq_regmap, RT721_VENDOR_ANA_CTL, in rt721_sdca_jack_preset()
256 rt_sdca_index_write(rt721->mbq_regmap, RT721_VENDOR_ANA_CTL, in rt721_sdca_jack_preset()
258 regmap_write(rt721->mbq_regmap, 0x310401, 0x3000); in rt721_sdca_jack_preset()
259 regmap_write(rt721->mbq_regmap, 0x310402, 0x1b00); in rt721_sdca_jack_preset()
260 regmap_write(rt721->mbq_regmap, 0x310300, 0x000f); in rt721_sdca_jack_preset()
261 regmap_write(rt721->mbq_regmap, 0x310301, 0x3000); in rt721_sdca_jack_preset()
262 regmap_write(rt721->mbq_regmap, 0x310302, 0x1b00); in rt721_sdca_jack_preset()
263 rt_sdca_index_write(rt721->mbq_regmap, RT721_VENDOR_ANA_CTL, in rt721_sdca_jack_preset()
265 rt_sdca_index_write(rt721->mbq_regmap, RT721_DAC_CTRL, in rt721_sdca_jack_preset()
267 rt_sdca_index_write(rt721->mbq_regmap, RT721_DAC_CTRL, in rt721_sdca_jack_preset()
269 rt_sdca_index_write(rt721->mbq_regmap, RT721_ANA_POW_PART, in rt721_sdca_jack_preset()
271 rt_sdca_index_write(rt721->mbq_regmap, RT721_ANA_POW_PART, in rt721_sdca_jack_preset()
273 rt_sdca_index_write(rt721->mbq_regmap, RT721_HDA_SDCA_FLOAT, in rt721_sdca_jack_preset()
275 rt_sdca_index_write(rt721->mbq_regmap, RT721_HDA_SDCA_FLOAT, in rt721_sdca_jack_preset()
277 rt_sdca_index_write(rt721->mbq_regmap, RT721_HDA_SDCA_FLOAT, in rt721_sdca_jack_preset()
279 rt_sdca_index_write(rt721->mbq_regmap, RT721_HDA_SDCA_FLOAT, in rt721_sdca_jack_preset()
281 regmap_write(rt721->regmap, 0x2f58, 0x07); in rt721_sdca_jack_preset()
286 mutex_lock(&rt721->calibrate_mutex); in rt721_sdca_jack_init()
287 if (rt721->hs_jack) { in rt721_sdca_jack_init()
288 sdw_write_no_pm(rt721->slave, SDW_SCP_SDCA_INTMASK1, in rt721_sdca_jack_init()
290 sdw_write_no_pm(rt721->slave, SDW_SCP_SDCA_INTMASK2, in rt721_sdca_jack_init()
292 dev_dbg(&rt721->slave->dev, "in %s enable\n", __func__); in rt721_sdca_jack_init()
293 rt_sdca_index_write(rt721->mbq_regmap, RT721_HDA_SDCA_FLOAT, in rt721_sdca_jack_init()
295 regmap_write(rt721->regmap, in rt721_sdca_jack_init()
298 regmap_write(rt721->regmap, in rt721_sdca_jack_init()
301 rt_sdca_index_write(rt721->mbq_regmap, RT721_HDA_SDCA_FLOAT, in rt721_sdca_jack_init()
303 rt_sdca_index_update_bits(rt721->mbq_regmap, RT721_HDA_SDCA_FLOAT, in rt721_sdca_jack_init()
306 mutex_unlock(&rt721->calibrate_mutex); in rt721_sdca_jack_init()
315 rt721->hs_jack = hs_jack; in rt721_sdca_set_jack_detect()
317 ret = pm_runtime_resume_and_get(component->dev); in rt721_sdca_set_jack_detect()
319 if (ret != -EACCES) { in rt721_sdca_set_jack_detect()
320 dev_err(component->dev, "%s: failed to resume %d\n", __func__, ret); in rt721_sdca_set_jack_detect()
324 dev_dbg(component->dev, "%s: skipping jack init for now\n", __func__); in rt721_sdca_set_jack_detect()
330 pm_runtime_mark_last_busy(component->dev); in rt721_sdca_set_jack_detect()
331 pm_runtime_put_autosuspend(component->dev); in rt721_sdca_set_jack_detect()
336 /* For SDCA control DAC/ADC Gain */
342 (struct soc_mixer_control *)kcontrol->private_value; in rt721_sdca_set_gain_put()
351 if (strstr(ucontrol->id.name, "FU1E Capture Volume") || in rt721_sdca_set_gain_put()
352 strstr(ucontrol->id.name, "FU0F Capture Volume")) in rt721_sdca_set_gain_put()
355 regmap_read(rt721->mbq_regmap, mc->reg, &lvalue); in rt721_sdca_set_gain_put()
356 regmap_read(rt721->mbq_regmap, mc->rreg, &rvalue); in rt721_sdca_set_gain_put()
359 gain_l_val = ucontrol->value.integer.value[0]; in rt721_sdca_set_gain_put()
360 if (gain_l_val > mc->max) in rt721_sdca_set_gain_put()
361 gain_l_val = mc->max; in rt721_sdca_set_gain_put()
363 if (mc->shift == 8) { in rt721_sdca_set_gain_put()
366 } else if (mc->shift == 1) { in rt721_sdca_set_gain_put()
371 gain_l_val = (gain_l_val - 1) * tendA; in rt721_sdca_set_gain_put()
373 /* ADC/DAC gain */ in rt721_sdca_set_gain_put()
375 gain_l_val = 0x1e00 - ((mc->max - gain_l_val) * interval_offset); in rt721_sdca_set_gain_put()
377 gain_l_val = 0 - ((mc->max - gain_l_val) * interval_offset); in rt721_sdca_set_gain_put()
382 gain_r_val = ucontrol->value.integer.value[1]; in rt721_sdca_set_gain_put()
383 if (gain_r_val > mc->max) in rt721_sdca_set_gain_put()
384 gain_r_val = mc->max; in rt721_sdca_set_gain_put()
386 if (mc->shift == 8) { in rt721_sdca_set_gain_put()
389 } else if (mc->shift == 1) { in rt721_sdca_set_gain_put()
394 gain_r_val = (gain_r_val - 1) * tendA; in rt721_sdca_set_gain_put()
396 /* ADC/DAC gain */ in rt721_sdca_set_gain_put()
398 gain_r_val = 0x1e00 - ((mc->max - gain_r_val) * interval_offset); in rt721_sdca_set_gain_put()
400 gain_r_val = 0 - ((mc->max - gain_r_val) * interval_offset); in rt721_sdca_set_gain_put()
410 regmap_write(rt721->mbq_regmap, mc->reg, gain_l_val); in rt721_sdca_set_gain_put()
413 regmap_write(rt721->mbq_regmap, mc->rreg, gain_r_val); in rt721_sdca_set_gain_put()
415 regmap_read(rt721->mbq_regmap, mc->reg, &read_l); in rt721_sdca_set_gain_put()
416 regmap_read(rt721->mbq_regmap, mc->rreg, &read_r); in rt721_sdca_set_gain_put()
420 return -EIO; in rt721_sdca_set_gain_put()
429 (struct soc_mixer_control *)kcontrol->private_value; in rt721_sdca_set_gain_get()
435 if (strstr(ucontrol->id.name, "FU1E Capture Volume") || in rt721_sdca_set_gain_get()
436 strstr(ucontrol->id.name, "FU0F Capture Volume")) in rt721_sdca_set_gain_get()
439 regmap_read(rt721->mbq_regmap, mc->reg, &read_l); in rt721_sdca_set_gain_get()
440 regmap_read(rt721->mbq_regmap, mc->rreg, &read_r); in rt721_sdca_set_gain_get()
442 if (mc->shift == 8) /* boost gain */ in rt721_sdca_set_gain_get()
446 ctl_l = mc->max - (((0x1e00 - read_l) & 0xffff) / interval_offset); in rt721_sdca_set_gain_get()
448 ctl_l = mc->max - (((0 - read_l) & 0xffff) / interval_offset); in rt721_sdca_set_gain_get()
452 if (mc->shift == 8) /* boost gain */ in rt721_sdca_set_gain_get()
454 else { /* ADC/DAC gain */ in rt721_sdca_set_gain_get()
456 ctl_r = mc->max - (((0x1e00 - read_r) & 0xffff) / interval_offset); in rt721_sdca_set_gain_get()
458 ctl_r = mc->max - (((0 - read_r) & 0xffff) / interval_offset); in rt721_sdca_set_gain_get()
464 ucontrol->value.integer.value[0] = ctl_l; in rt721_sdca_set_gain_get()
465 ucontrol->value.integer.value[1] = ctl_r; in rt721_sdca_set_gain_get()
475 for (i = 0; i < ARRAY_SIZE(rt721->fu1e_mixer_mute); i++) { in rt721_sdca_set_fu1e_capture_ctl()
476 ch_mute = rt721->fu1e_dapm_mute || rt721->fu1e_mixer_mute[i]; in rt721_sdca_set_fu1e_capture_ctl()
477 err = regmap_write(rt721->regmap, in rt721_sdca_set_fu1e_capture_ctl()
493 (struct rt721_sdca_dmic_kctrl_priv *)kcontrol->private_value; in rt721_sdca_fu1e_capture_get()
496 for (i = 0; i < p->count; i++) in rt721_sdca_fu1e_capture_get()
497 ucontrol->value.integer.value[i] = !rt721->fu1e_mixer_mute[i]; in rt721_sdca_fu1e_capture_get()
508 (struct rt721_sdca_dmic_kctrl_priv *)kcontrol->private_value; in rt721_sdca_fu1e_capture_put()
511 for (i = 0; i < p->count; i++) { in rt721_sdca_fu1e_capture_put()
512 if (rt721->fu1e_mixer_mute[i] != !ucontrol->value.integer.value[i]) in rt721_sdca_fu1e_capture_put()
514 rt721->fu1e_mixer_mute[i] = !ucontrol->value.integer.value[i]; in rt721_sdca_fu1e_capture_put()
529 ch_l = (rt721->fu0f_dapm_mute || rt721->fu0f_mixer_l_mute) ? 0x01 : 0x00; in rt721_sdca_set_fu0f_capture_ctl()
530 ch_r = (rt721->fu0f_dapm_mute || rt721->fu0f_mixer_r_mute) ? 0x01 : 0x00; in rt721_sdca_set_fu0f_capture_ctl()
532 err = regmap_write(rt721->regmap, in rt721_sdca_set_fu0f_capture_ctl()
538 err = regmap_write(rt721->regmap, in rt721_sdca_set_fu0f_capture_ctl()
553 ucontrol->value.integer.value[0] = !rt721->fu0f_mixer_l_mute; in rt721_sdca_fu0f_capture_get()
554 ucontrol->value.integer.value[1] = !rt721->fu0f_mixer_r_mute; in rt721_sdca_fu0f_capture_get()
565 if (rt721->fu0f_mixer_l_mute != !ucontrol->value.integer.value[0] || in rt721_sdca_fu0f_capture_put()
566 rt721->fu0f_mixer_r_mute != !ucontrol->value.integer.value[1]) in rt721_sdca_fu0f_capture_put()
569 rt721->fu0f_mixer_l_mute = !ucontrol->value.integer.value[0]; in rt721_sdca_fu0f_capture_put()
570 rt721->fu0f_mixer_r_mute = !ucontrol->value.integer.value[1]; in rt721_sdca_fu0f_capture_put()
582 (struct rt721_sdca_dmic_kctrl_priv *)kcontrol->private_value; in rt721_sdca_fu_info()
584 if (p->max == 1) in rt721_sdca_fu_info()
585 uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; in rt721_sdca_fu_info()
587 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; in rt721_sdca_fu_info()
588 uinfo->count = p->count; in rt721_sdca_fu_info()
589 uinfo->value.integer.min = 0; in rt721_sdca_fu_info()
590 uinfo->value.integer.max = p->max; in rt721_sdca_fu_info()
600 (struct rt721_sdca_dmic_kctrl_priv *)kcontrol->private_value; in rt721_sdca_dmic_set_gain_get()
607 if (strstr(ucontrol->id.name, "FU1E Capture Volume")) in rt721_sdca_dmic_set_gain_get()
611 for (i = 0; i < p->count; i++) { in rt721_sdca_dmic_set_gain_get()
612 regmap_read(rt721->mbq_regmap, p->reg_base + i, &regvalue); in rt721_sdca_dmic_set_gain_get()
616 else /* ADC gain */ in rt721_sdca_dmic_set_gain_get()
617 ctl = p->max - (((vol_max - regvalue) & 0xffff) / interval_offset); in rt721_sdca_dmic_set_gain_get()
619 ucontrol->value.integer.value[i] = ctl; in rt721_sdca_dmic_set_gain_get()
630 (struct rt721_sdca_dmic_kctrl_priv *)kcontrol->private_value; in rt721_sdca_dmic_set_gain_put()
640 if (strstr(ucontrol->id.name, "FU1E Capture Volume")) in rt721_sdca_dmic_set_gain_put()
644 for (i = 0; i < p->count; i++) { in rt721_sdca_dmic_set_gain_put()
645 regmap_read(rt721->mbq_regmap, p->reg_base + i, &regvalue[i]); in rt721_sdca_dmic_set_gain_put()
647 gain_val[i] = ucontrol->value.integer.value[i]; in rt721_sdca_dmic_set_gain_put()
648 if (gain_val[i] > p->max) in rt721_sdca_dmic_set_gain_put()
649 gain_val[i] = p->max; in rt721_sdca_dmic_set_gain_put()
653 else { /* ADC gain */ in rt721_sdca_dmic_set_gain_put()
654 gain_val[i] = vol_max - ((p->max - gain_val[i]) * interval_offset); in rt721_sdca_dmic_set_gain_put()
665 for (i = 0; i < p->count; i++) { in rt721_sdca_dmic_set_gain_put()
666 err = regmap_write(rt721->mbq_regmap, p->reg_base + i, gain_val[i]); in rt721_sdca_dmic_set_gain_put()
668 dev_err(&rt721->slave->dev, "%#08x can't be set\n", p->reg_base + i); in rt721_sdca_dmic_set_gain_put()
674 static const DECLARE_TLV_DB_SCALE(out_vol_tlv, -6525, 75, 0);
675 static const DECLARE_TLV_DB_SCALE(mic_vol_tlv, -1725, 75, 0);
677 static const DECLARE_TLV_DB_SCALE(mic2_boost_vol_tlv, -200, 200, 0);
734 if (strstr(ucontrol->id.name, "ADC 09 Mux")) { in rt721_sdca_adc_mux_get()
737 } else if (strstr(ucontrol->id.name, "ADC 08 R Mux")) { in rt721_sdca_adc_mux_get()
740 } else if (strstr(ucontrol->id.name, "ADC 08 L Mux")) { in rt721_sdca_adc_mux_get()
743 } else if (strstr(ucontrol->id.name, "ADC 10 R Mux")) { in rt721_sdca_adc_mux_get()
746 } else if (strstr(ucontrol->id.name, "ADC 10 L Mux")) { in rt721_sdca_adc_mux_get()
749 } else if (strstr(ucontrol->id.name, "ADC 07 R Mux")) { in rt721_sdca_adc_mux_get()
752 } else if (strstr(ucontrol->id.name, "ADC 07 L Mux")) { in rt721_sdca_adc_mux_get()
756 return -EINVAL; in rt721_sdca_adc_mux_get()
758 rt_sdca_index_read(rt721->mbq_regmap, RT721_HDA_SDCA_FLOAT, in rt721_sdca_adc_mux_get()
761 ucontrol->value.enumerated.item[0] = (val >> mask_sft) & mask; in rt721_sdca_adc_mux_get()
774 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; in rt721_sdca_adc_mux_put()
775 unsigned int *item = ucontrol->value.enumerated.item; in rt721_sdca_adc_mux_put()
779 if (item[0] >= e->items) in rt721_sdca_adc_mux_put()
780 return -EINVAL; in rt721_sdca_adc_mux_put()
782 if (strstr(ucontrol->id.name, "ADC 09 Mux")) { in rt721_sdca_adc_mux_put()
785 } else if (strstr(ucontrol->id.name, "ADC 08 R Mux")) { in rt721_sdca_adc_mux_put()
788 } else if (strstr(ucontrol->id.name, "ADC 08 L Mux")) { in rt721_sdca_adc_mux_put()
791 } else if (strstr(ucontrol->id.name, "ADC 10 R Mux")) { in rt721_sdca_adc_mux_put()
794 } else if (strstr(ucontrol->id.name, "ADC 10 L Mux")) { in rt721_sdca_adc_mux_put()
797 } else if (strstr(ucontrol->id.name, "ADC 07 R Mux")) { in rt721_sdca_adc_mux_put()
800 } else if (strstr(ucontrol->id.name, "ADC 07 L Mux")) { in rt721_sdca_adc_mux_put()
804 return -EINVAL; in rt721_sdca_adc_mux_put()
806 val = snd_soc_enum_item_to_val(e, item[0]) << e->shift_l; in rt721_sdca_adc_mux_put()
807 rt_sdca_index_read(rt721->mbq_regmap, RT721_HDA_SDCA_FLOAT, in rt721_sdca_adc_mux_put()
810 if (strstr(ucontrol->id.name, "ADC 09 Mux")) in rt721_sdca_adc_mux_put()
821 rt_sdca_index_read(rt721->mbq_regmap, RT721_HDA_SDCA_FLOAT, in rt721_sdca_adc_mux_put()
823 rt_sdca_index_update_bits(rt721->mbq_regmap, RT721_HDA_SDCA_FLOAT, in rt721_sdca_adc_mux_put()
852 SOC_DAPM_ENUM_EXT("ADC 09 Mux", rt721_adc09_enum,
855 SOC_DAPM_ENUM_EXT("ADC 08 R Mux", rt721_dmic_enum,
858 SOC_DAPM_ENUM_EXT("ADC 08 L Mux", rt721_dmic_enum,
861 SOC_DAPM_ENUM_EXT("ADC 10 R Mux", rt721_dmic_enum,
864 SOC_DAPM_ENUM_EXT("ADC 10 L Mux", rt721_dmic_enum,
867 SOC_DAPM_ENUM_EXT("ADC 07 R Mux", rt721_dmic_enum,
870 SOC_DAPM_ENUM_EXT("ADC 07 L Mux", rt721_dmic_enum,
878 snd_soc_dapm_to_component(w->dapm); in rt721_sdca_fu42_event()
885 regmap_write(rt721->regmap, in rt721_sdca_fu42_event()
888 regmap_write(rt721->regmap, in rt721_sdca_fu42_event()
893 regmap_write(rt721->regmap, in rt721_sdca_fu42_event()
896 regmap_write(rt721->regmap, in rt721_sdca_fu42_event()
908 snd_soc_dapm_to_component(w->dapm); in rt721_sdca_fu21_event()
914 regmap_write(rt721->regmap, in rt721_sdca_fu21_event()
917 regmap_write(rt721->regmap, in rt721_sdca_fu21_event()
922 regmap_write(rt721->regmap, in rt721_sdca_fu21_event()
925 regmap_write(rt721->regmap, in rt721_sdca_fu21_event()
937 snd_soc_dapm_to_component(w->dapm); in rt721_sdca_fu23_event()
943 regmap_write(rt721->regmap, in rt721_sdca_fu23_event()
946 regmap_write(rt721->regmap, in rt721_sdca_fu23_event()
951 regmap_write(rt721->regmap, in rt721_sdca_fu23_event()
954 regmap_write(rt721->regmap, in rt721_sdca_fu23_event()
966 snd_soc_dapm_to_component(w->dapm); in rt721_sdca_fu113_event()
971 rt721->fu1e_dapm_mute = false; in rt721_sdca_fu113_event()
975 rt721->fu1e_dapm_mute = true; in rt721_sdca_fu113_event()
986 snd_soc_dapm_to_component(w->dapm); in rt721_sdca_fu36_event()
991 rt721->fu0f_dapm_mute = false; in rt721_sdca_fu36_event()
995 rt721->fu0f_dapm_mute = true; in rt721_sdca_fu36_event()
1006 snd_soc_dapm_to_component(w->dapm); in rt721_sdca_pde47_event()
1012 regmap_write(rt721->regmap, in rt721_sdca_pde47_event()
1017 regmap_write(rt721->regmap, in rt721_sdca_pde47_event()
1029 snd_soc_dapm_to_component(w->dapm); in rt721_sdca_pde41_event()
1035 regmap_write(rt721->regmap, in rt721_sdca_pde41_event()
1040 regmap_write(rt721->regmap, in rt721_sdca_pde41_event()
1052 snd_soc_dapm_to_component(w->dapm); in rt721_sdca_pde11_event()
1058 regmap_write(rt721->regmap, in rt721_sdca_pde11_event()
1063 regmap_write(rt721->regmap, in rt721_sdca_pde11_event()
1075 snd_soc_dapm_to_component(w->dapm); in rt721_sdca_pde34_event()
1081 regmap_write(rt721->regmap, in rt721_sdca_pde34_event()
1086 regmap_write(rt721->regmap, in rt721_sdca_pde34_event()
1131 SND_SOC_DAPM_MUX("ADC 09 Mux", SND_SOC_NOPM, 0, 0,
1133 SND_SOC_DAPM_MUX("ADC 08 R Mux", SND_SOC_NOPM, 0, 0,
1135 SND_SOC_DAPM_MUX("ADC 08 L Mux", SND_SOC_NOPM, 0, 0,
1137 SND_SOC_DAPM_MUX("ADC 10 R Mux", SND_SOC_NOPM, 0, 0,
1139 SND_SOC_DAPM_MUX("ADC 10 L Mux", SND_SOC_NOPM, 0, 0,
1141 SND_SOC_DAPM_MUX("ADC 07 R Mux", SND_SOC_NOPM, 0, 0,
1143 SND_SOC_DAPM_MUX("ADC 07 L Mux", SND_SOC_NOPM, 0, 0,
1157 {"ADC 09 Mux", "MIC2", "MIC2"},
1158 {"ADC 09 Mux", "LINE1", "LINE1"},
1159 {"ADC 09 Mux", "LINE2", "LINE2"},
1160 {"ADC 07 R Mux", "DMIC1 RE", "DMIC1_2"},
1161 {"ADC 07 R Mux", "DMIC1 FE", "DMIC1_2"},
1162 {"ADC 07 R Mux", "DMIC2 RE", "DMIC3_4"},
1163 {"ADC 07 R Mux", "DMIC2 FE", "DMIC3_4"},
1164 {"ADC 07 L Mux", "DMIC1 RE", "DMIC1_2"},
1165 {"ADC 07 L Mux", "DMIC1 FE", "DMIC1_2"},
1166 {"ADC 07 L Mux", "DMIC2 RE", "DMIC3_4"},
1167 {"ADC 07 L Mux", "DMIC2 FE", "DMIC3_4"},
1168 {"ADC 08 R Mux", "DMIC1 RE", "DMIC1_2"},
1169 {"ADC 08 R Mux", "DMIC1 FE", "DMIC1_2"},
1170 {"ADC 08 R Mux", "DMIC2 RE", "DMIC3_4"},
1171 {"ADC 08 R Mux", "DMIC2 FE", "DMIC3_4"},
1172 {"ADC 08 L Mux", "DMIC1 RE", "DMIC1_2"},
1173 {"ADC 08 L Mux", "DMIC1 FE", "DMIC1_2"},
1174 {"ADC 08 L Mux", "DMIC2 RE", "DMIC3_4"},
1175 {"ADC 08 L Mux", "DMIC2 FE", "DMIC3_4"},
1176 {"ADC 10 R Mux", "DMIC1 RE", "DMIC1_2"},
1177 {"ADC 10 R Mux", "DMIC1 FE", "DMIC1_2"},
1178 {"ADC 10 R Mux", "DMIC2 RE", "DMIC3_4"},
1179 {"ADC 10 R Mux", "DMIC2 FE", "DMIC3_4"},
1180 {"ADC 10 L Mux", "DMIC1 RE", "DMIC1_2"},
1181 {"ADC 10 L Mux", "DMIC1 FE", "DMIC1_2"},
1182 {"ADC 10 L Mux", "DMIC2 RE", "DMIC3_4"},
1183 {"ADC 10 L Mux", "DMIC2 FE", "DMIC3_4"},
1185 {"FU 36", NULL, "ADC 09 Mux"},
1187 {"FU 113", NULL, "ADC 07 R Mux"},
1188 {"FU 113", NULL, "ADC 07 L Mux"},
1189 {"FU 113", NULL, "ADC 10 R Mux"},
1190 {"FU 113", NULL, "ADC 10 L Mux"},
1203 device_property_read_u32(dev, "realtek,jd-src", &rt721->jd_src); in rt721_sdca_parse_dt()
1213 rt721_sdca_parse_dt(rt721, &rt721->slave->dev); in rt721_sdca_probe()
1214 rt721->component = component; in rt721_sdca_probe()
1216 ret = pm_runtime_resume(component->dev); in rt721_sdca_probe()
1217 if (ret < 0 && ret != -EACCES) in rt721_sdca_probe()
1253 struct snd_soc_component *component = dai->component; in rt721_sdca_pcm_hw_params()
1262 dev_dbg(dai->dev, "%s %s", __func__, dai->name); in rt721_sdca_pcm_hw_params()
1266 return -EINVAL; in rt721_sdca_pcm_hw_params()
1268 if (!rt721->slave) in rt721_sdca_pcm_hw_params()
1269 return -EINVAL; in rt721_sdca_pcm_hw_params()
1273 * RT721_AIF1 with port = 2 for headset-mic capture in rt721_sdca_pcm_hw_params()
1275 * RT721_AIF3 with port = 6 for digital-mic capture in rt721_sdca_pcm_hw_params()
1277 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { in rt721_sdca_pcm_hw_params()
1279 if (dai->id == RT721_AIF1) in rt721_sdca_pcm_hw_params()
1281 else if (dai->id == RT721_AIF2) in rt721_sdca_pcm_hw_params()
1284 return -EINVAL; in rt721_sdca_pcm_hw_params()
1287 if (dai->id == RT721_AIF1) in rt721_sdca_pcm_hw_params()
1289 else if (dai->id == RT721_AIF3) in rt721_sdca_pcm_hw_params()
1292 return -EINVAL; in rt721_sdca_pcm_hw_params()
1300 port_config.ch_mask = GENMASK(num_channels - 1, 0); in rt721_sdca_pcm_hw_params()
1303 retval = sdw_stream_add_slave(rt721->slave, &stream_config, in rt721_sdca_pcm_hw_params()
1306 dev_err(dai->dev, "Unable to configure port\n"); in rt721_sdca_pcm_hw_params()
1311 dev_err(component->dev, "Unsupported channels %d\n", in rt721_sdca_pcm_hw_params()
1313 return -EINVAL; in rt721_sdca_pcm_hw_params()
1349 dev_err(component->dev, "Rate %d is not supported\n", in rt721_sdca_pcm_hw_params()
1351 return -EINVAL; in rt721_sdca_pcm_hw_params()
1355 if (dai->id == RT721_AIF1) { in rt721_sdca_pcm_hw_params()
1356 regmap_write(rt721->regmap, in rt721_sdca_pcm_hw_params()
1359 regmap_write(rt721->regmap, in rt721_sdca_pcm_hw_params()
1364 if (dai->id == RT721_AIF2) in rt721_sdca_pcm_hw_params()
1365 regmap_write(rt721->regmap, in rt721_sdca_pcm_hw_params()
1369 if (dai->id == RT721_AIF3) in rt721_sdca_pcm_hw_params()
1370 regmap_write(rt721->regmap, in rt721_sdca_pcm_hw_params()
1380 struct snd_soc_component *component = dai->component; in rt721_sdca_pcm_hw_free()
1385 if (!rt721->slave) in rt721_sdca_pcm_hw_free()
1386 return -EINVAL; in rt721_sdca_pcm_hw_free()
1388 sdw_stream_remove_slave(rt721->slave, sdw_stream); in rt721_sdca_pcm_hw_free()
1406 .name = "rt721-sdca-aif1",
1425 .name = "rt721-sdca-aif2",
1437 .name = "rt721-sdca-aif3",
1457 return -ENOMEM; in rt721_sdca_init()
1460 rt721->slave = slave; in rt721_sdca_init()
1461 rt721->regmap = regmap; in rt721_sdca_init()
1462 rt721->mbq_regmap = mbq_regmap; in rt721_sdca_init()
1464 regcache_cache_only(rt721->regmap, true); in rt721_sdca_init()
1465 regcache_cache_only(rt721->mbq_regmap, true); in rt721_sdca_init()
1467 mutex_init(&rt721->calibrate_mutex); in rt721_sdca_init()
1468 mutex_init(&rt721->disable_irq_lock); in rt721_sdca_init()
1470 INIT_DELAYED_WORK(&rt721->jack_detect_work, rt721_sdca_jack_detect_handler); in rt721_sdca_init()
1471 INIT_DELAYED_WORK(&rt721->jack_btn_check_work, rt721_sdca_btn_check_handler); in rt721_sdca_init()
1477 rt721->hw_init = false; in rt721_sdca_init()
1478 rt721->first_hw_init = false; in rt721_sdca_init()
1479 rt721->fu1e_dapm_mute = true; in rt721_sdca_init()
1480 rt721->fu0f_dapm_mute = true; in rt721_sdca_init()
1481 rt721->fu0f_mixer_l_mute = rt721->fu0f_mixer_r_mute = true; in rt721_sdca_init()
1482 rt721->fu1e_mixer_mute[0] = rt721->fu1e_mixer_mute[1] = in rt721_sdca_init()
1483 rt721->fu1e_mixer_mute[2] = rt721->fu1e_mixer_mute[3] = true; in rt721_sdca_init()
1493 rt721->disable_irq = false; in rt721_sdca_io_init()
1495 if (rt721->hw_init) in rt721_sdca_io_init()
1498 regcache_cache_only(rt721->regmap, false); in rt721_sdca_io_init()
1499 regcache_cache_only(rt721->mbq_regmap, false); in rt721_sdca_io_init()
1500 if (rt721->first_hw_init) { in rt721_sdca_io_init()
1501 regcache_cache_bypass(rt721->regmap, true); in rt721_sdca_io_init()
1502 regcache_cache_bypass(rt721->mbq_regmap, true); in rt721_sdca_io_init()
1509 pm_runtime_set_autosuspend_delay(&slave->dev, 3000); in rt721_sdca_io_init()
1510 pm_runtime_use_autosuspend(&slave->dev); in rt721_sdca_io_init()
1513 pm_runtime_set_active(&slave->dev); in rt721_sdca_io_init()
1516 pm_runtime_mark_last_busy(&slave->dev); in rt721_sdca_io_init()
1518 pm_runtime_enable(&slave->dev); in rt721_sdca_io_init()
1521 pm_runtime_get_noresume(&slave->dev); in rt721_sdca_io_init()
1525 if (rt721->first_hw_init) { in rt721_sdca_io_init()
1526 regcache_cache_bypass(rt721->regmap, false); in rt721_sdca_io_init()
1527 regcache_mark_dirty(rt721->regmap); in rt721_sdca_io_init()
1528 regcache_cache_bypass(rt721->mbq_regmap, false); in rt721_sdca_io_init()
1529 regcache_mark_dirty(rt721->mbq_regmap); in rt721_sdca_io_init()
1531 rt721->first_hw_init = true; in rt721_sdca_io_init()
1534 rt721->hw_init = true; in rt721_sdca_io_init()
1536 pm_runtime_mark_last_busy(&slave->dev); in rt721_sdca_io_init()
1537 pm_runtime_put_autosuspend(&slave->dev); in rt721_sdca_io_init()
1539 dev_dbg(&slave->dev, "%s hw_init complete\n", __func__); in rt721_sdca_io_init()