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

Commit 7a9744cb authored by Takashi Iwai's avatar Takashi Iwai
Browse files

ALSA: hda - Fix invalid pin powermap without jack detection



When a driver is set up without the jack detection explicitly (either
by passing a model option or via a specific fixup), the pin powermap
of IDT/STAC codecs is set up wrongly, resulting in the silence
output.  It's because of a logic failure in stac_init_power_map().
It tries to avoid creating a callback for the pins that have other
auto-hp and auto-mic callbacks, but the check is done in a wrong way
at a wrong time.  The stac_init_power_map() should be called after
creating other jack detection ctls, and the jack callback should be
created only for jack-detectable widgets.

This patch fixes the check in stac_init_power_map() and its callee
at the right place, after snd_hda_gen_build_controls().

Reported-by: default avatarAdam Richter <adam_richter2004@yahoo.com>
Cc: <stable@vger.kernel.org>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 05244d16
Loading
Loading
Loading
Loading
+12 −5
Original line number Diff line number Diff line
@@ -566,8 +566,8 @@ static void stac_init_power_map(struct hda_codec *codec)
		if (snd_hda_jack_tbl_get(codec, nid))
			continue;
		if (def_conf == AC_JACK_PORT_COMPLEX &&
		    !(spec->vref_mute_led_nid == nid ||
		      is_jack_detectable(codec, nid))) {
		    spec->vref_mute_led_nid != nid &&
		    is_jack_detectable(codec, nid)) {
			snd_hda_jack_detect_enable_callback(codec, nid,
							    STAC_PWR_EVENT,
							    jack_update_power);
@@ -4276,11 +4276,18 @@ static int stac_parse_auto_config(struct hda_codec *codec)
			return err;
	}

	stac_init_power_map(codec);

	return 0;
}

static int stac_build_controls(struct hda_codec *codec)
{
	int err = snd_hda_gen_build_controls(codec);

	if (err < 0)
		return err;
	stac_init_power_map(codec);
	return 0;
}

static int stac_init(struct hda_codec *codec)
{
@@ -4392,7 +4399,7 @@ static int stac_suspend(struct hda_codec *codec)
#endif /* CONFIG_PM */

static const struct hda_codec_ops stac_patch_ops = {
	.build_controls = snd_hda_gen_build_controls,
	.build_controls = stac_build_controls,
	.build_pcms = snd_hda_gen_build_pcms,
	.init = stac_init,
	.free = stac_free,