Lines Matching +full:accessory +full:- +full:mode +full:- +full:audio
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * (Tentative) USB Audio Driver for ALSA
7 * Many codes borrowed from audio.c by
11 * Audio Class 3.0 support by Ruslan Bilovol <ruslan.bilovol@gmail.com>
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
32 #include <linux/usb/audio.h>
33 #include <linux/usb/audio-v2.h>
34 #include <linux/usb/audio-v3.h>
60 MODULE_DESCRIPTION("USB Audio");
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 };
82 MODULE_PARM_DESC(index, "Index value for the USB audio adapter.");
84 MODULE_PARM_DESC(id, "ID string for the USB audio adapter.");
86 MODULE_PARM_DESC(enable, "Enable USB audio adapter.");
88 MODULE_PARM_DESC(vid, "Vendor ID for the USB audio device.");
90 MODULE_PARM_DESC(pid, "Product ID for the USB audio device.");
97 MODULE_PARM_DESC(autoclock, "Enable auto-clock selection for UAC2 devices (default: yes).");
105 MODULE_PARM_DESC(implicit_fb, "Apply generic implicit feedback sync mode.");
126 * enable features, such as USB audio offloading, which allows for audio data
127 * to be queued by an audio DSP.
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()
180 * Checks to see if requested audio profile, i.e sample rate, # of
182 * USB audio device.
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()
246 * Android with both accessory and audio interfaces enabled gets the 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()
310 * parse audio control descriptor and create pcm/midi streams
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 */
449 /* HP Thunderbolt Dock Audio Headset */
450 PROFILE_NAME(0x03f0, 0x0269, "HP", "Thunderbolt Dock Audio Headset",
451 "HP-Thunderbolt-Dock-Audio-Headset"),
452 /* HP Thunderbolt Dock Audio Module */
453 PROFILE_NAME(0x03f0, 0x0567, "HP", "Thunderbolt Dock Audio Module",
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"),
464 PROFILE_NAME(0x0414, 0xa001, "Gigabyte", "Aorus Master Main Audio",
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"),
476 /* Logitech Audio Devices */
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"),
492 PROFILE_NAME(0x0b05, 0x1916, "ASUS", "Zenith II Main Audio",
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"),
514 DEVICE_NAME(0x0d8c, 0x0103, NULL, "Audio Advantage MicroII"),
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 sprintf(card->shortname, "USB Device %#04x:%#04x", in usb_audio_make_shortname()
620 USB_ID_VENDOR(chip->usb_id), in usb_audio_make_shortname()
621 USB_ID_PRODUCT(chip->usb_id)); in usb_audio_make_shortname()
624 strim(card->shortname); in usb_audio_make_shortname()
631 struct snd_card *card = chip->card; in usb_audio_make_longname()
636 preset = lookup_device_name(chip->usb_id); in usb_audio_make_longname()
638 /* shortcut - if any pre-defined string is given, use it */ in usb_audio_make_longname()
639 if (preset && preset->profile_name) in usb_audio_make_longname()
640 s = preset->profile_name; in usb_audio_make_longname()
642 strscpy(card->longname, s, sizeof(card->longname)); in usb_audio_make_longname()
646 if (preset && preset->vendor_name) in usb_audio_make_longname()
647 s = preset->vendor_name; in usb_audio_make_longname()
648 else if (quirk && quirk->vendor_name) in usb_audio_make_longname()
649 s = quirk->vendor_name; in usb_audio_make_longname()
650 *card->longname = 0; in usb_audio_make_longname()
652 strscpy(card->longname, s, sizeof(card->longname)); in usb_audio_make_longname()
655 if (dev->descriptor.iManufacturer) in usb_audio_make_longname()
656 usb_string(dev, dev->descriptor.iManufacturer, in usb_audio_make_longname()
657 card->longname, sizeof(card->longname)); in usb_audio_make_longname()
660 if (*card->longname) { in usb_audio_make_longname()
661 strim(card->longname); in usb_audio_make_longname()
662 if (*card->longname) in usb_audio_make_longname()
663 strlcat(card->longname, " ", sizeof(card->longname)); in usb_audio_make_longname()
666 strlcat(card->longname, card->shortname, sizeof(card->longname)); in usb_audio_make_longname()
668 len = strlcat(card->longname, " at ", sizeof(card->longname)); in usb_audio_make_longname()
670 if (len < sizeof(card->longname)) in usb_audio_make_longname()
671 usb_make_path(dev, card->longname + len, sizeof(card->longname) - len); in usb_audio_make_longname()
675 strlcat(card->longname, ", low speed", sizeof(card->longname)); in usb_audio_make_longname()
678 strlcat(card->longname, ", full speed", sizeof(card->longname)); in usb_audio_make_longname()
681 strlcat(card->longname, ", high speed", sizeof(card->longname)); in usb_audio_make_longname()
684 strlcat(card->longname, ", super speed", sizeof(card->longname)); in usb_audio_make_longname()
687 strlcat(card->longname, ", super speed plus", sizeof(card->longname)); in usb_audio_make_longname()
718 dev_err(&dev->dev, "unknown device speed %d\n", snd_usb_get_speed(dev)); in snd_usb_audio_create()
719 return -ENXIO; in snd_usb_audio_create()
722 err = snd_card_new(&intf->dev, index[idx], id[idx], THIS_MODULE, in snd_usb_audio_create()
725 dev_err(&dev->dev, "cannot create card instance %d\n", idx); in snd_usb_audio_create()
729 chip = card->private_data; in snd_usb_audio_create()
730 mutex_init(&chip->mutex); in snd_usb_audio_create()
731 init_waitqueue_head(&chip->shutdown_wait); in snd_usb_audio_create()
732 chip->index = idx; in snd_usb_audio_create()
733 chip->dev = dev; in snd_usb_audio_create()
734 chip->card = card; in snd_usb_audio_create()
735 chip->setup = device_setup[idx]; in snd_usb_audio_create()
736 chip->generic_implicit_fb = implicit_fb[idx]; in snd_usb_audio_create()
737 chip->autoclock = autoclock; in snd_usb_audio_create()
738 chip->lowlatency = lowlatency; in snd_usb_audio_create()
739 atomic_set(&chip->active, 1); /* avoid autopm during probing */ in snd_usb_audio_create()
740 atomic_set(&chip->usage_count, 0); in snd_usb_audio_create()
741 atomic_set(&chip->shutdown, 0); in snd_usb_audio_create()
743 chip->usb_id = usb_id; in snd_usb_audio_create()
744 INIT_LIST_HEAD(&chip->pcm_list); in snd_usb_audio_create()
745 INIT_LIST_HEAD(&chip->ep_list); in snd_usb_audio_create()
746 INIT_LIST_HEAD(&chip->iface_ref_list); in snd_usb_audio_create()
747 INIT_LIST_HEAD(&chip->clock_ref_list); in snd_usb_audio_create()
748 INIT_LIST_HEAD(&chip->midi_list); in snd_usb_audio_create()
749 INIT_LIST_HEAD(&chip->midi_v2_list); in snd_usb_audio_create()
750 INIT_LIST_HEAD(&chip->mixer_list); in snd_usb_audio_create()
753 chip->quirk_flags = quirk_flags[idx]; in snd_usb_audio_create()
757 card->private_free = snd_usb_audio_free; in snd_usb_audio_create()
759 strcpy(card->driver, "USB-Audio"); in snd_usb_audio_create()
761 USB_ID_VENDOR(chip->usb_id), USB_ID_PRODUCT(chip->usb_id)); in snd_usb_audio_create()
784 dev_info(&dev->dev, in get_alias_id()
803 id == chip->usb_id) in check_delayed_register_option()
807 return -1; in check_delayed_register_option()
815 struct usb_host_config *config = chip->dev->actconfig; in find_last_interface()
821 for (i = 0; i < config->desc.bNumInterfaces; i++) { in find_last_interface()
822 intf = config->interface[i]; in find_last_interface()
824 chip->last_iface = intf->altsetting[0].desc.bInterfaceNumber; in find_last_interface()
826 usb_audio_dbg(chip, "Found last interface = %d\n", chip->last_iface); in find_last_interface()
835 for (p = usb_audio_ids; p->match_flags; p++) { in get_alias_quirk()
837 if ((p->match_flags & USB_DEVICE_ID_MATCH_DEVICE) == in get_alias_quirk()
839 p->idVendor == USB_ID_VENDOR(id) && in get_alias_quirk()
840 p->idProduct == USB_ID_PRODUCT(id)) in get_alias_quirk()
841 return (const struct snd_usb_audio_quirk *)p->driver_info; in get_alias_quirk()
853 chip->last_iface == ifnum || in try_to_register_card()
854 usb_interface_claimed(usb_ifnum_to_if(chip->dev, chip->last_iface))) in try_to_register_card()
855 return snd_card_register(chip->card); in try_to_register_card()
863 * includes multiple audio control interfaces.
874 (const struct snd_usb_audio_quirk *)usb_id->driver_info; in usb_audio_probe()
881 alts = &intf->altsetting[0]; in usb_audio_probe()
882 ifnum = get_iface_desc(alts)->bInterfaceNumber; in usb_audio_probe()
883 id = USB_ID(le16_to_cpu(dev->descriptor.idVendor), in usb_audio_probe()
884 le16_to_cpu(dev->descriptor.idProduct)); in usb_audio_probe()
887 if (quirk && quirk->ifnum >= 0 && ifnum != quirk->ifnum) in usb_audio_probe()
888 return -ENXIO; in usb_audio_probe()
889 if (quirk && quirk->ifnum == QUIRK_NODEV_INTERFACE) in usb_audio_probe()
890 return -ENODEV; in usb_audio_probe()
904 if (usb_chip[i] && usb_chip[i]->dev == dev) { in usb_audio_probe()
905 if (atomic_read(&usb_chip[i]->shutdown)) { in usb_audio_probe()
906 dev_err(&dev->dev, "USB device is in the shutdown state, cannot create a card instance\n"); in usb_audio_probe()
907 err = -EIO; in usb_audio_probe()
911 atomic_inc(&chip->active); /* avoid autopm */ in usb_audio_probe()
925 (vid[i] == -1 || vid[i] == USB_ID_VENDOR(id)) && in usb_audio_probe()
926 (pid[i] == -1 || pid[i] == USB_ID_PRODUCT(id))) { in usb_audio_probe()
933 } else if (vid[i] != -1 || pid[i] != -1) { in usb_audio_probe()
934 dev_info(&dev->dev, in usb_audio_probe()
938 err = -ENOENT; in usb_audio_probe()
943 dev_err(&dev->dev, "no available usb audio device\n"); in usb_audio_probe()
944 err = -ENODEV; in usb_audio_probe()
950 if (chip->num_interfaces >= MAX_CARD_INTERFACES) { in usb_audio_probe()
951 dev_info(&dev->dev, "Too many interfaces assigned to the single USB-audio card\n"); in usb_audio_probe()
952 err = -EINVAL; in usb_audio_probe()
956 dev_set_drvdata(&dev->dev, chip); in usb_audio_probe()
959 chip->quirk_flags |= QUIRK_FLAG_IGNORE_CTL_ERROR; in usb_audio_probe()
961 if (chip->quirk_flags & QUIRK_FLAG_DISABLE_AUTOSUSPEND) in usb_audio_probe()
966 * first contains the audio controls. We might need a more specific in usb_audio_probe()
969 if (!chip->ctrl_intf) in usb_audio_probe()
970 chip->ctrl_intf = alts; in usb_audio_probe()
973 if (quirk && quirk->ifnum != QUIRK_NO_INTERFACE) { in usb_audio_probe()
981 /* create normal USB audio interfaces */ in usb_audio_probe()
990 if (chip->need_delayed_register) { in usb_audio_probe()
991 dev_info(&dev->dev, in usb_audio_probe()
992 "Found post-registration device assignment: %08x:%02x\n", in usb_audio_probe()
993 chip->usb_id, ifnum); in usb_audio_probe()
994 chip->need_delayed_register = false; /* clear again */ in usb_audio_probe()
1001 if (chip->quirk_flags & QUIRK_FLAG_SHARE_MEDIA_DEVICE) { in usb_audio_probe()
1007 chip->quirk_type = quirk->type; in usb_audio_probe()
1009 usb_chip[chip->index] = chip; in usb_audio_probe()
1010 chip->intf[chip->num_interfaces] = intf; in usb_audio_probe()
1011 chip->num_interfaces++; in usb_audio_probe()
1013 atomic_dec(&chip->active); in usb_audio_probe()
1015 if (platform_ops && platform_ops->connect_cb) in usb_audio_probe()
1016 platform_ops->connect_cb(chip); in usb_audio_probe()
1028 /* chip->active is inside the chip->card object, in usb_audio_probe()
1031 atomic_dec(&chip->active); in usb_audio_probe()
1032 if (!chip->num_interfaces) in usb_audio_probe()
1033 snd_card_free(chip->card); in usb_audio_probe()
1052 card = chip->card; in usb_audio_disconnect()
1055 if (platform_ops && platform_ops->disconnect_cb) in usb_audio_disconnect()
1056 platform_ops->disconnect_cb(chip); in usb_audio_disconnect()
1058 if (atomic_inc_return(&chip->shutdown) == 1) { in usb_audio_disconnect()
1066 wait_event(chip->shutdown_wait, in usb_audio_disconnect()
1067 !atomic_read(&chip->usage_count)); in usb_audio_disconnect()
1070 list_for_each_entry(as, &chip->pcm_list, list) { in usb_audio_disconnect()
1074 list_for_each_entry(ep, &chip->ep_list, list) { in usb_audio_disconnect()
1078 list_for_each(p, &chip->midi_list) { in usb_audio_disconnect()
1083 * Nice to check quirk && quirk->shares_media_device and in usb_audio_disconnect()
1091 list_for_each_entry(mixer, &chip->mixer_list, list) { in usb_audio_disconnect()
1096 if (chip->quirk_flags & QUIRK_FLAG_DISABLE_AUTOSUSPEND) in usb_audio_disconnect()
1099 chip->num_interfaces--; in usb_audio_disconnect()
1100 if (chip->num_interfaces <= 0) { in usb_audio_disconnect()
1101 usb_chip[chip->index] = NULL; in usb_audio_disconnect()
1114 atomic_inc(&chip->usage_count); in snd_usb_lock_shutdown()
1115 if (atomic_read(&chip->shutdown)) { in snd_usb_lock_shutdown()
1116 err = -EIO; in snd_usb_lock_shutdown()
1125 if (atomic_dec_and_test(&chip->usage_count)) in snd_usb_lock_shutdown()
1126 wake_up(&chip->shutdown_wait); in snd_usb_lock_shutdown()
1135 if (atomic_dec_and_test(&chip->usage_count)) in snd_usb_unlock_shutdown()
1136 wake_up(&chip->shutdown_wait); in snd_usb_unlock_shutdown()
1144 if (atomic_read(&chip->shutdown)) in snd_usb_autoresume()
1145 return -EIO; in snd_usb_autoresume()
1146 if (atomic_inc_return(&chip->active) != 1) in snd_usb_autoresume()
1149 for (i = 0; i < chip->num_interfaces; i++) { in snd_usb_autoresume()
1150 err = usb_autopm_get_interface(chip->intf[i]); in snd_usb_autoresume()
1153 while (--i >= 0) in snd_usb_autoresume()
1154 usb_autopm_put_interface(chip->intf[i]); in snd_usb_autoresume()
1155 atomic_dec(&chip->active); in snd_usb_autoresume()
1167 if (atomic_read(&chip->shutdown)) in snd_usb_autosuspend()
1169 if (!atomic_dec_and_test(&chip->active)) in snd_usb_autosuspend()
1172 for (i = 0; i < chip->num_interfaces; i++) in snd_usb_autosuspend()
1173 usb_autopm_put_interface(chip->intf[i]); in snd_usb_autosuspend()
1188 if (!chip->num_suspended_intf++) { in usb_audio_suspend()
1189 list_for_each_entry(as, &chip->pcm_list, list) in usb_audio_suspend()
1191 list_for_each_entry(ep, &chip->ep_list, list) in usb_audio_suspend()
1193 list_for_each(p, &chip->midi_list) in usb_audio_suspend()
1195 list_for_each_entry(mixer, &chip->mixer_list, list) in usb_audio_suspend()
1200 if (!PMSG_IS_AUTO(message) && !chip->system_suspend) { in usb_audio_suspend()
1201 snd_power_change_state(chip->card, SNDRV_CTL_POWER_D3hot); in usb_audio_suspend()
1202 chip->system_suspend = chip->num_suspended_intf; in usb_audio_suspend()
1205 if (platform_ops && platform_ops->suspend_cb) in usb_audio_suspend()
1206 platform_ops->suspend_cb(intf, message); in usb_audio_suspend()
1222 atomic_inc(&chip->active); /* avoid autopm */ in usb_audio_resume()
1223 if (chip->num_suspended_intf > 1) in usb_audio_resume()
1226 list_for_each_entry(as, &chip->pcm_list, list) { in usb_audio_resume()
1236 list_for_each_entry(mixer, &chip->mixer_list, list) { in usb_audio_resume()
1242 list_for_each(p, &chip->midi_list) { in usb_audio_resume()
1248 if (platform_ops && platform_ops->resume_cb) in usb_audio_resume()
1249 platform_ops->resume_cb(intf); in usb_audio_resume()
1252 if (chip->num_suspended_intf == chip->system_suspend) { in usb_audio_resume()
1253 snd_power_change_state(chip->card, SNDRV_CTL_POWER_D0); in usb_audio_resume()
1254 chip->system_suspend = 0; in usb_audio_resume()
1256 chip->num_suspended_intf--; in usb_audio_resume()
1259 atomic_dec(&chip->active); /* allow autopm after this point */ in usb_audio_resume()
1264 #include "quirks-table.h"
1277 .name = "snd-usb-audio",