Lines Matching +full:sync +full:- +full:update +full:- +full:mask

1 // SPDX-License-Identifier: GPL-2.0-or-later
25 #define PCXHR_LINE_CAPTURE_LEVEL_MIN 0 /* -112.0 dB */
27 #define PCXHR_LINE_CAPTURE_ZERO_LEVEL 224 /* 0.0 dB ( 0 dBu -> 0 dBFS ) */
29 #define PCXHR_LINE_PLAYBACK_LEVEL_MIN 0 /* -104.0 dB */
31 #define PCXHR_LINE_PLAYBACK_ZERO_LEVEL 104 /* 0.0 dB ( 0 dBFS -> 0 dBu ) */
33 static const DECLARE_TLV_DB_SCALE(db_scale_analog_capture, -11200, 50, 1550);
34 static const DECLARE_TLV_DB_SCALE(db_scale_analog_playback, -10400, 100, 2400);
36 static const DECLARE_TLV_DB_SCALE(db_scale_a_hr222_capture, -11150, 50, 1600);
37 static const DECLARE_TLV_DB_SCALE(db_scale_a_hr222_playback, -2550, 50, 2400);
48 rmh.cmd[2] = chip->analog_capture_volume[channel];
51 if (chip->analog_playback_active[channel])
52 vol = chip->analog_playback_volume[channel];
56 rmh.cmd[2] = PCXHR_LINE_PLAYBACK_LEVEL_MAX - vol;
58 rmh.cmd[1] = 1 << ((2 * chip->chip_idx) + channel); /* audio mask */
60 err = pcxhr_send_msg(chip->mgr, &rmh);
62 dev_dbg(chip->card->dev,
65 chip->chip_idx, is_capture, err);
66 return -EINVAL;
79 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
80 uinfo->count = 2;
81 if (kcontrol->private_value == 0) { /* playback */
82 if (chip->mgr->is_hr_stereo) {
83 uinfo->value.integer.min =
84 HR222_LINE_PLAYBACK_LEVEL_MIN; /* -25 dB */
85 uinfo->value.integer.max =
88 uinfo->value.integer.min =
89 PCXHR_LINE_PLAYBACK_LEVEL_MIN; /*-104 dB */
90 uinfo->value.integer.max =
94 if (chip->mgr->is_hr_stereo) {
95 uinfo->value.integer.min =
96 HR222_LINE_CAPTURE_LEVEL_MIN; /*-112 dB */
97 uinfo->value.integer.max =
100 uinfo->value.integer.min =
101 PCXHR_LINE_CAPTURE_LEVEL_MIN; /*-112 dB */
102 uinfo->value.integer.max =
114 guard(mutex)(&chip->mgr->mixer_mutex);
115 if (kcontrol->private_value == 0) { /* playback */
116 ucontrol->value.integer.value[0] = chip->analog_playback_volume[0];
117 ucontrol->value.integer.value[1] = chip->analog_playback_volume[1];
119 ucontrol->value.integer.value[0] = chip->analog_capture_volume[0];
120 ucontrol->value.integer.value[1] = chip->analog_capture_volume[1];
132 guard(mutex)(&chip->mgr->mixer_mutex);
133 is_capture = (kcontrol->private_value != 0);
135 int new_volume = ucontrol->value.integer.value[i];
137 &chip->analog_capture_volume[i] :
138 &chip->analog_playback_volume[i];
140 if (chip->mgr->is_hr_stereo) {
150 if (chip->mgr->is_hr_stereo) {
163 if (chip->mgr->is_hr_stereo)
194 guard(mutex)(&chip->mgr->mixer_mutex);
195 ucontrol->value.integer.value[0] = chip->analog_playback_active[0];
196 ucontrol->value.integer.value[1] = chip->analog_playback_active[1];
206 guard(mutex)(&chip->mgr->mixer_mutex);
208 if (chip->analog_playback_active[i] !=
209 ucontrol->value.integer.value[i]) {
210 chip->analog_playback_active[i] =
211 !!ucontrol->value.integer.value[i];
213 /* update playback levels */
214 if (chip->mgr->is_hr_stereo)
232 #define PCXHR_DIGITAL_LEVEL_MIN 0x000 /* -110 dB */
236 static const DECLARE_TLV_DB_SCALE(db_scale_digital, -10975, 25, 1800);
248 struct pcxhr_pipe *pipe = &chip->playback_pipe;
251 if (chip->digital_playback_active[idx][0])
252 left = chip->digital_playback_volume[idx][0];
255 if (chip->digital_playback_active[idx][1])
256 right = chip->digital_playback_volume[idx][1];
261 /* add pipe and stream mask */
262 pcxhr_set_pipe_cmd_params(&rmh, 0, pipe->first_audio, 0, 1<<idx);
263 /* volume left->left / right->right panoramic level */
271 err = pcxhr_send_msg(chip->mgr, &rmh);
273 dev_dbg(chip->card->dev, "error update_playback_stream_level "
274 "card(%d) err(%x)\n", chip->chip_idx, err);
275 return -EINVAL;
295 pipe = &chip->capture_pipe[0];
297 pipe = &chip->playback_pipe;
300 /* add channel mask */
302 1 << (channel + pipe->first_audio));
303 /* TODO : if mask (3 << pipe->first_audio) is used, left and right
309 rmh.cmd[2] = chip->digital_capture_volume[channel];
316 rmh.cmd[2] = chip->monitoring_volume[channel] << 10;
317 if (chip->monitoring_active[channel] == 0)
322 err = pcxhr_send_msg(chip->mgr, &rmh);
324 dev_dbg(chip->card->dev,
326 chip->chip_idx, err);
327 return -EINVAL;
337 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
338 uinfo->count = 2;
339 uinfo->value.integer.min = PCXHR_DIGITAL_LEVEL_MIN; /* -109.5 dB */
340 uinfo->value.integer.max = PCXHR_DIGITAL_LEVEL_MAX; /* 18.0 dB */
349 int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); /* index */
351 int is_capture = kcontrol->private_value;
353 guard(mutex)(&chip->mgr->mixer_mutex);
355 stored_volume = chip->digital_capture_volume;
357 stored_volume = chip->digital_playback_volume[idx];
358 ucontrol->value.integer.value[0] = stored_volume[0];
359 ucontrol->value.integer.value[1] = stored_volume[1];
367 int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); /* index */
369 int is_capture = kcontrol->private_value;
373 guard(mutex)(&chip->mgr->mixer_mutex);
375 stored_volume = chip->digital_capture_volume;
377 stored_volume = chip->digital_playback_volume[idx];
379 int vol = ucontrol->value.integer.value[i];
386 if (is_capture) /* update capture volume */
390 if (!is_capture && changed) /* update playback volume */
413 int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); /* index */
415 guard(mutex)(&chip->mgr->mixer_mutex);
416 ucontrol->value.integer.value[0] = chip->digital_playback_active[idx][0];
417 ucontrol->value.integer.value[1] = chip->digital_playback_active[idx][1];
426 int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); /* index */
429 guard(mutex)(&chip->mgr->mixer_mutex);
432 if (chip->digital_playback_active[j][i] !=
433 ucontrol->value.integer.value[i]) {
434 chip->digital_playback_active[j][i] =
435 !!ucontrol->value.integer.value[i];
463 guard(mutex)(&chip->mgr->mixer_mutex);
464 ucontrol->value.integer.value[0] = chip->monitoring_volume[0];
465 ucontrol->value.integer.value[1] = chip->monitoring_volume[1];
476 guard(mutex)(&chip->mgr->mixer_mutex);
478 if (chip->monitoring_volume[i] !=
479 ucontrol->value.integer.value[i]) {
480 chip->monitoring_volume[i] =
481 ucontrol->value.integer.value[i];
482 if (chip->monitoring_active[i])
483 /* update monitoring volume and mute */
512 guard(mutex)(&chip->mgr->mixer_mutex);
513 ucontrol->value.integer.value[0] = chip->monitoring_active[0];
514 ucontrol->value.integer.value[1] = chip->monitoring_active[1];
525 guard(mutex)(&chip->mgr->mixer_mutex);
527 if (chip->monitoring_active[i] !=
528 ucontrol->value.integer.value[i]) {
529 chip->monitoring_active[i] =
530 !!ucontrol->value.integer.value[i];
531 changed |= (1<<i); /* mask 0x01 and 0x02 */
535 /* update left monitoring volume and mute */
538 /* update right monitoring volume and mute */
566 unsigned int mask, reg;
570 switch (chip->chip_idx) {
571 case 0 : mask = PCXHR_SOURCE_AUDIO01_UER; codec = CS8420_01_CS; break;
572 case 1 : mask = PCXHR_SOURCE_AUDIO23_UER; codec = CS8420_23_CS; break;
573 case 2 : mask = PCXHR_SOURCE_AUDIO45_UER; codec = CS8420_45_CS; break;
574 case 3 : mask = PCXHR_SOURCE_AUDIO67_UER; codec = CS8420_67_CS; break;
575 default: return -EINVAL;
577 if (chip->audio_capture_source != 0) {
578 reg = mask; /* audio source from digital plug */
583 pcxhr_write_io_num_reg_cont(chip->mgr, mask, reg, &changed);
587 rmh.cmd[0] |= (1 << chip->chip_idx);
588 err = pcxhr_send_msg(chip->mgr, &rmh);
592 if (chip->mgr->board_aes_in_192k) {
595 /* update all src configs with one call */
596 for (i = 0; (i < 4) && (i < chip->mgr->capture_chips); i++) {
597 if (chip->mgr->chip[i]->audio_capture_source == 2)
598 src_config |= (1 << (3 - i));
605 err = pcxhr_send_msg(chip->mgr, &rmh);
608 if (chip->audio_capture_source == 2)
617 err = pcxhr_send_msg(chip->mgr, &rmh);
622 err = pcxhr_send_msg(chip->mgr, &rmh);
637 if (chip->mgr->board_has_aes1) {
639 if (chip->mgr->board_has_mic)
649 ucontrol->value.enumerated.item[0] = chip->audio_capture_source;
659 if (chip->mgr->board_has_aes1) {
661 if (chip->mgr->board_has_mic)
664 if (ucontrol->value.enumerated.item[0] >= i)
665 return -EINVAL;
666 guard(mutex)(&chip->mgr->mixer_mutex);
667 if (chip->audio_capture_source != ucontrol->value.enumerated.item[0]) {
668 chip->audio_capture_source = ucontrol->value.enumerated.item[0];
669 if (chip->mgr->is_hr_stereo)
709 "Internal", "WordClock", "AES Sync",
713 "Internal", "AES Sync", "AES 1"
717 int clock_items = 2; /* at least Internal and AES Sync clock */
718 if (mgr->board_has_aes1) {
719 clock_items += mgr->capture_chips; /* add AES x */
720 if (!mgr->is_hr_stereo)
723 if (mgr->is_hr_stereo) {
737 ucontrol->value.enumerated.item[0] = mgr->use_clock_type;
746 unsigned int clock_items = 2; /* at least Internal and AES Sync clock */
747 if (mgr->board_has_aes1) {
748 clock_items += mgr->capture_chips; /* add AES x */
749 if (!mgr->is_hr_stereo)
752 if (ucontrol->value.enumerated.item[0] >= clock_items)
753 return -EINVAL;
754 guard(mutex)(&mgr->mixer_mutex);
755 if (mgr->use_clock_type != ucontrol->value.enumerated.item[0]) {
756 guard(mutex)(&mgr->setup_mutex);
757 mgr->use_clock_type = ucontrol->value.enumerated.item[0];
759 if (mgr->use_clock_type != PCXHR_CLOCK_TYPE_INTERNAL) {
760 pcxhr_get_external_clock(mgr, mgr->use_clock_type,
763 rate = mgr->sample_rate;
769 if (mgr->sample_rate)
770 mgr->sample_rate = rate;
793 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
794 uinfo->count = 3 + mgr->capture_chips;
795 uinfo->value.integer.min = 0; /* clock not present */
796 uinfo->value.integer.max = 192000; /* max sample rate 192 kHz */
806 guard(mutex)(&mgr->mixer_mutex);
807 for(i = 0; i < 3 + mgr->capture_chips; i++) {
809 rate = mgr->sample_rate_real;
815 ucontrol->value.integer.value[i] = rate;
834 uinfo->type = SNDRV_CTL_ELEM_TYPE_IEC958;
835 uinfo->count = 1;
848 switch (chip->chip_idx) {
849 /* instead of CS8420_01_CS use CS8416_01_CS for AES SYNC plug */
854 default: return -EINVAL;
856 if (chip->mgr->board_aes_in_192k) {
863 default: return -EINVAL;
867 /* instead of CS8420_CSB0 use CS8416_CSBx for AES SYNC plug */
873 default: return -EINVAL;
881 err = pcxhr_send_msg(chip->mgr, &rmh);
885 if (chip->mgr->board_aes_in_192k) {
896 dev_dbg(chip->card->dev, "read iec958 AES %d byte %d = 0x%x\n",
897 chip->chip_idx, aes_idx, temp);
909 guard(mutex)(&chip->mgr->mixer_mutex);
911 if (kcontrol->private_value == 0) /* playback */
912 aes_bits = chip->aes_bits[i];
914 if (chip->mgr->is_hr_stereo)
923 ucontrol->value.iec958.status[i] = aes_bits;
933 ucontrol->value.iec958.status[i] = 0xff;
942 unsigned char old_bits = chip->aes_bits[aes_idx];
947 cmd = chip->chip_idx & 0x03; /* chip index 0..3 */
948 if (chip->chip_idx > 3)
957 dev_dbg(chip->card->dev,
959 chip->chip_idx, aes_idx, i, cmd);
960 err = pcxhr_send_msg(chip->mgr, &rmh);
967 chip->aes_bits[aes_idx] = aes_bits;
978 guard(mutex)(&chip->mgr->mixer_mutex);
980 if (ucontrol->value.iec958.status[i] != chip->aes_bits[i]) {
981 if (chip->mgr->is_hr_stereo)
983 ucontrol->value.iec958.status[i]);
986 ucontrol->value.iec958.status[i]);
996 .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,MASK),
1012 .name = SNDRV_CTL_NAME_IEC958("",CAPTURE,MASK),
1030 if (chip->nb_streams_play) {
1034 chip->digital_playback_active[j][i] = 1;
1035 chip->digital_playback_volume[j][i] =
1041 chip->aes_bits[0] = (IEC958_AES0_PROFESSIONAL |
1047 chip->analog_playback_active[i] = 1;
1048 if (chip->mgr->is_hr_stereo)
1049 chip->analog_playback_volume[i] =
1052 chip->analog_playback_volume[i] =
1058 if (chip->mgr->is_hr_stereo)
1061 if (chip->nb_streams_capt) {
1063 chip->digital_capture_volume[i] =
1065 chip->analog_capture_active = 1;
1070 if (chip->mgr->is_hr_stereo)
1071 chip->analog_capture_volume[i] =
1074 chip->analog_capture_volume[i] =
1080 if (chip->mgr->is_hr_stereo)
1094 mutex_init(&mgr->mixer_mutex); /* can be in another place */
1096 for (i = 0; i < mgr->num_cards; i++) {
1098 chip = mgr->chip[i];
1100 if (chip->nb_streams_play) {
1105 if (mgr->is_hr_stereo)
1109 err = snd_ctl_add(chip->card,
1115 err = snd_ctl_add(chip->card,
1125 err = snd_ctl_add(chip->card,
1130 err = snd_ctl_add(chip->card,
1136 err = snd_ctl_add(chip->card,
1142 err = snd_ctl_add(chip->card,
1148 if (chip->nb_streams_capt) {
1153 if (mgr->is_hr_stereo)
1158 err = snd_ctl_add(chip->card,
1168 err = snd_ctl_add(chip->card,
1174 err = snd_ctl_add(chip->card,
1180 err = snd_ctl_add(chip->card,
1186 err = snd_ctl_add(chip->card,
1192 if (mgr->is_hr_stereo) {
1199 if (chip->nb_streams_capt > 0 && chip->nb_streams_play > 0) {
1201 err = snd_ctl_add(chip->card,
1206 err = snd_ctl_add(chip->card,
1214 err = snd_ctl_add(chip->card,
1221 err = snd_ctl_add(chip->card,