[ALSA] hda-codec - Fix wrong pin-setup at resume of STAC codecs
[linux-2.6.git] / sound / pci / hda / patch_sigmatel.c
index 98144f9..3918782 100644 (file)
@@ -2061,9 +2061,9 @@ static void enable_pin_detect(struct hda_codec *codec, hda_nid_t nid,
                              unsigned int event)
 {
        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)
@@ -2236,10 +2236,19 @@ static void stac92xx_unsol_event(struct hda_codec *codec, unsigned int res)
 #ifdef SND_HDA_NEEDS_RESUME
 static int stac92xx_resume(struct hda_codec *codec)
 {
+       struct sigmatel_spec *spec = codec->spec;
+
        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_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;
 }
 #endif