root/sound/pci/hda/hda_generic.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


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

/* [<][>][^][v][top][bottom][index][help] */