diff options
author | Roman Volkov <v1ron@mail.ru> | 2014-01-24 07:18:10 -0500 |
---|---|---|
committer | Clemens Ladisch <clemens@ladisch.de> | 2014-01-29 14:45:47 -0500 |
commit | fddc106bc35ac2663f42c99bdf404c155a34b9a7 (patch) | |
tree | e0259554eea59d84ef57b3e683d6216d245abbac | |
parent | 3c1611ddd1b67628bd946111edae8f5366a14edf (diff) |
ALSA: oxygen: Xonar DG(X): modify DAC/ADC parameters function
When selecting the audio sample rate for CS4245,
the MCLK divider should also be changed.
Signed-off-by: Roman Volkov <v1ron@mail.ru>
Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
-rw-r--r-- | sound/pci/oxygen/xonar_dg.c | 58 |
1 files changed, 38 insertions, 20 deletions
diff --git a/sound/pci/oxygen/xonar_dg.c b/sound/pci/oxygen/xonar_dg.c index 4177fb131086..81c004c78766 100644 --- a/sound/pci/oxygen/xonar_dg.c +++ b/sound/pci/oxygen/xonar_dg.c | |||
@@ -216,32 +216,50 @@ static void set_cs4245_dac_params(struct oxygen *chip, | |||
216 | struct snd_pcm_hw_params *params) | 216 | struct snd_pcm_hw_params *params) |
217 | { | 217 | { |
218 | struct dg *data = chip->model_data; | 218 | struct dg *data = chip->model_data; |
219 | u8 value; | 219 | unsigned char dac_ctrl; |
220 | 220 | unsigned char mclk_freq; | |
221 | value = data->cs4245_shadow[CS4245_DAC_CTRL_1] & ~CS4245_DAC_FM_MASK; | 221 | |
222 | if (params_rate(params) <= 50000) | 222 | dac_ctrl = data->cs4245_shadow[CS4245_DAC_CTRL_1] & ~CS4245_DAC_FM_MASK; |
223 | value |= CS4245_DAC_FM_SINGLE; | 223 | mclk_freq = data->cs4245_shadow[CS4245_MCLK_FREQ] & ~CS4245_MCLK1_MASK; |
224 | else if (params_rate(params) <= 100000) | 224 | if (params_rate(params) <= 50000) { |
225 | value |= CS4245_DAC_FM_DOUBLE; | 225 | dac_ctrl |= CS4245_DAC_FM_SINGLE; |
226 | else | 226 | mclk_freq |= CS4245_MCLK_1 << CS4245_MCLK1_SHIFT; |
227 | value |= CS4245_DAC_FM_QUAD; | 227 | } else if (params_rate(params) <= 100000) { |
228 | cs4245_write_cached(chip, CS4245_DAC_CTRL_1, value); | 228 | dac_ctrl |= CS4245_DAC_FM_DOUBLE; |
229 | mclk_freq |= CS4245_MCLK_1 << CS4245_MCLK1_SHIFT; | ||
230 | } else { | ||
231 | dac_ctrl |= CS4245_DAC_FM_QUAD; | ||
232 | mclk_freq |= CS4245_MCLK_2 << CS4245_MCLK1_SHIFT; | ||
233 | } | ||
234 | data->cs4245_shadow[CS4245_DAC_CTRL_1] = dac_ctrl; | ||
235 | data->cs4245_shadow[CS4245_MCLK_FREQ] = mclk_freq; | ||
236 | cs4245_write_spi(chip, CS4245_DAC_CTRL_1); | ||
237 | cs4245_write_spi(chip, CS4245_MCLK_FREQ); | ||
229 | } | 238 | } |
230 | 239 | ||
231 | static void set_cs4245_adc_params(struct oxygen *chip, | 240 | static void set_cs4245_adc_params(struct oxygen *chip, |
232 | struct snd_pcm_hw_params *params) | 241 | struct snd_pcm_hw_params *params) |
233 | { | 242 | { |
234 | struct dg *data = chip->model_data; | 243 | struct dg *data = chip->model_data; |
235 | u8 value; | 244 | unsigned char adc_ctrl; |
236 | 245 | unsigned char mclk_freq; | |
237 | value = data->cs4245_shadow[CS4245_ADC_CTRL] & ~CS4245_ADC_FM_MASK; | 246 | |
238 | if (params_rate(params) <= 50000) | 247 | adc_ctrl = data->cs4245_shadow[CS4245_ADC_CTRL] & ~CS4245_ADC_FM_MASK; |
239 | value |= CS4245_ADC_FM_SINGLE; | 248 | mclk_freq = data->cs4245_shadow[CS4245_MCLK_FREQ] & ~CS4245_MCLK2_MASK; |
240 | else if (params_rate(params) <= 100000) | 249 | if (params_rate(params) <= 50000) { |
241 | value |= CS4245_ADC_FM_DOUBLE; | 250 | adc_ctrl |= CS4245_ADC_FM_SINGLE; |
242 | else | 251 | mclk_freq |= CS4245_MCLK_1 << CS4245_MCLK2_SHIFT; |
243 | value |= CS4245_ADC_FM_QUAD; | 252 | } else if (params_rate(params) <= 100000) { |
244 | cs4245_write_cached(chip, CS4245_ADC_CTRL, value); | 253 | adc_ctrl |= CS4245_ADC_FM_DOUBLE; |
254 | mclk_freq |= CS4245_MCLK_1 << CS4245_MCLK2_SHIFT; | ||
255 | } else { | ||
256 | adc_ctrl |= CS4245_ADC_FM_QUAD; | ||
257 | mclk_freq |= CS4245_MCLK_2 << CS4245_MCLK2_SHIFT; | ||
258 | } | ||
259 | data->cs4245_shadow[CS4245_ADC_CTRL] = adc_ctrl; | ||
260 | data->cs4245_shadow[CS4245_MCLK_FREQ] = mclk_freq; | ||
261 | cs4245_write_spi(chip, CS4245_ADC_CTRL); | ||
262 | cs4245_write_spi(chip, CS4245_MCLK_FREQ); | ||
245 | } | 263 | } |
246 | 264 | ||
247 | static inline unsigned int shift_bits(unsigned int value, | 265 | static inline unsigned int shift_bits(unsigned int value, |