Commit 242d990c authored by Takashi Iwai's avatar Takashi Iwai

ALSA: hda/generic: Add option to enforce preferred_dacs pairs

The generic parser accepts the preferred_dacs[] pairs as a hint for
assigning a DAC to each pin, but this hint doesn't work always
effectively.  Currently it's merely a secondary choice after the trial
with the path index failed.  This made sometimes it difficult to
assign DACs without mimicking the connection list and/or the badness
table.

This patch adds a new flag, obey_preferred_dacs, that changes the
behavior of the parser.  As its name stands, the parser obeys the
given preferred_dacs[] pairs by skipping the path index matching and
giving a high penalty if no DAC is assigned by the pairs.  This mode
will help for assigning the fixed DACs forcibly from the codec
driver.

Cc: <stable@vger.kernel.org>
Link: https://lore.kernel.org/r/20201127141104.11041-1-tiwai@suse.deSigned-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 5ef5bee0
...@@ -1364,16 +1364,20 @@ static int try_assign_dacs(struct hda_codec *codec, int num_outs, ...@@ -1364,16 +1364,20 @@ static int try_assign_dacs(struct hda_codec *codec, int num_outs,
struct nid_path *path; struct nid_path *path;
hda_nid_t pin = pins[i]; hda_nid_t pin = pins[i];
path = snd_hda_get_path_from_idx(codec, path_idx[i]); if (!spec->obey_preferred_dacs) {
if (path) { path = snd_hda_get_path_from_idx(codec, path_idx[i]);
badness += assign_out_path_ctls(codec, path); if (path) {
continue; badness += assign_out_path_ctls(codec, path);
continue;
}
} }
dacs[i] = get_preferred_dac(codec, pin); dacs[i] = get_preferred_dac(codec, pin);
if (dacs[i]) { if (dacs[i]) {
if (is_dac_already_used(codec, dacs[i])) if (is_dac_already_used(codec, dacs[i]))
badness += bad->shared_primary; badness += bad->shared_primary;
} else if (spec->obey_preferred_dacs) {
badness += BAD_NO_PRIMARY_DAC;
} }
if (!dacs[i]) if (!dacs[i])
......
...@@ -237,6 +237,7 @@ struct hda_gen_spec { ...@@ -237,6 +237,7 @@ struct hda_gen_spec {
unsigned int power_down_unused:1; /* power down unused widgets */ unsigned int power_down_unused:1; /* power down unused widgets */
unsigned int dac_min_mute:1; /* minimal = mute for DACs */ unsigned int dac_min_mute:1; /* minimal = mute for DACs */
unsigned int suppress_vmaster:1; /* don't create vmaster kctls */ unsigned int suppress_vmaster:1; /* don't create vmaster kctls */
unsigned int obey_preferred_dacs:1; /* obey preferred_dacs assignment */
/* other internal flags */ /* other internal flags */
unsigned int no_analog:1; /* digital I/O only */ unsigned int no_analog:1; /* digital I/O only */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment