mixer.c (9cbb2808ccfb3c64300151baf73bd5f11feab77f) mixer.c (0ba41d917eeb87f608cf147f870ff2f4c1056bab)
1/*
2 * (Tentative) USB Audio Driver for ALSA
3 *
4 * Mixer control part
5 *
6 * Copyright (c) 2002 by Takashi Iwai <tiwai@suse.de>
7 *
8 * Many codes borrowed from audio.c by

--- 291 unchanged lines hidden (view full) ---

300 if (snd_usb_ctl_msg(chip->dev, usb_rcvctrlpipe(chip->dev, 0), request,
301 USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_IN,
302 validx, idx, buf, val_len) >= val_len) {
303 *value_ret = convert_signed_value(cval, snd_usb_combine_bytes(buf, val_len));
304 err = 0;
305 goto out;
306 }
307 }
1/*
2 * (Tentative) USB Audio Driver for ALSA
3 *
4 * Mixer control part
5 *
6 * Copyright (c) 2002 by Takashi Iwai <tiwai@suse.de>
7 *
8 * Many codes borrowed from audio.c by

--- 291 unchanged lines hidden (view full) ---

300 if (snd_usb_ctl_msg(chip->dev, usb_rcvctrlpipe(chip->dev, 0), request,
301 USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_IN,
302 validx, idx, buf, val_len) >= val_len) {
303 *value_ret = convert_signed_value(cval, snd_usb_combine_bytes(buf, val_len));
304 err = 0;
305 goto out;
306 }
307 }
308 snd_printdd(KERN_ERR "cannot get ctl value: req = %#x, wValue = %#x, wIndex = %#x, type = %d\n",
309 request, validx, idx, cval->val_type);
308 usb_audio_dbg(chip,
309 "cannot get ctl value: req = %#x, wValue = %#x, wIndex = %#x, type = %d\n",
310 request, validx, idx, cval->val_type);
310 err = -EINVAL;
311
312 out:
313 up_read(&chip->shutdown_rwsem);
314 snd_usb_autosuspend(cval->mixer->chip);
315 return err;
316}
317

--- 28 unchanged lines hidden (view full) ---

346 USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_IN,
347 validx, idx, buf, size);
348 }
349 up_read(&chip->shutdown_rwsem);
350 snd_usb_autosuspend(chip);
351
352 if (ret < 0) {
353error:
311 err = -EINVAL;
312
313 out:
314 up_read(&chip->shutdown_rwsem);
315 snd_usb_autosuspend(cval->mixer->chip);
316 return err;
317}
318

--- 28 unchanged lines hidden (view full) ---

347 USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_IN,
348 validx, idx, buf, size);
349 }
350 up_read(&chip->shutdown_rwsem);
351 snd_usb_autosuspend(chip);
352
353 if (ret < 0) {
354error:
354 snd_printk(KERN_ERR "cannot get ctl value: req = %#x, wValue = %#x, wIndex = %#x, type = %d\n",
355 request, validx, idx, cval->val_type);
355 usb_audio_err(chip,
356 "cannot get ctl value: req = %#x, wValue = %#x, wIndex = %#x, type = %d\n",
357 request, validx, idx, cval->val_type);
356 return ret;
357 }
358
359 /* FIXME: how should we handle multiple triplets here? */
360
361 switch (request) {
362 case UAC_GET_CUR:
363 val = buf;

--- 44 unchanged lines hidden (view full) ---

408
409 if (cval->cached & (1 << channel)) {
410 *value = cval->cache_val[index];
411 return 0;
412 }
413 err = get_cur_mix_raw(cval, channel, value);
414 if (err < 0) {
415 if (!cval->mixer->ignore_ctl_error)
358 return ret;
359 }
360
361 /* FIXME: how should we handle multiple triplets here? */
362
363 switch (request) {
364 case UAC_GET_CUR:
365 val = buf;

--- 44 unchanged lines hidden (view full) ---

410
411 if (cval->cached & (1 << channel)) {
412 *value = cval->cache_val[index];
413 return 0;
414 }
415 err = get_cur_mix_raw(cval, channel, value);
416 if (err < 0) {
417 if (!cval->mixer->ignore_ctl_error)
416 snd_printd(KERN_ERR "cannot get current value for control %d ch %d: err = %d\n",
418 usb_audio_dbg(cval->mixer->chip,
419 "cannot get current value for control %d ch %d: err = %d\n",
417 cval->control, channel, err);
418 return err;
419 }
420 cval->cached |= 1 << channel;
421 cval->cache_val[index] = *value;
422 return 0;
423}
424

--- 14 unchanged lines hidden (view full) ---

439 if (cval->mixer->protocol == UAC_VERSION_1) {
440 val_len = cval->val_type >= USB_MIXER_S16 ? 2 : 1;
441 } else { /* UAC_VERSION_2 */
442 /* audio class v2 controls are always 2 bytes in size */
443 val_len = sizeof(__u16);
444
445 /* FIXME */
446 if (request != UAC_SET_CUR) {
420 cval->control, channel, err);
421 return err;
422 }
423 cval->cached |= 1 << channel;
424 cval->cache_val[index] = *value;
425 return 0;
426}
427

--- 14 unchanged lines hidden (view full) ---

442 if (cval->mixer->protocol == UAC_VERSION_1) {
443 val_len = cval->val_type >= USB_MIXER_S16 ? 2 : 1;
444 } else { /* UAC_VERSION_2 */
445 /* audio class v2 controls are always 2 bytes in size */
446 val_len = sizeof(__u16);
447
448 /* FIXME */
449 if (request != UAC_SET_CUR) {
447 snd_printdd(KERN_WARNING "RANGE setting not yet supported\n");
450 usb_audio_dbg(chip, "RANGE setting not yet supported\n");
448 return -EINVAL;
449 }
450
451 request = UAC2_CS_CUR;
452 }
453
454 value_set = convert_bytes_value(cval, value_set);
455 buf[0] = value_set & 0xff;

--- 9 unchanged lines hidden (view full) ---

465 if (snd_usb_ctl_msg(chip->dev,
466 usb_sndctrlpipe(chip->dev, 0), request,
467 USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_OUT,
468 validx, idx, buf, val_len) >= 0) {
469 err = 0;
470 goto out;
471 }
472 }
451 return -EINVAL;
452 }
453
454 request = UAC2_CS_CUR;
455 }
456
457 value_set = convert_bytes_value(cval, value_set);
458 buf[0] = value_set & 0xff;

--- 9 unchanged lines hidden (view full) ---

468 if (snd_usb_ctl_msg(chip->dev,
469 usb_sndctrlpipe(chip->dev, 0), request,
470 USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_OUT,
471 validx, idx, buf, val_len) >= 0) {
472 err = 0;
473 goto out;
474 }
475 }
473 snd_printdd(KERN_ERR "cannot set ctl value: req = %#x, wValue = %#x, wIndex = %#x, type = %d, data = %#x/%#x\n",
476 usb_audio_dbg(chip, "cannot set ctl value: req = %#x, wValue = %#x, wIndex = %#x, type = %d, data = %#x/%#x\n",
474 request, validx, idx, cval->val_type, buf[0], buf[1]);
475 err = -EINVAL;
476
477 out:
478 up_read(&chip->shutdown_rwsem);
479 snd_usb_autosuspend(chip);
480 return err;
481}

