| 1 | /* SPDX-License-Identifier: GPL-2.0-or-later */ | 
|---|
| 2 | /* | 
|---|
| 3 | * BIOS auto-parser helper functions for HD-audio | 
|---|
| 4 | * | 
|---|
| 5 | * Copyright (c) 2012 Takashi Iwai <tiwai@suse.de> | 
|---|
| 6 | */ | 
|---|
| 7 |  | 
|---|
| 8 | #ifndef __SOUND_HDA_AUTO_PARSER_H | 
|---|
| 9 | #define __SOUND_HDA_AUTO_PARSER_H | 
|---|
| 10 |  | 
|---|
| 11 | #include "hda_local.h" | 
|---|
| 12 |  | 
|---|
| 13 | /* | 
|---|
| 14 | * Helper for automatic pin configuration | 
|---|
| 15 | */ | 
|---|
| 16 |  | 
|---|
| 17 | enum { | 
|---|
| 18 | AUTO_PIN_MIC, | 
|---|
| 19 | AUTO_PIN_LINE_IN, | 
|---|
| 20 | AUTO_PIN_CD, | 
|---|
| 21 | AUTO_PIN_AUX, | 
|---|
| 22 | AUTO_PIN_LAST | 
|---|
| 23 | }; | 
|---|
| 24 |  | 
|---|
| 25 | enum { | 
|---|
| 26 | AUTO_PIN_LINE_OUT, | 
|---|
| 27 | AUTO_PIN_SPEAKER_OUT, | 
|---|
| 28 | AUTO_PIN_HP_OUT | 
|---|
| 29 | }; | 
|---|
| 30 |  | 
|---|
| 31 | #define AUTO_CFG_MAX_OUTS	HDA_MAX_OUTS | 
|---|
| 32 | #define AUTO_CFG_MAX_INS	18 | 
|---|
| 33 |  | 
|---|
| 34 | struct auto_pin_cfg_item { | 
|---|
| 35 | hda_nid_t pin; | 
|---|
| 36 | int type; | 
|---|
| 37 | unsigned int is_headset_mic:1; | 
|---|
| 38 | unsigned int is_headphone_mic:1; /* Mic-only in headphone jack */ | 
|---|
| 39 | unsigned int has_boost_on_pin:1; | 
|---|
| 40 | int order; | 
|---|
| 41 | }; | 
|---|
| 42 |  | 
|---|
| 43 | struct auto_pin_cfg; | 
|---|
| 44 | const char *hda_get_autocfg_input_label(struct hda_codec *codec, | 
|---|
| 45 | const struct auto_pin_cfg *cfg, | 
|---|
| 46 | int input); | 
|---|
| 47 | int snd_hda_get_pin_label(struct hda_codec *codec, hda_nid_t nid, | 
|---|
| 48 | const struct auto_pin_cfg *cfg, | 
|---|
| 49 | char *label, int maxlen, int *indexp); | 
|---|
| 50 |  | 
|---|
| 51 | enum { | 
|---|
| 52 | INPUT_PIN_ATTR_UNUSED,	/* pin not connected */ | 
|---|
| 53 | INPUT_PIN_ATTR_INT,	/* internal mic/line-in */ | 
|---|
| 54 | INPUT_PIN_ATTR_DOCK,	/* docking mic/line-in */ | 
|---|
| 55 | INPUT_PIN_ATTR_NORMAL,	/* mic/line-in jack */ | 
|---|
| 56 | INPUT_PIN_ATTR_REAR,	/* mic/line-in jack in rear */ | 
|---|
| 57 | INPUT_PIN_ATTR_FRONT,	/* mic/line-in jack in front */ | 
|---|
| 58 | INPUT_PIN_ATTR_LAST = INPUT_PIN_ATTR_FRONT, | 
|---|
| 59 | }; | 
|---|
| 60 |  | 
|---|
| 61 | int snd_hda_get_input_pin_attr(unsigned int def_conf); | 
|---|
| 62 |  | 
|---|
| 63 | struct auto_pin_cfg { | 
|---|
| 64 | int line_outs; | 
|---|
| 65 | /* sorted in the order of Front/Surr/CLFE/Side */ | 
|---|
| 66 | hda_nid_t line_out_pins[AUTO_CFG_MAX_OUTS]; | 
|---|
| 67 | int speaker_outs; | 
|---|
| 68 | hda_nid_t speaker_pins[AUTO_CFG_MAX_OUTS]; | 
|---|
| 69 | int hp_outs; | 
|---|
| 70 | int line_out_type;	/* AUTO_PIN_XXX_OUT */ | 
|---|
| 71 | hda_nid_t hp_pins[AUTO_CFG_MAX_OUTS]; | 
|---|
| 72 | int num_inputs; | 
|---|
| 73 | struct auto_pin_cfg_item inputs[AUTO_CFG_MAX_INS]; | 
|---|
| 74 | int dig_outs; | 
|---|
| 75 | hda_nid_t dig_out_pins[2]; | 
|---|
| 76 | hda_nid_t dig_in_pin; | 
|---|
| 77 | hda_nid_t mono_out_pin; | 
|---|
| 78 | int dig_out_type[2]; /* HDA_PCM_TYPE_XXX */ | 
|---|
| 79 | int dig_in_type; /* HDA_PCM_TYPE_XXX */ | 
|---|
| 80 | }; | 
|---|
| 81 |  | 
|---|
| 82 | /* bit-flags for snd_hda_parse_pin_def_config() behavior */ | 
|---|
| 83 | #define HDA_PINCFG_NO_HP_FIXUP   (1 << 0) /* no HP-split */ | 
|---|
| 84 | #define HDA_PINCFG_NO_LO_FIXUP   (1 << 1) /* don't take other outs as LO */ | 
|---|
| 85 | #define HDA_PINCFG_HEADSET_MIC   (1 << 2) /* Try to find headset mic; mark seq number as 0xc to trigger */ | 
|---|
| 86 | #define HDA_PINCFG_HEADPHONE_MIC (1 << 3) /* Try to find headphone mic; mark seq number as 0xd to trigger */ | 
|---|
| 87 |  | 
|---|
| 88 | int snd_hda_parse_pin_defcfg(struct hda_codec *codec, | 
|---|
| 89 | struct auto_pin_cfg *cfg, | 
|---|
| 90 | const hda_nid_t *ignore_nids, | 
|---|
| 91 | unsigned int cond_flags); | 
|---|
| 92 |  | 
|---|
| 93 | /* older function */ | 
|---|
| 94 | #define snd_hda_parse_pin_def_config(codec, cfg, ignore) \ | 
|---|
| 95 | snd_hda_parse_pin_defcfg(codec, cfg, ignore, 0) | 
|---|
| 96 |  | 
|---|
| 97 | static inline int auto_cfg_hp_outs(const struct auto_pin_cfg *cfg) | 
|---|
| 98 | { | 
|---|
| 99 | return (cfg->line_out_type == AUTO_PIN_HP_OUT) ? | 
|---|
| 100 | cfg->line_outs : cfg->hp_outs; | 
|---|
| 101 | } | 
|---|
| 102 | static inline const hda_nid_t *auto_cfg_hp_pins(const struct auto_pin_cfg *cfg) | 
|---|
| 103 | { | 
|---|
| 104 | return (cfg->line_out_type == AUTO_PIN_HP_OUT) ? | 
|---|
| 105 | cfg->line_out_pins : cfg->hp_pins; | 
|---|
| 106 | } | 
|---|
| 107 | static inline int auto_cfg_speaker_outs(const struct auto_pin_cfg *cfg) | 
|---|
| 108 | { | 
|---|
| 109 | return (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) ? | 
|---|
| 110 | cfg->line_outs : cfg->speaker_outs; | 
|---|
| 111 | } | 
|---|
| 112 | static inline const hda_nid_t *auto_cfg_speaker_pins(const struct auto_pin_cfg *cfg) | 
|---|
| 113 | { | 
|---|
| 114 | return (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) ? | 
|---|
| 115 | cfg->line_out_pins : cfg->speaker_pins; | 
|---|
| 116 | } | 
|---|
| 117 |  | 
|---|
| 118 | #endif /* __SOUND_HDA_AUTO_PARSER_H */ | 
|---|
| 119 |  | 
|---|