aboutsummaryrefslogtreecommitdiffstats
path: root/sound/pci/oxygen
diff options
context:
space:
mode:
Diffstat (limited to 'sound/pci/oxygen')
-rw-r--r--sound/pci/oxygen/xonar_dg.h3
-rw-r--r--sound/pci/oxygen/xonar_dg_mixer.c52
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
265static 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
263static int input_sel_info(struct snd_kcontrol *ctl, 279static 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,
285static int input_sel_put(struct snd_kcontrol *ctl, 301static 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",