Răsfoiți Sursa

[ALSA] hda-codec - Fix wrong pin-setup at resume of STAC codecs

The resume procedure for STAC codecs overrides the cached values and
results in the wrong (reset) PIN state.  The patch gets rid of the
overriding part and simplifies the resume.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Jaroslav Kysela <perex@suse.cz>
Takashi Iwai 17 ani în urmă
părinte
comite
dc81bed127
1 a modificat fișierele cu 13 adăugiri și 4 ștergeri
  1. 13 4
      sound/pci/hda/patch_sigmatel.c

+ 13 - 4
sound/pci/hda/patch_sigmatel.c

@@ -2061,9 +2061,9 @@ static void enable_pin_detect(struct hda_codec *codec, hda_nid_t nid,
 			      unsigned int event)
 			      unsigned int event)
 {
 {
 	if (get_wcaps(codec, nid) & AC_WCAP_UNSOL_CAP)
 	if (get_wcaps(codec, nid) & AC_WCAP_UNSOL_CAP)
-		snd_hda_codec_write(codec, nid, 0,
-				    AC_VERB_SET_UNSOLICITED_ENABLE,
-				    (AC_USRSP_EN | event));
+		snd_hda_codec_write_cache(codec, nid, 0,
+					  AC_VERB_SET_UNSOLICITED_ENABLE,
+					  (AC_USRSP_EN | event));
 }
 }
 
 
 static int stac92xx_init(struct hda_codec *codec)
 static int stac92xx_init(struct hda_codec *codec)
@@ -2236,10 +2236,19 @@ static void stac92xx_unsol_event(struct hda_codec *codec, unsigned int res)
 #ifdef SND_HDA_NEEDS_RESUME
 #ifdef SND_HDA_NEEDS_RESUME
 static int stac92xx_resume(struct hda_codec *codec)
 static int stac92xx_resume(struct hda_codec *codec)
 {
 {
+	struct sigmatel_spec *spec = codec->spec;
+
 	stac92xx_set_config_regs(codec);
 	stac92xx_set_config_regs(codec);
-	stac92xx_init(codec);
+	snd_hda_sequence_write(codec, spec->init);
+	if (spec->gpio_mute) {
+		stac922x_gpio_mute(codec, 0, 0);
+		stac922x_gpio_mute(codec, 1, 0);
+	}
 	snd_hda_codec_resume_amp(codec);
 	snd_hda_codec_resume_amp(codec);
 	snd_hda_codec_resume_cache(codec);
 	snd_hda_codec_resume_cache(codec);
+	/* invoke unsolicited event to reset the HP state */
+	if (spec->hp_detect)
+		codec->patch_ops.unsol_event(codec, STAC_HP_EVENT << 26);
 	return 0;
 	return 0;
 }
 }
 #endif
 #endif