123d30f28STakashi Iwai /* 223d30f28STakashi Iwai * BIOS auto-parser helper functions for HD-audio 323d30f28STakashi Iwai * 423d30f28STakashi Iwai * Copyright (c) 2012 Takashi Iwai <tiwai@suse.de> 523d30f28STakashi Iwai * 623d30f28STakashi Iwai * This driver is free software; you can redistribute it and/or modify 723d30f28STakashi Iwai * it under the terms of the GNU General Public License as published by 823d30f28STakashi Iwai * the Free Software Foundation; either version 2 of the License, or 923d30f28STakashi Iwai * (at your option) any later version. 1023d30f28STakashi Iwai */ 1123d30f28STakashi Iwai 1223d30f28STakashi Iwai #ifndef __SOUND_HDA_AUTO_PARSER_H 1323d30f28STakashi Iwai #define __SOUND_HDA_AUTO_PARSER_H 1423d30f28STakashi Iwai 15*128bc4baSTakashi Iwai /* 16*128bc4baSTakashi Iwai * Helper for automatic pin configuration 17*128bc4baSTakashi Iwai */ 18*128bc4baSTakashi Iwai 19*128bc4baSTakashi Iwai enum { 20*128bc4baSTakashi Iwai AUTO_PIN_MIC, 21*128bc4baSTakashi Iwai AUTO_PIN_LINE_IN, 22*128bc4baSTakashi Iwai AUTO_PIN_CD, 23*128bc4baSTakashi Iwai AUTO_PIN_AUX, 24*128bc4baSTakashi Iwai AUTO_PIN_LAST 25*128bc4baSTakashi Iwai }; 26*128bc4baSTakashi Iwai 27*128bc4baSTakashi Iwai enum { 28*128bc4baSTakashi Iwai AUTO_PIN_LINE_OUT, 29*128bc4baSTakashi Iwai AUTO_PIN_SPEAKER_OUT, 30*128bc4baSTakashi Iwai AUTO_PIN_HP_OUT 31*128bc4baSTakashi Iwai }; 32*128bc4baSTakashi Iwai 33*128bc4baSTakashi Iwai #define AUTO_CFG_MAX_OUTS HDA_MAX_OUTS 34*128bc4baSTakashi Iwai #define AUTO_CFG_MAX_INS 8 35*128bc4baSTakashi Iwai 36*128bc4baSTakashi Iwai struct auto_pin_cfg_item { 37*128bc4baSTakashi Iwai hda_nid_t pin; 38*128bc4baSTakashi Iwai int type; 39*128bc4baSTakashi Iwai }; 40*128bc4baSTakashi Iwai 41*128bc4baSTakashi Iwai struct auto_pin_cfg; 42*128bc4baSTakashi Iwai const char *hda_get_autocfg_input_label(struct hda_codec *codec, 43*128bc4baSTakashi Iwai const struct auto_pin_cfg *cfg, 44*128bc4baSTakashi Iwai int input); 45*128bc4baSTakashi Iwai int snd_hda_get_pin_label(struct hda_codec *codec, hda_nid_t nid, 46*128bc4baSTakashi Iwai const struct auto_pin_cfg *cfg, 47*128bc4baSTakashi Iwai char *label, int maxlen, int *indexp); 48*128bc4baSTakashi Iwai 49*128bc4baSTakashi Iwai enum { 50*128bc4baSTakashi Iwai INPUT_PIN_ATTR_UNUSED, /* pin not connected */ 51*128bc4baSTakashi Iwai INPUT_PIN_ATTR_INT, /* internal mic/line-in */ 52*128bc4baSTakashi Iwai INPUT_PIN_ATTR_DOCK, /* docking mic/line-in */ 53*128bc4baSTakashi Iwai INPUT_PIN_ATTR_NORMAL, /* mic/line-in jack */ 54*128bc4baSTakashi Iwai INPUT_PIN_ATTR_FRONT, /* mic/line-in jack in front */ 55*128bc4baSTakashi Iwai INPUT_PIN_ATTR_REAR, /* mic/line-in jack in rear */ 56*128bc4baSTakashi Iwai }; 57*128bc4baSTakashi Iwai 58*128bc4baSTakashi Iwai int snd_hda_get_input_pin_attr(unsigned int def_conf); 59*128bc4baSTakashi Iwai 60*128bc4baSTakashi Iwai struct auto_pin_cfg { 61*128bc4baSTakashi Iwai int line_outs; 62*128bc4baSTakashi Iwai /* sorted in the order of Front/Surr/CLFE/Side */ 63*128bc4baSTakashi Iwai hda_nid_t line_out_pins[AUTO_CFG_MAX_OUTS]; 64*128bc4baSTakashi Iwai int speaker_outs; 65*128bc4baSTakashi Iwai hda_nid_t speaker_pins[AUTO_CFG_MAX_OUTS]; 66*128bc4baSTakashi Iwai int hp_outs; 67*128bc4baSTakashi Iwai int line_out_type; /* AUTO_PIN_XXX_OUT */ 68*128bc4baSTakashi Iwai hda_nid_t hp_pins[AUTO_CFG_MAX_OUTS]; 69*128bc4baSTakashi Iwai int num_inputs; 70*128bc4baSTakashi Iwai struct auto_pin_cfg_item inputs[AUTO_CFG_MAX_INS]; 71*128bc4baSTakashi Iwai int dig_outs; 72*128bc4baSTakashi Iwai hda_nid_t dig_out_pins[2]; 73*128bc4baSTakashi Iwai hda_nid_t dig_in_pin; 74*128bc4baSTakashi Iwai hda_nid_t mono_out_pin; 75*128bc4baSTakashi Iwai int dig_out_type[2]; /* HDA_PCM_TYPE_XXX */ 76*128bc4baSTakashi Iwai int dig_in_type; /* HDA_PCM_TYPE_XXX */ 77*128bc4baSTakashi Iwai }; 78*128bc4baSTakashi Iwai 79*128bc4baSTakashi Iwai /* bit-flags for snd_hda_parse_pin_def_config() behavior */ 80*128bc4baSTakashi Iwai #define HDA_PINCFG_NO_HP_FIXUP (1 << 0) /* no HP-split */ 81*128bc4baSTakashi Iwai #define HDA_PINCFG_NO_LO_FIXUP (1 << 1) /* don't take other outs as LO */ 82*128bc4baSTakashi Iwai 83*128bc4baSTakashi Iwai int snd_hda_parse_pin_defcfg(struct hda_codec *codec, 84*128bc4baSTakashi Iwai struct auto_pin_cfg *cfg, 85*128bc4baSTakashi Iwai const hda_nid_t *ignore_nids, 86*128bc4baSTakashi Iwai unsigned int cond_flags); 87*128bc4baSTakashi Iwai 88*128bc4baSTakashi Iwai /* older function */ 89*128bc4baSTakashi Iwai #define snd_hda_parse_pin_def_config(codec, cfg, ignore) \ 90*128bc4baSTakashi Iwai snd_hda_parse_pin_defcfg(codec, cfg, ignore, 0) 91*128bc4baSTakashi Iwai 92*128bc4baSTakashi Iwai /* 93*128bc4baSTakashi Iwai */ 94*128bc4baSTakashi Iwai 9523d30f28STakashi Iwai struct hda_gen_spec { 9623d30f28STakashi Iwai /* fix-up list */ 9723d30f28STakashi Iwai int fixup_id; 9823d30f28STakashi Iwai const struct hda_fixup *fixup_list; 9923d30f28STakashi Iwai const char *fixup_name; 10023d30f28STakashi Iwai 10123d30f28STakashi Iwai /* additional init verbs */ 10223d30f28STakashi Iwai struct snd_array verbs; 10323d30f28STakashi Iwai }; 10423d30f28STakashi Iwai 10523d30f28STakashi Iwai 10623d30f28STakashi Iwai /* 10723d30f28STakashi Iwai * Fix-up pin default configurations and add default verbs 10823d30f28STakashi Iwai */ 10923d30f28STakashi Iwai 11023d30f28STakashi Iwai struct hda_pintbl { 11123d30f28STakashi Iwai hda_nid_t nid; 11223d30f28STakashi Iwai u32 val; 11323d30f28STakashi Iwai }; 11423d30f28STakashi Iwai 11523d30f28STakashi Iwai struct hda_model_fixup { 11623d30f28STakashi Iwai const int id; 11723d30f28STakashi Iwai const char *name; 11823d30f28STakashi Iwai }; 11923d30f28STakashi Iwai 12023d30f28STakashi Iwai struct hda_fixup { 12123d30f28STakashi Iwai int type; 12223d30f28STakashi Iwai bool chained; 12323d30f28STakashi Iwai int chain_id; 12423d30f28STakashi Iwai union { 12523d30f28STakashi Iwai const struct hda_pintbl *pins; 12623d30f28STakashi Iwai const struct hda_verb *verbs; 12723d30f28STakashi Iwai void (*func)(struct hda_codec *codec, 12823d30f28STakashi Iwai const struct hda_fixup *fix, 12923d30f28STakashi Iwai int action); 13023d30f28STakashi Iwai } v; 13123d30f28STakashi Iwai }; 13223d30f28STakashi Iwai 13323d30f28STakashi Iwai /* fixup types */ 13423d30f28STakashi Iwai enum { 13523d30f28STakashi Iwai HDA_FIXUP_INVALID, 13623d30f28STakashi Iwai HDA_FIXUP_PINS, 13723d30f28STakashi Iwai HDA_FIXUP_VERBS, 13823d30f28STakashi Iwai HDA_FIXUP_FUNC, 13923d30f28STakashi Iwai }; 14023d30f28STakashi Iwai 14123d30f28STakashi Iwai /* fixup action definitions */ 14223d30f28STakashi Iwai enum { 14323d30f28STakashi Iwai HDA_FIXUP_ACT_PRE_PROBE, 14423d30f28STakashi Iwai HDA_FIXUP_ACT_PROBE, 14523d30f28STakashi Iwai HDA_FIXUP_ACT_INIT, 14623d30f28STakashi Iwai HDA_FIXUP_ACT_BUILD, 14723d30f28STakashi Iwai }; 14823d30f28STakashi Iwai 14923d30f28STakashi Iwai int snd_hda_gen_add_verbs(struct hda_gen_spec *spec, 15023d30f28STakashi Iwai const struct hda_verb *list); 15123d30f28STakashi Iwai void snd_hda_gen_apply_verbs(struct hda_codec *codec); 15223d30f28STakashi Iwai void snd_hda_apply_pincfgs(struct hda_codec *codec, 15323d30f28STakashi Iwai const struct hda_pintbl *cfg); 15423d30f28STakashi Iwai void snd_hda_apply_fixup(struct hda_codec *codec, int action); 15523d30f28STakashi Iwai void snd_hda_pick_fixup(struct hda_codec *codec, 15623d30f28STakashi Iwai const struct hda_model_fixup *models, 15723d30f28STakashi Iwai const struct snd_pci_quirk *quirk, 15823d30f28STakashi Iwai const struct hda_fixup *fixlist); 15923d30f28STakashi Iwai 16023d30f28STakashi Iwai #endif /* __SOUND_HDA_AUTO_PARSER_H */ 161