Merge branch 'topic/oxygen' into for-linus
authorTakashi Iwai <tiwai@suse.de>
Wed, 10 Jun 2009 05:26:39 +0000 (07:26 +0200)
committerTakashi Iwai <tiwai@suse.de>
Wed, 10 Jun 2009 05:26:39 +0000 (07:26 +0200)
* topic/oxygen:
  sound: virtuoso: add Xonar Essence ST support
  sound: virtuoso: enable HDAV S/PDIF input
  sound: virtuoso: add another DX PCI ID
  sound: oxygen: reset DMA when stream is closed

Documentation/sound/alsa/ALSA-Configuration.txt
sound/pci/Kconfig
sound/pci/oxygen/oxygen_pcm.c
sound/pci/oxygen/virtuoso.c

index 945de361022f864de814612e43c376eb06117138..096af12a0afa4c24f95835f0d7f85f9fff627bf8 100644 (file)
@@ -1886,7 +1886,8 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
   -------------------
 
     Module for sound cards based on the Asus AV100/AV200 chips,
-    i.e., Xonar D1, DX, D2, D2X, HDAV1.3 (Deluxe), and Essence STX.
+    i.e., Xonar D1, DX, D2, D2X, HDAV1.3 (Deluxe), Essence ST
+    (Deluxe) and Essence STX.
 
     This module supports autoprobe and multiple cards.
 
index b306bb457a41a3d3595de2739c5071444c5d861f..748f6b7d90b7715729d131e831f0299d0d8384fa 100644 (file)
@@ -787,8 +787,8 @@ config SND_VIRTUOSO
        select SND_OXYGEN_LIB
        help
          Say Y here to include support for sound cards based on the
-         Asus AV100/AV200 chips, i.e., Xonar D1, DX, D2, D2X, and
-         Essence STX.
+         Asus AV100/AV200 chips, i.e., Xonar D1, DX, D2, D2X,
+         Essence ST (Deluxe), and Essence STX.
          Support for the HDAV1.3 (Deluxe) is very experimental.
 
          To compile this driver as a module, choose M here: the module
index c262049961e15a0dd9840645f753584373dac52a..3b5ca70c9d4d2745223ac6f66102f8fd78e11161 100644 (file)
@@ -487,10 +487,14 @@ static int oxygen_hw_free(struct snd_pcm_substream *substream)
 {
        struct oxygen *chip = snd_pcm_substream_chip(substream);
        unsigned int channel = oxygen_substream_channel(substream);
+       unsigned int channel_mask = 1 << channel;
 
        spin_lock_irq(&chip->reg_lock);
-       chip->interrupt_mask &= ~(1 << channel);
+       chip->interrupt_mask &= ~channel_mask;
        oxygen_write16(chip, OXYGEN_INTERRUPT_MASK, chip->interrupt_mask);
+
+       oxygen_set_bits8(chip, OXYGEN_DMA_FLUSH, channel_mask);
+       oxygen_clear_bits8(chip, OXYGEN_DMA_FLUSH, channel_mask);
        spin_unlock_irq(&chip->reg_lock);
 
        return snd_pcm_lib_free_pages(substream);
index bc5ce11c8b1444fa632b81ba2684ac4f0410bd08..bf971f7cfdc652984d4824576306e96aaa88b4d6 100644 (file)
  */
 
 /*
- * Xonar Essence STX
- * -----------------
+ * Xonar Essence ST (Deluxe)/STX
+ * -----------------------------
  *
  * CMI8788:
  *
@@ -180,6 +180,8 @@ enum {
        MODEL_DX,
        MODEL_HDAV,     /* without daughterboard */
        MODEL_HDAV_H6,  /* with H6 daughterboard */
+       MODEL_ST,
+       MODEL_ST_H6,
        MODEL_STX,
 };
 
@@ -188,8 +190,10 @@ static struct pci_device_id xonar_ids[] __devinitdata = {
        { OXYGEN_PCI_SUBID(0x1043, 0x8275), .driver_data = MODEL_DX },
        { OXYGEN_PCI_SUBID(0x1043, 0x82b7), .driver_data = MODEL_D2X },
        { OXYGEN_PCI_SUBID(0x1043, 0x8314), .driver_data = MODEL_HDAV },
+       { OXYGEN_PCI_SUBID(0x1043, 0x8327), .driver_data = MODEL_DX },
        { OXYGEN_PCI_SUBID(0x1043, 0x834f), .driver_data = MODEL_D1 },
        { OXYGEN_PCI_SUBID(0x1043, 0x835c), .driver_data = MODEL_STX },
+       { OXYGEN_PCI_SUBID(0x1043, 0x835d), .driver_data = MODEL_ST },
        { OXYGEN_PCI_SUBID_BROKEN_EEPROM },
        { }
 };
@@ -210,9 +214,9 @@ MODULE_DEVICE_TABLE(pci, xonar_ids);
 #define GPIO_DX_FRONT_PANEL    0x0002
 #define GPIO_DX_INPUT_ROUTE    0x0100
 
-#define GPIO_HDAV_DB_MASK      0x0030
-#define GPIO_HDAV_DB_H6                0x0000
-#define GPIO_HDAV_DB_XX                0x0020
+#define GPIO_DB_MASK           0x0030
+#define GPIO_DB_H6             0x0000
+#define GPIO_DB_XX             0x0020
 
 #define GPIO_ST_HP_REAR                0x0002
 #define GPIO_ST_HP             0x0080
@@ -530,7 +534,7 @@ static void xonar_hdav_init(struct oxygen *chip)
        snd_component_add(chip->card, "CS5381");
 }
 
