aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoman Volkov <v1ron@mail.ru>2014-01-24 07:18:10 -0500
committerClemens Ladisch <clemens@ladisch.de>2014-01-29 14:45:47 -0500
commitfddc106bc35ac2663f42c99bdf404c155a34b9a7 (patch)
treee0259554eea59d84ef57b3e683d6216d245abbac
parent3c1611ddd1b67628bd946111edae8f5366a14edf (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.c58
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
231static void set_cs4245_adc_params(struct oxygen *chip, 240static 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
247static inline unsigned int shift_bits(unsigned int value, 265static inline unsigned int shift_bits(unsigned int value,