Lines Matching +full:io +full:- +full:channel +full:- +full:mux

1 // SPDX-License-Identifier: GPL-2.0
3 // rt711.c -- rt711 ALSA SoC audio driver
23 #include <sound/soc-dapm.h>
88 struct regmap *regmap = rt711->regmap; in rt711_calibration()
91 mutex_lock(&rt711->calibrate_mutex); in rt711_calibration()
92 regmap_write(rt711->regmap, in rt711_calibration()
112 pr_err("%s, calibration time-out!\n", in rt711_calibration()
114 ret = -ETIMEDOUT; in rt711_calibration()
128 regmap_write(rt711->regmap, in rt711_calibration()
130 mutex_unlock(&rt711->calibrate_mutex); in rt711_calibration()
141 ret = rt711_index_read(rt711->regmap, RT711_VENDOR_REG, in rt711_button_detect()
145 ret = rt711_index_read(rt711->regmap, RT711_VENDOR_REG, in rt711_button_detect()
189 ret = rt711_index_read(rt711->regmap, RT711_VENDOR_REG, in rt711_headset_detect()
199 ret = rt711_index_read(rt711->regmap, RT711_VENDOR_REG, in rt711_headset_detect()
205 ret = regmap_read(rt711->regmap, reg, &jack_status); in rt711_headset_detect()
216 rt711->jack_type = SND_JACK_HEADPHONE; in rt711_headset_detect()
219 rt711->jack_type = SND_JACK_HEADSET; in rt711_headset_detect()
224 ret = -ETIMEDOUT; in rt711_headset_detect()
225 pr_err_ratelimited("Time-out error in %s\n", __func__); in rt711_headset_detect()
228 pr_err_ratelimited("IO error in %s, ret %d\n", __func__, ret); in rt711_headset_detect()
232 return -ENODEV; in rt711_headset_detect()
242 if (!rt711->hs_jack) in rt711_jack_detect_handler()
245 if (!rt711->component->card->instantiated) in rt711_jack_detect_handler()
249 ret = regmap_read(rt711->regmap, reg, &jack_status); in rt711_jack_detect_handler()
256 if (rt711->jack_type == 0) { in rt711_jack_detect_handler()
260 if (rt711->jack_type == SND_JACK_HEADSET) in rt711_jack_detect_handler()
262 } else if (rt711->jack_type == SND_JACK_HEADSET) { in rt711_jack_detect_handler()
268 rt711->jack_type = 0; in rt711_jack_detect_handler()
271 dev_dbg(&rt711->slave->dev, in rt711_jack_detect_handler()
272 "in %s, jack_type=0x%x\n", __func__, rt711->jack_type); in rt711_jack_detect_handler()
273 dev_dbg(&rt711->slave->dev, in rt711_jack_detect_handler()
276 snd_soc_jack_report(rt711->hs_jack, rt711->jack_type | btn_type, in rt711_jack_detect_handler()
283 snd_soc_jack_report(rt711->hs_jack, rt711->jack_type, in rt711_jack_detect_handler()
289 &rt711->jack_btn_check_work, msecs_to_jiffies(200)); in rt711_jack_detect_handler()
295 pr_err_ratelimited("IO error in %s, ret %d\n", __func__, ret); in rt711_jack_detect_handler()
306 ret = regmap_read(rt711->regmap, reg, &jack_status); in rt711_btn_check_handler()
312 if (rt711->jack_type == SND_JACK_HEADSET) { in rt711_btn_check_handler()
317 rt711->jack_type = 0; in rt711_btn_check_handler()
321 ret = rt711_index_read(rt711->regmap, RT711_VENDOR_REG, in rt711_btn_check_handler()
329 dev_dbg(&rt711->slave->dev, in rt711_btn_check_handler()
331 snd_soc_jack_report(rt711->hs_jack, rt711->jack_type | btn_type, in rt711_btn_check_handler()
338 snd_soc_jack_report(rt711->hs_jack, rt711->jack_type, in rt711_btn_check_handler()
344 &rt711->jack_btn_check_work, msecs_to_jiffies(200)); in rt711_btn_check_handler()
350 pr_err_ratelimited("IO error in %s, ret %d\n", __func__, ret); in rt711_btn_check_handler()
356 snd_soc_component_get_dapm(rt711->component); in rt711_jack_init()
358 mutex_lock(&rt711->calibrate_mutex); in rt711_jack_init()
360 if (dapm->bias_level <= SND_SOC_BIAS_STANDBY) in rt711_jack_init()
361 regmap_write(rt711->regmap, in rt711_jack_init()
364 if (rt711->hs_jack) { in rt711_jack_init()
366 regmap_write(rt711->regmap, in rt711_jack_init()
368 regmap_write(rt711->regmap, in rt711_jack_init()
370 regmap_write(rt711->regmap, in rt711_jack_init()
372 rt711_index_write(rt711->regmap, RT711_VENDOR_REG, in rt711_jack_init()
374 rt711_index_write(rt711->regmap, RT711_VENDOR_REG, in rt711_jack_init()
377 switch (rt711->jd_src) { in rt711_jack_init()
382 rt711_index_update_bits(rt711->regmap, RT711_VENDOR_REG, in rt711_jack_init()
387 rt711_index_update_bits(rt711->regmap, RT711_VENDOR_REG, in rt711_jack_init()
393 rt711_index_update_bits(rt711->regmap, RT711_VENDOR_REG, in rt711_jack_init()
398 rt711_index_update_bits(rt711->regmap, RT711_VENDOR_REG, in rt711_jack_init()
404 rt711_index_update_bits(rt711->regmap, RT711_VENDOR_REG, in rt711_jack_init()
407 rt711_index_update_bits(rt711->regmap, RT711_VENDOR_REG, in rt711_jack_init()
412 rt711_index_update_bits(rt711->regmap, RT711_VENDOR_REG, in rt711_jack_init()
417 rt711_index_update_bits(rt711->regmap, RT711_VENDOR_REG, in rt711_jack_init()
423 dev_warn(rt711->component->dev, "Wrong JD source\n"); in rt711_jack_init()
427 dev_dbg(&rt711->slave->dev, "in %s enable\n", __func__); in rt711_jack_init()
430 &rt711->jack_detect_work, msecs_to_jiffies(250)); in rt711_jack_init()
432 regmap_write(rt711->regmap, in rt711_jack_init()
434 regmap_write(rt711->regmap, in rt711_jack_init()
436 regmap_write(rt711->regmap, in rt711_jack_init()
439 dev_dbg(&rt711->slave->dev, "in %s disable\n", __func__); in rt711_jack_init()
443 if (dapm->bias_level <= SND_SOC_BIAS_STANDBY) in rt711_jack_init()
444 regmap_write(rt711->regmap, in rt711_jack_init()
446 mutex_unlock(&rt711->calibrate_mutex); in rt711_jack_init()
454 rt711->hs_jack = hs_jack; in rt711_set_jack_detect()
456 if (!rt711->hw_init) { in rt711_set_jack_detect()
457 dev_dbg(&rt711->slave->dev, in rt711_set_jack_detect()
471 /* R Channel */ in rt711_get_gain()
473 regmap_read(rt711->regmap, addr_l, r_val); in rt711_get_gain()
475 /* L Channel */ in rt711_get_gain()
478 regmap_read(rt711->regmap, addr_h, l_val); in rt711_get_gain()
481 /* For Verb-Set Amplifier Gain (Verb ID = 3h) */
489 (struct soc_mixer_control *)kcontrol->private_value; in rt711_set_amp_gain_put()
495 mutex_lock(&rt711->calibrate_mutex); in rt711_set_amp_gain_put()
498 addr_h = mc->reg; in rt711_set_amp_gain_put()
499 addr_l = mc->rreg; in rt711_set_amp_gain_put()
500 if (mc->shift == RT711_DIR_OUT_SFT) /* output */ in rt711_set_amp_gain_put()
507 /* L Channel */ in rt711_set_amp_gain_put()
508 if (mc->invert) { in rt711_set_amp_gain_put()
510 val_ll = (mc->max - ucontrol->value.integer.value[0]) in rt711_set_amp_gain_put()
517 val_ll = ((ucontrol->value.integer.value[0]) & 0x7f); in rt711_set_amp_gain_put()
518 if (val_ll > mc->max) in rt711_set_amp_gain_put()
519 val_ll = mc->max; in rt711_set_amp_gain_put()
525 if (dapm->bias_level <= SND_SOC_BIAS_STANDBY) in rt711_set_amp_gain_put()
526 regmap_write(rt711->regmap, in rt711_set_amp_gain_put()
529 /* R Channel */ in rt711_set_amp_gain_put()
530 if (mc->invert) { in rt711_set_amp_gain_put()
532 val_lr = (mc->max - ucontrol->value.integer.value[1]) in rt711_set_amp_gain_put()
539 val_lr = ((ucontrol->value.integer.value[1]) & 0x7f); in rt711_set_amp_gain_put()
540 if (val_lr > mc->max) in rt711_set_amp_gain_put()
541 val_lr = mc->max; in rt711_set_amp_gain_put()
551 val_h = (1 << mc->shift) | (3 << 4); in rt711_set_amp_gain_put()
552 regmap_write(rt711->regmap, in rt711_set_amp_gain_put()
554 regmap_write(rt711->regmap, in rt711_set_amp_gain_put()
558 val_h = (1 << mc->shift) | (1 << 5); in rt711_set_amp_gain_put()
559 regmap_write(rt711->regmap, in rt711_set_amp_gain_put()
563 val_h = (1 << mc->shift) | (1 << 4); in rt711_set_amp_gain_put()
564 regmap_write(rt711->regmap, in rt711_set_amp_gain_put()
568 if (mc->shift == RT711_DIR_OUT_SFT) /* output */ in rt711_set_amp_gain_put()
579 if (dapm->bias_level <= SND_SOC_BIAS_STANDBY) in rt711_set_amp_gain_put()
580 regmap_write(rt711->regmap, in rt711_set_amp_gain_put()
583 mutex_unlock(&rt711->calibrate_mutex); in rt711_set_amp_gain_put()
593 (struct soc_mixer_control *)kcontrol->private_value; in rt711_set_amp_gain_get()
598 addr_h = mc->reg; in rt711_set_amp_gain_get()
599 addr_l = mc->rreg; in rt711_set_amp_gain_get()
600 if (mc->shift == RT711_DIR_OUT_SFT) /* output */ in rt711_set_amp_gain_get()
607 if (mc->invert) { in rt711_set_amp_gain_get()
616 ucontrol->value.integer.value[0] = read_ll; in rt711_set_amp_gain_get()
617 ucontrol->value.integer.value[1] = read_rl; in rt711_set_amp_gain_get()
622 static const DECLARE_TLV_DB_SCALE(out_vol_tlv, -6525, 75, 0);
623 static const DECLARE_TLV_DB_SCALE(in_vol_tlv, -1725, 75, 0);
670 if (strstr(ucontrol->id.name, "ADC 22 Mux")) in rt711_mux_get()
672 else if (strstr(ucontrol->id.name, "ADC 23 Mux")) in rt711_mux_get()
675 return -EINVAL; in rt711_mux_get()
679 ret = regmap_read(rt711->regmap, reg, &val); in rt711_mux_get()
681 dev_err(component->dev, "%s: sdw read failed: %d\n", in rt711_mux_get()
686 ucontrol->value.enumerated.item[0] = val; in rt711_mux_get()
699 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; in rt711_mux_put()
700 unsigned int *item = ucontrol->value.enumerated.item; in rt711_mux_put()
704 if (item[0] >= e->items) in rt711_mux_put()
705 return -EINVAL; in rt711_mux_put()
707 if (strstr(ucontrol->id.name, "ADC 22 Mux")) in rt711_mux_put()
709 else if (strstr(ucontrol->id.name, "ADC 23 Mux")) in rt711_mux_put()
712 return -EINVAL; in rt711_mux_put()
715 val = snd_soc_enum_item_to_val(e, item[0]) << e->shift_l; in rt711_mux_put()
718 ret = regmap_read(rt711->regmap, reg, &val2); in rt711_mux_put()
720 dev_err(component->dev, "%s: sdw read failed: %d\n", in rt711_mux_put()
732 regmap_write(rt711->regmap, reg, val); in rt711_mux_put()
755 SOC_DAPM_ENUM_EXT("ADC 22 Mux", rt711_adc22_enum,
759 SOC_DAPM_ENUM_EXT("ADC 23 Mux", rt711_adc23_enum,
766 snd_soc_dapm_to_component(w->dapm); in rt711_dac_surround_event()
773 regmap_write(rt711->regmap, in rt711_dac_surround_event()
777 regmap_write(rt711->regmap, in rt711_dac_surround_event()
782 regmap_write(rt711->regmap, in rt711_dac_surround_event()
786 regmap_write(rt711->regmap, in rt711_dac_surround_event()
797 snd_soc_dapm_to_component(w->dapm); in rt711_adc_09_event()
802 regmap_write(rt711->regmap, in rt711_adc_09_event()
806 regmap_write(rt711->regmap, in rt711_adc_09_event()
817 snd_soc_dapm_to_component(w->dapm); in rt711_adc_08_event()
822 regmap_write(rt711->regmap, in rt711_adc_08_event()
826 regmap_write(rt711->regmap, in rt711_adc_08_event()
850 SND_SOC_DAPM_MUX("ADC 22 Mux", SND_SOC_NOPM, 0, 0,
852 SND_SOC_DAPM_MUX("ADC 23 Mux", SND_SOC_NOPM, 0, 0,
865 {"ADC 09", NULL, "ADC 22 Mux"},
866 {"ADC 08", NULL, "ADC 23 Mux"},
867 {"ADC 22 Mux", "DMIC", "DMIC1"},
868 {"ADC 22 Mux", "LINE1", "LINE1"},
869 {"ADC 22 Mux", "LINE2", "LINE2"},
870 {"ADC 22 Mux", "MIC2", "MIC2"},
871 {"ADC 23 Mux", "DMIC", "DMIC2"},
872 {"ADC 23 Mux", "LINE1", "LINE1"},
873 {"ADC 23 Mux", "LINE2", "LINE2"},
874 {"ADC 23 Mux", "MIC2", "MIC2"},
888 if (dapm->bias_level == SND_SOC_BIAS_STANDBY) { in rt711_set_bias_level()
889 regmap_write(rt711->regmap, in rt711_set_bias_level()
896 mutex_lock(&rt711->calibrate_mutex); in rt711_set_bias_level()
897 regmap_write(rt711->regmap, in rt711_set_bias_level()
900 mutex_unlock(&rt711->calibrate_mutex); in rt711_set_bias_level()
912 device_property_read_u32(dev, "realtek,jd-src", in rt711_parse_dt()
913 &rt711->jd_src); in rt711_parse_dt()
922 rt711_parse_dt(rt711, &rt711->slave->dev); in rt711_probe()
923 rt711->component = component; in rt711_probe()
932 regcache_cache_only(rt711->regmap, true); in rt711_remove()
958 return -ENOMEM; in rt711_set_sdw_stream()
960 stream->sdw_stream = sdw_stream; in rt711_set_sdw_stream()
964 dai->playback_dma_data = stream; in rt711_set_sdw_stream()
966 dai->capture_dma_data = stream; in rt711_set_sdw_stream()
985 struct snd_soc_component *component = dai->component; in rt711_pcm_hw_params()
994 dev_dbg(dai->dev, "%s %s", __func__, dai->name); in rt711_pcm_hw_params()
998 return -EINVAL; in rt711_pcm_hw_params()
1000 if (!rt711->slave) in rt711_pcm_hw_params()
1001 return -EINVAL; in rt711_pcm_hw_params()
1004 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { in rt711_pcm_hw_params()
1009 if (dai->id == RT711_AIF1) in rt711_pcm_hw_params()
1011 else if (dai->id == RT711_AIF2) in rt711_pcm_hw_params()
1014 return -EINVAL; in rt711_pcm_hw_params()
1023 port_config.ch_mask = (1 << (num_channels)) - 1; in rt711_pcm_hw_params()
1026 retval = sdw_stream_add_slave(rt711->slave, &stream_config, in rt711_pcm_hw_params()
1027 &port_config, 1, stream->sdw_stream); in rt711_pcm_hw_params()
1029 dev_err(dai->dev, "Unable to configure port\n"); in rt711_pcm_hw_params()
1034 /* bit 3:0 Number of Channel */ in rt711_pcm_hw_params()
1035 val |= (params_channels(params) - 1); in rt711_pcm_hw_params()
1037 dev_err(component->dev, "Unsupported channels %d\n", in rt711_pcm_hw_params()
1039 return -EINVAL; in rt711_pcm_hw_params()
1059 return -EINVAL; in rt711_pcm_hw_params()
1063 regmap_write(rt711->regmap, RT711_DAC_FORMAT_H, val); in rt711_pcm_hw_params()
1064 regmap_write(rt711->regmap, RT711_ADC1_FORMAT_H, val); in rt711_pcm_hw_params()
1065 regmap_write(rt711->regmap, RT711_ADC2_FORMAT_H, val); in rt711_pcm_hw_params()
1073 struct snd_soc_component *component = dai->component; in rt711_pcm_hw_free()
1078 if (!rt711->slave) in rt711_pcm_hw_free()
1079 return -EINVAL; in rt711_pcm_hw_free()
1081 sdw_stream_remove_slave(rt711->slave, stream->sdw_stream); in rt711_pcm_hw_free()
1098 .name = "rt711-aif1",
1117 .name = "rt711-aif2",
1143 clk_freq = (rt711->params.curr_dr_freq >> 1); in rt711_clock_config()
1165 return -EINVAL; in rt711_clock_config()
1168 regmap_write(rt711->regmap, 0xe0, value); in rt711_clock_config()
1169 regmap_write(rt711->regmap, 0xf0, value); in rt711_clock_config()
1192 return -ENOMEM; in rt711_init()
1195 rt711->slave = slave; in rt711_init()
1196 rt711->sdw_regmap = sdw_regmap; in rt711_init()
1197 rt711->regmap = regmap; in rt711_init()
1199 mutex_init(&rt711->disable_irq_lock); in rt711_init()
1205 rt711->hw_init = false; in rt711_init()
1206 rt711->first_hw_init = false; in rt711_init()
1209 rt711->jd_src = RT711_JD2; in rt711_init()
1216 dev_dbg(&slave->dev, "%s\n", __func__); in rt711_init()
1225 rt711->disable_irq = false; in rt711_io_init()
1227 if (rt711->hw_init) in rt711_io_init()
1230 if (rt711->first_hw_init) { in rt711_io_init()
1231 regcache_cache_only(rt711->regmap, false); in rt711_io_init()
1232 regcache_cache_bypass(rt711->regmap, true); in rt711_io_init()
1238 if (!rt711->first_hw_init) { in rt711_io_init()
1240 pm_runtime_set_autosuspend_delay(&slave->dev, 3000); in rt711_io_init()
1241 pm_runtime_use_autosuspend(&slave->dev); in rt711_io_init()
1244 pm_runtime_set_active(&slave->dev); in rt711_io_init()
1247 pm_runtime_mark_last_busy(&slave->dev); in rt711_io_init()
1249 pm_runtime_enable(&slave->dev); in rt711_io_init()
1252 pm_runtime_get_noresume(&slave->dev); in rt711_io_init()
1254 rt711_reset(rt711->regmap); in rt711_io_init()
1257 regmap_write(rt711->regmap, RT711_SET_AUDIO_POWER_STATE, AC_PWRST_D0); in rt711_io_init()
1260 regmap_write(rt711->regmap, RT711_SET_PIN_MIC2, 0x25); in rt711_io_init()
1261 regmap_write(rt711->regmap, RT711_SET_PIN_HP, 0xc0); in rt711_io_init()
1262 regmap_write(rt711->regmap, RT711_SET_PIN_DMIC1, 0x20); in rt711_io_init()
1263 regmap_write(rt711->regmap, RT711_SET_PIN_DMIC2, 0x20); in rt711_io_init()
1264 regmap_write(rt711->regmap, RT711_SET_PIN_LINE1, 0x20); in rt711_io_init()
1265 regmap_write(rt711->regmap, RT711_SET_PIN_LINE2, 0x20); in rt711_io_init()
1268 regmap_write(rt711->regmap, RT711_SET_GAIN_HP_H, 0xa080); in rt711_io_init()
1269 regmap_write(rt711->regmap, RT711_SET_GAIN_HP_H, 0x9080); in rt711_io_init()
1270 regmap_write(rt711->regmap, RT711_SET_GAIN_ADC2_H, 0x6080); in rt711_io_init()
1271 regmap_write(rt711->regmap, RT711_SET_GAIN_ADC2_H, 0x5080); in rt711_io_init()
1272 regmap_write(rt711->regmap, RT711_SET_GAIN_ADC1_H, 0x6080); in rt711_io_init()
1273 regmap_write(rt711->regmap, RT711_SET_GAIN_ADC1_H, 0x5080); in rt711_io_init()
1276 regmap_write(rt711->regmap, 0x4f12, 0x91); in rt711_io_init()
1277 regmap_write(rt711->regmap, 0x4e12, 0xd6); in rt711_io_init()
1278 regmap_write(rt711->regmap, 0x4d12, 0x11); in rt711_io_init()
1279 regmap_write(rt711->regmap, 0x4c12, 0x20); in rt711_io_init()
1280 regmap_write(rt711->regmap, 0x4f13, 0x91); in rt711_io_init()
1281 regmap_write(rt711->regmap, 0x4e13, 0xd6); in rt711_io_init()
1282 regmap_write(rt711->regmap, 0x4d13, 0x11); in rt711_io_init()
1283 regmap_write(rt711->regmap, 0x4c13, 0x21); in rt711_io_init()
1284 regmap_write(rt711->regmap, 0x4c21, 0xf0); in rt711_io_init()
1285 regmap_write(rt711->regmap, 0x4d21, 0x11); in rt711_io_init()
1286 regmap_write(rt711->regmap, 0x4e21, 0x11); in rt711_io_init()
1287 regmap_write(rt711->regmap, 0x4f21, 0x01); in rt711_io_init()
1290 rt711_index_write(rt711->regmap, RT711_VENDOR_REG, in rt711_io_init()
1294 rt711_index_write(rt711->regmap, RT711_VENDOR_REG, in rt711_io_init()
1296 rt711_index_write(rt711->regmap, RT711_VENDOR_REG, in rt711_io_init()
1298 rt711_index_write(rt711->regmap, RT711_VENDOR_REG, in rt711_io_init()
1300 rt711_index_write(rt711->regmap, RT711_VENDOR_REG, in rt711_io_init()
1304 regmap_write(rt711->regmap, RT711_SET_AUDIO_POWER_STATE, AC_PWRST_D3); in rt711_io_init()
1306 if (rt711->first_hw_init) in rt711_io_init()
1309 INIT_DELAYED_WORK(&rt711->jack_detect_work, in rt711_io_init()
1311 INIT_DELAYED_WORK(&rt711->jack_btn_check_work, in rt711_io_init()
1313 mutex_init(&rt711->calibrate_mutex); in rt711_io_init()
1314 INIT_WORK(&rt711->calibration_work, rt711_calibration_work); in rt711_io_init()
1315 schedule_work(&rt711->calibration_work); in rt711_io_init()
1322 if (rt711->hs_jack) in rt711_io_init()
1325 if (rt711->first_hw_init) { in rt711_io_init()
1326 regcache_cache_bypass(rt711->regmap, false); in rt711_io_init()
1327 regcache_mark_dirty(rt711->regmap); in rt711_io_init()
1329 rt711->first_hw_init = true; in rt711_io_init()
1332 rt711->hw_init = true; in rt711_io_init()
1334 pm_runtime_mark_last_busy(&slave->dev); in rt711_io_init()
1335 pm_runtime_put_autosuspend(&slave->dev); in rt711_io_init()
1337 dev_dbg(&slave->dev, "%s hw_init complete\n", __func__); in rt711_io_init()