1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Generic BIOS auto-parser helper functions for HD-audio 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (c) 2012 Takashi Iwai <tiwai@suse.de> 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #ifndef __SOUND_HDA_GENERIC_H 9*4882a593Smuzhiyun #define __SOUND_HDA_GENERIC_H 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #include <linux/leds.h> 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun /* table entry for multi-io paths */ 14*4882a593Smuzhiyun struct hda_multi_io { 15*4882a593Smuzhiyun hda_nid_t pin; /* multi-io widget pin NID */ 16*4882a593Smuzhiyun hda_nid_t dac; /* DAC to be connected */ 17*4882a593Smuzhiyun unsigned int ctl_in; /* cached input-pin control value */ 18*4882a593Smuzhiyun }; 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun /* Widget connection path 21*4882a593Smuzhiyun * 22*4882a593Smuzhiyun * For output, stored in the order of DAC -> ... -> pin, 23*4882a593Smuzhiyun * for input, pin -> ... -> ADC. 24*4882a593Smuzhiyun * 25*4882a593Smuzhiyun * idx[i] contains the source index number to select on of the widget path[i]; 26*4882a593Smuzhiyun * e.g. idx[1] is the index of the DAC (path[0]) selected by path[1] widget 27*4882a593Smuzhiyun * multi[] indicates whether it's a selector widget with multi-connectors 28*4882a593Smuzhiyun * (i.e. the connection selection is mandatory) 29*4882a593Smuzhiyun * vol_ctl and mute_ctl contains the NIDs for the assigned mixers 30*4882a593Smuzhiyun */ 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun #define MAX_NID_PATH_DEPTH 10 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun enum { 35*4882a593Smuzhiyun NID_PATH_VOL_CTL, 36*4882a593Smuzhiyun NID_PATH_MUTE_CTL, 37*4882a593Smuzhiyun NID_PATH_BOOST_CTL, 38*4882a593Smuzhiyun NID_PATH_NUM_CTLS 39*4882a593Smuzhiyun }; 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun struct nid_path { 42*4882a593Smuzhiyun int depth; 43*4882a593Smuzhiyun hda_nid_t path[MAX_NID_PATH_DEPTH]; 44*4882a593Smuzhiyun unsigned char idx[MAX_NID_PATH_DEPTH]; 45*4882a593Smuzhiyun unsigned char multi[MAX_NID_PATH_DEPTH]; 46*4882a593Smuzhiyun unsigned int ctls[NID_PATH_NUM_CTLS]; /* NID_PATH_XXX_CTL */ 47*4882a593Smuzhiyun bool active:1; /* activated by driver */ 48*4882a593Smuzhiyun bool pin_enabled:1; /* pins are enabled */ 49*4882a593Smuzhiyun bool pin_fixed:1; /* path with fixed pin */ 50*4882a593Smuzhiyun bool stream_enabled:1; /* stream is active */ 51*4882a593Smuzhiyun }; 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun /* mic/line-in auto switching entry */ 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun #define MAX_AUTO_MIC_PINS 3 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun struct automic_entry { 58*4882a593Smuzhiyun hda_nid_t pin; /* pin */ 59*4882a593Smuzhiyun int idx; /* imux index, -1 = invalid */ 60*4882a593Smuzhiyun unsigned int attr; /* pin attribute (INPUT_PIN_ATTR_*) */ 61*4882a593Smuzhiyun }; 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun /* active stream id */ 64*4882a593Smuzhiyun enum { STREAM_MULTI_OUT, STREAM_INDEP_HP }; 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun /* PCM hook action */ 67*4882a593Smuzhiyun enum { 68*4882a593Smuzhiyun HDA_GEN_PCM_ACT_OPEN, 69*4882a593Smuzhiyun HDA_GEN_PCM_ACT_PREPARE, 70*4882a593Smuzhiyun HDA_GEN_PCM_ACT_CLEANUP, 71*4882a593Smuzhiyun HDA_GEN_PCM_ACT_CLOSE, 72*4882a593Smuzhiyun }; 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun /* DAC assignment badness table */ 75*4882a593Smuzhiyun struct badness_table { 76*4882a593Smuzhiyun int no_primary_dac; /* no primary DAC */ 77*4882a593Smuzhiyun int no_dac; /* no secondary DACs */ 78*4882a593Smuzhiyun int shared_primary; /* primary DAC is shared with main output */ 79*4882a593Smuzhiyun int shared_surr; /* secondary DAC shared with main or primary */ 80*4882a593Smuzhiyun int shared_clfe; /* third DAC shared with main or primary */ 81*4882a593Smuzhiyun int shared_surr_main; /* secondary DAC sahred with main/DAC0 */ 82*4882a593Smuzhiyun }; 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun extern const struct badness_table hda_main_out_badness; 85*4882a593Smuzhiyun extern const struct badness_table hda_extra_out_badness; 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun struct hda_micmute_hook { 88*4882a593Smuzhiyun unsigned int led_mode; 89*4882a593Smuzhiyun unsigned int capture; 90*4882a593Smuzhiyun unsigned int led_value; 91*4882a593Smuzhiyun void (*old_hook)(struct hda_codec *codec, 92*4882a593Smuzhiyun struct snd_kcontrol *kcontrol, 93*4882a593Smuzhiyun struct snd_ctl_elem_value *ucontrol); 94*4882a593Smuzhiyun }; 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun struct hda_gen_spec { 97*4882a593Smuzhiyun char stream_name_analog[32]; /* analog PCM stream */ 98*4882a593Smuzhiyun const struct hda_pcm_stream *stream_analog_playback; 99*4882a593Smuzhiyun const struct hda_pcm_stream *stream_analog_capture; 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun char stream_name_alt_analog[32]; /* alternative analog PCM stream */ 102*4882a593Smuzhiyun const struct hda_pcm_stream *stream_analog_alt_playback; 103*4882a593Smuzhiyun const struct hda_pcm_stream *stream_analog_alt_capture; 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun char stream_name_digital[32]; /* digital PCM stream */ 106*4882a593Smuzhiyun const struct hda_pcm_stream *stream_digital_playback; 107*4882a593Smuzhiyun const struct hda_pcm_stream *stream_digital_capture; 108*4882a593Smuzhiyun 109*4882a593Smuzhiyun /* PCM */ 110*4882a593Smuzhiyun unsigned int active_streams; 111*4882a593Smuzhiyun struct mutex pcm_mutex; 112*4882a593Smuzhiyun 113*4882a593Smuzhiyun /* playback */ 114*4882a593Smuzhiyun struct hda_multi_out multiout; /* playback set-up 115*4882a593Smuzhiyun * max_channels, dacs must be set 116*4882a593Smuzhiyun * dig_out_nid and hp_nid are optional 117*4882a593Smuzhiyun */ 118*4882a593Smuzhiyun hda_nid_t alt_dac_nid; 119*4882a593Smuzhiyun hda_nid_t follower_dig_outs[3]; /* optional - for auto-parsing */ 120*4882a593Smuzhiyun int dig_out_type; 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun /* capture */ 123*4882a593Smuzhiyun unsigned int num_adc_nids; 124*4882a593Smuzhiyun hda_nid_t adc_nids[AUTO_CFG_MAX_INS]; 125*4882a593Smuzhiyun hda_nid_t dig_in_nid; /* digital-in NID; optional */ 126*4882a593Smuzhiyun hda_nid_t mixer_nid; /* analog-mixer NID */ 127*4882a593Smuzhiyun hda_nid_t mixer_merge_nid; /* aamix merge-point NID (optional) */ 128*4882a593Smuzhiyun const char *input_labels[HDA_MAX_NUM_INPUTS]; 129*4882a593Smuzhiyun int input_label_idxs[HDA_MAX_NUM_INPUTS]; 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun /* capture setup for dynamic dual-adc switch */ 132*4882a593Smuzhiyun hda_nid_t cur_adc; 133*4882a593Smuzhiyun unsigned int cur_adc_stream_tag; 134*4882a593Smuzhiyun unsigned int cur_adc_format; 135*4882a593Smuzhiyun 136*4882a593Smuzhiyun /* capture source */ 137*4882a593Smuzhiyun struct hda_input_mux input_mux; 138*4882a593Smuzhiyun unsigned int cur_mux[3]; 139*4882a593Smuzhiyun 140*4882a593Smuzhiyun /* channel model */ 141*4882a593Smuzhiyun /* min_channel_count contains the minimum channel count for primary 142*4882a593Smuzhiyun * outputs. When multi_ios is set, the channels can be configured 143*4882a593Smuzhiyun * between min_channel_count and (min_channel_count + multi_ios * 2). 144*4882a593Smuzhiyun * 145*4882a593Smuzhiyun * ext_channel_count contains the current channel count of the primary 146*4882a593Smuzhiyun * out. This varies in the range above. 147*4882a593Smuzhiyun * 148*4882a593Smuzhiyun * Meanwhile, const_channel_count is the channel count for all outputs 149*4882a593Smuzhiyun * including headphone and speakers. It's a constant value, and the 150*4882a593Smuzhiyun * PCM is set up as max(ext_channel_count, const_channel_count). 151*4882a593Smuzhiyun */ 152*4882a593Smuzhiyun int min_channel_count; /* min. channel count for primary out */ 153*4882a593Smuzhiyun int ext_channel_count; /* current channel count for primary */ 154*4882a593Smuzhiyun int const_channel_count; /* channel count for all */ 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun /* PCM information */ 157*4882a593Smuzhiyun struct hda_pcm *pcm_rec[3]; /* used in build_pcms() */ 158*4882a593Smuzhiyun 159*4882a593Smuzhiyun /* dynamic controls, init_verbs and input_mux */ 160*4882a593Smuzhiyun struct auto_pin_cfg autocfg; 161*4882a593Smuzhiyun struct snd_array kctls; 162*4882a593Smuzhiyun hda_nid_t private_dac_nids[AUTO_CFG_MAX_OUTS]; 163*4882a593Smuzhiyun hda_nid_t imux_pins[HDA_MAX_NUM_INPUTS]; 164*4882a593Smuzhiyun unsigned int dyn_adc_idx[HDA_MAX_NUM_INPUTS]; 165*4882a593Smuzhiyun /* shared hp/mic */ 166*4882a593Smuzhiyun hda_nid_t shared_mic_vref_pin; 167*4882a593Smuzhiyun hda_nid_t hp_mic_pin; 168*4882a593Smuzhiyun int hp_mic_mux_idx; 169*4882a593Smuzhiyun 170*4882a593Smuzhiyun /* DAC/ADC lists */ 171*4882a593Smuzhiyun int num_all_dacs; 172*4882a593Smuzhiyun hda_nid_t all_dacs[16]; 173*4882a593Smuzhiyun int num_all_adcs; 174*4882a593Smuzhiyun hda_nid_t all_adcs[AUTO_CFG_MAX_INS]; 175*4882a593Smuzhiyun 176*4882a593Smuzhiyun /* path list */ 177*4882a593Smuzhiyun struct snd_array paths; 178*4882a593Smuzhiyun 179*4882a593Smuzhiyun /* path indices */ 180*4882a593Smuzhiyun int out_paths[AUTO_CFG_MAX_OUTS]; 181*4882a593Smuzhiyun int hp_paths[AUTO_CFG_MAX_OUTS]; 182*4882a593Smuzhiyun int speaker_paths[AUTO_CFG_MAX_OUTS]; 183*4882a593Smuzhiyun int aamix_out_paths[3]; 184*4882a593Smuzhiyun int digout_paths[AUTO_CFG_MAX_OUTS]; 185*4882a593Smuzhiyun int input_paths[HDA_MAX_NUM_INPUTS][AUTO_CFG_MAX_INS]; 186*4882a593Smuzhiyun int loopback_paths[HDA_MAX_NUM_INPUTS]; 187*4882a593Smuzhiyun int loopback_merge_path; 188*4882a593Smuzhiyun int digin_path; 189*4882a593Smuzhiyun 190*4882a593Smuzhiyun /* auto-mic stuff */ 191*4882a593Smuzhiyun int am_num_entries; 192*4882a593Smuzhiyun struct automic_entry am_entry[MAX_AUTO_MIC_PINS]; 193*4882a593Smuzhiyun 194*4882a593Smuzhiyun /* for pin sensing */ 195*4882a593Smuzhiyun /* current status; set in hda_geneic.c */ 196*4882a593Smuzhiyun unsigned int hp_jack_present:1; 197*4882a593Smuzhiyun unsigned int line_jack_present:1; 198*4882a593Smuzhiyun unsigned int speaker_muted:1; /* current status of speaker mute */ 199*4882a593Smuzhiyun unsigned int line_out_muted:1; /* current status of LO mute */ 200*4882a593Smuzhiyun 201*4882a593Smuzhiyun /* internal states of automute / autoswitch behavior */ 202*4882a593Smuzhiyun unsigned int auto_mic:1; 203*4882a593Smuzhiyun unsigned int automute_speaker:1; /* automute speaker outputs */ 204*4882a593Smuzhiyun unsigned int automute_lo:1; /* automute LO outputs */ 205*4882a593Smuzhiyun 206*4882a593Smuzhiyun /* capabilities detected by parser */ 207*4882a593Smuzhiyun unsigned int detect_hp:1; /* Headphone detection enabled */ 208*4882a593Smuzhiyun unsigned int detect_lo:1; /* Line-out detection enabled */ 209*4882a593Smuzhiyun unsigned int automute_speaker_possible:1; /* there are speakers and either LO or HP */ 210*4882a593Smuzhiyun unsigned int automute_lo_possible:1; /* there are line outs and HP */ 211*4882a593Smuzhiyun 212*4882a593Smuzhiyun /* additional parameters set by codec drivers */ 213*4882a593Smuzhiyun unsigned int master_mute:1; /* master mute over all */ 214*4882a593Smuzhiyun unsigned int keep_vref_in_automute:1; /* Don't clear VREF in automute */ 215*4882a593Smuzhiyun unsigned int line_in_auto_switch:1; /* allow line-in auto switch */ 216*4882a593Smuzhiyun unsigned int auto_mute_via_amp:1; /* auto-mute via amp instead of pinctl */ 217*4882a593Smuzhiyun 218*4882a593Smuzhiyun /* parser behavior flags; set before snd_hda_gen_parse_auto_config() */ 219*4882a593Smuzhiyun unsigned int suppress_auto_mute:1; /* suppress input jack auto mute */ 220*4882a593Smuzhiyun unsigned int suppress_auto_mic:1; /* suppress input jack auto switch */ 221*4882a593Smuzhiyun 222*4882a593Smuzhiyun /* other parse behavior flags */ 223*4882a593Smuzhiyun unsigned int need_dac_fix:1; /* need to limit DACs for multi channels */ 224*4882a593Smuzhiyun unsigned int hp_mic:1; /* Allow HP as a mic-in */ 225*4882a593Smuzhiyun unsigned int suppress_hp_mic_detect:1; /* Don't detect HP/mic */ 226*4882a593Smuzhiyun unsigned int no_primary_hp:1; /* Don't prefer HP pins to speaker pins */ 227*4882a593Smuzhiyun unsigned int no_multi_io:1; /* Don't try multi I/O config */ 228*4882a593Smuzhiyun unsigned int multi_cap_vol:1; /* allow multiple capture xxx volumes */ 229*4882a593Smuzhiyun unsigned int inv_dmic_split:1; /* inverted dmic w/a for conexant */ 230*4882a593Smuzhiyun unsigned int own_eapd_ctl:1; /* set EAPD by own function */ 231*4882a593Smuzhiyun unsigned int keep_eapd_on:1; /* don't turn off EAPD automatically */ 232*4882a593Smuzhiyun unsigned int vmaster_mute_enum:1; /* add vmaster mute mode enum */ 233*4882a593Smuzhiyun unsigned int indep_hp:1; /* independent HP supported */ 234*4882a593Smuzhiyun unsigned int prefer_hp_amp:1; /* enable HP amp for speaker if any */ 235*4882a593Smuzhiyun unsigned int add_stereo_mix_input:2; /* add aamix as a capture src */ 236*4882a593Smuzhiyun unsigned int add_jack_modes:1; /* add i/o jack mode enum ctls */ 237*4882a593Smuzhiyun unsigned int power_down_unused:1; /* power down unused widgets */ 238*4882a593Smuzhiyun unsigned int dac_min_mute:1; /* minimal = mute for DACs */ 239*4882a593Smuzhiyun unsigned int suppress_vmaster:1; /* don't create vmaster kctls */ 240*4882a593Smuzhiyun unsigned int obey_preferred_dacs:1; /* obey preferred_dacs assignment */ 241*4882a593Smuzhiyun 242*4882a593Smuzhiyun /* other internal flags */ 243*4882a593Smuzhiyun unsigned int no_analog:1; /* digital I/O only */ 244*4882a593Smuzhiyun unsigned int dyn_adc_switch:1; /* switch ADCs (for ALC275) */ 245*4882a593Smuzhiyun unsigned int indep_hp_enabled:1; /* independent HP enabled */ 246*4882a593Smuzhiyun unsigned int have_aamix_ctl:1; 247*4882a593Smuzhiyun unsigned int hp_mic_jack_modes:1; 248*4882a593Smuzhiyun unsigned int skip_verbs:1; /* don't apply verbs at snd_hda_gen_init() */ 249*4882a593Smuzhiyun 250*4882a593Smuzhiyun /* additional mute flags (only effective with auto_mute_via_amp=1) */ 251*4882a593Smuzhiyun u64 mute_bits; 252*4882a593Smuzhiyun 253*4882a593Smuzhiyun /* bitmask for skipping volume controls */ 254*4882a593Smuzhiyun u64 out_vol_mask; 255*4882a593Smuzhiyun 256*4882a593Smuzhiyun /* badness tables for output path evaluations */ 257*4882a593Smuzhiyun const struct badness_table *main_out_badness; 258*4882a593Smuzhiyun const struct badness_table *extra_out_badness; 259*4882a593Smuzhiyun 260*4882a593Smuzhiyun /* preferred pin/DAC pairs; an array of paired NIDs */ 261*4882a593Smuzhiyun const hda_nid_t *preferred_dacs; 262*4882a593Smuzhiyun 263*4882a593Smuzhiyun /* loopback mixing mode */ 264*4882a593Smuzhiyun bool aamix_mode; 265*4882a593Smuzhiyun 266*4882a593Smuzhiyun /* digital beep */ 267*4882a593Smuzhiyun hda_nid_t beep_nid; 268*4882a593Smuzhiyun 269*4882a593Smuzhiyun /* for virtual master */ 270*4882a593Smuzhiyun hda_nid_t vmaster_nid; 271*4882a593Smuzhiyun unsigned int vmaster_tlv[4]; 272*4882a593Smuzhiyun struct hda_vmaster_mute_hook vmaster_mute; 273*4882a593Smuzhiyun 274*4882a593Smuzhiyun struct hda_loopback_check loopback; 275*4882a593Smuzhiyun struct snd_array loopback_list; 276*4882a593Smuzhiyun 277*4882a593Smuzhiyun /* multi-io */ 278*4882a593Smuzhiyun int multi_ios; 279*4882a593Smuzhiyun struct hda_multi_io multi_io[4]; 280*4882a593Smuzhiyun 281*4882a593Smuzhiyun /* hooks */ 282*4882a593Smuzhiyun void (*init_hook)(struct hda_codec *codec); 283*4882a593Smuzhiyun void (*automute_hook)(struct hda_codec *codec); 284*4882a593Smuzhiyun void (*cap_sync_hook)(struct hda_codec *codec, 285*4882a593Smuzhiyun struct snd_kcontrol *kcontrol, 286*4882a593Smuzhiyun struct snd_ctl_elem_value *ucontrol); 287*4882a593Smuzhiyun 288*4882a593Smuzhiyun /* mic mute LED hook; called via cap_sync_hook */ 289*4882a593Smuzhiyun struct hda_micmute_hook micmute_led; 290*4882a593Smuzhiyun 291*4882a593Smuzhiyun /* PCM hooks */ 292*4882a593Smuzhiyun void (*pcm_playback_hook)(struct hda_pcm_stream *hinfo, 293*4882a593Smuzhiyun struct hda_codec *codec, 294*4882a593Smuzhiyun struct snd_pcm_substream *substream, 295*4882a593Smuzhiyun int action); 296*4882a593Smuzhiyun void (*pcm_capture_hook)(struct hda_pcm_stream *hinfo, 297*4882a593Smuzhiyun struct hda_codec *codec, 298*4882a593Smuzhiyun struct snd_pcm_substream *substream, 299*4882a593Smuzhiyun int action); 300*4882a593Smuzhiyun 301*4882a593Smuzhiyun /* automute / autoswitch hooks */ 302*4882a593Smuzhiyun void (*hp_automute_hook)(struct hda_codec *codec, 303*4882a593Smuzhiyun struct hda_jack_callback *cb); 304*4882a593Smuzhiyun void (*line_automute_hook)(struct hda_codec *codec, 305*4882a593Smuzhiyun struct hda_jack_callback *cb); 306*4882a593Smuzhiyun void (*mic_autoswitch_hook)(struct hda_codec *codec, 307*4882a593Smuzhiyun struct hda_jack_callback *cb); 308*4882a593Smuzhiyun 309*4882a593Smuzhiyun /* leds */ 310*4882a593Smuzhiyun struct led_classdev *led_cdevs[NUM_AUDIO_LEDS]; 311*4882a593Smuzhiyun }; 312*4882a593Smuzhiyun 313*4882a593Smuzhiyun /* values for add_stereo_mix_input flag */ 314*4882a593Smuzhiyun enum { 315*4882a593Smuzhiyun HDA_HINT_STEREO_MIX_DISABLE, /* No stereo mix input */ 316*4882a593Smuzhiyun HDA_HINT_STEREO_MIX_ENABLE, /* Add stereo mix input */ 317*4882a593Smuzhiyun HDA_HINT_STEREO_MIX_AUTO, /* Add only if auto-mic is disabled */ 318*4882a593Smuzhiyun }; 319*4882a593Smuzhiyun 320*4882a593Smuzhiyun int snd_hda_gen_spec_init(struct hda_gen_spec *spec); 321*4882a593Smuzhiyun 322*4882a593Smuzhiyun int snd_hda_gen_init(struct hda_codec *codec); 323*4882a593Smuzhiyun void snd_hda_gen_free(struct hda_codec *codec); 324*4882a593Smuzhiyun 325*4882a593Smuzhiyun int snd_hda_get_path_idx(struct hda_codec *codec, struct nid_path *path); 326*4882a593Smuzhiyun struct nid_path *snd_hda_get_path_from_idx(struct hda_codec *codec, int idx); 327*4882a593Smuzhiyun struct nid_path * 328*4882a593Smuzhiyun snd_hda_add_new_path(struct hda_codec *codec, hda_nid_t from_nid, 329*4882a593Smuzhiyun hda_nid_t to_nid, int anchor_nid); 330*4882a593Smuzhiyun void snd_hda_activate_path(struct hda_codec *codec, struct nid_path *path, 331*4882a593Smuzhiyun bool enable, bool add_aamix); 332*4882a593Smuzhiyun 333*4882a593Smuzhiyun struct snd_kcontrol_new * 334*4882a593Smuzhiyun snd_hda_gen_add_kctl(struct hda_gen_spec *spec, const char *name, 335*4882a593Smuzhiyun const struct snd_kcontrol_new *temp); 336*4882a593Smuzhiyun 337*4882a593Smuzhiyun int snd_hda_gen_parse_auto_config(struct hda_codec *codec, 338*4882a593Smuzhiyun struct auto_pin_cfg *cfg); 339*4882a593Smuzhiyun int snd_hda_gen_build_controls(struct hda_codec *codec); 340*4882a593Smuzhiyun int snd_hda_gen_build_pcms(struct hda_codec *codec); 341*4882a593Smuzhiyun void snd_hda_gen_reboot_notify(struct hda_codec *codec); 342*4882a593Smuzhiyun 343*4882a593Smuzhiyun /* standard jack event callbacks */ 344*4882a593Smuzhiyun void snd_hda_gen_hp_automute(struct hda_codec *codec, 345*4882a593Smuzhiyun struct hda_jack_callback *jack); 346*4882a593Smuzhiyun void snd_hda_gen_line_automute(struct hda_codec *codec, 347*4882a593Smuzhiyun struct hda_jack_callback *jack); 348*4882a593Smuzhiyun void snd_hda_gen_mic_autoswitch(struct hda_codec *codec, 349*4882a593Smuzhiyun struct hda_jack_callback *jack); 350*4882a593Smuzhiyun void snd_hda_gen_update_outputs(struct hda_codec *codec); 351*4882a593Smuzhiyun 352*4882a593Smuzhiyun #ifdef CONFIG_PM 353*4882a593Smuzhiyun int snd_hda_gen_check_power_status(struct hda_codec *codec, hda_nid_t nid); 354*4882a593Smuzhiyun #endif 355*4882a593Smuzhiyun unsigned int snd_hda_gen_path_power_filter(struct hda_codec *codec, 356*4882a593Smuzhiyun hda_nid_t nid, 357*4882a593Smuzhiyun unsigned int power_state); 358*4882a593Smuzhiyun void snd_hda_gen_stream_pm(struct hda_codec *codec, hda_nid_t nid, bool on); 359*4882a593Smuzhiyun int snd_hda_gen_fix_pin_power(struct hda_codec *codec, hda_nid_t pin); 360*4882a593Smuzhiyun 361*4882a593Smuzhiyun int snd_hda_gen_add_mute_led_cdev(struct hda_codec *codec, 362*4882a593Smuzhiyun int (*callback)(struct led_classdev *, 363*4882a593Smuzhiyun enum led_brightness)); 364*4882a593Smuzhiyun int snd_hda_gen_add_micmute_led_cdev(struct hda_codec *codec, 365*4882a593Smuzhiyun int (*callback)(struct led_classdev *, 366*4882a593Smuzhiyun enum led_brightness)); 367*4882a593Smuzhiyun 368*4882a593Smuzhiyun #endif /* __SOUND_HDA_GENERIC_H */ 369