xref: /openbmc/linux/sound/pci/hda/hda_auto_parser.h (revision 128bc4ba8c52194eae5a80594ec9b7f6b35ba88f)
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