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>

authored by Roman Volkov and committed by Clemens Ladisch fddc106b 3c1611dd

+36 -18
+36 -18
sound/pci/oxygen/xonar_dg.c
··· 216 struct snd_pcm_hw_params *params) 217 { 218 struct dg *data = chip->model_data; 219 - u8 value; 220 221 - value = data->cs4245_shadow[CS4245_DAC_CTRL_1] & ~CS4245_DAC_FM_MASK; 222 - if (params_rate(params) <= 50000) 223 - value |= CS4245_DAC_FM_SINGLE; 224 - else if (params_rate(params) <= 100000) 225 - value |= CS4245_DAC_FM_DOUBLE; 226 - else 227 - value |= CS4245_DAC_FM_QUAD; 228 - cs4245_write_cached(chip, CS4245_DAC_CTRL_1, value); 229 } 230 231 static void set_cs4245_adc_params(struct oxygen *chip, 232 struct snd_pcm_hw_params *params) 233 { 234 struct dg *data = chip->model_data; 235 - u8 value; 236 237 - value = data->cs4245_shadow[CS4245_ADC_CTRL] & ~CS4245_ADC_FM_MASK; 238 - if (params_rate(params) <= 50000) 239 - value |= CS4245_ADC_FM_SINGLE; 240 - else if (params_rate(params) <= 100000) 241 - value |= CS4245_ADC_FM_DOUBLE; 242 - else 243 - value |= CS4245_ADC_FM_QUAD; 244 - cs4245_write_cached(chip, CS4245_ADC_CTRL, value); 245 } 246 247 static inline unsigned int shift_bits(unsigned int value,
··· 216 struct snd_pcm_hw_params *params) 217 { 218 struct dg *data = chip->model_data; 219 + unsigned char dac_ctrl; 220 + unsigned char mclk_freq; 221 222 + dac_ctrl = data->cs4245_shadow[CS4245_DAC_CTRL_1] & ~CS4245_DAC_FM_MASK; 223 + mclk_freq = data->cs4245_shadow[CS4245_MCLK_FREQ] & ~CS4245_MCLK1_MASK; 224 + if (params_rate(params) <= 50000) { 225 + dac_ctrl |= CS4245_DAC_FM_SINGLE; 226 + mclk_freq |= CS4245_MCLK_1 << CS4245_MCLK1_SHIFT; 227 + } else if (params_rate(params) <= 100000) { 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); 238 } 239 240 static void set_cs4245_adc_params(struct oxygen *chip, 241 struct snd_pcm_hw_params *params) 242 { 243 struct dg *data = chip->model_data; 244 + unsigned char adc_ctrl; 245 + unsigned char mclk_freq; 246 247 + adc_ctrl = data->cs4245_shadow[CS4245_ADC_CTRL] & ~CS4245_ADC_FM_MASK; 248 + mclk_freq = data->cs4245_shadow[CS4245_MCLK_FREQ] & ~CS4245_MCLK2_MASK; 249 + if (params_rate(params) <= 50000) { 250 + adc_ctrl |= CS4245_ADC_FM_SINGLE; 251 + mclk_freq |= CS4245_MCLK_1 << CS4245_MCLK2_SHIFT; 252 + } else if (params_rate(params) <= 100000) { 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); 263 } 264 265 static inline unsigned int shift_bits(unsigned int value,