blob: 376962291c4db8b66e7a023c9b7c881ecad094e5 [file] [log] [blame]
Thomas Gleixner1a59d1b82019-05-27 08:55:05 +02001// SPDX-License-Identifier: GPL-2.0-or-later
Daniel Macke5779992010-03-04 19:46:13 +01002/*
3 * (Tentative) USB Audio Driver for ALSA
4 *
5 * Copyright (c) 2002 by Takashi Iwai <tiwai@suse.de>
6 *
7 * Many codes borrowed from audio.c by
8 * Alan Cox (alan@lxorguk.ukuu.org.uk)
9 * Thomas Sailer (sailer@ife.ee.ethz.ch)
10 *
Ruslan Bilovol9a2fe9b2018-03-21 02:03:59 +020011 * Audio Class 3.0 support by Ruslan Bilovol <ruslan.bilovol@gmail.com>
Daniel Macke5779992010-03-04 19:46:13 +010012 *
Daniel Macke5779992010-03-04 19:46:13 +010013 * NOTES:
14 *
Daniel Macke5779992010-03-04 19:46:13 +010015 * - the linked URBs would be preferred but not used so far because of
16 * the instability of unlinking.
17 * - type II is not supported properly. there is no device which supports
18 * this type *correctly*. SB extigy looks as if it supports, but it's
19 * indeed an AC3 stream packed in SPDIF frames (i.e. no real AC3 stream).
20 */
21
22
23#include <linux/bitops.h>
24#include <linux/init.h>
25#include <linux/list.h>
26#include <linux/slab.h>
27#include <linux/string.h>
Takashi Iwai3ffc1222011-03-21 12:00:00 +010028#include <linux/ctype.h>
Daniel Macke5779992010-03-04 19:46:13 +010029#include <linux/usb.h>
30#include <linux/moduleparam.h>
31#include <linux/mutex.h>
32#include <linux/usb/audio.h>
Daniel Mack7e847892010-03-11 21:13:20 +010033#include <linux/usb/audio-v2.h>
Ruslan Bilovol9a2fe9b2018-03-21 02:03:59 +020034#include <linux/usb/audio-v3.h>
Paul Gortmakerda155d52011-07-15 12:38:28 -040035#include <linux/module.h>
Daniel Macke5779992010-03-04 19:46:13 +010036
Daniel Mack9e386582011-05-25 09:09:01 +020037#include <sound/control.h>
Daniel Macke5779992010-03-04 19:46:13 +010038#include <sound/core.h>
39#include <sound/info.h>
40#include <sound/pcm.h>
41#include <sound/pcm_params.h>
42#include <sound/initval.h>
43
44#include "usbaudio.h"
45#include "card.h"
46#include "midi.h"
Daniel Mackf0b5e632010-03-11 21:13:23 +010047#include "mixer.h"
Daniel Macke5779992010-03-04 19:46:13 +010048#include "proc.h"
49#include "quirks.h"
50#include "endpoint.h"
51#include "helper.h"
Daniel Macke5779992010-03-04 19:46:13 +010052#include "pcm.h"
Daniel Macke5779992010-03-04 19:46:13 +010053#include "format.h"
Oliver Neukum88a85162011-03-11 14:51:12 +010054#include "power.h"
Daniel Macke8e8bab2011-09-12 18:54:12 +020055#include "stream.h"
Shuah Khan66354f12019-04-01 20:40:22 -040056#include "media.h"
Daniel Macke5779992010-03-04 19:46:13 +010057
58MODULE_AUTHOR("Takashi Iwai <tiwai@suse.de>");
59MODULE_DESCRIPTION("USB Audio");
60MODULE_LICENSE("GPL");
Daniel Macke5779992010-03-04 19:46:13 +010061
62static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; /* Index 0-MAX */
63static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; /* ID for this card */
Rusty Russella67ff6a2011-12-15 13:49:36 +103064static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;/* Enable this card */
Daniel Macke5779992010-03-04 19:46:13 +010065/* Vendor/product IDs for this card */
66static int vid[SNDRV_CARDS] = { [0 ... (SNDRV_CARDS-1)] = -1 };
67static int pid[SNDRV_CARDS] = { [0 ... (SNDRV_CARDS-1)] = -1 };
Daniel Macke5779992010-03-04 19:46:13 +010068static int device_setup[SNDRV_CARDS]; /* device parameter for this card */
Rusty Russella67ff6a2011-12-15 13:49:36 +103069static bool ignore_ctl_error;
Eldad Zackef02e292013-04-03 23:18:56 +020070static bool autoclock = true;
Takashi Iwai4801bee2021-08-29 09:38:30 +020071static bool lowlatency = true;
Takashi Iwaie2703362016-01-11 14:39:12 +010072static char *quirk_alias[SNDRV_CARDS];
Takashi Iwaib70038e2020-03-25 11:33:20 +010073static char *delayed_register[SNDRV_CARDS];
Takashi Iwai62abd092020-11-23 09:53:45 +010074static bool implicit_fb[SNDRV_CARDS];
Takashi Iwai5b517852021-07-29 09:44:03 +020075static unsigned int quirk_flags[SNDRV_CARDS];
Daniel Macke5779992010-03-04 19:46:13 +010076
Takashi Iwaif274baa2018-05-27 13:01:17 +020077bool snd_usb_use_vmalloc = true;
Takashi Iwaif35ef592019-11-14 17:56:13 +010078bool snd_usb_skip_validation;
Takashi Iwaif274baa2018-05-27 13:01:17 +020079
Daniel Macke5779992010-03-04 19:46:13 +010080module_param_array(index, int, NULL, 0444);
81MODULE_PARM_DESC(index, "Index value for the USB audio adapter.");
82module_param_array(id, charp, NULL, 0444);
83MODULE_PARM_DESC(id, "ID string for the USB audio adapter.");
84module_param_array(enable, bool, NULL, 0444);
85MODULE_PARM_DESC(enable, "Enable USB audio adapter.");
86module_param_array(vid, int, NULL, 0444);
87MODULE_PARM_DESC(vid, "Vendor ID for the USB audio device.");
88module_param_array(pid, int, NULL, 0444);
89MODULE_PARM_DESC(pid, "Product ID for the USB audio device.");
Daniel Macke5779992010-03-04 19:46:13 +010090module_param_array(device_setup, int, NULL, 0444);
91MODULE_PARM_DESC(device_setup, "Specific device setup (if needed).");
92module_param(ignore_ctl_error, bool, 0444);
93MODULE_PARM_DESC(ignore_ctl_error,
94 "Ignore errors from USB controller for mixer interfaces.");
Eldad Zackef02e292013-04-03 23:18:56 +020095module_param(autoclock, bool, 0444);
96MODULE_PARM_DESC(autoclock, "Enable auto-clock selection for UAC2 devices (default: yes).");
Takashi Iwai4801bee2021-08-29 09:38:30 +020097module_param(lowlatency, bool, 0444);
98MODULE_PARM_DESC(lowlatency, "Enable low latency playback (default: yes).");
Takashi Iwaie2703362016-01-11 14:39:12 +010099module_param_array(quirk_alias, charp, NULL, 0444);
100MODULE_PARM_DESC(quirk_alias, "Quirk aliases, e.g. 0123abcd:5678beef.");
Takashi Iwaib70038e2020-03-25 11:33:20 +0100101module_param_array(delayed_register, charp, NULL, 0444);
102MODULE_PARM_DESC(delayed_register, "Quirk for delayed registration, given by id:iface, e.g. 0123abcd:4.");
Takashi Iwai62abd092020-11-23 09:53:45 +0100103module_param_array(implicit_fb, bool, NULL, 0444);
104MODULE_PARM_DESC(implicit_fb, "Apply generic implicit feedback sync mode.");
Takashi Iwai5b517852021-07-29 09:44:03 +0200105module_param_array(quirk_flags, uint, NULL, 0444);
106MODULE_PARM_DESC(quirk_flags, "Driver quirk bit flags.");
Takashi Iwaif274baa2018-05-27 13:01:17 +0200107module_param_named(use_vmalloc, snd_usb_use_vmalloc, bool, 0444);
108MODULE_PARM_DESC(use_vmalloc, "Use vmalloc for PCM intermediate buffers (default: yes).");
Takashi Iwaif35ef592019-11-14 17:56:13 +0100109module_param_named(skip_validation, snd_usb_skip_validation, bool, 0444);
110MODULE_PARM_DESC(skip_validation, "Skip unit descriptor validation (default: no).");
Daniel Macke5779992010-03-04 19:46:13 +0100111
112/*
113 * we keep the snd_usb_audio_t instances by ourselves for merging
114 * the all interfaces on the same card as one sound device.
115 */
116
117static DEFINE_MUTEX(register_mutex);
118static struct snd_usb_audio *usb_chip[SNDRV_CARDS];
119static struct usb_driver usb_audio_driver;
120
121/*
122 * disconnect streams
Takashi Iwai4c8c3a42014-10-31 11:00:23 +0100123 * called from usb_audio_disconnect()
Daniel Macke5779992010-03-04 19:46:13 +0100124 */
Takashi Iwaia6cece92014-10-31 11:24:32 +0100125static void snd_usb_stream_disconnect(struct snd_usb_stream *as)
Daniel Macke5779992010-03-04 19:46:13 +0100126{
127 int idx;
Daniel Macke5779992010-03-04 19:46:13 +0100128 struct snd_usb_substream *subs;
129
Daniel Macke5779992010-03-04 19:46:13 +0100130 for (idx = 0; idx < 2; idx++) {
131 subs = &as->substream[idx];
132 if (!subs->num_formats)
Takashi Iwai76195fb2010-09-08 08:27:02 +0200133 continue;
Daniel Mackedcd3632012-04-12 13:51:12 +0200134 subs->data_endpoint = NULL;
135 subs->sync_endpoint = NULL;
Daniel Macke5779992010-03-04 19:46:13 +0100136 }
137}
138
139static int snd_usb_create_stream(struct snd_usb_audio *chip, int ctrlif, int interface)
140{
141 struct usb_device *dev = chip->dev;
142 struct usb_host_interface *alts;
143 struct usb_interface_descriptor *altsd;
144 struct usb_interface *iface = usb_ifnum_to_if(dev, interface);
145
146 if (!iface) {
Takashi Iwai0ba41d92014-02-26 13:02:17 +0100147 dev_err(&dev->dev, "%u:%d : does not exist\n",
148 ctrlif, interface);
Daniel Macke5779992010-03-04 19:46:13 +0100149 return -EINVAL;
150 }
151
Clemens Ladisch342cda292013-06-15 11:21:09 +0200152 alts = &iface->altsetting[0];
153 altsd = get_iface_desc(alts);
154
155 /*
156 * Android with both accessory and audio interfaces enabled gets the
157 * interface numbers wrong.
158 */
159 if ((chip->usb_id == USB_ID(0x18d1, 0x2d04) ||
160 chip->usb_id == USB_ID(0x18d1, 0x2d05)) &&
161 interface == 0 &&
162 altsd->bInterfaceClass == USB_CLASS_VENDOR_SPEC &&
163 altsd->bInterfaceSubClass == USB_SUBCLASS_VENDOR_SPEC) {
164 interface = 2;
165 iface = usb_ifnum_to_if(dev, interface);
166 if (!iface)
167 return -EINVAL;
168 alts = &iface->altsetting[0];
169 altsd = get_iface_desc(alts);
170 }
171
Daniel Macke5779992010-03-04 19:46:13 +0100172 if (usb_interface_claimed(iface)) {
Takashi Iwai0ba41d92014-02-26 13:02:17 +0100173 dev_dbg(&dev->dev, "%d:%d: skipping, already claimed\n",
174 ctrlif, interface);
Daniel Macke5779992010-03-04 19:46:13 +0100175 return -EINVAL;
176 }
177
Daniel Macke5779992010-03-04 19:46:13 +0100178 if ((altsd->bInterfaceClass == USB_CLASS_AUDIO ||
179 altsd->bInterfaceClass == USB_CLASS_VENDOR_SPEC) &&
180 altsd->bInterfaceSubClass == USB_SUBCLASS_MIDISTREAMING) {
Takashi Iwai79289e22016-01-11 11:33:34 +0100181 int err = __snd_usbmidi_create(chip->card, iface,
182 &chip->midi_list, NULL,
183 chip->usb_id);
Daniel Macke5779992010-03-04 19:46:13 +0100184 if (err < 0) {
Takashi Iwai0ba41d92014-02-26 13:02:17 +0100185 dev_err(&dev->dev,
186 "%u:%d: cannot create sequencer device\n",
187 ctrlif, interface);
Daniel Macke5779992010-03-04 19:46:13 +0100188 return -EINVAL;
189 }
Takashi Iwai5fb45412021-04-06 13:35:34 +0200190 return usb_driver_claim_interface(&usb_audio_driver, iface,
191 USB_AUDIO_IFACE_UNUSED);
Daniel Macke5779992010-03-04 19:46:13 +0100192 }
193
194 if ((altsd->bInterfaceClass != USB_CLASS_AUDIO &&
195 altsd->bInterfaceClass != USB_CLASS_VENDOR_SPEC) ||
196 altsd->bInterfaceSubClass != USB_SUBCLASS_AUDIOSTREAMING) {
Takashi Iwai0ba41d92014-02-26 13:02:17 +0100197 dev_dbg(&dev->dev,
198 "%u:%d: skipping non-supported interface %d\n",
199 ctrlif, interface, altsd->bInterfaceClass);
Daniel Macke5779992010-03-04 19:46:13 +0100200 /* skip non-supported classes */
201 return -EINVAL;
202 }
203
204 if (snd_usb_get_speed(dev) == USB_SPEED_LOW) {
Takashi Iwai0ba41d92014-02-26 13:02:17 +0100205 dev_err(&dev->dev, "low speed audio streaming not supported\n");
Daniel Macke5779992010-03-04 19:46:13 +0100206 return -EINVAL;
207 }
208
Daniel Macke8e8bab2011-09-12 18:54:12 +0200209 if (! snd_usb_parse_audio_interface(chip, interface)) {
Daniel Macke5779992010-03-04 19:46:13 +0100210 usb_set_interface(dev, interface, 0); /* reset the current interface */
Takashi Iwai5fb45412021-04-06 13:35:34 +0200211 return usb_driver_claim_interface(&usb_audio_driver, iface,
212 USB_AUDIO_IFACE_UNUSED);
Daniel Macke5779992010-03-04 19:46:13 +0100213 }
214
215 return 0;
216}
217
218/*
219 * parse audio control descriptor and create pcm/midi streams
220 */
221static int snd_usb_create_streams(struct snd_usb_audio *chip, int ctrlif)
222{
223 struct usb_device *dev = chip->dev;
224 struct usb_host_interface *host_iface;
225 struct usb_interface_descriptor *altsd;
Daniel Macke5779992010-03-04 19:46:13 +0100226 int i, protocol;
227
228 /* find audiocontrol interface */
229 host_iface = &usb_ifnum_to_if(dev, ctrlif)->altsetting[0];
Daniel Macke5779992010-03-04 19:46:13 +0100230 altsd = get_iface_desc(host_iface);
231 protocol = altsd->bInterfaceProtocol;
232
Daniel Macke5779992010-03-04 19:46:13 +0100233 switch (protocol) {
Clemens Ladischa2acad82010-09-03 10:53:11 +0200234 default:
Takashi Iwai0ba41d92014-02-26 13:02:17 +0100235 dev_warn(&dev->dev,
236 "unknown interface protocol %#02x, assuming v1\n",
237 protocol);
Gustavo A. R. Silvac0dbbda2020-07-08 15:32:36 -0500238 fallthrough;
Clemens Ladischa2acad82010-09-03 10:53:11 +0200239
Daniel Macke5779992010-03-04 19:46:13 +0100240 case UAC_VERSION_1: {
Jorge Sanjuan3763f612018-05-04 04:24:01 +0300241 struct uac1_ac_header_descriptor *h1;
242 int rest_bytes;
243
244 h1 = snd_usb_find_csint_desc(host_iface->extra,
245 host_iface->extralen,
246 NULL, UAC_HEADER);
Takashi Iwai3e96d722019-01-02 17:12:21 +0100247 if (!h1 || h1->bLength < sizeof(*h1)) {
Jorge Sanjuan3763f612018-05-04 04:24:01 +0300248 dev_err(&dev->dev, "cannot find UAC_HEADER\n");
249 return -EINVAL;
250 }
251
252 rest_bytes = (void *)(host_iface->extra +
253 host_iface->extralen) - (void *)h1;
254
255 /* just to be sure -- this shouldn't hit at all */
256 if (rest_bytes <= 0) {
257 dev_err(&dev->dev, "invalid control header\n");
258 return -EINVAL;
259 }
Daniel Macke5779992010-03-04 19:46:13 +0100260
Takashi Iwaibfc81a82017-09-22 16:18:53 +0200261 if (rest_bytes < sizeof(*h1)) {
262 dev_err(&dev->dev, "too short v1 buffer descriptor\n");
263 return -EINVAL;
264 }
265
Daniel Macke5779992010-03-04 19:46:13 +0100266 if (!h1->bInCollection) {
Takashi Iwai0ba41d92014-02-26 13:02:17 +0100267 dev_info(&dev->dev, "skipping empty audio interface (v1)\n");
Daniel Macke5779992010-03-04 19:46:13 +0100268 return -EINVAL;
269 }
270
Takashi Iwaibfc81a82017-09-22 16:18:53 +0200271 if (rest_bytes < h1->bLength) {
272 dev_err(&dev->dev, "invalid buffer length (v1)\n");
273 return -EINVAL;
274 }
275
Daniel Macke5779992010-03-04 19:46:13 +0100276 if (h1->bLength < sizeof(*h1) + h1->bInCollection) {
Takashi Iwai0ba41d92014-02-26 13:02:17 +0100277 dev_err(&dev->dev, "invalid UAC_HEADER (v1)\n");
Daniel Macke5779992010-03-04 19:46:13 +0100278 return -EINVAL;
279 }
280
281 for (i = 0; i < h1->bInCollection; i++)
282 snd_usb_create_stream(chip, ctrlif, h1->baInterfaceNr[i]);
283
284 break;
285 }
286
Ruslan Bilovol9a2fe9b2018-03-21 02:03:59 +0200287 case UAC_VERSION_2:
288 case UAC_VERSION_3: {
Daniel Macke5779992010-03-04 19:46:13 +0100289 struct usb_interface_assoc_descriptor *assoc =
290 usb_ifnum_to_if(dev, ctrlif)->intf_assoc;
291
292 if (!assoc) {
Clemens Ladisch281a6ac2013-03-11 20:15:34 +0100293 /*
294 * Firmware writers cannot count to three. So to find
295 * the IAD on the NuForce UDH-100, also check the next
296 * interface.
297 */
298 struct usb_interface *iface =
299 usb_ifnum_to_if(dev, ctrlif + 1);
300 if (iface &&
301 iface->intf_assoc &&
302 iface->intf_assoc->bFunctionClass == USB_CLASS_AUDIO &&
303 iface->intf_assoc->bFunctionProtocol == UAC_VERSION_2)
304 assoc = iface->intf_assoc;
305 }
306
307 if (!assoc) {
Ruslan Bilovol9a2fe9b2018-03-21 02:03:59 +0200308 dev_err(&dev->dev, "Audio class v2/v3 interfaces need an interface association\n");
Daniel Macke5779992010-03-04 19:46:13 +0100309 return -EINVAL;
310 }
311
Ruslan Bilovol17156f22018-05-04 04:24:04 +0300312 if (protocol == UAC_VERSION_3) {
313 int badd = assoc->bFunctionSubClass;
314
315 if (badd != UAC3_FUNCTION_SUBCLASS_FULL_ADC_3_0 &&
316 (badd < UAC3_FUNCTION_SUBCLASS_GENERIC_IO ||
317 badd > UAC3_FUNCTION_SUBCLASS_SPEAKERPHONE)) {
318 dev_err(&dev->dev,
319 "Unsupported UAC3 BADD profile\n");
320 return -EINVAL;
321 }
322
323 chip->badd_profile = badd;
324 }
325
Daniel Macke5779992010-03-04 19:46:13 +0100326 for (i = 0; i < assoc->bInterfaceCount; i++) {
327 int intf = assoc->bFirstInterface + i;
328
329 if (intf != ctrlif)
330 snd_usb_create_stream(chip, ctrlif, intf);
331 }
332
333 break;
334 }
Daniel Macke5779992010-03-04 19:46:13 +0100335 }
336
337 return 0;
338}
339
340/*
Takashi Iwai5436f592020-08-17 10:21:38 +0200341 * Profile name preset table
342 */
343struct usb_audio_device_name {
344 u32 id;
345 const char *vendor_name;
346 const char *product_name;
347 const char *profile_name; /* override card->longname */
348};
349
350#define PROFILE_NAME(vid, pid, vendor, product, profile) \
351 { .id = USB_ID(vid, pid), .vendor_name = (vendor), \
352 .product_name = (product), .profile_name = (profile) }
353#define DEVICE_NAME(vid, pid, vendor, product) \
354 PROFILE_NAME(vid, pid, vendor, product, NULL)
355
356/* vendor/product and profile name presets, sorted in device id order */
357static const struct usb_audio_device_name usb_audio_names[] = {
358 /* HP Thunderbolt Dock Audio Headset */
359 PROFILE_NAME(0x03f0, 0x0269, "HP", "Thunderbolt Dock Audio Headset",
360 "HP-Thunderbolt-Dock-Audio-Headset"),
361 /* HP Thunderbolt Dock Audio Module */
362 PROFILE_NAME(0x03f0, 0x0567, "HP", "Thunderbolt Dock Audio Module",
363 "HP-Thunderbolt-Dock-Audio-Module"),
364
365 /* Two entries for Gigabyte TRX40 Aorus Master:
366 * TRX40 Aorus Master has two USB-audio devices, one for the front
367 * headphone with ESS SABRE9218 DAC chip, while another for the rest
368 * I/O (the rear panel and the front mic) with Realtek ALC1220-VB.
369 * Here we provide two distinct names for making UCM profiles easier.
370 */
371 PROFILE_NAME(0x0414, 0xa000, "Gigabyte", "Aorus Master Front Headphone",
372 "Gigabyte-Aorus-Master-Front-Headphone"),
373 PROFILE_NAME(0x0414, 0xa001, "Gigabyte", "Aorus Master Main Audio",
374 "Gigabyte-Aorus-Master-Main-Audio"),
375
376 /* Gigabyte TRX40 Aorus Pro WiFi */
377 PROFILE_NAME(0x0414, 0xa002,
378 "Realtek", "ALC1220-VB-DT", "Realtek-ALC1220-VB-Desktop"),
379
380 /* Creative/E-Mu devices */
381 DEVICE_NAME(0x041e, 0x3010, "Creative Labs", "Sound Blaster MP3+"),
382 /* Creative/Toshiba Multimedia Center SB-0500 */
383 DEVICE_NAME(0x041e, 0x3048, "Toshiba", "SB-0500"),
384
385 DEVICE_NAME(0x046d, 0x0990, "Logitech, Inc.", "QuickCam Pro 9000"),
386
Takashi Iwaiaf158a72021-07-29 09:38:49 +0200387 DEVICE_NAME(0x05e1, 0x0408, "Syntek", "STK1160"),
388 DEVICE_NAME(0x05e1, 0x0480, "Hauppauge", "Woodbury"),
389
Kai-Heng Fenge5633b92020-11-15 23:38:42 +0800390 /* ASUS ROG Strix */
391 PROFILE_NAME(0x0b05, 0x1917,
392 "Realtek", "ALC1220-VB-DT", "Realtek-ALC1220-VB-Desktop"),
Takashi Iwai525d9c52020-12-21 09:01:59 +0100393 /* ASUS PRIME TRX40 PRO-S */
394 PROFILE_NAME(0x0b05, 0x1918,
395 "Realtek", "ALC1220-VB-DT", "Realtek-ALC1220-VB-Desktop"),
Kai-Heng Fenge5633b92020-11-15 23:38:42 +0800396
Takashi Iwai5436f592020-08-17 10:21:38 +0200397 /* Dell WD15 Dock */
398 PROFILE_NAME(0x0bda, 0x4014, "Dell", "WD15 Dock", "Dell-WD15-Dock"),
399 /* Dell WD19 Dock */
400 PROFILE_NAME(0x0bda, 0x402e, "Dell", "WD19 Dock", "Dell-WD15-Dock"),
401
402 DEVICE_NAME(0x0ccd, 0x0028, "TerraTec", "Aureon5.1MkII"),
403
404 /*
405 * The original product_name is "USB Sound Device", however this name
406 * is also used by the CM106 based cards, so make it unique.
407 */
408 DEVICE_NAME(0x0d8c, 0x0102, NULL, "ICUSBAUDIO7D"),
409 DEVICE_NAME(0x0d8c, 0x0103, NULL, "Audio Advantage MicroII"),
410
411 /* MSI TRX40 Creator */
412 PROFILE_NAME(0x0db0, 0x0d64,
413 "Realtek", "ALC1220-VB-DT", "Realtek-ALC1220-VB-Desktop"),
414 /* MSI TRX40 */
415 PROFILE_NAME(0x0db0, 0x543d,
416 "Realtek", "ALC1220-VB-DT", "Realtek-ALC1220-VB-Desktop"),
417
Takashi Iwaiaf158a72021-07-29 09:38:49 +0200418 DEVICE_NAME(0x0fd9, 0x0008, "Hauppauge", "HVR-950Q"),
419
Takashi Iwai5436f592020-08-17 10:21:38 +0200420 /* Stanton/N2IT Final Scratch v1 device ('Scratchamp') */
421 DEVICE_NAME(0x103d, 0x0100, "Stanton", "ScratchAmp"),
422 DEVICE_NAME(0x103d, 0x0101, "Stanton", "ScratchAmp"),
423
424 /* aka. Serato Scratch Live DJ Box */
425 DEVICE_NAME(0x13e5, 0x0001, "Rane", "SL-1"),
426
427 /* Lenovo ThinkStation P620 Rear Line-in, Line-out and Microphone */
428 PROFILE_NAME(0x17aa, 0x1046, "Lenovo", "ThinkStation P620 Rear",
429 "Lenovo-ThinkStation-P620-Rear"),
430 /* Lenovo ThinkStation P620 Internal Speaker + Front Headset */
431 PROFILE_NAME(0x17aa, 0x104d, "Lenovo", "ThinkStation P620 Main",
432 "Lenovo-ThinkStation-P620-Main"),
433
434 /* Asrock TRX40 Creator */
435 PROFILE_NAME(0x26ce, 0x0a01,
436 "Realtek", "ALC1220-VB-DT", "Realtek-ALC1220-VB-Desktop"),
437
Takashi Iwaiaf158a72021-07-29 09:38:49 +0200438 DEVICE_NAME(0x2040, 0x7200, "Hauppauge", "HVR-950Q"),
439 DEVICE_NAME(0x2040, 0x7201, "Hauppauge", "HVR-950Q-MXL"),
440 DEVICE_NAME(0x2040, 0x7210, "Hauppauge", "HVR-950Q"),
441 DEVICE_NAME(0x2040, 0x7211, "Hauppauge", "HVR-950Q-MXL"),
442 DEVICE_NAME(0x2040, 0x7213, "Hauppauge", "HVR-950Q"),
443 DEVICE_NAME(0x2040, 0x7217, "Hauppauge", "HVR-950Q"),
444 DEVICE_NAME(0x2040, 0x721b, "Hauppauge", "HVR-950Q"),
445 DEVICE_NAME(0x2040, 0x721e, "Hauppauge", "HVR-950Q"),
446 DEVICE_NAME(0x2040, 0x721f, "Hauppauge", "HVR-950Q"),
447 DEVICE_NAME(0x2040, 0x7240, "Hauppauge", "HVR-850"),
448 DEVICE_NAME(0x2040, 0x7260, "Hauppauge", "HVR-950Q"),
449 DEVICE_NAME(0x2040, 0x7270, "Hauppauge", "HVR-950Q"),
450 DEVICE_NAME(0x2040, 0x7280, "Hauppauge", "HVR-950Q"),
451 DEVICE_NAME(0x2040, 0x7281, "Hauppauge", "HVR-950Q-MXL"),
452 DEVICE_NAME(0x2040, 0x8200, "Hauppauge", "Woodbury"),
453
Takashi Iwai5436f592020-08-17 10:21:38 +0200454 { } /* terminator */
455};
456
457static const struct usb_audio_device_name *
458lookup_device_name(u32 id)
459{
460 static const struct usb_audio_device_name *p;
461
462 for (p = usb_audio_names; p->id; p++)
463 if (p->id == id)
464 return p;
465 return NULL;
466}
467
468/*
Daniel Macke5779992010-03-04 19:46:13 +0100469 * free the chip instance
470 *
471 * here we have to do not much, since pcm and controls are already freed
472 *
473 */
474
Takashi Iwai011ae2b2018-05-27 15:07:01 +0200475static void snd_usb_audio_free(struct snd_card *card)
Daniel Macke5779992010-03-04 19:46:13 +0100476{
Takashi Iwai011ae2b2018-05-27 15:07:01 +0200477 struct snd_usb_audio *chip = card->private_data;
Takashi Iwai92a586b2014-06-25 14:24:47 +0200478
Takashi Iwai00272c62021-01-08 08:52:17 +0100479 snd_usb_endpoint_free_all(chip);
Takashi Iwai92a586b2014-06-25 14:24:47 +0200480
Daniel Mack596580d2012-04-12 13:51:10 +0200481 mutex_destroy(&chip->mutex);
Takashi Iwai6ff1a252016-11-14 21:46:47 +0100482 if (!atomic_read(&chip->shutdown))
483 dev_set_drvdata(&chip->dev->dev, NULL);
Daniel Macke5779992010-03-04 19:46:13 +0100484}
485
Takashi Iwai07eca5f2018-05-02 14:45:37 +0200486static void usb_audio_make_shortname(struct usb_device *dev,
487 struct snd_usb_audio *chip,
488 const struct snd_usb_audio_quirk *quirk)
489{
490 struct snd_card *card = chip->card;
Takashi Iwai5436f592020-08-17 10:21:38 +0200491 const struct usb_audio_device_name *preset;
492 const char *s = NULL;
Takashi Iwai07eca5f2018-05-02 14:45:37 +0200493
Takashi Iwai5436f592020-08-17 10:21:38 +0200494 preset = lookup_device_name(chip->usb_id);
495 if (preset && preset->product_name)
496 s = preset->product_name;
497 else if (quirk && quirk->product_name)
498 s = quirk->product_name;
499 if (s && *s) {
Joe Perches75b1a8f2021-01-04 09:17:34 -0800500 strscpy(card->shortname, s, sizeof(card->shortname));
Takashi Iwai07eca5f2018-05-02 14:45:37 +0200501 return;
502 }
503
504 /* retrieve the device string as shortname */
505 if (!dev->descriptor.iProduct ||
506 usb_string(dev, dev->descriptor.iProduct,
507 card->shortname, sizeof(card->shortname)) <= 0) {
508 /* no name available from anywhere, so use ID */
509 sprintf(card->shortname, "USB Device %#04x:%#04x",
510 USB_ID_VENDOR(chip->usb_id),
511 USB_ID_PRODUCT(chip->usb_id));
512 }
513
514 strim(card->shortname);
515}
516
517static void usb_audio_make_longname(struct usb_device *dev,
518 struct snd_usb_audio *chip,
519 const struct snd_usb_audio_quirk *quirk)
520{
521 struct snd_card *card = chip->card;
Takashi Iwai5436f592020-08-17 10:21:38 +0200522 const struct usb_audio_device_name *preset;
523 const char *s = NULL;
Takashi Iwai07eca5f2018-05-02 14:45:37 +0200524 int len;
525
Takashi Iwai5436f592020-08-17 10:21:38 +0200526 preset = lookup_device_name(chip->usb_id);
527
Takashi Iwai07eca5f2018-05-02 14:45:37 +0200528 /* shortcut - if any pre-defined string is given, use it */
Takashi Iwai5436f592020-08-17 10:21:38 +0200529 if (preset && preset->profile_name)
530 s = preset->profile_name;
531 if (s && *s) {
Joe Perches75b1a8f2021-01-04 09:17:34 -0800532 strscpy(card->longname, s, sizeof(card->longname));
Takashi Iwai07eca5f2018-05-02 14:45:37 +0200533 return;
534 }
535
Takashi Iwai5436f592020-08-17 10:21:38 +0200536 if (preset && preset->vendor_name)
537 s = preset->vendor_name;
538 else if (quirk && quirk->vendor_name)
539 s = quirk->vendor_name;
Takashi Iwai42ef1702021-01-15 11:04:37 +0100540 *card->longname = 0;
Takashi Iwai5436f592020-08-17 10:21:38 +0200541 if (s && *s) {
Takashi Iwai42ef1702021-01-15 11:04:37 +0100542 strscpy(card->longname, s, sizeof(card->longname));
Takashi Iwai07eca5f2018-05-02 14:45:37 +0200543 } else {
544 /* retrieve the vendor and device strings as longname */
545 if (dev->descriptor.iManufacturer)
Takashi Iwai42ef1702021-01-15 11:04:37 +0100546 usb_string(dev, dev->descriptor.iManufacturer,
547 card->longname, sizeof(card->longname));
Takashi Iwai07eca5f2018-05-02 14:45:37 +0200548 /* we don't really care if there isn't any vendor string */
549 }
Takashi Iwai42ef1702021-01-15 11:04:37 +0100550 if (*card->longname) {
Takashi Iwai07eca5f2018-05-02 14:45:37 +0200551 strim(card->longname);
552 if (*card->longname)
553 strlcat(card->longname, " ", sizeof(card->longname));
554 }
555
556 strlcat(card->longname, card->shortname, sizeof(card->longname));
557
558 len = strlcat(card->longname, " at ", sizeof(card->longname));
559
560 if (len < sizeof(card->longname))
561 usb_make_path(dev, card->longname + len, sizeof(card->longname) - len);
562
563 switch (snd_usb_get_speed(dev)) {
564 case USB_SPEED_LOW:
565 strlcat(card->longname, ", low speed", sizeof(card->longname));
566 break;
567 case USB_SPEED_FULL:
568 strlcat(card->longname, ", full speed", sizeof(card->longname));
569 break;
570 case USB_SPEED_HIGH:
571 strlcat(card->longname, ", high speed", sizeof(card->longname));
572 break;
573 case USB_SPEED_SUPER:
574 strlcat(card->longname, ", super speed", sizeof(card->longname));
575 break;
576 case USB_SPEED_SUPER_PLUS:
577 strlcat(card->longname, ", super speed plus", sizeof(card->longname));
578 break;
579 default:
580 break;
581 }
582}
583
Daniel Macke5779992010-03-04 19:46:13 +0100584/*
585 * create a chip instance and set its names.
586 */
Takashi Iwai874b8d42014-01-29 14:22:20 +0100587static int snd_usb_audio_create(struct usb_interface *intf,
588 struct usb_device *dev, int idx,
Daniel Macke5779992010-03-04 19:46:13 +0100589 const struct snd_usb_audio_quirk *quirk,
Takashi Iwai03a1f482017-03-31 11:19:19 +0200590 unsigned int usb_id,
Daniel Macke5779992010-03-04 19:46:13 +0100591 struct snd_usb_audio **rchip)
592{
593 struct snd_card *card;
594 struct snd_usb_audio *chip;
Takashi Iwai07eca5f2018-05-02 14:45:37 +0200595 int err;
Daniel Macke5779992010-03-04 19:46:13 +0100596 char component[14];
Daniel Macke5779992010-03-04 19:46:13 +0100597
598 *rchip = NULL;
599
Paul Zimmerman4f4e8f62010-08-13 12:42:07 -0700600 switch (snd_usb_get_speed(dev)) {
601 case USB_SPEED_LOW:
602 case USB_SPEED_FULL:
603 case USB_SPEED_HIGH:
Thomas Pugliesedf3774c2013-10-01 14:32:15 -0500604 case USB_SPEED_WIRELESS:
Paul Zimmerman4f4e8f62010-08-13 12:42:07 -0700605 case USB_SPEED_SUPER:
Oliver Neukum748a1cc2016-05-04 14:18:39 +0200606 case USB_SPEED_SUPER_PLUS:
Paul Zimmerman4f4e8f62010-08-13 12:42:07 -0700607 break;
608 default:
Takashi Iwai0ba41d92014-02-26 13:02:17 +0100609 dev_err(&dev->dev, "unknown device speed %d\n", snd_usb_get_speed(dev));
Daniel Macke5779992010-03-04 19:46:13 +0100610 return -ENXIO;
611 }
612
Takashi Iwai874b8d42014-01-29 14:22:20 +0100613 err = snd_card_new(&intf->dev, index[idx], id[idx], THIS_MODULE,
Takashi Iwai011ae2b2018-05-27 15:07:01 +0200614 sizeof(*chip), &card);
Daniel Macke5779992010-03-04 19:46:13 +0100615 if (err < 0) {
Takashi Iwai0ba41d92014-02-26 13:02:17 +0100616 dev_err(&dev->dev, "cannot create card instance %d\n", idx);
Daniel Macke5779992010-03-04 19:46:13 +0100617 return err;
618 }
619
Takashi Iwai011ae2b2018-05-27 15:07:01 +0200620 chip = card->private_data;
Daniel Mack596580d2012-04-12 13:51:10 +0200621 mutex_init(&chip->mutex);
Takashi Iwai47ab1542015-08-25 16:09:00 +0200622 init_waitqueue_head(&chip->shutdown_wait);
Daniel Macke5779992010-03-04 19:46:13 +0100623 chip->index = idx;
624 chip->dev = dev;
625 chip->card = card;
626 chip->setup = device_setup[idx];
Takashi Iwai62abd092020-11-23 09:53:45 +0100627 chip->generic_implicit_fb = implicit_fb[idx];
Eldad Zackef02e292013-04-03 23:18:56 +0200628 chip->autoclock = autoclock;
Takashi Iwai4801bee2021-08-29 09:38:30 +0200629 chip->lowlatency = lowlatency;
Takashi Iwaia6da4992015-08-26 10:20:59 +0200630 atomic_set(&chip->active, 1); /* avoid autopm during probing */
Takashi Iwai47ab1542015-08-25 16:09:00 +0200631 atomic_set(&chip->usage_count, 0);
632 atomic_set(&chip->shutdown, 0);
Daniel Macke5779992010-03-04 19:46:13 +0100633
Takashi Iwai03a1f482017-03-31 11:19:19 +0200634 chip->usb_id = usb_id;
Daniel Macke5779992010-03-04 19:46:13 +0100635 INIT_LIST_HEAD(&chip->pcm_list);
Daniel Mackedcd3632012-04-12 13:51:12 +0200636 INIT_LIST_HEAD(&chip->ep_list);
Takashi Iwai00272c62021-01-08 08:52:17 +0100637 INIT_LIST_HEAD(&chip->iface_ref_list);
Daniel Macke5779992010-03-04 19:46:13 +0100638 INIT_LIST_HEAD(&chip->midi_list);
639 INIT_LIST_HEAD(&chip->mixer_list);
640
Takashi Iwai5b517852021-07-29 09:44:03 +0200641 if (quirk_flags[idx])
642 chip->quirk_flags = quirk_flags[idx];
643 else
644 snd_usb_init_quirk_flags(chip);
Takashi Iwai4d4dee02021-07-29 09:38:47 +0200645
Takashi Iwai011ae2b2018-05-27 15:07:01 +0200646 card->private_free = snd_usb_audio_free;
Daniel Macke5779992010-03-04 19:46:13 +0100647
648 strcpy(card->driver, "USB-Audio");
649 sprintf(component, "USB%04x:%04x",
650 USB_ID_VENDOR(chip->usb_id), USB_ID_PRODUCT(chip->usb_id));
651 snd_component_add(card, component);
652
Takashi Iwai07eca5f2018-05-02 14:45:37 +0200653 usb_audio_make_shortname(dev, chip, quirk);
654 usb_audio_make_longname(dev, chip, quirk);
Daniel Macke5779992010-03-04 19:46:13 +0100655
656 snd_usb_audio_create_proc(chip);
657
658 *rchip = chip;
659 return 0;
660}
661
Takashi Iwaie2703362016-01-11 14:39:12 +0100662/* look for a matching quirk alias id */
663static bool get_alias_id(struct usb_device *dev, unsigned int *id)
664{
665 int i;
666 unsigned int src, dst;
667
668 for (i = 0; i < ARRAY_SIZE(quirk_alias); i++) {
669 if (!quirk_alias[i] ||
670 sscanf(quirk_alias[i], "%x:%x", &src, &dst) != 2 ||
671 src != *id)
672 continue;
673 dev_info(&dev->dev,
674 "device (%04x:%04x): applying quirk alias %04x:%04x\n",
675 USB_ID_VENDOR(*id), USB_ID_PRODUCT(*id),
676 USB_ID_VENDOR(dst), USB_ID_PRODUCT(dst));
677 *id = dst;
678 return true;
679 }
680
681 return false;
682}
683
Takashi Iwaib70038e2020-03-25 11:33:20 +0100684static bool check_delayed_register_option(struct snd_usb_audio *chip, int iface)
685{
686 int i;
687 unsigned int id, inum;
688
689 for (i = 0; i < ARRAY_SIZE(delayed_register); i++) {
690 if (delayed_register[i] &&
691 sscanf(delayed_register[i], "%x:%x", &id, &inum) == 2 &&
692 id == chip->usb_id)
693 return inum != iface;
694 }
695
696 return false;
697}
698
Arvind Yadav8824ae22017-08-06 12:18:56 +0530699static const struct usb_device_id usb_audio_ids[]; /* defined below */
Takashi Iwaie2703362016-01-11 14:39:12 +0100700
701/* look for the corresponding quirk */
702static const struct snd_usb_audio_quirk *
703get_alias_quirk(struct usb_device *dev, unsigned int id)
704{
705 const struct usb_device_id *p;
706
707 for (p = usb_audio_ids; p->match_flags; p++) {
708 /* FIXME: this checks only vendor:product pair in the list */
709 if ((p->match_flags & USB_DEVICE_ID_MATCH_DEVICE) ==
710 USB_DEVICE_ID_MATCH_DEVICE &&
711 p->idVendor == USB_ID_VENDOR(id) &&
712 p->idProduct == USB_ID_PRODUCT(id))
713 return (const struct snd_usb_audio_quirk *)p->driver_info;
714 }
715
716 return NULL;
717}
718
Daniel Macke5779992010-03-04 19:46:13 +0100719/*
720 * probe the active usb device
721 *
722 * note that this can be called multiple times per a device, when it
723 * includes multiple audio control interfaces.
724 *
725 * thus we check the usb device pointer and creates the card instance
726 * only at the first time. the successive calls of this function will
727 * append the pcm interface to the corresponding card.
728 */
Takashi Iwai4c8c3a42014-10-31 11:00:23 +0100729static int usb_audio_probe(struct usb_interface *intf,
730 const struct usb_device_id *usb_id)
Daniel Macke5779992010-03-04 19:46:13 +0100731{
Takashi Iwai4c8c3a42014-10-31 11:00:23 +0100732 struct usb_device *dev = interface_to_usbdev(intf);
733 const struct snd_usb_audio_quirk *quirk =
734 (const struct snd_usb_audio_quirk *)usb_id->driver_info;
Daniel Macke5779992010-03-04 19:46:13 +0100735 struct snd_usb_audio *chip;
Takashi Iwai4c8c3a42014-10-31 11:00:23 +0100736 int i, err;
Daniel Macke5779992010-03-04 19:46:13 +0100737 struct usb_host_interface *alts;
738 int ifnum;
739 u32 id;
740
741 alts = &intf->altsetting[0];
742 ifnum = get_iface_desc(alts)->bInterfaceNumber;
743 id = USB_ID(le16_to_cpu(dev->descriptor.idVendor),
744 le16_to_cpu(dev->descriptor.idProduct));
Takashi Iwaie2703362016-01-11 14:39:12 +0100745 if (get_alias_id(dev, &id))
746 quirk = get_alias_quirk(dev, id);
Daniel Macke5779992010-03-04 19:46:13 +0100747 if (quirk && quirk->ifnum >= 0 && ifnum != quirk->ifnum)
Takashi Iwai4c8c3a42014-10-31 11:00:23 +0100748 return -ENXIO;
Takashi Iwaid7631452021-04-08 09:56:56 +0200749 if (quirk && quirk->ifnum == QUIRK_NODEV_INTERFACE)
750 return -ENODEV;
Daniel Macke5779992010-03-04 19:46:13 +0100751
Takashi Iwai79289e22016-01-11 11:33:34 +0100752 err = snd_usb_apply_boot_quirk(dev, intf, quirk, id);
Takashi Iwai4c8c3a42014-10-31 11:00:23 +0100753 if (err < 0)
754 return err;
Daniel Macke5779992010-03-04 19:46:13 +0100755
756 /*
757 * found a config. now register to ALSA
758 */
759
760 /* check whether it's already registered */
761 chip = NULL;
762 mutex_lock(&register_mutex);
763 for (i = 0; i < SNDRV_CARDS; i++) {
764 if (usb_chip[i] && usb_chip[i]->dev == dev) {
Takashi Iwai47ab1542015-08-25 16:09:00 +0200765 if (atomic_read(&usb_chip[i]->shutdown)) {
Takashi Iwai0ba41d92014-02-26 13:02:17 +0100766 dev_err(&dev->dev, "USB device is in the shutdown state, cannot create a card instance\n");
Takashi Iwai4c8c3a42014-10-31 11:00:23 +0100767 err = -EIO;
Daniel Macke5779992010-03-04 19:46:13 +0100768 goto __error;
769 }
770 chip = usb_chip[i];
Takashi Iwaia6da4992015-08-26 10:20:59 +0200771 atomic_inc(&chip->active); /* avoid autopm */
Daniel Macke5779992010-03-04 19:46:13 +0100772 break;
773 }
774 }
775 if (! chip) {
Alexander Tsoy73ac9f52020-01-12 13:23:58 +0300776 err = snd_usb_apply_boot_quirk_once(dev, intf, quirk, id);
777 if (err < 0)
Dan Carpentera3afa292020-01-15 20:46:04 +0300778 goto __error;
Alexander Tsoy73ac9f52020-01-12 13:23:58 +0300779
Daniel Macke5779992010-03-04 19:46:13 +0100780 /* it's a fresh one.
781 * now look for an empty slot and create a new card instance
782 */
783 for (i = 0; i < SNDRV_CARDS; i++)
Tamaki Nishino108884e2017-11-30 20:27:52 +0900784 if (!usb_chip[i] &&
Daniel Macke5779992010-03-04 19:46:13 +0100785 (vid[i] == -1 || vid[i] == USB_ID_VENDOR(id)) &&
786 (pid[i] == -1 || pid[i] == USB_ID_PRODUCT(id))) {
Tamaki Nishino108884e2017-11-30 20:27:52 +0900787 if (enable[i]) {
788 err = snd_usb_audio_create(intf, dev, i, quirk,
789 id, &chip);
790 if (err < 0)
791 goto __error;
Tamaki Nishino108884e2017-11-30 20:27:52 +0900792 break;
793 } else if (vid[i] != -1 || pid[i] != -1) {
794 dev_info(&dev->dev,
795 "device (%04x:%04x) is disabled\n",
796 USB_ID_VENDOR(id),
797 USB_ID_PRODUCT(id));
798 err = -ENOENT;
Daniel Macke5779992010-03-04 19:46:13 +0100799 goto __error;
Tamaki Nishino108884e2017-11-30 20:27:52 +0900800 }
Daniel Macke5779992010-03-04 19:46:13 +0100801 }
802 if (!chip) {
Takashi Iwai0ba41d92014-02-26 13:02:17 +0100803 dev_err(&dev->dev, "no available usb audio device\n");
Takashi Iwai4c8c3a42014-10-31 11:00:23 +0100804 err = -ENODEV;
Daniel Macke5779992010-03-04 19:46:13 +0100805 goto __error;
806 }
807 }
Takashi Iwai88d88222020-06-05 08:41:17 +0200808
809 if (chip->num_interfaces >= MAX_CARD_INTERFACES) {
810 dev_info(&dev->dev, "Too many interfaces assigned to the single USB-audio card\n");
811 err = -EINVAL;
812 goto __error;
813 }
814
Kazuki Oikawa76df5292016-07-18 01:16:15 +0900815 dev_set_drvdata(&dev->dev, chip);
Daniel Macke5779992010-03-04 19:46:13 +0100816
Takashi Iwai3c69dc92021-07-29 09:44:01 +0200817 if (ignore_ctl_error)
818 chip->quirk_flags |= QUIRK_FLAG_IGNORE_CTL_ERROR;
819
Takashi Iwai44e6fc62021-07-29 09:44:00 +0200820 if (chip->quirk_flags & QUIRK_FLAG_DISABLE_AUTOSUSPEND)
821 usb_disable_autosuspend(interface_to_usbdev(intf));
822
Daniel Mack7b6717e2010-09-02 17:13:15 +0800823 /*
824 * For devices with more than one control interface, we assume the
825 * first contains the audio controls. We might need a more specific
826 * check here in the future.
827 */
828 if (!chip->ctrl_intf)
829 chip->ctrl_intf = alts;
Daniel Mack79f920f2010-05-31 14:51:31 +0200830
Daniel Mack5875c2c2011-05-25 09:08:59 +0200831 err = 1; /* continue */
832 if (quirk && quirk->ifnum != QUIRK_NO_INTERFACE) {
833 /* need some special handlings */
Takashi Iwai4c8c3a42014-10-31 11:00:23 +0100834 err = snd_usb_create_quirk(chip, intf, &usb_audio_driver, quirk);
835 if (err < 0)
Daniel Mack5875c2c2011-05-25 09:08:59 +0200836 goto __error;
837 }
838
Daniel Macke5779992010-03-04 19:46:13 +0100839 if (err > 0) {
840 /* create normal USB audio interfaces */
Takashi Iwai4c8c3a42014-10-31 11:00:23 +0100841 err = snd_usb_create_streams(chip, ifnum);
842 if (err < 0)
Daniel Macke5779992010-03-04 19:46:13 +0100843 goto __error;
Takashi Iwai3c69dc92021-07-29 09:44:01 +0200844 err = snd_usb_create_mixer(chip, ifnum);
Takashi Iwai4c8c3a42014-10-31 11:00:23 +0100845 if (err < 0)
846 goto __error;
Daniel Macke5779992010-03-04 19:46:13 +0100847 }
848
Takashi Iwaia4aad562020-03-25 11:33:21 +0100849 if (chip->need_delayed_register) {
850 dev_info(&dev->dev,
851 "Found post-registration device assignment: %08x:%02x\n",
852 chip->usb_id, ifnum);
853 chip->need_delayed_register = false; /* clear again */
854 }
855
Chris Wulff55f73262020-03-14 12:54:49 -0400856 /* we are allowed to call snd_card_register() many times, but first
857 * check to see if a device needs to skip it or do anything special
858 */
Takashi Iwaib70038e2020-03-25 11:33:20 +0100859 if (!snd_usb_registration_quirk(chip, ifnum) &&
860 !check_delayed_register_option(chip, ifnum)) {
Chris Wulff55f73262020-03-14 12:54:49 -0400861 err = snd_card_register(chip->card);
862 if (err < 0)
863 goto __error;
864 }
Daniel Macke5779992010-03-04 19:46:13 +0100865
Takashi Iwaice47d472021-07-29 09:38:48 +0200866 if (chip->quirk_flags & QUIRK_FLAG_SHARE_MEDIA_DEVICE) {
Shuah Khan66354f12019-04-01 20:40:22 -0400867 /* don't want to fail when snd_media_device_create() fails */
868 snd_media_device_create(chip, intf);
869 }
870
Pavel Skripkin30dea072021-03-09 01:30:36 +0300871 if (quirk)
872 chip->quirk_type = quirk->type;
Kai-Heng Feng97991102021-03-04 12:34:16 +0800873
Daniel Macke5779992010-03-04 19:46:13 +0100874 usb_chip[chip->index] = chip;
Takashi Iwai88d88222020-06-05 08:41:17 +0200875 chip->intf[chip->num_interfaces] = intf;
Daniel Macke5779992010-03-04 19:46:13 +0100876 chip->num_interfaces++;
Takashi Iwai4c8c3a42014-10-31 11:00:23 +0100877 usb_set_intfdata(intf, chip);
Takashi Iwaia6da4992015-08-26 10:20:59 +0200878 atomic_dec(&chip->active);
Daniel Macke5779992010-03-04 19:46:13 +0100879 mutex_unlock(&register_mutex);
Takashi Iwai4c8c3a42014-10-31 11:00:23 +0100880 return 0;
Daniel Macke5779992010-03-04 19:46:13 +0100881
882 __error:
Thomas Pfaff61a6a102011-09-26 15:43:59 +0200883 if (chip) {
Hui Peng5f8cf712018-12-03 16:09:34 +0100884 /* chip->active is inside the chip->card object,
885 * decrement before memory is possibly returned.
886 */
887 atomic_dec(&chip->active);
Thomas Pfaff61a6a102011-09-26 15:43:59 +0200888 if (!chip->num_interfaces)
889 snd_card_free(chip->card);
Thomas Pfaff61a6a102011-09-26 15:43:59 +0200890 }
Daniel Macke5779992010-03-04 19:46:13 +0100891 mutex_unlock(&register_mutex);
Takashi Iwai4c8c3a42014-10-31 11:00:23 +0100892 return err;
Daniel Macke5779992010-03-04 19:46:13 +0100893}
894
895/*
896 * we need to take care of counter, since disconnection can be called also
897 * many times as well as usb_audio_probe().
898 */
Takashi Iwai4c8c3a42014-10-31 11:00:23 +0100899static void usb_audio_disconnect(struct usb_interface *intf)
Daniel Macke5779992010-03-04 19:46:13 +0100900{
Takashi Iwai4c8c3a42014-10-31 11:00:23 +0100901 struct snd_usb_audio *chip = usb_get_intfdata(intf);
Daniel Macke5779992010-03-04 19:46:13 +0100902 struct snd_card *card;
Takashi Iwai92a586b2014-06-25 14:24:47 +0200903 struct list_head *p;
Daniel Macke5779992010-03-04 19:46:13 +0100904
Takashi Iwai5fb45412021-04-06 13:35:34 +0200905 if (chip == USB_AUDIO_IFACE_UNUSED)
Daniel Macke5779992010-03-04 19:46:13 +0100906 return;
907
Daniel Macke5779992010-03-04 19:46:13 +0100908 card = chip->card;
Takashi Iwai10e44232012-11-13 11:22:48 +0100909
910 mutex_lock(&register_mutex);
Takashi Iwai47ab1542015-08-25 16:09:00 +0200911 if (atomic_inc_return(&chip->shutdown) == 1) {
Takashi Iwaia6cece92014-10-31 11:24:32 +0100912 struct snd_usb_stream *as;
Takashi Iwai92a586b2014-06-25 14:24:47 +0200913 struct snd_usb_endpoint *ep;
Takashi Iwaia6cece92014-10-31 11:24:32 +0100914 struct usb_mixer_interface *mixer;
Takashi Iwai92a586b2014-06-25 14:24:47 +0200915
Takashi Iwai47ab1542015-08-25 16:09:00 +0200916 /* wait until all pending tasks done;
917 * they are protected by snd_usb_lock_shutdown()
918 */
919 wait_event(chip->shutdown_wait,
920 !atomic_read(&chip->usage_count));
Daniel Macke5779992010-03-04 19:46:13 +0100921 snd_card_disconnect(card);
922 /* release the pcm resources */
Takashi Iwaia6cece92014-10-31 11:24:32 +0100923 list_for_each_entry(as, &chip->pcm_list, list) {
924 snd_usb_stream_disconnect(as);
Daniel Macke5779992010-03-04 19:46:13 +0100925 }
Daniel Mackedcd3632012-04-12 13:51:12 +0200926 /* release the endpoint resources */
Takashi Iwai92a586b2014-06-25 14:24:47 +0200927 list_for_each_entry(ep, &chip->ep_list, list) {
928 snd_usb_endpoint_release(ep);
Daniel Mackedcd3632012-04-12 13:51:12 +0200929 }
Daniel Macke5779992010-03-04 19:46:13 +0100930 /* release the midi resources */
931 list_for_each(p, &chip->midi_list) {
932 snd_usbmidi_disconnect(p);
933 }
Shuah Khan66354f12019-04-01 20:40:22 -0400934 /*
935 * Nice to check quirk && quirk->shares_media_device and
936 * then call the snd_media_device_delete(). Don't have
937 * access to the quirk here. snd_media_device_delete()
938 * accesses mixer_list
939 */
940 snd_media_device_delete(chip);
941
Daniel Macke5779992010-03-04 19:46:13 +0100942 /* release mixer resources */
Takashi Iwaia6cece92014-10-31 11:24:32 +0100943 list_for_each_entry(mixer, &chip->mixer_list, list) {
944 snd_usb_mixer_disconnect(mixer);
Daniel Macke5779992010-03-04 19:46:13 +0100945 }
Takashi Iwai0725dda2014-11-05 15:08:49 +0100946 }
947
Takashi Iwai44e6fc62021-07-29 09:44:00 +0200948 if (chip->quirk_flags & QUIRK_FLAG_DISABLE_AUTOSUSPEND)
Pavel Skripkinc5aa9562021-03-09 01:30:57 +0300949 usb_enable_autosuspend(interface_to_usbdev(intf));
950
Takashi Iwai0725dda2014-11-05 15:08:49 +0100951 chip->num_interfaces--;
952 if (chip->num_interfaces <= 0) {
Daniel Macke5779992010-03-04 19:46:13 +0100953 usb_chip[chip->index] = NULL;
954 mutex_unlock(&register_mutex);
955 snd_card_free_when_closed(card);
956 } else {
957 mutex_unlock(&register_mutex);
958 }
959}
960
Takashi Iwai47ab1542015-08-25 16:09:00 +0200961/* lock the shutdown (disconnect) task and autoresume */
962int snd_usb_lock_shutdown(struct snd_usb_audio *chip)
963{
964 int err;
965
966 atomic_inc(&chip->usage_count);
967 if (atomic_read(&chip->shutdown)) {
968 err = -EIO;
969 goto error;
970 }
971 err = snd_usb_autoresume(chip);
972 if (err < 0)
973 goto error;
974 return 0;
975
976 error:
977 if (atomic_dec_and_test(&chip->usage_count))
978 wake_up(&chip->shutdown_wait);
979 return err;
980}
981
982/* autosuspend and unlock the shutdown */
983void snd_usb_unlock_shutdown(struct snd_usb_audio *chip)
984{
985 snd_usb_autosuspend(chip);
986 if (atomic_dec_and_test(&chip->usage_count))
987 wake_up(&chip->shutdown_wait);
988}
989
Oliver Neukum88a85162011-03-11 14:51:12 +0100990int snd_usb_autoresume(struct snd_usb_audio *chip)
991{
Takashi Iwai88d88222020-06-05 08:41:17 +0200992 int i, err;
993
Takashi Iwai47ab1542015-08-25 16:09:00 +0200994 if (atomic_read(&chip->shutdown))
995 return -EIO;
Takashi Iwai88d88222020-06-05 08:41:17 +0200996 if (atomic_inc_return(&chip->active) != 1)
997 return 0;
998
999 for (i = 0; i < chip->num_interfaces; i++) {
1000 err = usb_autopm_get_interface(chip->intf[i]);
1001 if (err < 0) {
1002 /* rollback */
1003 while (--i >= 0)
1004 usb_autopm_put_interface(chip->intf[i]);
1005 atomic_dec(&chip->active);
1006 return err;
1007 }
1008 }
Takashi Iwai47ab1542015-08-25 16:09:00 +02001009 return 0;
Oliver Neukum88a85162011-03-11 14:51:12 +01001010}
1011
1012void snd_usb_autosuspend(struct snd_usb_audio *chip)
1013{
Takashi Iwai88d88222020-06-05 08:41:17 +02001014 int i;
1015
Takashi Iwai5c06d682016-01-12 14:03:33 +01001016 if (atomic_read(&chip->shutdown))
1017 return;
Takashi Iwai88d88222020-06-05 08:41:17 +02001018 if (!atomic_dec_and_test(&chip->active))
1019 return;
1020
1021 for (i = 0; i < chip->num_interfaces; i++)
1022 usb_autopm_put_interface(chip->intf[i]);
Oliver Neukum88a85162011-03-11 14:51:12 +01001023}
1024
Daniel Macke5779992010-03-04 19:46:13 +01001025static int usb_audio_suspend(struct usb_interface *intf, pm_message_t message)
1026{
1027 struct snd_usb_audio *chip = usb_get_intfdata(intf);
Daniel Macke5779992010-03-04 19:46:13 +01001028 struct snd_usb_stream *as;
Takashi Iwaibf6313a2020-11-23 09:53:31 +01001029 struct snd_usb_endpoint *ep;
Oliver Neukumedf7de32011-03-11 13:19:43 +01001030 struct usb_mixer_interface *mixer;
Adam Goodef7881e52014-08-05 12:44:50 -04001031 struct list_head *p;
Daniel Macke5779992010-03-04 19:46:13 +01001032
Takashi Iwai5fb45412021-04-06 13:35:34 +02001033 if (chip == USB_AUDIO_IFACE_UNUSED)
Daniel Macke5779992010-03-04 19:46:13 +01001034 return 0;
1035
Takashi Iwai06622922015-08-26 10:23:26 +02001036 if (!chip->num_suspended_intf++) {
Takashi Iwaibf6313a2020-11-23 09:53:31 +01001037 list_for_each_entry(as, &chip->pcm_list, list)
Jorge Sanjuan3f59aa12018-07-31 13:28:44 +01001038 snd_usb_pcm_suspend(as);
Takashi Iwaibf6313a2020-11-23 09:53:31 +01001039 list_for_each_entry(ep, &chip->ep_list, list)
1040 snd_usb_endpoint_suspend(ep);
Takashi Iwai06622922015-08-26 10:23:26 +02001041 list_for_each(p, &chip->midi_list)
1042 snd_usbmidi_suspend(p);
Takashi Iwai1c53e722014-05-02 18:14:42 +02001043 list_for_each_entry(mixer, &chip->mixer_list, list)
1044 snd_usb_mixer_suspend(mixer);
Takashi Iwai06622922015-08-26 10:23:26 +02001045 }
Oliver Neukum88a85162011-03-11 14:51:12 +01001046
Takashi Iwai862b2502020-06-03 17:37:08 +02001047 if (!PMSG_IS_AUTO(message) && !chip->system_suspend) {
1048 snd_power_change_state(chip->card, SNDRV_CTL_POWER_D3hot);
1049 chip->system_suspend = chip->num_suspended_intf;
1050 }
1051
Daniel Macke5779992010-03-04 19:46:13 +01001052 return 0;
1053}
1054
Takashi Iwai7b9cf902021-09-10 12:51:55 +02001055static int usb_audio_resume(struct usb_interface *intf)
Daniel Macke5779992010-03-04 19:46:13 +01001056{
1057 struct snd_usb_audio *chip = usb_get_intfdata(intf);
Jorge Sanjuan3f59aa12018-07-31 13:28:44 +01001058 struct snd_usb_stream *as;
Oliver Neukumedf7de32011-03-11 13:19:43 +01001059 struct usb_mixer_interface *mixer;
Adam Goodef7881e52014-08-05 12:44:50 -04001060 struct list_head *p;
Oliver Neukum88a85162011-03-11 14:51:12 +01001061 int err = 0;
Daniel Macke5779992010-03-04 19:46:13 +01001062
Takashi Iwai5fb45412021-04-06 13:35:34 +02001063 if (chip == USB_AUDIO_IFACE_UNUSED)
Daniel Macke5779992010-03-04 19:46:13 +01001064 return 0;
Takashi Iwai1ee23fe2014-05-02 18:17:06 +02001065
Takashi Iwai47ab1542015-08-25 16:09:00 +02001066 atomic_inc(&chip->active); /* avoid autopm */
Takashi Iwai862b2502020-06-03 17:37:08 +02001067 if (chip->num_suspended_intf > 1)
1068 goto out;
Jorge Sanjuan3f59aa12018-07-31 13:28:44 +01001069
1070 list_for_each_entry(as, &chip->pcm_list, list) {
1071 err = snd_usb_pcm_resume(as);
1072 if (err < 0)
1073 goto err_out;
1074 }
1075
Daniel Macke5779992010-03-04 19:46:13 +01001076 /*
1077 * ALSA leaves material resumption to user space
Oliver Neukumedf7de32011-03-11 13:19:43 +01001078 * we just notify and restart the mixers
Daniel Macke5779992010-03-04 19:46:13 +01001079 */
Oliver Neukum88a85162011-03-11 14:51:12 +01001080 list_for_each_entry(mixer, &chip->mixer_list, list) {
Takashi Iwai7b9cf902021-09-10 12:51:55 +02001081 err = snd_usb_mixer_resume(mixer);
Oliver Neukum88a85162011-03-11 14:51:12 +01001082 if (err < 0)
1083 goto err_out;
1084 }
Daniel Macke5779992010-03-04 19:46:13 +01001085
Adam Goodef7881e52014-08-05 12:44:50 -04001086 list_for_each(p, &chip->midi_list) {
1087 snd_usbmidi_resume(p);
1088 }
1089
Takashi Iwai862b2502020-06-03 17:37:08 +02001090 out:
1091 if (chip->num_suspended_intf == chip->system_suspend) {
Oliver Neukum88a85162011-03-11 14:51:12 +01001092 snd_power_change_state(chip->card, SNDRV_CTL_POWER_D0);
Takashi Iwai862b2502020-06-03 17:37:08 +02001093 chip->system_suspend = 0;
1094 }
1095 chip->num_suspended_intf--;
Daniel Macke5779992010-03-04 19:46:13 +01001096
Oliver Neukum88a85162011-03-11 14:51:12 +01001097err_out:
Takashi Iwai47ab1542015-08-25 16:09:00 +02001098 atomic_dec(&chip->active); /* allow autopm after this point */
Oliver Neukum88a85162011-03-11 14:51:12 +01001099 return err;
Daniel Macke5779992010-03-04 19:46:13 +01001100}
Daniel Macke5779992010-03-04 19:46:13 +01001101
Arvind Yadav8824ae22017-08-06 12:18:56 +05301102static const struct usb_device_id usb_audio_ids [] = {
Daniel Macke5779992010-03-04 19:46:13 +01001103#include "quirks-table.h"
1104 { .match_flags = (USB_DEVICE_ID_MATCH_INT_CLASS | USB_DEVICE_ID_MATCH_INT_SUBCLASS),
1105 .bInterfaceClass = USB_CLASS_AUDIO,
1106 .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL },
1107 { } /* Terminating entry */
1108};
Eldad Zackf9d35432013-04-03 23:18:50 +02001109MODULE_DEVICE_TABLE(usb, usb_audio_ids);
Daniel Macke5779992010-03-04 19:46:13 +01001110
1111/*
1112 * entry point for linux usb interface
1113 */
1114
1115static struct usb_driver usb_audio_driver = {
1116 .name = "snd-usb-audio",
1117 .probe = usb_audio_probe,
1118 .disconnect = usb_audio_disconnect,
1119 .suspend = usb_audio_suspend,
1120 .resume = usb_audio_resume,
Takashi Iwai7b9cf902021-09-10 12:51:55 +02001121 .reset_resume = usb_audio_resume,
Daniel Macke5779992010-03-04 19:46:13 +01001122 .id_table = usb_audio_ids,
Oliver Neukum88a85162011-03-11 14:51:12 +01001123 .supports_autosuspend = 1,
Daniel Macke5779992010-03-04 19:46:13 +01001124};
1125
Sachin Kamat6b5a7c62013-10-09 17:22:32 +05301126module_usb_driver(usb_audio_driver);