ALSA: oxygen: Xonar DG(X): fix Stereo Upmixing regression
The code introduced in commit1f91ecc14d
("ALSA: oxygen: modify adjust_dg_dac_routing function") accidentally disregarded the old value of the playback routing register, so it broke the "Stereo Upmixing" mixer control. The unmuted parts of the channel routing are the same for all settings of the output destination, so it suffices to revert that part of the patch. Fixes:1f91ecc14d
('ALSA: oxygen: modify adjust_dg_dac_routing function') Tested-by: Roman Volkov <v1ron@mail.ru> Signed-off-by: Clemens Ladisch <clemens@ladisch.de> Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
5e3a227a64
commit
305564413c
@ -238,11 +238,21 @@ void set_cs4245_adc_params(struct oxygen *chip,
|
||||
cs4245_write_spi(chip, CS4245_MCLK_FREQ);
|
||||
}
|
||||
|
||||
static inline unsigned int shift_bits(unsigned int value,
|
||||
unsigned int shift_from,
|
||||
unsigned int shift_to,
|
||||
unsigned int mask)
|
||||
{
|
||||
if (shift_from < shift_to)
|
||||
return (value << (shift_to - shift_from)) & mask;
|
||||
else
|
||||
return (value >> (shift_from - shift_to)) & mask;
|
||||
}
|
||||
|
||||
unsigned int adjust_dg_dac_routing(struct oxygen *chip,
|
||||
unsigned int play_routing)
|
||||
{
|
||||
struct dg *data = chip->model_data;
|
||||
unsigned int routing = 0;
|
||||
|
||||
switch (data->output_sel) {
|
||||
case PLAYBACK_DST_HP:
|
||||
@ -252,15 +262,23 @@ unsigned int adjust_dg_dac_routing(struct oxygen *chip,
|
||||
OXYGEN_PLAY_MUTE67, OXYGEN_PLAY_MUTE_MASK);
|
||||
break;
|
||||
case PLAYBACK_DST_MULTICH:
|
||||
routing = (0 << OXYGEN_PLAY_DAC0_SOURCE_SHIFT) |
|
||||
(2 << OXYGEN_PLAY_DAC1_SOURCE_SHIFT) |
|
||||
(1 << OXYGEN_PLAY_DAC2_SOURCE_SHIFT) |
|
||||
(0 << OXYGEN_PLAY_DAC3_SOURCE_SHIFT);
|
||||
oxygen_write8_masked(chip, OXYGEN_PLAY_ROUTING,
|
||||
OXYGEN_PLAY_MUTE01, OXYGEN_PLAY_MUTE_MASK);
|
||||
break;
|
||||
}
|
||||
return routing;
|
||||
return (play_routing & OXYGEN_PLAY_DAC0_SOURCE_MASK) |
|
||||
shift_bits(play_routing,
|
||||
OXYGEN_PLAY_DAC2_SOURCE_SHIFT,
|
||||
OXYGEN_PLAY_DAC1_SOURCE_SHIFT,
|
||||
OXYGEN_PLAY_DAC1_SOURCE_MASK) |
|
||||
shift_bits(play_routing,
|
||||
OXYGEN_PLAY_DAC1_SOURCE_SHIFT,
|
||||
OXYGEN_PLAY_DAC2_SOURCE_SHIFT,
|
||||
OXYGEN_PLAY_DAC2_SOURCE_MASK) |
|
||||
shift_bits(play_routing,
|
||||
OXYGEN_PLAY_DAC0_SOURCE_SHIFT,
|
||||
OXYGEN_PLAY_DAC3_SOURCE_SHIFT,
|
||||
OXYGEN_PLAY_DAC3_SOURCE_MASK);
|
||||
}
|
||||
|
||||
void dump_cs4245_registers(struct oxygen *chip,
|
||||
|
Loading…
Reference in New Issue
Block a user