Lines Matching refs:rt711

3 // rt711-sdca.c -- rt711 SDCA ALSA SoC audio driver
27 #include "rt711-sdca.h"
29 static int rt711_sdca_index_write(struct rt711_sdca_priv *rt711,
33 struct regmap *regmap = rt711->mbq_regmap;
38 dev_err(&rt711->slave->dev,
45 static int rt711_sdca_index_read(struct rt711_sdca_priv *rt711,
49 struct regmap *regmap = rt711->mbq_regmap;
54 dev_err(&rt711->slave->dev,
61 static int rt711_sdca_index_update_bits(struct rt711_sdca_priv *rt711,
67 ret = rt711_sdca_index_read(rt711, nid, reg, &tmp);
72 return rt711_sdca_index_write(rt711, nid, reg, tmp);
75 static void rt711_sdca_reset(struct rt711_sdca_priv *rt711)
77 rt711_sdca_index_update_bits(rt711, RT711_VENDOR_REG,
80 rt711_sdca_index_update_bits(rt711, RT711_VENDOR_HDA_CTL,
84 static int rt711_sdca_calibration(struct rt711_sdca_priv *rt711)
88 struct regmap *regmap = rt711->regmap;
92 mutex_lock(&rt711->calibrate_mutex);
95 regmap_read(rt711->regmap, RT711_RC_CAL_STATUS, &val);
98 rt711_sdca_index_update_bits(rt711, RT711_VENDOR_ANALOG_CTL,
103 ret = regmap_read(rt711->regmap, RT711_RC_CAL_STATUS, &val);
111 rt711_sdca_index_update_bits(rt711, RT711_VENDOR_REG,
115 rt711_sdca_index_update_bits(rt711, RT711_VENDOR_REG,
119 rt711_sdca_index_update_bits(rt711, RT711_VENDOR_CALI,
121 rt711_sdca_index_update_bits(rt711, RT711_VENDOR_CALI,
126 if (rt711->hw_ver == RT711_VER_VD0)
127 rt711_sdca_index_update_bits(rt711, RT711_VENDOR_CALI,
132 rt711_sdca_index_update_bits(rt711, RT711_VENDOR_CALI,
137 rt711_sdca_index_read(rt711, RT711_VENDOR_CALI,
143 ret = rt711_sdca_index_read(rt711, RT711_VENDOR_CALI,
156 rt711_sdca_index_update_bits(rt711, RT711_VENDOR_REG,
160 rt711_sdca_index_write(rt711, RT711_VENDOR_REG,
163 mutex_unlock(&rt711->calibrate_mutex);
168 static unsigned int rt711_sdca_button_detect(struct rt711_sdca_priv *rt711)
175 ret = regmap_read(rt711->regmap,
186 ret = regmap_read(rt711->regmap,
193 ret = regmap_read(rt711->regmap,
239 regmap_write(rt711->regmap,
246 static int rt711_sdca_headset_detect(struct rt711_sdca_priv *rt711)
252 ret = regmap_read(rt711->regmap,
260 rt711->jack_type = 0;
263 rt711->jack_type = SND_JACK_HEADPHONE;
266 rt711->jack_type = SND_JACK_HEADSET;
272 ret = regmap_write(rt711->regmap,
279 dev_dbg(&rt711->slave->dev,
291 struct rt711_sdca_priv *rt711 =
295 if (!rt711->hs_jack)
298 if (!snd_soc_card_is_instantiated(rt711->component->card))
302 if (rt711->scp_sdca_stat1 & SDW_SCP_SDCA_INT_SDCA_0) {
303 ret = rt711_sdca_headset_detect(rt711);
309 if (rt711->scp_sdca_stat2 & SDW_SCP_SDCA_INT_SDCA_8)
310 btn_type = rt711_sdca_button_detect(rt711);
312 if (rt711->jack_type == 0)
315 dev_dbg(&rt711->slave->dev,
316 "in %s, jack_type=0x%x\n", __func__, rt711->jack_type);
317 dev_dbg(&rt711->slave->dev,
319 dev_dbg(&rt711->slave->dev,
321 rt711->scp_sdca_stat1, rt711->scp_sdca_stat2);
323 snd_soc_jack_report(rt711->hs_jack, rt711->jack_type | btn_type,
330 snd_soc_jack_report(rt711->hs_jack, rt711->jack_type,
336 &rt711->jack_btn_check_work, msecs_to_jiffies(200));
342 struct rt711_sdca_priv *rt711 =
348 ret = regmap_read(rt711->regmap,
357 ret = regmap_read(rt711->regmap,
364 ret = regmap_read(rt711->regmap,
406 rt711->jack_type = 0;
408 dev_dbg(&rt711->slave->dev, "%s, btn_type=0x%x\n", __func__, btn_type);
409 snd_soc_jack_report(rt711->hs_jack, rt711->jack_type | btn_type,
416 snd_soc_jack_report(rt711->hs_jack, rt711->jack_type,
422 &rt711->jack_btn_check_work, msecs_to_jiffies(200));
431 static void rt711_sdca_jack_init(struct rt711_sdca_priv *rt711)
433 mutex_lock(&rt711->calibrate_mutex);
435 if (rt711->hs_jack) {
437 rt711_sdca_index_update_bits(rt711, RT711_VENDOR_HDA_CTL,
439 rt711_sdca_index_update_bits(rt711, RT711_VENDOR_HDA_CTL,
441 rt711_sdca_index_write(rt711, RT711_VENDOR_HDA_CTL,
443 rt711_sdca_index_update_bits(rt711, RT711_VENDOR_HDA_CTL,
447 rt711_sdca_index_update_bits(rt711, RT711_VENDOR_HDA_CTL,
450 switch (rt711->jd_src) {
455 rt711_sdca_index_update_bits(rt711, RT711_VENDOR_REG,
458 rt711_sdca_index_update_bits(rt711, RT711_VENDOR_REG,
461 rt711_sdca_index_update_bits(rt711, RT711_VENDOR_REG,
467 rt711_sdca_index_write(rt711, RT711_VENDOR_REG,
469 rt711_sdca_index_update_bits(rt711, RT711_VENDOR_REG,
472 rt711_sdca_index_update_bits(rt711, RT711_VENDOR_REG,
476 rt711_sdca_index_update_bits(rt711, RT711_VENDOR_REG,
482 dev_warn(rt711->component->dev, "Wrong JD source\n");
487 sdw_write_no_pm(rt711->slave, SDW_SCP_SDCA_INTMASK1, SDW_SCP_SDCA_INTMASK_SDCA_0);
489 sdw_write_no_pm(rt711->slave, SDW_SCP_SDCA_INTMASK2, SDW_SCP_SDCA_INTMASK_SDCA_8);
490 dev_dbg(&rt711->slave->dev, "in %s enable\n", __func__);
493 rt711_sdca_index_update_bits(rt711, RT711_VENDOR_HDA_CTL,
496 dev_dbg(&rt711->slave->dev, "in %s disable\n", __func__);
499 mutex_unlock(&rt711->calibrate_mutex);
505 struct rt711_sdca_priv *rt711 = snd_soc_component_get_drvdata(component);
508 rt711->hs_jack = hs_jack;
511 if (!rt711->first_hw_init)
526 rt711_sdca_jack_init(rt711);
541 struct rt711_sdca_priv *rt711 = snd_soc_component_get_drvdata(component);
550 regmap_read(rt711->mbq_regmap, mc->reg, &lvalue);
551 regmap_read(rt711->mbq_regmap, mc->rreg, &rvalue);
605 regmap_write(rt711->mbq_regmap, mc->reg, gain_l_val);
608 regmap_write(rt711->mbq_regmap, mc->rreg, gain_r_val);
610 regmap_read(rt711->mbq_regmap, mc->reg, &read_l);
611 regmap_read(rt711->mbq_regmap, mc->rreg, &read_r);
623 struct rt711_sdca_priv *rt711 = snd_soc_component_get_drvdata(component);
633 regmap_read(rt711->mbq_regmap, mc->reg, &read_l);
634 regmap_read(rt711->mbq_regmap, mc->rreg, &read_r);
685 static int rt711_sdca_set_fu0f_capture_ctl(struct rt711_sdca_priv *rt711)
690 ch_l = (rt711->fu0f_dapm_mute || rt711->fu0f_mixer_l_mute) ? 0x01 : 0x00;
691 ch_r = (rt711->fu0f_dapm_mute || rt711->fu0f_mixer_r_mute) ? 0x01 : 0x00;
693 err = regmap_write(rt711->regmap,
699 err = regmap_write(rt711->regmap,
708 static int rt711_sdca_set_fu1e_capture_ctl(struct rt711_sdca_priv *rt711)
713 ch_l = (rt711->fu1e_dapm_mute || rt711->fu1e_mixer_l_mute) ? 0x01 : 0x00;
714 ch_r = (rt711->fu1e_dapm_mute || rt711->fu1e_mixer_r_mute) ? 0x01 : 0x00;
716 err = regmap_write(rt711->regmap,
722 err = regmap_write(rt711->regmap,
735 struct rt711_sdca_priv *rt711 = snd_soc_component_get_drvdata(component);
737 ucontrol->value.integer.value[0] = !rt711->fu1e_mixer_l_mute;
738 ucontrol->value.integer.value[1] = !rt711->fu1e_mixer_r_mute;
746 struct rt711_sdca_priv *rt711 = snd_soc_component_get_drvdata(component);
749 if (rt711->fu1e_mixer_l_mute != !ucontrol->value.integer.value[0] ||
750 rt711->fu1e_mixer_r_mute != !ucontrol->value.integer.value[1])
753 rt711->fu1e_mixer_l_mute = !ucontrol->value.integer.value[0];
754 rt711->fu1e_mixer_r_mute = !ucontrol->value.integer.value[1];
755 err = rt711_sdca_set_fu1e_capture_ctl(rt711);
766 struct rt711_sdca_priv *rt711 = snd_soc_component_get_drvdata(component);
768 ucontrol->value.integer.value[0] = !rt711->fu0f_mixer_l_mute;
769 ucontrol->value.integer.value[1] = !rt711->fu0f_mixer_r_mute;
777 struct rt711_sdca_priv *rt711 = snd_soc_component_get_drvdata(component);
780 if (rt711->fu0f_mixer_l_mute != !ucontrol->value.integer.value[0] ||
781 rt711->fu0f_mixer_r_mute != !ucontrol->value.integer.value[1])
784 rt711->fu0f_mixer_l_mute = !ucontrol->value.integer.value[0];
785 rt711->fu0f_mixer_r_mute = !ucontrol->value.integer.value[1];
786 err = rt711_sdca_set_fu0f_capture_ctl(rt711);
834 struct rt711_sdca_priv *rt711 = snd_soc_component_get_drvdata(component);
844 rt711_sdca_index_read(rt711, RT711_VENDOR_HDA_CTL,
859 struct rt711_sdca_priv *rt711 = snd_soc_component_get_drvdata(component);
876 rt711_sdca_index_read(rt711, RT711_VENDOR_HDA_CTL,
886 rt711_sdca_index_update_bits(rt711, RT711_VENDOR_HDA_CTL,
922 struct rt711_sdca_priv *rt711 = snd_soc_component_get_drvdata(component);
927 regmap_write(rt711->regmap,
931 regmap_write(rt711->regmap,
937 regmap_write(rt711->regmap,
941 regmap_write(rt711->regmap,
955 struct rt711_sdca_priv *rt711 = snd_soc_component_get_drvdata(component);
959 rt711->fu0f_dapm_mute = false;
960 rt711_sdca_set_fu0f_capture_ctl(rt711);
963 rt711->fu0f_dapm_mute = true;
964 rt711_sdca_set_fu0f_capture_ctl(rt711);
975 struct rt711_sdca_priv *rt711 = snd_soc_component_get_drvdata(component);
979 rt711->fu1e_dapm_mute = false;
980 rt711_sdca_set_fu1e_capture_ctl(rt711);
983 rt711->fu1e_dapm_mute = true;
984 rt711_sdca_set_fu1e_capture_ctl(rt711);
995 struct rt711_sdca_priv *rt711 = snd_soc_component_get_drvdata(component);
1000 regmap_write(rt711->regmap,
1006 regmap_write(rt711->regmap,
1020 struct rt711_sdca_priv *rt711 = snd_soc_component_get_drvdata(component);
1025 regmap_write(rt711->regmap,
1031 regmap_write(rt711->regmap,
1045 struct rt711_sdca_priv *rt711 = snd_soc_component_get_drvdata(component);
1050 regmap_write(rt711->regmap,
1056 regmap_write(rt711->regmap,
1070 struct rt711_sdca_priv *rt711 = snd_soc_component_get_drvdata(component);
1075 regmap_read(rt711->regmap,
1079 regmap_write(rt711->regmap,
1083 regmap_write(rt711->regmap,
1089 regmap_write(rt711->regmap,
1094 regmap_write(rt711->regmap,
1109 struct rt711_sdca_priv *rt711 = snd_soc_component_get_drvdata(component);
1114 regmap_write(rt711->regmap,
1118 regmap_write(rt711->regmap,
1124 regmap_write(rt711->regmap,
1128 regmap_write(rt711->regmap,
1207 static int rt711_sdca_parse_dt(struct rt711_sdca_priv *rt711, struct device *dev)
1209 device_property_read_u32(dev, "realtek,jd-src", &rt711->jd_src);
1216 struct rt711_sdca_priv *rt711 = snd_soc_component_get_drvdata(component);
1219 rt711_sdca_parse_dt(rt711, &rt711->slave->dev);
1220 rt711->component = component;
1222 if (!rt711->first_hw_init)
1263 struct rt711_sdca_priv *rt711 = snd_soc_component_get_drvdata(component);
1276 if (!rt711->slave)
1293 retval = sdw_stream_add_slave(rt711->slave, &stream_config,
1327 regmap_write(rt711->regmap,
1330 regmap_write(rt711->regmap,
1333 regmap_write(rt711->regmap,
1344 struct rt711_sdca_priv *rt711 = snd_soc_component_get_drvdata(component);
1348 if (!rt711->slave)
1351 sdw_stream_remove_slave(rt711->slave, sdw_stream);
1369 .name = "rt711-sdca-aif1",
1388 .name = "rt711-sdca-aif2",
1404 struct rt711_sdca_priv *rt711;
1407 rt711 = devm_kzalloc(dev, sizeof(*rt711), GFP_KERNEL);
1408 if (!rt711)
1411 dev_set_drvdata(dev, rt711);
1412 rt711->slave = slave;
1413 rt711->regmap = regmap;
1414 rt711->mbq_regmap = mbq_regmap;
1416 regcache_cache_only(rt711->regmap, true);
1417 regcache_cache_only(rt711->mbq_regmap, true);
1419 mutex_init(&rt711->calibrate_mutex);
1420 mutex_init(&rt711->disable_irq_lock);
1422 INIT_DELAYED_WORK(&rt711->jack_detect_work, rt711_sdca_jack_detect_handler);
1423 INIT_DELAYED_WORK(&rt711->jack_btn_check_work, rt711_sdca_btn_check_handler);
1429 rt711->hw_init = false;
1430 rt711->first_hw_init = false;
1431 rt711->fu0f_dapm_mute = true;
1432 rt711->fu1e_dapm_mute = true;
1433 rt711->fu0f_mixer_l_mute = rt711->fu0f_mixer_r_mute = true;
1434 rt711->fu1e_mixer_l_mute = rt711->fu1e_mixer_r_mute = true;
1437 rt711->jd_src = RT711_JD2;
1467 static void rt711_sdca_vd0_io_init(struct rt711_sdca_priv *rt711)
1469 rt711_sdca_index_write(rt711, RT711_VENDOR_REG,
1471 rt711_sdca_index_write(rt711, RT711_VENDOR_HDA_CTL,
1474 regmap_write(rt711->regmap, 0x2f5a, 0x01);
1476 rt711_sdca_index_write(rt711, RT711_VENDOR_REG,
1479 rt711_sdca_index_write(rt711, RT711_VENDOR_REG,
1482 regmap_write(rt711->regmap, 0x2f50, 0x02);
1484 rt711_sdca_index_update_bits(rt711, RT711_VENDOR_ANALOG_CTL,
1487 rt711_sdca_index_update_bits(rt711, RT711_VENDOR_REG,
1490 rt711_sdca_index_write(rt711, RT711_VENDOR_HDA_CTL,
1493 rt711_sdca_index_write(rt711, RT711_VENDOR_VAD,
1497 static void rt711_sdca_vd1_io_init(struct rt711_sdca_priv *rt711)
1499 rt711_sdca_index_update_bits(rt711, RT711_VENDOR_HDA_CTL,
1502 rt711_sdca_index_write(rt711, RT711_VENDOR_REG,
1505 regmap_write(rt711->regmap, 0x2f5a, 0x05);
1507 rt711_sdca_index_write(rt711, RT711_VENDOR_REG,
1510 rt711_sdca_index_write(rt711, RT711_VENDOR_REG,
1513 rt711_sdca_index_write(rt711, RT711_VENDOR_HDA_CTL,
1516 rt711_sdca_index_write(rt711, RT711_VENDOR_VAD,
1522 struct rt711_sdca_priv *rt711 = dev_get_drvdata(dev);
1526 rt711->disable_irq = false;
1528 if (rt711->hw_init)
1531 regcache_cache_only(rt711->regmap, false);
1532 regcache_cache_only(rt711->mbq_regmap, false);
1534 if (rt711->first_hw_init) {
1535 regcache_cache_bypass(rt711->regmap, true);
1536 regcache_cache_bypass(rt711->mbq_regmap, true);
1548 rt711_sdca_reset(rt711);
1550 rt711_sdca_index_read(rt711, RT711_VENDOR_REG, RT711_JD_PRODUCT_NUM, &val);
1551 rt711->hw_ver = val & 0xf;
1553 if (rt711->hw_ver == RT711_VER_VD0)
1554 rt711_sdca_vd0_io_init(rt711);
1556 rt711_sdca_vd1_io_init(rt711);
1559 rt711_sdca_index_update_bits(rt711, RT711_VENDOR_REG,
1563 rt711_sdca_index_update_bits(rt711, RT711_VENDOR_HDA_CTL,
1567 ret = rt711_sdca_calibration(rt711);
1572 regmap_write(rt711->regmap,
1579 if (rt711->hs_jack)
1580 rt711_sdca_jack_init(rt711);
1582 if (rt711->first_hw_init) {
1583 regcache_cache_bypass(rt711->regmap, false);
1584 regcache_mark_dirty(rt711->regmap);
1585 regcache_cache_bypass(rt711->mbq_regmap, false);
1586 regcache_mark_dirty(rt711->mbq_regmap);
1588 rt711->first_hw_init = true;
1591 rt711->hw_init = true;