]> err.no Git - linux-2.6/commitdiff
[ALSA] hda-codec - Fix GPIO in resume
authorTakashi Iwai <tiwai@suse.de>
Tue, 31 Jul 2007 13:56:24 +0000 (15:56 +0200)
committerJaroslav Kysela <perex@perex.cz>
Tue, 16 Oct 2007 13:58:18 +0000 (15:58 +0200)
Reinitialize GPIO in resume callback if necessary.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Jaroslav Kysela <perex@suse.cz>
sound/pci/hda/patch_sigmatel.c

index d2c340e45f9e1728eab57ef06c310d17bbc4f6ed..5ca430cc399a63900427dc96bbec1478cbe876e9 100644 (file)
@@ -95,6 +95,8 @@ struct sigmatel_spec {
        unsigned int hp_detect: 1;
        unsigned int gpio_mute: 1;
 
+       unsigned int gpio_mask, gpio_data;
+
        /* playback */
        struct hda_multi_out multiout;
        hda_nid_t dac_nids[5];
@@ -854,20 +856,20 @@ static void stac92xx_set_config_regs(struct hda_codec *codec)
                                        spec->pin_configs[i]);
 }
 
-static void stac92xx_enable_gpio_mask(struct hda_codec *codec,
-                                     int gpio_mask, int gpio_data)
+static void stac92xx_enable_gpio_mask(struct hda_codec *codec)
 {
+       struct sigmatel_spec *spec = codec->spec;
        /* Configure GPIOx as output */
        snd_hda_codec_write(codec, codec->afg, 0,
-                           AC_VERB_SET_GPIO_DIRECTION, gpio_mask);
+                           AC_VERB_SET_GPIO_DIRECTION, spec->gpio_mask);
        /* Configure GPIOx as CMOS */
        snd_hda_codec_write(codec, codec->afg, 0, 0x7e7, 0x00000000);
        /* Assert GPIOx */
        snd_hda_codec_write(codec, codec->afg, 0,
-                           AC_VERB_SET_GPIO_DATA, gpio_data);
+                           AC_VERB_SET_GPIO_DATA, spec->gpio_data);
        /* Enable GPIOx */
        snd_hda_codec_write(codec, codec->afg, 0,
-                           AC_VERB_SET_GPIO_MASK, gpio_mask);
+                           AC_VERB_SET_GPIO_MASK, spec->gpio_mask);
 }
 
 /*
@@ -1935,8 +1937,10 @@ static int stac92xx_resume(struct hda_codec *codec)
        struct sigmatel_spec *spec = codec->spec;
        int i;
 
-       stac92xx_init(codec);
        stac92xx_set_config_regs(codec);
+       if (spec->gpio_mask && spec->gpio_data)
+               stac92xx_enable_gpio_mask(codec);
+       stac92xx_init(codec);
        snd_hda_resume_ctls(codec, spec->mixer);
        for (i = 0; i < spec->num_mixers; i++)
                snd_hda_resume_ctls(codec, spec->mixers[i]);
@@ -2240,7 +2244,8 @@ static int patch_stac927x(struct hda_codec *codec)
 
        spec->multiout.dac_nids = spec->dac_nids;
        /* GPIO0 High = Enable EAPD */
-       stac92xx_enable_gpio_mask(codec, 0x00000001, 0x00000001);
+       spec->gpio_mask = spec->gpio_data = 0x00000001;
+       stac92xx_enable_gpio_mask(codec); 
        
        err = stac92xx_parse_auto_config(codec, 0x1e, 0x20);
        if (!err) {
@@ -2265,7 +2270,7 @@ static int patch_stac927x(struct hda_codec *codec)
 static int patch_stac9205(struct hda_codec *codec)
 {
        struct sigmatel_spec *spec;
-       int err, gpio_mask, gpio_data;
+       int err;
 
        spec  = kzalloc(sizeof(*spec), GFP_KERNEL);
        if (spec == NULL)
@@ -2308,15 +2313,16 @@ static int patch_stac9205(struct hda_codec *codec)
                stac92xx_set_config_reg(codec, 0x1f, 0x01441030);
                stac92xx_set_config_reg(codec, 0x20, 0x1c410030);
 
-               gpio_mask = 0x00000007; /* GPIO0-2 */
+               spec->gpio_mask = 0x00000007; /* GPIO0-2 */
                /* GPIO0 High = EAPD, GPIO1 Low = DRM,
                 * GPIO2 High = Headphone Mute
                 */
-               gpio_data = 0x00000005;
+               spec->gpio_data = 0x00000005;
        } else
-               gpio_mask = gpio_data = 0x00000001; /* GPIO0 High = EAPD */
+               spec->gpio_mask = spec->gpio_data =
+                       0x00000001; /* GPIO0 High = EAPD */
 
-       stac92xx_enable_gpio_mask(codec, gpio_mask, gpio_data);
+       stac92xx_enable_gpio_mask(codec);
        err = stac92xx_parse_auto_config(codec, 0x1f, 0x20);
        if (!err) {
                if (spec->board_config < 0) {