Lines Matching +full:codec +full:- +full:analog +full:- +full:controls
1 // SPDX-License-Identifier: GPL-2.0-only
3 * C-Media CMI8788 driver - mixer code
19 struct oxygen *chip = ctl->private_data; in dac_volume_info()
21 info->type = SNDRV_CTL_ELEM_TYPE_INTEGER; in dac_volume_info()
22 info->count = chip->model.dac_channels_mixer; in dac_volume_info()
23 info->value.integer.min = chip->model.dac_volume_min; in dac_volume_info()
24 info->value.integer.max = chip->model.dac_volume_max; in dac_volume_info()
31 struct oxygen *chip = ctl->private_data; in dac_volume_get()
34 mutex_lock(&chip->mutex); in dac_volume_get()
35 for (i = 0; i < chip->model.dac_channels_mixer; ++i) in dac_volume_get()
36 value->value.integer.value[i] = chip->dac_volume[i]; in dac_volume_get()
37 mutex_unlock(&chip->mutex); in dac_volume_get()
44 struct oxygen *chip = ctl->private_data; in dac_volume_put()
49 mutex_lock(&chip->mutex); in dac_volume_put()
50 for (i = 0; i < chip->model.dac_channels_mixer; ++i) in dac_volume_put()
51 if (value->value.integer.value[i] != chip->dac_volume[i]) { in dac_volume_put()
52 chip->dac_volume[i] = value->value.integer.value[i]; in dac_volume_put()
56 chip->model.update_dac_volume(chip); in dac_volume_put()
57 mutex_unlock(&chip->mutex); in dac_volume_put()
64 struct oxygen *chip = ctl->private_data; in dac_mute_get()
66 mutex_lock(&chip->mutex); in dac_mute_get()
67 value->value.integer.value[0] = !chip->dac_mute; in dac_mute_get()
68 mutex_unlock(&chip->mutex); in dac_mute_get()
75 struct oxygen *chip = ctl->private_data; in dac_mute_put()
78 mutex_lock(&chip->mutex); in dac_mute_put()
79 changed = (!value->value.integer.value[0]) != chip->dac_mute; in dac_mute_put()
81 chip->dac_mute = !value->value.integer.value[0]; in dac_mute_put()
82 chip->model.update_dac_mute(chip); in dac_mute_put()
84 mutex_unlock(&chip->mutex); in dac_mute_put()
90 if (chip->model.dac_channels_pcm < 8) in upmix_item_count()
92 else if (chip->model.update_center_lfe_mix) in upmix_item_count()
107 struct oxygen *chip = ctl->private_data; in upmix_info()
115 struct oxygen *chip = ctl->private_data; in upmix_get()
117 mutex_lock(&chip->mutex); in upmix_get()
118 value->value.enumerated.item[0] = chip->dac_routing; in upmix_get()
119 mutex_unlock(&chip->mutex); in upmix_get()
127 /* stereo -> front */ in oxygen_update_dac_routing()
132 /* stereo -> front+surround */ in oxygen_update_dac_routing()
137 /* stereo -> front+surround+back */ in oxygen_update_dac_routing()
142 /* stereo -> front+surround+center/LFE */ in oxygen_update_dac_routing()
147 /* stereo -> front+surround+center/LFE+back */ in oxygen_update_dac_routing()
159 reg_value = reg_values[chip->dac_routing]; in oxygen_update_dac_routing()
171 if (chip->model.adjust_dac_routing) in oxygen_update_dac_routing()
172 reg_value = chip->model.adjust_dac_routing(chip, reg_value); in oxygen_update_dac_routing()
178 if (chip->model.update_center_lfe_mix) in oxygen_update_dac_routing()
179 chip->model.update_center_lfe_mix(chip, chip->dac_routing > 2); in oxygen_update_dac_routing()
185 struct oxygen *chip = ctl->private_data; in upmix_put()
189 if (value->value.enumerated.item[0] >= count) in upmix_put()
190 return -EINVAL; in upmix_put()
191 mutex_lock(&chip->mutex); in upmix_put()
192 changed = value->value.enumerated.item[0] != chip->dac_routing; in upmix_put()
194 chip->dac_routing = value->value.enumerated.item[0]; in upmix_put()
197 mutex_unlock(&chip->mutex); in upmix_put()
204 struct oxygen *chip = ctl->private_data; in spdif_switch_get()
206 mutex_lock(&chip->mutex); in spdif_switch_get()
207 value->value.integer.value[0] = chip->spdif_playback_enable; in spdif_switch_get()
208 mutex_unlock(&chip->mutex); in spdif_switch_get()
242 if (chip->pcm_active & (1 << PCM_SPDIF)) { in oxygen_update_spdif_source()
249 } else if ((chip->pcm_active & (1 << PCM_MULTICH)) && in oxygen_update_spdif_source()
250 chip->spdif_playback_enable) { in oxygen_update_spdif_source()
271 ((chip->pcm_active & (1 << PCM_SPDIF)) ? in oxygen_update_spdif_source()
272 chip->spdif_pcm_bits : chip->spdif_bits)); in oxygen_update_spdif_source()
279 struct oxygen *chip = ctl->private_data; in spdif_switch_put()
282 mutex_lock(&chip->mutex); in spdif_switch_put()
283 changed = value->value.integer.value[0] != chip->spdif_playback_enable; in spdif_switch_put()
285 chip->spdif_playback_enable = !!value->value.integer.value[0]; in spdif_switch_put()
286 spin_lock_irq(&chip->reg_lock); in spdif_switch_put()
288 spin_unlock_irq(&chip->reg_lock); in spdif_switch_put()
290 mutex_unlock(&chip->mutex); in spdif_switch_put()
296 info->type = SNDRV_CTL_ELEM_TYPE_IEC958; in spdif_info()
297 info->count = 1; in spdif_info()
303 value->value.iec958.status[0] = in oxygen_to_iec958()
306 value->value.iec958.status[1] = /* category and original */ in oxygen_to_iec958()
314 bits = value->value.iec958.status[0] & in iec958_to_oxygen()
317 bits |= value->value.iec958.status[1] << OXYGEN_SPDIF_CATEGORY_SHIFT; in iec958_to_oxygen()
337 struct oxygen *chip = ctl->private_data; in spdif_default_get()
339 mutex_lock(&chip->mutex); in spdif_default_get()
340 oxygen_to_iec958(chip->spdif_bits, value); in spdif_default_get()
341 mutex_unlock(&chip->mutex); in spdif_default_get()
348 struct oxygen *chip = ctl->private_data; in spdif_default_put()
353 mutex_lock(&chip->mutex); in spdif_default_put()
354 changed = new_bits != chip->spdif_bits; in spdif_default_put()
356 chip->spdif_bits = new_bits; in spdif_default_put()
357 if (!(chip->pcm_active & (1 << PCM_SPDIF))) in spdif_default_put()
360 mutex_unlock(&chip->mutex); in spdif_default_put()
367 value->value.iec958.status[0] = IEC958_AES0_NONAUDIO | in spdif_mask_get()
369 value->value.iec958.status[1] = in spdif_mask_get()
377 struct oxygen *chip = ctl->private_data; in spdif_pcm_get()
379 mutex_lock(&chip->mutex); in spdif_pcm_get()
380 oxygen_to_iec958(chip->spdif_pcm_bits, value); in spdif_pcm_get()
381 mutex_unlock(&chip->mutex); in spdif_pcm_get()
388 struct oxygen *chip = ctl->private_data; in spdif_pcm_put()
393 mutex_lock(&chip->mutex); in spdif_pcm_put()
394 changed = new_bits != chip->spdif_pcm_bits; in spdif_pcm_put()
396 chip->spdif_pcm_bits = new_bits; in spdif_pcm_put()
397 if (chip->pcm_active & (1 << PCM_SPDIF)) in spdif_pcm_put()
400 mutex_unlock(&chip->mutex); in spdif_pcm_put()
407 value->value.iec958.status[0] = 0xff; in spdif_input_mask_get()
408 value->value.iec958.status[1] = 0xff; in spdif_input_mask_get()
409 value->value.iec958.status[2] = 0xff; in spdif_input_mask_get()
410 value->value.iec958.status[3] = 0xff; in spdif_input_mask_get()
417 struct oxygen *chip = ctl->private_data; in spdif_input_default_get()
421 value->value.iec958.status[0] = bits; in spdif_input_default_get()
422 value->value.iec958.status[1] = bits >> 8; in spdif_input_default_get()
423 value->value.iec958.status[2] = bits >> 16; in spdif_input_default_get()
424 value->value.iec958.status[3] = bits >> 24; in spdif_input_default_get()
431 struct oxygen *chip = ctl->private_data; in spdif_bit_switch_get()
432 u32 bit = ctl->private_value; in spdif_bit_switch_get()
434 value->value.integer.value[0] = in spdif_bit_switch_get()
442 struct oxygen *chip = ctl->private_data; in spdif_bit_switch_put()
443 u32 bit = ctl->private_value; in spdif_bit_switch_put()
447 spin_lock_irq(&chip->reg_lock); in spdif_bit_switch_put()
449 if (value->value.integer.value[0]) in spdif_bit_switch_put()
456 spin_unlock_irq(&chip->reg_lock); in spdif_bit_switch_put()
463 info->type = SNDRV_CTL_ELEM_TYPE_INTEGER; in monitor_volume_info()
464 info->count = 1; in monitor_volume_info()
465 info->value.integer.min = 0; in monitor_volume_info()
466 info->value.integer.max = 1; in monitor_volume_info()
473 struct oxygen *chip = ctl->private_data; in monitor_get()
474 u8 bit = ctl->private_value; in monitor_get()
475 int invert = ctl->private_value & (1 << 8); in monitor_get()
477 value->value.integer.value[0] = in monitor_get()
485 struct oxygen *chip = ctl->private_data; in monitor_put()
486 u8 bit = ctl->private_value; in monitor_put()
487 int invert = ctl->private_value & (1 << 8); in monitor_put()
491 spin_lock_irq(&chip->reg_lock); in monitor_put()
493 if ((!!value->value.integer.value[0] ^ !!invert) != 0) in monitor_put()
500 spin_unlock_irq(&chip->reg_lock); in monitor_put()
507 struct oxygen *chip = ctl->private_data; in ac97_switch_get()
508 unsigned int codec = (ctl->private_value >> 24) & 1; in ac97_switch_get() local
509 unsigned int index = ctl->private_value & 0xff; in ac97_switch_get()
510 unsigned int bitnr = (ctl->private_value >> 8) & 0xff; in ac97_switch_get()
511 int invert = ctl->private_value & (1 << 16); in ac97_switch_get()
514 mutex_lock(&chip->mutex); in ac97_switch_get()
515 reg = oxygen_read_ac97(chip, codec, index); in ac97_switch_get()
516 mutex_unlock(&chip->mutex); in ac97_switch_get()
518 value->value.integer.value[0] = 1; in ac97_switch_get()
520 value->value.integer.value[0] = 0; in ac97_switch_get()
529 if (!chip->controls[control]) in mute_ac97_ctl()
531 priv_idx = chip->controls[control]->private_value & 0xff; in mute_ac97_ctl()
535 if (chip->model.ac97_switch) in mute_ac97_ctl()
536 chip->model.ac97_switch(chip, priv_idx, 0x8000); in mute_ac97_ctl()
537 snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE, in mute_ac97_ctl()
538 &chip->controls[control]->id); in mute_ac97_ctl()
545 struct oxygen *chip = ctl->private_data; in ac97_switch_put()
546 unsigned int codec = (ctl->private_value >> 24) & 1; in ac97_switch_put() local
547 unsigned int index = ctl->private_value & 0xff; in ac97_switch_put()
548 unsigned int bitnr = (ctl->private_value >> 8) & 0xff; in ac97_switch_put()
549 int invert = ctl->private_value & (1 << 16); in ac97_switch_put()
553 mutex_lock(&chip->mutex); in ac97_switch_put()
554 oldreg = oxygen_read_ac97(chip, codec, index); in ac97_switch_put()
556 if (!value->value.integer.value[0] ^ !invert) in ac97_switch_put()
562 oxygen_write_ac97(chip, codec, index, newreg); in ac97_switch_put()
563 if (codec == 0 && chip->model.ac97_switch) in ac97_switch_put()
564 chip->model.ac97_switch(chip, index, newreg & 0x8000); in ac97_switch_put()
582 mutex_unlock(&chip->mutex); in ac97_switch_put()
589 int stereo = (ctl->private_value >> 16) & 1; in ac97_volume_info()
591 info->type = SNDRV_CTL_ELEM_TYPE_INTEGER; in ac97_volume_info()
592 info->count = stereo ? 2 : 1; in ac97_volume_info()
593 info->value.integer.min = 0; in ac97_volume_info()
594 info->value.integer.max = 0x1f; in ac97_volume_info()
601 struct oxygen *chip = ctl->private_data; in ac97_volume_get()
602 unsigned int codec = (ctl->private_value >> 24) & 1; in ac97_volume_get() local
603 int stereo = (ctl->private_value >> 16) & 1; in ac97_volume_get()
604 unsigned int index = ctl->private_value & 0xff; in ac97_volume_get()
607 mutex_lock(&chip->mutex); in ac97_volume_get()
608 reg = oxygen_read_ac97(chip, codec, index); in ac97_volume_get()
609 mutex_unlock(&chip->mutex); in ac97_volume_get()
611 value->value.integer.value[0] = 31 - (reg & 0x1f); in ac97_volume_get()
613 value->value.integer.value[0] = 31 - ((reg >> 8) & 0x1f); in ac97_volume_get()
614 value->value.integer.value[1] = 31 - (reg & 0x1f); in ac97_volume_get()
622 struct oxygen *chip = ctl->private_data; in ac97_volume_put()
623 unsigned int codec = (ctl->private_value >> 24) & 1; in ac97_volume_put() local
624 int stereo = (ctl->private_value >> 16) & 1; in ac97_volume_put()
625 unsigned int index = ctl->private_value & 0xff; in ac97_volume_put()
629 mutex_lock(&chip->mutex); in ac97_volume_put()
630 oldreg = oxygen_read_ac97(chip, codec, index); in ac97_volume_put()
633 newreg |= 31 - (value->value.integer.value[0] & 0x1f); in ac97_volume_put()
636 newreg |= (31 - (value->value.integer.value[0] & 0x1f)) << 8; in ac97_volume_put()
637 newreg |= 31 - (value->value.integer.value[1] & 0x1f); in ac97_volume_put()
641 oxygen_write_ac97(chip, codec, index, newreg); in ac97_volume_put()
642 mutex_unlock(&chip->mutex); in ac97_volume_put()
657 struct oxygen *chip = ctl->private_data; in mic_fmic_source_get()
659 mutex_lock(&chip->mutex); in mic_fmic_source_get()
660 value->value.enumerated.item[0] = in mic_fmic_source_get()
662 mutex_unlock(&chip->mutex); in mic_fmic_source_get()
669 struct oxygen *chip = ctl->private_data; in mic_fmic_source_put()
673 mutex_lock(&chip->mutex); in mic_fmic_source_put()
675 if (value->value.enumerated.item[0]) in mic_fmic_source_put()
682 mutex_unlock(&chip->mutex); in mic_fmic_source_put()
689 info->type = SNDRV_CTL_ELEM_TYPE_INTEGER; in ac97_fp_rec_volume_info()
690 info->count = 2; in ac97_fp_rec_volume_info()
691 info->value.integer.min = 0; in ac97_fp_rec_volume_info()
692 info->value.integer.max = 7; in ac97_fp_rec_volume_info()
699 struct oxygen *chip = ctl->private_data; in ac97_fp_rec_volume_get()
702 mutex_lock(&chip->mutex); in ac97_fp_rec_volume_get()
704 mutex_unlock(&chip->mutex); in ac97_fp_rec_volume_get()
705 value->value.integer.value[0] = reg & 7; in ac97_fp_rec_volume_get()
706 value->value.integer.value[1] = (reg >> 8) & 7; in ac97_fp_rec_volume_get()
713 struct oxygen *chip = ctl->private_data; in ac97_fp_rec_volume_put()
717 mutex_lock(&chip->mutex); in ac97_fp_rec_volume_put()
720 newreg = newreg | (value->value.integer.value[0] & 7); in ac97_fp_rec_volume_put()
721 newreg = newreg | ((value->value.integer.value[1] & 7) << 8); in ac97_fp_rec_volume_put()
725 mutex_unlock(&chip->mutex); in ac97_fp_rec_volume_put()
729 #define AC97_SWITCH(xname, codec, index, bitnr, invert) { \ argument
735 .private_value = ((codec) << 24) | ((invert) << 16) | \
738 #define AC97_VOLUME(xname, codec, index, stereo) { \ argument
747 .private_value = ((codec) << 24) | ((stereo) << 16) | (index), \
750 static DECLARE_TLV_DB_SCALE(monitor_db_scale, -600, 600, 0);
751 static DECLARE_TLV_DB_SCALE(ac97_db_scale, -3450, 150, 0);
754 static const struct snd_kcontrol_new controls[] = { variable
852 struct snd_kcontrol_new controls[2]; member
856 .controls = {
859 .name = "Analog Input Monitor Playback Switch",
867 .name = "Analog Input Monitor Playback Volume",
881 .controls = {
884 .name = "Analog Input Monitor Playback Switch",
892 .name = "Analog Input Monitor Playback Volume",
906 .controls = {
909 .name = "Analog Input Monitor Playback Switch",
918 .name = "Analog Input Monitor Playback Volume",
933 .controls = {
936 .name = "Analog Input Monitor Playback Switch",
945 .name = "Analog Input Monitor Playback Volume",
960 .controls = {
1021 struct oxygen *chip = ctl->private_data; in oxygen_any_ctl_free()
1024 /* I'm too lazy to write a function for each control :-) */ in oxygen_any_ctl_free()
1025 for (i = 0; i < ARRAY_SIZE(chip->controls); ++i) in oxygen_any_ctl_free()
1026 chip->controls[i] = NULL; in oxygen_any_ctl_free()
1030 const struct snd_kcontrol_new controls[], in add_controls() argument
1049 template = controls[i]; in add_controls()
1050 if (chip->model.control_filter) { in add_controls()
1051 err = chip->model.control_filter(&template); in add_controls()
1058 chip->model.dac_channels_pcm == 2) in add_controls()
1061 !(chip->model.device_config & AC97_FMIC_SWITCH)) in add_controls()
1064 !(chip->model.device_config & AC97_CD_INPUT)) in add_controls()
1067 chip->model.dac_tlv) { in add_controls()
1068 template.tlv.p = chip->model.dac_tlv; in add_controls()
1073 return -ENOMEM; in add_controls()
1074 err = snd_ctl_add(chip->card, ctl); in add_controls()
1077 j = match_string(known_ctl_names, CONTROL_COUNT, ctl->id.name); in add_controls()
1079 chip->controls[j] = ctl; in add_controls()
1080 ctl->private_free = oxygen_any_ctl_free; in add_controls()
1091 err = add_controls(chip, controls, ARRAY_SIZE(controls)); in oxygen_mixer_init()
1094 if (chip->model.device_config & PLAYBACK_1_TO_SPDIF) { in oxygen_mixer_init()
1100 if (chip->model.device_config & CAPTURE_1_FROM_SPDIF) { in oxygen_mixer_init()
1107 if (!(chip->model.device_config & monitor_controls[i].pcm_dev)) in oxygen_mixer_init()
1109 err = add_controls(chip, monitor_controls[i].controls, in oxygen_mixer_init()
1110 ARRAY_SIZE(monitor_controls[i].controls)); in oxygen_mixer_init()
1114 if (chip->has_ac97_0) { in oxygen_mixer_init()
1120 if (chip->has_ac97_1) { in oxygen_mixer_init()
1126 return chip->model.mixer_init ? chip->model.mixer_init(chip) : 0; in oxygen_mixer_init()