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