aboutsummaryrefslogtreecommitdiffstats
path: root/sound/pci/oxygen/virtuoso.c
diff options
context:
space:
mode:
authorClemens Ladisch <clemens@ladisch.de>2008-04-09 03:16:14 -0400
committerTakashi Iwai <tiwai@suse.de>2008-04-24 06:00:32 -0400
commit11864b4b84194b459fc20e0ec47906885bddb12e (patch)
treecd50f762af2aa05c25657ee7d5486a2b67d66a52 /sound/pci/oxygen/virtuoso.c
parenta9d3cc485e65a56edc9ef78c034146cc8a5b3101 (diff)
[ALSA] virtuoso: correctly switch input jack on Xonar DX
When selecting the capture source on the Xonar DX, the input jack must be routed to either the line input or the microphone input by setting a GPIO pin. This requires an additional callback so that the model driver can hook into the toggling of AC97 switches. 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.c22
1 files changed, 18 insertions, 4 deletions
diff --git a/sound/pci/oxygen/virtuoso.c b/sound/pci/oxygen/virtuoso.c
index 1db4aa5dfad4..b678e2de4adf 100644
--- a/sound/pci/oxygen/virtuoso.c
+++ b/sound/pci/oxygen/virtuoso.c
@@ -47,10 +47,10 @@
47 * GPI 0 <- external power present 47 * GPI 0 <- external power present
48 * 48 *
49 * GPIO 0 -> enable output to speakers 49 * GPIO 0 -> enable output to speakers
50 * GPIO 1 -> ALT? 50 * GPIO 1 -> ?
51 * GPIO 2 -> M0 of CS5361 51 * GPIO 2 -> M0 of CS5361
52 * GPIO 3 -> M1 of CS5361 52 * GPIO 3 -> M1 of CS5361
53 * GPIO 8 -> line-in/mic-in/digital-out switch? 53 * GPIO 8 -> route input jack to line-in (0) or mic-in (1)
54 * 54 *
55 * CS4398: 55 * CS4398:
56 * 56 *
@@ -120,7 +120,7 @@ MODULE_DEVICE_TABLE(pci, xonar_ids);
120#define GPI_DX_EXT_POWER 0x01 120#define GPI_DX_EXT_POWER 0x01
121#define GPIO_DX_OUTPUT_ENABLE 0x0001 121#define GPIO_DX_OUTPUT_ENABLE 0x0001
122#define GPIO_DX_UNKNOWN1 0x0002 122#define GPIO_DX_UNKNOWN1 0x0002
123#define GPIO_DX_UNKNOWN2 0x0100 123#define GPIO_DX_INPUT_ROUTE 0x0100
124 124
125#define I2C_DEVICE_CS4398 0x9e /* 10011, AD1=1, AD0=1, /W=0 */ 125#define I2C_DEVICE_CS4398 0x9e /* 10011, AD1=1, AD0=1, /W=0 */
126#define I2C_DEVICE_CS4362A 0x30 /* 001100, AD0=0, /W=0 */ 126#define I2C_DEVICE_CS4362A 0x30 /* 001100, AD0=0, /W=0 */
@@ -267,7 +267,8 @@ static void xonar_dx_init(struct oxygen *chip)
267 cs4362a_write(chip, 0x01, CS4362A_CPEN); 267 cs4362a_write(chip, 0x01, CS4362A_CPEN);
268 268
269 oxygen_set_bits16(chip, OXYGEN_GPIO_CONTROL, 269 oxygen_set_bits16(chip, OXYGEN_GPIO_CONTROL,
270 GPIO_DX_UNKNOWN1 | GPIO_DX_UNKNOWN2); 270 GPIO_DX_UNKNOWN1 | GPIO_DX_INPUT_ROUTE);
271 oxygen_clear_bits16(chip, OXYGEN_GPIO_DATA, GPIO_DX_INPUT_ROUTE);
271 272
272 xonar_common_init(chip); 273 xonar_common_init(chip);
273 274
@@ -469,6 +470,18 @@ static const struct snd_kcontrol_new alt_switch = {
469 .put = alt_switch_put, 470 .put = alt_switch_put,
470}; 471};
471 472
473static void xonar_dx_ac97_switch(struct oxygen *chip,
474 unsigned int reg, unsigned int mute)
475{
476 if (reg == AC97_LINE) {
477 spin_lock_irq(&chip->reg_lock);
478 oxygen_write16_masked(chip, OXYGEN_GPIO_DATA,
479 mute ? GPIO_DX_INPUT_ROUTE : 0,
480 GPIO_DX_INPUT_ROUTE);
481 spin_unlock_irq(&chip->reg_lock);
482 }
483}
484
472static const DECLARE_TLV_DB_SCALE(pcm1796_db_scale, -12000, 50, 0); 485static const DECLARE_TLV_DB_SCALE(pcm1796_db_scale, -12000, 50, 0);
473static const DECLARE_TLV_DB_SCALE(cs4362a_db_scale, -12700, 100, 0); 486static const DECLARE_TLV_DB_SCALE(cs4362a_db_scale, -12700, 100, 0);
474 487
@@ -572,6 +585,7 @@ static const struct oxygen_model xonar_models[] = {
572 .update_dac_volume = update_cs43xx_volume, 585 .update_dac_volume = update_cs43xx_volume,
573 .update_dac_mute = update_cs43xx_mute, 586 .update_dac_mute = update_cs43xx_mute,
574 .gpio_changed = xonar_gpio_changed, 587 .gpio_changed = xonar_gpio_changed,
588 .ac97_switch = xonar_dx_ac97_switch,
575 .model_data_size = sizeof(struct xonar_data), 589 .model_data_size = sizeof(struct xonar_data),
576 .pcm_dev_cfg = PLAYBACK_0_TO_I2S | 590 .pcm_dev_cfg = PLAYBACK_0_TO_I2S |
577 PLAYBACK_1_TO_SPDIF | 591 PLAYBACK_1_TO_SPDIF |