[ALSA] snd-ca0106: Add new card variant.
authorJames Courtier-Dutton <James@superbug.co.uk>
Sat, 25 Nov 2006 19:42:29 +0000 (19:42 +0000)
committerJaroslav Kysela <perex@server.perex.cz>
Wed, 20 Dec 2006 07:56:08 +0000 (08:56 +0100)
Fixed ALSA bug#2326

Signed-off-by: James Courtier-Dutton <James@superbug.co.uk>
Signed-off-by: Jaroslav Kysela <perex@suse.cz>
sound/pci/ca0106/ca0106_main.c

index 35ac187cab6699e703fd480f719d54e04dec8166..881c4ca7b56d5e8974c1d3e79f943cb392fac4e7 100644 (file)
@@ -154,6 +154,7 @@ MODULE_SUPPORTED_DEVICE("{{Creative,SB CA0106 chip}}");
 static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;
 static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;
 static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;
+static uint subsystem[SNDRV_CARDS]; /* Force card subsystem model */
 
 module_param_array(index, int, NULL, 0444);
 MODULE_PARM_DESC(index, "Index value for the CA0106 soundcard.");
@@ -161,6 +162,8 @@ module_param_array(id, charp, NULL, 0444);
 MODULE_PARM_DESC(id, "ID string for the CA0106 soundcard.");
 module_param_array(enable, bool, NULL, 0444);
 MODULE_PARM_DESC(enable, "Enable the CA0106 soundcard.");
+module_param_array(subsystem, uint, NULL, 0444);
+MODULE_PARM_DESC(subsystem, "Force card subsystem model.");
 
 #include "ca0106.h"
 
@@ -194,6 +197,17 @@ static struct snd_ca0106_details ca0106_chip_details[] = {
           .gpio_type = 1,
           .i2c_adc = 1,
           .spi_dac = 1 } ,
+        /* New Audigy LS. Has a different DAC. */
+        /* SB0570:
+         * CTRL:CA0106-DAT
+         * ADC: WM8775EDS
+         * DAC: WM8768GEDS
+         */
+        { .serial = 0x10111102,
+          .name   = "Audigy LS [SB0570a]",
+          .gpio_type = 1,
+          .i2c_adc = 1,
+          .spi_dac = 1 } ,
         /* MSI K8N Diamond Motherboard with onboard SB Live 24bit without AC97 */
         /* SB0438
          * CTRL:CA0106-DAT
@@ -1223,7 +1237,7 @@ static unsigned int i2c_adc_init[][2] = {
        { 0x15, ADC_MUX_LINEIN },  /* ADC Mixer control */
 };
 
-static int __devinit snd_ca0106_create(struct snd_card *card,
+static int __devinit snd_ca0106_create(int dev, struct snd_card *card,
                                         struct pci_dev *pci,
                                         struct snd_ca0106 **rchip)
 {
@@ -1286,17 +1300,25 @@ static int __devinit snd_ca0106_create(struct snd_card *card,
        pci_read_config_dword(pci, PCI_SUBSYSTEM_VENDOR_ID, &chip->serial);
        pci_read_config_word(pci, PCI_SUBSYSTEM_ID, &chip->model);
 #if 1
-       printk(KERN_INFO "Model %04x Rev %08x Serial %08x\n", chip->model,
+       printk(KERN_INFO "snd-ca0106: 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)
+               if (subsystem[dev]) {
+                       if (c->serial == subsystem[dev])
+                               break;
+               } else if (c->serial == chip->serial)
                        break;
        }
        chip->details = c;
+       if (subsystem[dev]) {
+               printk(KERN_INFO "snd-ca0106: Sound card name=%s, subsystem=0x%x. Forced to subsytem=0x%x\n",
+                        c->name, chip->serial, subsystem[dev]);
+       }
+
        sprintf(card->longname, "%s at 0x%lx irq %i",
                c->name, chip->port, chip->irq);
 
@@ -1539,7 +1561,7 @@ static int __devinit snd_ca0106_probe(struct pci_dev *pci,
        if (card == NULL)
                return -ENOMEM;
 
-       if ((err = snd_ca0106_create(card, pci, &chip)) < 0) {
+       if ((err = snd_ca0106_create(dev, card, pci, &chip)) < 0) {
                snd_card_free(card);
                return err;
        }