--- 7 unchanged lines hidden (view full) ---

489 int index, int value)
490{
491 int err;
492 unsigned int read_only = (channel == 0) ?
493 cval->master_readonly :
494 cval->ch_readonly & (1 << (channel - 1));
495
496 if (read_only) {
477 request, validx, idx, cval->val_type, buf[0], buf[1]);
478 err = -EINVAL;
479
480 out:
481 up_read(&chip->shutdown_rwsem);
482 snd_usb_autosuspend(chip);
483 return err;
484}

--- 7 unchanged lines hidden (view full) ---

492 int index, int value)
493{
494 int err;
495 unsigned int read_only = (channel == 0) ?
496 cval->master_readonly :
497 cval->ch_readonly & (1 << (channel - 1));
498
499 if (read_only) {
497 snd_printdd(KERN_INFO "%s(): channel %d of control %d is read_only\n",
500 usb_audio_dbg(cval->mixer->chip,
501 "%s(): channel %d of control %d is read_only\n",
498 __func__, channel, cval->control);
499 return 0;
500 }
501
502 err = snd_usb_mixer_set_ctl_value(cval, UAC_SET_CUR, (cval->control << 8) | channel,
503 value);
504 if (err < 0)
505 return err;

--- 49 unchanged lines hidden (view full) ---

555 struct snd_kcontrol *kctl)
556{
557 struct usb_mixer_elem_info *cval = kctl->private_data;
558 int err;
559
560 while (snd_ctl_find_id(mixer->chip->card, &kctl->id))
561 kctl->id.index++;
562 if ((err = snd_ctl_add(mixer->chip->card, kctl)) < 0) {
502 __func__, channel, cval->control);
503 return 0;
504 }
505
506 err = snd_usb_mixer_set_ctl_value(cval, UAC_SET_CUR, (cval->control << 8) | channel,
507 value);
508 if (err < 0)
509 return err;

--- 49 unchanged lines hidden (view full) ---

559 struct snd_kcontrol *kctl)
560{
561 struct usb_mixer_elem_info *cval = kctl->private_data;
562 int err;
563
564 while (snd_ctl_find_id(mixer->chip->card, &kctl->id))
565 kctl->id.index++;
566 if ((err = snd_ctl_add(mixer->chip->card, kctl)) < 0) {
563 snd_printd(KERN_ERR "cannot add control (err = %d)\n", err);
567 usb_audio_dbg(mixer->chip, "cannot add control (err = %d)\n", err);
564 return err;
565 }
566 cval->elem_id = &kctl->id;
567 cval->next_id_elem = mixer->id_elems[cval->id];
568 mixer->id_elems[cval->id] = cval;
569 return 0;
570}
571

--- 230 unchanged lines hidden (view full) ---

802/*
803 * interface to ALSA control for feature/mixer units
804 */
805
806/* volume control quirks */
807static void volume_control_quirks(struct usb_mixer_elem_info *cval,
808 struct snd_kcontrol *kctl)
809{
568 return err;
569 }
570 cval->elem_id = &kctl->id;
571 cval->next_id_elem = mixer->id_elems[cval->id];
572 mixer->id_elems[cval->id] = cval;
573 return 0;
574}
575

--- 230 unchanged lines hidden (view full) ---

