aboutsummaryrefslogtreecommitdiffstats
path: root/sound/pci
diff options
context:
space:
mode:
authorSasha Khapyorsky <sashak@smlink.com>2005-05-29 09:08:23 -0400
committerJaroslav Kysela <perex@suse.cz>2005-06-22 06:27:18 -0400
commit87d61c290b5de63cc18ed5ec8103e30fe297373e (patch)
treeed902b08203677cb508e35340705613082e3d1dd /sound/pci
parent8fabab15dc64d4aaed0e9dddf3482c128a0347a2 (diff)
[ALSA] MC97 modem mixer in sound/pci/ac97
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>
Diffstat (limited to 'sound/pci')
-rw-r--r--sound/pci/ac97/ac97_codec.c21
-rw-r--r--sound/pci/ac97/ac97_patch.c21
2 files changed, 38 insertions, 4 deletions
diff --git a/sound/pci/ac97/ac97_codec.c b/sound/pci/ac97/ac97_codec.c
index 36a33ae9ae03..996fcfb09532 100644
--- a/sound/pci/ac97/ac97_codec.c
+++ b/sound/pci/ac97/ac97_codec.c
@@ -150,7 +150,7 @@ static const ac97_codec_id_t snd_ac97_codec_ids[] = {
150{ 0x4e534331, 0xffffffff, "LM4549", NULL, NULL }, 150{ 0x4e534331, 0xffffffff, "LM4549", NULL, NULL },
151{ 0x4e534350, 0xffffffff, "LM4550", NULL, NULL }, 151{ 0x4e534350, 0xffffffff, "LM4550", NULL, NULL },
152{ 0x50534304, 0xffffffff, "UCB1400", NULL, NULL }, 152{ 0x50534304, 0xffffffff, "UCB1400", NULL, NULL },
153{ 0x53494c20, 0xffffffe0, "Si3036,8", NULL, mpatch_si3036 }, 153{ 0x53494c20, 0xffffffe0, "Si3036,8", mpatch_si3036, mpatch_si3036, AC97_MODEM_PATCH },
154{ 0x54524102, 0xffffffff, "TR28022", NULL, NULL }, 154{ 0x54524102, 0xffffffff, "TR28022", NULL, NULL },
155{ 0x54524106, 0xffffffff, "TR28026", NULL, NULL }, 155{ 0x54524106, 0xffffffff, "TR28026", NULL, NULL },
156{ 0x54524108, 0xffffffff, "TR28028", patch_tritech_tr28028, NULL }, // added by xin jin [07/09/99] 156{ 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)
666static const snd_kcontrol_new_t snd_ac97_control_eapd = 666static const snd_kcontrol_new_t snd_ac97_control_eapd =
667AC97_SINGLE("External Amplifier", AC97_POWERDOWN, 15, 1, 1); 667AC97_SINGLE("External Amplifier", AC97_POWERDOWN, 15, 1, 1);
668 668
669static const snd_kcontrol_new_t snd_ac97_controls_modem_switches[2] = {
670AC97_SINGLE("Off-hook Switch", AC97_GPIO_STATUS, 0, 1, 0),
671AC97_SINGLE("Caller ID Switch", AC97_GPIO_STATUS, 2, 1, 0)
672};
673
669/* change the existing EAPD control as inverted */ 674/* change the existing EAPD control as inverted */
670static void set_inv_eapd(ac97_t *ac97, snd_kcontrol_t *kctl) 675static void set_inv_eapd(ac97_t *ac97, snd_kcontrol_t *kctl)
671{ 676{
@@ -1526,13 +1531,25 @@ static int snd_ac97_mixer_build(ac97_t * ac97)
1526 1531
1527static int snd_ac97_modem_build(snd_card_t * card, ac97_t * ac97) 1532static int snd_ac97_modem_build(snd_card_t * card, ac97_t * ac97)
1528{ 1533{
1529 /* TODO */ 1534 int err, idx;
1535
1530 //printk("AC97_GPIO_CFG = %x\n",snd_ac97_read(ac97,AC97_GPIO_CFG)); 1536 //printk("AC97_GPIO_CFG = %x\n",snd_ac97_read(ac97,AC97_GPIO_CFG));
1531 snd_ac97_write(ac97, AC97_GPIO_CFG, 0xffff & ~(AC97_GPIO_LINE1_OH)); 1537 snd_ac97_write(ac97, AC97_GPIO_CFG, 0xffff & ~(AC97_GPIO_LINE1_OH));
1532 snd_ac97_write(ac97, AC97_GPIO_POLARITY, 0xffff & ~(AC97_GPIO_LINE1_OH)); 1538 snd_ac97_write(ac97, AC97_GPIO_POLARITY, 0xffff & ~(AC97_GPIO_LINE1_OH));
1533 snd_ac97_write(ac97, AC97_GPIO_STICKY, 0xffff); 1539 snd_ac97_write(ac97, AC97_GPIO_STICKY, 0xffff);
1534 snd_ac97_write(ac97, AC97_GPIO_WAKEUP, 0x0); 1540 snd_ac97_write(ac97, AC97_GPIO_WAKEUP, 0x0);
1535 snd_ac97_write(ac97, AC97_MISC_AFE, 0x0); 1541 snd_ac97_write(ac97, AC97_MISC_AFE, 0x0);
1542
1543 /* build modem switches */
1544 for (idx = 0; idx < ARRAY_SIZE(snd_ac97_controls_modem_switches); idx++)
1545 if ((err = snd_ctl_add(card, snd_ac97_cnew(&snd_ac97_controls_modem_switches[idx], ac97))) < 0)
1546 return err;
1547
1548 /* build chip specific controls */
1549 if (ac97->build_ops->build_specific)
1550 if ((err = ac97->build_ops->build_specific(ac97)) < 0)
1551 return err;
1552
1536 return 0; 1553 return 0;
1537} 1554}
1538 1555
diff --git a/sound/pci/ac97/ac97_patch.c b/sound/pci/ac97/ac97_patch.c
index b81064133c61..a15eb8522b7c 100644
--- a/sound/pci/ac97/ac97_patch.c
+++ b/sound/pci/ac97/ac97_patch.c
@@ -2459,12 +2459,29 @@ int patch_it2646(ac97_t * ac97)
2459 return 0; 2459 return 0;
2460} 2460}
2461 2461
2462/* Si3036/8 specific registers */ 2462/*
2463 * Si3036 codec
2464 */
2465
2463#define AC97_SI3036_CHIP_ID 0x5a 2466#define AC97_SI3036_CHIP_ID 0x5a
2467#define AC97_SI3036_LINE_CFG 0x5c
2468
2469static const snd_kcontrol_new_t snd_ac97_controls_si3036[] = {
2470AC97_DOUBLE("Modem Speaker Volume", 0x5c, 14, 12, 3, 1)
2471};
2472
2473static int patch_si3036_specific(ac97_t * ac97)
2474{
2475 return patch_build_controls(ac97, snd_ac97_controls_si3036, ARRAY_SIZE(snd_ac97_controls_si3036));
2476}
2477
2478static struct snd_ac97_build_ops patch_si3036_ops = {
2479 .build_specific = patch_si3036_specific,
2480};
2464 2481
2465int mpatch_si3036(ac97_t * ac97) 2482int mpatch_si3036(ac97_t * ac97)
2466{ 2483{
2467 //printk("mpatch_si3036: chip id = %x\n", snd_ac97_read(ac97, 0x5a)); 2484 ac97->build_ops = &patch_si3036_ops;
2468 snd_ac97_write_cache(ac97, 0x5c, 0xf210 ); 2485 snd_ac97_write_cache(ac97, 0x5c, 0xf210 );
2469 snd_ac97_write_cache(ac97, 0x68, 0); 2486 snd_ac97_write_cache(ac97, 0x68, 0);
2470 return 0; 2487 return 0;