-static void xonar_stx_init(struct oxygen *chip)
+static void xonar_st_init(struct oxygen *chip)
 {
        struct xonar_data *data = chip->model_data;
 
@@ -539,12 +543,11 @@ static void xonar_stx_init(struct oxygen *chip)
                       OXYGEN_2WIRE_INTERRUPT_MASK |
                       OXYGEN_2WIRE_SPEED_FAST);
 
+       if (chip->model.private_data == MODEL_ST_H6)
+               chip->model.dac_channels = 8;
        data->anti_pop_delay = 100;
-       data->dacs = 1;
+       data->dacs = chip->model.private_data == MODEL_ST_H6 ? 4 : 1;
        data->output_enable_bit = GPIO_DX_OUTPUT_ENABLE;
-       data->ext_power_reg = OXYGEN_GPI_DATA;
-       data->ext_power_int_reg = OXYGEN_GPI_INTERRUPT_MASK;
-       data->ext_power_bit = GPI_DX_EXT_POWER;
        data->pcm1796_oversampling = PCM1796_OS_64;
 
        pcm1796_init(chip);
@@ -560,6 +563,17 @@ static void xonar_stx_init(struct oxygen *chip)
        snd_component_add(chip->card, "CS5381");
 }
 
+static void xonar_stx_init(struct oxygen *chip)
+{
+       struct xonar_data *data = chip->model_data;
+
+       data->ext_power_reg = OXYGEN_GPI_DATA;
+       data->ext_power_int_reg = OXYGEN_GPI_INTERRUPT_MASK;
+       data->ext_power_bit = GPI_DX_EXT_POWER;
+
+       xonar_st_init(chip);
+}
+
 static void xonar_disable_output(struct oxygen *chip)
 {
        struct xonar_data *data = chip->model_data;
@@ -1021,7 +1035,8 @@ static const struct oxygen_model model_xonar_hdav = {
        .model_data_size = sizeof(struct xonar_data),
        .device_config = PLAYBACK_0_TO_I2S |
                         PLAYBACK_1_TO_SPDIF |
-                        CAPTURE_0_FROM_I2S_2,
+                        CAPTURE_0_FROM_I2S_2 |
+                        CAPTURE_1_FROM_SPDIF,
        .dac_channels = 8,
        .dac_volume_min = 255 - 2*60,
        .dac_volume_max = 255,
@@ -1034,7 +1049,7 @@ static const struct oxygen_model model_xonar_hdav = {
 static const struct oxygen_model model_xonar_st = {
        .longname = "Asus Virtuoso 100",
        .chip = "AV200",
-       .init = xonar_stx_init,
+       .init = xonar_st_init,
        .control_filter = xonar_st_control_filter,
        .mixer_init = xonar_st_mixer_init,
        .cleanup = xonar_st_cleanup,
@@ -1067,6 +1082,7 @@ static int __devinit get_xonar_model(struct oxygen *chip,
                [MODEL_D2]      = &model_xonar_d2,
                [MODEL_D2X]     = &model_xonar_d2,
                [MODEL_HDAV]    = &model_xonar_hdav,
+               [MODEL_ST]      = &model_xonar_st,
                [MODEL_STX]     = &model_xonar_st,
        };
        static const char *const names[] = {
@@ -1076,6 +1092,8 @@ static int __devinit get_xonar_model(struct oxygen *chip,
                [MODEL_D2X]     = "Xonar D2X",
                [MODEL_HDAV]    = "Xonar HDAV1.3",
                [MODEL_HDAV_H6] = "Xonar HDAV1.3+H6",
+               [MODEL_ST]      = "Xonar Essence ST",
+               [MODEL_ST_H6]   = "Xonar Essence ST+H6",
                [MODEL_STX]     = "Xonar Essence STX",
        };
        unsigned int model = id->driver_data;
@@ -1092,21 +1110,27 @@ static int __devinit get_xonar_model(struct oxygen *chip,
                chip->model.init = xonar_dx_init;
                break;
        case MODEL_HDAV:
-               oxygen_clear_bits16(chip, OXYGEN_GPIO_CONTROL,
-                                   GPIO_HDAV_DB_MASK);
-               switch (oxygen_read16(chip, OXYGEN_GPIO_DATA) &
-                       GPIO_HDAV_DB_MASK) {
-               case GPIO_HDAV_DB_H6:
+               oxygen_clear_bits16(chip, OXYGEN_GPIO_CONTROL, GPIO_DB_MASK);
+               switch (oxygen_read16(chip, OXYGEN_GPIO_DATA) & GPIO_DB_MASK) {
+               case GPIO_DB_H6:
                        model = MODEL_HDAV_H6;
                        break;
-               case GPIO_HDAV_DB_XX:
+               case GPIO_DB_XX:
                        snd_printk(KERN_ERR "unknown daughterboard\n");
                        return -ENODEV;
                }
                break;
+       case MODEL_ST:
+               oxygen_clear_bits16(chip, OXYGEN_GPIO_CONTROL, GPIO_DB_MASK);
+               switch (oxygen_read16(chip, OXYGEN_GPIO_DATA) & GPIO_DB_MASK) {
+               case GPIO_DB_H6:
+                       model = MODEL_ST_H6;
+                       break;
+               }
+               break;
        case MODEL_STX:
-               oxygen_clear_bits16(chip, OXYGEN_GPIO_CONTROL,
-                                   GPIO_HDAV_DB_MASK);
+               chip->model.init = xonar_stx_init;
+               oxygen_clear_bits16(chip, OXYGEN_GPIO_CONTROL, GPIO_DB_MASK);
                break;
        }