diff options
-rw-r--r-- | sound/pci/oxygen/xonar_dg.c | 44 | ||||
-rw-r--r-- | sound/pci/oxygen/xonar_dg.h | 2 |
2 files changed, 22 insertions, 24 deletions
diff --git a/sound/pci/oxygen/xonar_dg.c b/sound/pci/oxygen/xonar_dg.c index 81c004c78766..329da5434556 100644 --- a/sound/pci/oxygen/xonar_dg.c +++ b/sound/pci/oxygen/xonar_dg.c | |||
@@ -262,33 +262,29 @@ static void set_cs4245_adc_params(struct oxygen *chip, | |||
262 | cs4245_write_spi(chip, CS4245_MCLK_FREQ); | 262 | cs4245_write_spi(chip, CS4245_MCLK_FREQ); |
263 | } | 263 | } |
264 | 264 | ||
265 | static inline unsigned int shift_bits(unsigned int value, | ||
266 | unsigned int shift_from, | ||
267 | unsigned int shift_to, | ||
268 | unsigned int mask) | ||
269 | { | ||
270 | if (shift_from < shift_to) | ||
271 | return (value << (shift_to - shift_from)) & mask; | ||
272 | else | ||
273 | return (value >> (shift_from - shift_to)) & mask; | ||
274 | } | ||
275 | |||
276 | static unsigned int adjust_dg_dac_routing(struct oxygen *chip, | 265 | static unsigned int adjust_dg_dac_routing(struct oxygen *chip, |
277 | unsigned int play_routing) | 266 | unsigned int play_routing) |
278 | { | 267 | { |
279 | return (play_routing & OXYGEN_PLAY_DAC0_SOURCE_MASK) | | 268 | struct dg *data = chip->model_data; |
280 | shift_bits(play_routing, | 269 | unsigned int routing = 0; |
281 | OXYGEN_PLAY_DAC2_SOURCE_SHIFT, | 270 | |
282 | OXYGEN_PLAY_DAC1_SOURCE_SHIFT, | 271 | switch (data->pcm_output) { |
283 | OXYGEN_PLAY_DAC1_SOURCE_MASK) | | 272 | case PLAYBACK_DST_HP: |
284 | shift_bits(play_routing, | 273 | case PLAYBACK_DST_HP_FP: |
285 | OXYGEN_PLAY_DAC1_SOURCE_SHIFT, | 274 | oxygen_write8_masked(chip, OXYGEN_PLAY_ROUTING, |
286 | OXYGEN_PLAY_DAC2_SOURCE_SHIFT, | 275 | OXYGEN_PLAY_MUTE23 | OXYGEN_PLAY_MUTE45 | |
287 | OXYGEN_PLAY_DAC2_SOURCE_MASK) | | 276 | OXYGEN_PLAY_MUTE67, OXYGEN_PLAY_MUTE_MASK); |
288 | shift_bits(play_routing, | 277 | break; |
289 | OXYGEN_PLAY_DAC0_SOURCE_SHIFT, | 278 | case PLAYBACK_DST_MULTICH: |
290 | OXYGEN_PLAY_DAC3_SOURCE_SHIFT, | 279 | routing = (0 << OXYGEN_PLAY_DAC0_SOURCE_SHIFT) | |
291 | OXYGEN_PLAY_DAC3_SOURCE_MASK); | 280 | (2 << OXYGEN_PLAY_DAC1_SOURCE_SHIFT) | |
281 | (1 << OXYGEN_PLAY_DAC2_SOURCE_SHIFT) | | ||
282 | (0 << OXYGEN_PLAY_DAC3_SOURCE_SHIFT); | ||
283 | oxygen_write8_masked(chip, OXYGEN_PLAY_ROUTING, | ||
284 | OXYGEN_PLAY_MUTE01, OXYGEN_PLAY_MUTE_MASK); | ||
285 | break; | ||
286 | } | ||
287 | return routing; | ||
292 | } | 288 | } |
293 | 289 | ||
294 | static int output_switch_info(struct snd_kcontrol *ctl, | 290 | static int output_switch_info(struct snd_kcontrol *ctl, |
diff --git a/sound/pci/oxygen/xonar_dg.h b/sound/pci/oxygen/xonar_dg.h index 944685edfce4..a9fba40bc013 100644 --- a/sound/pci/oxygen/xonar_dg.h +++ b/sound/pci/oxygen/xonar_dg.h | |||
@@ -26,6 +26,8 @@ enum cs4245_shadow_operation { | |||
26 | struct dg { | 26 | struct dg { |
27 | /* shadow copy of the CS4245 register space */ | 27 | /* shadow copy of the CS4245 register space */ |
28 | unsigned char cs4245_shadow[17]; | 28 | unsigned char cs4245_shadow[17]; |
29 | /* output select: headphone/speakers */ | ||
30 | unsigned char pcm_output; | ||
29 | unsigned int output_sel; | 31 | unsigned int output_sel; |
30 | s8 input_vol[4][2]; | 32 | s8 input_vol[4][2]; |
31 | unsigned int input_sel; | 33 | unsigned int input_sel; |