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.de Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
5ef5bee02f
commit
242d990c15
@ -1364,16 +1364,20 @@ static int try_assign_dacs(struct hda_codec *codec, int num_outs,
|
||||
struct nid_path *path;
|
||||
hda_nid_t pin = pins[i];
|
||||
|
||||
path = snd_hda_get_path_from_idx(codec, path_idx[i]);
|
||||
if (path) {
|
||||
badness += assign_out_path_ctls(codec, path);
|
||||
continue;
|
||||
if (!spec->obey_preferred_dacs) {
|
||||
path = snd_hda_get_path_from_idx(codec, path_idx[i]);
|
||||
if (path) {
|
||||
badness += assign_out_path_ctls(codec, path);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
dacs[i] = get_preferred_dac(codec, pin);
|
||||
if (dacs[i]) {
|
||||
if (is_dac_already_used(codec, dacs[i]))
|
||||
badness += bad->shared_primary;
|
||||
} else if (spec->obey_preferred_dacs) {
|
||||
badness += BAD_NO_PRIMARY_DAC;
|
||||
}
|
||||
|
||||
if (!dacs[i])
|
||||
|
@ -237,6 +237,7 @@ struct hda_gen_spec {
|
||||
unsigned int power_down_unused:1; /* power down unused widgets */
|
||||
unsigned int dac_min_mute:1; /* minimal = mute for DACs */
|
||||
unsigned int suppress_vmaster:1; /* don't create vmaster kctls */
|
||||
unsigned int obey_preferred_dacs:1; /* obey preferred_dacs assignment */
|
||||
|
||||
/* other internal flags */
|
||||
unsigned int no_analog:1; /* digital I/O only */
|
||||
|
Loading…
Reference in New Issue
Block a user