806/*
807 * interface to ALSA control for feature/mixer units
808 */
809
810/* volume control quirks */
811static void volume_control_quirks(struct usb_mixer_elem_info *cval,
812 struct snd_kcontrol *kctl)
813{
810 switch (cval->mixer->chip->usb_id) {
814 struct snd_usb_audio *chip = cval->mixer->chip;
815 switch (chip->usb_id) {
811 case USB_ID(0x0763, 0x2030): /* M-Audio Fast Track C400 */
812 case USB_ID(0x0763, 0x2031): /* M-Audio Fast Track C600 */
813 if (strcmp(kctl->id.name, "Effect Duration") == 0) {
814 cval->min = 0x0000;
815 cval->max = 0xffff;
816 cval->res = 0x00e6;
817 break;
818 }

--- 15 unchanged lines hidden (view full) ---

834 cval->max = 0xfcfe;
835 cval->res = 0x0073;
836 }
837 break;
838
839 case USB_ID(0x0763, 0x2081): /* M-Audio Fast Track Ultra 8R */
840 case USB_ID(0x0763, 0x2080): /* M-Audio Fast Track Ultra */
841 if (strcmp(kctl->id.name, "Effect Duration") == 0) {
816 case USB_ID(0x0763, 0x2030): /* M-Audio Fast Track C400 */
817 case USB_ID(0x0763, 0x2031): /* M-Audio Fast Track C600 */
818 if (strcmp(kctl->id.name, "Effect Duration") == 0) {
819 cval->min = 0x0000;
820 cval->max = 0xffff;
821 cval->res = 0x00e6;
822 break;
823 }

--- 15 unchanged lines hidden (view full) ---

839 cval->max = 0xfcfe;
840 cval->res = 0x0073;
841 }
842 break;
843
844 case USB_ID(0x0763, 0x2081): /* M-Audio Fast Track Ultra 8R */
845 case USB_ID(0x0763, 0x2080): /* M-Audio Fast Track Ultra */
846 if (strcmp(kctl->id.name, "Effect Duration") == 0) {
842 snd_printk(KERN_INFO
843 "usb-audio: set quirk for FTU Effect Duration\n");
847 usb_audio_info(chip,
848 "set quirk for FTU Effect Duration\n");
844 cval->min = 0x0000;
845 cval->max = 0x7f00;
846 cval->res = 0x0100;
847 break;
848 }
849 if (strcmp(kctl->id.name, "Effect Volume") == 0 ||
850 strcmp(kctl->id.name, "Effect Feedback Volume") == 0) {
849 cval->min = 0x0000;
850 cval->max = 0x7f00;
851 cval->res = 0x0100;
852 break;
853 }
854 if (strcmp(kctl->id.name, "Effect Volume") == 0 ||
855 strcmp(kctl->id.name, "Effect Feedback Volume") == 0) {
851 snd_printk(KERN_INFO
852 "usb-audio: set quirks for FTU Effect Feedback/Volume\n");
856 usb_audio_info(chip,
857 "set quirks for FTU Effect Feedback/Volume\n");
853 cval->min = 0x00;
854 cval->max = 0x7f;
855 break;
856 }
857 break;
858
859 case USB_ID(0x0471, 0x0101):
860 case USB_ID(0x0471, 0x0104):
861 case USB_ID(0x0471, 0x0105):
862 case USB_ID(0x0672, 0x1041):
863 /* quirk for UDA1321/N101.
864 * note that detection between firmware 2.1.1.7 (N101)
865 * and later 2.1.1.21 is not very clear from datasheets.
866 * I hope that the min value is -15360 for newer firmware --jk
867 */
868 if (!strcmp(kctl->id.name, "PCM Playback Volume") &&
869 cval->min == -15616) {
858 cval->min = 0x00;
859 cval->max = 0x7f;
860 break;
861 }
862 break;
863
864 case USB_ID(0x0471, 0x0101):
865 case USB_ID(0x0471, 0x0104):
866 case USB_ID(0x0471, 0x0105):
867 case USB_ID(0x0672, 0x1041):
868 /* quirk for UDA1321/N101.
869 * note that detection between firmware 2.1.1.7 (N101)
870 * and later 2.1.1.21 is not very clear from datasheets.
871 * I hope that the min value is -15360 for newer firmware --jk
872 */
873 if (!strcmp(kctl->id.name, "PCM Playback Volume") &&
874 cval->min == -15616) {
870 snd_printk(KERN_INFO
875 usb_audio_info(chip,
871 "set volume quirk for UDA1321/N101 chip\n");
872 cval->max = -256;
873 }
874 break;
875
876 case USB_ID(0x046d, 0x09a4):
877 if (!strcmp(kctl->id.name, "Mic Capture Volume")) {
876 "set volume quirk for UDA1321/N101 chip\n");
877 cval->max = -256;
878 }
879 break;
880
881 case USB_ID(0x046d, 0x09a4):
882 if (!strcmp(kctl->id.name, "Mic Capture Volume")) {
878 snd_printk(KERN_INFO
883 usb_audio_info(chip,
879 "set volume quirk for QuickCam E3500\n");
880 cval->min = 6080;
881 cval->max = 8768;
882 cval->res = 192;
883 }
884 break;
885
886 case USB_ID(0x046d, 0x0808):
887 case USB_ID(0x046d, 0x0809):
888 case USB_ID(0x046d, 0x081b): /* HD Webcam c310 */
889 case USB_ID(0x046d, 0x081d): /* HD Webcam c510 */
890 case USB_ID(0x046d, 0x0825): /* HD Webcam c270 */
891 case USB_ID(0x046d, 0x0826): /* HD Webcam c525 */
892 case USB_ID(0x046d, 0x0991):
893 /* Most audio usb devices lie about volume resolution.
894 * Most Logitech webcams have res = 384.
895 * Proboly there is some logitech magic behind this number --fishor
896 */
897 if (!strcmp(kctl->id.name, "Mic Capture Volume")) {
884 "set volume quirk for QuickCam E3500\n");
885 cval->min = 6080;
886 cval->max = 8768;
887 cval->res = 192;
888 }
889 break;
890
891 case USB_ID(0x046d, 0x0808):
892 case USB_ID(0x046d, 0x0809):
893 case USB_ID(0x046d, 0x081b): /* HD Webcam c310 */
894 case USB_ID(0x046d, 0x081d): /* HD Webcam c510 */
895 case USB_ID(0x046d, 0x0825): /* HD Webcam c270 */
896 case USB_ID(0x046d, 0x0826): /* HD Webcam c525 */
897 case USB_ID(0x046d, 0x0991):
898 /* Most audio usb devices lie about volume resolution.
899 * Most Logitech webcams have res = 384.
900 * Proboly there is some logitech magic behind this number --fishor
901 */
902 if (!strcmp(kctl->id.name, "Mic Capture Volume")) {
898 snd_printk(KERN_INFO
903 usb_audio_info(chip,
899 "set resolution quirk: cval->res = 384\n");
900 cval->res = 384;
901 }
902 break;
903
904 }
905}
906

--- 19 unchanged lines hidden (view full) ---

926 for (i = 0; i < MAX_CHANNELS; i++)
927 if (cval->cmask & (1 << i)) {
928 minchn = i + 1;
929 break;
930 }
931 }
932 if (get_ctl_value(cval, UAC_GET_MAX, (cval->control << 8) | minchn, &cval->max) < 0 ||
933 get_ctl_value(cval, UAC_GET_MIN, (cval->control << 8) | minchn, &cval->min) < 0) {
904 "set resolution quirk: cval->res = 384\n");
905 cval->res = 384;
906 }
907 break;
908
909 }
910}
911

--- 19 unchanged lines hidden (view full) ---

931 for (i = 0; i < MAX_CHANNELS; i++)
932 if (cval->cmask & (1 << i)) {
933 minchn = i + 1;
934 break;
935 }
936 }
937 if (get_ctl_value(cval, UAC_GET_MAX, (cval->control << 8) | minchn, &cval->max) < 0 ||
938 get_ctl_value(cval, UAC_GET_MIN, (cval->control << 8) | minchn, &cval->min) < 0) {
934 snd_printd(KERN_ERR "%d:%d: cannot get min/max values for control %d (id %d)\n",
939 usb_audio_err(cval->mixer->chip,
940 "%d:%d: cannot get min/max values for control %d (id %d)\n",
935 cval->id, snd_usb_ctrl_intf(cval->mixer->chip), cval->control, cval->id);
936 return -EINVAL;
937 }
938 if (get_ctl_value(cval, UAC_GET_RES, (cval->control << 8) | minchn, &cval->res) < 0) {
939 cval->res = 1;
940 } else {
941 int last_valid_res = cval->res;
942

--- 247 unchanged lines hidden (view full) ---

1190 }
1191
1192 map = find_map(state, unitid, control);
1193 if (check_ignored_ctl(map))
1194 return;
1195
1196 cval = kzalloc(sizeof(*cval), GFP_KERNEL);
1197 if (! cval) {
941 cval->id, snd_usb_ctrl_intf(cval->mixer->chip), cval->control, cval->id);
942 return -EINVAL;
943 }
944 if (get_ctl_value(cval, UAC_GET_RES, (cval->control << 8) | minchn, &cval->res) < 0) {
945 cval->res = 1;
946 } else {
947 int last_valid_res = cval->res;
948

--- 247 unchanged lines hidden (view full) ---

1196 }
1197
1198 map = find_map(state, unitid, control);
1199 if (check_ignored_ctl(map))
1200 return;
1201
1202 cval = kzalloc(sizeof(*cval), GFP_KERNEL);
1203 if (! cval) {
1198 snd_printk(KERN_ERR "cannot malloc kcontrol\n");
1204 usb_audio_err(state->chip, "cannot malloc kcontrol\n");
1199 return;
1200 }
1201 cval->mixer = state->mixer;
1202 cval->id = unitid;
1203 cval->control = control;
1204 cval->cmask = ctl_mask;
1205 cval->val_type = audio_feature_info[control-1].type;
1206 if (ctl_mask == 0) {

--- 12 unchanged lines hidden (view full) ---

1219 * read-only. set_cur_mix_value() will check the mask again and won't
1220 * issue write commands to read-only channels. */
1221 if (cval->channels == readonly_mask)
1222 kctl = snd_ctl_new1(&usb_feature_unit_ctl_ro, cval);
1223 else
1224 kctl = snd_ctl_new1(&usb_feature_unit_ctl, cval);
1225
1226 if (! kctl) {
1205 return;
1206 }
1207 cval->mixer = state->mixer;
1208 cval->id = unitid;
1209 cval->control = control;
1210 cval->cmask = ctl_mask;
1211 cval->val_type = audio_feature_info[control-1].type;
1212 if (ctl_mask == 0) {

--- 12 unchanged lines hidden (view full) ---

1225 * read-only. set_cur_mix_value() will check the mask again and won't
1226 * issue write commands to read-only channels. */
1227 if (cval->channels == readonly_mask)
1228 kctl = snd_ctl_new1(&usb_feature_unit_ctl_ro, cval);
1229 else
1230 kctl = snd_ctl_new1(&usb_feature_unit_ctl, cval);
1231
1232 if (! kctl) {
1227 snd_printk(KERN_ERR "cannot malloc kcontrol\n");
1233 usb_audio_err(state->chip, "cannot malloc kcontrol\n");
1228 kfree(cval);
1229 return;
1230 }
1231 kctl->private_free = usb_mixer_elem_free;
1232
1233 len = check_mapped_name(map, kctl->id.name, sizeof(kctl->id.name));
1234 mapped_name = len != 0;
1235 if (! len && nameid)

--- 57 unchanged lines hidden (view full) ---

1293 }
1294
1295 range = (cval->max - cval->min) / cval->res;
1296 /* Are there devices with volume range more than 255? I use a bit more
1297 * to be sure. 384 is a resolution magic number found on Logitech
1298 * devices. It will definitively catch all buggy Logitech devices.
1299 */
1300 if (range > 384) {
1234 kfree(cval);
1235 return;
1236 }
1237 kctl->private_free = usb_mixer_elem_free;
1238
1239 len = check_mapped_name(map, kctl->id.name, sizeof(kctl->id.name));
1240 mapped_name = len != 0;
1241 if (! len && nameid)

--- 57 unchanged lines hidden (view full) ---

1299 }
1300
1301 range = (cval->max - cval->min) / cval->res;
1302 /* Are there devices with volume range more than 255? I use a bit more
1303 * to be sure. 384 is a resolution magic number found on Logitech
1304 * devices. It will definitively catch all buggy Logitech devices.
1305 */
1306 if (range > 384) {
1301 snd_printk(KERN_WARNING "usb_audio: Warning! Unlikely big "
1307 usb_audio_warn(state->chip, "Warning! Unlikely big "
1302 "volume range (=%u), cval->res is probably wrong.",
1303 range);
1308 "volume range (=%u), cval->res is probably wrong.",
1309 range);
1304 snd_printk(KERN_WARNING "usb_audio: [%d] FU [%s] ch = %d, "
1310 usb_audio_warn(state->chip, "[%d] FU [%s] ch = %d, "
1305 "val = %d/%d/%d", cval->id,
1306 kctl->id.name, cval->channels,
1307 cval->min, cval->max, cval->res);
1308 }
1309
1311 "val = %d/%d/%d", cval->id,
1312 kctl->id.name, cval->channels,
1313 cval->min, cval->max, cval->res);
1314 }
1315
1310 snd_printdd(KERN_INFO "[%d] FU [%s] ch = %d, val = %d/%d/%d\n",
1316 usb_audio_dbg(state->chip, "[%d] FU [%s] ch = %d, val = %d/%d/%d\n",
1311 cval->id, kctl->id.name, cval->channels, cval->min, cval->max, cval->res);
1312 snd_usb_mixer_add_control(state->mixer, kctl);
1313}
1314
1315
1316
1317/*
1318 * parse a feature unit

--- 7 unchanged lines hidden (view full) ---

1326 unsigned int master_bits, first_ch_bits;
1327 int err, csize;
1328 struct uac_feature_unit_descriptor *hdr = _ftr;
1329 __u8 *bmaControls;
1330
1331 if (state->mixer->protocol == UAC_VERSION_1) {
1332 csize = hdr->bControlSize;
1333 if (!csize) {
1317 cval->id, kctl->id.name, cval->channels, cval->min, cval->max, cval->res);
1318 snd_usb_mixer_add_control(state->mixer, kctl);
1319}
1320
1321
1322
1323/*
1324 * parse a feature unit

--- 7 unchanged lines hidden (view full) ---

1332 unsigned int master_bits, first_ch_bits;
1333 int err, csize;
1334 struct uac_feature_unit_descriptor *hdr = _ftr;
1335 __u8 *bmaControls;
1336
1337 if (state->mixer->protocol == UAC_VERSION_1) {
1338 csize = hdr->bControlSize;
1339 if (!csize) {
1334 snd_printdd(KERN_ERR "usbaudio: unit %u: "
1335 "invalid bControlSize == 0\n", unitid);
1340 usb_audio_dbg(state->chip,
1341 "unit %u: invalid bControlSize == 0\n",
1342 unitid);
1336 return -EINVAL;
1337 }
1338 channels = (hdr->bLength - 7) / csize - 1;
1339 bmaControls = hdr->bmaControls;
1340 if (hdr->bLength < 7 + csize) {
1343 return -EINVAL;
1344 }
1345 channels = (hdr->bLength - 7) / csize - 1;
1346 bmaControls = hdr->bmaControls;
1347 if (hdr->bLength < 7 + csize) {
1341 snd_printk(KERN_ERR "usbaudio: unit %u: "
1342 "invalid UAC_FEATURE_UNIT descriptor\n",
1343 unitid);
1348 usb_audio_err(state->chip,
1349 "unit %u: invalid UAC_FEATURE_UNIT descriptor\n",
1350 unitid);
1344 return -EINVAL;
1345 }
1346 } else {
1347 struct uac2_feature_unit_descriptor *ftr = _ftr;
1348 csize = 4;
1349 channels = (hdr->bLength - 6) / 4 - 1;
1350 bmaControls = ftr->bmaControls;
1351 if (hdr->bLength < 6 + csize) {
1351 return -EINVAL;
1352 }
1353 } else {
1354 struct uac2_feature_unit_descriptor *ftr = _ftr;
1355 csize = 4;
1356 channels = (hdr->bLength - 6) / 4 - 1;
1357 bmaControls = ftr->bmaControls;
1358 if (hdr->bLength < 6 + csize) {
1352 snd_printk(KERN_ERR "usbaudio: unit %u: "
1353 "invalid UAC_FEATURE_UNIT descriptor\n",
1354 unitid);
1359 usb_audio_err(state->chip,
1360 "unit %u: invalid UAC_FEATURE_UNIT descriptor\n",
1361 unitid);
1355 return -EINVAL;
1356 }
1357 }
1358
1359 /* parse the source unit */
1360 if ((err = parse_audio_unit(state, hdr->bSourceID)) < 0)
1361 return err;
1362
1363 /* determine the input source type and name */
1364 err = check_input_term(state, hdr->bSourceID, &iterm);
1365 if (err < 0)
1366 return err;
1367
1368 master_bits = snd_usb_combine_bytes(bmaControls, csize);
1369 /* master configuration quirks */
1370 switch (state->chip->usb_id) {
1371 case USB_ID(0x08bb, 0x2702):
1362 return -EINVAL;
1363 }
1364 }
1365
1366 /* parse the source unit */
1367 if ((err = parse_audio_unit(state, hdr->bSourceID)) < 0)
1368 return err;
1369
1370 /* determine the input source type and name */
1371 err = check_input_term(state, hdr->bSourceID, &iterm);
1372 if (err < 0)
1373 return err;
1374
1375 master_bits = snd_usb_combine_bytes(bmaControls, csize);
1376 /* master configuration quirks */
1377 switch (state->chip->usb_id) {
1378 case USB_ID(0x08bb, 0x2702):
1372 snd_printk(KERN_INFO
1373 "usbmixer: master volume quirk for PCM2702 chip\n");
1379 usb_audio_info(state->chip,
1380 "usbmixer: master volume quirk for PCM2702 chip\n");
1374 /* disable non-functional volume control */
1375 master_bits &= ~UAC_CONTROL_BIT(UAC_FU_VOLUME);
1376 break;
1377 case USB_ID(0x1130, 0xf211):
1381 /* disable non-functional volume control */
1382 master_bits &= ~UAC_CONTROL_BIT(UAC_FU_VOLUME);
1383 break;
1384 case USB_ID(0x1130, 0xf211):
1378 snd_printk(KERN_INFO
1379 "usbmixer: volume control quirk for Tenx TP6911 Audio Headset\n");
1385 usb_audio_info(state->chip,
1386 "usbmixer: volume control quirk for Tenx TP6911 Audio Headset\n");
1380 /* disable non-functional volume control */
1381 channels = 0;
1382 break;
1383
1384 }
1385 if (channels > 0)
1386 first_ch_bits = snd_usb_combine_bytes(bmaControls + csize, csize);
1387 else

