Message ID | 53280456.5010002@ladisch.de (mailing list archive) |
---|---|
State | Accepted |
Headers | show |
At Tue, 18 Mar 2014 09:31:18 +0100, Clemens Ladisch wrote: > > The code introduced in commit 1f91ecc14dee ("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. > > Tested-by: Roman Volkov <v1ron@mail.ru> > Signed-off-by: Clemens Ladisch <clemens@ladisch.de> Thanks, applied. Takashi > --- > sound/pci/oxygen/xonar_dg.c | 30 ++++++++++++++++++++++++------ > 1 file changed, 24 insertions(+), 6 deletions(-) > > --- 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, > 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, >
--- 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, 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,