aboutsummaryrefslogtreecommitdiffstats
path: root/sound/pci/oxygen/virtuoso.c
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/oxygen/virtuoso.c
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/oxygen/virtuoso.c')
-rw-r--r--sound/pci/oxygen/virtuoso.c60
1 files changed, 41 insertions, 19 deletions
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