--- 85 unchanged lines hidden (view full) ---

1473 }
1474 }
1475
1476 /* get min/max values */
1477 get_min_max(cval, 0);
1478
1479 kctl = snd_ctl_new1(&usb_feature_unit_ctl, cval);
1480 if (! kctl) {
1387 /* disable non-functional volume control */
1388 channels = 0;
1389 break;
1390
1391 }
1392 if (channels > 0)
1393 first_ch_bits = snd_usb_combine_bytes(bmaControls + csize, csize);
1394 else

--- 85 unchanged lines hidden (view full) ---

1480 }
1481 }
1482
1483 /* get min/max values */
1484 get_min_max(cval, 0);
1485
1486 kctl = snd_ctl_new1(&usb_feature_unit_ctl, cval);
1487 if (! kctl) {
1481 snd_printk(KERN_ERR "cannot malloc kcontrol\n");
1488 usb_audio_err(state->chip, "cannot malloc kcontrol\n");
1482 kfree(cval);
1483 return;
1484 }
1485 kctl->private_free = usb_mixer_elem_free;
1486
1487 len = check_mapped_name(map, kctl->id.name, sizeof(kctl->id.name));
1488 if (! len)
1489 len = get_term_name(state, iterm, kctl->id.name, sizeof(kctl->id.name), 0);
1490 if (! len)
1491 len = sprintf(kctl->id.name, "Mixer Source %d", in_ch + 1);
1492 append_ctl_name(kctl, " Volume");
1493
1489 kfree(cval);
1490 return;
1491 }
1492 kctl->private_free = usb_mixer_elem_free;
1493
1494 len = check_mapped_name(map, kctl->id.name, sizeof(kctl->id.name));
1495 if (! len)
1496 len = get_term_name(state, iterm, kctl->id.name, sizeof(kctl->id.name), 0);
1497 if (! len)
1498 len = sprintf(kctl->id.name, "Mixer Source %d", in_ch + 1);
1499 append_ctl_name(kctl, " Volume");
1500
1494 snd_printdd(KERN_INFO "[%d] MU [%s] ch = %d, val = %d/%d\n",
1501 usb_audio_dbg(state->chip, "[%d] MU [%s] ch = %d, val = %d/%d\n",
1495 cval->id, kctl->id.name, cval->channels, cval->min, cval->max);
1496 snd_usb_mixer_add_control(state->mixer, kctl);
1497}
1498
1499
1500/*
1501 * parse a mixer unit
1502 */
1503static int parse_audio_mixer_unit(struct mixer_build *state, int unitid, void *raw_desc)
1504{
1505 struct uac_mixer_unit_descriptor *desc = raw_desc;
1506 struct usb_audio_term iterm;
1507 int input_pins, num_ins, num_outs;
1508 int pin, ich, err;
1509
1510 if (desc->bLength < 11 || ! (input_pins = desc->bNrInPins) || ! (num_outs = uac_mixer_unit_bNrChannels(desc))) {
1502 cval->id, kctl->id.name, cval->channels, cval->min, cval->max);
1503 snd_usb_mixer_add_control(state->mixer, kctl);
1504}
1505
1506
1507/*
1508 * parse a mixer unit
1509 */
1510static int parse_audio_mixer_unit(struct mixer_build *state, int unitid, void *raw_desc)
1511{
1512 struct uac_mixer_unit_descriptor *desc = raw_desc;
1513 struct usb_audio_term iterm;
1514 int input_pins, num_ins, num_outs;
1515 int pin, ich, err;
1516
1517 if (desc->bLength < 11 || ! (input_pins = desc->bNrInPins) || ! (num_outs = uac_mixer_unit_bNrChannels(desc))) {
1511 snd_printk(KERN_ERR "invalid MIXER UNIT descriptor %d\n", unitid);
1518 usb_audio_err(state->chip, "invalid MIXER UNIT descriptor %d\n", unitid);
1512 return -EINVAL;
1513 }
1514 /* no bmControls field (e.g. Maya44) -> ignore */
1515 if (desc->bLength <= 10 + input_pins) {
1519 return -EINVAL;
1520 }
1521 /* no bmControls field (e.g. Maya44) -> ignore */
1522 if (desc->bLength <= 10 + input_pins) {
1516 snd_printdd(KERN_INFO "MU %d has no bmControls field\n", unitid);
1523 usb_audio_dbg(state->chip, "MU %d has no bmControls field\n", unitid);
1517 return 0;
1518 }
1519
1520 num_ins = 0;
1521 ich = 0;
1522 for (pin = 0; pin < input_pins; pin++) {
1523 err = parse_audio_unit(state, desc->baSourceID[pin]);
1524 if (err < 0)

--- 182 unchanged lines hidden (view full) ---

1707 { 0 }
1708 };
1709 static struct procunit_info default_info = {
1710 0, NULL, default_value_info
1711 };
1712
1713 if (desc->bLength < 13 || desc->bLength < 13 + num_ins ||
1714 desc->bLength < num_ins + uac_processing_unit_bControlSize(desc, state->mixer->protocol)) {
1524 return 0;
1525 }
1526
1527 num_ins = 0;
1528 ich = 0;
1529 for (pin = 0; pin < input_pins; pin++) {
1530 err = parse_audio_unit(state, desc->baSourceID[pin]);
1531 if (err < 0)

--- 182 unchanged lines hidden (view full) ---

1714 { 0 }
1715 };
1716 static struct procunit_info default_info = {
1717 0, NULL, default_value_info
1718 };
1719
1720 if (desc->bLength < 13 || desc->bLength < 13 + num_ins ||
1721 desc->bLength < num_ins + uac_processing_unit_bControlSize(desc, state->mixer->protocol)) {
1715 snd_printk(KERN_ERR "invalid %s descriptor (id %d)\n", name, unitid);
1722 usb_audio_err(state->chip, "invalid %s descriptor (id %d)\n", name, unitid);
1716 return -EINVAL;
1717 }
1718
1719 for (i = 0; i < num_ins; i++) {
1720 if ((err = parse_audio_unit(state, desc->baSourceID[i])) < 0)
1721 return err;
1722 }
1723

--- 9 unchanged lines hidden (view full) ---

1733
1734 if (! (controls[valinfo->control / 8] & (1 << ((valinfo->control % 8) - 1))))
1735 continue;
1736 map = find_map(state, unitid, valinfo->control);
1737 if (check_ignored_ctl(map))
1738 continue;
1739 cval = kzalloc(sizeof(*cval), GFP_KERNEL);
1740 if (! cval) {
1723 return -EINVAL;
1724 }
1725
1726 for (i = 0; i < num_ins; i++) {
1727 if ((err = parse_audio_unit(state, desc->baSourceID[i])) < 0)
1728 return err;
1729 }
1730

--- 9 unchanged lines hidden (view full) ---

1740
1741 if (! (controls[valinfo->control / 8] & (1 << ((valinfo->control % 8) - 1))))
1742 continue;
1743 map = find_map(state, unitid, valinfo->control);
1744 if (check_ignored_ctl(map))
1745 continue;
1746 cval = kzalloc(sizeof(*cval), GFP_KERNEL);
1747 if (! cval) {
1741 snd_printk(KERN_ERR "cannot malloc kcontrol\n");
1748 usb_audio_err(state->chip, "cannot malloc kcontrol\n");
1742 return -ENOMEM;
1743 }
1744 cval->mixer = state->mixer;
1745 cval->id = unitid;
1746 cval->control = valinfo->control;
1747 cval->val_type = valinfo->val_type;
1748 cval->channels = 1;
1749

--- 15 unchanged lines hidden (view full) ---

1765 cval->res = 1;
1766 cval->initialized = 1;
1767 } else
1768 get_min_max(cval, valinfo->min_value);
1769 }
1770
1771 kctl = snd_ctl_new1(&mixer_procunit_ctl, cval);
1772 if (! kctl) {
1749 return -ENOMEM;
1750 }
1751 cval->mixer = state->mixer;
1752 cval->id = unitid;
1753 cval->control = valinfo->control;
1754 cval->val_type = valinfo->val_type;
1755 cval->channels = 1;
1756

