Lines Matching +full:adc +full:- +full:dev
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()
285 regmap_write(rt721->regmap, 0x2f51, 0x00); in rt721_sdca_jack_preset()
286 rt_sdca_index_write(rt721->mbq_regmap, RT721_HDA_SDCA_FLOAT, in rt721_sdca_jack_preset()
292 mutex_lock(&rt721->calibrate_mutex); in rt721_sdca_jack_init()
293 if (rt721->hs_jack) { in rt721_sdca_jack_init()
294 sdw_write_no_pm(rt721->slave, SDW_SCP_SDCA_INTMASK1, in rt721_sdca_jack_init()
296 sdw_write_no_pm(rt721->slave, SDW_SCP_SDCA_INTMASK2, in rt721_sdca_jack_init()
298 dev_dbg(&rt721->slave->dev, "in %s enable\n", __func__); in rt721_sdca_jack_init()
299 rt_sdca_index_write(rt721->mbq_regmap, RT721_HDA_SDCA_FLOAT, in rt721_sdca_jack_init()
301 regmap_write(rt721->regmap, in rt721_sdca_jack_init()
304 regmap_write(rt721->regmap, in rt721_sdca_jack_init()
307 rt_sdca_index_write(rt721->mbq_regmap, RT721_HDA_SDCA_FLOAT, in rt721_sdca_jack_init()
309 rt_sdca_index_update_bits(rt721->mbq_regmap, RT721_HDA_SDCA_FLOAT, in rt721_sdca_jack_init()
312 mutex_unlock(&rt721->calibrate_mutex); in rt721_sdca_jack_init()
321 rt721->hs_jack = hs_jack; in rt721_sdca_set_jack_detect()
323 ret = pm_runtime_resume_and_get(component->dev); in rt721_sdca_set_jack_detect()
325 if (ret != -EACCES) { in rt721_sdca_set_jack_detect()
326 dev_err(component->dev, "%s: failed to resume %d\n", __func__, ret); in rt721_sdca_set_jack_detect()
330 dev_dbg(component->dev, "%s: skipping jack init for now\n", __func__); in rt721_sdca_set_jack_detect()
336 pm_runtime_put_autosuspend(component->dev); in rt721_sdca_set_jack_detect()
341 /* For SDCA control DAC/ADC Gain */
347 (struct soc_mixer_control *)kcontrol->private_value; in rt721_sdca_set_gain_put()
356 if (strstr(ucontrol->id.name, "FU1E Capture Volume") || in rt721_sdca_set_gain_put()
357 strstr(ucontrol->id.name, "FU0F Capture Volume")) in rt721_sdca_set_gain_put()
360 regmap_read(rt721->mbq_regmap, mc->reg, &lvalue); in rt721_sdca_set_gain_put()
361 regmap_read(rt721->mbq_regmap, mc->rreg, &rvalue); in rt721_sdca_set_gain_put()
364 gain_l_val = ucontrol->value.integer.value[0]; in rt721_sdca_set_gain_put()
365 if (gain_l_val > mc->max) in rt721_sdca_set_gain_put()
366 gain_l_val = mc->max; in rt721_sdca_set_gain_put()
368 if (mc->shift == 8) { in rt721_sdca_set_gain_put()
371 } else if (mc->shift == 1) { in rt721_sdca_set_gain_put()
376 gain_l_val = (gain_l_val - 1) * tendA; in rt721_sdca_set_gain_put()
378 /* ADC/DAC gain */ in rt721_sdca_set_gain_put()
380 gain_l_val = 0x1e00 - ((mc->max - gain_l_val) * interval_offset); in rt721_sdca_set_gain_put()
382 gain_l_val = 0 - ((mc->max - gain_l_val) * interval_offset); in rt721_sdca_set_gain_put()
387 gain_r_val = ucontrol->value.integer.value[1]; in rt721_sdca_set_gain_put()
388 if (gain_r_val > mc->max) in rt721_sdca_set_gain_put()
389 gain_r_val = mc->max; in rt721_sdca_set_gain_put()
391 if (mc->shift == 8) { in rt721_sdca_set_gain_put()
394 } else if (mc->shift == 1) { in rt721_sdca_set_gain_put()
399 gain_r_val = (gain_r_val - 1) * tendA; in rt721_sdca_set_gain_put()
401 /* ADC/DAC gain */ in rt721_sdca_set_gain_put()
403 gain_r_val = 0x1e00 - ((mc->max - gain_r_val) * interval_offset); in rt721_sdca_set_gain_put()
405 gain_r_val = 0 - ((mc->max - gain_r_val) * interval_offset); in rt721_sdca_set_gain_put()
415 regmap_write(rt721->mbq_regmap, mc->reg, gain_l_val); in rt721_sdca_set_gain_put()
418 regmap_write(rt721->mbq_regmap, mc->rreg, gain_r_val); in rt721_sdca_set_gain_put()
420 regmap_read(rt721->mbq_regmap, mc->reg, &read_l); in rt721_sdca_set_gain_put()
421 regmap_read(rt721->mbq_regmap, mc->rreg, &read_r); in rt721_sdca_set_gain_put()
425 return -EIO; in rt721_sdca_set_gain_put()
434 (struct soc_mixer_control *)kcontrol->private_value; in rt721_sdca_set_gain_get()
441 if (strstr(ucontrol->id.name, "FU1E Capture Volume") || in rt721_sdca_set_gain_get()
442 strstr(ucontrol->id.name, "FU0F Capture Volume")) in rt721_sdca_set_gain_get()
445 regmap_read(rt721->mbq_regmap, mc->reg, &read_l); in rt721_sdca_set_gain_get()
446 regmap_read(rt721->mbq_regmap, mc->rreg, &read_r); in rt721_sdca_set_gain_get()
448 if (mc->shift == 8) { in rt721_sdca_set_gain_get()
451 } else if (mc->shift == 1) { in rt721_sdca_set_gain_get()
459 ctl_l = mc->max - (((0x1e00 - read_l) & 0xffff) / interval_offset); in rt721_sdca_set_gain_get()
461 ctl_l = mc->max - (((0 - read_l) & 0xffff) / interval_offset); in rt721_sdca_set_gain_get()
465 if (mc->shift == 8) { in rt721_sdca_set_gain_get()
468 } else if (mc->shift == 1) { in rt721_sdca_set_gain_get()
474 } else { /* ADC/DAC gain */ in rt721_sdca_set_gain_get()
476 ctl_r = mc->max - (((0x1e00 - read_r) & 0xffff) / interval_offset); in rt721_sdca_set_gain_get()
478 ctl_r = mc->max - (((0 - read_r) & 0xffff) / interval_offset); in rt721_sdca_set_gain_get()
484 ucontrol->value.integer.value[0] = ctl_l; in rt721_sdca_set_gain_get()
485 ucontrol->value.integer.value[1] = ctl_r; in rt721_sdca_set_gain_get()
495 for (i = 0; i < ARRAY_SIZE(rt721->fu1e_mixer_mute); i++) { in rt721_sdca_set_fu1e_capture_ctl()
496 ch_mute = rt721->fu1e_dapm_mute || rt721->fu1e_mixer_mute[i]; in rt721_sdca_set_fu1e_capture_ctl()
497 err = regmap_write(rt721->regmap, in rt721_sdca_set_fu1e_capture_ctl()
513 (struct rt721_sdca_dmic_kctrl_priv *)kcontrol->private_value; in rt721_sdca_fu1e_capture_get()
516 for (i = 0; i < p->count; i++) in rt721_sdca_fu1e_capture_get()
517 ucontrol->value.integer.value[i] = !rt721->fu1e_mixer_mute[i]; in rt721_sdca_fu1e_capture_get()
528 (struct rt721_sdca_dmic_kctrl_priv *)kcontrol->private_value; in rt721_sdca_fu1e_capture_put()
531 for (i = 0; i < p->count; i++) { in rt721_sdca_fu1e_capture_put()
532 if (rt721->fu1e_mixer_mute[i] != !ucontrol->value.integer.value[i]) in rt721_sdca_fu1e_capture_put()
534 rt721->fu1e_mixer_mute[i] = !ucontrol->value.integer.value[i]; in rt721_sdca_fu1e_capture_put()
549 ch_l = (rt721->fu0f_dapm_mute || rt721->fu0f_mixer_l_mute) ? 0x01 : 0x00; in rt721_sdca_set_fu0f_capture_ctl()
550 ch_r = (rt721->fu0f_dapm_mute || rt721->fu0f_mixer_r_mute) ? 0x01 : 0x00; in rt721_sdca_set_fu0f_capture_ctl()
552 err = regmap_write(rt721->regmap, in rt721_sdca_set_fu0f_capture_ctl()
558 err = regmap_write(rt721->regmap, in rt721_sdca_set_fu0f_capture_ctl()
573 ucontrol->value.integer.value[0] = !rt721->fu0f_mixer_l_mute; in rt721_sdca_fu0f_capture_get()
574 ucontrol->value.integer.value[1] = !rt721->fu0f_mixer_r_mute; in rt721_sdca_fu0f_capture_get()
585 if (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()
589 rt721->fu0f_mixer_l_mute = !ucontrol->value.integer.value[0]; in rt721_sdca_fu0f_capture_put()
590 rt721->fu0f_mixer_r_mute = !ucontrol->value.integer.value[1]; in rt721_sdca_fu0f_capture_put()
602 (struct rt721_sdca_dmic_kctrl_priv *)kcontrol->private_value; in rt721_sdca_fu_info()
604 if (p->max == 1) in rt721_sdca_fu_info()
605 uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; in rt721_sdca_fu_info()
607 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; in rt721_sdca_fu_info()
608 uinfo->count = p->count; in rt721_sdca_fu_info()
609 uinfo->value.integer.min = 0; in rt721_sdca_fu_info()
610 uinfo->value.integer.max = p->max; in rt721_sdca_fu_info()
620 (struct rt721_sdca_dmic_kctrl_priv *)kcontrol->private_value; in rt721_sdca_dmic_set_gain_get()
627 if (strstr(ucontrol->id.name, "FU1E Capture Volume")) in rt721_sdca_dmic_set_gain_get()
631 for (i = 0; i < p->count; i++) { in rt721_sdca_dmic_set_gain_get()
632 regmap_read(rt721->mbq_regmap, p->reg_base + i, ®value); in rt721_sdca_dmic_set_gain_get()
636 else /* ADC gain */ in rt721_sdca_dmic_set_gain_get()
637 ctl = p->max - (((vol_max - regvalue) & 0xffff) / interval_offset); in rt721_sdca_dmic_set_gain_get()
639 ucontrol->value.integer.value[i] = ctl; in rt721_sdca_dmic_set_gain_get()
650 (struct rt721_sdca_dmic_kctrl_priv *)kcontrol->private_value; in rt721_sdca_dmic_set_gain_put()
660 if (strstr(ucontrol->id.name, "FU1E Capture Volume")) in rt721_sdca_dmic_set_gain_put()
664 for (i = 0; i < p->count; i++) { in rt721_sdca_dmic_set_gain_put()
665 regmap_read(rt721->mbq_regmap, p->reg_base + i, ®value[i]); in rt721_sdca_dmic_set_gain_put()
667 gain_val[i] = ucontrol->value.integer.value[i]; in rt721_sdca_dmic_set_gain_put()
668 if (gain_val[i] > p->max) in rt721_sdca_dmic_set_gain_put()
669 gain_val[i] = p->max; in rt721_sdca_dmic_set_gain_put()
673 else { /* ADC gain */ in rt721_sdca_dmic_set_gain_put()
674 gain_val[i] = vol_max - ((p->max - gain_val[i]) * interval_offset); in rt721_sdca_dmic_set_gain_put()
685 for (i = 0; i < p->count; i++) { in rt721_sdca_dmic_set_gain_put()
686 err = regmap_write(rt721->mbq_regmap, p->reg_base + i, gain_val[i]); in rt721_sdca_dmic_set_gain_put()
688 dev_err(&rt721->slave->dev, "%#08x can't be set\n", p->reg_base + i); in rt721_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);
697 static const DECLARE_TLV_DB_SCALE(mic2_boost_vol_tlv, -200, 200, 0);
754 if (strstr(ucontrol->id.name, "ADC 09 Mux")) { in rt721_sdca_adc_mux_get()
757 } else if (strstr(ucontrol->id.name, "ADC 08 R Mux")) { in rt721_sdca_adc_mux_get()
760 } else if (strstr(ucontrol->id.name, "ADC 08 L Mux")) { in rt721_sdca_adc_mux_get()
763 } else if (strstr(ucontrol->id.name, "ADC 10 R Mux")) { in rt721_sdca_adc_mux_get()
766 } else if (strstr(ucontrol->id.name, "ADC 10 L Mux")) { in rt721_sdca_adc_mux_get()
769 } else if (strstr(ucontrol->id.name, "ADC 07 R Mux")) { in rt721_sdca_adc_mux_get()
772 } else if (strstr(ucontrol->id.name, "ADC 07 L Mux")) { in rt721_sdca_adc_mux_get()
776 return -EINVAL; in rt721_sdca_adc_mux_get()
778 rt_sdca_index_read(rt721->mbq_regmap, RT721_HDA_SDCA_FLOAT, in rt721_sdca_adc_mux_get()
781 ucontrol->value.enumerated.item[0] = (val >> mask_sft) & mask; in rt721_sdca_adc_mux_get()
794 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; in rt721_sdca_adc_mux_put()
795 unsigned int *item = ucontrol->value.enumerated.item; in rt721_sdca_adc_mux_put()
799 if (item[0] >= e->items) in rt721_sdca_adc_mux_put()
800 return -EINVAL; in rt721_sdca_adc_mux_put()
802 if (strstr(ucontrol->id.name, "ADC 09 Mux")) { in rt721_sdca_adc_mux_put()
805 } else if (strstr(ucontrol->id.name, "ADC 08 R Mux")) { in rt721_sdca_adc_mux_put()
808 } else if (strstr(ucontrol->id.name, "ADC 08 L Mux")) { in rt721_sdca_adc_mux_put()
811 } else if (strstr(ucontrol->id.name, "ADC 10 R Mux")) { in rt721_sdca_adc_mux_put()
814 } else if (strstr(ucontrol->id.name, "ADC 10 L Mux")) { in rt721_sdca_adc_mux_put()
817 } else if (strstr(ucontrol->id.name, "ADC 07 R Mux")) { in rt721_sdca_adc_mux_put()
820 } else if (strstr(ucontrol->id.name, "ADC 07 L Mux")) { in rt721_sdca_adc_mux_put()
824 return -EINVAL; in rt721_sdca_adc_mux_put()
826 val = snd_soc_enum_item_to_val(e, item[0]) << e->shift_l; in rt721_sdca_adc_mux_put()
827 rt_sdca_index_read(rt721->mbq_regmap, RT721_HDA_SDCA_FLOAT, in rt721_sdca_adc_mux_put()
830 if (strstr(ucontrol->id.name, "ADC 09 Mux")) in rt721_sdca_adc_mux_put()
841 rt_sdca_index_read(rt721->mbq_regmap, RT721_HDA_SDCA_FLOAT, in rt721_sdca_adc_mux_put()
843 rt_sdca_index_update_bits(rt721->mbq_regmap, RT721_HDA_SDCA_FLOAT, in rt721_sdca_adc_mux_put()
872 SOC_DAPM_ENUM_EXT("ADC 09 Mux", rt721_adc09_enum,
875 SOC_DAPM_ENUM_EXT("ADC 08 R Mux", rt721_dmic_enum,
878 SOC_DAPM_ENUM_EXT("ADC 08 L Mux", rt721_dmic_enum,
881 SOC_DAPM_ENUM_EXT("ADC 10 R Mux", rt721_dmic_enum,
884 SOC_DAPM_ENUM_EXT("ADC 10 L Mux", rt721_dmic_enum,
887 SOC_DAPM_ENUM_EXT("ADC 07 R Mux", rt721_dmic_enum,
890 SOC_DAPM_ENUM_EXT("ADC 07 L Mux", rt721_dmic_enum,
898 snd_soc_dapm_to_component(w->dapm); in rt721_sdca_fu42_event()
905 regmap_write(rt721->regmap, in rt721_sdca_fu42_event()
908 regmap_write(rt721->regmap, in rt721_sdca_fu42_event()
913 regmap_write(rt721->regmap, in rt721_sdca_fu42_event()
916 regmap_write(rt721->regmap, in rt721_sdca_fu42_event()
928 snd_soc_dapm_to_component(w->dapm); in rt721_sdca_fu21_event()
934 regmap_write(rt721->regmap, in rt721_sdca_fu21_event()
937 regmap_write(rt721->regmap, in rt721_sdca_fu21_event()
942 regmap_write(rt721->regmap, in rt721_sdca_fu21_event()
945 regmap_write(rt721->regmap, in rt721_sdca_fu21_event()
957 snd_soc_dapm_to_component(w->dapm); in rt721_sdca_fu23_event()
963 regmap_write(rt721->regmap, in rt721_sdca_fu23_event()
966 regmap_write(rt721->regmap, in rt721_sdca_fu23_event()
971 regmap_write(rt721->regmap, in rt721_sdca_fu23_event()
974 regmap_write(rt721->regmap, in rt721_sdca_fu23_event()
986 snd_soc_dapm_to_component(w->dapm); in rt721_sdca_fu113_event()
991 rt721->fu1e_dapm_mute = false; in rt721_sdca_fu113_event()
995 rt721->fu1e_dapm_mute = true; in rt721_sdca_fu113_event()
1006 snd_soc_dapm_to_component(w->dapm); in rt721_sdca_fu36_event()
1011 rt721->fu0f_dapm_mute = false; in rt721_sdca_fu36_event()
1015 rt721->fu0f_dapm_mute = true; in rt721_sdca_fu36_event()
1026 snd_soc_dapm_to_component(w->dapm); in rt721_sdca_pde47_event()
1032 regmap_write(rt721->regmap, in rt721_sdca_pde47_event()
1037 regmap_write(rt721->regmap, in rt721_sdca_pde47_event()
1049 snd_soc_dapm_to_component(w->dapm); in rt721_sdca_pde41_event()
1055 regmap_write(rt721->regmap, in rt721_sdca_pde41_event()
1060 regmap_write(rt721->regmap, in rt721_sdca_pde41_event()
1072 snd_soc_dapm_to_component(w->dapm); in rt721_sdca_pde11_event()
1078 regmap_write(rt721->regmap, in rt721_sdca_pde11_event()
1083 regmap_write(rt721->regmap, in rt721_sdca_pde11_event()
1095 snd_soc_dapm_to_component(w->dapm); in rt721_sdca_pde34_event()
1101 regmap_write(rt721->regmap, in rt721_sdca_pde34_event()
1106 regmap_write(rt721->regmap, in rt721_sdca_pde34_event()
1151 SND_SOC_DAPM_MUX("ADC 09 Mux", SND_SOC_NOPM, 0, 0,
1153 SND_SOC_DAPM_MUX("ADC 08 R Mux", SND_SOC_NOPM, 0, 0,
1155 SND_SOC_DAPM_MUX("ADC 08 L Mux", SND_SOC_NOPM, 0, 0,
1157 SND_SOC_DAPM_MUX("ADC 10 R Mux", SND_SOC_NOPM, 0, 0,
1159 SND_SOC_DAPM_MUX("ADC 10 L Mux", SND_SOC_NOPM, 0, 0,
1161 SND_SOC_DAPM_MUX("ADC 07 R Mux", SND_SOC_NOPM, 0, 0,
1163 SND_SOC_DAPM_MUX("ADC 07 L Mux", SND_SOC_NOPM, 0, 0,
1177 {"ADC 09 Mux", "MIC2", "MIC2"},
1178 {"ADC 09 Mux", "LINE1", "LINE1"},
1179 {"ADC 09 Mux", "LINE2", "LINE2"},
1180 {"ADC 07 R Mux", "DMIC1 RE", "DMIC1_2"},
1181 {"ADC 07 R Mux", "DMIC1 FE", "DMIC1_2"},
1182 {"ADC 07 R Mux", "DMIC2 RE", "DMIC3_4"},
1183 {"ADC 07 R Mux", "DMIC2 FE", "DMIC3_4"},
1184 {"ADC 07 L Mux", "DMIC1 RE", "DMIC1_2"},
1185 {"ADC 07 L Mux", "DMIC1 FE", "DMIC1_2"},
1186 {"ADC 07 L Mux", "DMIC2 RE", "DMIC3_4"},
1187 {"ADC 07 L Mux", "DMIC2 FE", "DMIC3_4"},
1188 {"ADC 08 R Mux", "DMIC1 RE", "DMIC1_2"},
1189 {"ADC 08 R Mux", "DMIC1 FE", "DMIC1_2"},
1190 {"ADC 08 R Mux", "DMIC2 RE", "DMIC3_4"},
1191 {"ADC 08 R Mux", "DMIC2 FE", "DMIC3_4"},
1192 {"ADC 08 L Mux", "DMIC1 RE", "DMIC1_2"},
1193 {"ADC 08 L Mux", "DMIC1 FE", "DMIC1_2"},
1194 {"ADC 08 L Mux", "DMIC2 RE", "DMIC3_4"},
1195 {"ADC 08 L Mux", "DMIC2 FE", "DMIC3_4"},
1196 {"ADC 10 R Mux", "DMIC1 RE", "DMIC1_2"},
1197 {"ADC 10 R Mux", "DMIC1 FE", "DMIC1_2"},
1198 {"ADC 10 R Mux", "DMIC2 RE", "DMIC3_4"},
1199 {"ADC 10 R Mux", "DMIC2 FE", "DMIC3_4"},
1200 {"ADC 10 L Mux", "DMIC1 RE", "DMIC1_2"},
1201 {"ADC 10 L Mux", "DMIC1 FE", "DMIC1_2"},
1202 {"ADC 10 L Mux", "DMIC2 RE", "DMIC3_4"},
1203 {"ADC 10 L Mux", "DMIC2 FE", "DMIC3_4"},
1205 {"FU 36", NULL, "ADC 09 Mux"},
1207 {"FU 113", NULL, "ADC 07 R Mux"},
1208 {"FU 113", NULL, "ADC 07 L Mux"},
1209 {"FU 113", NULL, "ADC 10 R Mux"},
1210 {"FU 113", NULL, "ADC 10 L Mux"},
1221 static int rt721_sdca_parse_dt(struct rt721_sdca_priv *rt721, struct device *dev) in rt721_sdca_parse_dt() argument
1223 device_property_read_u32(dev, "realtek,jd-src", &rt721->jd_src); in rt721_sdca_parse_dt()
1233 rt721_sdca_parse_dt(rt721, &rt721->slave->dev); in rt721_sdca_probe()
1234 rt721->component = component; in rt721_sdca_probe()
1236 ret = pm_runtime_resume(component->dev); in rt721_sdca_probe()
1237 if (ret < 0 && ret != -EACCES) in rt721_sdca_probe()
1273 struct snd_soc_component *component = dai->component; in rt721_sdca_pcm_hw_params()
1282 dev_dbg(dai->dev, "%s %s", __func__, dai->name); in rt721_sdca_pcm_hw_params()
1286 return -EINVAL; in rt721_sdca_pcm_hw_params()
1288 if (!rt721->slave) in rt721_sdca_pcm_hw_params()
1289 return -EINVAL; in rt721_sdca_pcm_hw_params()
1293 * RT721_AIF1 with port = 2 for headset-mic capture in rt721_sdca_pcm_hw_params()
1295 * RT721_AIF3 with port = 6 for digital-mic capture in rt721_sdca_pcm_hw_params()
1297 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { in rt721_sdca_pcm_hw_params()
1299 if (dai->id == RT721_AIF1) in rt721_sdca_pcm_hw_params()
1301 else if (dai->id == RT721_AIF2) in rt721_sdca_pcm_hw_params()
1304 return -EINVAL; in rt721_sdca_pcm_hw_params()
1307 if (dai->id == RT721_AIF1) in rt721_sdca_pcm_hw_params()
1309 else if (dai->id == RT721_AIF3) in rt721_sdca_pcm_hw_params()
1312 return -EINVAL; in rt721_sdca_pcm_hw_params()
1320 port_config.ch_mask = GENMASK(num_channels - 1, 0); in rt721_sdca_pcm_hw_params()
1323 retval = sdw_stream_add_slave(rt721->slave, &stream_config, in rt721_sdca_pcm_hw_params()
1326 dev_err(dai->dev, "Unable to configure port\n"); in rt721_sdca_pcm_hw_params()
1331 dev_err(component->dev, "Unsupported channels %d\n", in rt721_sdca_pcm_hw_params()
1333 return -EINVAL; in rt721_sdca_pcm_hw_params()
1369 dev_err(component->dev, "Rate %d is not supported\n", in rt721_sdca_pcm_hw_params()
1371 return -EINVAL; in rt721_sdca_pcm_hw_params()
1375 if (dai->id == RT721_AIF1) { in rt721_sdca_pcm_hw_params()
1376 regmap_write(rt721->regmap, in rt721_sdca_pcm_hw_params()
1379 regmap_write(rt721->regmap, in rt721_sdca_pcm_hw_params()
1384 if (dai->id == RT721_AIF2) in rt721_sdca_pcm_hw_params()
1385 regmap_write(rt721->regmap, in rt721_sdca_pcm_hw_params()
1389 if (dai->id == RT721_AIF3) in rt721_sdca_pcm_hw_params()
1390 regmap_write(rt721->regmap, in rt721_sdca_pcm_hw_params()
1400 struct snd_soc_component *component = dai->component; in rt721_sdca_pcm_hw_free()
1405 if (!rt721->slave) in rt721_sdca_pcm_hw_free()
1406 return -EINVAL; in rt721_sdca_pcm_hw_free()
1408 sdw_stream_remove_slave(rt721->slave, sdw_stream); in rt721_sdca_pcm_hw_free()
1426 .name = "rt721-sdca-aif1",
1445 .name = "rt721-sdca-aif2",
1457 .name = "rt721-sdca-aif3",
1470 int rt721_sdca_init(struct device *dev, struct regmap *regmap, in rt721_sdca_init() argument
1475 rt721 = devm_kzalloc(dev, sizeof(*rt721), GFP_KERNEL); in rt721_sdca_init()
1477 return -ENOMEM; in rt721_sdca_init()
1479 dev_set_drvdata(dev, rt721); in rt721_sdca_init()
1480 rt721->slave = slave; in rt721_sdca_init()
1481 rt721->regmap = regmap; in rt721_sdca_init()
1482 rt721->mbq_regmap = mbq_regmap; in rt721_sdca_init()
1484 regcache_cache_only(rt721->regmap, true); in rt721_sdca_init()
1485 regcache_cache_only(rt721->mbq_regmap, true); in rt721_sdca_init()
1487 mutex_init(&rt721->calibrate_mutex); in rt721_sdca_init()
1488 mutex_init(&rt721->disable_irq_lock); in rt721_sdca_init()
1490 INIT_DELAYED_WORK(&rt721->jack_detect_work, rt721_sdca_jack_detect_handler); in rt721_sdca_init()
1491 INIT_DELAYED_WORK(&rt721->jack_btn_check_work, rt721_sdca_btn_check_handler); in rt721_sdca_init()
1497 rt721->hw_init = false; in rt721_sdca_init()
1498 rt721->first_hw_init = false; in rt721_sdca_init()
1499 rt721->fu1e_dapm_mute = true; in rt721_sdca_init()
1500 rt721->fu0f_dapm_mute = true; in rt721_sdca_init()
1501 rt721->fu0f_mixer_l_mute = rt721->fu0f_mixer_r_mute = true; in rt721_sdca_init()
1502 rt721->fu1e_mixer_mute[0] = rt721->fu1e_mixer_mute[1] = in rt721_sdca_init()
1503 rt721->fu1e_mixer_mute[2] = rt721->fu1e_mixer_mute[3] = true; in rt721_sdca_init()
1505 return devm_snd_soc_register_component(dev, in rt721_sdca_init()
1509 int rt721_sdca_io_init(struct device *dev, struct sdw_slave *slave) in rt721_sdca_io_init() argument
1511 struct rt721_sdca_priv *rt721 = dev_get_drvdata(dev); in rt721_sdca_io_init()
1513 rt721->disable_irq = false; in rt721_sdca_io_init()
1515 if (rt721->hw_init) in rt721_sdca_io_init()
1518 regcache_cache_only(rt721->regmap, false); in rt721_sdca_io_init()
1519 regcache_cache_only(rt721->mbq_regmap, false); in rt721_sdca_io_init()
1520 if (rt721->first_hw_init) { in rt721_sdca_io_init()
1521 regcache_cache_bypass(rt721->regmap, true); in rt721_sdca_io_init()
1522 regcache_cache_bypass(rt721->mbq_regmap, true); in rt721_sdca_io_init()
1529 pm_runtime_set_autosuspend_delay(&slave->dev, 3000); in rt721_sdca_io_init()
1530 pm_runtime_use_autosuspend(&slave->dev); in rt721_sdca_io_init()
1533 pm_runtime_set_active(&slave->dev); in rt721_sdca_io_init()
1536 pm_runtime_mark_last_busy(&slave->dev); in rt721_sdca_io_init()
1538 pm_runtime_enable(&slave->dev); in rt721_sdca_io_init()
1541 pm_runtime_get_noresume(&slave->dev); in rt721_sdca_io_init()
1545 if (rt721->first_hw_init) { in rt721_sdca_io_init()
1546 regcache_cache_bypass(rt721->regmap, false); in rt721_sdca_io_init()
1547 regcache_mark_dirty(rt721->regmap); in rt721_sdca_io_init()
1548 regcache_cache_bypass(rt721->mbq_regmap, false); in rt721_sdca_io_init()
1549 regcache_mark_dirty(rt721->mbq_regmap); in rt721_sdca_io_init()
1551 rt721->first_hw_init = true; in rt721_sdca_io_init()
1554 rt721->hw_init = true; in rt721_sdca_io_init()
1556 pm_runtime_put_autosuspend(&slave->dev); in rt721_sdca_io_init()
1558 dev_dbg(&slave->dev, "%s hw_init complete\n", __func__); in rt721_sdca_io_init()