]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/commitdiff
[ALSA] hda - Add support of AD1989A/AD1989B
authorTakashi Iwai <tiwai@suse.de>
Tue, 15 Apr 2008 16:46:42 +0000 (18:46 +0200)
committerTakashi Iwai <tiwai@suse.de>
Thu, 24 Apr 2008 10:00:36 +0000 (12:00 +0200)
Added the support of AD1989A and AD1989B codecs.
These codecs can have multiple SPDIF devices, but currently we handle
only one SPDIF.  If any real devices with two SPDIF interfaces (likely
one for SPDIF and one for HDMI), we'll fix this rightly.

Otherwise, these codecs are pretty similar with AD1988.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
Documentation/sound/alsa/ALSA-Configuration.txt
sound/pci/hda/patch_analog.c

index 3413644dff1e9065996c7e1c3234ef4d95d9aee8..fd4c32a031c9f5e5381b440379ea70ca9e85ff7e 100644 (file)
@@ -956,7 +956,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
          laptop-automute 2-channel with EAPD and HP-automute (Lenovo N100)
          ultra         2-channel with EAPD (Samsung Ultra tablet PC)
 
-       AD1988
+       AD1988/AD1988B/AD1989A/AD1989B
          6stack        6-jack
          6stack-dig    ditto with SPDIF
          3stack        3-jack
index 2befeebd909e6679d342cbea7e1c8aa6d8523810..f486eb16a38675bc9f742788fd23efff147b2a86 100644 (file)
@@ -2142,6 +2142,10 @@ static struct snd_kcontrol_new ad1988_spdif_in_mixers[] = {
        { } /* end */
 };
 
+static struct snd_kcontrol_new ad1989_spdif_out_mixers[] = {
+       HDA_CODEC_VOLUME("IEC958 Playback Volume", 0x1b, 0x0, HDA_OUTPUT),
+       { } /* end */
+};
 
 /*
  * initialization verbs
@@ -2242,6 +2246,13 @@ static struct hda_verb ad1988_spdif_init_verbs[] = {
        { }
 };
 
+/* AD1989 has no ADC -> SPDIF route */
+static struct hda_verb ad1989_spdif_init_verbs[] = {
+       /* SPDIF out pin */
+       {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE | 0x27}, /* 0dB */
+       { }
+};
+
 /*
  * verbs for 3stack (+dig)
  */
@@ -2949,10 +2960,19 @@ static int patch_ad1988(struct hda_codec *codec)
        spec->mixers[spec->num_mixers++] = ad1988_capture_mixers;
        spec->init_verbs[spec->num_init_verbs++] = ad1988_capture_init_verbs;
        if (spec->multiout.dig_out_nid) {
-               spec->mixers[spec->num_mixers++] = ad1988_spdif_out_mixers;
-               spec->init_verbs[spec->num_init_verbs++] = ad1988_spdif_init_verbs;
+               if (codec->vendor_id >= 0x11d4989a) {
+                       spec->mixers[spec->num_mixers++] =
+                               ad1989_spdif_out_mixers;
+                       spec->init_verbs[spec->num_init_verbs++] =
+                               ad1989_spdif_init_verbs;
+               } else {
+                       spec->mixers[spec->num_mixers++] =
+                               ad1988_spdif_out_mixers;
+                       spec->init_verbs[spec->num_init_verbs++] =
+                               ad1988_spdif_init_verbs;
+               }
        }
-       if (spec->dig_in_nid)
+       if (spec->dig_in_nid && codec->vendor_id < 0x11d4989a)
                spec->mixers[spec->num_mixers++] = ad1988_spdif_in_mixers;
 
        codec->patch_ops = ad198x_patch_ops;
@@ -4184,5 +4204,7 @@ struct hda_codec_preset snd_hda_preset_analog[] = {
        { .id = 0x11d41986, .name = "AD1986A", .patch = patch_ad1986a },
        { .id = 0x11d41988, .name = "AD1988", .patch = patch_ad1988 },
        { .id = 0x11d4198b, .name = "AD1988B", .patch = patch_ad1988 },
+       { .id = 0x11d4989a, .name = "AD1989A", .patch = patch_ad1988 },
+       { .id = 0x11d4989b, .name = "AD1989B", .patch = patch_ad1988 },
        {} /* terminator */
 };