--- 15 unchanged lines hidden (view full) ---

1772 cval->res = 1;
1773 cval->initialized = 1;
1774 } else
1775 get_min_max(cval, valinfo->min_value);
1776 }
1777
1778 kctl = snd_ctl_new1(&mixer_procunit_ctl, cval);
1779 if (! kctl) {
1773 snd_printk(KERN_ERR "cannot malloc kcontrol\n");
1780 usb_audio_err(state->chip, "cannot malloc kcontrol\n");
1774 kfree(cval);
1775 return -ENOMEM;
1776 }
1777 kctl->private_free = usb_mixer_elem_free;
1778
1779 if (check_mapped_name(map, kctl->id.name,
1780 sizeof(kctl->id.name)))
1781 /* nothing */ ;

--- 5 unchanged lines hidden (view full) ---

1787 if (nameid)
1788 len = snd_usb_copy_string_desc(state, nameid, kctl->id.name, sizeof(kctl->id.name));
1789 if (! len)
1790 strlcpy(kctl->id.name, name, sizeof(kctl->id.name));
1791 }
1792 append_ctl_name(kctl, " ");
1793 append_ctl_name(kctl, valinfo->suffix);
1794
1781 kfree(cval);
1782 return -ENOMEM;
1783 }
1784 kctl->private_free = usb_mixer_elem_free;
1785
1786 if (check_mapped_name(map, kctl->id.name,
1787 sizeof(kctl->id.name)))
1788 /* nothing */ ;

--- 5 unchanged lines hidden (view full) ---

1794 if (nameid)
1795 len = snd_usb_copy_string_desc(state, nameid, kctl->id.name, sizeof(kctl->id.name));
1796 if (! len)
1797 strlcpy(kctl->id.name, name, sizeof(kctl->id.name));
1798 }
1799 append_ctl_name(kctl, " ");
1800 append_ctl_name(kctl, valinfo->suffix);
1801
1795 snd_printdd(KERN_INFO "[%d] PU [%s] ch = %d, val = %d/%d\n",
1802 usb_audio_dbg(state->chip,
1803 "[%d] PU [%s] ch = %d, val = %d/%d\n",
1796 cval->id, kctl->id.name, cval->channels, cval->min, cval->max);
1797 if ((err = snd_usb_mixer_add_control(state->mixer, kctl)) < 0)
1798 return err;
1799 }
1800 return 0;
1801}
1802
1803

--- 108 unchanged lines hidden (view full) ---

1912 unsigned int i, nameid, len;
1913 int err;
1914 struct usb_mixer_elem_info *cval;
1915 struct snd_kcontrol *kctl;
1916 const struct usbmix_name_map *map;
1917 char **namelist;
1918
1919 if (!desc->bNrInPins || desc->bLength < 5 + desc->bNrInPins) {
1804 cval->id, kctl->id.name, cval->channels, cval->min, cval->max);
1805 if ((err = snd_usb_mixer_add_control(state->mixer, kctl)) < 0)
1806 return err;
1807 }
1808 return 0;
1809}
1810
1811

--- 108 unchanged lines hidden (view full) ---

