ALSA: ca0106: Allow different sound cards to use different SPI channel mappings.
authorAndy Owen <andy-alsa@ultra-premium.com>
Sat, 23 Oct 2010 11:12:32 +0000 (22:12 +1100)
committerTakashi Iwai <tiwai@suse.de>
Sat, 23 Oct 2010 14:59:40 +0000 (16:59 +0200)
Signed-off-by: Andy Owen <andy-alsa@ultra-premium.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/ca0106/ca0106.h
sound/pci/ca0106/ca0106_main.c
sound/pci/ca0106/ca0106_mixer.c

index 14b8d9a91aae27655439e487aed6aed853b9e426..f19c11077255ddfe5f7d30dbb2543740717c6b43 100644 (file)
@@ -670,8 +670,9 @@ struct snd_ca0106_details {
                           gpio_type = 2 -> shared side-out/line-in. */
        int i2c_adc;    /* with i2c_adc=1, the driver adds some capture volume
                           controls, phone, mic, line-in and aux. */
-       int spi_dac;    /* spi_dac=1 adds the mute switch for each analog
-                          output, front, rear, etc. */
+       u16 spi_dac;    /* spi_dac = 0 -> no spi interface for DACs
+                          spi_dac = 0x<front><rear><center-lfe><side>
+                          -> specifies DAC id for each channel pair. */
 };
 
 // definition of the chip-specific record
index da910031edfa1dfbc4edbc76996c3117bf530ff4..d2d12c08f93759bb069f580ece58e1043c00e2af 100644 (file)
@@ -227,7 +227,7 @@ static struct snd_ca0106_details ca0106_chip_details[] = {
           .name   = "Audigy SE [SB0570]",
           .gpio_type = 1,
           .i2c_adc = 1,
-          .spi_dac = 1 } ,
+          .spi_dac = 0x4021 } ,
         /* New Audigy LS. Has a different DAC. */
         /* SB0570:
          * CTRL:CA0106-DAT
@@ -238,7 +238,7 @@ static struct snd_ca0106_details ca0106_chip_details[] = {
           .name   = "Audigy SE OEM [SB0570a]",
           .gpio_type = 1,
           .i2c_adc = 1,
-          .spi_dac = 1 } ,
+          .spi_dac = 0x4021 } ,
        /* Sound Blaster 5.1vx
         * Tested: Playback on front, rear, center/lfe speakers
         * Not-Tested: Capture
@@ -247,7 +247,7 @@ static struct snd_ca0106_details ca0106_chip_details[] = {
          .name   = "Sound Blaster 5.1vx [SB1070]",
          .gpio_type = 1,
          .i2c_adc = 0,
-         .spi_dac = 1
+         .spi_dac = 0x0124
         } ,
         /* MSI K8N Diamond Motherboard with onboard SB Live 24bit without AC97 */
         /* SB0438
@@ -264,7 +264,7 @@ static struct snd_ca0106_details ca0106_chip_details[] = {
           .name   = "MSI K8N Diamond MB",
           .gpio_type = 2,
           .i2c_adc = 1,
-          .spi_dac = 1 } ,
+          .spi_dac = 0x4021 } ,
        /* Giga-byte GA-G1975X mobo
         * Novell bnc#395807
         */
@@ -520,12 +520,18 @@ static int snd_ca0106_channel_dac(struct snd_ca0106_details *details,
                                  int channel_id)
 {
        switch (channel_id) {
-       case PCM_FRONT_CHANNEL:         return 4;
-       case PCM_REAR_CHANNEL:          return 0;
-       case PCM_CENTER_LFE_CHANNEL:    return 2;
-       case PCM_UNKNOWN_CHANNEL:       return 1;
+       case PCM_FRONT_CHANNEL:
+               return (details->spi_dac & 0xf000) >> (4 * 3);
+       case PCM_REAR_CHANNEL:
+               return (details->spi_dac & 0x0f00) >> (4 * 2);
+       case PCM_CENTER_LFE_CHANNEL:
+               return (details->spi_dac & 0x00f0) >> (4 * 1);
+       case PCM_UNKNOWN_CHANNEL:
+               return (details->spi_dac & 0x000f) >> (4 * 0);
+       default:
+               snd_printk(KERN_DEBUG "ca0106: unknown channel_id %d\n",
+                          channel_id);
        }
-       snd_printk(KERN_DEBUG "ca0106: unknown channel_id %d\n", channel_id);
        return 0;
 }
 
@@ -1582,7 +1588,7 @@ static void ca0106_init_chip(struct snd_ca0106 *chip, int resume)
                /* snd_ca0106_i2c_write(chip, ADC_MUX, ADC_MUX_LINEIN); */
        }
 
-       if (chip->details->spi_dac == 1) {
+       if (chip->details->spi_dac) {
                /* The SB0570 use SPI to control DAC. */
                int size, n;
 
index 85fd315d99990d6cba86001840d5cd7389975e2a..b522401b03186f251e266bdf29dc4b6251b531a6 100644 (file)
@@ -832,7 +832,7 @@ int __devinit snd_ca0106_mixer(struct snd_ca0106 *emu)
                if (err < 0)
                        return err;
        }
-       if (emu->details->spi_dac == 1)
+       if (emu->details->spi_dac)
                ADD_CTLS(emu, snd_ca0106_volume_spi_dac_ctls);
 
        /* Create virtual master controls */
@@ -845,7 +845,7 @@ int __devinit snd_ca0106_mixer(struct snd_ca0106 *emu)
                return err;
        add_slaves(card, vmaster, slave_vols);
 
-       if (emu->details->spi_dac == 1) {
+       if (emu->details->spi_dac) {
                vmaster = snd_ctl_make_virtual_master("Master Playback Switch",
                                                      NULL);
                if (!vmaster)