Loading sound/pci/ca0106/ca0106.h +8 −0 Original line number Diff line number Diff line Loading @@ -508,9 +508,17 @@ struct snd_ca0106_pcm { unsigned short running; }; typedef struct { u32 serial; char * name; int ac97; int gpio_type; } ca0106_details_t; // definition of the chip-specific record struct snd_ca0106 { snd_card_t *card; ca0106_details_t *details; struct pci_dev *pci; unsigned long port; Loading sound/pci/ca0106/ca0106_main.c +35 −28 Original line number Diff line number Diff line Loading @@ -161,18 +161,29 @@ MODULE_PARM_DESC(enable, "Enable the CA0106 soundcard."); #include "ca0106.h" typedef struct { u32 serial; char * name; } ca0106_names_t; static ca0106_names_t ca0106_chip_names[] = { { 0x10021102, "AudigyLS [SB0310]"} , { 0x10051102, "AudigyLS [SB0310b]"} , /* Unknown AudigyLS that also says SB0310 on it */ { 0x10061102, "Live! 7.1 24bit [SB0410]"} , /* New Sound Blaster Live! 7.1 24bit. This does not have an AC97. 53SB041000001 */ { 0x10071102, "Live! 7.1 24bit [SB0413]"} , /* New Dell Sound Blaster Live! 7.1 24bit. This does not have an AC97. */ { 0x10091462, "MSI K8N Diamond MB [SB0438]"}, /* MSI K8N Diamond Motherboard with onboard SB Live 24bit without AC97 */ { 0, "AudigyLS [Unknown]" } static ca0106_details_t ca0106_chip_details[] = { /* AudigyLS[SB0310] */ { .serial = 0x10021102, .name = "AudigyLS [SB0310]", .ac97 = 1 } , /* Unknown AudigyLS that also says SB0310 on it */ { .serial = 0x10051102, .name = "AudigyLS [SB0310b]", .ac97 = 1 } , /* New Sound Blaster Live! 7.1 24bit. This does not have an AC97. 53SB041000001 */ { .serial = 0x10061102, .name = "Live! 7.1 24bit [SB0410]", .gpio_type = 1 } , /* New Dell Sound Blaster Live! 7.1 24bit. This does not have an AC97. */ { .serial = 0x10071102, .name = "Live! 7.1 24bit [SB0413]", .gpio_type = 1 } , /* MSI K8N Diamond Motherboard with onboard SB Live 24bit without AC97 */ { .serial = 0x10091462, .name = "MSI K8N Diamond MB [SB0438]", .gpio_type = 1 } , { .serial = 0, .name = "AudigyLS [Unknown]" } }; /* hardware definition */ Loading Loading @@ -994,6 +1005,7 @@ static int __devinit snd_ca0106_create(snd_card_t *card, ca0106_t **rchip) { ca0106_t *chip; ca0106_details_t *c; int err; int ch; static snd_device_ops_t ops = { Loading Loading @@ -1055,6 +1067,15 @@ static int __devinit snd_ca0106_create(snd_card_t *card, printk(KERN_INFO "Model %04x Rev %08x Serial %08x\n", chip->model, chip->revision, chip->serial); #endif strcpy(card->driver, "CA0106"); strcpy(card->shortname, "CA0106"); for (c=ca0106_chip_details; c->serial; c++) { if (c->serial == chip->serial) break; } chip->details = c; sprintf(card->longname, "%s at 0x%lx irq %i", c->name, chip->port, chip->irq); outl(0, chip->port + INTE); Loading Loading @@ -1139,9 +1160,7 @@ static int __devinit snd_ca0106_create(snd_card_t *card, snd_ca0106_ptr_write(chip, CAPTURE_SOURCE, 0x0, 0x333300e4); /* Select MIC, Line in, TAD in, AUX in */ chip->capture_source = 3; /* Set CAPTURE_SOURCE */ if ((chip->serial == 0x10061102) || (chip->serial == 0x10071102) || (chip->serial == 0x10091462)) { /* The SB0410 and SB0413 use GPIO differently. */ if (chip->details->gpio_type == 1) { /* The SB0410 and SB0413 use GPIO differently. */ /* FIXME: Still need to find out what the other GPIO bits do. E.g. For digital spdif out. */ outl(0x0, chip->port+GPIO); //outl(0x00f0e000, chip->port+GPIO); /* Analog */ Loading Loading @@ -1173,7 +1192,6 @@ static int __devinit snd_ca0106_probe(struct pci_dev *pci, static int dev; snd_card_t *card; ca0106_t *chip; ca0106_names_t *c; int err; if (dev >= SNDRV_CARDS) Loading Loading @@ -1208,9 +1226,7 @@ static int __devinit snd_ca0106_probe(struct pci_dev *pci, snd_card_free(card); return err; } if ((chip->serial != 0x10061102) && (chip->serial != 0x10071102) && (chip->serial != 0x10091462) ) { /* The SB0410 and SB0413 do not have an ac97 chip. */ if (chip->details->ac97 == 1) { /* The SB0410 and SB0413 do not have an AC97 chip. */ if ((err = snd_ca0106_ac97(chip)) < 0) { snd_card_free(card); return err; Loading @@ -1223,15 +1239,6 @@ static int __devinit snd_ca0106_probe(struct pci_dev *pci, snd_ca0106_proc_init(chip); strcpy(card->driver, "CA0106"); strcpy(card->shortname, "CA0106"); for (c=ca0106_chip_names; c->serial; c++) { if (c->serial == chip->serial) break; } sprintf(card->longname, "%s at 0x%lx irq %i", c->name, chip->port, chip->irq); if ((err = snd_card_register(card)) < 0) { snd_card_free(card); return err; Loading Loading
sound/pci/ca0106/ca0106.h +8 −0 Original line number Diff line number Diff line Loading @@ -508,9 +508,17 @@ struct snd_ca0106_pcm { unsigned short running; }; typedef struct { u32 serial; char * name; int ac97; int gpio_type; } ca0106_details_t; // definition of the chip-specific record struct snd_ca0106 { snd_card_t *card; ca0106_details_t *details; struct pci_dev *pci; unsigned long port; Loading
sound/pci/ca0106/ca0106_main.c +35 −28 Original line number Diff line number Diff line Loading @@ -161,18 +161,29 @@ MODULE_PARM_DESC(enable, "Enable the CA0106 soundcard."); #include "ca0106.h" typedef struct { u32 serial; char * name; } ca0106_names_t; static ca0106_names_t ca0106_chip_names[] = { { 0x10021102, "AudigyLS [SB0310]"} , { 0x10051102, "AudigyLS [SB0310b]"} , /* Unknown AudigyLS that also says SB0310 on it */ { 0x10061102, "Live! 7.1 24bit [SB0410]"} , /* New Sound Blaster Live! 7.1 24bit. This does not have an AC97. 53SB041000001 */ { 0x10071102, "Live! 7.1 24bit [SB0413]"} , /* New Dell Sound Blaster Live! 7.1 24bit. This does not have an AC97. */ { 0x10091462, "MSI K8N Diamond MB [SB0438]"}, /* MSI K8N Diamond Motherboard with onboard SB Live 24bit without AC97 */ { 0, "AudigyLS [Unknown]" } static ca0106_details_t ca0106_chip_details[] = { /* AudigyLS[SB0310] */ { .serial = 0x10021102, .name = "AudigyLS [SB0310]", .ac97 = 1 } , /* Unknown AudigyLS that also says SB0310 on it */ { .serial = 0x10051102, .name = "AudigyLS [SB0310b]", .ac97 = 1 } , /* New Sound Blaster Live! 7.1 24bit. This does not have an AC97. 53SB041000001 */ { .serial = 0x10061102, .name = "Live! 7.1 24bit [SB0410]", .gpio_type = 1 } , /* New Dell Sound Blaster Live! 7.1 24bit. This does not have an AC97. */ { .serial = 0x10071102, .name = "Live! 7.1 24bit [SB0413]", .gpio_type = 1 } , /* MSI K8N Diamond Motherboard with onboard SB Live 24bit without AC97 */ { .serial = 0x10091462, .name = "MSI K8N Diamond MB [SB0438]", .gpio_type = 1 } , { .serial = 0, .name = "AudigyLS [Unknown]" } }; /* hardware definition */ Loading Loading @@ -994,6 +1005,7 @@ static int __devinit snd_ca0106_create(snd_card_t *card, ca0106_t **rchip) { ca0106_t *chip; ca0106_details_t *c; int err; int ch; static snd_device_ops_t ops = { Loading Loading @@ -1055,6 +1067,15 @@ static int __devinit snd_ca0106_create(snd_card_t *card, printk(KERN_INFO "Model %04x Rev %08x Serial %08x\n", chip->model, chip->revision, chip->serial); #endif strcpy(card->driver, "CA0106"); strcpy(card->shortname, "CA0106"); for (c=ca0106_chip_details; c->serial; c++) { if (c->serial == chip->serial) break; } chip->details = c; sprintf(card->longname, "%s at 0x%lx irq %i", c->name, chip->port, chip->irq); outl(0, chip->port + INTE); Loading Loading @@ -1139,9 +1160,7 @@ static int __devinit snd_ca0106_create(snd_card_t *card, snd_ca0106_ptr_write(chip, CAPTURE_SOURCE, 0x0, 0x333300e4); /* Select MIC, Line in, TAD in, AUX in */ chip->capture_source = 3; /* Set CAPTURE_SOURCE */ if ((chip->serial == 0x10061102) || (chip->serial == 0x10071102) || (chip->serial == 0x10091462)) { /* The SB0410 and SB0413 use GPIO differently. */ if (chip->details->gpio_type == 1) { /* The SB0410 and SB0413 use GPIO differently. */ /* FIXME: Still need to find out what the other GPIO bits do. E.g. For digital spdif out. */ outl(0x0, chip->port+GPIO); //outl(0x00f0e000, chip->port+GPIO); /* Analog */ Loading Loading @@ -1173,7 +1192,6 @@ static int __devinit snd_ca0106_probe(struct pci_dev *pci, static int dev; snd_card_t *card; ca0106_t *chip; ca0106_names_t *c; int err; if (dev >= SNDRV_CARDS) Loading Loading @@ -1208,9 +1226,7 @@ static int __devinit snd_ca0106_probe(struct pci_dev *pci, snd_card_free(card); return err; } if ((chip->serial != 0x10061102) && (chip->serial != 0x10071102) && (chip->serial != 0x10091462) ) { /* The SB0410 and SB0413 do not have an ac97 chip. */ if (chip->details->ac97 == 1) { /* The SB0410 and SB0413 do not have an AC97 chip. */ if ((err = snd_ca0106_ac97(chip)) < 0) { snd_card_free(card); return err; Loading @@ -1223,15 +1239,6 @@ static int __devinit snd_ca0106_probe(struct pci_dev *pci, snd_ca0106_proc_init(chip); strcpy(card->driver, "CA0106"); strcpy(card->shortname, "CA0106"); for (c=ca0106_chip_names; c->serial; c++) { if (c->serial == chip->serial) break; } sprintf(card->longname, "%s at 0x%lx irq %i", c->name, chip->port, chip->irq); if ((err = snd_card_register(card)) < 0) { snd_card_free(card); return err; Loading