1920 unsigned int i, nameid, len;
1921 int err;
1922 struct usb_mixer_elem_info *cval;
1923 struct snd_kcontrol *kctl;
1924 const struct usbmix_name_map *map;
1925 char **namelist;
1926
1927 if (!desc->bNrInPins || desc->bLength < 5 + desc->bNrInPins) {
1920 snd_printk(KERN_ERR "invalid SELECTOR UNIT descriptor %d\n", unitid);
1928 usb_audio_err(state->chip,
1929 "invalid SELECTOR UNIT descriptor %d\n", unitid);
1921 return -EINVAL;
1922 }
1923
1924 for (i = 0; i < desc->bNrInPins; i++) {
1925 if ((err = parse_audio_unit(state, desc->baSourceID[i])) < 0)
1926 return err;
1927 }
1928
1929 if (desc->bNrInPins == 1) /* only one ? nonsense! */
1930 return 0;
1931
1932 map = find_map(state, unitid, 0);
1933 if (check_ignored_ctl(map))
1934 return 0;
1935
1936 cval = kzalloc(sizeof(*cval), GFP_KERNEL);
1937 if (! cval) {
1930 return -EINVAL;
1931 }
1932
1933 for (i = 0; i < desc->bNrInPins; i++) {
1934 if ((err = parse_audio_unit(state, desc->baSourceID[i])) < 0)
1935 return err;
1936 }
1937
1938 if (desc->bNrInPins == 1) /* only one ? nonsense! */
1939 return 0;
1940
1941 map = find_map(state, unitid, 0);
1942 if (check_ignored_ctl(map))
1943 return 0;
1944
1945 cval = kzalloc(sizeof(*cval), GFP_KERNEL);
1946 if (! cval) {
1938 snd_printk(KERN_ERR "cannot malloc kcontrol\n");
1947 usb_audio_err(state->chip, "cannot malloc kcontrol\n");
1939 return -ENOMEM;
1940 }
1941 cval->mixer = state->mixer;
1942 cval->id = unitid;
1943 cval->val_type = USB_MIXER_U8;
1944 cval->channels = 1;
1945 cval->min = 1;
1946 cval->max = desc->bNrInPins;
1947 cval->res = 1;
1948 cval->initialized = 1;
1949
1950 if (desc->bDescriptorSubtype == UAC2_CLOCK_SELECTOR)
1951 cval->control = UAC2_CX_CLOCK_SELECTOR;
1952 else
1953 cval->control = 0;
1954
1955 namelist = kmalloc(sizeof(char *) * desc->bNrInPins, GFP_KERNEL);
1956 if (! namelist) {
1948 return -ENOMEM;
1949 }
1950 cval->mixer = state->mixer;
1951 cval->id = unitid;
1952 cval->val_type = USB_MIXER_U8;
1953 cval->channels = 1;
1954 cval->min = 1;
1955 cval->max = desc->bNrInPins;
1956 cval->res = 1;
1957 cval->initialized = 1;
1958
1959 if (desc->bDescriptorSubtype == UAC2_CLOCK_SELECTOR)
1960 cval->control = UAC2_CX_CLOCK_SELECTOR;
1961 else
1962 cval->control = 0;
1963
1964 namelist = kmalloc(sizeof(char *) * desc->bNrInPins, GFP_KERNEL);
1965 if (! namelist) {
1957 snd_printk(KERN_ERR "cannot malloc\n");
1966 usb_audio_err(state->chip, "cannot malloc\n");
1958 kfree(cval);
1959 return -ENOMEM;
1960 }
1961#define MAX_ITEM_NAME_LEN 64
1962 for (i = 0; i < desc->bNrInPins; i++) {
1963 struct usb_audio_term iterm;
1964 len = 0;
1965 namelist[i] = kmalloc(MAX_ITEM_NAME_LEN, GFP_KERNEL);
1966 if (! namelist[i]) {
1967 kfree(cval);
1968 return -ENOMEM;
1969 }
1970#define MAX_ITEM_NAME_LEN 64
1971 for (i = 0; i < desc->bNrInPins; i++) {
1972 struct usb_audio_term iterm;
1973 len = 0;
1974 namelist[i] = kmalloc(MAX_ITEM_NAME_LEN, GFP_KERNEL);
1975 if (! namelist[i]) {
1967 snd_printk(KERN_ERR "cannot malloc\n");
1976 usb_audio_err(state->chip, "cannot malloc\n");
1968 while (i--)
1969 kfree(namelist[i]);
1970 kfree(namelist);
1971 kfree(cval);
1972 return -ENOMEM;
1973 }
1974 len = check_mapped_selector_name(state, unitid, i, namelist[i],
1975 MAX_ITEM_NAME_LEN);
1976 if (! len && check_input_term(state, desc->baSourceID[i], &iterm) >= 0)
1977 len = get_term_name(state, &iterm, namelist[i], MAX_ITEM_NAME_LEN, 0);
1978 if (! len)
1979 sprintf(namelist[i], "Input %d", i);
1980 }
1981
1982 kctl = snd_ctl_new1(&mixer_selectunit_ctl, cval);
1983 if (! kctl) {
1977 while (i--)
1978 kfree(namelist[i]);
1979 kfree(namelist);
1980 kfree(cval);
1981 return -ENOMEM;
1982 }
1983 len = check_mapped_selector_name(state, unitid, i, namelist[i],
1984 MAX_ITEM_NAME_LEN);
1985 if (! len && check_input_term(state, desc->baSourceID[i], &iterm) >= 0)
1986 len = get_term_name(state, &iterm, namelist[i], MAX_ITEM_NAME_LEN, 0);
1987 if (! len)
1988 sprintf(namelist[i], "Input %d", i);
1989 }
1990
1991 kctl = snd_ctl_new1(&mixer_selectunit_ctl, cval);
1992 if (! kctl) {
1984 snd_printk(KERN_ERR "cannot malloc kcontrol\n");
1993 usb_audio_err(state->chip, "cannot malloc kcontrol\n");
1985 kfree(namelist);
1986 kfree(cval);
1987 return -ENOMEM;
1988 }
1989 kctl->private_value = (unsigned long)namelist;
1990 kctl->private_free = usb_mixer_selector_elem_free;
1991
1992 nameid = uac_selector_unit_iSelector(desc);

--- 11 unchanged lines hidden (view full) ---

2004 if (desc->bDescriptorSubtype == UAC2_CLOCK_SELECTOR)
2005 append_ctl_name(kctl, " Clock Source");
2006 else if ((state->oterm.type & 0xff00) == 0x0100)
2007 append_ctl_name(kctl, " Capture Source");
2008 else
2009 append_ctl_name(kctl, " Playback Source");
2010 }
2011
1994 kfree(namelist);
1995 kfree(cval);
1996 return -ENOMEM;
1997 }
1998 kctl->private_value = (unsigned long)namelist;
1999 kctl->private_free = usb_mixer_selector_elem_free;
2000
2001 nameid = uac_selector_unit_iSelector(desc);

--- 11 unchanged lines hidden (view full) ---

2013 if (desc->bDescriptorSubtype == UAC2_CLOCK_SELECTOR)
2014 append_ctl_name(kctl, " Clock Source");
2015 else if ((state->oterm.type & 0xff00) == 0x0100)
2016 append_ctl_name(kctl, " Capture Source");
2017 else
2018 append_ctl_name(kctl, " Playback Source");
2019 }
2020
2012 snd_printdd(KERN_INFO "[%d] SU [%s] items = %d\n",
2021 usb_audio_dbg(state->chip, "[%d] SU [%s] items = %d\n",
2013 cval->id, kctl->id.name, desc->bNrInPins);
2014 if ((err = snd_usb_mixer_add_control(state->mixer, kctl)) < 0)
2015 return err;
2016
2017 return 0;
2018}
2019
2020

--- 5 unchanged lines hidden (view full) ---

2026{
2027 unsigned char *p1;
2028
2029 if (test_and_set_bit(unitid, state->unitbitmap))
2030 return 0; /* the unit already visited */
2031
2032 p1 = find_audio_control_unit(state, unitid);
2033 if (!p1) {
2022 cval->id, kctl->id.name, desc->bNrInPins);
2023 if ((err = snd_usb_mixer_add_control(state->mixer, kctl)) < 0)
2024 return err;
2025
2026 return 0;
2027}
2028
2029

