Lines Matching +full:jd +full:- +full:invert
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"
33 struct regmap *regmap = rt722->regmap; in rt722_sdca_index_write()
39 dev_err(&rt722->slave->dev, in rt722_sdca_index_write()
50 struct regmap *regmap = rt722->regmap; in rt722_sdca_index_read()
55 dev_err(&rt722->slave->dev, in rt722_sdca_index_read()
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()
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()
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()
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()
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()
354 (struct soc_mixer_control *)kcontrol->private_value; 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()
426 (struct soc_mixer_control *)kcontrol->private_value; 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()
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()
490 (struct rt722_sdca_dmic_kctrl_priv *)kcontrol->private_value; 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()
505 (struct rt722_sdca_dmic_kctrl_priv *)kcontrol->private_value; 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()
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()
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()
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()
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()
597 (struct rt722_sdca_dmic_kctrl_priv *)kcontrol->private_value; 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()
627 (struct rt722_sdca_dmic_kctrl_priv *)kcontrol->private_value; 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()
675 .invert = xinvert})
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);
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()
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()
838 snd_soc_dapm_to_component(w->dapm); in rt722_sdca_fu113_event()
843 rt722->fu1e_dapm_mute = false; in rt722_sdca_fu113_event()
847 rt722->fu1e_dapm_mute = true; in rt722_sdca_fu113_event()
858 snd_soc_dapm_to_component(w->dapm); in rt722_sdca_fu36_event()
863 rt722->fu0f_dapm_mute = false; in rt722_sdca_fu36_event()
867 rt722->fu0f_dapm_mute = true; in rt722_sdca_fu36_event()
878 snd_soc_dapm_to_component(w->dapm); in rt722_sdca_pde47_event()
884 regmap_write(rt722->regmap, in rt722_sdca_pde47_event()
889 regmap_write(rt722->regmap, in rt722_sdca_pde47_event()
901 snd_soc_dapm_to_component(w->dapm); in rt722_sdca_pde23_event()
907 regmap_write(rt722->regmap, in rt722_sdca_pde23_event()
912 regmap_write(rt722->regmap, in rt722_sdca_pde23_event()
924 snd_soc_dapm_to_component(w->dapm); in rt722_sdca_pde11_event()
930 regmap_write(rt722->regmap, in rt722_sdca_pde11_event()
935 regmap_write(rt722->regmap, in rt722_sdca_pde11_event()
947 snd_soc_dapm_to_component(w->dapm); in rt722_sdca_pde12_event()
953 regmap_write(rt722->regmap, in rt722_sdca_pde12_event()
958 regmap_write(rt722->regmap, in rt722_sdca_pde12_event()
1040 device_property_read_u32(dev, "realtek,jd-src", &rt722->jd_src); in rt722_sdca_parse_dt()
1050 rt722_sdca_parse_dt(rt722, &rt722->slave->dev); in rt722_sdca_probe()
1051 rt722->component = component; in rt722_sdca_probe()
1053 ret = pm_runtime_resume(component->dev); in rt722_sdca_probe()
1054 if (ret < 0 && ret != -EACCES) in rt722_sdca_probe()
1090 struct snd_soc_component *component = dai->component; in rt722_sdca_pcm_hw_params()
1099 dev_dbg(dai->dev, "%s %s", __func__, dai->name); in rt722_sdca_pcm_hw_params()
1103 return -EINVAL; in rt722_sdca_pcm_hw_params()
1105 if (!rt722->slave) in rt722_sdca_pcm_hw_params()
1106 return -EINVAL; in rt722_sdca_pcm_hw_params()
1110 * RT722_AIF1 with port = 2 for headset-mic capture in rt722_sdca_pcm_hw_params()
1112 * RT722_AIF3 with port = 6 for digital-mic capture in rt722_sdca_pcm_hw_params()
1114 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { in rt722_sdca_pcm_hw_params()
1116 if (dai->id == RT722_AIF1) in rt722_sdca_pcm_hw_params()
1118 else if (dai->id == RT722_AIF2) in rt722_sdca_pcm_hw_params()
1121 return -EINVAL; in rt722_sdca_pcm_hw_params()
1124 if (dai->id == RT722_AIF1) in rt722_sdca_pcm_hw_params()
1126 else if (dai->id == RT722_AIF3) in rt722_sdca_pcm_hw_params()
1129 return -EINVAL; in rt722_sdca_pcm_hw_params()
1137 port_config.ch_mask = GENMASK(num_channels - 1, 0); in rt722_sdca_pcm_hw_params()
1140 retval = sdw_stream_add_slave(rt722->slave, &stream_config, in rt722_sdca_pcm_hw_params()
1143 dev_err(dai->dev, "%s: Unable to configure port\n", __func__); in rt722_sdca_pcm_hw_params()
1148 dev_err(component->dev, "%s: Unsupported channels %d\n", in rt722_sdca_pcm_hw_params()
1150 return -EINVAL; in rt722_sdca_pcm_hw_params()
1168 dev_err(component->dev, "%s: Rate %d is not supported\n", in rt722_sdca_pcm_hw_params()
1170 return -EINVAL; in rt722_sdca_pcm_hw_params()
1174 if (dai->id == RT722_AIF1) { in rt722_sdca_pcm_hw_params()
1175 regmap_write(rt722->regmap, in rt722_sdca_pcm_hw_params()
1178 regmap_write(rt722->regmap, in rt722_sdca_pcm_hw_params()
1183 if (dai->id == RT722_AIF2) in rt722_sdca_pcm_hw_params()
1184 regmap_write(rt722->regmap, in rt722_sdca_pcm_hw_params()
1188 if (dai->id == RT722_AIF3) in rt722_sdca_pcm_hw_params()
1189 regmap_write(rt722->regmap, in rt722_sdca_pcm_hw_params()
1199 struct snd_soc_component *component = dai->component; in rt722_sdca_pcm_hw_free()
1204 if (!rt722->slave) in rt722_sdca_pcm_hw_free()
1205 return -EINVAL; in rt722_sdca_pcm_hw_free()
1207 sdw_stream_remove_slave(rt722->slave, sdw_stream); in rt722_sdca_pcm_hw_free()
1225 .name = "rt722-sdca-aif1",
1244 .name = "rt722-sdca-aif2",
1256 .name = "rt722-sdca-aif3",
1275 return -ENOMEM; in rt722_sdca_init()
1278 rt722->slave = slave; in rt722_sdca_init()
1279 rt722->regmap = regmap; in rt722_sdca_init()
1281 mutex_init(&rt722->calibrate_mutex); in rt722_sdca_init()
1282 mutex_init(&rt722->disable_irq_lock); in rt722_sdca_init()
1284 INIT_DELAYED_WORK(&rt722->jack_detect_work, rt722_sdca_jack_detect_handler); in rt722_sdca_init()
1285 INIT_DELAYED_WORK(&rt722->jack_btn_check_work, rt722_sdca_btn_check_handler); in rt722_sdca_init()
1291 rt722->hw_init = false; in rt722_sdca_init()
1292 rt722->first_hw_init = false; in rt722_sdca_init()
1293 rt722->fu1e_dapm_mute = true; in rt722_sdca_init()
1294 rt722->fu0f_dapm_mute = true; in rt722_sdca_init()
1295 rt722->fu0f_mixer_l_mute = rt722->fu0f_mixer_r_mute = true; in rt722_sdca_init()
1296 rt722->fu1e_mixer_mute[0] = rt722->fu1e_mixer_mute[1] = in rt722_sdca_init()
1297 rt722->fu1e_mixer_mute[2] = rt722->fu1e_mixer_mute[3] = true; in rt722_sdca_init()
1333 regmap_write(rt722->regmap, in rt722_sdca_dmic_preset()
1337 regmap_write(rt722->regmap, 0x2f5c, 0x25); in rt722_sdca_dmic_preset()
1358 regmap_write(rt722->regmap, in rt722_sdca_amp_preset()
1386 /* Set JD de-bounce clock control */ in rt722_sdca_jack_preset()
1404 dev_dbg(&rt722->slave->dev, "calibration failed!, ret=%d\n", ret); in rt722_sdca_jack_preset()
1410 dev_dbg(&rt722->slave->dev, "%s, calibration time-out!\n", __func__); in rt722_sdca_jack_preset()
1429 regmap_write(rt722->regmap, 0x2f58, 0x07); in rt722_sdca_jack_preset()
1430 regmap_write(rt722->regmap, 0x2f03, 0x06); in rt722_sdca_jack_preset()
1436 /* Release HP-JD, EN_CBJ_TIE_GL/R open, en_osw gating auto done bit */ in rt722_sdca_jack_preset()
1445 rt722->disable_irq = false; in rt722_sdca_io_init()
1447 if (rt722->hw_init) in rt722_sdca_io_init()
1450 if (rt722->first_hw_init) { in rt722_sdca_io_init()
1451 regcache_cache_only(rt722->regmap, false); in rt722_sdca_io_init()
1452 regcache_cache_bypass(rt722->regmap, true); in rt722_sdca_io_init()
1459 pm_runtime_set_autosuspend_delay(&slave->dev, 3000); in rt722_sdca_io_init()
1460 pm_runtime_use_autosuspend(&slave->dev); in rt722_sdca_io_init()
1463 pm_runtime_set_active(&slave->dev); in rt722_sdca_io_init()
1466 pm_runtime_mark_last_busy(&slave->dev); in rt722_sdca_io_init()
1468 pm_runtime_enable(&slave->dev); in rt722_sdca_io_init()
1471 pm_runtime_get_noresume(&slave->dev); in rt722_sdca_io_init()
1477 if (rt722->first_hw_init) { in rt722_sdca_io_init()
1478 regcache_cache_bypass(rt722->regmap, false); in rt722_sdca_io_init()
1479 regcache_mark_dirty(rt722->regmap); in rt722_sdca_io_init()
1481 rt722->first_hw_init = true; in rt722_sdca_io_init()
1484 rt722->hw_init = true; in rt722_sdca_io_init()
1486 pm_runtime_mark_last_busy(&slave->dev); in rt722_sdca_io_init()
1487 pm_runtime_put_autosuspend(&slave->dev); in rt722_sdca_io_init()
1489 dev_dbg(&slave->dev, "%s hw_init complete\n", __func__); in rt722_sdca_io_init()