Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0725367f authored by Takashi Iwai's avatar Takashi Iwai Committed by Greg Kroah-Hartman
Browse files

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

commit 242d990c158d5b1dabd166516e21992baef5f26a upstream.

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: default avatarTakashi Iwai <tiwai@suse.de>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 219c8a38
Loading
Loading
Loading
Loading
+8 −4
Original line number Diff line number Diff line
@@ -1327,16 +1327,20 @@ static int try_assign_dacs(struct hda_codec *codec, int num_outs,
		struct nid_path *path;
		hda_nid_t pin = pins[i];

		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])
+1 −0
Original line number Diff line number Diff line
@@ -229,6 +229,7 @@ struct hda_gen_spec {
	unsigned int add_jack_modes:1; /* add i/o jack mode enum ctls */
	unsigned int power_down_unused:1; /* power down unused widgets */
	unsigned int dac_min_mute:1; /* minimal = mute for DACs */
	unsigned int obey_preferred_dacs:1; /* obey preferred_dacs assignment */

	/* other internal flags */
	unsigned int no_analog:1; /* digital I/O only */