diff options
author | Takashi Iwai <tiwai@suse.de> | 2009-07-07 09:04:26 +0200 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2009-07-07 09:04:26 +0200 |
commit | ed208255e700073c34b0ef8d2045ac030ac28971 (patch) | |
tree | 1506239155a0841175ad5f3641dc7c0fc5250482 /sound/pci/hda/patch_cirrus.c | |
parent | a6bae20559bb0371e89ebc46689e9cf4e7816813 (diff) | |
download | linux-ed208255e700073c34b0ef8d2045ac030ac28971.tar.gz linux-ed208255e700073c34b0ef8d2045ac030ac28971.tar.bz2 linux-ed208255e700073c34b0ef8d2045ac030ac28971.zip |
ALSA: hda - Add GPIO setup for MacBook pro 5,5 with CS420x
GPIO3 seems corresponding to EAPD that is required for the speaker
output.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/pci/hda/patch_cirrus.c')
-rw-r--r-- | sound/pci/hda/patch_cirrus.c | 49 |
1 files changed, 36 insertions, 13 deletions
diff --git a/sound/pci/hda/patch_cirrus.c b/sound/pci/hda/patch_cirrus.c index b1fd183d7604..121734480097 100644 --- a/sound/pci/hda/patch_cirrus.c +++ b/sound/pci/hda/patch_cirrus.c @@ -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; |