[ALSA] MC97 modem mixer in sound/pci/ac97
authorSasha Khapyorsky <sashak@smlink.com>
Sun, 29 May 2005 13:08:23 +0000 (15:08 +0200)
committerJaroslav Kysela <perex@suse.cz>
Wed, 22 Jun 2005 10:27:18 +0000 (12:27 +0200)
AC97 Codec
Simple MC97 modem mixer with two common controls: Off-hook and CID,
and Si3056 MC specific control: Modem Speaker.

Signed-off-by: Sasha Khapyorsky <sashak@smlink.com>
Signed-off-by: Jaroslav Kysela <perex@suse.cz>
sound/pci/ac97/ac97_codec.c
sound/pci/ac97/ac97_patch.c

index 36a33ae9ae030b9b846a8961fb1394754d299d5c..996fcfb0953247b873c483bfa76051b6acf31184 100644 (file)
@@ -150,7 +150,7 @@ static const ac97_codec_id_t snd_ac97_codec_ids[] = {
 { 0x4e534331, 0xffffffff, "LM4549",            NULL,           NULL },
 { 0x4e534350, 0xffffffff, "LM4550",            NULL,           NULL },
 { 0x50534304, 0xffffffff, "UCB1400",           NULL,           NULL },
-{ 0x53494c20, 0xffffffe0, "Si3036,8",          NULL,           mpatch_si3036 },
+{ 0x53494c20, 0xffffffe0, "Si3036,8",          mpatch_si3036,  mpatch_si3036, AC97_MODEM_PATCH },
 { 0x54524102, 0xffffffff, "TR28022",           NULL,           NULL },
 { 0x54524106, 0xffffffff, "TR28026",           NULL,           NULL },
 { 0x54524108, 0xffffffff, "TR28028",           patch_tritech_tr28028,  NULL }, // added by xin jin [07/09/99]
@@ -666,6 +666,11 @@ AC97_SINGLE("LFE Playback Volume", AC97_CENTER_LFE_MASTER, 8, 31, 1)
 static const snd_kcontrol_new_t snd_ac97_control_eapd =
 AC97_SINGLE("External Amplifier", AC97_POWERDOWN, 15, 1, 1);
 
+static const snd_kcontrol_new_t snd_ac97_controls_modem_switches[2] = {
+AC97_SINGLE("Off-hook Switch", AC97_GPIO_STATUS, 0, 1, 0),
+AC97_SINGLE("Caller ID Switch", AC97_GPIO_STATUS, 2, 1, 0)
+};
+
 /* change the existing EAPD control as inverted */
 static void set_inv_eapd(ac97_t *ac97, snd_kcontrol_t *kctl)
 {
@@ -1526,13 +1531,25 @@ static int snd_ac97_mixer_build(ac97_t * ac97)
 
 static int snd_ac97_modem_build(snd_card_t * card, ac97_t * ac97)
 {
-       /* TODO */
+       int err, idx;
+
        //printk("AC97_GPIO_CFG = %x\n",snd_ac97_read(ac97,AC97_GPIO_CFG));
        snd_ac97_write(ac97, AC97_GPIO_CFG, 0xffff & ~(AC97_GPIO_LINE1_OH));
        snd_ac97_write(ac97, AC97_GPIO_POLARITY, 0xffff & ~(AC97_GPIO_LINE1_OH));
        snd_ac97_write(ac97, AC97_GPIO_STICKY, 0xffff);
        snd_ac97_write(ac97, AC97_GPIO_WAKEUP, 0x0);
        snd_ac97_write(ac97, AC97_MISC_AFE, 0x0);
+
+       /* build modem switches */
+       for (idx = 0; idx < ARRAY_SIZE(snd_ac97_controls_modem_switches); idx++)
+               if ((err = snd_ctl_add(card, snd_ac97_cnew(&snd_ac97_controls_modem_switches[idx], ac97))) < 0)
+                       return err;
+
+       /* build chip specific controls */
+       if (ac97->build_ops->build_specific)
+               if ((err = ac97->build_ops->build_specific(ac97)) < 0)
+                       return err;
+
        return 0;
 }
 
index b81064133c61c91e7253359f824b12ae0d357155..a15eb8522b7cc90f098362bcb49e4242b6b4fe41 100644 (file)
@@ -2459,12 +2459,29 @@ int patch_it2646(ac97_t * ac97)
        return 0;
 }
 
-/* Si3036/8 specific registers */
+/*
+ * Si3036 codec
+ */
+
 #define AC97_SI3036_CHIP_ID     0x5a
+#define AC97_SI3036_LINE_CFG    0x5c
+
+static const snd_kcontrol_new_t snd_ac97_controls_si3036[] = {
+AC97_DOUBLE("Modem Speaker Volume", 0x5c, 14, 12, 3, 1)
+};
+
+static int patch_si3036_specific(ac97_t * ac97)
+{
+       return patch_build_controls(ac97, snd_ac97_controls_si3036, ARRAY_SIZE(snd_ac97_controls_si3036));
+}
+
+static struct snd_ac97_build_ops patch_si3036_ops = {
+       .build_specific = patch_si3036_specific,
+};
 
 int mpatch_si3036(ac97_t * ac97)
 {
-       //printk("mpatch_si3036: chip id = %x\n", snd_ac97_read(ac97, 0x5a));
+       ac97->build_ops = &patch_si3036_ops;
        snd_ac97_write_cache(ac97, 0x5c, 0xf210 );
        snd_ac97_write_cache(ac97, 0x68, 0);
        return 0;