linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / sound / pci / ca0106 / ca0106_main.c
index 12bbbb6..9477838 100644 (file)
@@ -186,8 +186,8 @@ static struct snd_ca0106_details ca0106_chip_details[] = {
         /* New Audigy SE. Has a different DAC. */
         /* SB0570:
          * CTRL:CA0106-DAT
-         * ADC: WM8775EDS
-         * DAC: WM8768GEDS
+         * ADC: WM8768GEDS
+         * DAC: WM8775EDS
          */
         { .serial = 0x100a1102,
           .name   = "Audigy SE [SB0570]",
@@ -195,14 +195,9 @@ static struct snd_ca0106_details ca0106_chip_details[] = {
           .i2c_adc = 1,
           .spi_dac = 1 } ,
         /* MSI K8N Diamond Motherboard with onboard SB Live 24bit without AC97 */
-        /* SB0438
-         * CTRL:CA0106-DAT
-         * ADC: WM8775SEDS
-         * DAC: CS4382-KQZ
-         */
         { .serial = 0x10091462,
           .name   = "MSI K8N Diamond MB [SB0438]",
-          .gpio_type = 2,
+          .gpio_type = 1,
           .i2c_adc = 1 } ,
         /* Shuttle XPC SD31P which has an onboard Creative Labs
          * Sound Blaster Live! 24-bit EAX
@@ -331,7 +326,6 @@ int snd_ca0106_spi_write(struct snd_ca0106 * emu,
        return 0;
 }
 
-/* The ADC does not support i2c read, so only write is implemented */
 int snd_ca0106_i2c_write(struct snd_ca0106 *emu,
                                u32 reg,
                                u32 value)
@@ -346,7 +340,6 @@ int snd_ca0106_i2c_write(struct snd_ca0106 *emu,
        }
 
        tmp = reg << 25 | value << 16;
-       // snd_printk("I2C-write:reg=0x%x, value=0x%x\n", reg, value);
        /* Not sure what this I2C channel controls. */
        /* snd_ca0106_ptr_write(emu, I2C_D0, 0, tmp); */
 
@@ -355,9 +348,8 @@ int snd_ca0106_i2c_write(struct snd_ca0106 *emu,
 
        for (retry = 0; retry < 10; retry++) {
                /* Send the data to i2c */
-               //tmp = snd_ca0106_ptr_read(emu, I2C_A, 0);
-               //tmp = tmp & ~(I2C_A_ADC_READ|I2C_A_ADC_LAST|I2C_A_ADC_START|I2C_A_ADC_ADD_MASK);
-               tmp = 0;
+               tmp = snd_ca0106_ptr_read(emu, I2C_A, 0);
+               tmp = tmp & ~(I2C_A_ADC_READ|I2C_A_ADC_LAST|I2C_A_ADC_START|I2C_A_ADC_ADD_MASK);
                tmp = tmp | (I2C_A_ADC_LAST|I2C_A_ADC_START|I2C_A_ADC_ADD);
                snd_ca0106_ptr_write(emu, I2C_A, 0, tmp);
 
@@ -1189,7 +1181,7 @@ static unsigned int spi_dac_init[] = {
        0x02ff,
        0x0400,
        0x0520,
-       0x0620, /* Set 24 bit. Was 0x0600 */
+       0x0600,
        0x08ff,
        0x0aff,
        0x0cff,
@@ -1208,22 +1200,6 @@ static unsigned int spi_dac_init[] = {
        0x1400,
 };
 
-static unsigned int i2c_adc_init[][2] = {
-       { 0x17, 0x00 }, /* Reset */
-       { 0x07, 0x00 }, /* Timeout */
-       { 0x0b, 0x22 },  /* Interface control */
-       { 0x0c, 0x22 },  /* Master mode control */
-       { 0x0d, 0x08 },  /* Powerdown control */
-       { 0x0e, 0xcf },  /* Attenuation Left  0x01 = -103dB, 0xff = 24dB */
-       { 0x0f, 0xcf },  /* Attenuation Right 0.5dB steps */
-       { 0x10, 0x7b },  /* ALC Control 1 */
-       { 0x11, 0x00 },  /* ALC Control 2 */
-       { 0x12, 0x32 },  /* ALC Control 3 */
-       { 0x13, 0x00 },  /* Noise gate control */
-       { 0x14, 0xa6 },  /* Limiter control */
-       { 0x15, ADC_MUX_LINEIN },  /* ADC Mixer control */
-};
-
 static int __devinit snd_ca0106_create(struct snd_card *card,
                                         struct pci_dev *pci,
                                         struct snd_ca0106 **rchip)
@@ -1268,7 +1244,7 @@ static int __devinit snd_ca0106_create(struct snd_card *card,
        }
 
        if (request_irq(pci->irq, snd_ca0106_interrupt,
-                       IRQF_DISABLED|IRQF_SHARED, "snd_ca0106",
+                       SA_INTERRUPT|SA_SHIRQ, "snd_ca0106",
                        (void *)chip)) {
                snd_ca0106_free(chip);
                printk(KERN_ERR "cannot grab irq\n");
@@ -1385,12 +1361,7 @@ static int __devinit snd_ca0106_create(struct snd_card *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->details->gpio_type == 2) { /* The SB0438 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 */
-               outl(0x005f5301, chip->port+GPIO); /* Analog */
-       } else if (chip->details->gpio_type == 1) { /* 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 */
@@ -1408,19 +1379,7 @@ static int __devinit snd_ca0106_create(struct snd_card *card,
        outl(HCFG_AC97 | HCFG_AUDIOENABLE, chip->port+HCFG); /* AC97 2.0, Enable outputs. */
 
         if (chip->details->i2c_adc == 1) { /* The SB0410 and SB0413 use I2C to control ADC. */
-               int size, n;
-
-               size = ARRAY_SIZE(i2c_adc_init);
-                //snd_printk("I2C:array size=0x%x\n", size);
-               for (n=0; n < size; n++) {
-                       snd_ca0106_i2c_write(chip, i2c_adc_init[n][0], i2c_adc_init[n][1]);
-               }
-               for (n=0; n < 4; n++) {
-                       chip->i2c_capture_volume[n][0]= 0xcf;
-                       chip->i2c_capture_volume[n][1]= 0xcf;
-               }
-               chip->i2c_capture_source=2; /* Line in */
-               //snd_ca0106_i2c_write(chip, ADC_MUX, ADC_MUX_LINEIN); /* Enable Line-in capture. MIC in currently untested. */
+               snd_ca0106_i2c_write(chip, ADC_MUX, ADC_MUX_LINEIN); /* Enable Line-in capture. MIC in currently untested. */
        }
         if (chip->details->spi_dac == 1) { /* The SB0570 use SPI to control DAC. */
                int size, n;