• Home
  • Raw
  • Download

Lines Matching +full:jd +full:- +full:src

1 // SPDX-License-Identifier: GPL-2.0-only
3 // rt712-sdca.c -- rt712 SDCA ALSA SoC audio driver
23 #include <sound/soc-dapm.h>
25 #include "rt712-sdca.h"
31 struct regmap *regmap = rt712->mbq_regmap; in rt712_sdca_index_write()
36 dev_err(&rt712->slave->dev, in rt712_sdca_index_write()
47 struct regmap *regmap = rt712->mbq_regmap; in rt712_sdca_index_read()
52 dev_err(&rt712->slave->dev, in rt712_sdca_index_read()
77 struct regmap *regmap = rt712->regmap; in rt712_sdca_calibration()
81 mutex_lock(&rt712->calibrate_mutex); in rt712_sdca_calibration()
84 /* Set HP-JD source from JD1 */ in rt712_sdca_calibration()
93 /* W1C Trigger DC calibration (HP & Class-D) */ in rt712_sdca_calibration()
109 dev_err(dev, "%s, calibration time-out!\n", __func__); in rt712_sdca_calibration()
112 ret = -ETIMEDOUT; in rt712_sdca_calibration()
124 /* Release HP-JD, EN_CBJ_TIE_GL/R open, en_osw gating auto done bit */ in rt712_sdca_calibration()
127 mutex_unlock(&rt712->calibrate_mutex); in rt712_sdca_calibration()
139 ret = regmap_read(rt712->regmap, in rt712_sdca_button_detect()
150 ret = regmap_read(rt712->regmap, in rt712_sdca_button_detect()
157 ret = regmap_read(rt712->regmap, in rt712_sdca_button_detect()
203 regmap_write(rt712->regmap, in rt712_sdca_button_detect()
216 ret = regmap_read(rt712->regmap, in rt712_sdca_headset_detect()
224 rt712->jack_type = 0; in rt712_sdca_headset_detect()
227 rt712->jack_type = SND_JACK_HEADPHONE; in rt712_sdca_headset_detect()
230 rt712->jack_type = SND_JACK_HEADSET; in rt712_sdca_headset_detect()
236 ret = regmap_write(rt712->regmap, in rt712_sdca_headset_detect()
243 dev_dbg(&rt712->slave->dev, in rt712_sdca_headset_detect()
259 if (!rt712->hs_jack) in rt712_sdca_jack_detect_handler()
262 if (!rt712->component->card || !rt712->component->card->instantiated) in rt712_sdca_jack_detect_handler()
266 if (rt712->scp_sdca_stat1 & SDW_SCP_SDCA_INT_SDCA_0) { in rt712_sdca_jack_detect_handler()
273 if (rt712->scp_sdca_stat2 & SDW_SCP_SDCA_INT_SDCA_8) in rt712_sdca_jack_detect_handler()
276 if (rt712->jack_type == 0) in rt712_sdca_jack_detect_handler()
279 dev_dbg(&rt712->slave->dev, in rt712_sdca_jack_detect_handler()
280 "in %s, jack_type=0x%x\n", __func__, rt712->jack_type); in rt712_sdca_jack_detect_handler()
281 dev_dbg(&rt712->slave->dev, in rt712_sdca_jack_detect_handler()
283 dev_dbg(&rt712->slave->dev, in rt712_sdca_jack_detect_handler()
285 rt712->scp_sdca_stat1, rt712->scp_sdca_stat2); in rt712_sdca_jack_detect_handler()
287 snd_soc_jack_report(rt712->hs_jack, rt712->jack_type | btn_type, in rt712_sdca_jack_detect_handler()
294 snd_soc_jack_report(rt712->hs_jack, rt712->jack_type, in rt712_sdca_jack_detect_handler()
300 &rt712->jack_btn_check_work, msecs_to_jiffies(200)); in rt712_sdca_jack_detect_handler()
312 ret = regmap_read(rt712->regmap, in rt712_sdca_btn_check_handler()
321 ret = regmap_read(rt712->regmap, in rt712_sdca_btn_check_handler()
328 ret = regmap_read(rt712->regmap, in rt712_sdca_btn_check_handler()
370 rt712->jack_type = 0; in rt712_sdca_btn_check_handler()
373 dev_dbg(&rt712->slave->dev, "%s, btn_type=0x%x\n", __func__, btn_type); in rt712_sdca_btn_check_handler()
374 snd_soc_jack_report(rt712->hs_jack, rt712->jack_type | btn_type, in rt712_sdca_btn_check_handler()
381 snd_soc_jack_report(rt712->hs_jack, rt712->jack_type, in rt712_sdca_btn_check_handler()
387 &rt712->jack_btn_check_work, msecs_to_jiffies(200)); in rt712_sdca_btn_check_handler()
398 mutex_lock(&rt712->calibrate_mutex); in rt712_sdca_jack_init()
400 if (rt712->hs_jack) { in rt712_sdca_jack_init()
416 switch (rt712->jd_src) { in rt712_sdca_jack_init()
418 /* Set HP-JD source from JD1 */ in rt712_sdca_jack_init()
422 dev_warn(rt712->component->dev, "Wrong JD source\n"); in rt712_sdca_jack_init()
427 sdw_write_no_pm(rt712->slave, SDW_SCP_SDCA_INTMASK1, SDW_SCP_SDCA_INTMASK_SDCA_0); in rt712_sdca_jack_init()
429 sdw_write_no_pm(rt712->slave, SDW_SCP_SDCA_INTMASK2, SDW_SCP_SDCA_INTMASK_SDCA_8); in rt712_sdca_jack_init()
430 dev_dbg(&rt712->slave->dev, "in %s enable\n", __func__); in rt712_sdca_jack_init()
442 dev_dbg(&rt712->slave->dev, "in %s disable\n", __func__); in rt712_sdca_jack_init()
445 mutex_unlock(&rt712->calibrate_mutex); in rt712_sdca_jack_init()
454 rt712->hs_jack = hs_jack; in rt712_sdca_set_jack_detect()
456 if (!rt712->first_hw_init) in rt712_sdca_set_jack_detect()
459 ret = pm_runtime_resume_and_get(component->dev); in rt712_sdca_set_jack_detect()
461 if (ret != -EACCES) { in rt712_sdca_set_jack_detect()
462 dev_err(component->dev, "%s: failed to resume %d\n", __func__, ret); in rt712_sdca_set_jack_detect()
467 dev_dbg(component->dev, "%s: skipping jack init for now\n", __func__); in rt712_sdca_set_jack_detect()
473 pm_runtime_mark_last_busy(component->dev); in rt712_sdca_set_jack_detect()
474 pm_runtime_put_autosuspend(component->dev); in rt712_sdca_set_jack_detect()
485 (struct soc_mixer_control *)kcontrol->private_value; in rt712_sdca_set_gain_put()
493 if (strstr(ucontrol->id.name, "FU0F Capture Volume")) in rt712_sdca_set_gain_put()
496 regmap_read(rt712->mbq_regmap, mc->reg, &lvalue); in rt712_sdca_set_gain_put()
497 regmap_read(rt712->mbq_regmap, mc->rreg, &rvalue); in rt712_sdca_set_gain_put()
500 gain_l_val = ucontrol->value.integer.value[0]; in rt712_sdca_set_gain_put()
501 if (gain_l_val > mc->max) in rt712_sdca_set_gain_put()
502 gain_l_val = mc->max; in rt712_sdca_set_gain_put()
504 if (mc->shift == 8) /* boost gain */ in rt712_sdca_set_gain_put()
509 gain_l_val = 0x1e00 - ((mc->max - gain_l_val) * interval_offset); in rt712_sdca_set_gain_put()
511 gain_l_val = 0 - ((mc->max - gain_l_val) * interval_offset); in rt712_sdca_set_gain_put()
516 gain_r_val = ucontrol->value.integer.value[1]; in rt712_sdca_set_gain_put()
517 if (gain_r_val > mc->max) in rt712_sdca_set_gain_put()
518 gain_r_val = mc->max; in rt712_sdca_set_gain_put()
520 if (mc->shift == 8) /* boost gain */ in rt712_sdca_set_gain_put()
525 gain_r_val = 0x1e00 - ((mc->max - gain_r_val) * interval_offset); in rt712_sdca_set_gain_put()
527 gain_r_val = 0 - ((mc->max - gain_r_val) * interval_offset); in rt712_sdca_set_gain_put()
535 regmap_write(rt712->mbq_regmap, mc->reg, gain_l_val); in rt712_sdca_set_gain_put()
537 regmap_write(rt712->mbq_regmap, mc->rreg, gain_r_val); in rt712_sdca_set_gain_put()
539 regmap_read(rt712->mbq_regmap, mc->reg, &read_l); in rt712_sdca_set_gain_put()
540 regmap_read(rt712->mbq_regmap, mc->rreg, &read_r); in rt712_sdca_set_gain_put()
544 return -EIO; in rt712_sdca_set_gain_put()
553 (struct soc_mixer_control *)kcontrol->private_value; in rt712_sdca_set_gain_get()
559 if (strstr(ucontrol->id.name, "FU0F Capture Volume")) in rt712_sdca_set_gain_get()
562 regmap_read(rt712->mbq_regmap, mc->reg, &read_l); in rt712_sdca_set_gain_get()
563 regmap_read(rt712->mbq_regmap, mc->rreg, &read_r); in rt712_sdca_set_gain_get()
565 if (mc->shift == 8) /* boost gain */ in rt712_sdca_set_gain_get()
569 ctl_l = mc->max - (((0x1e00 - read_l) & 0xffff) / interval_offset); in rt712_sdca_set_gain_get()
571 ctl_l = mc->max - (((0 - read_l) & 0xffff) / interval_offset); in rt712_sdca_set_gain_get()
575 if (mc->shift == 8) /* boost gain */ in rt712_sdca_set_gain_get()
579 ctl_r = mc->max - (((0x1e00 - read_r) & 0xffff) / interval_offset); in rt712_sdca_set_gain_get()
581 ctl_r = mc->max - (((0 - read_r) & 0xffff) / interval_offset); in rt712_sdca_set_gain_get()
586 ucontrol->value.integer.value[0] = ctl_l; in rt712_sdca_set_gain_get()
587 ucontrol->value.integer.value[1] = ctl_r; in rt712_sdca_set_gain_get()
597 ch_l = (rt712->fu0f_dapm_mute || rt712->fu0f_mixer_l_mute) ? 0x01 : 0x00; in rt712_sdca_set_fu0f_capture_ctl()
598 ch_r = (rt712->fu0f_dapm_mute || rt712->fu0f_mixer_r_mute) ? 0x01 : 0x00; in rt712_sdca_set_fu0f_capture_ctl()
600 err = regmap_write(rt712->regmap, in rt712_sdca_set_fu0f_capture_ctl()
606 err = regmap_write(rt712->regmap, in rt712_sdca_set_fu0f_capture_ctl()
621 ucontrol->value.integer.value[0] = !rt712->fu0f_mixer_l_mute; in rt712_sdca_fu0f_capture_get()
622 ucontrol->value.integer.value[1] = !rt712->fu0f_mixer_r_mute; in rt712_sdca_fu0f_capture_get()
633 if (rt712->fu0f_mixer_l_mute == !ucontrol->value.integer.value[0] && in rt712_sdca_fu0f_capture_put()
634 rt712->fu0f_mixer_r_mute == !ucontrol->value.integer.value[1]) in rt712_sdca_fu0f_capture_put()
637 rt712->fu0f_mixer_l_mute = !ucontrol->value.integer.value[0]; in rt712_sdca_fu0f_capture_put()
638 rt712->fu0f_mixer_r_mute = !ucontrol->value.integer.value[1]; in rt712_sdca_fu0f_capture_put()
646 static const DECLARE_TLV_DB_SCALE(out_vol_tlv, -6525, 75, 0);
647 static const DECLARE_TLV_DB_SCALE(mic_vol_tlv, -1725, 75, 0);
698 ucontrol->value.enumerated.item[0] = val; in rt712_sdca_mux_get()
711 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; in rt712_sdca_mux_put()
712 unsigned int *item = ucontrol->value.enumerated.item; in rt712_sdca_mux_put()
716 if (item[0] >= e->items) in rt712_sdca_mux_put()
717 return -EINVAL; in rt712_sdca_mux_put()
719 if (ucontrol->value.enumerated.item[0] == 0) in rt712_sdca_mux_put()
721 else if (ucontrol->value.enumerated.item[0] == 1) in rt712_sdca_mux_put()
724 return -EINVAL; in rt712_sdca_mux_put()
758 snd_soc_dapm_to_component(w->dapm); in rt712_sdca_fu05_event()
764 regmap_write(rt712->regmap, in rt712_sdca_fu05_event()
768 regmap_write(rt712->regmap, in rt712_sdca_fu05_event()
774 regmap_write(rt712->regmap, in rt712_sdca_fu05_event()
778 regmap_write(rt712->regmap, in rt712_sdca_fu05_event()
791 snd_soc_dapm_to_component(w->dapm); in rt712_sdca_fu0f_event()
796 rt712->fu0f_dapm_mute = false; in rt712_sdca_fu0f_event()
800 rt712->fu0f_dapm_mute = true; in rt712_sdca_fu0f_event()
811 snd_soc_dapm_to_component(w->dapm); in rt712_sdca_pde40_event()
817 regmap_write(rt712->regmap, in rt712_sdca_pde40_event()
823 regmap_write(rt712->regmap, in rt712_sdca_pde40_event()
836 snd_soc_dapm_to_component(w->dapm); in rt712_sdca_pde12_event()
842 regmap_write(rt712->regmap, in rt712_sdca_pde12_event()
848 regmap_write(rt712->regmap, in rt712_sdca_pde12_event()
861 snd_soc_dapm_to_component(w->dapm); in rt712_sdca_classd_event()
867 regmap_write(rt712->regmap, in rt712_sdca_classd_event()
873 regmap_write(rt712->regmap, in rt712_sdca_classd_event()
952 device_property_read_u32(dev, "realtek,jd-src", &rt712->jd_src); in rt712_sdca_parse_dt()
963 rt712_sdca_parse_dt(rt712, &rt712->slave->dev); in rt712_sdca_probe()
964 rt712->component = component; in rt712_sdca_probe()
967 if (rt712->hw_id != RT712_DEV_ID_713) { in rt712_sdca_probe()
976 if (!rt712->first_hw_init) in rt712_sdca_probe()
979 ret = pm_runtime_resume(component->dev); in rt712_sdca_probe()
980 if (ret < 0 && ret != -EACCES) in rt712_sdca_probe()
1016 struct snd_soc_component *component = dai->component; in rt712_sdca_pcm_hw_params()
1025 dev_dbg(dai->dev, "%s %s", __func__, dai->name); in rt712_sdca_pcm_hw_params()
1029 return -EINVAL; in rt712_sdca_pcm_hw_params()
1031 if (!rt712->slave) in rt712_sdca_pcm_hw_params()
1032 return -EINVAL; in rt712_sdca_pcm_hw_params()
1035 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { in rt712_sdca_pcm_hw_params()
1037 if (dai->id == RT712_AIF1) in rt712_sdca_pcm_hw_params()
1039 else if (dai->id == RT712_AIF2) in rt712_sdca_pcm_hw_params()
1042 return -EINVAL; in rt712_sdca_pcm_hw_params()
1045 if (dai->id == RT712_AIF1) in rt712_sdca_pcm_hw_params()
1048 return -EINVAL; in rt712_sdca_pcm_hw_params()
1057 port_config.ch_mask = GENMASK(num_channels - 1, 0); in rt712_sdca_pcm_hw_params()
1060 retval = sdw_stream_add_slave(rt712->slave, &stream_config, in rt712_sdca_pcm_hw_params()
1063 dev_err(dai->dev, "Unable to configure port\n"); in rt712_sdca_pcm_hw_params()
1068 dev_err(component->dev, "Unsupported channels %d\n", in rt712_sdca_pcm_hw_params()
1070 return -EINVAL; in rt712_sdca_pcm_hw_params()
1088 dev_err(component->dev, "Rate %d is not supported\n", in rt712_sdca_pcm_hw_params()
1090 return -EINVAL; in rt712_sdca_pcm_hw_params()
1094 switch (dai->id) { in rt712_sdca_pcm_hw_params()
1096 regmap_write(rt712->regmap, in rt712_sdca_pcm_hw_params()
1099 regmap_write(rt712->regmap, in rt712_sdca_pcm_hw_params()
1104 regmap_write(rt712->regmap, in rt712_sdca_pcm_hw_params()
1109 dev_err(component->dev, "Wrong DAI id\n"); in rt712_sdca_pcm_hw_params()
1110 return -EINVAL; in rt712_sdca_pcm_hw_params()
1119 struct snd_soc_component *component = dai->component; in rt712_sdca_pcm_hw_free()
1124 if (!rt712->slave) in rt712_sdca_pcm_hw_free()
1125 return -EINVAL; in rt712_sdca_pcm_hw_free()
1127 sdw_stream_remove_slave(rt712->slave, sdw_stream); in rt712_sdca_pcm_hw_free()
1145 .name = "rt712-sdca-aif1",
1164 .name = "rt712-sdca-aif2",
1185 return -ENOMEM; in rt712_sdca_init()
1188 rt712->slave = slave; in rt712_sdca_init()
1189 rt712->regmap = regmap; in rt712_sdca_init()
1190 rt712->mbq_regmap = mbq_regmap; in rt712_sdca_init()
1192 regcache_cache_only(rt712->regmap, true); in rt712_sdca_init()
1193 regcache_cache_only(rt712->mbq_regmap, true); in rt712_sdca_init()
1195 mutex_init(&rt712->calibrate_mutex); in rt712_sdca_init()
1196 mutex_init(&rt712->disable_irq_lock); in rt712_sdca_init()
1198 INIT_DELAYED_WORK(&rt712->jack_detect_work, rt712_sdca_jack_detect_handler); in rt712_sdca_init()
1199 INIT_DELAYED_WORK(&rt712->jack_btn_check_work, rt712_sdca_btn_check_handler); in rt712_sdca_init()
1205 rt712->hw_init = false; in rt712_sdca_init()
1206 rt712->first_hw_init = false; in rt712_sdca_init()
1207 rt712->fu0f_dapm_mute = true; in rt712_sdca_init()
1208 rt712->fu0f_mixer_l_mute = rt712->fu0f_mixer_r_mute = true; in rt712_sdca_init()
1210 /* JD source uses JD1 in default */ in rt712_sdca_init()
1211 rt712->jd_src = RT712_JD1; in rt712_sdca_init()
1213 if (slave->id.part_id != RT712_PART_ID_713) in rt712_sdca_init()
1234 * fail with -EACCESS because of race conditions between card creation and enumeration in rt712_sdca_init()
1248 rt712->disable_irq = false; in rt712_sdca_io_init()
1250 if (rt712->hw_init) in rt712_sdca_io_init()
1253 regcache_cache_only(rt712->regmap, false); in rt712_sdca_io_init()
1254 regcache_cache_only(rt712->mbq_regmap, false); in rt712_sdca_io_init()
1255 if (rt712->first_hw_init) { in rt712_sdca_io_init()
1256 regcache_cache_bypass(rt712->regmap, true); in rt712_sdca_io_init()
1257 regcache_cache_bypass(rt712->mbq_regmap, true); in rt712_sdca_io_init()
1264 pm_runtime_set_active(&slave->dev); in rt712_sdca_io_init()
1267 pm_runtime_get_noresume(&slave->dev); in rt712_sdca_io_init()
1270 rt712->hw_id = (val & 0xf000) >> 12; in rt712_sdca_io_init()
1277 regmap_write(rt712->regmap, RT712_RC_CAL, 0x23); in rt712_sdca_io_init()
1298 regmap_write(rt712->regmap, 0x2f50, 0x00); in rt712_sdca_io_init()
1299 regmap_write(rt712->regmap, 0x2f54, 0x00); in rt712_sdca_io_init()
1300 regmap_write(rt712->regmap, in rt712_sdca_io_init()
1304 if (rt712->hw_id != RT712_DEV_ID_713) { in rt712_sdca_io_init()
1307 regmap_write(rt712->regmap, in rt712_sdca_io_init()
1315 if (rt712->hs_jack) in rt712_sdca_io_init()
1321 if (rt712->first_hw_init) { in rt712_sdca_io_init()
1322 regcache_cache_bypass(rt712->regmap, false); in rt712_sdca_io_init()
1323 regcache_mark_dirty(rt712->regmap); in rt712_sdca_io_init()
1324 regcache_cache_bypass(rt712->mbq_regmap, false); in rt712_sdca_io_init()
1325 regcache_mark_dirty(rt712->mbq_regmap); in rt712_sdca_io_init()
1327 rt712->first_hw_init = true; in rt712_sdca_io_init()
1330 rt712->hw_init = true; in rt712_sdca_io_init()
1332 pm_runtime_mark_last_busy(&slave->dev); in rt712_sdca_io_init()
1333 pm_runtime_put_autosuspend(&slave->dev); in rt712_sdca_io_init()
1335 dev_dbg(&slave->dev, "%s hw_init complete\n", __func__); in rt712_sdca_io_init()