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 rt_sdca_index_write(rt721->mbq_regmap, RT721_BOOST_CTRL, in rt721_sdca_jack_preset()
283 regmap_write(rt721->regmap, 0x2f58, 0x07); in rt721_sdca_jack_preset()
288 mutex_lock(&rt721->calibrate_mutex); in rt721_sdca_jack_init()
289 if (rt721->hs_jack) { in rt721_sdca_jack_init()
290 sdw_write_no_pm(rt721->slave, SDW_SCP_SDCA_INTMASK1, in rt721_sdca_jack_init()
292 sdw_write_no_pm(rt721->slave, SDW_SCP_SDCA_INTMASK2, in rt721_sdca_jack_init()
294 dev_dbg(&rt721->slave->dev, "in %s enable\n", __func__); in rt721_sdca_jack_init()
295 rt_sdca_index_write(rt721->mbq_regmap, RT721_HDA_SDCA_FLOAT, in rt721_sdca_jack_init()
297 regmap_write(rt721->regmap, in rt721_sdca_jack_init()
300 regmap_write(rt721->regmap, in rt721_sdca_jack_init()
303 rt_sdca_index_write(rt721->mbq_regmap, RT721_HDA_SDCA_FLOAT, in rt721_sdca_jack_init()
305 rt_sdca_index_update_bits(rt721->mbq_regmap, RT721_HDA_SDCA_FLOAT, in rt721_sdca_jack_init()
308 mutex_unlock(&rt721->calibrate_mutex); in rt721_sdca_jack_init()
317 rt721->hs_jack = hs_jack; in rt721_sdca_set_jack_detect()
319 ret = pm_runtime_resume_and_get(component->dev); in rt721_sdca_set_jack_detect()
321 if (ret != -EACCES) { in rt721_sdca_set_jack_detect()
322 dev_err(component->dev, "%s: failed to resume %d\n", __func__, ret); in rt721_sdca_set_jack_detect()
326 dev_dbg(component->dev, "%s: skipping jack init for now\n", __func__); in rt721_sdca_set_jack_detect()
332 pm_runtime_put_autosuspend(component->dev); in rt721_sdca_set_jack_detect()
337 /* For SDCA control DAC/ADC Gain */
343 (struct soc_mixer_control *)kcontrol->private_value; in rt721_sdca_set_gain_put()
352 if (strstr(ucontrol->id.name, "FU1E Capture Volume") || in rt721_sdca_set_gain_put()
353 strstr(ucontrol->id.name, "FU0F Capture Volume")) in rt721_sdca_set_gain_put()
356 regmap_read(rt721->mbq_regmap, mc->reg, &lvalue); in rt721_sdca_set_gain_put()
357 regmap_read(rt721->mbq_regmap, mc->rreg, &rvalue); in rt721_sdca_set_gain_put()
360 gain_l_val = ucontrol->value.integer.value[0]; in rt721_sdca_set_gain_put()
361 if (gain_l_val > mc->max) in rt721_sdca_set_gain_put()
362 gain_l_val = mc->max; in rt721_sdca_set_gain_put()
364 if (mc->shift == 8) { in rt721_sdca_set_gain_put()
367 } else if (mc->shift == 1) { in rt721_sdca_set_gain_put()
372 gain_l_val = (gain_l_val - 1) * tendA; in rt721_sdca_set_gain_put()
374 /* ADC/DAC gain */ in rt721_sdca_set_gain_put()
376 gain_l_val = 0x1e00 - ((mc->max - gain_l_val) * interval_offset); in rt721_sdca_set_gain_put()
378 gain_l_val = 0 - ((mc->max - gain_l_val) * interval_offset); in rt721_sdca_set_gain_put()
383 gain_r_val = ucontrol->value.integer.value[1]; in rt721_sdca_set_gain_put()
384 if (gain_r_val > mc->max) in rt721_sdca_set_gain_put()
385 gain_r_val = mc->max; in rt721_sdca_set_gain_put()
387 if (mc->shift == 8) { in rt721_sdca_set_gain_put()
390 } else if (mc->shift == 1) { in rt721_sdca_set_gain_put()
395 gain_r_val = (gain_r_val - 1) * tendA; in rt721_sdca_set_gain_put()
397 /* ADC/DAC gain */ in rt721_sdca_set_gain_put()
399 gain_r_val = 0x1e00 - ((mc->max - gain_r_val) * interval_offset); in rt721_sdca_set_gain_put()
401 gain_r_val = 0 - ((mc->max - gain_r_val) * interval_offset); in rt721_sdca_set_gain_put()
411 regmap_write(rt721->mbq_regmap, mc->reg, gain_l_val); in rt721_sdca_set_gain_put()
414 regmap_write(rt721->mbq_regmap, mc->rreg, gain_r_val); in rt721_sdca_set_gain_put()
416 regmap_read(rt721->mbq_regmap, mc->reg, &read_l); in rt721_sdca_set_gain_put()
417 regmap_read(rt721->mbq_regmap, mc->rreg, &read_r); in rt721_sdca_set_gain_put()
421 return -EIO; in rt721_sdca_set_gain_put()
430 (struct soc_mixer_control *)kcontrol->private_value; in rt721_sdca_set_gain_get()
437 if (strstr(ucontrol->id.name, "FU1E Capture Volume") || in rt721_sdca_set_gain_get()
438 strstr(ucontrol->id.name, "FU0F Capture Volume")) in rt721_sdca_set_gain_get()
441 regmap_read(rt721->mbq_regmap, mc->reg, &read_l); in rt721_sdca_set_gain_get()
442 regmap_read(rt721->mbq_regmap, mc->rreg, &read_r); in rt721_sdca_set_gain_get()
444 if (mc->shift == 8) { in rt721_sdca_set_gain_get()
447 } else if (mc->shift == 1) { in rt721_sdca_set_gain_get()
455 ctl_l = mc->max - (((0x1e00 - read_l) & 0xffff) / interval_offset); in rt721_sdca_set_gain_get()
457 ctl_l = mc->max - (((0 - read_l) & 0xffff) / interval_offset); in rt721_sdca_set_gain_get()
461 if (mc->shift == 8) { in rt721_sdca_set_gain_get()
464 } else if (mc->shift == 1) { in rt721_sdca_set_gain_get()
470 } else { /* ADC/DAC gain */ in rt721_sdca_set_gain_get()
472 ctl_r = mc->max - (((0x1e00 - read_r) & 0xffff) / interval_offset); in rt721_sdca_set_gain_get()
474 ctl_r = mc->max - (((0 - read_r) & 0xffff) / interval_offset); in rt721_sdca_set_gain_get()
480 ucontrol->value.integer.value[0] = ctl_l; in rt721_sdca_set_gain_get()
481 ucontrol->value.integer.value[1] = ctl_r; in rt721_sdca_set_gain_get()
491 for (i = 0; i < ARRAY_SIZE(rt721->fu1e_mixer_mute); i++) { in rt721_sdca_set_fu1e_capture_ctl()
492 ch_mute = rt721->fu1e_dapm_mute || rt721->fu1e_mixer_mute[i]; in rt721_sdca_set_fu1e_capture_ctl()
493 err = regmap_write(rt721->regmap, in rt721_sdca_set_fu1e_capture_ctl()
509 (struct rt721_sdca_dmic_kctrl_priv *)kcontrol->private_value; in rt721_sdca_fu1e_capture_get()
512 for (i = 0; i < p->count; i++) in rt721_sdca_fu1e_capture_get()
513 ucontrol->value.integer.value[i] = !rt721->fu1e_mixer_mute[i]; in rt721_sdca_fu1e_capture_get()
524 (struct rt721_sdca_dmic_kctrl_priv *)kcontrol->private_value; in rt721_sdca_fu1e_capture_put()
527 for (i = 0; i < p->count; i++) { in rt721_sdca_fu1e_capture_put()
528 if (rt721->fu1e_mixer_mute[i] != !ucontrol->value.integer.value[i]) in rt721_sdca_fu1e_capture_put()
530 rt721->fu1e_mixer_mute[i] = !ucontrol->value.integer.value[i]; in rt721_sdca_fu1e_capture_put()
545 ch_l = (rt721->fu0f_dapm_mute || rt721->fu0f_mixer_l_mute) ? 0x01 : 0x00; in rt721_sdca_set_fu0f_capture_ctl()
546 ch_r = (rt721->fu0f_dapm_mute || rt721->fu0f_mixer_r_mute) ? 0x01 : 0x00; in rt721_sdca_set_fu0f_capture_ctl()
548 err = regmap_write(rt721->regmap, in rt721_sdca_set_fu0f_capture_ctl()
554 err = regmap_write(rt721->regmap, in rt721_sdca_set_fu0f_capture_ctl()
569 ucontrol->value.integer.value[0] = !rt721->fu0f_mixer_l_mute; in rt721_sdca_fu0f_capture_get()
570 ucontrol->value.integer.value[1] = !rt721->fu0f_mixer_r_mute; in rt721_sdca_fu0f_capture_get()
581 if (rt721->fu0f_mixer_l_mute != !ucontrol->value.integer.value[0] || in rt721_sdca_fu0f_capture_put()
582 rt721->fu0f_mixer_r_mute != !ucontrol->value.integer.value[1]) in rt721_sdca_fu0f_capture_put()
585 rt721->fu0f_mixer_l_mute = !ucontrol->value.integer.value[0]; in rt721_sdca_fu0f_capture_put()
586 rt721->fu0f_mixer_r_mute = !ucontrol->value.integer.value[1]; in rt721_sdca_fu0f_capture_put()
598 (struct rt721_sdca_dmic_kctrl_priv *)kcontrol->private_value; in rt721_sdca_fu_info()
600 if (p->max == 1) in rt721_sdca_fu_info()
601 uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; in rt721_sdca_fu_info()
603 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; in rt721_sdca_fu_info()
604 uinfo->count = p->count; in rt721_sdca_fu_info()
605 uinfo->value.integer.min = 0; in rt721_sdca_fu_info()
606 uinfo->value.integer.max = p->max; in rt721_sdca_fu_info()
616 (struct rt721_sdca_dmic_kctrl_priv *)kcontrol->private_value; in rt721_sdca_dmic_set_gain_get()
623 if (strstr(ucontrol->id.name, "FU1E Capture Volume")) in rt721_sdca_dmic_set_gain_get()
627 for (i = 0; i < p->count; i++) { in rt721_sdca_dmic_set_gain_get()
628 regmap_read(rt721->mbq_regmap, p->reg_base + i, ®value); in rt721_sdca_dmic_set_gain_get()
632 else /* ADC gain */ in rt721_sdca_dmic_set_gain_get()
633 ctl = p->max - (((vol_max - regvalue) & 0xffff) / interval_offset); in rt721_sdca_dmic_set_gain_get()
635 ucontrol->value.integer.value[i] = ctl; in rt721_sdca_dmic_set_gain_get()
646 (struct rt721_sdca_dmic_kctrl_priv *)kcontrol->private_value; in rt721_sdca_dmic_set_gain_put()
656 if (strstr(ucontrol->id.name, "FU1E Capture Volume")) in rt721_sdca_dmic_set_gain_put()
660 for (i = 0; i < p->count; i++) { in rt721_sdca_dmic_set_gain_put()
661 regmap_read(rt721->mbq_regmap, p->reg_base + i, ®value[i]); in rt721_sdca_dmic_set_gain_put()
663 gain_val[i] = ucontrol->value.integer.value[i]; in rt721_sdca_dmic_set_gain_put()
664 if (gain_val[i] > p->max) in rt721_sdca_dmic_set_gain_put()
665 gain_val[i] = p->max; in rt721_sdca_dmic_set_gain_put()
669 else { /* ADC gain */ in rt721_sdca_dmic_set_gain_put()
670 gain_val[i] = vol_max - ((p->max - gain_val[i]) * interval_offset); in rt721_sdca_dmic_set_gain_put()
681 for (i = 0; i < p->count; i++) { in rt721_sdca_dmic_set_gain_put()
682 err = regmap_write(rt721->mbq_regmap, p->reg_base + i, gain_val[i]); in rt721_sdca_dmic_set_gain_put()
684 dev_err(&rt721->slave->dev, "%#08x can't be set\n", p->reg_base + i); in rt721_sdca_dmic_set_gain_put()
690 static const DECLARE_TLV_DB_SCALE(out_vol_tlv, -6525, 75, 0);
691 static const DECLARE_TLV_DB_SCALE(mic_vol_tlv, -1725, 75, 0);
693 static const DECLARE_TLV_DB_SCALE(mic2_boost_vol_tlv, -200, 200, 0);
750 if (strstr(ucontrol->id.name, "ADC 09 Mux")) { in rt721_sdca_adc_mux_get()
753 } else if (strstr(ucontrol->id.name, "ADC 08 R Mux")) { in rt721_sdca_adc_mux_get()
756 } else if (strstr(ucontrol->id.name, "ADC 08 L Mux")) { in rt721_sdca_adc_mux_get()
759 } else if (strstr(ucontrol->id.name, "ADC 10 R Mux")) { in rt721_sdca_adc_mux_get()
762 } else if (strstr(ucontrol->id.name, "ADC 10 L Mux")) { in rt721_sdca_adc_mux_get()
765 } else if (strstr(ucontrol->id.name, "ADC 07 R Mux")) { in rt721_sdca_adc_mux_get()
768 } else if (strstr(ucontrol->id.name, "ADC 07 L Mux")) { in rt721_sdca_adc_mux_get()
772 return -EINVAL; in rt721_sdca_adc_mux_get()
774 rt_sdca_index_read(rt721->mbq_regmap, RT721_HDA_SDCA_FLOAT, in rt721_sdca_adc_mux_get()
777 ucontrol->value.enumerated.item[0] = (val >> mask_sft) & mask; in rt721_sdca_adc_mux_get()
790 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; in rt721_sdca_adc_mux_put()
791 unsigned int *item = ucontrol->value.enumerated.item; in rt721_sdca_adc_mux_put()
795 if (item[0] >= e->items) in rt721_sdca_adc_mux_put()
796 return -EINVAL; in rt721_sdca_adc_mux_put()
798 if (strstr(ucontrol->id.name, "ADC 09 Mux")) { in rt721_sdca_adc_mux_put()
801 } else if (strstr(ucontrol->id.name, "ADC 08 R Mux")) { in rt721_sdca_adc_mux_put()
804 } else if (strstr(ucontrol->id.name, "ADC 08 L Mux")) { in rt721_sdca_adc_mux_put()
807 } else if (strstr(ucontrol->id.name, "ADC 10 R Mux")) { in rt721_sdca_adc_mux_put()
810 } else if (strstr(ucontrol->id.name, "ADC 10 L Mux")) { in rt721_sdca_adc_mux_put()
813 } else if (strstr(ucontrol->id.name, "ADC 07 R Mux")) { in rt721_sdca_adc_mux_put()
816 } else if (strstr(ucontrol->id.name, "ADC 07 L Mux")) { in rt721_sdca_adc_mux_put()
820 return -EINVAL; in rt721_sdca_adc_mux_put()
822 val = snd_soc_enum_item_to_val(e, item[0]) << e->shift_l; in rt721_sdca_adc_mux_put()
823 rt_sdca_index_read(rt721->mbq_regmap, RT721_HDA_SDCA_FLOAT, in rt721_sdca_adc_mux_put()
826 if (strstr(ucontrol->id.name, "ADC 09 Mux")) in rt721_sdca_adc_mux_put()
837 rt_sdca_index_read(rt721->mbq_regmap, RT721_HDA_SDCA_FLOAT, in rt721_sdca_adc_mux_put()
839 rt_sdca_index_update_bits(rt721->mbq_regmap, RT721_HDA_SDCA_FLOAT, in rt721_sdca_adc_mux_put()
868 SOC_DAPM_ENUM_EXT("ADC 09 Mux", rt721_adc09_enum,
871 SOC_DAPM_ENUM_EXT("ADC 08 R Mux", rt721_dmic_enum,
874 SOC_DAPM_ENUM_EXT("ADC 08 L Mux", rt721_dmic_enum,
877 SOC_DAPM_ENUM_EXT("ADC 10 R Mux", rt721_dmic_enum,
880 SOC_DAPM_ENUM_EXT("ADC 10 L Mux", rt721_dmic_enum,
883 SOC_DAPM_ENUM_EXT("ADC 07 R Mux", rt721_dmic_enum,
886 SOC_DAPM_ENUM_EXT("ADC 07 L Mux", rt721_dmic_enum,
894 snd_soc_dapm_to_component(w->dapm); in rt721_sdca_fu42_event()
901 regmap_write(rt721->regmap, in rt721_sdca_fu42_event()
904 regmap_write(rt721->regmap, in rt721_sdca_fu42_event()
909 regmap_write(rt721->regmap, in rt721_sdca_fu42_event()
912 regmap_write(rt721->regmap, in rt721_sdca_fu42_event()
924 snd_soc_dapm_to_component(w->dapm); in rt721_sdca_fu21_event()
930 regmap_write(rt721->regmap, in rt721_sdca_fu21_event()
933 regmap_write(rt721->regmap, in rt721_sdca_fu21_event()
938 regmap_write(rt721->regmap, in rt721_sdca_fu21_event()
941 regmap_write(rt721->regmap, in rt721_sdca_fu21_event()
953 snd_soc_dapm_to_component(w->dapm); in rt721_sdca_fu23_event()
959 regmap_write(rt721->regmap, in rt721_sdca_fu23_event()
962 regmap_write(rt721->regmap, in rt721_sdca_fu23_event()
967 regmap_write(rt721->regmap, in rt721_sdca_fu23_event()
970 regmap_write(rt721->regmap, in rt721_sdca_fu23_event()
982 snd_soc_dapm_to_component(w->dapm); in rt721_sdca_fu113_event()
987 rt721->fu1e_dapm_mute = false; in rt721_sdca_fu113_event()
991 rt721->fu1e_dapm_mute = true; in rt721_sdca_fu113_event()
1002 snd_soc_dapm_to_component(w->dapm); in rt721_sdca_fu36_event()
1007 rt721->fu0f_dapm_mute = false; in rt721_sdca_fu36_event()
1011 rt721->fu0f_dapm_mute = true; in rt721_sdca_fu36_event()
1022 snd_soc_dapm_to_component(w->dapm); in rt721_sdca_pde47_event()
1028 regmap_write(rt721->regmap, in rt721_sdca_pde47_event()
1033 regmap_write(rt721->regmap, in rt721_sdca_pde47_event()
1045 snd_soc_dapm_to_component(w->dapm); in rt721_sdca_pde41_event()
1051 regmap_write(rt721->regmap, in rt721_sdca_pde41_event()
1056 regmap_write(rt721->regmap, in rt721_sdca_pde41_event()
1068 snd_soc_dapm_to_component(w->dapm); in rt721_sdca_pde11_event()
1074 regmap_write(rt721->regmap, in rt721_sdca_pde11_event()
1079 regmap_write(rt721->regmap, in rt721_sdca_pde11_event()
1091 snd_soc_dapm_to_component(w->dapm); in rt721_sdca_pde34_event()
1097 regmap_write(rt721->regmap, in rt721_sdca_pde34_event()
1102 regmap_write(rt721->regmap, in rt721_sdca_pde34_event()
1147 SND_SOC_DAPM_MUX("ADC 09 Mux", SND_SOC_NOPM, 0, 0,
1149 SND_SOC_DAPM_MUX("ADC 08 R Mux", SND_SOC_NOPM, 0, 0,
1151 SND_SOC_DAPM_MUX("ADC 08 L Mux", SND_SOC_NOPM, 0, 0,
1153 SND_SOC_DAPM_MUX("ADC 10 R Mux", SND_SOC_NOPM, 0, 0,
1155 SND_SOC_DAPM_MUX("ADC 10 L Mux", SND_SOC_NOPM, 0, 0,
1157 SND_SOC_DAPM_MUX("ADC 07 R Mux", SND_SOC_NOPM, 0, 0,
1159 SND_SOC_DAPM_MUX("ADC 07 L Mux", SND_SOC_NOPM, 0, 0,
1173 {"ADC 09 Mux", "MIC2", "MIC2"},
1174 {"ADC 09 Mux", "LINE1", "LINE1"},
1175 {"ADC 09 Mux", "LINE2", "LINE2"},
1176 {"ADC 07 R Mux", "DMIC1 RE", "DMIC1_2"},
1177 {"ADC 07 R Mux", "DMIC1 FE", "DMIC1_2"},
1178 {"ADC 07 R Mux", "DMIC2 RE", "DMIC3_4"},
1179 {"ADC 07 R Mux", "DMIC2 FE", "DMIC3_4"},
1180 {"ADC 07 L Mux", "DMIC1 RE", "DMIC1_2"},
1181 {"ADC 07 L Mux", "DMIC1 FE", "DMIC1_2"},
1182 {"ADC 07 L Mux", "DMIC2 RE", "DMIC3_4"},
1183 {"ADC 07 L Mux", "DMIC2 FE", "DMIC3_4"},
1184 {"ADC 08 R Mux", "DMIC1 RE", "DMIC1_2"},
1185 {"ADC 08 R Mux", "DMIC1 FE", "DMIC1_2"},
1186 {"ADC 08 R Mux", "DMIC2 RE", "DMIC3_4"},
1187 {"ADC 08 R Mux", "DMIC2 FE", "DMIC3_4"},
1188 {"ADC 08 L Mux", "DMIC1 RE", "DMIC1_2"},
1189 {"ADC 08 L Mux", "DMIC1 FE", "DMIC1_2"},
1190 {"ADC 08 L Mux", "DMIC2 RE", "DMIC3_4"},
1191 {"ADC 08 L Mux", "DMIC2 FE", "DMIC3_4"},
1192 {"ADC 10 R Mux", "DMIC1 RE", "DMIC1_2"},
1193 {"ADC 10 R Mux", "DMIC1 FE", "DMIC1_2"},
1194 {"ADC 10 R Mux", "DMIC2 RE", "DMIC3_4"},
1195 {"ADC 10 R Mux", "DMIC2 FE", "DMIC3_4"},
1196 {"ADC 10 L Mux", "DMIC1 RE", "DMIC1_2"},
1197 {"ADC 10 L Mux", "DMIC1 FE", "DMIC1_2"},
1198 {"ADC 10 L Mux", "DMIC2 RE", "DMIC3_4"},
1199 {"ADC 10 L Mux", "DMIC2 FE", "DMIC3_4"},
1201 {"FU 36", NULL, "ADC 09 Mux"},
1203 {"FU 113", NULL, "ADC 07 R Mux"},
1204 {"FU 113", NULL, "ADC 07 L Mux"},
1205 {"FU 113", NULL, "ADC 10 R Mux"},
1206 {"FU 113", NULL, "ADC 10 L Mux"},
1219 device_property_read_u32(dev, "realtek,jd-src", &rt721->jd_src); in rt721_sdca_parse_dt()
1229 rt721_sdca_parse_dt(rt721, &rt721->slave->dev); in rt721_sdca_probe()
1230 rt721->component = component; in rt721_sdca_probe()
1232 ret = pm_runtime_resume(component->dev); in rt721_sdca_probe()
1233 if (ret < 0 && ret != -EACCES) in rt721_sdca_probe()
1269 struct snd_soc_component *component = dai->component; in rt721_sdca_pcm_hw_params()
1278 dev_dbg(dai->dev, "%s %s", __func__, dai->name); in rt721_sdca_pcm_hw_params()
1282 return -EINVAL; in rt721_sdca_pcm_hw_params()
1284 if (!rt721->slave) in rt721_sdca_pcm_hw_params()
1285 return -EINVAL; in rt721_sdca_pcm_hw_params()
1289 * RT721_AIF1 with port = 2 for headset-mic capture in rt721_sdca_pcm_hw_params()
1291 * RT721_AIF3 with port = 6 for digital-mic capture in rt721_sdca_pcm_hw_params()
1293 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { in rt721_sdca_pcm_hw_params()
1295 if (dai->id == RT721_AIF1) in rt721_sdca_pcm_hw_params()
1297 else if (dai->id == RT721_AIF2) in rt721_sdca_pcm_hw_params()
1300 return -EINVAL; in rt721_sdca_pcm_hw_params()
1303 if (dai->id == RT721_AIF1) in rt721_sdca_pcm_hw_params()
1305 else if (dai->id == RT721_AIF3) in rt721_sdca_pcm_hw_params()
1308 return -EINVAL; in rt721_sdca_pcm_hw_params()
1316 port_config.ch_mask = GENMASK(num_channels - 1, 0); in rt721_sdca_pcm_hw_params()
1319 retval = sdw_stream_add_slave(rt721->slave, &stream_config, in rt721_sdca_pcm_hw_params()
1322 dev_err(dai->dev, "Unable to configure port\n"); in rt721_sdca_pcm_hw_params()
1327 dev_err(component->dev, "Unsupported channels %d\n", in rt721_sdca_pcm_hw_params()
1329 return -EINVAL; in rt721_sdca_pcm_hw_params()
1365 dev_err(component->dev, "Rate %d is not supported\n", in rt721_sdca_pcm_hw_params()
1367 return -EINVAL; in rt721_sdca_pcm_hw_params()
1371 if (dai->id == RT721_AIF1) { in rt721_sdca_pcm_hw_params()
1372 regmap_write(rt721->regmap, in rt721_sdca_pcm_hw_params()
1375 regmap_write(rt721->regmap, in rt721_sdca_pcm_hw_params()
1380 if (dai->id == RT721_AIF2) in rt721_sdca_pcm_hw_params()
1381 regmap_write(rt721->regmap, in rt721_sdca_pcm_hw_params()
1385 if (dai->id == RT721_AIF3) in rt721_sdca_pcm_hw_params()
1386 regmap_write(rt721->regmap, in rt721_sdca_pcm_hw_params()
1396 struct snd_soc_component *component = dai->component; in rt721_sdca_pcm_hw_free()
1401 if (!rt721->slave) in rt721_sdca_pcm_hw_free()
1402 return -EINVAL; in rt721_sdca_pcm_hw_free()
1404 sdw_stream_remove_slave(rt721->slave, sdw_stream); in rt721_sdca_pcm_hw_free()
1422 .name = "rt721-sdca-aif1",
1441 .name = "rt721-sdca-aif2",
1453 .name = "rt721-sdca-aif3",
1473 return -ENOMEM; in rt721_sdca_init()
1476 rt721->slave = slave; in rt721_sdca_init()
1477 rt721->regmap = regmap; in rt721_sdca_init()
1478 rt721->mbq_regmap = mbq_regmap; in rt721_sdca_init()
1480 regcache_cache_only(rt721->regmap, true); in rt721_sdca_init()
1481 regcache_cache_only(rt721->mbq_regmap, true); in rt721_sdca_init()
1483 mutex_init(&rt721->calibrate_mutex); in rt721_sdca_init()
1484 mutex_init(&rt721->disable_irq_lock); in rt721_sdca_init()
1486 INIT_DELAYED_WORK(&rt721->jack_detect_work, rt721_sdca_jack_detect_handler); in rt721_sdca_init()
1487 INIT_DELAYED_WORK(&rt721->jack_btn_check_work, rt721_sdca_btn_check_handler); in rt721_sdca_init()
1493 rt721->hw_init = false; in rt721_sdca_init()
1494 rt721->first_hw_init = false; in rt721_sdca_init()
1495 rt721->fu1e_dapm_mute = true; in rt721_sdca_init()
1496 rt721->fu0f_dapm_mute = true; in rt721_sdca_init()
1497 rt721->fu0f_mixer_l_mute = rt721->fu0f_mixer_r_mute = true; in rt721_sdca_init()
1498 rt721->fu1e_mixer_mute[0] = rt721->fu1e_mixer_mute[1] = in rt721_sdca_init()
1499 rt721->fu1e_mixer_mute[2] = rt721->fu1e_mixer_mute[3] = true; in rt721_sdca_init()
1509 rt721->disable_irq = false; in rt721_sdca_io_init()
1511 if (rt721->hw_init) in rt721_sdca_io_init()
1514 regcache_cache_only(rt721->regmap, false); in rt721_sdca_io_init()
1515 regcache_cache_only(rt721->mbq_regmap, false); in rt721_sdca_io_init()
1516 if (rt721->first_hw_init) { in rt721_sdca_io_init()
1517 regcache_cache_bypass(rt721->regmap, true); in rt721_sdca_io_init()
1518 regcache_cache_bypass(rt721->mbq_regmap, true); in rt721_sdca_io_init()
1525 pm_runtime_set_autosuspend_delay(&slave->dev, 3000); in rt721_sdca_io_init()
1526 pm_runtime_use_autosuspend(&slave->dev); in rt721_sdca_io_init()
1529 pm_runtime_set_active(&slave->dev); in rt721_sdca_io_init()
1532 pm_runtime_mark_last_busy(&slave->dev); in rt721_sdca_io_init()
1534 pm_runtime_enable(&slave->dev); in rt721_sdca_io_init()
1537 pm_runtime_get_noresume(&slave->dev); in rt721_sdca_io_init()
1541 if (rt721->first_hw_init) { in rt721_sdca_io_init()
1542 regcache_cache_bypass(rt721->regmap, false); in rt721_sdca_io_init()
1543 regcache_mark_dirty(rt721->regmap); in rt721_sdca_io_init()
1544 regcache_cache_bypass(rt721->mbq_regmap, false); in rt721_sdca_io_init()
1545 regcache_mark_dirty(rt721->mbq_regmap); in rt721_sdca_io_init()
1547 rt721->first_hw_init = true; in rt721_sdca_io_init()
1550 rt721->hw_init = true; in rt721_sdca_io_init()
1552 pm_runtime_put_autosuspend(&slave->dev); in rt721_sdca_io_init()
1554 dev_dbg(&slave->dev, "%s hw_init complete\n", __func__); in rt721_sdca_io_init()