|
|
@@ -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,
|