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

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

ALSA: hda/realtek - Fix overridden device-specific initialization

commit 89781d0806c2c4f29072d3f00cb2dd4274aabc3d upstream.

The recent change to shuffle the codec initialization procedure for
Realtek via commit 607ca3bd220f ("ALSA: hda/realtek - EAPD turn on
later") caused the silent output on some machines.  This change was
supposed to be safe, but it isn't actually; some devices have quirk
setups to override the EAPD via COEF or BTL in the additional verb
table, which is applied at the beginning of snd_hda_gen_init().  And
this EAPD setup is again overridden in alc_auto_init_amp().

For recovering from the regression, tell snd_hda_gen_init() not to
apply the verbs there by a new flag, then apply the verbs in
alc_init().

BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=204727


Fixes: 607ca3bd220f ("ALSA: hda/realtek - EAPD turn on later")
Cc: <stable@vger.kernel.org>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent df4cdab2
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -5807,6 +5807,7 @@ int snd_hda_gen_init(struct hda_codec *codec)
	if (spec->init_hook)
		spec->init_hook(codec);

	if (!spec->skip_verbs)
		snd_hda_apply_verbs(codec);

	init_multi_out(codec);
+1 −0
Original line number Diff line number Diff line
@@ -236,6 +236,7 @@ struct hda_gen_spec {
	unsigned int indep_hp_enabled:1; /* independent HP enabled */
	unsigned int have_aamix_ctl:1;
	unsigned int hp_mic_jack_modes:1;
	unsigned int skip_verbs:1; /* don't apply verbs at snd_hda_gen_init() */

	/* additional mute flags (only effective with auto_mute_via_amp=1) */
	u64 mute_bits;
+2 −0
Original line number Diff line number Diff line
@@ -773,9 +773,11 @@ static int alc_init(struct hda_codec *codec)
	if (spec->init_hook)
		spec->init_hook(codec);

	spec->gen.skip_verbs = 1; /* applied in below */
	snd_hda_gen_init(codec);
	alc_fix_pll(codec);
	alc_auto_init_amp(codec, spec->init_amp);
	snd_hda_apply_verbs(codec); /* apply verbs here after own init */

	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_INIT);