• Home
  • Raw
  • Download

Lines Matching +full:cs +full:- +full:dev +full:- +full:assoc

25  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
32 * - support for UAC2 effect units
33 * - support for graphical equalizers
34 * - RANGE and MEM set commands (UAC2)
35 * - RANGE and MEM interrupt dispatchers (UAC2)
36 * - audio channel clustering (UAC2)
37 * - audio sample rate converter units (UAC2)
38 * - proper handling of clock multipliers (UAC2)
39 * - dispatch clock change notifications (UAC2)
40 * - stop PCM streams which use a clock that became invalid
41 * - stop PCM streams which use a clock selector that has changed
42 * - parse available sample rates again when clock sources changed
53 #include <linux/usb/audio-v2.h>
54 #include <linux/usb/audio-v3.h>
92 /*E-mu 0202/0404/0204 eXtension Unit(XU) control*/
121 for (; p->id; p++) { in find_map()
122 if (p->id == unitid && in find_map()
123 (!control || !p->control || control == p->control)) in find_map()
133 if (!p || !p->name) in check_mapped_name()
136 buflen--; in check_mapped_name()
137 return strlcpy(buf, p->name, buflen); in check_mapped_name()
142 ((cval)->head.mixer->ignore_ctl_error ? 0 : (err))
148 if (!p || p->name || p->dB) in check_ignored_ctl()
157 if (p && p->dB) { in check_mapped_dB()
158 cval->dBmin = p->dB->min; in check_mapped_dB()
159 cval->dBmax = p->dB->max; in check_mapped_dB()
160 cval->initialized = 1; in check_mapped_dB()
170 if (!state->selector_map) in check_mapped_selector_name()
172 for (p = state->selector_map; p->id; p++) { in check_mapped_selector_name()
173 if (p->id == unitid && index < p->count) in check_mapped_selector_name()
174 return strlcpy(buf, p->names[index], buflen); in check_mapped_selector_name()
188 while ((hdr = snd_usb_find_desc(state->buffer, state->buflen, hdr, in find_audio_control_unit()
190 if (hdr->bLength >= 4 && in find_audio_control_unit()
191 hdr->bDescriptorSubtype >= UAC_INPUT_TERMINAL && in find_audio_control_unit()
192 hdr->bDescriptorSubtype <= UAC3_SAMPLE_RATE_CONVERTER && in find_audio_control_unit()
193 hdr->bUnitID == unit) in find_audio_control_unit()
206 int len = usb_string(chip->dev, index, buf, maxlen - 1); in snd_usb_copy_string_desc()
216 * convert from the byte/word on usb descriptor to the zero-based integer
220 switch (cval->val_type) { in convert_signed_value()
231 val -= 0x100; in convert_signed_value()
239 val -= 0x10000; in convert_signed_value()
246 * convert from the zero-based int to the byte/word for usb descriptor
250 switch (cval->val_type) { in convert_bytes_value()
267 if (!cval->res) in get_relative_value()
268 cval->res = 1; in get_relative_value()
269 if (val < cval->min) in get_relative_value()
271 else if (val >= cval->max) in get_relative_value()
272 return (cval->max - cval->min + cval->res - 1) / cval->res; in get_relative_value()
274 return (val - cval->min) / cval->res; in get_relative_value()
280 return cval->min; in get_abs_value()
281 if (!cval->res) in get_abs_value()
282 cval->res = 1; in get_abs_value()
283 val *= cval->res; in get_abs_value()
284 val += cval->min; in get_abs_value()
285 if (val > cval->max) in get_abs_value()
286 return cval->max; in get_abs_value()
313 struct snd_usb_audio *chip = cval->head.mixer->chip; in get_ctl_value_v1()
315 int val_len = cval->val_type >= USB_MIXER_S16 ? 2 : 1; in get_ctl_value_v1()
321 return -EIO; in get_ctl_value_v1()
323 while (timeout-- > 0) { in get_ctl_value_v1()
324 idx = snd_usb_ctrl_intf(chip) | (cval->head.id << 8); in get_ctl_value_v1()
325 err = snd_usb_ctl_msg(chip->dev, usb_rcvctrlpipe(chip->dev, 0), request, in get_ctl_value_v1()
332 } else if (err == -ETIMEDOUT) { in get_ctl_value_v1()
338 request, validx, idx, cval->val_type); in get_ctl_value_v1()
339 err = -EINVAL; in get_ctl_value_v1()
349 struct snd_usb_audio *chip = cval->head.mixer->chip; in get_ctl_value_v2()
356 val_size = uac2_ctl_value_size(cval->val_type); in get_ctl_value_v2()
368 ret = snd_usb_lock_shutdown(chip) ? -EIO : 0; in get_ctl_value_v2()
372 idx = snd_usb_ctrl_intf(chip) | (cval->head.id << 8); in get_ctl_value_v2()
373 ret = snd_usb_ctl_msg(chip->dev, usb_rcvctrlpipe(chip->dev, 0), bRequest, in get_ctl_value_v2()
382 request, validx, idx, cval->val_type); in get_ctl_value_v2()
402 return -EINVAL; in get_ctl_value_v2()
414 validx += cval->idx_off; in get_ctl_value()
416 return (cval->head.mixer->protocol == UAC_VERSION_1) ? in get_ctl_value()
432 (cval->control << 8) | channel, in get_cur_mix_raw()
441 if (cval->cached & (1 << channel)) { in snd_usb_get_cur_mix_value()
442 *value = cval->cache_val[index]; in snd_usb_get_cur_mix_value()
447 if (!cval->head.mixer->ignore_ctl_error) in snd_usb_get_cur_mix_value()
448 usb_audio_dbg(cval->head.mixer->chip, in snd_usb_get_cur_mix_value()
450 cval->control, channel, err); in snd_usb_get_cur_mix_value()
453 cval->cached |= 1 << channel; in snd_usb_get_cur_mix_value()
454 cval->cache_val[index] = *value; in snd_usb_get_cur_mix_value()
465 struct snd_usb_audio *chip = cval->head.mixer->chip; in snd_usb_mixer_set_ctl_value()
469 validx += cval->idx_off; in snd_usb_mixer_set_ctl_value()
472 if (cval->head.mixer->protocol == UAC_VERSION_1) { in snd_usb_mixer_set_ctl_value()
473 val_len = cval->val_type >= USB_MIXER_S16 ? 2 : 1; in snd_usb_mixer_set_ctl_value()
475 val_len = uac2_ctl_value_size(cval->val_type); in snd_usb_mixer_set_ctl_value()
480 return -EINVAL; in snd_usb_mixer_set_ctl_value()
494 return -EIO; in snd_usb_mixer_set_ctl_value()
496 while (timeout-- > 0) { in snd_usb_mixer_set_ctl_value()
497 idx = snd_usb_ctrl_intf(chip) | (cval->head.id << 8); in snd_usb_mixer_set_ctl_value()
498 err = snd_usb_ctl_msg(chip->dev, in snd_usb_mixer_set_ctl_value()
499 usb_sndctrlpipe(chip->dev, 0), request, in snd_usb_mixer_set_ctl_value()
505 } else if (err == -ETIMEDOUT) { in snd_usb_mixer_set_ctl_value()
510 request, validx, idx, cval->val_type, buf[0], buf[1]); in snd_usb_mixer_set_ctl_value()
511 err = -EINVAL; in snd_usb_mixer_set_ctl_value()
529 cval->master_readonly : in snd_usb_set_cur_mix_value()
530 cval->ch_readonly & (1 << (channel - 1)); in snd_usb_set_cur_mix_value()
533 usb_audio_dbg(cval->head.mixer->chip, in snd_usb_set_cur_mix_value()
535 __func__, channel, cval->control); in snd_usb_set_cur_mix_value()
540 UAC_SET_CUR, (cval->control << 8) | channel, in snd_usb_set_cur_mix_value()
544 cval->cached |= 1 << channel; in snd_usb_set_cur_mix_value()
545 cval->cache_val[index] = value; in snd_usb_set_cur_mix_value()
555 struct usb_mixer_elem_info *cval = kcontrol->private_data; in snd_usb_mixer_vol_tlv()
559 return -ENOMEM; in snd_usb_mixer_vol_tlv()
560 if (cval->min_mute) in snd_usb_mixer_vol_tlv()
562 scale[2] = cval->dBmin; in snd_usb_mixer_vol_tlv()
563 scale[3] = cval->dBmax; in snd_usb_mixer_vol_tlv()
565 return -EFAULT; in snd_usb_mixer_vol_tlv()
598 struct usb_mixer_interface *mixer = list->mixer; in snd_usb_mixer_add_list()
601 while (snd_ctl_find_id(mixer->chip->card, &kctl->id)) in snd_usb_mixer_add_list()
602 kctl->id.index++; in snd_usb_mixer_add_list()
603 err = snd_ctl_add(mixer->chip->card, kctl); in snd_usb_mixer_add_list()
605 usb_audio_dbg(mixer->chip, "cannot add control (err = %d)\n", in snd_usb_mixer_add_list()
609 list->kctl = kctl; in snd_usb_mixer_add_list()
610 list->is_std_info = is_std_info; in snd_usb_mixer_add_list()
611 list->next_id_elem = mixer->id_elems[list->id]; in snd_usb_mixer_add_list()
612 mixer->id_elems[list->id] = list; in snd_usb_mixer_add_list()
658 { 0x0712, "Multi-Track Recorder" },
669 if (iterm->name) { in get_term_name()
670 len = snd_usb_copy_string_desc(chip, iterm->name, in get_term_name()
676 /* virtual type - not a real terminal */ in get_term_name()
677 if (iterm->type >> 16) { in get_term_name()
680 switch (iterm->type >> 16) { in get_term_name()
694 return sprintf(name, "Unit %d", iterm->id); in get_term_name()
698 switch (iterm->type & 0xff00) { in get_term_name()
713 for (names = iterm_names; names->type; names++) { in get_term_name()
714 if (names->type == iterm->type) { in get_term_name()
715 strcpy(name, names->name); in get_term_name()
716 return strlen(names->name); in get_term_name()
731 err = snd_usb_ctl_msg(state->chip->dev, in get_cluster_channels_v3()
732 usb_rcvctrlpipe(state->chip->dev, 0), in get_cluster_channels_v3()
736 snd_usb_ctrl_intf(state->chip), in get_cluster_channels_v3()
741 err = -EIO; in get_cluster_channels_v3()
748 usb_audio_err(state->chip, "cannot request logical cluster ID: %d (err: %d)\n", cluster_id, err); in get_cluster_channels_v3()
760 switch (state->mixer->protocol) { in uac_mixer_unit_get_channels()
764 if (desc->bLength < sizeof(*desc) + desc->bNrInPins + 1) in uac_mixer_unit_get_channels()
765 return 0; /* no bmControls -> skip */ in uac_mixer_unit_get_channels()
789 term->type = le16_to_cpu(d->wTerminalType); in parse_term_uac1_iterm_unit()
790 term->channels = d->bNrChannels; in parse_term_uac1_iterm_unit()
791 term->chconfig = le16_to_cpu(d->wChannelConfig); in parse_term_uac1_iterm_unit()
792 term->name = d->iTerminal; in parse_term_uac1_iterm_unit()
804 err = __check_input_term(state, d->bCSourceID, term); in parse_term_uac2_iterm_unit()
811 term->id = id; in parse_term_uac2_iterm_unit()
812 term->type = le16_to_cpu(d->wTerminalType); in parse_term_uac2_iterm_unit()
813 term->channels = d->bNrChannels; in parse_term_uac2_iterm_unit()
814 term->chconfig = le32_to_cpu(d->bmChannelConfig); in parse_term_uac2_iterm_unit()
815 term->name = d->iTerminal; in parse_term_uac2_iterm_unit()
827 err = __check_input_term(state, d->bCSourceID, term); in parse_term_uac3_iterm_unit()
834 term->id = id; in parse_term_uac3_iterm_unit()
835 term->type = le16_to_cpu(d->wTerminalType); in parse_term_uac3_iterm_unit()
837 err = get_cluster_channels_v3(state, le16_to_cpu(d->wClusterDescrID)); in parse_term_uac3_iterm_unit()
840 term->channels = err; in parse_term_uac3_iterm_unit()
843 term->chconfig = 0; in parse_term_uac3_iterm_unit()
845 term->name = le16_to_cpu(d->wTerminalDescrStr); in parse_term_uac3_iterm_unit()
854 int protocol = state->mixer->protocol; in parse_term_mixer_unit()
861 term->type = UAC3_MIXER_UNIT << 16; /* virtual type */ in parse_term_mixer_unit()
862 term->channels = err; in parse_term_mixer_unit()
864 term->chconfig = uac_mixer_unit_wChannelConfig(d, protocol); in parse_term_mixer_unit()
865 term->name = uac_mixer_unit_iMixer(d); in parse_term_mixer_unit()
878 err = __check_input_term(state, d->baSourceID[0], term); in parse_term_selector_unit()
881 term->type = UAC3_SELECTOR_UNIT << 16; /* virtual type */ in parse_term_selector_unit()
882 term->id = id; in parse_term_selector_unit()
883 if (state->mixer->protocol != UAC_VERSION_3) in parse_term_selector_unit()
884 term->name = uac_selector_unit_iSelector(d); in parse_term_selector_unit()
893 int protocol = state->mixer->protocol; in parse_term_proc_unit()
896 if (d->bNrInPins) { in parse_term_proc_unit()
898 err = __check_input_term(state, d->baSourceID[0], term); in parse_term_proc_unit()
903 term->type = vtype << 16; /* virtual type */ in parse_term_proc_unit()
904 term->id = id; in parse_term_proc_unit()
909 if (!term->channels) { in parse_term_proc_unit()
910 term->channels = uac_processing_unit_bNrChannels(d); in parse_term_proc_unit()
911 term->chconfig = uac_processing_unit_wChannelConfig(d, protocol); in parse_term_proc_unit()
913 term->name = uac_processing_unit_iProcessing(d, protocol); in parse_term_proc_unit()
921 term->type = UAC3_EFFECT_UNIT << 16; /* virtual type */ in parse_term_effect_unit()
922 term->id = id; in parse_term_effect_unit()
932 term->type = UAC3_CLOCK_SOURCE << 16; /* virtual type */ in parse_term_uac2_clock_source()
933 term->id = id; in parse_term_uac2_clock_source()
934 term->name = d->iClockSource; in parse_term_uac2_clock_source()
944 term->type = UAC3_CLOCK_SOURCE << 16; /* virtual type */ in parse_term_uac3_clock_source()
945 term->id = id; in parse_term_uac3_clock_source()
946 term->name = le16_to_cpu(d->wClockSourceStr); in parse_term_uac3_clock_source()
959 int protocol = state->mixer->protocol; in __check_input_term()
965 if (test_and_set_bit(id, state->termbitmap)) in __check_input_term()
966 return -EINVAL; in __check_input_term()
975 term->id = id; in __check_input_term()
984 id = d->bSourceID; in __check_input_term()
1021 return -ENODEV; in __check_input_term()
1024 return -ENODEV; in __check_input_term()
1032 memset(state->termbitmap, 0, sizeof(state->termbitmap)); in check_input_term()
1045 int type_uac2; /* data type for uac2 if different from uac1, else -1 */
1049 { UAC_FU_MUTE, "Mute", USB_MIXER_INV_BOOLEAN, -1 },
1050 { UAC_FU_VOLUME, "Volume", USB_MIXER_S16, -1 },
1051 { UAC_FU_BASS, "Tone Control - Bass", USB_MIXER_S8, -1 },
1052 { UAC_FU_MID, "Tone Control - Mid", USB_MIXER_S8, -1 },
1053 { UAC_FU_TREBLE, "Tone Control - Treble", USB_MIXER_S8, -1 },
1054 …{ UAC_FU_GRAPHIC_EQUALIZER, "Graphic Equalizer", USB_MIXER_S8, -1 }, /* FIXME: not implemented yet…
1055 { UAC_FU_AUTOMATIC_GAIN, "Auto Gain Control", USB_MIXER_BOOLEAN, -1 },
1057 { UAC_FU_BASS_BOOST, "Bass Boost", USB_MIXER_BOOLEAN, -1 },
1058 { UAC_FU_LOUDNESS, "Loudness", USB_MIXER_BOOLEAN, -1 },
1060 { UAC2_FU_INPUT_GAIN, "Input Gain Control", USB_MIXER_S16, -1 },
1061 { UAC2_FU_INPUT_GAIN_PAD, "Input Gain Pad Control", USB_MIXER_S16, -1 },
1062 { UAC2_FU_PHASE_INVERTER, "Phase Inverter Control", USB_MIXER_BOOLEAN, -1 },
1073 usb_mixer_elem_info_free(kctl->private_data); in snd_usb_mixer_elem_free()
1074 kctl->private_data = NULL; in snd_usb_mixer_elem_free()
1085 struct snd_usb_audio *chip = cval->head.mixer->chip; in volume_control_quirks()
1086 switch (chip->usb_id) { in volume_control_quirks()
1087 case USB_ID(0x0763, 0x2030): /* M-Audio Fast Track C400 */ in volume_control_quirks()
1088 case USB_ID(0x0763, 0x2031): /* M-Audio Fast Track C600 */ in volume_control_quirks()
1089 if (strcmp(kctl->id.name, "Effect Duration") == 0) { in volume_control_quirks()
1090 cval->min = 0x0000; in volume_control_quirks()
1091 cval->max = 0xffff; in volume_control_quirks()
1092 cval->res = 0x00e6; in volume_control_quirks()
1095 if (strcmp(kctl->id.name, "Effect Volume") == 0 || in volume_control_quirks()
1096 strcmp(kctl->id.name, "Effect Feedback Volume") == 0) { in volume_control_quirks()
1097 cval->min = 0x00; in volume_control_quirks()
1098 cval->max = 0xff; in volume_control_quirks()
1101 if (strstr(kctl->id.name, "Effect Return") != NULL) { in volume_control_quirks()
1102 cval->min = 0xb706; in volume_control_quirks()
1103 cval->max = 0xff7b; in volume_control_quirks()
1104 cval->res = 0x0073; in volume_control_quirks()
1107 if ((strstr(kctl->id.name, "Playback Volume") != NULL) || in volume_control_quirks()
1108 (strstr(kctl->id.name, "Effect Send") != NULL)) { in volume_control_quirks()
1109 cval->min = 0xb5fb; /* -73 dB = 0xb6ff */ in volume_control_quirks()
1110 cval->max = 0xfcfe; in volume_control_quirks()
1111 cval->res = 0x0073; in volume_control_quirks()
1115 case USB_ID(0x0763, 0x2081): /* M-Audio Fast Track Ultra 8R */ in volume_control_quirks()
1116 case USB_ID(0x0763, 0x2080): /* M-Audio Fast Track Ultra */ in volume_control_quirks()
1117 if (strcmp(kctl->id.name, "Effect Duration") == 0) { in volume_control_quirks()
1120 cval->min = 0x0000; in volume_control_quirks()
1121 cval->max = 0x7f00; in volume_control_quirks()
1122 cval->res = 0x0100; in volume_control_quirks()
1125 if (strcmp(kctl->id.name, "Effect Volume") == 0 || in volume_control_quirks()
1126 strcmp(kctl->id.name, "Effect Feedback Volume") == 0) { in volume_control_quirks()
1129 cval->min = 0x00; in volume_control_quirks()
1130 cval->max = 0x7f; in volume_control_quirks()
1136 if (!strcmp(kctl->id.name, "PCM Playback Volume")) { in volume_control_quirks()
1138 "set volume quirk for CM102-A+/102S+\n"); in volume_control_quirks()
1139 cval->min = -256; in volume_control_quirks()
1150 * I hope that the min value is -15360 for newer firmware --jk in volume_control_quirks()
1152 if (!strcmp(kctl->id.name, "PCM Playback Volume") && in volume_control_quirks()
1153 cval->min == -15616) { in volume_control_quirks()
1156 cval->max = -256; in volume_control_quirks()
1161 if (!strcmp(kctl->id.name, "Mic Capture Volume")) { in volume_control_quirks()
1164 cval->min = 6080; in volume_control_quirks()
1165 cval->max = 8768; in volume_control_quirks()
1166 cval->res = 192; in volume_control_quirks()
1183 * Probably there is some logitech magic behind this number --fishor in volume_control_quirks()
1185 if (!strcmp(kctl->id.name, "Mic Capture Volume")) { in volume_control_quirks()
1187 "set resolution quirk: cval->res = 384\n"); in volume_control_quirks()
1188 cval->res = 384; in volume_control_quirks()
1192 if ((strstr(kctl->id.name, "Playback Volume") != NULL) || in volume_control_quirks()
1193 strstr(kctl->id.name, "Capture Volume") != NULL) { in volume_control_quirks()
1194 cval->min >>= 8; in volume_control_quirks()
1195 cval->max = 0; in volume_control_quirks()
1196 cval->res = 1; in volume_control_quirks()
1209 cval->min = default_min; in get_min_max_with_quirks()
1210 cval->max = cval->min + 1; in get_min_max_with_quirks()
1211 cval->res = 1; in get_min_max_with_quirks()
1212 cval->dBmin = cval->dBmax = 0; in get_min_max_with_quirks()
1214 if (cval->val_type == USB_MIXER_BOOLEAN || in get_min_max_with_quirks()
1215 cval->val_type == USB_MIXER_INV_BOOLEAN) { in get_min_max_with_quirks()
1216 cval->initialized = 1; in get_min_max_with_quirks()
1219 if (cval->cmask) { in get_min_max_with_quirks()
1222 if (cval->cmask & (1 << i)) { in get_min_max_with_quirks()
1227 if (get_ctl_value(cval, UAC_GET_MAX, (cval->control << 8) | minchn, &cval->max) < 0 || in get_min_max_with_quirks()
1228 get_ctl_value(cval, UAC_GET_MIN, (cval->control << 8) | minchn, &cval->min) < 0) { in get_min_max_with_quirks()
1229 usb_audio_err(cval->head.mixer->chip, in get_min_max_with_quirks()
1231 cval->head.id, snd_usb_ctrl_intf(cval->head.mixer->chip), in get_min_max_with_quirks()
1232 cval->control, cval->head.id); in get_min_max_with_quirks()
1233 return -EINVAL; in get_min_max_with_quirks()
1236 (cval->control << 8) | minchn, in get_min_max_with_quirks()
1237 &cval->res) < 0) { in get_min_max_with_quirks()
1238 cval->res = 1; in get_min_max_with_quirks()
1240 int last_valid_res = cval->res; in get_min_max_with_quirks()
1242 while (cval->res > 1) { in get_min_max_with_quirks()
1244 (cval->control << 8) | minchn, in get_min_max_with_quirks()
1245 cval->res / 2) < 0) in get_min_max_with_quirks()
1247 cval->res /= 2; in get_min_max_with_quirks()
1250 (cval->control << 8) | minchn, &cval->res) < 0) in get_min_max_with_quirks()
1251 cval->res = last_valid_res; in get_min_max_with_quirks()
1253 if (cval->res == 0) in get_min_max_with_quirks()
1254 cval->res = 1; in get_min_max_with_quirks()
1262 if (cval->min + cval->res < cval->max) { in get_min_max_with_quirks()
1263 int last_valid_res = cval->res; in get_min_max_with_quirks()
1269 if (test < cval->max) in get_min_max_with_quirks()
1270 test += cval->res; in get_min_max_with_quirks()
1272 test -= cval->res; in get_min_max_with_quirks()
1273 if (test < cval->min || test > cval->max || in get_min_max_with_quirks()
1276 cval->res = last_valid_res; in get_min_max_with_quirks()
1281 cval->res *= 2; in get_min_max_with_quirks()
1287 cval->initialized = 1; in get_min_max_with_quirks()
1296 cval->dBmin = (convert_signed_value(cval, cval->min) * 100) / 256; in get_min_max_with_quirks()
1297 cval->dBmax = (convert_signed_value(cval, cval->max) * 100) / 256; in get_min_max_with_quirks()
1298 if (cval->dBmin > cval->dBmax) { in get_min_max_with_quirks()
1300 if (cval->dBmin < 0) in get_min_max_with_quirks()
1301 cval->dBmax = 0; in get_min_max_with_quirks()
1302 else if (cval->dBmin > 0) in get_min_max_with_quirks()
1303 cval->dBmin = 0; in get_min_max_with_quirks()
1304 if (cval->dBmin > cval->dBmax) { in get_min_max_with_quirks()
1306 return -EINVAL; in get_min_max_with_quirks()
1319 struct usb_mixer_elem_info *cval = kcontrol->private_data; in mixer_ctl_feature_info()
1321 if (cval->val_type == USB_MIXER_BOOLEAN || in mixer_ctl_feature_info()
1322 cval->val_type == USB_MIXER_INV_BOOLEAN) in mixer_ctl_feature_info()
1323 uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; in mixer_ctl_feature_info()
1325 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; in mixer_ctl_feature_info()
1326 uinfo->count = cval->channels; in mixer_ctl_feature_info()
1327 if (cval->val_type == USB_MIXER_BOOLEAN || in mixer_ctl_feature_info()
1328 cval->val_type == USB_MIXER_INV_BOOLEAN) { in mixer_ctl_feature_info()
1329 uinfo->value.integer.min = 0; in mixer_ctl_feature_info()
1330 uinfo->value.integer.max = 1; in mixer_ctl_feature_info()
1332 if (!cval->initialized) { in mixer_ctl_feature_info()
1334 if (cval->initialized && cval->dBmin >= cval->dBmax) { in mixer_ctl_feature_info()
1335 kcontrol->vd[0].access &= in mixer_ctl_feature_info()
1338 snd_ctl_notify(cval->head.mixer->chip->card, in mixer_ctl_feature_info()
1340 &kcontrol->id); in mixer_ctl_feature_info()
1343 uinfo->value.integer.min = 0; in mixer_ctl_feature_info()
1344 uinfo->value.integer.max = in mixer_ctl_feature_info()
1345 (cval->max - cval->min + cval->res - 1) / cval->res; in mixer_ctl_feature_info()
1354 struct usb_mixer_elem_info *cval = kcontrol->private_data; in mixer_ctl_feature_get()
1357 ucontrol->value.integer.value[0] = cval->min; in mixer_ctl_feature_get()
1358 if (cval->cmask) { in mixer_ctl_feature_get()
1361 if (!(cval->cmask & (1 << c))) in mixer_ctl_feature_get()
1367 ucontrol->value.integer.value[cnt] = val; in mixer_ctl_feature_get()
1377 ucontrol->value.integer.value[0] = val; in mixer_ctl_feature_get()
1386 struct usb_mixer_elem_info *cval = kcontrol->private_data; in mixer_ctl_feature_put()
1390 if (cval->cmask) { in mixer_ctl_feature_put()
1393 if (!(cval->cmask & (1 << c))) in mixer_ctl_feature_put()
1398 val = ucontrol->value.integer.value[cnt]; in mixer_ctl_feature_put()
1411 val = ucontrol->value.integer.value[0]; in mixer_ctl_feature_put()
1425 struct usb_mixer_elem_info *cval = kcontrol->private_data; in mixer_ctl_master_bool_get()
1432 ucontrol->value.integer.value[0] = val; in mixer_ctl_master_bool_get()
1440 struct usb_mixer_elem_info *cval = kcontrol->private_data; in mixer_ctl_connector_get()
1441 struct snd_usb_audio *chip = cval->head.mixer->chip; in mixer_ctl_connector_get()
1444 validx = cval->control << 8 | 0; in mixer_ctl_connector_get()
1446 ret = snd_usb_lock_shutdown(chip) ? -EIO : 0; in mixer_ctl_connector_get()
1450 idx = snd_usb_ctrl_intf(chip) | (cval->head.id << 8); in mixer_ctl_connector_get()
1451 if (cval->head.mixer->protocol == UAC_VERSION_2) { in mixer_ctl_connector_get()
1454 ret = snd_usb_ctl_msg(chip->dev, usb_rcvctrlpipe(chip->dev, 0), UAC2_CS_CUR, in mixer_ctl_connector_get()
1461 ret = snd_usb_ctl_msg(chip->dev, usb_rcvctrlpipe(chip->dev, 0), UAC2_CS_CUR, in mixer_ctl_connector_get()
1473 UAC_GET_CUR, validx, idx, cval->val_type); in mixer_ctl_connector_get()
1477 ucontrol->value.integer.value[0] = val; in mixer_ctl_connector_get()
1489 /* the read-only variant */
1531 return strlcat(kctl->id.name, str, sizeof(kctl->id.name)); in append_ctl_name()
1547 if (strcmp("Speaker", kctl->id.name)) in check_no_speaker_on_headset()
1551 if (strstr(card->shortname, *s)) { in check_no_speaker_on_headset()
1559 strlcpy(kctl->id.name, "Headphone", sizeof(kctl->id.name)); in check_no_speaker_on_headset()
1600 snd_usb_mixer_elem_init_std(&cval->head, mixer, unitid); in __build_feature_ctl()
1601 cval->control = control; in __build_feature_ctl()
1602 cval->cmask = ctl_mask; in __build_feature_ctl()
1609 if (mixer->protocol == UAC_VERSION_1) in __build_feature_ctl()
1610 cval->val_type = ctl_info->type; in __build_feature_ctl()
1612 cval->val_type = ctl_info->type_uac2 >= 0 ? in __build_feature_ctl()
1613 ctl_info->type_uac2 : ctl_info->type; in __build_feature_ctl()
1616 cval->channels = 1; /* master channel */ in __build_feature_ctl()
1617 cval->master_readonly = readonly_mask; in __build_feature_ctl()
1623 cval->channels = c; in __build_feature_ctl()
1624 cval->ch_readonly = readonly_mask; in __build_feature_ctl()
1628 * If all channels in the mask are marked read-only, make the control in __build_feature_ctl()
1629 * read-only. snd_usb_set_cur_mix_value() will check the mask again and won't in __build_feature_ctl()
1630 * issue write commands to read-only channels. in __build_feature_ctl()
1632 if (cval->channels == readonly_mask) in __build_feature_ctl()
1638 usb_audio_err(mixer->chip, "cannot malloc kcontrol\n"); in __build_feature_ctl()
1642 kctl->private_free = snd_usb_mixer_elem_free; in __build_feature_ctl()
1644 len = check_mapped_name(map, kctl->id.name, sizeof(kctl->id.name)); in __build_feature_ctl()
1647 len = snd_usb_copy_string_desc(mixer->chip, nameid, in __build_feature_ctl()
1648 kctl->id.name, sizeof(kctl->id.name)); in __build_feature_ctl()
1655 * - if a name id is given in descriptor, use it. in __build_feature_ctl()
1656 * - if the connected input can be determined, then use the name in __build_feature_ctl()
1658 * - if the connected output can be determined, use it. in __build_feature_ctl()
1659 * - otherwise, anonymous name. in __build_feature_ctl()
1663 len = get_term_name(mixer->chip, iterm, in __build_feature_ctl()
1664 kctl->id.name, in __build_feature_ctl()
1665 sizeof(kctl->id.name), 1); in __build_feature_ctl()
1667 len = get_term_name(mixer->chip, oterm, in __build_feature_ctl()
1668 kctl->id.name, in __build_feature_ctl()
1669 sizeof(kctl->id.name), 1); in __build_feature_ctl()
1671 snprintf(kctl->id.name, sizeof(kctl->id.name), in __build_feature_ctl()
1676 check_no_speaker_on_headset(kctl, mixer->chip->card); in __build_feature_ctl()
1683 if (!mapped_name && oterm && !(oterm->type >> 16)) { in __build_feature_ctl()
1684 if ((oterm->type & 0xff00) == 0x0100) in __build_feature_ctl()
1694 strlcpy(kctl->id.name, audio_feature_info[control-1].name, in __build_feature_ctl()
1695 sizeof(kctl->id.name)); in __build_feature_ctl()
1703 if (cval->max <= cval->min) { in __build_feature_ctl()
1704 usb_audio_dbg(mixer->chip, in __build_feature_ctl()
1706 cval->head.id, kctl->id.name); in __build_feature_ctl()
1714 if (cval->dBmin < cval->dBmax || !cval->initialized) { in __build_feature_ctl()
1715 kctl->tlv.c = snd_usb_mixer_vol_tlv; in __build_feature_ctl()
1716 kctl->vd[0].access |= in __build_feature_ctl()
1724 range = (cval->max - cval->min) / cval->res; in __build_feature_ctl()
1731 usb_audio_warn(mixer->chip, in __build_feature_ctl()
1732 "Warning! Unlikely big volume range (=%u), cval->res is probably wrong.", in __build_feature_ctl()
1734 usb_audio_warn(mixer->chip, in __build_feature_ctl()
1736 cval->head.id, kctl->id.name, cval->channels, in __build_feature_ctl()
1737 cval->min, cval->max, cval->res); in __build_feature_ctl()
1740 usb_audio_dbg(mixer->chip, "[%d] FU [%s] ch = %d, val = %d/%d/%d\n", in __build_feature_ctl()
1741 cval->head.id, kctl->id.name, cval->channels, in __build_feature_ctl()
1742 cval->min, cval->max, cval->res); in __build_feature_ctl()
1743 snd_usb_mixer_add_control(&cval->head, kctl); in __build_feature_ctl()
1754 __build_feature_ctl(state->mixer, state->map, ctl_mask, control, in build_feature_ctl()
1755 iterm, &state->oterm, unitid, nameid, readonly_mask); in build_feature_ctl()
1770 int name_len = get_term_name(mixer->chip, term, name, name_size, 0); in get_connector_control_name()
1781 strlcat(name, " - Input Jack", name_size); in get_connector_control_name()
1783 strlcat(name, " - Output Jack", name_size); in get_connector_control_name()
1786 /* Build a mixer control for a UAC connector control (jack-detect) */
1795 map = find_map(imap, term->id, 0); in build_connector_control()
1802 snd_usb_mixer_elem_init_std(&cval->head, mixer, term->id); in build_connector_control()
1813 if (mixer->protocol == UAC_VERSION_2) in build_connector_control()
1814 cval->control = UAC2_TE_CONNECTOR; in build_connector_control()
1816 cval->control = UAC3_TE_INSERTION; in build_connector_control()
1818 cval->val_type = USB_MIXER_BOOLEAN; in build_connector_control()
1819 cval->channels = 1; /* report true if any channel is connected */ in build_connector_control()
1820 cval->min = 0; in build_connector_control()
1821 cval->max = 1; in build_connector_control()
1824 usb_audio_err(mixer->chip, "cannot malloc kcontrol\n"); in build_connector_control()
1829 if (check_mapped_name(map, kctl->id.name, sizeof(kctl->id.name))) in build_connector_control()
1830 strlcat(kctl->id.name, " Jack", sizeof(kctl->id.name)); in build_connector_control()
1832 get_connector_control_name(mixer, term, is_input, kctl->id.name, in build_connector_control()
1833 sizeof(kctl->id.name)); in build_connector_control()
1834 kctl->private_free = snd_usb_mixer_elem_free; in build_connector_control()
1835 snd_usb_mixer_add_control(&cval->head, kctl); in build_connector_control()
1847 if (state->mixer->protocol != UAC_VERSION_2) in parse_clock_source_unit()
1848 return -EINVAL; in parse_clock_source_unit()
1854 if (!uac_v2v3_control_is_readable(hdr->bmControls, in parse_clock_source_unit()
1860 return -ENOMEM; in parse_clock_source_unit()
1862 snd_usb_mixer_elem_init_std(&cval->head, state->mixer, hdr->bClockID); in parse_clock_source_unit()
1864 cval->min = 0; in parse_clock_source_unit()
1865 cval->max = 1; in parse_clock_source_unit()
1866 cval->channels = 1; in parse_clock_source_unit()
1867 cval->val_type = USB_MIXER_BOOLEAN; in parse_clock_source_unit()
1868 cval->control = UAC2_CS_CONTROL_CLOCK_VALID; in parse_clock_source_unit()
1870 cval->master_readonly = 1; in parse_clock_source_unit()
1876 return -ENOMEM; in parse_clock_source_unit()
1879 kctl->private_free = snd_usb_mixer_elem_free; in parse_clock_source_unit()
1880 ret = snd_usb_copy_string_desc(state->chip, hdr->iClockSource, in parse_clock_source_unit()
1883 snprintf(kctl->id.name, sizeof(kctl->id.name), in parse_clock_source_unit()
1886 snprintf(kctl->id.name, sizeof(kctl->id.name), in parse_clock_source_unit()
1887 "Clock Source %d Validity", hdr->bClockID); in parse_clock_source_unit()
1889 return snd_usb_mixer_add_control(&cval->head, kctl); in parse_clock_source_unit()
1907 if (state->mixer->protocol == UAC_VERSION_1) { in parse_audio_feature_unit()
1908 csize = hdr->bControlSize; in parse_audio_feature_unit()
1909 channels = (hdr->bLength - 7) / csize - 1; in parse_audio_feature_unit()
1910 bmaControls = hdr->bmaControls; in parse_audio_feature_unit()
1911 } else if (state->mixer->protocol == UAC_VERSION_2) { in parse_audio_feature_unit()
1914 channels = (hdr->bLength - 6) / 4 - 1; in parse_audio_feature_unit()
1915 bmaControls = ftr->bmaControls; in parse_audio_feature_unit()
1920 channels = (ftr->bLength - 7) / 4 - 1; in parse_audio_feature_unit()
1921 bmaControls = ftr->bmaControls; in parse_audio_feature_unit()
1925 err = parse_audio_unit(state, hdr->bSourceID); in parse_audio_feature_unit()
1930 err = check_input_term(state, hdr->bSourceID, &iterm); in parse_audio_feature_unit()
1936 switch (state->chip->usb_id) { in parse_audio_feature_unit()
1938 usb_audio_info(state->chip, in parse_audio_feature_unit()
1940 /* disable non-functional volume control */ in parse_audio_feature_unit()
1944 usb_audio_info(state->chip, in parse_audio_feature_unit()
1946 /* disable non-functional volume control */ in parse_audio_feature_unit()
1956 if (state->mixer->protocol == UAC_VERSION_1) { in parse_audio_feature_unit()
1970 /* audio class v1 controls are never read-only */ in parse_audio_feature_unit()
2003 * read-only if all channels are marked read-only in in parse_audio_feature_unit()
2006 * actually issue a write command for read-only in parse_audio_feature_unit()
2073 map = find_map(state->map, unitid, 0); in build_mixer_unit_ctl()
2081 snd_usb_mixer_elem_init_std(&cval->head, state->mixer, unitid); in build_mixer_unit_ctl()
2082 cval->control = in_ch + 1; /* based on 1 */ in build_mixer_unit_ctl()
2083 cval->val_type = USB_MIXER_S16; in build_mixer_unit_ctl()
2085 __u8 *c = uac_mixer_unit_bmControls(desc, state->mixer->protocol); in build_mixer_unit_ctl()
2088 cval->cmask |= (1 << i); in build_mixer_unit_ctl()
2089 cval->channels++; in build_mixer_unit_ctl()
2098 usb_audio_err(state->chip, "cannot malloc kcontrol\n"); in build_mixer_unit_ctl()
2102 kctl->private_free = snd_usb_mixer_elem_free; in build_mixer_unit_ctl()
2104 len = check_mapped_name(map, kctl->id.name, sizeof(kctl->id.name)); in build_mixer_unit_ctl()
2106 len = get_term_name(state->chip, iterm, kctl->id.name, in build_mixer_unit_ctl()
2107 sizeof(kctl->id.name), 0); in build_mixer_unit_ctl()
2109 len = sprintf(kctl->id.name, "Mixer Source %d", in_ch + 1); in build_mixer_unit_ctl()
2112 usb_audio_dbg(state->chip, "[%d] MU [%s] ch = %d, val = %d/%d\n", in build_mixer_unit_ctl()
2113 cval->head.id, kctl->id.name, cval->channels, cval->min, cval->max); in build_mixer_unit_ctl()
2114 snd_usb_mixer_add_control(&cval->head, kctl); in build_mixer_unit_ctl()
2123 if (state->mixer->protocol == UAC_VERSION_2) { in parse_audio_input_terminal()
2126 term_id = d_v2->bTerminalID; in parse_audio_input_terminal()
2127 bmctls = le16_to_cpu(d_v2->bmControls); in parse_audio_input_terminal()
2128 } else if (state->mixer->protocol == UAC_VERSION_3) { in parse_audio_input_terminal()
2131 term_id = d_v3->bTerminalID; in parse_audio_input_terminal()
2132 bmctls = le32_to_cpu(d_v3->bmControls); in parse_audio_input_terminal()
2142 build_connector_control(state->mixer, state->map, &iterm, true); in parse_audio_input_terminal()
2160 usb_audio_err(state->chip, in parse_audio_mixer_unit()
2167 input_pins = desc->bNrInPins; in parse_audio_mixer_unit()
2172 err = parse_audio_unit(state, desc->baSourceID[pin]); in parse_audio_mixer_unit()
2175 /* no bmControls field (e.g. Maya44) -> ignore */ in parse_audio_mixer_unit()
2178 err = check_input_term(state, desc->baSourceID[pin], &iterm); in parse_audio_mixer_unit()
2182 if (mixer_bitmap_overflow(desc, state->mixer->protocol, in parse_audio_mixer_unit()
2190 state->mixer->protocol); in parse_audio_mixer_unit()
2213 struct usb_mixer_elem_info *cval = kcontrol->private_data; in mixer_ctl_procunit_get()
2216 err = get_cur_ctl_value(cval, cval->control << 8, &val); in mixer_ctl_procunit_get()
2218 ucontrol->value.integer.value[0] = cval->min; in mixer_ctl_procunit_get()
2222 ucontrol->value.integer.value[0] = val; in mixer_ctl_procunit_get()
2230 struct usb_mixer_elem_info *cval = kcontrol->private_data; in mixer_ctl_procunit_put()
2233 err = get_cur_ctl_value(cval, cval->control << 8, &oval); in mixer_ctl_procunit_put()
2236 val = ucontrol->value.integer.value[0]; in mixer_ctl_procunit_put()
2239 set_cur_ctl_value(cval, cval->control << 8, val); in mixer_ctl_procunit_put()
2336 { UAC3_PROCESS_MULTI_FUNCTION, "Multi-Function", undefined_proc_info },
2392 num_ins = desc->bNrInPins; in build_audio_procunit()
2394 err = parse_audio_unit(state, desc->baSourceID[i]); in build_audio_procunit()
2399 type = le16_to_cpu(desc->wProcessType); in build_audio_procunit()
2400 for (info = list; info && info->type; info++) in build_audio_procunit()
2401 if (info->type == type) in build_audio_procunit()
2403 if (!info || !info->type) in build_audio_procunit()
2406 for (valinfo = info->values; valinfo->control; valinfo++) { in build_audio_procunit()
2407 __u8 *controls = uac_processing_unit_bmControls(desc, state->mixer->protocol); in build_audio_procunit()
2409 if (state->mixer->protocol == UAC_VERSION_1) { in build_audio_procunit()
2410 if (!(controls[valinfo->control / 8] & in build_audio_procunit()
2411 (1 << ((valinfo->control % 8) - 1)))) in build_audio_procunit()
2414 if (!uac_v2v3_control_is_readable(controls[valinfo->control / 8], in build_audio_procunit()
2415 valinfo->control)) in build_audio_procunit()
2419 map = find_map(state->map, unitid, valinfo->control); in build_audio_procunit()
2424 return -ENOMEM; in build_audio_procunit()
2425 snd_usb_mixer_elem_init_std(&cval->head, state->mixer, unitid); in build_audio_procunit()
2426 cval->control = valinfo->control; in build_audio_procunit()
2427 cval->val_type = valinfo->val_type; in build_audio_procunit()
2428 cval->channels = 1; in build_audio_procunit()
2430 if (state->mixer->protocol > UAC_VERSION_1 && in build_audio_procunit()
2431 !uac_v2v3_control_is_writeable(controls[valinfo->control / 8], in build_audio_procunit()
2432 valinfo->control)) in build_audio_procunit()
2433 cval->master_readonly = 1; in build_audio_procunit()
2440 switch (state->mixer->protocol) { in build_audio_procunit()
2444 if (cval->control == UAC_UD_MODE_SELECT) in build_audio_procunit()
2448 if (cval->control == UAC3_UD_MODE_SELECT) in build_audio_procunit()
2455 state->mixer->protocol); in build_audio_procunit()
2456 cval->min = 1; in build_audio_procunit()
2457 cval->max = control_spec[0]; in build_audio_procunit()
2458 cval->res = 1; in build_audio_procunit()
2459 cval->initialized = 1; in build_audio_procunit()
2463 get_min_max(cval, valinfo->min_value); in build_audio_procunit()
2468 * E-Mu USB 0404/0202/TrackerPre/0204 in build_audio_procunit()
2471 cval->min = 0; in build_audio_procunit()
2472 cval->max = 5; in build_audio_procunit()
2473 cval->res = 1; in build_audio_procunit()
2474 cval->initialized = 1; in build_audio_procunit()
2477 get_min_max(cval, valinfo->min_value); in build_audio_procunit()
2484 return -ENOMEM; in build_audio_procunit()
2486 kctl->private_free = snd_usb_mixer_elem_free; in build_audio_procunit()
2488 if (check_mapped_name(map, kctl->id.name, sizeof(kctl->id.name))) { in build_audio_procunit()
2490 } else if (info->name) { in build_audio_procunit()
2491 strlcpy(kctl->id.name, info->name, sizeof(kctl->id.name)); in build_audio_procunit()
2494 nameid = uac_extension_unit_iExtension(desc, state->mixer->protocol); in build_audio_procunit()
2496 nameid = uac_processing_unit_iProcessing(desc, state->mixer->protocol); in build_audio_procunit()
2499 len = snd_usb_copy_string_desc(state->chip, in build_audio_procunit()
2501 kctl->id.name, in build_audio_procunit()
2502 sizeof(kctl->id.name)); in build_audio_procunit()
2504 strlcpy(kctl->id.name, name, sizeof(kctl->id.name)); in build_audio_procunit()
2507 append_ctl_name(kctl, valinfo->suffix); in build_audio_procunit()
2509 usb_audio_dbg(state->chip, in build_audio_procunit()
2511 cval->head.id, kctl->id.name, cval->channels, in build_audio_procunit()
2512 cval->min, cval->max); in build_audio_procunit()
2514 err = snd_usb_mixer_add_control(&cval->head, kctl); in build_audio_procunit()
2524 switch (state->mixer->protocol) { in parse_audio_processing_unit()
2557 struct usb_mixer_elem_info *cval = kcontrol->private_data; in mixer_ctl_selector_info()
2558 const char **itemlist = (const char **)kcontrol->private_value; in mixer_ctl_selector_info()
2561 return -EINVAL; in mixer_ctl_selector_info()
2562 return snd_ctl_enum_info(uinfo, 1, cval->max, itemlist); in mixer_ctl_selector_info()
2569 struct usb_mixer_elem_info *cval = kcontrol->private_data; in mixer_ctl_selector_get()
2572 err = get_cur_ctl_value(cval, cval->control << 8, &val); in mixer_ctl_selector_get()
2574 ucontrol->value.enumerated.item[0] = 0; in mixer_ctl_selector_get()
2578 ucontrol->value.enumerated.item[0] = val; in mixer_ctl_selector_get()
2586 struct usb_mixer_elem_info *cval = kcontrol->private_data; in mixer_ctl_selector_put()
2589 err = get_cur_ctl_value(cval, cval->control << 8, &oval); in mixer_ctl_selector_put()
2592 val = ucontrol->value.enumerated.item[0]; in mixer_ctl_selector_put()
2595 set_cur_ctl_value(cval, cval->control << 8, val); in mixer_ctl_selector_put()
2618 if (kctl->private_data) { in usb_mixer_selector_elem_free()
2619 struct usb_mixer_elem_info *cval = kctl->private_data; in usb_mixer_selector_elem_free()
2620 num_ins = cval->max; in usb_mixer_selector_elem_free()
2622 kctl->private_data = NULL; in usb_mixer_selector_elem_free()
2624 if (kctl->private_value) { in usb_mixer_selector_elem_free()
2625 char **itemlist = (char **)kctl->private_value; in usb_mixer_selector_elem_free()
2629 kctl->private_value = 0; in usb_mixer_selector_elem_free()
2647 for (i = 0; i < desc->bNrInPins; i++) { in parse_audio_selector_unit()
2648 err = parse_audio_unit(state, desc->baSourceID[i]); in parse_audio_selector_unit()
2653 if (desc->bNrInPins == 1) /* only one ? nonsense! */ in parse_audio_selector_unit()
2656 map = find_map(state->map, unitid, 0); in parse_audio_selector_unit()
2662 return -ENOMEM; in parse_audio_selector_unit()
2663 snd_usb_mixer_elem_init_std(&cval->head, state->mixer, unitid); in parse_audio_selector_unit()
2664 cval->val_type = USB_MIXER_U8; in parse_audio_selector_unit()
2665 cval->channels = 1; in parse_audio_selector_unit()
2666 cval->min = 1; in parse_audio_selector_unit()
2667 cval->max = desc->bNrInPins; in parse_audio_selector_unit()
2668 cval->res = 1; in parse_audio_selector_unit()
2669 cval->initialized = 1; in parse_audio_selector_unit()
2671 switch (state->mixer->protocol) { in parse_audio_selector_unit()
2674 cval->control = 0; in parse_audio_selector_unit()
2678 if (desc->bDescriptorSubtype == UAC2_CLOCK_SELECTOR || in parse_audio_selector_unit()
2679 desc->bDescriptorSubtype == UAC3_CLOCK_SELECTOR) in parse_audio_selector_unit()
2680 cval->control = UAC2_CX_CLOCK_SELECTOR; in parse_audio_selector_unit()
2682 cval->control = UAC2_SU_SELECTOR; in parse_audio_selector_unit()
2686 namelist = kcalloc(desc->bNrInPins, sizeof(char *), GFP_KERNEL); in parse_audio_selector_unit()
2688 err = -ENOMEM; in parse_audio_selector_unit()
2692 for (i = 0; i < desc->bNrInPins; i++) { in parse_audio_selector_unit()
2697 err = -ENOMEM; in parse_audio_selector_unit()
2702 if (! len && check_input_term(state, desc->baSourceID[i], &iterm) >= 0) in parse_audio_selector_unit()
2703 len = get_term_name(state->chip, &iterm, namelist[i], in parse_audio_selector_unit()
2711 usb_audio_err(state->chip, "cannot malloc kcontrol\n"); in parse_audio_selector_unit()
2712 err = -ENOMEM; in parse_audio_selector_unit()
2715 kctl->private_value = (unsigned long)namelist; in parse_audio_selector_unit()
2716 kctl->private_free = usb_mixer_selector_elem_free; in parse_audio_selector_unit()
2719 len = check_mapped_name(map, kctl->id.name, sizeof(kctl->id.name)); in parse_audio_selector_unit()
2722 switch (state->mixer->protocol) { in parse_audio_selector_unit()
2729 len = snd_usb_copy_string_desc(state->chip, in parse_audio_selector_unit()
2730 nameid, kctl->id.name, in parse_audio_selector_unit()
2731 sizeof(kctl->id.name)); in parse_audio_selector_unit()
2734 /* TODO: Class-Specific strings not yet supported */ in parse_audio_selector_unit()
2740 len = get_term_name(state->chip, &state->oterm, in parse_audio_selector_unit()
2741 kctl->id.name, sizeof(kctl->id.name), 0); in parse_audio_selector_unit()
2744 strlcpy(kctl->id.name, "USB", sizeof(kctl->id.name)); in parse_audio_selector_unit()
2747 if (desc->bDescriptorSubtype == UAC2_CLOCK_SELECTOR || in parse_audio_selector_unit()
2748 desc->bDescriptorSubtype == UAC3_CLOCK_SELECTOR) in parse_audio_selector_unit()
2750 else if ((state->oterm.type & 0xff00) == 0x0100) in parse_audio_selector_unit()
2756 usb_audio_dbg(state->chip, "[%d] SU [%s] items = %d\n", in parse_audio_selector_unit()
2757 cval->head.id, kctl->id.name, desc->bNrInPins); in parse_audio_selector_unit()
2758 return snd_usb_mixer_add_control(&cval->head, kctl); in parse_audio_selector_unit()
2761 for (i = 0; i < desc->bNrInPins; i++) in parse_audio_selector_unit()
2776 int protocol = state->mixer->protocol; in parse_audio_unit()
2778 if (test_and_set_bit(unitid, state->unitbitmap)) in parse_audio_unit()
2783 usb_audio_err(state->chip, "unit %d not found!\n", unitid); in parse_audio_unit()
2784 return -EINVAL; in parse_audio_unit()
2788 usb_audio_dbg(state->chip, "invalid unit %d\n", unitid); in parse_audio_unit()
2824 return 0; /* FIXME - effect units not implemented yet */ in parse_audio_unit()
2826 usb_audio_err(state->chip, in parse_audio_unit()
2829 return -EINVAL; in parse_audio_unit()
2838 kfree(mixer->id_elems); in snd_usb_mixer_free()
2839 if (mixer->urb) { in snd_usb_mixer_free()
2840 kfree(mixer->urb->transfer_buffer); in snd_usb_mixer_free()
2841 usb_free_urb(mixer->urb); in snd_usb_mixer_free()
2843 usb_free_urb(mixer->rc_urb); in snd_usb_mixer_free()
2844 kfree(mixer->rc_setup_packet); in snd_usb_mixer_free()
2850 struct usb_mixer_interface *mixer = device->device_data; in snd_usb_mixer_dev_free()
2873 .c_chmask = -1, /* dynamic channels */
2874 .p_chmask = -1, /* dynamic channels */
2886 .p_chmask = -1, /* dynamic channels */
2892 .c_chmask = -1, /* dynamic channels */
2903 .p_chmask = -1, /* dynamic channels */
2932 if (f->c_chmask < 0 && f->p_chmask < 0) { in uac3_badd_func_has_valid_channels()
2934 usb_audio_warn(mixer->chip, "BAAD %s: no channels?", in uac3_badd_func_has_valid_channels()
2935 f->name); in uac3_badd_func_has_valid_channels()
2941 if ((f->c_chmask < 0 && !c_chmask) || in uac3_badd_func_has_valid_channels()
2942 (f->c_chmask >= 0 && f->c_chmask != c_chmask)) { in uac3_badd_func_has_valid_channels()
2943 usb_audio_warn(mixer->chip, "BAAD %s c_chmask mismatch", in uac3_badd_func_has_valid_channels()
2944 f->name); in uac3_badd_func_has_valid_channels()
2947 if ((f->p_chmask < 0 && !p_chmask) || in uac3_badd_func_has_valid_channels()
2948 (f->p_chmask >= 0 && f->p_chmask != p_chmask)) { in uac3_badd_func_has_valid_channels()
2949 usb_audio_warn(mixer->chip, "BAAD %s p_chmask mismatch", in uac3_badd_func_has_valid_channels()
2950 f->name); in uac3_badd_func_has_valid_channels()
2959 * UAC3 BADD device doesn't contain CS descriptors thus we will guess everything
2966 struct usb_device *dev = mixer->chip->dev; in snd_usb_mixer_controls_badd() local
2967 struct usb_interface_assoc_descriptor *assoc; in snd_usb_mixer_controls_badd() local
2968 int badd_profile = mixer->chip->badd_profile; in snd_usb_mixer_controls_badd()
2974 assoc = usb_ifnum_to_if(dev, ctrlif)->intf_assoc; in snd_usb_mixer_controls_badd()
2977 for (i = 0; i < assoc->bInterfaceCount; i++) { in snd_usb_mixer_controls_badd()
2978 int intf = assoc->bFirstInterface + i; in snd_usb_mixer_controls_badd()
2990 iface = usb_ifnum_to_if(dev, intf); in snd_usb_mixer_controls_badd()
2994 num = iface->num_altsetting; in snd_usb_mixer_controls_badd()
2997 return -EINVAL; in snd_usb_mixer_controls_badd()
3006 alts = &iface->altsetting[1]; in snd_usb_mixer_controls_badd()
3009 if (altsd->bNumEndpoints < 1) in snd_usb_mixer_controls_badd()
3010 return -EINVAL; in snd_usb_mixer_controls_badd()
3013 dir_in = (get_endpoint(alts, 0)->bEndpointAddress & USB_DIR_IN); in snd_usb_mixer_controls_badd()
3014 maxpacksize = le16_to_cpu(get_endpoint(alts, 0)->wMaxPacketSize); in snd_usb_mixer_controls_badd()
3018 usb_audio_err(mixer->chip, in snd_usb_mixer_controls_badd()
3021 return -EINVAL; in snd_usb_mixer_controls_badd()
3042 usb_audio_dbg(mixer->chip, in snd_usb_mixer_controls_badd()
3047 for (map = uac3_badd_usbmix_ctl_maps; map->id; map++) { in snd_usb_mixer_controls_badd()
3048 if (map->id == badd_profile) in snd_usb_mixer_controls_badd()
3052 if (!map->id) in snd_usb_mixer_controls_badd()
3053 return -EINVAL; in snd_usb_mixer_controls_badd()
3055 for (f = uac3_badd_profiles; f->name; f++) { in snd_usb_mixer_controls_badd()
3056 if (badd_profile == f->subclass) in snd_usb_mixer_controls_badd()
3059 if (!f->name) in snd_usb_mixer_controls_badd()
3060 return -EINVAL; in snd_usb_mixer_controls_badd()
3062 return -EINVAL; in snd_usb_mixer_controls_badd()
3063 st_chmask = f->st_chmask; in snd_usb_mixer_controls_badd()
3069 UAC3_BADD_FU_ID2, map->map); in snd_usb_mixer_controls_badd()
3072 UAC3_BADD_FU_ID2, map->map); in snd_usb_mixer_controls_badd()
3079 UAC3_BADD_FU_ID5, map->map); in snd_usb_mixer_controls_badd()
3082 UAC3_BADD_FU_ID5, map->map); in snd_usb_mixer_controls_badd()
3085 /* Side tone-mixing */ in snd_usb_mixer_controls_badd()
3089 UAC3_BADD_FU_ID7, map->map); in snd_usb_mixer_controls_badd()
3092 UAC3_BADD_FU_ID7, map->map); in snd_usb_mixer_controls_badd()
3096 if (f->subclass == UAC3_FUNCTION_SUBCLASS_HEADSET_ADAPTER) { in snd_usb_mixer_controls_badd()
3099 /* Input Term - Insertion control */ in snd_usb_mixer_controls_badd()
3103 build_connector_control(mixer, map->map, &iterm, true); in snd_usb_mixer_controls_badd()
3105 /* Output Term - Insertion control */ in snd_usb_mixer_controls_badd()
3109 build_connector_control(mixer, map->map, &oterm, false); in snd_usb_mixer_controls_badd()
3128 state.chip = mixer->chip; in snd_usb_mixer_controls()
3130 state.buffer = mixer->hostif->extra; in snd_usb_mixer_controls()
3131 state.buflen = mixer->hostif->extralen; in snd_usb_mixer_controls()
3134 for (map = usbmix_ctl_maps; map->id; map++) { in snd_usb_mixer_controls()
3135 if (map->id == state.chip->usb_id) { in snd_usb_mixer_controls()
3136 state.map = map->map; in snd_usb_mixer_controls()
3137 state.selector_map = map->selector_map; in snd_usb_mixer_controls()
3138 mixer->connector_map = map->connector_map; in snd_usb_mixer_controls()
3139 mixer->ignore_ctl_error |= map->ignore_ctl_error; in snd_usb_mixer_controls()
3145 while ((p = snd_usb_find_csint_desc(mixer->hostif->extra, in snd_usb_mixer_controls()
3146 mixer->hostif->extralen, in snd_usb_mixer_controls()
3148 if (!snd_usb_validate_audio_desc(p, mixer->protocol)) in snd_usb_mixer_controls()
3151 if (mixer->protocol == UAC_VERSION_1) { in snd_usb_mixer_controls()
3155 set_bit(desc->bTerminalID, state.unitbitmap); in snd_usb_mixer_controls()
3156 state.oterm.id = desc->bTerminalID; in snd_usb_mixer_controls()
3157 state.oterm.type = le16_to_cpu(desc->wTerminalType); in snd_usb_mixer_controls()
3158 state.oterm.name = desc->iTerminal; in snd_usb_mixer_controls()
3159 err = parse_audio_unit(&state, desc->bSourceID); in snd_usb_mixer_controls()
3160 if (err < 0 && err != -EINVAL) in snd_usb_mixer_controls()
3162 } else if (mixer->protocol == UAC_VERSION_2) { in snd_usb_mixer_controls()
3166 set_bit(desc->bTerminalID, state.unitbitmap); in snd_usb_mixer_controls()
3167 state.oterm.id = desc->bTerminalID; in snd_usb_mixer_controls()
3168 state.oterm.type = le16_to_cpu(desc->wTerminalType); in snd_usb_mixer_controls()
3169 state.oterm.name = desc->iTerminal; in snd_usb_mixer_controls()
3170 err = parse_audio_unit(&state, desc->bSourceID); in snd_usb_mixer_controls()
3171 if (err < 0 && err != -EINVAL) in snd_usb_mixer_controls()
3178 err = parse_audio_unit(&state, desc->bCSourceID); in snd_usb_mixer_controls()
3179 if (err < 0 && err != -EINVAL) in snd_usb_mixer_controls()
3183 uac_v2v3_control_is_readable(le16_to_cpu(desc->bmControls), in snd_usb_mixer_controls()
3192 set_bit(desc->bTerminalID, state.unitbitmap); in snd_usb_mixer_controls()
3193 state.oterm.id = desc->bTerminalID; in snd_usb_mixer_controls()
3194 state.oterm.type = le16_to_cpu(desc->wTerminalType); in snd_usb_mixer_controls()
3195 state.oterm.name = le16_to_cpu(desc->wTerminalDescrStr); in snd_usb_mixer_controls()
3196 err = parse_audio_unit(&state, desc->bSourceID); in snd_usb_mixer_controls()
3197 if (err < 0 && err != -EINVAL) in snd_usb_mixer_controls()
3204 err = parse_audio_unit(&state, desc->bCSourceID); in snd_usb_mixer_controls()
3205 if (err < 0 && err != -EINVAL) in snd_usb_mixer_controls()
3209 uac_v2v3_control_is_readable(le32_to_cpu(desc->bmControls), in snd_usb_mixer_controls()
3223 const struct usbmix_connector_map *map = mixer->connector_map; in delegate_notify()
3228 for (; map->id; map++) { in delegate_notify()
3229 if (map->id == unitid) { in delegate_notify()
3230 if (control && map->control) in delegate_notify()
3231 *control = map->control; in delegate_notify()
3232 if (channel && map->channel) in delegate_notify()
3233 *channel = map->channel; in delegate_notify()
3234 return map->delegated_id; in delegate_notify()
3249 if (!list->is_std_info) in snd_usb_mixer_notify_id()
3253 info->cached = 0; in snd_usb_mixer_notify_id()
3254 snd_ctl_notify(mixer->chip->card, SNDRV_CTL_EVENT_MASK_VALUE, in snd_usb_mixer_notify_id()
3255 &list->kctl->id); in snd_usb_mixer_notify_id()
3266 "channels=%i, type=\"%s\"\n", cval->head.id, in snd_usb_mixer_dump_cval()
3267 cval->control, cval->cmask, cval->channels, in snd_usb_mixer_dump_cval()
3268 val_types[cval->val_type]); in snd_usb_mixer_dump_cval()
3270 cval->min, cval->max, cval->dBmin, cval->dBmax); in snd_usb_mixer_dump_cval()
3276 struct snd_usb_audio *chip = entry->private_data; in snd_usb_mixer_proc_read()
3281 list_for_each_entry(mixer, &chip->mixer_list, list) { in snd_usb_mixer_proc_read()
3284 chip->usb_id, snd_usb_ctrl_intf(chip), in snd_usb_mixer_proc_read()
3285 mixer->ignore_ctl_error); in snd_usb_mixer_proc_read()
3286 snd_iprintf(buffer, "Card: %s\n", chip->card->longname); in snd_usb_mixer_proc_read()
3289 snd_iprintf(buffer, " Unit: %i\n", list->id); in snd_usb_mixer_proc_read()
3290 if (list->kctl) in snd_usb_mixer_proc_read()
3293 list->kctl->id.name, in snd_usb_mixer_proc_read()
3294 list->kctl->id.index); in snd_usb_mixer_proc_read()
3295 if (list->dump) in snd_usb_mixer_proc_read()
3296 list->dump(buffer, list); in snd_usb_mixer_proc_read()
3312 usb_audio_dbg(mixer->chip, in snd_usb_mixer_interrupt_v2()
3329 if (!list->kctl) in snd_usb_mixer_interrupt_v2()
3331 if (!list->is_std_info) in snd_usb_mixer_interrupt_v2()
3335 if (count > 1 && info->control != control) in snd_usb_mixer_interrupt_v2()
3342 info->cached &= ~(1 << channel); in snd_usb_mixer_interrupt_v2()
3344 info->cached = 0; in snd_usb_mixer_interrupt_v2()
3346 snd_ctl_notify(mixer->chip->card, SNDRV_CTL_EVENT_MASK_VALUE, in snd_usb_mixer_interrupt_v2()
3347 &info->head.kctl->id); in snd_usb_mixer_interrupt_v2()
3359 usb_audio_dbg(mixer->chip, in snd_usb_mixer_interrupt_v2()
3369 struct usb_mixer_interface *mixer = urb->context; in snd_usb_mixer_interrupt()
3370 int len = urb->actual_length; in snd_usb_mixer_interrupt()
3371 int ustatus = urb->status; in snd_usb_mixer_interrupt()
3376 if (mixer->protocol == UAC_VERSION_1) { in snd_usb_mixer_interrupt()
3379 for (status = urb->transfer_buffer; in snd_usb_mixer_interrupt()
3381 len -= sizeof(*status), status++) { in snd_usb_mixer_interrupt()
3382 dev_dbg(&urb->dev->dev, "status interrupt: %02x %02x\n", in snd_usb_mixer_interrupt()
3383 status->bStatusType, in snd_usb_mixer_interrupt()
3384 status->bOriginator); in snd_usb_mixer_interrupt()
3387 if ((status->bStatusType & UAC1_STATUS_TYPE_ORIG_MASK) != in snd_usb_mixer_interrupt()
3391 if (status->bStatusType & UAC1_STATUS_TYPE_MEM_CHANGED) in snd_usb_mixer_interrupt()
3392 snd_usb_mixer_rc_memory_change(mixer, status->bOriginator); in snd_usb_mixer_interrupt()
3394 snd_usb_mixer_notify_id(mixer, status->bOriginator); in snd_usb_mixer_interrupt()
3399 for (msg = urb->transfer_buffer; in snd_usb_mixer_interrupt()
3401 len -= sizeof(*msg), msg++) { in snd_usb_mixer_interrupt()
3403 if ((msg->bInfo & UAC2_INTERRUPT_DATA_MSG_VENDOR) || in snd_usb_mixer_interrupt()
3404 (msg->bInfo & UAC2_INTERRUPT_DATA_MSG_EP)) in snd_usb_mixer_interrupt()
3407 snd_usb_mixer_interrupt_v2(mixer, msg->bAttribute, in snd_usb_mixer_interrupt()
3408 le16_to_cpu(msg->wValue), in snd_usb_mixer_interrupt()
3409 le16_to_cpu(msg->wIndex)); in snd_usb_mixer_interrupt()
3414 if (ustatus != -ENOENT && in snd_usb_mixer_interrupt()
3415 ustatus != -ECONNRESET && in snd_usb_mixer_interrupt()
3416 ustatus != -ESHUTDOWN) { in snd_usb_mixer_interrupt()
3417 urb->dev = mixer->chip->dev; in snd_usb_mixer_interrupt()
3431 if (get_iface_desc(mixer->hostif)->bNumEndpoints < 1) in snd_usb_mixer_status_create()
3433 ep = get_endpoint(mixer->hostif, 0); in snd_usb_mixer_status_create()
3438 buffer_length = le16_to_cpu(ep->wMaxPacketSize); in snd_usb_mixer_status_create()
3441 return -ENOMEM; in snd_usb_mixer_status_create()
3442 mixer->urb = usb_alloc_urb(0, GFP_KERNEL); in snd_usb_mixer_status_create()
3443 if (!mixer->urb) { in snd_usb_mixer_status_create()
3445 return -ENOMEM; in snd_usb_mixer_status_create()
3447 usb_fill_int_urb(mixer->urb, mixer->chip->dev, in snd_usb_mixer_status_create()
3448 usb_rcvintpipe(mixer->chip->dev, epnum), in snd_usb_mixer_status_create()
3450 snd_usb_mixer_interrupt, mixer, ep->bInterval); in snd_usb_mixer_status_create()
3451 usb_submit_urb(mixer->urb, GFP_KERNEL); in snd_usb_mixer_status_create()
3460 ucontrol->value.integer.value[0] = mixer->chip->keep_iface; in keep_iface_ctl_get()
3468 bool keep_iface = !!ucontrol->value.integer.value[0]; in keep_iface_ctl_put()
3470 if (mixer->chip->keep_iface == keep_iface) in keep_iface_ctl_put()
3472 mixer->chip->keep_iface = keep_iface; in keep_iface_ctl_put()
3489 if (snd_ctl_find_id(mixer->chip->card, &kctl->id)) { in create_keep_iface_ctl()
3494 return snd_ctl_add(mixer->chip->card, kctl); in create_keep_iface_ctl()
3507 strcpy(chip->card->mixername, "USB Mixer"); in snd_usb_create_mixer()
3511 return -ENOMEM; in snd_usb_create_mixer()
3512 mixer->chip = chip; in snd_usb_create_mixer()
3513 mixer->ignore_ctl_error = ignore_error; in snd_usb_create_mixer()
3514 mixer->id_elems = kcalloc(MAX_ID_ELEMS, sizeof(*mixer->id_elems), in snd_usb_create_mixer()
3516 if (!mixer->id_elems) { in snd_usb_create_mixer()
3518 return -ENOMEM; in snd_usb_create_mixer()
3521 mixer->hostif = &usb_ifnum_to_if(chip->dev, ctrlif)->altsetting[0]; in snd_usb_create_mixer()
3522 switch (get_iface_desc(mixer->hostif)->bInterfaceProtocol) { in snd_usb_create_mixer()
3525 mixer->protocol = UAC_VERSION_1; in snd_usb_create_mixer()
3528 mixer->protocol = UAC_VERSION_2; in snd_usb_create_mixer()
3531 mixer->protocol = UAC_VERSION_3; in snd_usb_create_mixer()
3535 if (mixer->protocol == UAC_VERSION_3 && in snd_usb_create_mixer()
3536 chip->badd_profile >= UAC3_FUNCTION_SUBCLASS_GENERIC_IO) { in snd_usb_create_mixer()
3558 err = snd_device_new(chip->card, SNDRV_DEV_CODEC, mixer, &dev_ops); in snd_usb_create_mixer()
3562 if (list_empty(&chip->mixer_list) && in snd_usb_create_mixer()
3563 !snd_card_proc_new(chip->card, "usbmixer", &entry)) in snd_usb_create_mixer()
3566 list_add(&mixer->list, &chip->mixer_list); in snd_usb_create_mixer()
3576 if (mixer->disconnected) in snd_usb_mixer_disconnect()
3578 if (mixer->urb) in snd_usb_mixer_disconnect()
3579 usb_kill_urb(mixer->urb); in snd_usb_mixer_disconnect()
3580 if (mixer->rc_urb) in snd_usb_mixer_disconnect()
3581 usb_kill_urb(mixer->rc_urb); in snd_usb_mixer_disconnect()
3582 mixer->disconnected = true; in snd_usb_mixer_disconnect()
3589 usb_kill_urb(mixer->urb); in snd_usb_mixer_inactivate()
3590 usb_kill_urb(mixer->rc_urb); in snd_usb_mixer_inactivate()
3597 if (mixer->urb) { in snd_usb_mixer_activate()
3598 err = usb_submit_urb(mixer->urb, GFP_NOIO); in snd_usb_mixer_activate()
3617 if (cval->cmask) { in restore_mixer_value()
3620 if (!(cval->cmask & (1 << c))) in restore_mixer_value()
3622 if (cval->cached & (1 << (c + 1))) { in restore_mixer_value()
3624 cval->cache_val[idx]); in restore_mixer_value()
3632 if (cval->cached) { in restore_mixer_value()
3633 err = snd_usb_set_cur_mix_value(cval, 0, 0, *cval->cache_val); in restore_mixer_value()
3651 if (list->resume) { in snd_usb_mixer_resume()
3652 err = list->resume(list); in snd_usb_mixer_resume()
3670 list->mixer = mixer; in snd_usb_mixer_elem_init_std()
3671 list->id = unitid; in snd_usb_mixer_elem_init_std()
3672 list->dump = snd_usb_mixer_dump_cval; in snd_usb_mixer_elem_init_std()
3674 list->resume = restore_mixer_value; in snd_usb_mixer_elem_init_std()