diff options
Diffstat (limited to 'sound/pci/oxygen')
-rw-r--r-- | sound/pci/oxygen/xonar_dg.h | 3 | ||||
-rw-r--r-- | sound/pci/oxygen/xonar_dg_mixer.c | 52 |
2 files changed, 30 insertions, 25 deletions
diff --git a/sound/pci/oxygen/xonar_dg.h b/sound/pci/oxygen/xonar_dg.h index a7e511026f48..d900323f73d0 100644 --- a/sound/pci/oxygen/xonar_dg.h +++ b/sound/pci/oxygen/xonar_dg.h | |||
@@ -30,7 +30,8 @@ struct dg { | |||
30 | unsigned char output_sel; | 30 | unsigned char output_sel; |
31 | /* volumes for all capture sources */ | 31 | /* volumes for all capture sources */ |
32 | char input_vol[4][2]; | 32 | char input_vol[4][2]; |
33 | unsigned int input_sel; | 33 | /* input select: mic/fp mic/line/aux */ |
34 | unsigned char input_sel; | ||
34 | u8 hp_vol_att; | 35 | u8 hp_vol_att; |
35 | }; | 36 | }; |
36 | 37 | ||
diff --git a/sound/pci/oxygen/xonar_dg_mixer.c b/sound/pci/oxygen/xonar_dg_mixer.c index 2417a1efd719..41ee39359bd6 100644 --- a/sound/pci/oxygen/xonar_dg_mixer.c +++ b/sound/pci/oxygen/xonar_dg_mixer.c | |||
@@ -260,11 +260,27 @@ static int input_vol_put(struct snd_kcontrol *ctl, | |||
260 | return changed; | 260 | return changed; |
261 | } | 261 | } |
262 | 262 | ||
263 | /* Capture Source */ | ||
264 | |||
265 | static int input_source_apply(struct oxygen *chip) | ||
266 | { | ||
267 | struct dg *data = chip->model_data; | ||
268 | |||
269 | data->cs4245_shadow[CS4245_ANALOG_IN] &= ~CS4245_SEL_MASK; | ||
270 | if (data->input_sel == CAPTURE_SRC_FP_MIC) | ||
271 | data->cs4245_shadow[CS4245_ANALOG_IN] |= CS4245_SEL_INPUT_2; | ||
272 | else if (data->input_sel == CAPTURE_SRC_LINE) | ||
273 | data->cs4245_shadow[CS4245_ANALOG_IN] |= CS4245_SEL_INPUT_4; | ||
274 | else if (data->input_sel != CAPTURE_SRC_MIC) | ||
275 | data->cs4245_shadow[CS4245_ANALOG_IN] |= CS4245_SEL_INPUT_1; | ||
276 | return cs4245_write_spi(chip, CS4245_ANALOG_IN); | ||
277 | } | ||
278 | |||
263 | static int input_sel_info(struct snd_kcontrol *ctl, | 279 | static int input_sel_info(struct snd_kcontrol *ctl, |
264 | struct snd_ctl_elem_info *info) | 280 | struct snd_ctl_elem_info *info) |
265 | { | 281 | { |
266 | static const char *const names[4] = { | 282 | static const char *const names[4] = { |
267 | "Mic", "Aux", "Front Mic", "Line" | 283 | "Mic", "Front Mic", "Line", "Aux" |
268 | }; | 284 | }; |
269 | 285 | ||
270 | return snd_ctl_enum_info(info, 1, 4, names); | 286 | return snd_ctl_enum_info(info, 1, 4, names); |
@@ -285,15 +301,10 @@ static int input_sel_get(struct snd_kcontrol *ctl, | |||
285 | static int input_sel_put(struct snd_kcontrol *ctl, | 301 | static int input_sel_put(struct snd_kcontrol *ctl, |
286 | struct snd_ctl_elem_value *value) | 302 | struct snd_ctl_elem_value *value) |
287 | { | 303 | { |
288 | static const u8 sel_values[4] = { | ||
289 | CS4245_SEL_MIC, | ||
290 | CS4245_SEL_INPUT_1, | ||
291 | CS4245_SEL_INPUT_2, | ||
292 | CS4245_SEL_INPUT_4 | ||
293 | }; | ||
294 | struct oxygen *chip = ctl->private_data; | 304 | struct oxygen *chip = ctl->private_data; |
295 | struct dg *data = chip->model_data; | 305 | struct dg *data = chip->model_data; |
296 | int changed; | 306 | int changed; |
307 | int ret; | ||
297 | 308 | ||
298 | if (value->value.enumerated.item[0] > 3) | 309 | if (value->value.enumerated.item[0] > 3) |
299 | return -EINVAL; | 310 | return -EINVAL; |
@@ -303,19 +314,12 @@ static int input_sel_put(struct snd_kcontrol *ctl, | |||
303 | if (changed) { | 314 | if (changed) { |
304 | data->input_sel = value->value.enumerated.item[0]; | 315 | data->input_sel = value->value.enumerated.item[0]; |
305 | 316 | ||
306 | cs4245_write(chip, CS4245_ANALOG_IN, | 317 | ret = input_source_apply(chip); |
307 | (data->cs4245_shadow[CS4245_ANALOG_IN] & | 318 | if (ret >= 0) |
308 | ~CS4245_SEL_MASK) | | 319 | ret = input_volume_apply(chip, |
309 | sel_values[data->input_sel]); | 320 | data->input_vol[data->input_sel][0], |
310 | 321 | data->input_vol[data->input_sel][1]); | |
311 | cs4245_write_cached(chip, CS4245_PGA_A_CTRL, | 322 | changed = ret >= 0 ? 1 : ret; |
312 | data->input_vol[data->input_sel][0]); | ||
313 | cs4245_write_cached(chip, CS4245_PGA_B_CTRL, | ||
314 | data->input_vol[data->input_sel][1]); | ||
315 | |||
316 | oxygen_write16_masked(chip, OXYGEN_GPIO_DATA, | ||
317 | data->input_sel ? 0 : GPIO_INPUT_ROUTE, | ||
318 | GPIO_INPUT_ROUTE); | ||
319 | } | 323 | } |
320 | mutex_unlock(&chip->mutex); | 324 | mutex_unlock(&chip->mutex); |
321 | return changed; | 325 | return changed; |
@@ -395,10 +399,10 @@ static const struct snd_kcontrol_new dg_controls[] = { | |||
395 | .get = hp_mute_get, | 399 | .get = hp_mute_get, |
396 | .put = hp_mute_put, | 400 | .put = hp_mute_put, |
397 | }, | 401 | }, |
398 | INPUT_VOLUME("Mic Capture Volume", 0), | 402 | INPUT_VOLUME("Mic Capture Volume", CAPTURE_SRC_MIC), |
399 | INPUT_VOLUME("Aux Capture Volume", 1), | 403 | INPUT_VOLUME("Front Mic Capture Volume", CAPTURE_SRC_FP_MIC), |
400 | INPUT_VOLUME("Front Mic Capture Volume", 2), | 404 | INPUT_VOLUME("Line Capture Volume", CAPTURE_SRC_LINE), |
401 | INPUT_VOLUME("Line Capture Volume", 3), | 405 | INPUT_VOLUME("Aux Capture Volume", CAPTURE_SRC_AUX), |
402 | { | 406 | { |
403 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | 407 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, |
404 | .name = "Capture Source", | 408 | .name = "Capture Source", |