Lines Matching +full:codec +full:- +full:0
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * HD audio interface patch for Senary HDA audio codec
41 HDA_CODEC_VOLUME_MONO("Beep Playback Volume", 0, 1, 0, HDA_OUTPUT),
42 HDA_CODEC_MUTE_BEEP_MONO("Beep Playback Switch", 0, 1, 0, HDA_OUTPUT),
52 spec->gen.beep_nid = nid; in set_beep_amp()
53 for (i = 0; i < ARRAY_SIZE(senary_beep_mixer); i++) { in set_beep_amp()
54 knew = snd_hda_gen_add_kctl(&spec->gen, NULL, in set_beep_amp()
57 return -ENOMEM; in set_beep_amp()
58 knew->private_value = beep_amp; in set_beep_amp()
60 return 0; in set_beep_amp()
63 static int senary_auto_parse_beep(struct hda_codec *codec) in senary_auto_parse_beep() argument
65 struct senary_spec *spec = codec->spec; in senary_auto_parse_beep()
68 for_each_hda_codec_node(nid, codec) in senary_auto_parse_beep()
69 if ((get_wcaps_type(get_wcaps(codec, nid)) == AC_WID_BEEP) && in senary_auto_parse_beep()
70 (get_wcaps(codec, nid) & (AC_WCAP_OUT_AMP | AC_WCAP_AMP_OVRD))) in senary_auto_parse_beep()
71 return set_beep_amp(spec, nid, 0, HDA_OUTPUT); in senary_auto_parse_beep()
72 return 0; in senary_auto_parse_beep()
75 #define senary_auto_parse_beep(codec) 0 argument
79 static void senary_auto_parse_eapd(struct hda_codec *codec) in senary_auto_parse_eapd() argument
81 struct senary_spec *spec = codec->spec; in senary_auto_parse_eapd()
84 for_each_hda_codec_node(nid, codec) { in senary_auto_parse_eapd()
85 if (get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_PIN) in senary_auto_parse_eapd()
87 if (!(snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_EAPD)) in senary_auto_parse_eapd()
89 spec->eapds[spec->num_eapds++] = nid; in senary_auto_parse_eapd()
90 if (spec->num_eapds >= ARRAY_SIZE(spec->eapds)) in senary_auto_parse_eapd()
95 static void senary_auto_turn_eapd(struct hda_codec *codec, int num_pins, in senary_auto_turn_eapd() argument
100 for (i = 0; i < num_pins; i++) { in senary_auto_turn_eapd()
101 if (snd_hda_query_pin_caps(codec, pins[i]) & AC_PINCAP_EAPD) in senary_auto_turn_eapd()
102 snd_hda_codec_write(codec, pins[i], 0, in senary_auto_turn_eapd()
104 on ? 0x02 : 0); in senary_auto_turn_eapd()
111 struct hda_codec *codec = private_data; in senary_auto_vmaster_hook() local
112 struct senary_spec *spec = codec->spec; in senary_auto_vmaster_hook()
114 senary_auto_turn_eapd(codec, spec->num_eapds, spec->eapds, enabled); in senary_auto_vmaster_hook()
117 static void senary_init_gpio_led(struct hda_codec *codec) in senary_init_gpio_led() argument
119 struct senary_spec *spec = codec->spec; in senary_init_gpio_led()
120 unsigned int mask = spec->gpio_mute_led_mask | spec->gpio_mic_led_mask; in senary_init_gpio_led()
123 snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_MASK, in senary_init_gpio_led()
125 snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DIRECTION, in senary_init_gpio_led()
127 snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA, in senary_init_gpio_led()
128 spec->gpio_led); in senary_init_gpio_led()
132 static int senary_auto_init(struct hda_codec *codec) in senary_auto_init() argument
134 snd_hda_gen_init(codec); in senary_auto_init()
135 senary_init_gpio_led(codec); in senary_auto_init()
136 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_INIT); in senary_auto_init()
138 return 0; in senary_auto_init()
141 static void senary_auto_shutdown(struct hda_codec *codec) in senary_auto_shutdown() argument
143 struct senary_spec *spec = codec->spec; in senary_auto_shutdown()
145 /* Turn the problematic codec into D3 to avoid spurious noises in senary_auto_shutdown()
148 senary_auto_turn_eapd(codec, spec->num_eapds, spec->eapds, false); in senary_auto_shutdown()
151 static void senary_auto_free(struct hda_codec *codec) in senary_auto_free() argument
153 senary_auto_shutdown(codec); in senary_auto_free()
154 snd_hda_gen_free(codec); in senary_auto_free()
157 static int senary_auto_suspend(struct hda_codec *codec) in senary_auto_suspend() argument
159 senary_auto_shutdown(codec); in senary_auto_suspend()
160 return 0; in senary_auto_suspend()
173 static int patch_senary_auto(struct hda_codec *codec) in patch_senary_auto() argument
178 codec_info(codec, "%s: BIOS auto-probing.\n", codec->core.chip_name); in patch_senary_auto()
182 return -ENOMEM; in patch_senary_auto()
183 snd_hda_gen_spec_init(&spec->gen); in patch_senary_auto()
184 codec->spec = spec; in patch_senary_auto()
185 codec->patch_ops = senary_auto_patch_ops; in patch_senary_auto()
187 senary_auto_parse_eapd(codec); in patch_senary_auto()
188 spec->gen.own_eapd_ctl = 1; in patch_senary_auto()
190 if (!spec->gen.vmaster_mute.hook) in patch_senary_auto()
191 spec->gen.vmaster_mute.hook = senary_auto_vmaster_hook; in patch_senary_auto()
193 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE); in patch_senary_auto()
195 err = snd_hda_parse_pin_defcfg(codec, &spec->gen.autocfg, NULL, in patch_senary_auto()
196 spec->parse_flags); in patch_senary_auto()
197 if (err < 0) in patch_senary_auto()
200 err = senary_auto_parse_beep(codec); in patch_senary_auto()
201 if (err < 0) in patch_senary_auto()
204 err = snd_hda_gen_parse_auto_config(codec, &spec->gen.autocfg); in patch_senary_auto()
205 if (err < 0) in patch_senary_auto()
209 * which falls into the single-cmd mode. in patch_senary_auto()
212 if (!codec->bus->core.sync_write) { in patch_senary_auto()
213 codec_info(codec, in patch_senary_auto()
215 codec->bus->core.sync_write = 1; in patch_senary_auto()
216 codec->bus->allow_bus_reset = 1; in patch_senary_auto()
219 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE); in patch_senary_auto()
221 return 0; in patch_senary_auto()
224 senary_auto_free(codec); in patch_senary_auto()
232 HDA_CODEC_ENTRY(0x1fa86186, "SN6186", patch_senary_auto),
238 MODULE_DESCRIPTION("Senarytech HD-audio codec");