aboutsummaryrefslogtreecommitdiffstats
path: root/sound/pci/ca0106
diff options
context:
space:
mode:
authorJames Courtier-Dutton <James@superbug.co.uk>2005-05-21 16:35:58 -0400
committerJaroslav Kysela <perex@suse.cz>2005-05-29 04:11:35 -0400
commit1baa705b75124df7cfe3d5d2706f794a14d26ad0 (patch)
treefb3e4a81c53a52caa33ee27426716360e5e5dc68 /sound/pci/ca0106
parent8f55fbb0fdb821023ff0a816ebf5056188891ff0 (diff)
[ALSA] Tidy up card recognition.
CA0106 driver Signed-off-by: James Courtier-Dutton <James@superbug.co.uk>
Diffstat (limited to 'sound/pci/ca0106')
-rw-r--r--sound/pci/ca0106/ca0106.h8
-rw-r--r--sound/pci/ca0106/ca0106_main.c63
2 files changed, 43 insertions, 28 deletions
diff --git a/sound/pci/ca0106/ca0106.h b/sound/pci/ca0106/ca0106.h
index deb028851056..c623858428cd 100644
--- a/sound/pci/ca0106/ca0106.h
+++ b/sound/pci/ca0106/ca0106.h
@@ -508,9 +508,17 @@ struct snd_ca0106_pcm {
508 unsigned short running; 508 unsigned short running;
509}; 509};
510 510
511typedef struct {
512 u32 serial;
513 char * name;
514 int ac97;
515 int gpio_type;
516} ca0106_details_t;
517
511// definition of the chip-specific record 518// definition of the chip-specific record
512struct snd_ca0106 { 519struct snd_ca0106 {
513 snd_card_t *card; 520 snd_card_t *card;
521 ca0106_details_t *details;
514 struct pci_dev *pci; 522 struct pci_dev *pci;
515 523
516 unsigned long port; 524 unsigned long port;
diff --git a/sound/pci/ca0106/ca0106_main.c b/sound/pci/ca0106/ca0106_main.c
index 90d493ca7c99..a56e68ea87bc 100644
--- a/sound/pci/ca0106/ca0106_main.c
+++ b/sound/pci/ca0106/ca0106_main.c
@@ -161,18 +161,29 @@ MODULE_PARM_DESC(enable, "Enable the CA0106 soundcard.");
161 161
162#include "ca0106.h" 162#include "ca0106.h"
163 163
164typedef struct { 164static ca0106_details_t ca0106_chip_details[] = {
165 u32 serial; 165 /* AudigyLS[SB0310] */
166 char * name; 166 { .serial = 0x10021102,
167} ca0106_names_t; 167 .name = "AudigyLS [SB0310]",
168 168 .ac97 = 1 } ,
169static ca0106_names_t ca0106_chip_names[] = { 169 /* Unknown AudigyLS that also says SB0310 on it */
170 { 0x10021102, "AudigyLS [SB0310]"} , 170 { .serial = 0x10051102,
171 { 0x10051102, "AudigyLS [SB0310b]"} , /* Unknown AudigyLS that also says SB0310 on it */ 171 .name = "AudigyLS [SB0310b]",
172 { 0x10061102, "Live! 7.1 24bit [SB0410]"} , /* New Sound Blaster Live! 7.1 24bit. This does not have an AC97. 53SB041000001 */ 172 .ac97 = 1 } ,
173 { 0x10071102, "Live! 7.1 24bit [SB0413]"} , /* New Dell Sound Blaster Live! 7.1 24bit. This does not have an AC97. */ 173 /* New Sound Blaster Live! 7.1 24bit. This does not have an AC97. 53SB041000001 */
174 { 0x10091462, "MSI K8N Diamond MB [SB0438]"}, /* MSI K8N Diamond Motherboard with onboard SB Live 24bit without AC97 */ 174 { .serial = 0x10061102,
175 { 0, "AudigyLS [Unknown]" } 175 .name = "Live! 7.1 24bit [SB0410]",
176 .gpio_type = 1 } ,
177 /* New Dell Sound Blaster Live! 7.1 24bit. This does not have an AC97. */
178 { .serial = 0x10071102,
179 .name = "Live! 7.1 24bit [SB0413]",
180 .gpio_type = 1 } ,
181 /* MSI K8N Diamond Motherboard with onboard SB Live 24bit without AC97 */
182 { .serial = 0x10091462,
183 .name = "MSI K8N Diamond MB [SB0438]",
184 .gpio_type = 1 } ,
185 { .serial = 0,
186 .name = "AudigyLS [Unknown]" }
176}; 187};
177 188
178/* hardware definition */ 189/* hardware definition */
@@ -994,6 +1005,7 @@ static int __devinit snd_ca0106_create(snd_card_t *card,
994 ca0106_t **rchip) 1005 ca0106_t **rchip)
995{ 1006{
996 ca0106_t *chip; 1007 ca0106_t *chip;
1008 ca0106_details_t *c;
997 int err; 1009 int err;
998 int ch; 1010 int ch;
999 static snd_device_ops_t ops = { 1011 static snd_device_ops_t ops = {
@@ -1055,6 +1067,15 @@ static int __devinit snd_ca0106_create(snd_card_t *card,
1055 printk(KERN_INFO "Model %04x Rev %08x Serial %08x\n", chip->model, 1067 printk(KERN_INFO "Model %04x Rev %08x Serial %08x\n", chip->model,
1056 chip->revision, chip->serial); 1068 chip->revision, chip->serial);
1057#endif 1069#endif
1070 strcpy(card->driver, "CA0106");
1071 strcpy(card->shortname, "CA0106");
1072
1073 for (c=ca0106_chip_details; c->serial; c++) {
1074 if (c->serial == chip->serial) break;
1075 }
1076 chip->details = c;
1077 sprintf(card->longname, "%s at 0x%lx irq %i",
1078 c->name, chip->port, chip->irq);
1058 1079
1059 outl(0, chip->port + INTE); 1080 outl(0, chip->port + INTE);
1060 1081
@@ -1139,9 +1160,7 @@ static int __devinit snd_ca0106_create(snd_card_t *card,
1139 snd_ca0106_ptr_write(chip, CAPTURE_SOURCE, 0x0, 0x333300e4); /* Select MIC, Line in, TAD in, AUX in */ 1160 snd_ca0106_ptr_write(chip, CAPTURE_SOURCE, 0x0, 0x333300e4); /* Select MIC, Line in, TAD in, AUX in */
1140 chip->capture_source = 3; /* Set CAPTURE_SOURCE */ 1161 chip->capture_source = 3; /* Set CAPTURE_SOURCE */
1141 1162
1142 if ((chip->serial == 0x10061102) || 1163 if (chip->details->gpio_type == 1) { /* The SB0410 and SB0413 use GPIO differently. */
1143 (chip->serial == 0x10071102) ||
1144 (chip->serial == 0x10091462)) { /* The SB0410 and SB0413 use GPIO differently. */
1145 /* FIXME: Still need to find out what the other GPIO bits do. E.g. For digital spdif out. */ 1164 /* FIXME: Still need to find out what the other GPIO bits do. E.g. For digital spdif out. */
1146 outl(0x0, chip->port+GPIO); 1165 outl(0x0, chip->port+GPIO);
1147 //outl(0x00f0e000, chip->port+GPIO); /* Analog */ 1166 //outl(0x00f0e000, chip->port+GPIO); /* Analog */
@@ -1173,7 +1192,6 @@ static int __devinit snd_ca0106_probe(struct pci_dev *pci,
1173 static int dev; 1192 static int dev;
1174 snd_card_t *card; 1193 snd_card_t *card;
1175 ca0106_t *chip; 1194 ca0106_t *chip;
1176 ca0106_names_t *c;
1177 int err; 1195 int err;
1178 1196
1179 if (dev >= SNDRV_CARDS) 1197 if (dev >= SNDRV_CARDS)
@@ -1208,9 +1226,7 @@ static int __devinit snd_ca0106_probe(struct pci_dev *pci,
1208 snd_card_free(card); 1226 snd_card_free(card);
1209 return err; 1227 return err;
1210 } 1228 }
1211 if ((chip->serial != 0x10061102) && 1229 if (chip->details->ac97 == 1) { /* The SB0410 and SB0413 do not have an AC97 chip. */
1212 (chip->serial != 0x10071102) &&
1213 (chip->serial != 0x10091462) ) { /* The SB0410 and SB0413 do not have an ac97 chip. */
1214 if ((err = snd_ca0106_ac97(chip)) < 0) { 1230 if ((err = snd_ca0106_ac97(chip)) < 0) {
1215 snd_card_free(card); 1231 snd_card_free(card);
1216 return err; 1232 return err;
@@ -1223,15 +1239,6 @@ static int __devinit snd_ca0106_probe(struct pci_dev *pci,
1223 1239
1224 snd_ca0106_proc_init(chip); 1240 snd_ca0106_proc_init(chip);
1225 1241
1226 strcpy(card->driver, "CA0106");
1227 strcpy(card->shortname, "CA0106");
1228
1229 for (c=ca0106_chip_names; c->serial; c++) {
1230 if (c->serial == chip->serial) break;
1231 }
1232 sprintf(card->longname, "%s at 0x%lx irq %i",
1233 c->name, chip->port, chip->irq);
1234
1235 if ((err = snd_card_register(card)) < 0) { 1242 if ((err = snd_card_register(card)) < 0) {
1236 snd_card_free(card); 1243 snd_card_free(card);
1237 return err; 1244 return err;