diff options
| -rw-r--r-- | sound/pci/oxygen/xonar_dg.c | 30 |
1 files changed, 24 insertions, 6 deletions
diff --git a/sound/pci/oxygen/xonar_dg.c b/sound/pci/oxygen/xonar_dg.c index ed6f199f8a38..4cf3200e988b 100644 --- a/sound/pci/oxygen/xonar_dg.c +++ b/sound/pci/oxygen/xonar_dg.c | |||
| @@ -238,11 +238,21 @@ void set_cs4245_adc_params(struct oxygen *chip, | |||
| 238 | cs4245_write_spi(chip, CS4245_MCLK_FREQ); | 238 | cs4245_write_spi(chip, CS4245_MCLK_FREQ); |
| 239 | } | 239 | } |
| 240 | 240 | ||
| 241 | static inline unsigned int shift_bits(unsigned int value, | ||
| 242 | unsigned int shift_from, | ||
| 243 | unsigned int shift_to, | ||
| 244 | unsigned int mask) | ||
| 245 | { | ||
| 246 | if (shift_from < shift_to) | ||
| 247 | return (value << (shift_to - shift_from)) & mask; | ||
| 248 | else | ||
| 249 | return (value >> (shift_from - shift_to)) & mask; | ||
| 250 | } | ||
| 251 | |||
| 241 | unsigned int adjust_dg_dac_routing(struct oxygen *chip, | 252 | unsigned int adjust_dg_dac_routing(struct oxygen *chip, |
| 242 | unsigned int play_routing) | 253 | unsigned int play_routing) |
| 243 | { | 254 | { |
| 244 | struct dg *data = chip->model_data; | 255 | struct dg *data = chip->model_data; |
| 245 | unsigned int routing = 0; | ||
| 246 | 256 | ||
| 247 | switch (data->output_sel) { | 257 | switch (data->output_sel) { |
| 248 | case PLAYBACK_DST_HP: | 258 | case PLAYBACK_DST_HP: |
| @@ -252,15 +262,23 @@ unsigned int adjust_dg_dac_routing(struct oxygen *chip, | |||
| 252 | OXYGEN_PLAY_MUTE67, OXYGEN_PLAY_MUTE_MASK); | 262 | OXYGEN_PLAY_MUTE67, OXYGEN_PLAY_MUTE_MASK); |
| 253 | break; | 263 | break; |
| 254 | case PLAYBACK_DST_MULTICH: | 264 | case PLAYBACK_DST_MULTICH: |
| 255 | routing = (0 << OXYGEN_PLAY_DAC0_SOURCE_SHIFT) | | ||
| 256 | (2 << OXYGEN_PLAY_DAC1_SOURCE_SHIFT) | | ||
| 257 | (1 << OXYGEN_PLAY_DAC2_SOURCE_SHIFT) | | ||
| 258 | (0 << OXYGEN_PLAY_DAC3_SOURCE_SHIFT); | ||
| 259 | oxygen_write8_masked(chip, OXYGEN_PLAY_ROUTING, | 265 | oxygen_write8_masked(chip, OXYGEN_PLAY_ROUTING, |
| 260 | OXYGEN_PLAY_MUTE01, OXYGEN_PLAY_MUTE_MASK); | 266 | OXYGEN_PLAY_MUTE01, OXYGEN_PLAY_MUTE_MASK); |
| 261 | break; | 267 | break; |
| 262 | } | 268 | } |
| 263 | return routing; | 269 | return (play_routing & OXYGEN_PLAY_DAC0_SOURCE_MASK) | |
| 270 | shift_bits(play_routing, | ||
| 271 | OXYGEN_PLAY_DAC2_SOURCE_SHIFT, | ||
| 272 | OXYGEN_PLAY_DAC1_SOURCE_SHIFT, | ||
| 273 | OXYGEN_PLAY_DAC1_SOURCE_MASK) | | ||
| 274 | shift_bits(play_routing, | ||
| 275 | OXYGEN_PLAY_DAC1_SOURCE_SHIFT, | ||
| 276 | OXYGEN_PLAY_DAC2_SOURCE_SHIFT, | ||
| 277 | OXYGEN_PLAY_DAC2_SOURCE_MASK) | | ||
| 278 | shift_bits(play_routing, | ||
| 279 | OXYGEN_PLAY_DAC0_SOURCE_SHIFT, | ||
| 280 | OXYGEN_PLAY_DAC3_SOURCE_SHIFT, | ||
| 281 | OXYGEN_PLAY_DAC3_SOURCE_MASK); | ||
| 264 | } | 282 | } |
| 265 | 283 | ||
| 266 | void dump_cs4245_registers(struct oxygen *chip, | 284 | void dump_cs4245_registers(struct oxygen *chip, |
