Lines Matching +full:super +full:- +full:frames

1 // SPDX-License-Identifier: GPL-2.0-or-later
15 * - the linked URBs would be preferred but not used so far because of
17 * - type II is not supported properly. there is no device which supports
19 * indeed an AC3 stream packed in SPDIF frames (i.e. no real AC3 stream).
33 #include <linux/usb/audio-v2.h>
34 #include <linux/usb/audio-v3.h>
63 static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; /* Index 0-MAX */
67 static int vid[SNDRV_CARDS] = { [0 ... (SNDRV_CARDS-1)] = -1 };
68 static int pid[SNDRV_CARDS] = { [0 ... (SNDRV_CARDS-1)] = -1 };
97 MODULE_PARM_DESC(autoclock, "Enable auto-clock selection for UAC2 devices (default: yes).");
136 return -EEXIST; in snd_usb_register_platform_ops()
169 if (!platform_ops || !platform_ops->connect_cb) in snd_usb_rediscover_devices()
174 platform_ops->connect_cb(usb_chip[i]); in snd_usb_rediscover_devices()
200 list_for_each_entry(as, &chip->pcm_list, list) { in snd_usb_find_suppported_substream()
201 subs = &as->substream[direction]; in snd_usb_find_suppported_substream()
221 subs = &as->substream[idx]; in snd_usb_stream_disconnect()
222 if (!subs->num_formats) in snd_usb_stream_disconnect()
224 subs->data_endpoint = NULL; in snd_usb_stream_disconnect()
225 subs->sync_endpoint = NULL; in snd_usb_stream_disconnect()
231 struct usb_device *dev = chip->dev; in snd_usb_create_stream()
237 dev_err(&dev->dev, "%u:%d : does not exist\n", in snd_usb_create_stream()
239 return -EINVAL; in snd_usb_create_stream()
242 alts = &iface->altsetting[0]; in snd_usb_create_stream()
249 if ((chip->usb_id == USB_ID(0x18d1, 0x2d04) || in snd_usb_create_stream()
250 chip->usb_id == USB_ID(0x18d1, 0x2d05)) && in snd_usb_create_stream()
252 altsd->bInterfaceClass == USB_CLASS_VENDOR_SPEC && in snd_usb_create_stream()
253 altsd->bInterfaceSubClass == USB_SUBCLASS_VENDOR_SPEC) { in snd_usb_create_stream()
257 return -EINVAL; in snd_usb_create_stream()
258 alts = &iface->altsetting[0]; in snd_usb_create_stream()
263 dev_dbg(&dev->dev, "%d:%d: skipping, already claimed\n", in snd_usb_create_stream()
265 return -EINVAL; in snd_usb_create_stream()
268 if ((altsd->bInterfaceClass == USB_CLASS_AUDIO || in snd_usb_create_stream()
269 altsd->bInterfaceClass == USB_CLASS_VENDOR_SPEC) && in snd_usb_create_stream()
270 altsd->bInterfaceSubClass == USB_SUBCLASS_MIDISTREAMING) { in snd_usb_create_stream()
272 chip->usb_id); in snd_usb_create_stream()
274 dev_err(&dev->dev, in snd_usb_create_stream()
277 return -EINVAL; in snd_usb_create_stream()
283 if ((altsd->bInterfaceClass != USB_CLASS_AUDIO && in snd_usb_create_stream()
284 altsd->bInterfaceClass != USB_CLASS_VENDOR_SPEC) || in snd_usb_create_stream()
285 altsd->bInterfaceSubClass != USB_SUBCLASS_AUDIOSTREAMING) { in snd_usb_create_stream()
286 dev_dbg(&dev->dev, in snd_usb_create_stream()
287 "%u:%d: skipping non-supported interface %d\n", in snd_usb_create_stream()
288 ctrlif, interface, altsd->bInterfaceClass); in snd_usb_create_stream()
289 /* skip non-supported classes */ in snd_usb_create_stream()
290 return -EINVAL; in snd_usb_create_stream()
294 dev_err(&dev->dev, "low speed audio streaming not supported\n"); in snd_usb_create_stream()
295 return -EINVAL; in snd_usb_create_stream()
314 struct usb_device *dev = chip->dev; in snd_usb_create_streams()
320 host_iface = &usb_ifnum_to_if(dev, ctrlif)->altsetting[0]; in snd_usb_create_streams()
322 protocol = altsd->bInterfaceProtocol; in snd_usb_create_streams()
326 dev_warn(&dev->dev, in snd_usb_create_streams()
335 h1 = snd_usb_find_csint_desc(host_iface->extra, in snd_usb_create_streams()
336 host_iface->extralen, in snd_usb_create_streams()
338 if (!h1 || h1->bLength < sizeof(*h1)) { in snd_usb_create_streams()
339 dev_err(&dev->dev, "cannot find UAC_HEADER\n"); in snd_usb_create_streams()
340 return -EINVAL; in snd_usb_create_streams()
343 rest_bytes = (void *)(host_iface->extra + in snd_usb_create_streams()
344 host_iface->extralen) - (void *)h1; in snd_usb_create_streams()
346 /* just to be sure -- this shouldn't hit at all */ in snd_usb_create_streams()
348 dev_err(&dev->dev, "invalid control header\n"); in snd_usb_create_streams()
349 return -EINVAL; in snd_usb_create_streams()
353 dev_err(&dev->dev, "too short v1 buffer descriptor\n"); in snd_usb_create_streams()
354 return -EINVAL; in snd_usb_create_streams()
357 if (!h1->bInCollection) { in snd_usb_create_streams()
358 dev_info(&dev->dev, "skipping empty audio interface (v1)\n"); in snd_usb_create_streams()
359 return -EINVAL; in snd_usb_create_streams()
362 if (rest_bytes < h1->bLength) { in snd_usb_create_streams()
363 dev_err(&dev->dev, "invalid buffer length (v1)\n"); in snd_usb_create_streams()
364 return -EINVAL; in snd_usb_create_streams()
367 if (h1->bLength < sizeof(*h1) + h1->bInCollection) { in snd_usb_create_streams()
368 dev_err(&dev->dev, "invalid UAC_HEADER (v1)\n"); in snd_usb_create_streams()
369 return -EINVAL; in snd_usb_create_streams()
372 for (i = 0; i < h1->bInCollection; i++) in snd_usb_create_streams()
373 snd_usb_create_stream(chip, ctrlif, h1->baInterfaceNr[i]); in snd_usb_create_streams()
381 usb_ifnum_to_if(dev, ctrlif)->intf_assoc; in snd_usb_create_streams()
386 * the IAD on the NuForce UDH-100, also check the next in snd_usb_create_streams()
392 iface->intf_assoc && in snd_usb_create_streams()
393 iface->intf_assoc->bFunctionClass == USB_CLASS_AUDIO && in snd_usb_create_streams()
394 iface->intf_assoc->bFunctionProtocol == UAC_VERSION_2) in snd_usb_create_streams()
395 assoc = iface->intf_assoc; in snd_usb_create_streams()
399 dev_err(&dev->dev, "Audio class v2/v3 interfaces need an interface association\n"); in snd_usb_create_streams()
400 return -EINVAL; in snd_usb_create_streams()
404 int badd = assoc->bFunctionSubClass; in snd_usb_create_streams()
409 dev_err(&dev->dev, in snd_usb_create_streams()
411 return -EINVAL; in snd_usb_create_streams()
414 chip->badd_profile = badd; in snd_usb_create_streams()
417 for (i = 0; i < assoc->bInterfaceCount; i++) { in snd_usb_create_streams()
418 int intf = assoc->bFirstInterface + i; in snd_usb_create_streams()
438 const char *profile_name; /* override card->longname */
451 "HP-Thunderbolt-Dock-Audio-Headset"),
454 "HP-Thunderbolt-Dock-Audio-Module"),
457 * TRX40 Aorus Master has two USB-audio devices, one for the front
459 * I/O (the rear panel and the front mic) with Realtek ALC1220-VB.
463 "Gigabyte-Aorus-Master-Front-Headphone"),
465 "Gigabyte-Aorus-Master-Main-Audio"),
469 "Realtek", "ALC1220-VB-DT", "Realtek-ALC1220-VB-Desktop"),
471 /* Creative/E-Mu devices */
473 /* Creative/Toshiba Multimedia Center SB-0500 */
474 DEVICE_NAME(0x041e, 0x3048, "Toshiba", "SB-0500"),
477 DEVICE_NAME(0x046d, 0x0867, "Logitech, Inc.", "Logi-MeetUp"),
478 DEVICE_NAME(0x046d, 0x0874, "Logitech, Inc.", "Logi-Tap-Audio"),
479 DEVICE_NAME(0x046d, 0x087c, "Logitech, Inc.", "Logi-Huddle"),
480 DEVICE_NAME(0x046d, 0x0898, "Logitech, Inc.", "Logi-RB-Audio"),
481 DEVICE_NAME(0x046d, 0x08d2, "Logitech, Inc.", "Logi-RBM-Audio"),
491 "Zenith-II-Front-Headphone"),
493 "Zenith-II-Main-Audio"),
497 "Realtek", "ALC1220-VB-DT", "Realtek-ALC1220-VB-Desktop"),
498 /* ASUS PRIME TRX40 PRO-S */
500 "Realtek", "ALC1220-VB-DT", "Realtek-ALC1220-VB-Desktop"),
503 PROFILE_NAME(0x0bda, 0x4014, "Dell", "WD15 Dock", "Dell-WD15-Dock"),
505 PROFILE_NAME(0x0bda, 0x402e, "Dell", "WD19 Dock", "Dell-WD15-Dock"),
518 "Realtek", "ALC1220-VB-DT", "Realtek-ALC1220-VB-Desktop"),
521 "Realtek", "ALC1220-VB-DT", "Realtek-ALC1220-VB-Desktop"),
523 DEVICE_NAME(0x0fd9, 0x0008, "Hauppauge", "HVR-950Q"),
527 "HP-Engage-Go-Dock"),
534 DEVICE_NAME(0x13e5, 0x0001, "Rane", "SL-1"),
536 /* Lenovo ThinkStation P620 Rear Line-in, Line-out and Microphone */
538 "Lenovo-ThinkStation-P620-Rear"),
541 "Lenovo-ThinkStation-P620-Main"),
545 "Realtek", "ALC1220-VB-DT", "Realtek-ALC1220-VB-Desktop"),
547 DEVICE_NAME(0x2040, 0x7200, "Hauppauge", "HVR-950Q"),
548 DEVICE_NAME(0x2040, 0x7201, "Hauppauge", "HVR-950Q-MXL"),
549 DEVICE_NAME(0x2040, 0x7210, "Hauppauge", "HVR-950Q"),
550 DEVICE_NAME(0x2040, 0x7211, "Hauppauge", "HVR-950Q-MXL"),
551 DEVICE_NAME(0x2040, 0x7213, "Hauppauge", "HVR-950Q"),
552 DEVICE_NAME(0x2040, 0x7217, "Hauppauge", "HVR-950Q"),
553 DEVICE_NAME(0x2040, 0x721b, "Hauppauge", "HVR-950Q"),
554 DEVICE_NAME(0x2040, 0x721e, "Hauppauge", "HVR-950Q"),
555 DEVICE_NAME(0x2040, 0x721f, "Hauppauge", "HVR-950Q"),
556 DEVICE_NAME(0x2040, 0x7240, "Hauppauge", "HVR-850"),
557 DEVICE_NAME(0x2040, 0x7260, "Hauppauge", "HVR-950Q"),
558 DEVICE_NAME(0x2040, 0x7270, "Hauppauge", "HVR-950Q"),
559 DEVICE_NAME(0x2040, 0x7280, "Hauppauge", "HVR-950Q"),
560 DEVICE_NAME(0x2040, 0x7281, "Hauppauge", "HVR-950Q-MXL"),
571 for (p = usb_audio_names; p->id; p++) in lookup_device_name()
572 if (p->id == id) in lookup_device_name()
586 struct snd_usb_audio *chip = card->private_data; in snd_usb_audio_free()
591 mutex_destroy(&chip->mutex); in snd_usb_audio_free()
592 if (!atomic_read(&chip->shutdown)) in snd_usb_audio_free()
593 dev_set_drvdata(&chip->dev->dev, NULL); in snd_usb_audio_free()
600 struct snd_card *card = chip->card; in usb_audio_make_shortname()
604 preset = lookup_device_name(chip->usb_id); in usb_audio_make_shortname()
605 if (preset && preset->product_name) in usb_audio_make_shortname()
606 s = preset->product_name; in usb_audio_make_shortname()
607 else if (quirk && quirk->product_name) in usb_audio_make_shortname()
608 s = quirk->product_name; in usb_audio_make_shortname()
610 strscpy(card->shortname, s, sizeof(card->shortname)); in usb_audio_make_shortname()
615 if (!dev->descriptor.iProduct || in usb_audio_make_shortname()
616 usb_string(dev, dev->descriptor.iProduct, in usb_audio_make_shortname()
617 card->shortname, sizeof(card->shortname)) <= 0) { in usb_audio_make_shortname()
619 scnprintf(card->shortname, sizeof(card->shortname), in usb_audio_make_shortname()
621 USB_ID_VENDOR(chip->usb_id), in usb_audio_make_shortname()
622 USB_ID_PRODUCT(chip->usb_id)); in usb_audio_make_shortname()
625 strim(card->shortname); in usb_audio_make_shortname()
632 struct snd_card *card = chip->card; in usb_audio_make_longname()
637 preset = lookup_device_name(chip->usb_id); in usb_audio_make_longname()
639 /* shortcut - if any pre-defined string is given, use it */ in usb_audio_make_longname()
640 if (preset && preset->profile_name) in usb_audio_make_longname()
641 s = preset->profile_name; in usb_audio_make_longname()
643 strscpy(card->longname, s, sizeof(card->longname)); in usb_audio_make_longname()
647 if (preset && preset->vendor_name) in usb_audio_make_longname()
648 s = preset->vendor_name; in usb_audio_make_longname()
649 else if (quirk && quirk->vendor_name) in usb_audio_make_longname()
650 s = quirk->vendor_name; in usb_audio_make_longname()
651 *card->longname = 0; in usb_audio_make_longname()
653 strscpy(card->longname, s, sizeof(card->longname)); in usb_audio_make_longname()
656 if (dev->descriptor.iManufacturer) in usb_audio_make_longname()
657 usb_string(dev, dev->descriptor.iManufacturer, in usb_audio_make_longname()
658 card->longname, sizeof(card->longname)); in usb_audio_make_longname()
661 if (*card->longname) { in usb_audio_make_longname()
662 strim(card->longname); in usb_audio_make_longname()
663 if (*card->longname) in usb_audio_make_longname()
664 strlcat(card->longname, " ", sizeof(card->longname)); in usb_audio_make_longname()
667 strlcat(card->longname, card->shortname, sizeof(card->longname)); in usb_audio_make_longname()
669 len = strlcat(card->longname, " at ", sizeof(card->longname)); in usb_audio_make_longname()
671 if (len < sizeof(card->longname)) in usb_audio_make_longname()
672 usb_make_path(dev, card->longname + len, sizeof(card->longname) - len); in usb_audio_make_longname()
676 strlcat(card->longname, ", low speed", sizeof(card->longname)); in usb_audio_make_longname()
679 strlcat(card->longname, ", full speed", sizeof(card->longname)); in usb_audio_make_longname()
682 strlcat(card->longname, ", high speed", sizeof(card->longname)); in usb_audio_make_longname()
685 strlcat(card->longname, ", super speed", sizeof(card->longname)); in usb_audio_make_longname()
688 strlcat(card->longname, ", super speed plus", sizeof(card->longname)); in usb_audio_make_longname()
719 dev_err(&dev->dev, "unknown device speed %d\n", snd_usb_get_speed(dev)); in snd_usb_audio_create()
720 return -ENXIO; in snd_usb_audio_create()
723 err = snd_card_new(&intf->dev, index[idx], id[idx], THIS_MODULE, in snd_usb_audio_create()
726 dev_err(&dev->dev, "cannot create card instance %d\n", idx); in snd_usb_audio_create()
730 chip = card->private_data; in snd_usb_audio_create()
731 mutex_init(&chip->mutex); in snd_usb_audio_create()
732 init_waitqueue_head(&chip->shutdown_wait); in snd_usb_audio_create()
733 chip->index = idx; in snd_usb_audio_create()
734 chip->dev = dev; in snd_usb_audio_create()
735 chip->card = card; in snd_usb_audio_create()
736 chip->setup = device_setup[idx]; in snd_usb_audio_create()
737 chip->generic_implicit_fb = implicit_fb[idx]; in snd_usb_audio_create()
738 chip->autoclock = autoclock; in snd_usb_audio_create()
739 chip->lowlatency = lowlatency; in snd_usb_audio_create()
740 atomic_set(&chip->active, 1); /* avoid autopm during probing */ in snd_usb_audio_create()
741 atomic_set(&chip->usage_count, 0); in snd_usb_audio_create()
742 atomic_set(&chip->shutdown, 0); in snd_usb_audio_create()
744 chip->usb_id = usb_id; in snd_usb_audio_create()
745 INIT_LIST_HEAD(&chip->pcm_list); in snd_usb_audio_create()
746 INIT_LIST_HEAD(&chip->ep_list); in snd_usb_audio_create()
747 INIT_LIST_HEAD(&chip->iface_ref_list); in snd_usb_audio_create()
748 INIT_LIST_HEAD(&chip->clock_ref_list); in snd_usb_audio_create()
749 INIT_LIST_HEAD(&chip->midi_list); in snd_usb_audio_create()
750 INIT_LIST_HEAD(&chip->midi_v2_list); in snd_usb_audio_create()
751 INIT_LIST_HEAD(&chip->mixer_list); in snd_usb_audio_create()
754 chip->quirk_flags = quirk_flags[idx]; in snd_usb_audio_create()
758 card->private_free = snd_usb_audio_free; in snd_usb_audio_create()
760 strscpy(card->driver, "USB-Audio"); in snd_usb_audio_create()
762 USB_ID_VENDOR(chip->usb_id), USB_ID_PRODUCT(chip->usb_id)); in snd_usb_audio_create()
785 dev_info(&dev->dev, in get_alias_id()
804 id == chip->usb_id) in check_delayed_register_option()
808 return -1; in check_delayed_register_option()
816 struct usb_host_config *config = chip->dev->actconfig; in find_last_interface()
822 for (i = 0; i < config->desc.bNumInterfaces; i++) { in find_last_interface()
823 intf = config->interface[i]; in find_last_interface()
825 chip->last_iface = intf->altsetting[0].desc.bInterfaceNumber; in find_last_interface()
827 usb_audio_dbg(chip, "Found last interface = %d\n", chip->last_iface); in find_last_interface()
836 for (p = usb_audio_ids; p->match_flags; p++) { in get_alias_quirk()
838 if ((p->match_flags & USB_DEVICE_ID_MATCH_DEVICE) == in get_alias_quirk()
840 p->idVendor == USB_ID_VENDOR(id) && in get_alias_quirk()
841 p->idProduct == USB_ID_PRODUCT(id)) in get_alias_quirk()
842 return (const struct snd_usb_audio_quirk *)p->driver_info; in get_alias_quirk()
854 chip->last_iface == ifnum || in try_to_register_card()
855 usb_interface_claimed(usb_ifnum_to_if(chip->dev, chip->last_iface))) in try_to_register_card()
856 return snd_card_register(chip->card); in try_to_register_card()
875 (const struct snd_usb_audio_quirk *)usb_id->driver_info; in usb_audio_probe()
882 alts = &intf->altsetting[0]; in usb_audio_probe()
883 ifnum = get_iface_desc(alts)->bInterfaceNumber; in usb_audio_probe()
884 id = USB_ID(le16_to_cpu(dev->descriptor.idVendor), in usb_audio_probe()
885 le16_to_cpu(dev->descriptor.idProduct)); in usb_audio_probe()
888 if (quirk && quirk->ifnum >= 0 && ifnum != quirk->ifnum) in usb_audio_probe()
889 return -ENXIO; in usb_audio_probe()
890 if (quirk && quirk->ifnum == QUIRK_NODEV_INTERFACE) in usb_audio_probe()
891 return -ENODEV; in usb_audio_probe()
905 if (usb_chip[i] && usb_chip[i]->dev == dev) { in usb_audio_probe()
906 if (atomic_read(&usb_chip[i]->shutdown)) { in usb_audio_probe()
907 dev_err(&dev->dev, "USB device is in the shutdown state, cannot create a card instance\n"); in usb_audio_probe()
908 err = -EIO; in usb_audio_probe()
912 atomic_inc(&chip->active); /* avoid autopm */ in usb_audio_probe()
926 (vid[i] == -1 || vid[i] == USB_ID_VENDOR(id)) && in usb_audio_probe()
927 (pid[i] == -1 || pid[i] == USB_ID_PRODUCT(id))) { in usb_audio_probe()
934 } else if (vid[i] != -1 || pid[i] != -1) { in usb_audio_probe()
935 dev_info(&dev->dev, in usb_audio_probe()
939 err = -ENOENT; in usb_audio_probe()
944 dev_err(&dev->dev, "no available usb audio device\n"); in usb_audio_probe()
945 err = -ENODEV; in usb_audio_probe()
951 if (chip->num_interfaces >= MAX_CARD_INTERFACES) { in usb_audio_probe()
952 dev_info(&dev->dev, "Too many interfaces assigned to the single USB-audio card\n"); in usb_audio_probe()
953 err = -EINVAL; in usb_audio_probe()
957 dev_set_drvdata(&dev->dev, chip); in usb_audio_probe()
960 chip->quirk_flags |= QUIRK_FLAG_IGNORE_CTL_ERROR; in usb_audio_probe()
962 if (chip->quirk_flags & QUIRK_FLAG_DISABLE_AUTOSUSPEND) in usb_audio_probe()
970 if (!chip->ctrl_intf) in usb_audio_probe()
971 chip->ctrl_intf = alts; in usb_audio_probe()
974 if (quirk && quirk->ifnum != QUIRK_NO_INTERFACE) { in usb_audio_probe()
991 if (chip->need_delayed_register) { in usb_audio_probe()
992 dev_info(&dev->dev, in usb_audio_probe()
993 "Found post-registration device assignment: %08x:%02x\n", in usb_audio_probe()
994 chip->usb_id, ifnum); in usb_audio_probe()
995 chip->need_delayed_register = false; /* clear again */ in usb_audio_probe()
1002 if (chip->quirk_flags & QUIRK_FLAG_SHARE_MEDIA_DEVICE) { in usb_audio_probe()
1008 chip->quirk_type = quirk->type; in usb_audio_probe()
1010 usb_chip[chip->index] = chip; in usb_audio_probe()
1011 chip->intf[chip->num_interfaces] = intf; in usb_audio_probe()
1012 chip->num_interfaces++; in usb_audio_probe()
1014 atomic_dec(&chip->active); in usb_audio_probe()
1016 if (platform_ops && platform_ops->connect_cb) in usb_audio_probe()
1017 platform_ops->connect_cb(chip); in usb_audio_probe()
1029 /* chip->active is inside the chip->card object, in usb_audio_probe()
1032 atomic_dec(&chip->active); in usb_audio_probe()
1033 if (!chip->num_interfaces) in usb_audio_probe()
1034 snd_card_free(chip->card); in usb_audio_probe()
1053 card = chip->card; in usb_audio_disconnect()
1056 if (platform_ops && platform_ops->disconnect_cb) in usb_audio_disconnect()
1057 platform_ops->disconnect_cb(chip); in usb_audio_disconnect()
1059 if (atomic_inc_return(&chip->shutdown) == 1) { in usb_audio_disconnect()
1067 wait_event(chip->shutdown_wait, in usb_audio_disconnect()
1068 !atomic_read(&chip->usage_count)); in usb_audio_disconnect()
1071 list_for_each_entry(as, &chip->pcm_list, list) { in usb_audio_disconnect()
1075 list_for_each_entry(ep, &chip->ep_list, list) { in usb_audio_disconnect()
1079 list_for_each(p, &chip->midi_list) { in usb_audio_disconnect()
1084 * Nice to check quirk && quirk->shares_media_device and in usb_audio_disconnect()
1092 list_for_each_entry(mixer, &chip->mixer_list, list) { in usb_audio_disconnect()
1097 if (chip->quirk_flags & QUIRK_FLAG_DISABLE_AUTOSUSPEND) in usb_audio_disconnect()
1100 chip->num_interfaces--; in usb_audio_disconnect()
1101 if (chip->num_interfaces <= 0) { in usb_audio_disconnect()
1102 usb_chip[chip->index] = NULL; in usb_audio_disconnect()
1115 atomic_inc(&chip->usage_count); in snd_usb_lock_shutdown()
1116 if (atomic_read(&chip->shutdown)) { in snd_usb_lock_shutdown()
1117 err = -EIO; in snd_usb_lock_shutdown()
1126 if (atomic_dec_and_test(&chip->usage_count)) in snd_usb_lock_shutdown()
1127 wake_up(&chip->shutdown_wait); in snd_usb_lock_shutdown()
1136 if (atomic_dec_and_test(&chip->usage_count)) in snd_usb_unlock_shutdown()
1137 wake_up(&chip->shutdown_wait); in snd_usb_unlock_shutdown()
1145 if (atomic_read(&chip->shutdown)) in snd_usb_autoresume()
1146 return -EIO; in snd_usb_autoresume()
1147 if (atomic_inc_return(&chip->active) != 1) in snd_usb_autoresume()
1150 for (i = 0; i < chip->num_interfaces; i++) { in snd_usb_autoresume()
1151 err = usb_autopm_get_interface(chip->intf[i]); in snd_usb_autoresume()
1154 while (--i >= 0) in snd_usb_autoresume()
1155 usb_autopm_put_interface(chip->intf[i]); in snd_usb_autoresume()
1156 atomic_dec(&chip->active); in snd_usb_autoresume()
1168 if (atomic_read(&chip->shutdown)) in snd_usb_autosuspend()
1170 if (!atomic_dec_and_test(&chip->active)) in snd_usb_autosuspend()
1173 for (i = 0; i < chip->num_interfaces; i++) in snd_usb_autosuspend()
1174 usb_autopm_put_interface(chip->intf[i]); in snd_usb_autosuspend()
1189 if (!chip->num_suspended_intf++) { in usb_audio_suspend()
1190 list_for_each_entry(as, &chip->pcm_list, list) in usb_audio_suspend()
1192 list_for_each_entry(ep, &chip->ep_list, list) in usb_audio_suspend()
1194 list_for_each(p, &chip->midi_list) in usb_audio_suspend()
1196 list_for_each_entry(mixer, &chip->mixer_list, list) in usb_audio_suspend()
1201 if (!PMSG_IS_AUTO(message) && !chip->system_suspend) { in usb_audio_suspend()
1202 snd_power_change_state(chip->card, SNDRV_CTL_POWER_D3hot); in usb_audio_suspend()
1203 chip->system_suspend = chip->num_suspended_intf; in usb_audio_suspend()
1206 if (platform_ops && platform_ops->suspend_cb) in usb_audio_suspend()
1207 platform_ops->suspend_cb(intf, message); in usb_audio_suspend()
1223 atomic_inc(&chip->active); /* avoid autopm */ in usb_audio_resume()
1224 if (chip->num_suspended_intf > 1) in usb_audio_resume()
1227 list_for_each_entry(as, &chip->pcm_list, list) { in usb_audio_resume()
1237 list_for_each_entry(mixer, &chip->mixer_list, list) { in usb_audio_resume()
1243 list_for_each(p, &chip->midi_list) { in usb_audio_resume()
1249 if (platform_ops && platform_ops->resume_cb) in usb_audio_resume()
1250 platform_ops->resume_cb(intf); in usb_audio_resume()
1253 if (chip->num_suspended_intf == chip->system_suspend) { in usb_audio_resume()
1254 snd_power_change_state(chip->card, SNDRV_CTL_POWER_D0); in usb_audio_resume()
1255 chip->system_suspend = 0; in usb_audio_resume()
1257 chip->num_suspended_intf--; in usb_audio_resume()
1260 atomic_dec(&chip->active); /* allow autopm after this point */ in usb_audio_resume()
1265 #include "quirks-table.h"
1278 .name = "snd-usb-audio",