ALSA: hda - Add GPIO setup for MacBook pro 5,5 with CS420x
authorTakashi Iwai <tiwai@suse.de>
Tue, 7 Jul 2009 07:04:26 +0000 (09:04 +0200)
committerTakashi Iwai <tiwai@suse.de>
Tue, 7 Jul 2009 07:04:26 +0000 (09:04 +0200)
GPIO3 seems corresponding to EAPD that is required for the speaker
output.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/hda/patch_cirrus.c

index b1fd183..1217344 100644 (file)
@@ -53,6 +53,10 @@ struct cs_spec {
 
        struct hda_bind_ctls *capture_bind[2];
 
+       unsigned int gpio_mask;
+       unsigned int gpio_dir;
+       unsigned int gpio_data;
+
        struct hda_pcm pcm_rec[2];      /* PCM information */
 
        unsigned int hp_detect:1;
@@ -981,6 +985,16 @@ static int cs_init(struct hda_codec *codec)
        struct cs_spec *spec = codec->spec;
 
        snd_hda_sequence_write(codec, cs_coef_init_verbs);
+
+       if (spec->gpio_mask) {
+               snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_MASK,
+                                   spec->gpio_mask);
+               snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DIRECTION,
+                                   spec->gpio_dir);
+               snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA,
+                                   spec->gpio_data);
+       }
+
        init_output(codec);
        init_input(codec);
        init_digital(codec);
@@ -1043,6 +1057,19 @@ static int cs_parse_auto_config(struct hda_codec *codec)
        err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, NULL);
        if (err < 0)
                return err;
+
+       err = parse_output(codec);
+       if (err < 0)
+               return err;
+       err = parse_input(codec);
+       if (err < 0)
+               return err;
+       err = parse_digital_output(codec);
+       if (err < 0)
+               return err;
+       err = parse_digital_input(codec);
+       if (err < 0)
+               return err;
        return 0;
 }
 
@@ -1106,20 +1133,16 @@ static int patch_cs420x(struct hda_codec *codec)
        if (spec->board_config >= 0)
                fix_pincfg(codec, spec->board_config);
 
-       err = cs_parse_auto_config(codec);
-       if (err < 0)
-               goto error;
+       switch (spec->board_config) {
+       case CS420X_MBP55:
+               /* GPIO3 = EAPD? */
+               spec->gpio_mask = 0x08;
+               spec->gpio_dir = 0x08;
+               spec->gpio_data = 0x08;
+               break;
+       }
 
-       err = parse_output(codec);
-       if (err < 0)
-               goto error;
-       err = parse_input(codec);
-       if (err < 0)
-               goto error;
-       err = parse_digital_output(codec);
-       if (err < 0)
-               goto error;
-       err = parse_digital_input(codec);
+       err = cs_parse_auto_config(codec);
        if (err < 0)
                goto error;