Lines Matching refs:codec

105 static enum VIA_HDA_CODEC get_codec_type(struct hda_codec *codec);
107 struct hda_codec *codec,
113 static struct via_spec *via_new_spec(struct hda_codec *codec) in via_new_spec() argument
121 codec->spec = spec; in via_new_spec()
123 spec->codec_type = get_codec_type(codec); in via_new_spec()
131 codec->power_save_node = 1; in via_new_spec()
133 codec->patch_ops = via_patch_ops; in via_new_spec()
137 static enum VIA_HDA_CODEC get_codec_type(struct hda_codec *codec) in get_codec_type() argument
139 u32 vendor_id = codec->core.vendor_id; in get_codec_type()
155 if (snd_hda_param_read(codec, 0x16, AC_PAR_CONNLIST_LEN) == 0x7) in get_codec_type()
189 static void analog_low_current_mode(struct hda_codec *codec);
190 static bool is_aa_path_mute(struct hda_codec *codec);
192 #define hp_detect_with_aa(codec) \ argument
193 (snd_hda_get_bool_hint(codec, "analog_loopback_hp_detect") == 1 && \
194 !is_aa_path_mute(codec))
196 static void vt1708_stop_hp_work(struct hda_codec *codec) in vt1708_stop_hp_work() argument
198 struct via_spec *spec = codec->spec; in vt1708_stop_hp_work()
202 snd_hda_codec_write(codec, 0x1, 0, 0xf81, 1); in vt1708_stop_hp_work()
203 codec->jackpoll_interval = 0; in vt1708_stop_hp_work()
204 cancel_delayed_work_sync(&codec->jackpoll_work); in vt1708_stop_hp_work()
209 static void vt1708_update_hp_work(struct hda_codec *codec) in vt1708_update_hp_work() argument
211 struct via_spec *spec = codec->spec; in vt1708_update_hp_work()
216 codec->jackpoll_interval = msecs_to_jiffies(100); in vt1708_update_hp_work()
217 snd_hda_codec_write(codec, 0x1, 0, 0xf81, 0); in vt1708_update_hp_work()
218 schedule_delayed_work(&codec->jackpoll_work, 0); in vt1708_update_hp_work()
221 } else if (!hp_detect_with_aa(codec)) in vt1708_update_hp_work()
222 vt1708_stop_hp_work(codec); in vt1708_update_hp_work()
234 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); in via_pin_power_ctl_get() local
235 struct via_spec *spec = codec->spec; in via_pin_power_ctl_get()
244 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); in via_pin_power_ctl_put() local
245 struct via_spec *spec = codec->spec; in via_pin_power_ctl_put()
252 analog_low_current_mode(codec); in via_pin_power_ctl_put()
289 static int auto_parse_beep(struct hda_codec *codec) in auto_parse_beep() argument
291 struct via_spec *spec = codec->spec; in auto_parse_beep()
294 for_each_hda_codec_node(nid, codec) in auto_parse_beep()
295 if (get_wcaps_type(get_wcaps(codec, nid)) == AC_WID_BEEP) in auto_parse_beep()
300 #define auto_parse_beep(codec) 0 argument
304 static bool is_aa_path_mute(struct hda_codec *codec) in is_aa_path_mute() argument
306 struct via_spec *spec = codec->spec; in is_aa_path_mute()
315 v = snd_hda_codec_amp_read(codec, p->nid, ch, p->dir, in is_aa_path_mute()
325 static void __analog_low_current_mode(struct hda_codec *codec, bool force) in __analog_low_current_mode() argument
327 struct via_spec *spec = codec->spec; in __analog_low_current_mode()
331 if (!codec->power_save_node) in __analog_low_current_mode()
334 enable = is_aa_path_mute(codec) && !spec->gen.active_streams; in __analog_low_current_mode()
371 snd_hda_codec_write(codec, codec->core.afg, 0, verb, parm); in __analog_low_current_mode()
374 static void analog_low_current_mode(struct hda_codec *codec) in analog_low_current_mode() argument
376 return __analog_low_current_mode(codec, false); in analog_low_current_mode()
380 struct hda_codec *codec, in via_playback_pcm_hook() argument
384 analog_low_current_mode(codec); in via_playback_pcm_hook()
385 vt1708_update_hp_work(codec); in via_playback_pcm_hook()
388 static void via_free(struct hda_codec *codec) in via_free() argument
390 vt1708_stop_hp_work(codec); in via_free()
391 snd_hda_gen_free(codec); in via_free()
395 static int via_suspend(struct hda_codec *codec) in via_suspend() argument
397 struct via_spec *spec = codec->spec; in via_suspend()
398 vt1708_stop_hp_work(codec); in via_suspend()
402 snd_hda_shutup_pins(codec); in via_suspend()
407 static int via_resume(struct hda_codec *codec) in via_resume() argument
411 codec->patch_ops.init(codec); in via_resume()
412 regcache_sync(codec->core.regmap); in via_resume()
418 static int via_check_power_status(struct hda_codec *codec, hda_nid_t nid) in via_check_power_status() argument
420 struct via_spec *spec = codec->spec; in via_check_power_status()
421 analog_low_current_mode(codec); in via_check_power_status()
422 vt1708_update_hp_work(codec); in via_check_power_status()
423 return snd_hda_check_amp_list_power(codec, &spec->gen.loopback, nid); in via_check_power_status()
430 static int via_init(struct hda_codec *codec);
451 static void vt1708_set_pinconfig_connect(struct hda_codec *codec, hda_nid_t nid) in vt1708_set_pinconfig_connect() argument
456 def_conf = snd_hda_codec_get_pincfg(codec, nid); in vt1708_set_pinconfig_connect()
462 snd_hda_codec_set_pincfg(codec, nid, def_conf); in vt1708_set_pinconfig_connect()
471 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); in vt1708_jack_detect_get() local
472 struct via_spec *spec = codec->spec; in vt1708_jack_detect_get()
483 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); in vt1708_jack_detect_put() local
484 struct via_spec *spec = codec->spec; in vt1708_jack_detect_put()
493 vt1708_update_hp_work(codec); in vt1708_jack_detect_put()
523 static int via_parse_auto_config(struct hda_codec *codec) in via_parse_auto_config() argument
525 struct via_spec *spec = codec->spec; in via_parse_auto_config()
531 err = snd_hda_parse_pin_defcfg(codec, &spec->gen.autocfg, NULL, 0); in via_parse_auto_config()
535 err = snd_hda_gen_parse_auto_config(codec, &spec->gen.autocfg); in via_parse_auto_config()
539 err = auto_parse_beep(codec); in via_parse_auto_config()
547 codec->power_save_node = 0; in via_parse_auto_config()
552 static int via_init(struct hda_codec *codec) in via_init() argument
555 __analog_low_current_mode(codec, true); in via_init()
557 snd_hda_gen_init(codec); in via_init()
559 vt1708_update_hp_work(codec); in via_init()
564 static int vt1708_build_controls(struct hda_codec *codec) in vt1708_build_controls() argument
569 int old_interval = codec->jackpoll_interval; in vt1708_build_controls()
570 codec->jackpoll_interval = msecs_to_jiffies(100); in vt1708_build_controls()
571 err = snd_hda_gen_build_controls(codec); in vt1708_build_controls()
572 codec->jackpoll_interval = old_interval; in vt1708_build_controls()
576 static int vt1708_build_pcms(struct hda_codec *codec) in vt1708_build_pcms() argument
578 struct via_spec *spec = codec->spec; in vt1708_build_pcms()
581 err = snd_hda_gen_build_pcms(codec); in vt1708_build_pcms()
582 if (err < 0 || codec->core.vendor_id != 0x11061708) in vt1708_build_pcms()
603 static int patch_vt1708(struct hda_codec *codec) in patch_vt1708() argument
609 spec = via_new_spec(codec); in patch_vt1708()
614 codec->patch_ops.build_controls = vt1708_build_controls; in patch_vt1708()
615 codec->patch_ops.build_pcms = vt1708_build_pcms; in patch_vt1708()
619 codec->jackpoll_interval = msecs_to_jiffies(100); in patch_vt1708()
629 vt1708_set_pinconfig_connect(codec, VT1708_HP_PIN_NID); in patch_vt1708()
630 vt1708_set_pinconfig_connect(codec, VT1708_CD_PIN_NID); in patch_vt1708()
632 err = snd_hda_add_verbs(codec, vt1708_init_verbs); in patch_vt1708()
637 err = via_parse_auto_config(codec); in patch_vt1708()
648 codec->jackpoll_interval = 0; in patch_vt1708()
653 via_free(codec); in patch_vt1708()
657 static int patch_vt1709(struct hda_codec *codec) in patch_vt1709() argument
663 spec = via_new_spec(codec); in patch_vt1709()
669 err = via_parse_auto_config(codec); in patch_vt1709()
676 via_free(codec); in patch_vt1709()
680 static int patch_vt1708S(struct hda_codec *codec);
681 static int patch_vt1708B(struct hda_codec *codec) in patch_vt1708B() argument
686 if (get_codec_type(codec) == VT1708BCE) in patch_vt1708B()
687 return patch_vt1708S(codec); in patch_vt1708B()
690 spec = via_new_spec(codec); in patch_vt1708B()
697 err = via_parse_auto_config(codec); in patch_vt1708B()
704 via_free(codec); in patch_vt1708B()
717 static void override_mic_boost(struct hda_codec *codec, hda_nid_t pin, in override_mic_boost() argument
720 snd_hda_override_wcaps(codec, pin, in override_mic_boost()
721 get_wcaps(codec, pin) | AC_WCAP_IN_AMP); in override_mic_boost()
722 snd_hda_override_amp_caps(codec, pin, HDA_INPUT, in override_mic_boost()
729 static int patch_vt1708S(struct hda_codec *codec) in patch_vt1708S() argument
735 spec = via_new_spec(codec); in patch_vt1708S()
740 override_mic_boost(codec, 0x1a, 0, 3, 40); in patch_vt1708S()
741 override_mic_boost(codec, 0x1e, 0, 3, 40); in patch_vt1708S()
744 if (get_codec_type(codec) == VT1708BCE) in patch_vt1708S()
745 snd_hda_codec_set_name(codec, "VT1708BCE"); in patch_vt1708S()
747 if (codec->core.vendor_id == 0x11064397) in patch_vt1708S()
748 snd_hda_codec_set_name(codec, "VT1705"); in patch_vt1708S()
750 err = snd_hda_add_verbs(codec, vt1708S_init_verbs); in patch_vt1708S()
755 err = via_parse_auto_config(codec); in patch_vt1708S()
762 via_free(codec); in patch_vt1708S()
776 static int patch_vt1702(struct hda_codec *codec) in patch_vt1702() argument
782 spec = via_new_spec(codec); in patch_vt1702()
789 snd_hda_override_amp_caps(codec, 0x1A, HDA_INPUT, in patch_vt1702()
795 err = snd_hda_add_verbs(codec, vt1702_init_verbs); in patch_vt1702()
800 err = via_parse_auto_config(codec); in patch_vt1702()
807 via_free(codec); in patch_vt1702()
825 static int add_secret_dac_path(struct hda_codec *codec) in add_secret_dac_path() argument
827 struct via_spec *spec = codec->spec; in add_secret_dac_path()
834 nums = snd_hda_get_connections(codec, spec->gen.mixer_nid, conn, in add_secret_dac_path()
837 if (get_wcaps_type(get_wcaps(codec, conn[i])) == AC_WID_AUD_OUT) in add_secret_dac_path()
842 for_each_hda_codec_node(nid, codec) { in add_secret_dac_path()
843 unsigned int caps = get_wcaps(codec, nid); in add_secret_dac_path()
847 return snd_hda_override_conn_list(codec, in add_secret_dac_path()
856 static int patch_vt1718S(struct hda_codec *codec) in patch_vt1718S() argument
862 spec = via_new_spec(codec); in patch_vt1718S()
867 override_mic_boost(codec, 0x2b, 0, 3, 40); in patch_vt1718S()
868 override_mic_boost(codec, 0x29, 0, 3, 40); in patch_vt1718S()
869 add_secret_dac_path(codec); in patch_vt1718S()
871 err = snd_hda_add_verbs(codec, vt1718S_init_verbs); in patch_vt1718S()
876 err = via_parse_auto_config(codec); in patch_vt1718S()
883 via_free(codec); in patch_vt1718S()
902 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); in vt1716s_dmic_get() local
905 index = snd_hda_codec_read(codec, 0x26, 0, in vt1716s_dmic_get()
916 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); in vt1716s_dmic_put() local
917 struct via_spec *spec = codec->spec; in vt1716s_dmic_put()
920 snd_hda_codec_write(codec, 0x26, 0, in vt1716s_dmic_put()
953 static int patch_vt1716S(struct hda_codec *codec) in patch_vt1716S() argument
959 spec = via_new_spec(codec); in patch_vt1716S()
964 override_mic_boost(codec, 0x1a, 0, 3, 40); in patch_vt1716S()
965 override_mic_boost(codec, 0x1e, 0, 3, 40); in patch_vt1716S()
967 err = snd_hda_add_verbs(codec, vt1716S_init_verbs); in patch_vt1716S()
972 err = via_parse_auto_config(codec); in patch_vt1716S()
986 via_free(codec); in patch_vt1716S()
1020 static void via_fixup_intmic_boost(struct hda_codec *codec, in via_fixup_intmic_boost() argument
1024 override_mic_boost(codec, 0x30, 0, 2, 40); in via_fixup_intmic_boost()
1052 static void fix_vt1802_connections(struct hda_codec *codec) in fix_vt1802_connections() argument
1057 snd_hda_override_conn_list(codec, 0x24, ARRAY_SIZE(conn_24), conn_24); in fix_vt1802_connections()
1058 snd_hda_override_conn_list(codec, 0x33, ARRAY_SIZE(conn_33), conn_33); in fix_vt1802_connections()
1062 static int patch_vt2002P(struct hda_codec *codec) in patch_vt2002P() argument
1068 spec = via_new_spec(codec); in patch_vt2002P()
1073 override_mic_boost(codec, 0x2b, 0, 3, 40); in patch_vt2002P()
1074 override_mic_boost(codec, 0x29, 0, 3, 40); in patch_vt2002P()
1076 fix_vt1802_connections(codec); in patch_vt2002P()
1077 add_secret_dac_path(codec); in patch_vt2002P()
1079 snd_hda_pick_fixup(codec, NULL, vt2002p_fixups, via_fixups); in patch_vt2002P()
1080 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE); in patch_vt2002P()
1083 err = snd_hda_add_verbs(codec, vt1802_init_verbs); in patch_vt2002P()
1085 err = snd_hda_add_verbs(codec, vt2002P_init_verbs); in patch_vt2002P()
1090 err = via_parse_auto_config(codec); in patch_vt2002P()
1097 via_free(codec); in patch_vt2002P()
1112 static int patch_vt1812(struct hda_codec *codec) in patch_vt1812() argument
1118 spec = via_new_spec(codec); in patch_vt1812()
1123 override_mic_boost(codec, 0x2b, 0, 3, 40); in patch_vt1812()
1124 override_mic_boost(codec, 0x29, 0, 3, 40); in patch_vt1812()
1125 add_secret_dac_path(codec); in patch_vt1812()
1127 err = snd_hda_add_verbs(codec, vt1812_init_verbs); in patch_vt1812()
1132 err = via_parse_auto_config(codec); in patch_vt1812()
1139 via_free(codec); in patch_vt1812()
1155 static int patch_vt3476(struct hda_codec *codec) in patch_vt3476() argument
1161 spec = via_new_spec(codec); in patch_vt3476()
1166 add_secret_dac_path(codec); in patch_vt3476()
1168 err = snd_hda_add_verbs(codec, vt3476_init_verbs); in patch_vt3476()
1173 err = via_parse_auto_config(codec); in patch_vt3476()
1180 via_free(codec); in patch_vt3476()