--- 5 unchanged lines hidden (view full) ---

2035{
2036 unsigned char *p1;
2037
2038 if (test_and_set_bit(unitid, state->unitbitmap))
2039 return 0; /* the unit already visited */
2040
2041 p1 = find_audio_control_unit(state, unitid);
2042 if (!p1) {
2034 snd_printk(KERN_ERR "usbaudio: unit %d not found!\n", unitid);
2043 usb_audio_err(state->chip, "unit %d not found!\n", unitid);
2035 return -EINVAL;
2036 }
2037
2038 switch (p1[2]) {
2039 case UAC_INPUT_TERMINAL:
2040 case UAC2_CLOCK_SOURCE:
2041 return 0; /* NOP */
2042 case UAC_MIXER_UNIT:

--- 13 unchanged lines hidden (view full) ---

2056 /* UAC2_PROCESSING_UNIT_V2 has the same value */
2057 if (state->mixer->protocol == UAC_VERSION_1)
2058 return parse_audio_extension_unit(state, unitid, p1);
2059 else /* UAC_VERSION_2 */
2060 return parse_audio_processing_unit(state, unitid, p1);
2061 case UAC2_EXTENSION_UNIT_V2:
2062 return parse_audio_extension_unit(state, unitid, p1);
2063 default:
2044 return -EINVAL;
2045 }
2046
2047 switch (p1[2]) {
2048 case UAC_INPUT_TERMINAL:
2049 case UAC2_CLOCK_SOURCE:
2050 return 0; /* NOP */
2051 case UAC_MIXER_UNIT:

--- 13 unchanged lines hidden (view full) ---

2065 /* UAC2_PROCESSING_UNIT_V2 has the same value */
2066 if (state->mixer->protocol == UAC_VERSION_1)
2067 return parse_audio_extension_unit(state, unitid, p1);
2068 else /* UAC_VERSION_2 */
2069 return parse_audio_processing_unit(state, unitid, p1);
2070 case UAC2_EXTENSION_UNIT_V2:
2071 return parse_audio_extension_unit(state, unitid, p1);
2072 default:
2064 snd_printk(KERN_ERR "usbaudio: unit %u: unexpected type 0x%02x\n", unitid, p1[2]);
2073 usb_audio_err(state->chip,
2074 "unit %u: unexpected type 0x%02x\n", unitid, p1[2]);
2065 return -EINVAL;
2066 }
2067}
2068
2069static void snd_usb_mixer_free(struct usb_mixer_interface *mixer)
2070{
2071 kfree(mixer->id_elems);
2072 if (mixer->urb) {

--- 131 unchanged lines hidden (view full) ---

2204 int attribute, int value, int index)
2205{
2206 struct usb_mixer_elem_info *info;
2207 __u8 unitid = (index >> 8) & 0xff;
2208 __u8 control = (value >> 8) & 0xff;
2209 __u8 channel = value & 0xff;
2210
2211 if (channel >= MAX_CHANNELS) {
2075 return -EINVAL;
2076 }
2077}
2078
2079static void snd_usb_mixer_free(struct usb_mixer_interface *mixer)
2080{
2081 kfree(mixer->id_elems);
2082 if (mixer->urb) {

--- 131 unchanged lines hidden (view full) ---

2214 int attribute, int value, int index)
2215{
2216 struct usb_mixer_elem_info *info;
2217 __u8 unitid = (index >> 8) & 0xff;
2218 __u8 control = (value >> 8) & 0xff;
2219 __u8 channel = value & 0xff;
2220
2221 if (channel >= MAX_CHANNELS) {
2212 snd_printk(KERN_DEBUG "%s(): bogus channel number %d\n",
2213 __func__, channel);
2222 usb_audio_dbg(mixer->chip,
2223 "%s(): bogus channel number %d\n",
2224 __func__, channel);
2214 return;
2215 }
2216
2217 for (info = mixer->id_elems[unitid]; info; info = info->next_id_elem) {
2218 if (info->control != control)
2219 continue;
2220
2221 switch (attribute) {

--- 12 unchanged lines hidden (view full) ---

2234 /* TODO */
2235 break;
2236
2237 case UAC2_CS_MEM:
2238 /* TODO */
2239 break;
2240
2241 default:
2225 return;
2226 }
2227
2228 for (info = mixer->id_elems[unitid]; info; info = info->next_id_elem) {
2229 if (info->control != control)
2230 continue;
2231
2232 switch (attribute) {

--- 12 unchanged lines hidden (view full) ---

2245 /* TODO */
2246 break;
2247
2248 case UAC2_CS_MEM:
2249 /* TODO */
2250 break;
2251
2252 default:
2242 snd_printk(KERN_DEBUG "unknown attribute %d in interrupt\n",
2243 attribute);
2253 usb_audio_dbg(mixer->chip,
2254 "unknown attribute %d in interrupt\n",
2255 attribute);
2244 break;
2245 } /* switch */
2246 }
2247}
2248
2249static void snd_usb_mixer_interrupt(struct urb *urb)
2250{
2251 struct usb_mixer_interface *mixer = urb->context;

--- 4 unchanged lines hidden (view full) ---

2256 goto requeue;
2257
2258 if (mixer->protocol == UAC_VERSION_1) {
2259 struct uac1_status_word *status;
2260
2261 for (status = urb->transfer_buffer;
2262 len >= sizeof(*status);
2263 len -= sizeof(*status), status++) {
2256 break;
2257 } /* switch */
2258 }
2259}
2260
2261static void snd_usb_mixer_interrupt(struct urb *urb)
2262{
2263 struct usb_mixer_interface *mixer = urb->context;

--- 4 unchanged lines hidden (view full) ---

2268 goto requeue;
2269
2270 if (mixer->protocol == UAC_VERSION_1) {
2271 struct uac1_status_word *status;
2272
2273 for (status = urb->transfer_buffer;
2274 len >= sizeof(*status);
2275 len -= sizeof(*status), status++) {
2264 snd_printd(KERN_DEBUG "status interrupt: %02x %02x\n",
2276 dev_dbg(&urb->dev->dev, "status interrupt: %02x %02x\n",
2265 status->bStatusType,
2266 status->bOriginator);
2267
2268 /* ignore any notifications not from the control interface */
2269 if ((status->bStatusType & UAC1_STATUS_TYPE_ORIG_MASK) !=
2270 UAC1_STATUS_TYPE_ORIG_AUDIO_CONTROL_IF)
2271 continue;
2272

--- 206 unchanged lines hidden ---
2277 status->bStatusType,
2278 status->bOriginator);
2279
2280 /* ignore any notifications not from the control interface */
2281 if ((status->bStatusType & UAC1_STATUS_TYPE_ORIG_MASK) !=
2282 UAC1_STATUS_TYPE_ORIG_AUDIO_CONTROL_IF)
2283 continue;
2284

--- 206 unchanged lines hidden ---