aboutsummaryrefslogtreecommitdiffstats
path: root/sound/pci
diff options
context:
space:
mode:
authorClemens Ladisch <clemens@ladisch.de>2009-05-25 04:11:29 -0400
committerTakashi Iwai <tiwai@suse.de>2009-05-25 05:49:58 -0400
commit04f9890df1bad2115665b7027e664aaffa44088d (patch)
treebb975609dc95a9bda883a6fd38e3b24c1c8bf7db /sound/pci
parentb990ae963a3f80a659b30562c1e3214b386ecce3 (diff)
sound: virtuoso: add Xonar Essence ST support
Add support for the Asus Xonar Essence ST and its daughterboard. Signed-off-by: Clemens Ladisch <clemens@ladisch.de> Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/pci')
-rw-r--r--sound/pci/Kconfig4
-rw-r--r--sound/pci/oxygen/virtuoso.c60
2 files changed, 43 insertions, 21 deletions
diff --git a/sound/pci/Kconfig b/sound/pci/Kconfig
index 93422e3a3f0c..699c280bbd67 100644
--- a/sound/pci/Kconfig
+++ b/sound/pci/Kconfig
@@ -764,8 +764,8 @@ config SND_VIRTUOSO
764 select SND_OXYGEN_LIB 764 select SND_OXYGEN_LIB
765 help 765 help
766 Say Y here to include support for sound cards based on the 766 Say Y here to include support for sound cards based on the
767 Asus AV100/AV200 chips, i.e., Xonar D1, DX, D2, D2X, and 767 Asus AV100/AV200 chips, i.e., Xonar D1, DX, D2, D2X,
768 Essence STX. 768 Essence ST (Deluxe), and Essence STX.
769 Support for the HDAV1.3 (Deluxe) is very experimental. 769 Support for the HDAV1.3 (Deluxe) is very experimental.
770 770
771 To compile this driver as a module, choose M here: the module 771 To compile this driver as a module, choose M here: the module
diff --git a/sound/pci/oxygen/virtuoso.c b/sound/pci/oxygen/virtuoso.c
index 71e38f48c672..bf971f7cfdc6 100644
--- a/sound/pci/oxygen/virtuoso.c
+++ b/sound/pci/oxygen/virtuoso.c
@@ -113,8 +113,8 @@
113 */ 113 */
114 114
115/* 115/*
116 * Xonar Essence STX 116 * Xonar Essence ST (Deluxe)/STX
117 * ----------------- 117 * -----------------------------
118 * 118 *
119 * CMI8788: 119 * CMI8788:
120 * 120 *
@@ -180,6 +180,8 @@ enum {
180 MODEL_DX, 180 MODEL_DX,
181 MODEL_HDAV, /* without daughterboard */ 181 MODEL_HDAV, /* without daughterboard */
182 MODEL_HDAV_H6, /* with H6 daughterboard */ 182 MODEL_HDAV_H6, /* with H6 daughterboard */
183 MODEL_ST,
184 MODEL_ST_H6,
183 MODEL_STX, 185 MODEL_STX,
184}; 186};
185 187
@@ -191,6 +193,7 @@ static struct pci_device_id xonar_ids[] __devinitdata = {
191 { OXYGEN_PCI_SUBID(0x1043, 0x8327), .driver_data = MODEL_DX }, 193 { OXYGEN_PCI_SUBID(0x1043, 0x8327), .driver_data = MODEL_DX },
192 { OXYGEN_PCI_SUBID(0x1043, 0x834f), .driver_data = MODEL_D1 }, 194 { OXYGEN_PCI_SUBID(0x1043, 0x834f), .driver_data = MODEL_D1 },
193 { OXYGEN_PCI_SUBID(0x1043, 0x835c), .driver_data = MODEL_STX }, 195 { OXYGEN_PCI_SUBID(0x1043, 0x835c), .driver_data = MODEL_STX },
196 { OXYGEN_PCI_SUBID(0x1043, 0x835d), .driver_data = MODEL_ST },
194 { OXYGEN_PCI_SUBID_BROKEN_EEPROM }, 197 { OXYGEN_PCI_SUBID_BROKEN_EEPROM },
195 { } 198 { }
196}; 199};
@@ -211,9 +214,9 @@ MODULE_DEVICE_TABLE(pci, xonar_ids);
211#define GPIO_DX_FRONT_PANEL 0x0002 214#define GPIO_DX_FRONT_PANEL 0x0002
212#define GPIO_DX_INPUT_ROUTE 0x0100 215#define GPIO_DX_INPUT_ROUTE 0x0100
213 216
214#define GPIO_HDAV_DB_MASK 0x0030 217#define GPIO_DB_MASK 0x0030
215#define GPIO_HDAV_DB_H6 0x0000 218#define GPIO_DB_H6 0x0000
216#define GPIO_HDAV_DB_XX 0x0020 219#define GPIO_DB_XX 0x0020
217 220
218#define GPIO_ST_HP_REAR 0x0002 221#define GPIO_ST_HP_REAR 0x0002
219#define GPIO_ST_HP 0x0080 222#define GPIO_ST_HP 0x0080
@@ -531,7 +534,7 @@ static void xonar_hdav_init(struct oxygen *chip)
531 snd_component_add(chip->card, "CS5381"); 534 snd_component_add(chip->card, "CS5381");
532} 535}
533 536
534static void xonar_stx_init(struct oxygen *chip) 537static void xonar_st_init(struct oxygen *chip)
535{ 538{
536 struct xonar_data *data = chip->model_data; 539 struct xonar_data *data = chip->model_data;
537 540
@@ -540,12 +543,11 @@ static void xonar_stx_init(struct oxygen *chip)
540 OXYGEN_2WIRE_INTERRUPT_MASK | 543 OXYGEN_2WIRE_INTERRUPT_MASK |
541 OXYGEN_2WIRE_SPEED_FAST); 544 OXYGEN_2WIRE_SPEED_FAST);
542 545
546 if (chip->model.private_data == MODEL_ST_H6)
547 chip->model.dac_channels = 8;
543 data->anti_pop_delay = 100; 548 data->anti_pop_delay = 100;
544 data->dacs = 1; 549 data->dacs = chip->model.private_data == MODEL_ST_H6 ? 4 : 1;
545 data->output_enable_bit = GPIO_DX_OUTPUT_ENABLE; 550 data->output_enable_bit = GPIO_DX_OUTPUT_ENABLE;
546 data->ext_power_reg = OXYGEN_GPI_DATA;
547 data->ext_power_int_reg = OXYGEN_GPI_INTERRUPT_MASK;
548 data->ext_power_bit = GPI_DX_EXT_POWER;
549 data->pcm1796_oversampling = PCM1796_OS_64; 551 data->pcm1796_oversampling = PCM1796_OS_64;
550 552
551 pcm1796_init(chip); 553 pcm1796_init(chip);
@@ -561,6 +563,17 @@ static void xonar_stx_init(struct oxygen *chip)
561 snd_component_add(chip->card, "CS5381"); 563 snd_component_add(chip->card, "CS5381");
562} 564}
563 565
566static void xonar_stx_init(struct oxygen *chip)
567{
568 struct xonar_data *data = chip->model_data;
569
570 data->ext_power_reg = OXYGEN_GPI_DATA;
571 data->ext_power_int_reg = OXYGEN_GPI_INTERRUPT_MASK;
572 data->ext_power_bit = GPI_DX_EXT_POWER;
573
574 xonar_st_init(chip);
575}
576
564static void xonar_disable_output(struct oxygen *chip) 577static void xonar_disable_output(struct oxygen *chip)
565{ 578{
566 struct xonar_data *data = chip->model_data; 579 struct xonar_data *data = chip->model_data;
@@ -1036,7 +1049,7 @@ static const struct oxygen_model model_xonar_hdav = {
1036static const struct oxygen_model model_xonar_st = { 1049static const struct oxygen_model model_xonar_st = {
1037 .longname = "Asus Virtuoso 100", 1050 .longname = "Asus Virtuoso 100",
1038 .chip = "AV200", 1051 .chip = "AV200",
1039 .init = xonar_stx_init, 1052 .init = xonar_st_init,
1040 .control_filter = xonar_st_control_filter, 1053 .control_filter = xonar_st_control_filter,
1041 .mixer_init = xonar_st_mixer_init, 1054 .mixer_init = xonar_st_mixer_init,
1042 .cleanup = xonar_st_cleanup, 1055 .cleanup = xonar_st_cleanup,
@@ -1069,6 +1082,7 @@ static int __devinit get_xonar_model(struct oxygen *chip,
1069 [MODEL_D2] = &model_xonar_d2, 1082 [MODEL_D2] = &model_xonar_d2,
1070 [MODEL_D2X] = &model_xonar_d2, 1083 [MODEL_D2X] = &model_xonar_d2,
1071 [MODEL_HDAV] = &model_xonar_hdav, 1084 [MODEL_HDAV] = &model_xonar_hdav,
1085 [MODEL_ST] = &model_xonar_st,
1072 [MODEL_STX] = &model_xonar_st, 1086 [MODEL_STX] = &model_xonar_st,
1073 }; 1087 };
1074 static const char *const names[] = { 1088 static const char *const names[] = {
@@ -1078,6 +1092,8 @@ static int __devinit get_xonar_model(struct oxygen *chip,
1078 [MODEL_D2X] = "Xonar D2X", 1092 [MODEL_D2X] = "Xonar D2X",
1079 [MODEL_HDAV] = "Xonar HDAV1.3", 1093 [MODEL_HDAV] = "Xonar HDAV1.3",
1080 [MODEL_HDAV_H6] = "Xonar HDAV1.3+H6", 1094 [MODEL_HDAV_H6] = "Xonar HDAV1.3+H6",
1095 [MODEL_ST] = "Xonar Essence ST",
1096 [MODEL_ST_H6] = "Xonar Essence ST+H6",
1081 [MODEL_STX] = "Xonar Essence STX", 1097 [MODEL_STX] = "Xonar Essence STX",
1082 }; 1098 };
1083 unsigned int model = id->driver_data; 1099 unsigned int model = id->driver_data;
@@ -1094,21 +1110,27 @@ static int __devinit get_xonar_model(struct oxygen *chip,
1094 chip->model.init = xonar_dx_init; 1110 chip->model.init = xonar_dx_init;
1095 break; 1111 break;
1096 case MODEL_HDAV: 1112 case MODEL_HDAV:
1097 oxygen_clear_bits16(chip, OXYGEN_GPIO_CONTROL, 1113 oxygen_clear_bits16(chip, OXYGEN_GPIO_CONTROL, GPIO_DB_MASK);
1098 GPIO_HDAV_DB_MASK); 1114 switch (oxygen_read16(chip, OXYGEN_GPIO_DATA) & GPIO_DB_MASK) {
1099 switch (oxygen_read16(chip, OXYGEN_GPIO_DATA) & 1115 case GPIO_DB_H6:
1100 GPIO_HDAV_DB_MASK) {
1101 case GPIO_HDAV_DB_H6:
1102 model = MODEL_HDAV_H6; 1116 model = MODEL_HDAV_H6;
1103 break; 1117 break;
1104 case GPIO_HDAV_DB_XX: 1118 case GPIO_DB_XX:
1105 snd_printk(KERN_ERR "unknown daughterboard\n"); 1119 snd_printk(KERN_ERR "unknown daughterboard\n");
1106 return -ENODEV; 1120 return -ENODEV;
1107 } 1121 }
1108 break; 1122 break;
1123 case MODEL_ST:
1124 oxygen_clear_bits16(chip, OXYGEN_GPIO_CONTROL, GPIO_DB_MASK);
1125 switch (oxygen_read16(chip, OXYGEN_GPIO_DATA) & GPIO_DB_MASK) {
1126 case GPIO_DB_H6:
1127 model = MODEL_ST_H6;
1128 break;
1129 }
1130 break;
1109 case MODEL_STX: 1131 case MODEL_STX:
1110 oxygen_clear_bits16(chip, OXYGEN_GPIO_CONTROL, 1132 chip->model.init = xonar_stx_init;
1111 GPIO_HDAV_DB_MASK); 1133 oxygen_clear_bits16(chip, OXYGEN_GPIO_CONTROL, GPIO_DB_MASK);
1112 break; 1134 break;
1113 } 1135 }
1114 1136