ALSA: azt3328: hook up new emulated AC97 on AC97 patch side
authorAndreas Mohr <andi@lisas.de>
Fri, 18 Feb 2011 23:49:48 +0000 (00:49 +0100)
committerTakashi Iwai <tiwai@suse.de>
Sat, 19 Feb 2011 15:03:08 +0000 (16:03 +0100)
Make newly created AC97 emulation of azt3328 known to the AC97 layer
side.
- relocate common functions to the top (due to definition after use)
- rename control names
- adjust 3D settings to the card's custom layout of this register

Signed-off-by: Andreas Mohr <andi@lisas.de>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/ac97/ac97_codec.c
sound/pci/ac97/ac97_patch.c

index 2cc56b5..7f4d619 100644 (file)
@@ -71,6 +71,12 @@ static const struct ac97_codec_id snd_ac97_codec_id_vendors[] = {
 { 0x414b4d00, 0xffffff00, "Asahi Kasei",       NULL,   NULL },
 { 0x414c4300, 0xffffff00, "Realtek",           NULL,   NULL },
 { 0x414c4700, 0xffffff00, "Realtek",           NULL,   NULL },
+/*
+ * This is an _inofficial_ Aztech Labs entry
+ * (value might differ from unknown official Aztech ID),
+ * currently used by the AC97 emulation of the almost-AC97 PCI168 card.
+ */
+{ 0x415a5400, 0xffffff00, "Aztech Labs (emulated)",    NULL,   NULL },
 { 0x434d4900, 0xffffff00, "C-Media Electronics", NULL, NULL },
 { 0x43525900, 0xffffff00, "Cirrus Logic",      NULL,   NULL },
 { 0x43585400, 0xffffff00, "Conexant",           NULL,  NULL },
@@ -127,6 +133,7 @@ static const struct ac97_codec_id snd_ac97_codec_ids[] = {
 { 0x414c4781, 0xffffffff, "ALC658D",           NULL,   NULL }, /* already patched */
 { 0x414c4780, 0xfffffff0, "ALC658",            patch_alc655,   NULL },
 { 0x414c4790, 0xfffffff0, "ALC850",            patch_alc850,   NULL },
+{ 0x415a5401, 0xffffffff, "AZF3328",           patch_aztech_azf3328,   NULL },
 { 0x434d4941, 0xffffffff, "CMI9738",           patch_cm9738,   NULL },
 { 0x434d4961, 0xffffffff, "CMI9739",           patch_cm9739,   NULL },
 { 0x434d4969, 0xffffffff, "CMI9780",           patch_cm9780,   NULL },
index bf47574..200c9a1 100644 (file)
 #include "ac97_patch.h"
 
 /*
+ *  Forward declarations
+ */
+
+static struct snd_kcontrol *snd_ac97_find_mixer_ctl(struct snd_ac97 *ac97,
+                                                   const char *name);
+static int snd_ac97_add_vmaster(struct snd_ac97 *ac97, char *name,
+                               const unsigned int *tlv, const char **slaves);
+
+/*
  *  Chip specific initialization
  */
 
@@ -2940,6 +2949,49 @@ static int patch_alc850(struct snd_ac97 *ac97)
        return 0;
 }
 
+static int patch_aztech_azf3328_specific(struct snd_ac97 *ac97)
+{
+       struct snd_kcontrol *kctl_3d_center =
+               snd_ac97_find_mixer_ctl(ac97, "3D Control - Center");
+       struct snd_kcontrol *kctl_3d_depth =
+               snd_ac97_find_mixer_ctl(ac97, "3D Control - Depth");
+
+       /*
+        * 3D register is different from AC97 standard layout
+        * (also do some renaming, to resemble Windows driver naming)
+        */
+       if (kctl_3d_center) {
+               kctl_3d_center->private_value =
+                       AC97_SINGLE_VALUE(AC97_3D_CONTROL, 1, 0x07, 0);
+               snd_ac97_rename_vol_ctl(ac97,
+                       "3D Control - Center", "3D Control - Width"
+               );
+       }
+       if (kctl_3d_depth)
+               kctl_3d_depth->private_value =
+                       AC97_SINGLE_VALUE(AC97_3D_CONTROL, 8, 0x03, 0);
+
+       /* Aztech Windows driver calls the
+          equivalent control "Modem Playback", thus rename it: */
+       snd_ac97_rename_vol_ctl(ac97,
+               "Master Mono Playback", "Modem Playback"
+       );
+       snd_ac97_rename_vol_ctl(ac97,
+               "Headphone Playback", "FM Synth Playback"
+       );
+
+       return 0;
+}
+
+static const struct snd_ac97_build_ops patch_aztech_azf3328_ops = {
+       .build_specific = patch_aztech_azf3328_specific
+};
+
+static int patch_aztech_azf3328(struct snd_ac97 *ac97)
+{
+       ac97->build_ops = &patch_aztech_azf3328_ops;
+       return 0;
+}
 
 /*
  * C-Media CM97xx codecs