diff options
-rw-r--r-- | sound/pci/hda/hda_generic.c | 26 | ||||
-rw-r--r-- | sound/pci/hda/hda_generic.h | 17 |
2 files changed, 29 insertions, 14 deletions
diff --git a/sound/pci/hda/hda_generic.c b/sound/pci/hda/hda_generic.c index 98c8627b2afb..326302fcab44 100644 --- a/sound/pci/hda/hda_generic.c +++ b/sound/pci/hda/hda_generic.c | |||
@@ -1062,16 +1062,7 @@ static int assign_out_path_ctls(struct hda_codec *codec, struct nid_path *path) | |||
1062 | return badness; | 1062 | return badness; |
1063 | } | 1063 | } |
1064 | 1064 | ||
1065 | struct badness_table { | 1065 | const struct badness_table hda_main_out_badness = { |
1066 | int no_primary_dac; /* no primary DAC */ | ||
1067 | int no_dac; /* no secondary DACs */ | ||
1068 | int shared_primary; /* primary DAC is shared with main output */ | ||
1069 | int shared_surr; /* secondary DAC shared with main or primary */ | ||
1070 | int shared_clfe; /* third DAC shared with main or primary */ | ||
1071 | int shared_surr_main; /* secondary DAC sahred with main/DAC0 */ | ||
1072 | }; | ||
1073 | |||
1074 | static struct badness_table main_out_badness = { | ||
1075 | .no_primary_dac = BAD_NO_PRIMARY_DAC, | 1066 | .no_primary_dac = BAD_NO_PRIMARY_DAC, |
1076 | .no_dac = BAD_NO_DAC, | 1067 | .no_dac = BAD_NO_DAC, |
1077 | .shared_primary = BAD_NO_PRIMARY_DAC, | 1068 | .shared_primary = BAD_NO_PRIMARY_DAC, |
@@ -1079,8 +1070,9 @@ static struct badness_table main_out_badness = { | |||
1079 | .shared_clfe = BAD_SHARED_CLFE, | 1070 | .shared_clfe = BAD_SHARED_CLFE, |
1080 | .shared_surr_main = BAD_SHARED_SURROUND, | 1071 | .shared_surr_main = BAD_SHARED_SURROUND, |
1081 | }; | 1072 | }; |
1073 | EXPORT_SYMBOL_HDA(hda_main_out_badness); | ||
1082 | 1074 | ||
1083 | static struct badness_table extra_out_badness = { | 1075 | const struct badness_table hda_extra_out_badness = { |
1084 | .no_primary_dac = BAD_NO_DAC, | 1076 | .no_primary_dac = BAD_NO_DAC, |
1085 | .no_dac = BAD_NO_DAC, | 1077 | .no_dac = BAD_NO_DAC, |
1086 | .shared_primary = BAD_NO_EXTRA_DAC, | 1078 | .shared_primary = BAD_NO_EXTRA_DAC, |
@@ -1088,6 +1080,7 @@ static struct badness_table extra_out_badness = { | |||
1088 | .shared_clfe = BAD_SHARED_EXTRA_SURROUND, | 1080 | .shared_clfe = BAD_SHARED_EXTRA_SURROUND, |
1089 | .shared_surr_main = BAD_NO_EXTRA_SURR_DAC, | 1081 | .shared_surr_main = BAD_NO_EXTRA_SURR_DAC, |
1090 | }; | 1082 | }; |
1083 | EXPORT_SYMBOL_HDA(hda_extra_out_badness); | ||
1091 | 1084 | ||
1092 | /* get the DAC of the primary output corresponding to the given array index */ | 1085 | /* get the DAC of the primary output corresponding to the given array index */ |
1093 | static hda_nid_t get_primary_out(struct hda_codec *codec, int idx) | 1086 | static hda_nid_t get_primary_out(struct hda_codec *codec, int idx) |
@@ -1518,7 +1511,7 @@ static int fill_and_eval_dacs(struct hda_codec *codec, | |||
1518 | 1511 | ||
1519 | badness += try_assign_dacs(codec, cfg->line_outs, cfg->line_out_pins, | 1512 | badness += try_assign_dacs(codec, cfg->line_outs, cfg->line_out_pins, |
1520 | spec->private_dac_nids, spec->out_paths, | 1513 | spec->private_dac_nids, spec->out_paths, |
1521 | &main_out_badness); | 1514 | spec->main_out_badness); |
1522 | 1515 | ||
1523 | if (fill_mio_first && | 1516 | if (fill_mio_first && |
1524 | cfg->line_outs == 1 && cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) { | 1517 | cfg->line_outs == 1 && cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) { |
@@ -1533,7 +1526,7 @@ static int fill_and_eval_dacs(struct hda_codec *codec, | |||
1533 | err = try_assign_dacs(codec, cfg->hp_outs, cfg->hp_pins, | 1526 | err = try_assign_dacs(codec, cfg->hp_outs, cfg->hp_pins, |
1534 | spec->multiout.hp_out_nid, | 1527 | spec->multiout.hp_out_nid, |
1535 | spec->hp_paths, | 1528 | spec->hp_paths, |
1536 | &extra_out_badness); | 1529 | spec->extra_out_badness); |
1537 | if (err < 0) | 1530 | if (err < 0) |
1538 | return err; | 1531 | return err; |
1539 | badness += err; | 1532 | badness += err; |
@@ -1543,7 +1536,7 @@ static int fill_and_eval_dacs(struct hda_codec *codec, | |||
1543 | cfg->speaker_pins, | 1536 | cfg->speaker_pins, |
1544 | spec->multiout.extra_out_nid, | 1537 | spec->multiout.extra_out_nid, |
1545 | spec->speaker_paths, | 1538 | spec->speaker_paths, |
1546 | &extra_out_badness); | 1539 | spec->extra_out_badness); |
1547 | if (err < 0) | 1540 | if (err < 0) |
1548 | return err; | 1541 | return err; |
1549 | badness += err; | 1542 | badness += err; |
@@ -4180,6 +4173,11 @@ int snd_hda_gen_parse_auto_config(struct hda_codec *codec, | |||
4180 | cfg = &spec->autocfg; | 4173 | cfg = &spec->autocfg; |
4181 | } | 4174 | } |
4182 | 4175 | ||
4176 | if (!spec->main_out_badness) | ||
4177 | spec->main_out_badness = &hda_main_out_badness; | ||
4178 | if (!spec->extra_out_badness) | ||
4179 | spec->extra_out_badness = &hda_extra_out_badness; | ||
4180 | |||
4183 | fill_all_dac_nids(codec); | 4181 | fill_all_dac_nids(codec); |
4184 | 4182 | ||
4185 | if (!cfg->line_outs) { | 4183 | if (!cfg->line_outs) { |
diff --git a/sound/pci/hda/hda_generic.h b/sound/pci/hda/hda_generic.h index 39d83943f25d..54e665160379 100644 --- a/sound/pci/hda/hda_generic.h +++ b/sound/pci/hda/hda_generic.h | |||
@@ -76,6 +76,19 @@ enum { | |||
76 | HDA_GEN_PCM_ACT_CLOSE, | 76 | HDA_GEN_PCM_ACT_CLOSE, |
77 | }; | 77 | }; |
78 | 78 | ||
79 | /* DAC assignment badness table */ | ||
80 | struct badness_table { | ||
81 | int no_primary_dac; /* no primary DAC */ | ||
82 | int no_dac; /* no secondary DACs */ | ||
83 | int shared_primary; /* primary DAC is shared with main output */ | ||
84 | int shared_surr; /* secondary DAC shared with main or primary */ | ||
85 | int shared_clfe; /* third DAC shared with main or primary */ | ||
86 | int shared_surr_main; /* secondary DAC sahred with main/DAC0 */ | ||
87 | }; | ||
88 | |||
89 | extern const struct badness_table hda_main_out_badness; | ||
90 | extern const struct badness_table hda_extra_out_badness; | ||
91 | |||
79 | struct hda_gen_spec { | 92 | struct hda_gen_spec { |
80 | char stream_name_analog[32]; /* analog PCM stream */ | 93 | char stream_name_analog[32]; /* analog PCM stream */ |
81 | const struct hda_pcm_stream *stream_analog_playback; | 94 | const struct hda_pcm_stream *stream_analog_playback; |
@@ -223,6 +236,10 @@ struct hda_gen_spec { | |||
223 | unsigned int have_aamix_ctl:1; | 236 | unsigned int have_aamix_ctl:1; |
224 | unsigned int hp_mic_jack_modes:1; | 237 | unsigned int hp_mic_jack_modes:1; |
225 | 238 | ||
239 | /* badness tables for output path evaluations */ | ||
240 | const struct badness_table *main_out_badness; | ||
241 | const struct badness_table *extra_out_badness; | ||
242 | |||
226 | /* loopback mixing mode */ | 243 | /* loopback mixing mode */ |
227 | bool aamix_mode; | 244 | bool aamix_mode; |
228 | 245 | ||