blob: 5236f4d015c4867f1057fad1e4fd99a51166c5bc [file] [log] [blame]
Thomas Gleixner1a59d1b82019-05-27 08:55:05 +02001/* SPDX-License-Identifier: GPL-2.0-or-later */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002/*
3 * ALSA USB Audio Driver
4 *
5 * Copyright (c) 2002 by Takashi Iwai <tiwai@suse.de>,
6 * Clemens Ladisch <clemens@ladisch.de>
Linus Torvalds1da177e2005-04-16 15:20:36 -07007 */
8
9/*
10 * The contents of this file are part of the driver's id_table.
11 *
12 * In a perfect world, this file would be empty.
13 */
14
15/*
16 * Use this for devices where other interfaces are standard compliant,
17 * to prevent the quirk being applied to those interfaces. (To work with
18 * hotplugging, bDeviceClass must be set to USB_CLASS_PER_INTERFACE.)
19 */
20#define USB_DEVICE_VENDOR_SPEC(vend, prod) \
21 .match_flags = USB_DEVICE_ID_MATCH_VENDOR | \
22 USB_DEVICE_ID_MATCH_PRODUCT | \
23 USB_DEVICE_ID_MATCH_INT_CLASS, \
24 .idVendor = vend, \
25 .idProduct = prod, \
26 .bInterfaceClass = USB_CLASS_VENDOR_SPEC
27
Takashi Iwai81917432020-05-27 08:12:27 +020028#define QUIRK_RENAME_DEVICE(_vendor, _device) \
29 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { \
30 .vendor_name = _vendor, \
31 .product_name = _device, \
32 .ifnum = QUIRK_NO_INTERFACE \
33 }
34
35#define QUIRK_DEVICE_PROFILE(_vendor, _device, _profile) \
36 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { \
37 .vendor_name = _vendor, \
38 .product_name = _device, \
39 .profile_name = _profile, \
40 .ifnum = QUIRK_NO_INTERFACE \
41 }
42
Kristian Amlie1ef0e0a2011-08-26 13:19:49 +020043/* FTDI devices */
44{
45 USB_DEVICE(0x0403, 0xb8d8),
46 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
47 /* .vendor_name = "STARR LABS", */
48 /* .product_name = "Starr Labs MIDI USB device", */
49 .ifnum = 0,
50 .type = QUIRK_MIDI_FTDI
51 }
52},
53
Alexander Schremmer8f7f3ab12013-01-03 12:59:07 +010054{
55 /* Creative BT-D1 */
56 USB_DEVICE(0x041e, 0x0005),
57 .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) {
58 .ifnum = 1,
59 .type = QUIRK_AUDIO_FIXED_ENDPOINT,
60 .data = &(const struct audioformat) {
61 .formats = SNDRV_PCM_FMTBIT_S16_LE,
62 .channels = 2,
63 .iface = 1,
64 .altsetting = 1,
65 .altset_idx = 1,
66 .endpoint = 0x03,
67 .ep_attr = USB_ENDPOINT_XFER_ISOC,
68 .attributes = 0,
69 .rates = SNDRV_PCM_RATE_CONTINUOUS,
70 .rate_min = 48000,
71 .rate_max = 48000,
72 }
73 }
74},
75
Clemens Ladisch25a47b62008-02-25 11:04:19 +010076/* Creative/E-Mu devices */
77{
78 USB_DEVICE(0x041e, 0x3010),
Takashi Iwai81917432020-05-27 08:12:27 +020079 QUIRK_RENAME_DEVICE("Creative Labs", "Sound Blaster MP3+")
Clemens Ladisch25a47b62008-02-25 11:04:19 +010080},
Daniel Mack358b7df2014-01-14 14:37:56 +010081/* Creative/Toshiba Multimedia Center SB-0500 */
82{
83 USB_DEVICE(0x041e, 0x3048),
Takashi Iwai81917432020-05-27 08:12:27 +020084 QUIRK_RENAME_DEVICE("Toshiba", "SB-0500")
Daniel Mack358b7df2014-01-14 14:37:56 +010085},
Clemens Ladisch25a47b62008-02-25 11:04:19 +010086{
87 /* E-Mu 0202 USB */
88 .match_flags = USB_DEVICE_ID_MATCH_DEVICE,
89 .idVendor = 0x041e,
90 .idProduct = 0x3f02,
91 .bInterfaceClass = USB_CLASS_AUDIO,
92},
93{
94 /* E-Mu 0404 USB */
95 .match_flags = USB_DEVICE_ID_MATCH_DEVICE,
96 .idVendor = 0x041e,
97 .idProduct = 0x3f04,
98 .bInterfaceClass = USB_CLASS_AUDIO,
99},
Eran Tromer97c889a2008-09-26 01:07:03 -0400100{
101 /* E-Mu Tracker Pre */
102 .match_flags = USB_DEVICE_ID_MATCH_DEVICE,
103 .idVendor = 0x041e,
104 .idProduct = 0x3f0a,
105 .bInterfaceClass = USB_CLASS_AUDIO,
106},
Joseph Teichman1cdfa9f2011-02-08 01:22:36 -0500107{
108 /* E-Mu 0204 USB */
109 .match_flags = USB_DEVICE_ID_MATCH_DEVICE,
110 .idVendor = 0x041e,
111 .idProduct = 0x3f19,
112 .bInterfaceClass = USB_CLASS_AUDIO,
113},
Clemens Ladisch25a47b62008-02-25 11:04:19 +0100114
Linus Torvalds1da177e2005-04-16 15:20:36 -0700115/*
Eldad Zackdf68f102012-12-15 05:30:33 +0100116 * HP Wireless Audio
117 * When not ignored, causes instability issues for some users, forcing them to
118 * blacklist the entire module.
119 */
120{
121 USB_DEVICE(0x0424, 0xb832),
122 .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) {
123 .vendor_name = "Standard Microsystems Corp.",
124 .product_name = "HP Wireless Audio",
125 .ifnum = QUIRK_ANY_INTERFACE,
126 .type = QUIRK_COMPOSITE,
127 .data = (const struct snd_usb_audio_quirk[]) {
128 /* Mixer */
129 {
130 .ifnum = 0,
131 .type = QUIRK_IGNORE_INTERFACE,
132 },
133 /* Playback */
134 {
135 .ifnum = 1,
136 .type = QUIRK_IGNORE_INTERFACE,
137 },
138 /* Capture */
139 {
140 .ifnum = 2,
141 .type = QUIRK_IGNORE_INTERFACE,
142 },
143 /* HID Device, .ifnum = 3 */
144 {
145 .ifnum = -1,
146 }
147 }
148 }
149},
150
151/*
Daniel Drakea9121452007-05-07 09:27:05 +0200152 * Logitech QuickCam: bDeviceClass is vendor-specific, so generic interface
153 * class matches do not take effect without an explicit ID match.
154 */
155{
156 .match_flags = USB_DEVICE_ID_MATCH_DEVICE |
157 USB_DEVICE_ID_MATCH_INT_CLASS |
158 USB_DEVICE_ID_MATCH_INT_SUBCLASS,
159 .idVendor = 0x046d,
Daniel Draked4170452007-05-10 08:52:19 +0200160 .idProduct = 0x0850,
161 .bInterfaceClass = USB_CLASS_AUDIO,
Daniel Mackde48c7b2010-02-22 23:49:13 +0100162 .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL
Daniel Draked4170452007-05-10 08:52:19 +0200163},
164{
165 .match_flags = USB_DEVICE_ID_MATCH_DEVICE |
166 USB_DEVICE_ID_MATCH_INT_CLASS |
167 USB_DEVICE_ID_MATCH_INT_SUBCLASS,
168 .idVendor = 0x046d,
George Shapovalovc34532d2007-07-09 10:42:35 +0200169 .idProduct = 0x08ae,
170 .bInterfaceClass = USB_CLASS_AUDIO,
Daniel Mackde48c7b2010-02-22 23:49:13 +0100171 .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL
George Shapovalovc34532d2007-07-09 10:42:35 +0200172},
173{
174 .match_flags = USB_DEVICE_ID_MATCH_DEVICE |
175 USB_DEVICE_ID_MATCH_INT_CLASS |
176 USB_DEVICE_ID_MATCH_INT_SUBCLASS,
177 .idVendor = 0x046d,
Ritesh Raj Sarrafcfc24ec2007-07-10 13:03:57 +0200178 .idProduct = 0x08c6,
179 .bInterfaceClass = USB_CLASS_AUDIO,
Daniel Mackde48c7b2010-02-22 23:49:13 +0100180 .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL
Ritesh Raj Sarrafcfc24ec2007-07-10 13:03:57 +0200181},
182{
183 .match_flags = USB_DEVICE_ID_MATCH_DEVICE |
184 USB_DEVICE_ID_MATCH_INT_CLASS |
185 USB_DEVICE_ID_MATCH_INT_SUBCLASS,
186 .idVendor = 0x046d,
Daniel Drakea9121452007-05-07 09:27:05 +0200187 .idProduct = 0x08f0,
188 .bInterfaceClass = USB_CLASS_AUDIO,
Daniel Mackde48c7b2010-02-22 23:49:13 +0100189 .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL
Daniel Drakea9121452007-05-07 09:27:05 +0200190},
191{
192 .match_flags = USB_DEVICE_ID_MATCH_DEVICE |
193 USB_DEVICE_ID_MATCH_INT_CLASS |
194 USB_DEVICE_ID_MATCH_INT_SUBCLASS,
195 .idVendor = 0x046d,
Dawid Wrobel31127f22007-10-22 11:57:17 +0200196 .idProduct = 0x08f5,
197 .bInterfaceClass = USB_CLASS_AUDIO,
Daniel Mackde48c7b2010-02-22 23:49:13 +0100198 .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL
Dawid Wrobel31127f22007-10-22 11:57:17 +0200199},
200{
201 .match_flags = USB_DEVICE_ID_MATCH_DEVICE |
202 USB_DEVICE_ID_MATCH_INT_CLASS |
203 USB_DEVICE_ID_MATCH_INT_SUBCLASS,
204 .idVendor = 0x046d,
Daniel Drakea9121452007-05-07 09:27:05 +0200205 .idProduct = 0x08f6,
206 .bInterfaceClass = USB_CLASS_AUDIO,
Daniel Mackde48c7b2010-02-22 23:49:13 +0100207 .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL
Daniel Drakea9121452007-05-07 09:27:05 +0200208},
Signed-off-by: Peter Stokes5c6c9e62009-01-14 09:47:57 +0100209{
Takashi Iwai8eafc0a2013-06-04 16:02:54 +0200210 .match_flags = USB_DEVICE_ID_MATCH_DEVICE |
211 USB_DEVICE_ID_MATCH_INT_CLASS |
212 USB_DEVICE_ID_MATCH_INT_SUBCLASS,
213 .idVendor = 0x046d,
214 .idProduct = 0x0990,
215 .bInterfaceClass = USB_CLASS_AUDIO,
216 .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL,
Takashi Iwai81917432020-05-27 08:12:27 +0200217 QUIRK_RENAME_DEVICE("Logitech, Inc.", "QuickCam Pro 9000")
Signed-off-by: Peter Stokes5c6c9e62009-01-14 09:47:57 +0100218},
Clemens Ladisch25a47b62008-02-25 11:04:19 +0100219
James Courtier-Dutton1e741902007-10-08 18:49:43 +0100220/*
Linus Torvalds1da177e2005-04-16 15:20:36 -0700221 * Yamaha devices
222 */
223
224#define YAMAHA_DEVICE(id, name) { \
225 USB_DEVICE(0x0499, id), \
Takashi Iwai86e07d32005-11-17 15:08:02 +0100226 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { \
Linus Torvalds1da177e2005-04-16 15:20:36 -0700227 .vendor_name = "Yamaha", \
228 .product_name = name, \
229 .ifnum = QUIRK_ANY_INTERFACE, \
230 .type = QUIRK_MIDI_YAMAHA \
231 } \
232}
233#define YAMAHA_INTERFACE(id, intf, name) { \
234 USB_DEVICE_VENDOR_SPEC(0x0499, id), \
Takashi Iwai86e07d32005-11-17 15:08:02 +0100235 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { \
Linus Torvalds1da177e2005-04-16 15:20:36 -0700236 .vendor_name = "Yamaha", \
237 .product_name = name, \
238 .ifnum = intf, \
239 .type = QUIRK_MIDI_YAMAHA \
240 } \
241}
242YAMAHA_DEVICE(0x1000, "UX256"),
243YAMAHA_DEVICE(0x1001, "MU1000"),
244YAMAHA_DEVICE(0x1002, "MU2000"),
245YAMAHA_DEVICE(0x1003, "MU500"),
246YAMAHA_INTERFACE(0x1004, 3, "UW500"),
247YAMAHA_DEVICE(0x1005, "MOTIF6"),
248YAMAHA_DEVICE(0x1006, "MOTIF7"),
249YAMAHA_DEVICE(0x1007, "MOTIF8"),
250YAMAHA_DEVICE(0x1008, "UX96"),
251YAMAHA_DEVICE(0x1009, "UX16"),
252YAMAHA_INTERFACE(0x100a, 3, "EOS BX"),
253YAMAHA_DEVICE(0x100c, "UC-MX"),
254YAMAHA_DEVICE(0x100d, "UC-KX"),
255YAMAHA_DEVICE(0x100e, "S08"),
256YAMAHA_DEVICE(0x100f, "CLP-150"),
257YAMAHA_DEVICE(0x1010, "CLP-170"),
258YAMAHA_DEVICE(0x1011, "P-250"),
259YAMAHA_DEVICE(0x1012, "TYROS"),
260YAMAHA_DEVICE(0x1013, "PF-500"),
261YAMAHA_DEVICE(0x1014, "S90"),
262YAMAHA_DEVICE(0x1015, "MOTIF-R"),
Clemens Ladisch4ccb4a42006-03-15 12:24:19 +0100263YAMAHA_DEVICE(0x1016, "MDP-5"),
Linus Torvalds1da177e2005-04-16 15:20:36 -0700264YAMAHA_DEVICE(0x1017, "CVP-204"),
265YAMAHA_DEVICE(0x1018, "CVP-206"),
266YAMAHA_DEVICE(0x1019, "CVP-208"),
267YAMAHA_DEVICE(0x101a, "CVP-210"),
268YAMAHA_DEVICE(0x101b, "PSR-1100"),
269YAMAHA_DEVICE(0x101c, "PSR-2100"),
270YAMAHA_DEVICE(0x101d, "CLP-175"),
271YAMAHA_DEVICE(0x101e, "PSR-K1"),
Clemens Ladisch4ccb4a42006-03-15 12:24:19 +0100272YAMAHA_DEVICE(0x101f, "EZ-J24"),
Linus Torvalds1da177e2005-04-16 15:20:36 -0700273YAMAHA_DEVICE(0x1020, "EZ-250i"),
274YAMAHA_DEVICE(0x1021, "MOTIF ES 6"),
275YAMAHA_DEVICE(0x1022, "MOTIF ES 7"),
276YAMAHA_DEVICE(0x1023, "MOTIF ES 8"),
277YAMAHA_DEVICE(0x1024, "CVP-301"),
278YAMAHA_DEVICE(0x1025, "CVP-303"),
279YAMAHA_DEVICE(0x1026, "CVP-305"),
280YAMAHA_DEVICE(0x1027, "CVP-307"),
281YAMAHA_DEVICE(0x1028, "CVP-309"),
282YAMAHA_DEVICE(0x1029, "CVP-309GP"),
283YAMAHA_DEVICE(0x102a, "PSR-1500"),
284YAMAHA_DEVICE(0x102b, "PSR-3000"),
285YAMAHA_DEVICE(0x102e, "ELS-01/01C"),
286YAMAHA_DEVICE(0x1030, "PSR-295/293"),
287YAMAHA_DEVICE(0x1031, "DGX-205/203"),
288YAMAHA_DEVICE(0x1032, "DGX-305"),
289YAMAHA_DEVICE(0x1033, "DGX-505"),
290YAMAHA_DEVICE(0x1034, NULL),
291YAMAHA_DEVICE(0x1035, NULL),
292YAMAHA_DEVICE(0x1036, NULL),
293YAMAHA_DEVICE(0x1037, NULL),
294YAMAHA_DEVICE(0x1038, NULL),
295YAMAHA_DEVICE(0x1039, NULL),
296YAMAHA_DEVICE(0x103a, NULL),
297YAMAHA_DEVICE(0x103b, NULL),
298YAMAHA_DEVICE(0x103c, NULL),
Clemens Ladisch0ac2ac02005-07-01 16:19:39 +0200299YAMAHA_DEVICE(0x103d, NULL),
Clemens Ladischf542fda2005-09-20 09:06:36 +0200300YAMAHA_DEVICE(0x103e, NULL),
301YAMAHA_DEVICE(0x103f, NULL),
302YAMAHA_DEVICE(0x1040, NULL),
303YAMAHA_DEVICE(0x1041, NULL),
Clemens Ladischf1265392006-07-21 10:46:18 +0200304YAMAHA_DEVICE(0x1042, NULL),
305YAMAHA_DEVICE(0x1043, NULL),
306YAMAHA_DEVICE(0x1044, NULL),
307YAMAHA_DEVICE(0x1045, NULL),
Clemens Ladischc85ceac2008-07-10 11:01:06 +0200308YAMAHA_INTERFACE(0x104e, 0, NULL),
Clemens Ladisch83a1a392008-07-10 11:05:42 +0200309YAMAHA_DEVICE(0x104f, NULL),
310YAMAHA_DEVICE(0x1050, NULL),
311YAMAHA_DEVICE(0x1051, NULL),
312YAMAHA_DEVICE(0x1052, NULL),
Clemens Ladisch422fdc32010-10-04 13:09:12 +0200313YAMAHA_INTERFACE(0x1053, 0, NULL),
314YAMAHA_INTERFACE(0x1054, 0, NULL),
315YAMAHA_DEVICE(0x1055, NULL),
316YAMAHA_DEVICE(0x1056, NULL),
317YAMAHA_DEVICE(0x1057, NULL),
318YAMAHA_DEVICE(0x1058, NULL),
319YAMAHA_DEVICE(0x1059, NULL),
320YAMAHA_DEVICE(0x105a, NULL),
321YAMAHA_DEVICE(0x105b, NULL),
322YAMAHA_DEVICE(0x105c, NULL),
323YAMAHA_DEVICE(0x105d, NULL),
Clemens Ladisch8c3f5d82011-12-19 23:09:15 +0100324{
325 USB_DEVICE(0x0499, 0x1503),
326 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
327 /* .vendor_name = "Yamaha", */
328 /* .product_name = "MOX6/MOX8", */
329 .ifnum = QUIRK_ANY_INTERFACE,
330 .type = QUIRK_COMPOSITE,
331 .data = (const struct snd_usb_audio_quirk[]) {
332 {
333 .ifnum = 1,
334 .type = QUIRK_AUDIO_STANDARD_INTERFACE
335 },
336 {
337 .ifnum = 2,
338 .type = QUIRK_AUDIO_STANDARD_INTERFACE
339 },
340 {
341 .ifnum = 3,
342 .type = QUIRK_MIDI_YAMAHA
343 },
344 {
345 .ifnum = -1
346 }
347 }
348 }
349},
Trulan Martinae3f0c22013-04-24 21:19:19 -0400350{
351 USB_DEVICE(0x0499, 0x1507),
352 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
353 /* .vendor_name = "Yamaha", */
354 /* .product_name = "THR10", */
355 .ifnum = QUIRK_ANY_INTERFACE,
356 .type = QUIRK_COMPOSITE,
357 .data = (const struct snd_usb_audio_quirk[]) {
358 {
359 .ifnum = 1,
360 .type = QUIRK_AUDIO_STANDARD_INTERFACE
361 },
362 {
363 .ifnum = 2,
364 .type = QUIRK_AUDIO_STANDARD_INTERFACE
365 },
366 {
367 .ifnum = 3,
368 .type = QUIRK_MIDI_YAMAHA
369 },
370 {
371 .ifnum = -1
372 }
373 }
374 }
375},
Trulan Martin1b153622013-04-24 21:19:20 -0400376{
Vlad Catoif0b127f2014-10-18 17:45:41 -0500377 USB_DEVICE(0x0499, 0x1509),
378 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
379 /* .vendor_name = "Yamaha", */
380 /* .product_name = "Steinberg UR22", */
381 .ifnum = QUIRK_ANY_INTERFACE,
382 .type = QUIRK_COMPOSITE,
383 .data = (const struct snd_usb_audio_quirk[]) {
384 {
385 .ifnum = 1,
386 .type = QUIRK_AUDIO_STANDARD_INTERFACE
387 },
388 {
389 .ifnum = 2,
390 .type = QUIRK_AUDIO_STANDARD_INTERFACE
391 },
392 {
393 .ifnum = 3,
394 .type = QUIRK_MIDI_YAMAHA
395 },
396 {
397 .ifnum = 4,
398 .type = QUIRK_IGNORE_INTERFACE
399 },
400 {
401 .ifnum = -1
402 }
403 }
404 }
405},
406{
Trulan Martin1b153622013-04-24 21:19:20 -0400407 USB_DEVICE(0x0499, 0x150a),
408 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
409 /* .vendor_name = "Yamaha", */
410 /* .product_name = "THR5A", */
411 .ifnum = QUIRK_ANY_INTERFACE,
412 .type = QUIRK_COMPOSITE,
413 .data = (const struct snd_usb_audio_quirk[]) {
414 {
415 .ifnum = 1,
416 .type = QUIRK_AUDIO_STANDARD_INTERFACE
417 },
418 {
419 .ifnum = 2,
420 .type = QUIRK_AUDIO_STANDARD_INTERFACE
421 },
422 {
423 .ifnum = 3,
424 .type = QUIRK_MIDI_YAMAHA
425 },
426 {
427 .ifnum = -1
428 }
429 }
430 }
431},
Trulan Martin03e02212013-04-24 21:19:21 -0400432{
433 USB_DEVICE(0x0499, 0x150c),
434 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
435 /* .vendor_name = "Yamaha", */
436 /* .product_name = "THR10C", */
437 .ifnum = QUIRK_ANY_INTERFACE,
438 .type = QUIRK_COMPOSITE,
439 .data = (const struct snd_usb_audio_quirk[]) {
440 {
441 .ifnum = 1,
442 .type = QUIRK_AUDIO_STANDARD_INTERFACE
443 },
444 {
445 .ifnum = 2,
446 .type = QUIRK_AUDIO_STANDARD_INTERFACE
447 },
448 {
449 .ifnum = 3,
450 .type = QUIRK_MIDI_YAMAHA
451 },
452 {
453 .ifnum = -1
454 }
455 }
456 }
457},
Linus Torvalds1da177e2005-04-16 15:20:36 -0700458YAMAHA_DEVICE(0x2000, "DGP-7"),
459YAMAHA_DEVICE(0x2001, "DGP-5"),
460YAMAHA_DEVICE(0x2002, NULL),
Clemens Ladisch422fdc32010-10-04 13:09:12 +0200461YAMAHA_DEVICE(0x2003, NULL),
Linus Torvalds1da177e2005-04-16 15:20:36 -0700462YAMAHA_DEVICE(0x5000, "CS1D"),
463YAMAHA_DEVICE(0x5001, "DSP1D"),
464YAMAHA_DEVICE(0x5002, "DME32"),
465YAMAHA_DEVICE(0x5003, "DM2000"),
466YAMAHA_DEVICE(0x5004, "02R96"),
467YAMAHA_DEVICE(0x5005, "ACU16-C"),
468YAMAHA_DEVICE(0x5006, "NHB32-C"),
469YAMAHA_DEVICE(0x5007, "DM1000"),
470YAMAHA_DEVICE(0x5008, "01V96"),
471YAMAHA_DEVICE(0x5009, "SPX2000"),
472YAMAHA_DEVICE(0x500a, "PM5D"),
473YAMAHA_DEVICE(0x500b, "DME64N"),
474YAMAHA_DEVICE(0x500c, "DME24N"),
475YAMAHA_DEVICE(0x500d, NULL),
476YAMAHA_DEVICE(0x500e, NULL),
Clemens Ladischf1265392006-07-21 10:46:18 +0200477YAMAHA_DEVICE(0x500f, NULL),
Linus Torvalds1da177e2005-04-16 15:20:36 -0700478YAMAHA_DEVICE(0x7000, "DTX"),
479YAMAHA_DEVICE(0x7010, "UB99"),
480#undef YAMAHA_DEVICE
481#undef YAMAHA_INTERFACE
Clemens Ladischaafe77c2013-03-31 23:43:12 +0200482/* this catches most recent vendor-specific Yamaha devices */
483{
484 .match_flags = USB_DEVICE_ID_MATCH_VENDOR |
485 USB_DEVICE_ID_MATCH_INT_CLASS,
486 .idVendor = 0x0499,
487 .bInterfaceClass = USB_CLASS_VENDOR_SPEC,
488 .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) {
489 .ifnum = QUIRK_ANY_INTERFACE,
490 .type = QUIRK_AUTODETECT
491 }
492},
Linus Torvalds1da177e2005-04-16 15:20:36 -0700493
494/*
495 * Roland/RolandED/Edirol/BOSS devices
496 */
497{
498 USB_DEVICE(0x0582, 0x0000),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100499 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700500 .vendor_name = "Roland",
501 .product_name = "UA-100",
502 .ifnum = QUIRK_ANY_INTERFACE,
503 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100504 .data = (const struct snd_usb_audio_quirk[]) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700505 {
506 .ifnum = 0,
507 .type = QUIRK_AUDIO_FIXED_ENDPOINT,
508 .data = & (const struct audioformat) {
Clemens Ladisch015eb0b2010-03-04 19:46:15 +0100509 .formats = SNDRV_PCM_FMTBIT_S16_LE,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700510 .channels = 4,
511 .iface = 0,
512 .altsetting = 1,
513 .altset_idx = 1,
514 .attributes = 0,
515 .endpoint = 0x01,
516 .ep_attr = 0x09,
517 .rates = SNDRV_PCM_RATE_CONTINUOUS,
518 .rate_min = 44100,
519 .rate_max = 44100,
520 }
521 },
522 {
523 .ifnum = 1,
524 .type = QUIRK_AUDIO_FIXED_ENDPOINT,
525 .data = & (const struct audioformat) {
Clemens Ladisch015eb0b2010-03-04 19:46:15 +0100526 .formats = SNDRV_PCM_FMTBIT_S16_LE,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700527 .channels = 2,
528 .iface = 1,
529 .altsetting = 1,
530 .altset_idx = 1,
Daniel Mackde48c7b2010-02-22 23:49:13 +0100531 .attributes = UAC_EP_CS_ATTR_FILL_MAX,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700532 .endpoint = 0x81,
533 .ep_attr = 0x05,
534 .rates = SNDRV_PCM_RATE_CONTINUOUS,
535 .rate_min = 44100,
536 .rate_max = 44100,
537 }
538 },
539 {
540 .ifnum = 2,
541 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100542 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700543 .out_cables = 0x0007,
544 .in_cables = 0x0007
545 }
546 },
547 {
548 .ifnum = -1
549 }
550 }
551 }
552},
553{
554 USB_DEVICE(0x0582, 0x0002),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100555 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700556 .vendor_name = "EDIROL",
557 .product_name = "UM-4",
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200558 .ifnum = QUIRK_ANY_INTERFACE,
559 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100560 .data = (const struct snd_usb_audio_quirk[]) {
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200561 {
562 .ifnum = 0,
563 .type = QUIRK_IGNORE_INTERFACE
564 },
565 {
566 .ifnum = 1,
567 .type = QUIRK_IGNORE_INTERFACE
568 },
569 {
570 .ifnum = 2,
571 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100572 .data = & (const struct snd_usb_midi_endpoint_info) {
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200573 .out_cables = 0x000f,
574 .in_cables = 0x000f
575 }
576 },
577 {
578 .ifnum = -1
579 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700580 }
581 }
582},
583{
584 USB_DEVICE(0x0582, 0x0003),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100585 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700586 .vendor_name = "Roland",
587 .product_name = "SC-8850",
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200588 .ifnum = QUIRK_ANY_INTERFACE,
589 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100590 .data = (const struct snd_usb_audio_quirk[]) {
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200591 {
592 .ifnum = 0,
593 .type = QUIRK_IGNORE_INTERFACE
594 },
595 {
596 .ifnum = 1,
597 .type = QUIRK_IGNORE_INTERFACE
598 },
599 {
600 .ifnum = 2,
601 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100602 .data = & (const struct snd_usb_midi_endpoint_info) {
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200603 .out_cables = 0x003f,
604 .in_cables = 0x003f
605 }
606 },
607 {
608 .ifnum = -1
609 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700610 }
611 }
612},
613{
614 USB_DEVICE(0x0582, 0x0004),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100615 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700616 .vendor_name = "Roland",
617 .product_name = "U-8",
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200618 .ifnum = QUIRK_ANY_INTERFACE,
619 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100620 .data = (const struct snd_usb_audio_quirk[]) {
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200621 {
622 .ifnum = 0,
623 .type = QUIRK_IGNORE_INTERFACE
624 },
625 {
626 .ifnum = 1,
627 .type = QUIRK_IGNORE_INTERFACE
628 },
629 {
630 .ifnum = 2,
631 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100632 .data = & (const struct snd_usb_midi_endpoint_info) {
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200633 .out_cables = 0x0005,
634 .in_cables = 0x0005
635 }
636 },
637 {
638 .ifnum = -1
639 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700640 }
641 }
642},
643{
Clemens Ladisch119c4ff2006-01-19 08:25:19 +0100644 /* Has ID 0x0099 when not in "Advanced Driver" mode.
645 * The UM-2EX has only one input, but we cannot detect this. */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700646 USB_DEVICE(0x0582, 0x0005),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100647 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700648 .vendor_name = "EDIROL",
649 .product_name = "UM-2",
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200650 .ifnum = QUIRK_ANY_INTERFACE,
651 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100652 .data = (const struct snd_usb_audio_quirk[]) {
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200653 {
654 .ifnum = 0,
655 .type = QUIRK_IGNORE_INTERFACE
656 },
657 {
658 .ifnum = 1,
659 .type = QUIRK_IGNORE_INTERFACE
660 },
661 {
662 .ifnum = 2,
663 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100664 .data = & (const struct snd_usb_midi_endpoint_info) {
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200665 .out_cables = 0x0003,
666 .in_cables = 0x0003
667 }
668 },
669 {
670 .ifnum = -1
671 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700672 }
673 }
674},
675{
676 USB_DEVICE(0x0582, 0x0007),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100677 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700678 .vendor_name = "Roland",
679 .product_name = "SC-8820",
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200680 .ifnum = QUIRK_ANY_INTERFACE,
681 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100682 .data = (const struct snd_usb_audio_quirk[]) {
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200683 {
684 .ifnum = 0,
685 .type = QUIRK_IGNORE_INTERFACE
686 },
687 {
688 .ifnum = 1,
689 .type = QUIRK_IGNORE_INTERFACE
690 },
691 {
692 .ifnum = 2,
693 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100694 .data = & (const struct snd_usb_midi_endpoint_info) {
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200695 .out_cables = 0x0013,
696 .in_cables = 0x0013
697 }
698 },
699 {
700 .ifnum = -1
701 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700702 }
703 }
704},
705{
706 USB_DEVICE(0x0582, 0x0008),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100707 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700708 .vendor_name = "Roland",
709 .product_name = "PC-300",
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200710 .ifnum = QUIRK_ANY_INTERFACE,
711 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100712 .data = (const struct snd_usb_audio_quirk[]) {
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200713 {
714 .ifnum = 0,
715 .type = QUIRK_IGNORE_INTERFACE
716 },
717 {
718 .ifnum = 1,
719 .type = QUIRK_IGNORE_INTERFACE
720 },
721 {
722 .ifnum = 2,
723 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100724 .data = & (const struct snd_usb_midi_endpoint_info) {
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200725 .out_cables = 0x0001,
726 .in_cables = 0x0001
727 }
728 },
729 {
730 .ifnum = -1
731 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700732 }
733 }
734},
735{
Clemens Ladisch119c4ff2006-01-19 08:25:19 +0100736 /* has ID 0x009d when not in "Advanced Driver" mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700737 USB_DEVICE(0x0582, 0x0009),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100738 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700739 .vendor_name = "EDIROL",
740 .product_name = "UM-1",
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200741 .ifnum = QUIRK_ANY_INTERFACE,
742 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100743 .data = (const struct snd_usb_audio_quirk[]) {
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200744 {
745 .ifnum = 0,
746 .type = QUIRK_IGNORE_INTERFACE
747 },
748 {
749 .ifnum = 1,
750 .type = QUIRK_IGNORE_INTERFACE
751 },
752 {
753 .ifnum = 2,
754 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100755 .data = & (const struct snd_usb_midi_endpoint_info) {
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200756 .out_cables = 0x0001,
757 .in_cables = 0x0001
758 }
759 },
760 {
761 .ifnum = -1
762 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700763 }
764 }
765},
766{
767 USB_DEVICE(0x0582, 0x000b),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100768 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700769 .vendor_name = "Roland",
770 .product_name = "SK-500",
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200771 .ifnum = QUIRK_ANY_INTERFACE,
772 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100773 .data = (const struct snd_usb_audio_quirk[]) {
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200774 {
775 .ifnum = 0,
776 .type = QUIRK_IGNORE_INTERFACE
777 },
778 {
779 .ifnum = 1,
780 .type = QUIRK_IGNORE_INTERFACE
781 },
782 {
783 .ifnum = 2,
784 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100785 .data = & (const struct snd_usb_midi_endpoint_info) {
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200786 .out_cables = 0x0013,
787 .in_cables = 0x0013
788 }
789 },
790 {
791 .ifnum = -1
792 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700793 }
794 }
795},
796{
797 /* thanks to Emiliano Grilli <emillo@libero.it>
798 * for helping researching this data */
799 USB_DEVICE(0x0582, 0x000c),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100800 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700801 .vendor_name = "Roland",
802 .product_name = "SC-D70",
803 .ifnum = QUIRK_ANY_INTERFACE,
804 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100805 .data = (const struct snd_usb_audio_quirk[]) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700806 {
807 .ifnum = 0,
Takamichi Horikawa6d1f2f62015-04-21 11:23:57 +0900808 .type = QUIRK_AUDIO_STANDARD_INTERFACE
Linus Torvalds1da177e2005-04-16 15:20:36 -0700809 },
810 {
811 .ifnum = 1,
Takamichi Horikawa6d1f2f62015-04-21 11:23:57 +0900812 .type = QUIRK_AUDIO_STANDARD_INTERFACE
Linus Torvalds1da177e2005-04-16 15:20:36 -0700813 },
814 {
815 .ifnum = 2,
816 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100817 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700818 .out_cables = 0x0007,
819 .in_cables = 0x0007
820 }
821 },
822 {
823 .ifnum = -1
824 }
825 }
826 }
827},
828{ /*
829 * This quirk is for the "Advanced Driver" mode of the Edirol UA-5.
830 * If the advanced mode switch at the back of the unit is off, the
831 * UA-5 has ID 0x0582/0x0011 and is standard compliant (no quirks),
832 * but offers only 16-bit PCM.
833 * In advanced mode, the UA-5 will output S24_3LE samples (two
834 * channels) at the rate indicated on the front switch, including
835 * the 96kHz sample rate.
836 */
837 USB_DEVICE(0x0582, 0x0010),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100838 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700839 .vendor_name = "EDIROL",
840 .product_name = "UA-5",
841 .ifnum = QUIRK_ANY_INTERFACE,
842 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100843 .data = (const struct snd_usb_audio_quirk[]) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700844 {
845 .ifnum = 1,
846 .type = QUIRK_AUDIO_STANDARD_INTERFACE
847 },
848 {
849 .ifnum = 2,
850 .type = QUIRK_AUDIO_STANDARD_INTERFACE
851 },
852 {
853 .ifnum = -1
854 }
855 }
856 }
857},
858{
Clemens Ladischd879f0c2005-09-21 16:33:49 +0200859 /* has ID 0x0013 when not in "Advanced Driver" mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700860 USB_DEVICE(0x0582, 0x0012),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100861 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700862 .vendor_name = "Roland",
863 .product_name = "XV-5050",
864 .ifnum = 0,
865 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100866 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700867 .out_cables = 0x0001,
868 .in_cables = 0x0001
869 }
870 }
871},
872{
Clemens Ladischd879f0c2005-09-21 16:33:49 +0200873 /* has ID 0x0015 when not in "Advanced Driver" mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700874 USB_DEVICE(0x0582, 0x0014),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100875 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700876 .vendor_name = "EDIROL",
877 .product_name = "UM-880",
878 .ifnum = 0,
879 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100880 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700881 .out_cables = 0x01ff,
882 .in_cables = 0x01ff
883 }
884 }
885},
886{
Clemens Ladischd879f0c2005-09-21 16:33:49 +0200887 /* has ID 0x0017 when not in "Advanced Driver" mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700888 USB_DEVICE(0x0582, 0x0016),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100889 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700890 .vendor_name = "EDIROL",
891 .product_name = "SD-90",
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200892 .ifnum = QUIRK_ANY_INTERFACE,
893 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100894 .data = (const struct snd_usb_audio_quirk[]) {
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200895 {
896 .ifnum = 0,
Clemens Ladisch061b8692011-01-10 16:30:54 +0100897 .type = QUIRK_AUDIO_STANDARD_INTERFACE
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200898 },
899 {
900 .ifnum = 1,
Clemens Ladisch061b8692011-01-10 16:30:54 +0100901 .type = QUIRK_AUDIO_STANDARD_INTERFACE
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200902 },
903 {
904 .ifnum = 2,
905 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100906 .data = & (const struct snd_usb_midi_endpoint_info) {
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200907 .out_cables = 0x000f,
908 .in_cables = 0x000f
909 }
910 },
911 {
912 .ifnum = -1
913 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700914 }
915 }
916},
917{
Clemens Ladischd879f0c2005-09-21 16:33:49 +0200918 /* has ID 0x001c when not in "Advanced Driver" mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700919 USB_DEVICE(0x0582, 0x001b),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100920 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700921 .vendor_name = "Roland",
922 .product_name = "MMP-2",
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200923 .ifnum = QUIRK_ANY_INTERFACE,
924 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100925 .data = (const struct snd_usb_audio_quirk[]) {
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200926 {
927 .ifnum = 0,
928 .type = QUIRK_IGNORE_INTERFACE
929 },
930 {
931 .ifnum = 1,
932 .type = QUIRK_IGNORE_INTERFACE
933 },
934 {
935 .ifnum = 2,
936 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100937 .data = & (const struct snd_usb_midi_endpoint_info) {
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200938 .out_cables = 0x0001,
939 .in_cables = 0x0001
940 }
941 },
942 {
943 .ifnum = -1
944 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700945 }
946 }
947},
948{
Clemens Ladischd879f0c2005-09-21 16:33:49 +0200949 /* has ID 0x001e when not in "Advanced Driver" mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700950 USB_DEVICE(0x0582, 0x001d),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100951 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700952 .vendor_name = "Roland",
953 .product_name = "V-SYNTH",
954 .ifnum = 0,
955 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100956 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700957 .out_cables = 0x0001,
958 .in_cables = 0x0001
959 }
960 }
961},
962{
Clemens Ladischd879f0c2005-09-21 16:33:49 +0200963 /* has ID 0x0024 when not in "Advanced Driver" mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700964 USB_DEVICE(0x0582, 0x0023),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100965 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700966 .vendor_name = "EDIROL",
967 .product_name = "UM-550",
968 .ifnum = 0,
969 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100970 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700971 .out_cables = 0x003f,
972 .in_cables = 0x003f
973 }
974 }
975},
976{
977 /*
978 * This quirk is for the "Advanced Driver" mode. If off, the UA-20
979 * has ID 0x0026 and is standard compliant, but has only 16-bit PCM
980 * and no MIDI.
981 */
982 USB_DEVICE(0x0582, 0x0025),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100983 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700984 .vendor_name = "EDIROL",
985 .product_name = "UA-20",
986 .ifnum = QUIRK_ANY_INTERFACE,
987 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100988 .data = (const struct snd_usb_audio_quirk[]) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700989 {
Clemens Ladisch1f14a652005-11-21 16:40:00 +0100990 .ifnum = 0,
991 .type = QUIRK_IGNORE_INTERFACE
992 },
993 {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700994 .ifnum = 1,
Clemens Ladisch1f14a652005-11-21 16:40:00 +0100995 .type = QUIRK_AUDIO_FIXED_ENDPOINT,
996 .data = & (const struct audioformat) {
Clemens Ladisch015eb0b2010-03-04 19:46:15 +0100997 .formats = SNDRV_PCM_FMTBIT_S24_3LE,
Clemens Ladisch1f14a652005-11-21 16:40:00 +0100998 .channels = 2,
999 .iface = 1,
1000 .altsetting = 1,
1001 .altset_idx = 1,
1002 .attributes = 0,
1003 .endpoint = 0x01,
1004 .ep_attr = 0x01,
1005 .rates = SNDRV_PCM_RATE_CONTINUOUS,
1006 .rate_min = 44100,
1007 .rate_max = 44100,
1008 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001009 },
1010 {
1011 .ifnum = 2,
Clemens Ladisch1f14a652005-11-21 16:40:00 +01001012 .type = QUIRK_AUDIO_FIXED_ENDPOINT,
1013 .data = & (const struct audioformat) {
Clemens Ladisch015eb0b2010-03-04 19:46:15 +01001014 .formats = SNDRV_PCM_FMTBIT_S24_3LE,
Clemens Ladisch1f14a652005-11-21 16:40:00 +01001015 .channels = 2,
1016 .iface = 2,
1017 .altsetting = 1,
1018 .altset_idx = 1,
1019 .attributes = 0,
1020 .endpoint = 0x82,
1021 .ep_attr = 0x01,
1022 .rates = SNDRV_PCM_RATE_CONTINUOUS,
1023 .rate_min = 44100,
1024 .rate_max = 44100,
1025 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001026 },
1027 {
1028 .ifnum = 3,
Clemens Ladisch1f14a652005-11-21 16:40:00 +01001029 .type = QUIRK_MIDI_FIXED_ENDPOINT,
1030 .data = & (const struct snd_usb_midi_endpoint_info) {
1031 .out_cables = 0x0001,
1032 .in_cables = 0x0001
1033 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001034 },
1035 {
1036 .ifnum = -1
1037 }
1038 }
1039 }
1040},
1041{
Clemens Ladischd879f0c2005-09-21 16:33:49 +02001042 /* has ID 0x0028 when not in "Advanced Driver" mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001043 USB_DEVICE(0x0582, 0x0027),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001044 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001045 .vendor_name = "EDIROL",
1046 .product_name = "SD-20",
1047 .ifnum = 0,
1048 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001049 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001050 .out_cables = 0x0003,
1051 .in_cables = 0x0007
1052 }
1053 }
1054},
1055{
Clemens Ladischd879f0c2005-09-21 16:33:49 +02001056 /* has ID 0x002a when not in "Advanced Driver" mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001057 USB_DEVICE(0x0582, 0x0029),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001058 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001059 .vendor_name = "EDIROL",
1060 .product_name = "SD-80",
1061 .ifnum = 0,
1062 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001063 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001064 .out_cables = 0x000f,
1065 .in_cables = 0x000f
1066 }
1067 }
1068},
1069{ /*
1070 * This quirk is for the "Advanced" modes of the Edirol UA-700.
1071 * If the sample format switch is not in an advanced setting, the
1072 * UA-700 has ID 0x0582/0x002c and is standard compliant (no quirks),
1073 * but offers only 16-bit PCM and no MIDI.
1074 */
1075 USB_DEVICE_VENDOR_SPEC(0x0582, 0x002b),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001076 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001077 .vendor_name = "EDIROL",
1078 .product_name = "UA-700",
1079 .ifnum = QUIRK_ANY_INTERFACE,
1080 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001081 .data = (const struct snd_usb_audio_quirk[]) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001082 {
1083 .ifnum = 1,
Pedro Lopez-Cabanillas310e0dc2008-10-04 16:27:36 +02001084 .type = QUIRK_AUDIO_EDIROL_UAXX
Linus Torvalds1da177e2005-04-16 15:20:36 -07001085 },
1086 {
1087 .ifnum = 2,
Pedro Lopez-Cabanillas310e0dc2008-10-04 16:27:36 +02001088 .type = QUIRK_AUDIO_EDIROL_UAXX
Linus Torvalds1da177e2005-04-16 15:20:36 -07001089 },
1090 {
1091 .ifnum = 3,
Pedro Lopez-Cabanillas59b3db62008-10-07 20:54:18 +02001092 .type = QUIRK_AUDIO_EDIROL_UAXX
Linus Torvalds1da177e2005-04-16 15:20:36 -07001093 },
1094 {
1095 .ifnum = -1
1096 }
1097 }
1098 }
1099},
1100{
Clemens Ladischd879f0c2005-09-21 16:33:49 +02001101 /* has ID 0x002e when not in "Advanced Driver" mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001102 USB_DEVICE(0x0582, 0x002d),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001103 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001104 .vendor_name = "Roland",
1105 .product_name = "XV-2020",
1106 .ifnum = 0,
1107 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001108 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001109 .out_cables = 0x0001,
1110 .in_cables = 0x0001
1111 }
1112 }
1113},
1114{
Clemens Ladischd879f0c2005-09-21 16:33:49 +02001115 /* has ID 0x0030 when not in "Advanced Driver" mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001116 USB_DEVICE(0x0582, 0x002f),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001117 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001118 .vendor_name = "Roland",
1119 .product_name = "VariOS",
1120 .ifnum = 0,
1121 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001122 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001123 .out_cables = 0x0007,
1124 .in_cables = 0x0007
1125 }
1126 }
1127},
1128{
Clemens Ladischd879f0c2005-09-21 16:33:49 +02001129 /* has ID 0x0034 when not in "Advanced Driver" mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001130 USB_DEVICE(0x0582, 0x0033),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001131 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001132 .vendor_name = "EDIROL",
1133 .product_name = "PCR",
1134 .ifnum = 0,
1135 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001136 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001137 .out_cables = 0x0003,
1138 .in_cables = 0x0007
1139 }
1140 }
1141},
1142{
Clemens Ladischd879f0c2005-09-21 16:33:49 +02001143 /*
1144 * Has ID 0x0038 when not in "Advanced Driver" mode;
1145 * later revisions use IDs 0x0054 and 0x00a2.
1146 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001147 USB_DEVICE(0x0582, 0x0037),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001148 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001149 .vendor_name = "Roland",
1150 .product_name = "Digital Piano",
1151 .ifnum = 0,
1152 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001153 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001154 .out_cables = 0x0001,
1155 .in_cables = 0x0001
1156 }
1157 }
1158},
1159{
Clemens Ladisch5af4c832005-04-06 09:47:02 +02001160 /*
1161 * This quirk is for the "Advanced Driver" mode. If off, the GS-10
1162 * has ID 0x003c and is standard compliant, but has only 16-bit PCM
1163 * and no MIDI.
1164 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001165 USB_DEVICE_VENDOR_SPEC(0x0582, 0x003b),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001166 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001167 .vendor_name = "BOSS",
1168 .product_name = "GS-10",
Clemens Ladisch5af4c832005-04-06 09:47:02 +02001169 .ifnum = QUIRK_ANY_INTERFACE,
1170 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001171 .data = & (const struct snd_usb_audio_quirk[]) {
Clemens Ladisch5af4c832005-04-06 09:47:02 +02001172 {
1173 .ifnum = 1,
1174 .type = QUIRK_AUDIO_STANDARD_INTERFACE
1175 },
1176 {
1177 .ifnum = 2,
1178 .type = QUIRK_AUDIO_STANDARD_INTERFACE
1179 },
1180 {
1181 .ifnum = 3,
1182 .type = QUIRK_MIDI_STANDARD_INTERFACE
1183 },
1184 {
1185 .ifnum = -1
1186 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001187 }
1188 }
1189},
1190{
Clemens Ladischd879f0c2005-09-21 16:33:49 +02001191 /* has ID 0x0041 when not in "Advanced Driver" mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001192 USB_DEVICE(0x0582, 0x0040),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001193 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001194 .vendor_name = "Roland",
1195 .product_name = "GI-20",
1196 .ifnum = 0,
1197 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001198 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001199 .out_cables = 0x0001,
1200 .in_cables = 0x0001
1201 }
1202 }
1203},
1204{
Clemens Ladischd879f0c2005-09-21 16:33:49 +02001205 /* has ID 0x0043 when not in "Advanced Driver" mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001206 USB_DEVICE(0x0582, 0x0042),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001207 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001208 .vendor_name = "Roland",
1209 .product_name = "RS-70",
1210 .ifnum = 0,
1211 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001212 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001213 .out_cables = 0x0001,
1214 .in_cables = 0x0001
1215 }
1216 }
1217},
1218{
Clemens Ladisch358ce0c2007-12-19 14:25:24 +01001219 /* has ID 0x0049 when not in "Advanced Driver" mode */
1220 USB_DEVICE(0x0582, 0x0047),
1221 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1222 /* .vendor_name = "EDIROL", */
1223 /* .product_name = "UR-80", */
1224 .ifnum = QUIRK_ANY_INTERFACE,
1225 .type = QUIRK_COMPOSITE,
1226 .data = (const struct snd_usb_audio_quirk[]) {
1227 /* in the 96 kHz modes, only interface 1 is there */
1228 {
1229 .ifnum = 1,
1230 .type = QUIRK_AUDIO_STANDARD_INTERFACE
1231 },
1232 {
1233 .ifnum = 2,
1234 .type = QUIRK_AUDIO_STANDARD_INTERFACE
1235 },
1236 {
1237 .ifnum = -1
1238 }
1239 }
1240 }
1241},
1242{
Clemens Ladischd879f0c2005-09-21 16:33:49 +02001243 /* has ID 0x004a when not in "Advanced Driver" mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001244 USB_DEVICE(0x0582, 0x0048),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001245 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Clemens Ladisch358ce0c2007-12-19 14:25:24 +01001246 /* .vendor_name = "EDIROL", */
1247 /* .product_name = "UR-80", */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001248 .ifnum = 0,
1249 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001250 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001251 .out_cables = 0x0003,
1252 .in_cables = 0x0007
1253 }
1254 }
1255},
1256{
Clemens Ladischf38cc312007-02-09 20:52:55 +01001257 /* has ID 0x004e when not in "Advanced Driver" mode */
1258 USB_DEVICE(0x0582, 0x004c),
1259 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1260 .vendor_name = "EDIROL",
1261 .product_name = "PCR-A",
1262 .ifnum = QUIRK_ANY_INTERFACE,
1263 .type = QUIRK_COMPOSITE,
1264 .data = (const struct snd_usb_audio_quirk[]) {
1265 {
1266 .ifnum = 1,
1267 .type = QUIRK_AUDIO_STANDARD_INTERFACE
1268 },
1269 {
1270 .ifnum = 2,
1271 .type = QUIRK_AUDIO_STANDARD_INTERFACE
1272 },
1273 {
1274 .ifnum = -1
1275 }
1276 }
1277 }
1278},
1279{
Clemens Ladischd879f0c2005-09-21 16:33:49 +02001280 /* has ID 0x004f when not in "Advanced Driver" mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001281 USB_DEVICE(0x0582, 0x004d),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001282 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001283 .vendor_name = "EDIROL",
1284 .product_name = "PCR-A",
1285 .ifnum = 0,
1286 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001287 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001288 .out_cables = 0x0003,
1289 .in_cables = 0x0007
1290 }
1291 }
1292},
1293{
1294 /*
1295 * This quirk is for the "Advanced Driver" mode. If off, the UA-3FX
1296 * is standard compliant, but has only 16-bit PCM.
1297 */
1298 USB_DEVICE(0x0582, 0x0050),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001299 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001300 .vendor_name = "EDIROL",
1301 .product_name = "UA-3FX",
1302 .ifnum = QUIRK_ANY_INTERFACE,
1303 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001304 .data = (const struct snd_usb_audio_quirk[]) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001305 {
1306 .ifnum = 1,
1307 .type = QUIRK_AUDIO_STANDARD_INTERFACE
1308 },
1309 {
1310 .ifnum = 2,
1311 .type = QUIRK_AUDIO_STANDARD_INTERFACE
1312 },
1313 {
1314 .ifnum = -1
1315 }
1316 }
1317 }
1318},
1319{
1320 USB_DEVICE(0x0582, 0x0052),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001321 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001322 .vendor_name = "EDIROL",
1323 .product_name = "UM-1SX",
1324 .ifnum = 0,
1325 .type = QUIRK_MIDI_STANDARD_INTERFACE
1326 }
1327},
Takashi Iwaif1676842007-07-09 10:39:44 +02001328{
1329 USB_DEVICE(0x0582, 0x0060),
1330 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1331 .vendor_name = "Roland",
1332 .product_name = "EXR Series",
1333 .ifnum = 0,
1334 .type = QUIRK_MIDI_STANDARD_INTERFACE
1335 }
1336},
Linus Torvalds1da177e2005-04-16 15:20:36 -07001337{
Clemens Ladischaa70201f2010-08-30 16:32:43 +02001338 /* has ID 0x0066 when not in "Advanced Driver" mode */
1339 USB_DEVICE(0x0582, 0x0064),
1340 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1341 /* .vendor_name = "EDIROL", */
1342 /* .product_name = "PCR-1", */
1343 .ifnum = QUIRK_ANY_INTERFACE,
1344 .type = QUIRK_COMPOSITE,
1345 .data = (const struct snd_usb_audio_quirk[]) {
1346 {
1347 .ifnum = 1,
1348 .type = QUIRK_AUDIO_STANDARD_INTERFACE
1349 },
1350 {
1351 .ifnum = 2,
1352 .type = QUIRK_AUDIO_STANDARD_INTERFACE
1353 },
1354 {
1355 .ifnum = -1
1356 }
1357 }
1358 }
1359},
1360{
Clemens Ladischd879f0c2005-09-21 16:33:49 +02001361 /* has ID 0x0067 when not in "Advanced Driver" mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001362 USB_DEVICE(0x0582, 0x0065),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001363 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Clemens Ladischaa70201f2010-08-30 16:32:43 +02001364 /* .vendor_name = "EDIROL", */
1365 /* .product_name = "PCR-1", */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001366 .ifnum = 0,
1367 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001368 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001369 .out_cables = 0x0001,
1370 .in_cables = 0x0003
1371 }
1372 }
1373},
1374{
Clemens Ladischd879f0c2005-09-21 16:33:49 +02001375 /* has ID 0x006e when not in "Advanced Driver" mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001376 USB_DEVICE(0x0582, 0x006d),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001377 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001378 .vendor_name = "Roland",
1379 .product_name = "FANTOM-X",
1380 .ifnum = 0,
1381 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001382 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001383 .out_cables = 0x0001,
1384 .in_cables = 0x0001
1385 }
1386 }
1387},
1388{ /*
1389 * This quirk is for the "Advanced" modes of the Edirol UA-25.
1390 * If the switch is not in an advanced setting, the UA-25 has
1391 * ID 0x0582/0x0073 and is standard compliant (no quirks), but
1392 * offers only 16-bit PCM at 44.1 kHz and no MIDI.
1393 */
1394 USB_DEVICE_VENDOR_SPEC(0x0582, 0x0074),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001395 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001396 .vendor_name = "EDIROL",
1397 .product_name = "UA-25",
1398 .ifnum = QUIRK_ANY_INTERFACE,
1399 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001400 .data = (const struct snd_usb_audio_quirk[]) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001401 {
1402 .ifnum = 0,
Pedro Lopez-Cabanillas310e0dc2008-10-04 16:27:36 +02001403 .type = QUIRK_AUDIO_EDIROL_UAXX
Linus Torvalds1da177e2005-04-16 15:20:36 -07001404 },
1405 {
1406 .ifnum = 1,
Pedro Lopez-Cabanillas310e0dc2008-10-04 16:27:36 +02001407 .type = QUIRK_AUDIO_EDIROL_UAXX
Linus Torvalds1da177e2005-04-16 15:20:36 -07001408 },
1409 {
1410 .ifnum = 2,
Pedro Lopez-Cabanillas59b3db62008-10-07 20:54:18 +02001411 .type = QUIRK_AUDIO_EDIROL_UAXX
Linus Torvalds1da177e2005-04-16 15:20:36 -07001412 },
1413 {
1414 .ifnum = -1
1415 }
1416 }
1417 }
1418},
1419{
Clemens Ladischd879f0c2005-09-21 16:33:49 +02001420 /* has ID 0x0076 when not in "Advanced Driver" mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001421 USB_DEVICE(0x0582, 0x0075),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001422 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001423 .vendor_name = "BOSS",
1424 .product_name = "DR-880",
1425 .ifnum = 0,
1426 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001427 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001428 .out_cables = 0x0001,
1429 .in_cables = 0x0001
1430 }
1431 }
1432},
Clemens Ladisch5a2a68f2005-09-19 12:24:00 +02001433{
Clemens Ladischd879f0c2005-09-21 16:33:49 +02001434 /* has ID 0x007b when not in "Advanced Driver" mode */
Clemens Ladisch5a2a68f2005-09-19 12:24:00 +02001435 USB_DEVICE_VENDOR_SPEC(0x0582, 0x007a),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001436 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Clemens Ladisch5a2a68f2005-09-19 12:24:00 +02001437 .vendor_name = "Roland",
Clemens Ladischd879f0c2005-09-21 16:33:49 +02001438 /* "RD" or "RD-700SX"? */
Clemens Ladisch5a2a68f2005-09-19 12:24:00 +02001439 .ifnum = 0,
1440 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001441 .data = & (const struct snd_usb_midi_endpoint_info) {
Clemens Ladisch5a2a68f2005-09-19 12:24:00 +02001442 .out_cables = 0x0003,
1443 .in_cables = 0x0003
1444 }
1445 }
1446},
Clemens Ladischcdca8812006-01-18 08:53:32 +01001447{
1448 /* has ID 0x0081 when not in "Advanced Driver" mode */
1449 USB_DEVICE(0x0582, 0x0080),
1450 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1451 .vendor_name = "Roland",
1452 .product_name = "G-70",
1453 .ifnum = 0,
1454 .type = QUIRK_MIDI_FIXED_ENDPOINT,
1455 .data = & (const struct snd_usb_midi_endpoint_info) {
Clemens Ladisch05422572006-01-18 15:44:53 +01001456 .out_cables = 0x0001,
1457 .in_cables = 0x0001
Clemens Ladischcdca8812006-01-18 08:53:32 +01001458 }
1459 }
1460},
Clemens Ladisch415b09e42006-01-16 08:03:52 +01001461{
1462 /* has ID 0x008c when not in "Advanced Driver" mode */
1463 USB_DEVICE(0x0582, 0x008b),
1464 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1465 .vendor_name = "EDIROL",
1466 .product_name = "PC-50",
1467 .ifnum = 0,
1468 .type = QUIRK_MIDI_FIXED_ENDPOINT,
1469 .data = & (const struct snd_usb_midi_endpoint_info) {
1470 .out_cables = 0x0001,
1471 .in_cables = 0x0001
1472 }
1473 }
1474},
Pedro Lopez-Cabanillas310e0dc2008-10-04 16:27:36 +02001475{
1476 /*
1477 * This quirk is for the "Advanced Driver" mode. If off, the UA-4FX
1478 * is standard compliant, but has only 16-bit PCM and no MIDI.
1479 */
1480 USB_DEVICE(0x0582, 0x00a3),
1481 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1482 .vendor_name = "EDIROL",
1483 .product_name = "UA-4FX",
1484 .ifnum = QUIRK_ANY_INTERFACE,
1485 .type = QUIRK_COMPOSITE,
1486 .data = (const struct snd_usb_audio_quirk[]) {
1487 {
1488 .ifnum = 0,
1489 .type = QUIRK_AUDIO_EDIROL_UAXX
1490 },
1491 {
1492 .ifnum = 1,
1493 .type = QUIRK_AUDIO_EDIROL_UAXX
1494 },
1495 {
1496 .ifnum = 2,
Pedro Lopez-Cabanillas59b3db62008-10-07 20:54:18 +02001497 .type = QUIRK_AUDIO_EDIROL_UAXX
Pedro Lopez-Cabanillas310e0dc2008-10-04 16:27:36 +02001498 },
1499 {
1500 .ifnum = -1
1501 }
1502 }
1503 }
1504},
Clemens Ladischb38addb2008-07-28 10:19:39 +02001505{
Takashi Iwai6efd2cd2009-06-01 10:59:51 +02001506 /* Edirol M-16DX */
Takashi Iwai6efd2cd2009-06-01 10:59:51 +02001507 USB_DEVICE(0x0582, 0x00c4),
1508 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1509 .ifnum = QUIRK_ANY_INTERFACE,
1510 .type = QUIRK_COMPOSITE,
1511 .data = (const struct snd_usb_audio_quirk[]) {
1512 {
1513 .ifnum = 0,
1514 .type = QUIRK_AUDIO_STANDARD_INTERFACE
1515 },
1516 {
1517 .ifnum = 1,
1518 .type = QUIRK_AUDIO_STANDARD_INTERFACE
1519 },
1520 {
1521 .ifnum = 2,
1522 .type = QUIRK_MIDI_FIXED_ENDPOINT,
1523 .data = & (const struct snd_usb_midi_endpoint_info) {
1524 .out_cables = 0x0001,
1525 .in_cables = 0x0001
1526 }
1527 },
1528 {
1529 .ifnum = -1
1530 }
1531 }
1532 }
1533},
1534{
Takashi Iwaie2736262008-10-20 16:07:45 +02001535 /* Advanced modes of the Edirol UA-25EX.
1536 * For the standard mode, UA-25EX has ID 0582:00e7, which
1537 * offers only 16-bit PCM at 44.1 kHz and no MIDI.
1538 */
1539 USB_DEVICE_VENDOR_SPEC(0x0582, 0x00e6),
1540 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1541 .vendor_name = "EDIROL",
1542 .product_name = "UA-25EX",
1543 .ifnum = QUIRK_ANY_INTERFACE,
1544 .type = QUIRK_COMPOSITE,
1545 .data = (const struct snd_usb_audio_quirk[]) {
1546 {
1547 .ifnum = 0,
1548 .type = QUIRK_AUDIO_EDIROL_UAXX
1549 },
1550 {
1551 .ifnum = 1,
1552 .type = QUIRK_AUDIO_EDIROL_UAXX
1553 },
1554 {
1555 .ifnum = 2,
1556 .type = QUIRK_AUDIO_EDIROL_UAXX
1557 },
1558 {
1559 .ifnum = -1
1560 }
1561 }
1562 }
1563},
Clemens Ladischd867bba2009-11-19 14:34:33 +01001564{
Clemens Ladisch927c9422012-02-04 20:51:43 +01001565 /* Edirol UM-3G */
1566 USB_DEVICE_VENDOR_SPEC(0x0582, 0x0108),
1567 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1568 .ifnum = 0,
Clemens Ladischa0c6d302013-06-02 19:49:07 +02001569 .type = QUIRK_MIDI_FIXED_ENDPOINT,
1570 .data = & (const struct snd_usb_midi_endpoint_info) {
1571 .out_cables = 0x0007,
1572 .in_cables = 0x0007
1573 }
Clemens Ladisch927c9422012-02-04 20:51:43 +01001574 }
1575},
1576{
Clemens Ladisch53da5eb2014-08-09 17:19:41 +02001577 /* BOSS ME-25 */
1578 USB_DEVICE(0x0582, 0x0113),
1579 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1580 .ifnum = QUIRK_ANY_INTERFACE,
1581 .type = QUIRK_COMPOSITE,
1582 .data = (const struct snd_usb_audio_quirk[]) {
1583 {
1584 .ifnum = 0,
1585 .type = QUIRK_AUDIO_STANDARD_INTERFACE
1586 },
1587 {
1588 .ifnum = 1,
1589 .type = QUIRK_AUDIO_STANDARD_INTERFACE
1590 },
1591 {
1592 .ifnum = 2,
1593 .type = QUIRK_MIDI_FIXED_ENDPOINT,
1594 .data = & (const struct snd_usb_midi_endpoint_info) {
1595 .out_cables = 0x0001,
1596 .in_cables = 0x0001
1597 }
1598 },
1599 {
1600 .ifnum = -1
1601 }
1602 }
1603 }
1604},
1605{
Clemens Ladischb7f33912013-06-16 18:27:56 +02001606 /* only 44.1 kHz works at the moment */
1607 USB_DEVICE(0x0582, 0x0120),
Clemens Ladisch9d0c9192010-08-30 16:42:17 +02001608 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1609 /* .vendor_name = "Roland", */
Clemens Ladischb7f33912013-06-16 18:27:56 +02001610 /* .product_name = "OCTO-CAPTURE", */
John F Leachae7cc702011-11-28 19:41:27 -05001611 .ifnum = QUIRK_ANY_INTERFACE,
1612 .type = QUIRK_COMPOSITE,
1613 .data = (const struct snd_usb_audio_quirk[]) {
1614 {
1615 .ifnum = 0,
Clemens Ladischb7f33912013-06-16 18:27:56 +02001616 .type = QUIRK_AUDIO_FIXED_ENDPOINT,
1617 .data = & (const struct audioformat) {
1618 .formats = SNDRV_PCM_FMTBIT_S32_LE,
1619 .channels = 10,
1620 .iface = 0,
1621 .altsetting = 1,
1622 .altset_idx = 1,
1623 .endpoint = 0x05,
1624 .ep_attr = 0x05,
1625 .rates = SNDRV_PCM_RATE_44100,
1626 .rate_min = 44100,
1627 .rate_max = 44100,
1628 .nr_rates = 1,
1629 .rate_table = (unsigned int[]) { 44100 }
John F Leachae7cc702011-11-28 19:41:27 -05001630 }
1631 },
1632 {
Clemens Ladisch7b280792010-08-30 16:45:38 +02001633 .ifnum = 1,
Clemens Ladischb7f33912013-06-16 18:27:56 +02001634 .type = QUIRK_AUDIO_FIXED_ENDPOINT,
1635 .data = & (const struct audioformat) {
1636 .formats = SNDRV_PCM_FMTBIT_S32_LE,
1637 .channels = 12,
1638 .iface = 1,
1639 .altsetting = 1,
1640 .altset_idx = 1,
1641 .endpoint = 0x85,
1642 .ep_attr = 0x25,
1643 .rates = SNDRV_PCM_RATE_44100,
1644 .rate_min = 44100,
1645 .rate_max = 44100,
1646 .nr_rates = 1,
1647 .rate_table = (unsigned int[]) { 44100 }
1648 }
Clemens Ladisch7b280792010-08-30 16:45:38 +02001649 },
1650 {
1651 .ifnum = 2,
1652 .type = QUIRK_MIDI_FIXED_ENDPOINT,
1653 .data = & (const struct snd_usb_midi_endpoint_info) {
1654 .out_cables = 0x0001,
1655 .in_cables = 0x0001
1656 }
1657 },
1658 {
Clemens Ladischb7f33912013-06-16 18:27:56 +02001659 .ifnum = 3,
Kazutomo Yoshiic9c9e4e2011-08-09 23:39:13 -05001660 .type = QUIRK_IGNORE_INTERFACE
1661 },
1662 {
Clemens Ladischb7f33912013-06-16 18:27:56 +02001663 .ifnum = 4,
1664 .type = QUIRK_IGNORE_INTERFACE
Kazutomo Yoshiic9c9e4e2011-08-09 23:39:13 -05001665 },
1666 {
1667 .ifnum = -1
1668 }
1669 }
1670 }
1671},
Clemens Ladisch74953e22012-06-23 17:30:47 +02001672{
Clemens Ladischb7f33912013-06-16 18:27:56 +02001673 /* only 44.1 kHz works at the moment */
1674 USB_DEVICE(0x0582, 0x012f),
Clemens Ladisch74953e22012-06-23 17:30:47 +02001675 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Clemens Ladischb7f33912013-06-16 18:27:56 +02001676 /* .vendor_name = "Roland", */
1677 /* .product_name = "QUAD-CAPTURE", */
Clemens Ladisch74953e22012-06-23 17:30:47 +02001678 .ifnum = QUIRK_ANY_INTERFACE,
1679 .type = QUIRK_COMPOSITE,
1680 .data = (const struct snd_usb_audio_quirk[]) {
1681 {
Clemens Ladischb7f33912013-06-16 18:27:56 +02001682 .ifnum = 0,
1683 .type = QUIRK_AUDIO_FIXED_ENDPOINT,
1684 .data = & (const struct audioformat) {
1685 .formats = SNDRV_PCM_FMTBIT_S32_LE,
1686 .channels = 4,
1687 .iface = 0,
1688 .altsetting = 1,
1689 .altset_idx = 1,
1690 .endpoint = 0x05,
1691 .ep_attr = 0x05,
1692 .rates = SNDRV_PCM_RATE_44100,
1693 .rate_min = 44100,
1694 .rate_max = 44100,
1695 .nr_rates = 1,
1696 .rate_table = (unsigned int[]) { 44100 }
1697 }
1698 },
1699 {
Clemens Ladisch74953e22012-06-23 17:30:47 +02001700 .ifnum = 1,
Clemens Ladischb7f33912013-06-16 18:27:56 +02001701 .type = QUIRK_AUDIO_FIXED_ENDPOINT,
1702 .data = & (const struct audioformat) {
1703 .formats = SNDRV_PCM_FMTBIT_S32_LE,
1704 .channels = 6,
1705 .iface = 1,
1706 .altsetting = 1,
1707 .altset_idx = 1,
1708 .endpoint = 0x85,
1709 .ep_attr = 0x25,
1710 .rates = SNDRV_PCM_RATE_44100,
1711 .rate_min = 44100,
1712 .rate_max = 44100,
1713 .nr_rates = 1,
1714 .rate_table = (unsigned int[]) { 44100 }
1715 }
Clemens Ladisch74953e22012-06-23 17:30:47 +02001716 },
1717 {
1718 .ifnum = 2,
Clemens Ladisch74953e22012-06-23 17:30:47 +02001719 .type = QUIRK_MIDI_FIXED_ENDPOINT,
1720 .data = & (const struct snd_usb_midi_endpoint_info) {
1721 .out_cables = 0x0001,
1722 .in_cables = 0x0001
1723 }
1724 },
1725 {
Clemens Ladischb7f33912013-06-16 18:27:56 +02001726 .ifnum = 3,
1727 .type = QUIRK_IGNORE_INTERFACE
1728 },
1729 {
1730 .ifnum = 4,
1731 .type = QUIRK_IGNORE_INTERFACE
1732 },
1733 {
Clemens Ladisch74953e22012-06-23 17:30:47 +02001734 .ifnum = -1
1735 }
1736 }
1737 }
1738},
Daniel Mackfcdcd1d2015-03-12 09:41:32 +01001739{
1740 USB_DEVICE(0x0582, 0x0159),
1741 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1742 /* .vendor_name = "Roland", */
1743 /* .product_name = "UA-22", */
1744 .ifnum = QUIRK_ANY_INTERFACE,
1745 .type = QUIRK_COMPOSITE,
1746 .data = (const struct snd_usb_audio_quirk[]) {
1747 {
1748 .ifnum = 0,
1749 .type = QUIRK_AUDIO_STANDARD_INTERFACE
1750 },
1751 {
1752 .ifnum = 1,
1753 .type = QUIRK_AUDIO_STANDARD_INTERFACE
1754 },
1755 {
1756 .ifnum = 2,
1757 .type = QUIRK_MIDI_FIXED_ENDPOINT,
1758 .data = & (const struct snd_usb_midi_endpoint_info) {
1759 .out_cables = 0x0001,
1760 .in_cables = 0x0001
1761 }
1762 },
1763 {
1764 .ifnum = -1
1765 }
1766 }
1767 }
1768},
Clemens Ladischaafe77c2013-03-31 23:43:12 +02001769/* this catches most recent vendor-specific Roland devices */
1770{
1771 .match_flags = USB_DEVICE_ID_MATCH_VENDOR |
1772 USB_DEVICE_ID_MATCH_INT_CLASS,
1773 .idVendor = 0x0582,
1774 .bInterfaceClass = USB_CLASS_VENDOR_SPEC,
1775 .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) {
1776 .ifnum = QUIRK_ANY_INTERFACE,
1777 .type = QUIRK_AUTODETECT
1778 }
1779},
Chris Mennie62b12632008-05-19 16:21:33 +02001780
Clemens Ladischa25f1752005-10-05 13:23:19 +02001781/* Guillemot devices */
1782{
1783 /*
1784 * This is for the "Windows Edition" where the external MIDI ports are
1785 * the only MIDI ports; the control data is reported through HID
1786 * interfaces. The "Macintosh Edition" has ID 0xd002 and uses standard
1787 * compliant USB MIDI ports for external MIDI and controls.
1788 */
1789 USB_DEVICE_VENDOR_SPEC(0x06f8, 0xb000),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001790 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Clemens Ladischa25f1752005-10-05 13:23:19 +02001791 .vendor_name = "Hercules",
1792 .product_name = "DJ Console (WE)",
1793 .ifnum = 4,
1794 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001795 .data = & (const struct snd_usb_midi_endpoint_info) {
Clemens Ladischa25f1752005-10-05 13:23:19 +02001796 .out_cables = 0x0001,
1797 .in_cables = 0x0001
1798 }
1799 }
1800},
1801
Linus Torvalds1da177e2005-04-16 15:20:36 -07001802/* Midiman/M-Audio devices */
1803{
1804 USB_DEVICE_VENDOR_SPEC(0x0763, 0x1002),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001805 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001806 .vendor_name = "M-Audio",
1807 .product_name = "MidiSport 2x2",
1808 .ifnum = QUIRK_ANY_INTERFACE,
1809 .type = QUIRK_MIDI_MIDIMAN,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001810 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001811 .out_cables = 0x0003,
1812 .in_cables = 0x0003
1813 }
1814 }
1815},
1816{
1817 USB_DEVICE_VENDOR_SPEC(0x0763, 0x1011),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001818 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001819 .vendor_name = "M-Audio",
1820 .product_name = "MidiSport 1x1",
1821 .ifnum = QUIRK_ANY_INTERFACE,
1822 .type = QUIRK_MIDI_MIDIMAN,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001823 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001824 .out_cables = 0x0001,
1825 .in_cables = 0x0001
1826 }
1827 }
1828},
1829{
1830 USB_DEVICE_VENDOR_SPEC(0x0763, 0x1015),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001831 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001832 .vendor_name = "M-Audio",
1833 .product_name = "Keystation",
1834 .ifnum = QUIRK_ANY_INTERFACE,
1835 .type = QUIRK_MIDI_MIDIMAN,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001836 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001837 .out_cables = 0x0001,
1838 .in_cables = 0x0001
1839 }
1840 }
1841},
1842{
1843 USB_DEVICE_VENDOR_SPEC(0x0763, 0x1021),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001844 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001845 .vendor_name = "M-Audio",
1846 .product_name = "MidiSport 4x4",
1847 .ifnum = QUIRK_ANY_INTERFACE,
1848 .type = QUIRK_MIDI_MIDIMAN,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001849 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001850 .out_cables = 0x000f,
1851 .in_cables = 0x000f
1852 }
1853 }
1854},
1855{
1856 /*
1857 * For hardware revision 1.05; in the later revisions (1.10 and
1858 * 1.21), 0x1031 is the ID for the device without firmware.
1859 * Thanks to Olaf Giesbrecht <Olaf_Giesbrecht@yahoo.de>
1860 */
1861 USB_DEVICE_VER(0x0763, 0x1031, 0x0100, 0x0109),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001862 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001863 .vendor_name = "M-Audio",
1864 .product_name = "MidiSport 8x8",
1865 .ifnum = QUIRK_ANY_INTERFACE,
1866 .type = QUIRK_MIDI_MIDIMAN,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001867 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001868 .out_cables = 0x01ff,
1869 .in_cables = 0x01ff
1870 }
1871 }
1872},
1873{
1874 USB_DEVICE_VENDOR_SPEC(0x0763, 0x1033),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001875 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001876 .vendor_name = "M-Audio",
1877 .product_name = "MidiSport 8x8",
1878 .ifnum = QUIRK_ANY_INTERFACE,
1879 .type = QUIRK_MIDI_MIDIMAN,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001880 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001881 .out_cables = 0x01ff,
1882 .in_cables = 0x01ff
1883 }
1884 }
1885},
1886{
1887 USB_DEVICE_VENDOR_SPEC(0x0763, 0x1041),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001888 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001889 .vendor_name = "M-Audio",
1890 .product_name = "MidiSport 2x4",
1891 .ifnum = QUIRK_ANY_INTERFACE,
1892 .type = QUIRK_MIDI_MIDIMAN,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001893 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001894 .out_cables = 0x000f,
1895 .in_cables = 0x0003
1896 }
1897 }
1898},
1899{
1900 USB_DEVICE_VENDOR_SPEC(0x0763, 0x2001),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001901 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001902 .vendor_name = "M-Audio",
1903 .product_name = "Quattro",
1904 .ifnum = QUIRK_ANY_INTERFACE,
1905 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001906 .data = & (const struct snd_usb_audio_quirk[]) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001907 /*
1908 * Interfaces 0-2 are "Windows-compatible", 16-bit only,
1909 * and share endpoints with the other interfaces.
1910 * Ignore them. The other interfaces can do 24 bits,
1911 * but captured samples are big-endian (see usbaudio.c).
1912 */
1913 {
1914 .ifnum = 0,
1915 .type = QUIRK_IGNORE_INTERFACE
1916 },
1917 {
1918 .ifnum = 1,
1919 .type = QUIRK_IGNORE_INTERFACE
1920 },
1921 {
1922 .ifnum = 2,
1923 .type = QUIRK_IGNORE_INTERFACE
1924 },
1925 {
1926 .ifnum = 3,
1927 .type = QUIRK_IGNORE_INTERFACE
1928 },
1929 {
1930 .ifnum = 4,
1931 .type = QUIRK_AUDIO_STANDARD_INTERFACE
1932 },
1933 {
1934 .ifnum = 5,
1935 .type = QUIRK_AUDIO_STANDARD_INTERFACE
1936 },
1937 {
1938 .ifnum = 6,
1939 .type = QUIRK_IGNORE_INTERFACE
1940 },
1941 {
1942 .ifnum = 7,
1943 .type = QUIRK_AUDIO_STANDARD_INTERFACE
1944 },
1945 {
1946 .ifnum = 8,
1947 .type = QUIRK_AUDIO_STANDARD_INTERFACE
1948 },
1949 {
1950 .ifnum = 9,
1951 .type = QUIRK_MIDI_MIDIMAN,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001952 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001953 .out_cables = 0x0001,
1954 .in_cables = 0x0001
1955 }
1956 },
1957 {
1958 .ifnum = -1
1959 }
1960 }
1961 }
1962},
1963{
1964 USB_DEVICE_VENDOR_SPEC(0x0763, 0x2003),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001965 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001966 .vendor_name = "M-Audio",
1967 .product_name = "AudioPhile",
1968 .ifnum = 6,
1969 .type = QUIRK_MIDI_MIDIMAN,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001970 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001971 .out_cables = 0x0001,
1972 .in_cables = 0x0001
1973 }
1974 }
1975},
1976{
1977 USB_DEVICE_VENDOR_SPEC(0x0763, 0x2008),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001978 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001979 .vendor_name = "M-Audio",
1980 .product_name = "Ozone",
1981 .ifnum = 3,
1982 .type = QUIRK_MIDI_MIDIMAN,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001983 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001984 .out_cables = 0x0001,
1985 .in_cables = 0x0001
1986 }
1987 }
1988},
1989{
1990 USB_DEVICE_VENDOR_SPEC(0x0763, 0x200d),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001991 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001992 .vendor_name = "M-Audio",
1993 .product_name = "OmniStudio",
1994 .ifnum = QUIRK_ANY_INTERFACE,
1995 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001996 .data = & (const struct snd_usb_audio_quirk[]) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001997 {
1998 .ifnum = 0,
1999 .type = QUIRK_IGNORE_INTERFACE
2000 },
2001 {
2002 .ifnum = 1,
2003 .type = QUIRK_IGNORE_INTERFACE
2004 },
2005 {
2006 .ifnum = 2,
2007 .type = QUIRK_IGNORE_INTERFACE
2008 },
2009 {
2010 .ifnum = 3,
2011 .type = QUIRK_IGNORE_INTERFACE
2012 },
2013 {
2014 .ifnum = 4,
2015 .type = QUIRK_AUDIO_STANDARD_INTERFACE
2016 },
2017 {
2018 .ifnum = 5,
2019 .type = QUIRK_AUDIO_STANDARD_INTERFACE
2020 },
2021 {
2022 .ifnum = 6,
2023 .type = QUIRK_IGNORE_INTERFACE
2024 },
2025 {
2026 .ifnum = 7,
2027 .type = QUIRK_AUDIO_STANDARD_INTERFACE
2028 },
2029 {
2030 .ifnum = 8,
2031 .type = QUIRK_AUDIO_STANDARD_INTERFACE
2032 },
2033 {
2034 .ifnum = 9,
2035 .type = QUIRK_MIDI_MIDIMAN,
Takashi Iwai86e07d32005-11-17 15:08:02 +01002036 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002037 .out_cables = 0x0001,
2038 .in_cables = 0x0001
2039 }
2040 },
2041 {
2042 .ifnum = -1
2043 }
2044 }
2045 }
2046},
Clemens Ladisch2ea547dc2007-09-17 09:33:17 +02002047{
2048 USB_DEVICE(0x0763, 0x2019),
2049 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
2050 /* .vendor_name = "M-Audio", */
2051 /* .product_name = "Ozone Academic", */
2052 .ifnum = QUIRK_ANY_INTERFACE,
2053 .type = QUIRK_COMPOSITE,
2054 .data = & (const struct snd_usb_audio_quirk[]) {
2055 {
2056 .ifnum = 0,
2057 .type = QUIRK_AUDIO_STANDARD_INTERFACE
2058 },
2059 {
2060 .ifnum = 1,
2061 .type = QUIRK_AUDIO_STANDARD_INTERFACE
2062 },
2063 {
2064 .ifnum = 2,
2065 .type = QUIRK_AUDIO_STANDARD_INTERFACE
2066 },
2067 {
2068 .ifnum = 3,
2069 .type = QUIRK_MIDI_MIDIMAN,
2070 .data = & (const struct snd_usb_midi_endpoint_info) {
2071 .out_cables = 0x0001,
2072 .in_cables = 0x0001
2073 }
2074 },
2075 {
2076 .ifnum = -1
2077 }
2078 }
2079 }
2080},
Felix Homannfca5bca2010-03-25 11:29:14 +01002081{
Eldad Zack76f74bc2012-11-28 23:55:38 +01002082 USB_DEVICE_VENDOR_SPEC(0x0763, 0x2030),
2083 .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) {
2084 /* .vendor_name = "M-Audio", */
2085 /* .product_name = "Fast Track C400", */
2086 .ifnum = QUIRK_ANY_INTERFACE,
2087 .type = QUIRK_COMPOSITE,
2088 .data = &(const struct snd_usb_audio_quirk[]) {
2089 {
2090 .ifnum = 1,
2091 .type = QUIRK_AUDIO_STANDARD_MIXER,
2092 },
2093 /* Playback */
2094 {
2095 .ifnum = 2,
2096 .type = QUIRK_AUDIO_FIXED_ENDPOINT,
2097 .data = &(const struct audioformat) {
2098 .formats = SNDRV_PCM_FMTBIT_S24_3LE,
2099 .channels = 6,
2100 .iface = 2,
2101 .altsetting = 1,
2102 .altset_idx = 1,
2103 .attributes = UAC_EP_CS_ATTR_SAMPLE_RATE,
2104 .endpoint = 0x01,
2105 .ep_attr = 0x09,
2106 .rates = SNDRV_PCM_RATE_44100 |
2107 SNDRV_PCM_RATE_48000 |
2108 SNDRV_PCM_RATE_88200 |
2109 SNDRV_PCM_RATE_96000,
2110 .rate_min = 44100,
2111 .rate_max = 96000,
2112 .nr_rates = 4,
2113 .rate_table = (unsigned int[]) {
2114 44100, 48000, 88200, 96000
2115 },
Eldad Zack2aad2722013-01-13 23:02:02 +01002116 .clock = 0x80,
Eldad Zack76f74bc2012-11-28 23:55:38 +01002117 }
2118 },
2119 /* Capture */
2120 {
2121 .ifnum = 3,
2122 .type = QUIRK_AUDIO_FIXED_ENDPOINT,
2123 .data = &(const struct audioformat) {
2124 .formats = SNDRV_PCM_FMTBIT_S24_3LE,
2125 .channels = 4,
2126 .iface = 3,
2127 .altsetting = 1,
2128 .altset_idx = 1,
2129 .attributes = UAC_EP_CS_ATTR_SAMPLE_RATE,
2130 .endpoint = 0x81,
2131 .ep_attr = 0x05,
2132 .rates = SNDRV_PCM_RATE_44100 |
2133 SNDRV_PCM_RATE_48000 |
2134 SNDRV_PCM_RATE_88200 |
2135 SNDRV_PCM_RATE_96000,
2136 .rate_min = 44100,
2137 .rate_max = 96000,
2138 .nr_rates = 4,
2139 .rate_table = (unsigned int[]) {
2140 44100, 48000, 88200, 96000
2141 },
Eldad Zack2aad2722013-01-13 23:02:02 +01002142 .clock = 0x80,
Eldad Zack76f74bc2012-11-28 23:55:38 +01002143 }
2144 },
2145 /* MIDI */
2146 {
2147 .ifnum = -1 /* Interface = 4 */
2148 }
2149 }
2150 }
2151},
2152{
Matt Gruskine9a25e02013-02-09 12:56:35 -05002153 USB_DEVICE_VENDOR_SPEC(0x0763, 0x2031),
2154 .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) {
2155 /* .vendor_name = "M-Audio", */
2156 /* .product_name = "Fast Track C600", */
2157 .ifnum = QUIRK_ANY_INTERFACE,
2158 .type = QUIRK_COMPOSITE,
2159 .data = &(const struct snd_usb_audio_quirk[]) {
2160 {
2161 .ifnum = 1,
2162 .type = QUIRK_AUDIO_STANDARD_MIXER,
2163 },
2164 /* Playback */
2165 {
2166 .ifnum = 2,
2167 .type = QUIRK_AUDIO_FIXED_ENDPOINT,
2168 .data = &(const struct audioformat) {
2169 .formats = SNDRV_PCM_FMTBIT_S24_3LE,
2170 .channels = 8,
2171 .iface = 2,
2172 .altsetting = 1,
2173 .altset_idx = 1,
2174 .attributes = UAC_EP_CS_ATTR_SAMPLE_RATE,
2175 .endpoint = 0x01,
2176 .ep_attr = 0x09,
2177 .rates = SNDRV_PCM_RATE_44100 |
2178 SNDRV_PCM_RATE_48000 |
2179 SNDRV_PCM_RATE_88200 |
2180 SNDRV_PCM_RATE_96000,
2181 .rate_min = 44100,
2182 .rate_max = 96000,
2183 .nr_rates = 4,
2184 .rate_table = (unsigned int[]) {
2185 44100, 48000, 88200, 96000
2186 },
2187 .clock = 0x80,
2188 }
2189 },
2190 /* Capture */
2191 {
2192 .ifnum = 3,
2193 .type = QUIRK_AUDIO_FIXED_ENDPOINT,
2194 .data = &(const struct audioformat) {
2195 .formats = SNDRV_PCM_FMTBIT_S24_3LE,
2196 .channels = 6,
2197 .iface = 3,
2198 .altsetting = 1,
2199 .altset_idx = 1,
2200 .attributes = UAC_EP_CS_ATTR_SAMPLE_RATE,
2201 .endpoint = 0x81,
2202 .ep_attr = 0x05,
2203 .rates = SNDRV_PCM_RATE_44100 |
2204 SNDRV_PCM_RATE_48000 |
2205 SNDRV_PCM_RATE_88200 |
2206 SNDRV_PCM_RATE_96000,
2207 .rate_min = 44100,
2208 .rate_max = 96000,
2209 .nr_rates = 4,
2210 .rate_table = (unsigned int[]) {
2211 44100, 48000, 88200, 96000
2212 },
2213 .clock = 0x80,
2214 }
2215 },
2216 /* MIDI */
2217 {
2218 .ifnum = -1 /* Interface = 4 */
2219 }
2220 }
2221 }
2222},
2223{
Daniel Mackc91d9cd2011-05-18 11:28:45 +02002224 USB_DEVICE_VENDOR_SPEC(0x0763, 0x2080),
Felix Homannfca5bca2010-03-25 11:29:14 +01002225 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
2226 /* .vendor_name = "M-Audio", */
Clemens Ladisch65f04442010-09-02 12:58:25 +02002227 /* .product_name = "Fast Track Ultra", */
Felix Homannfca5bca2010-03-25 11:29:14 +01002228 .ifnum = QUIRK_ANY_INTERFACE,
2229 .type = QUIRK_COMPOSITE,
2230 .data = & (const struct snd_usb_audio_quirk[]) {
2231 {
2232 .ifnum = 0,
Daniel Mackd5a0bf62011-05-25 09:09:03 +02002233 .type = QUIRK_AUDIO_STANDARD_MIXER,
Felix Homannfca5bca2010-03-25 11:29:14 +01002234 },
2235 {
2236 .ifnum = 1,
Clemens Ladisch65f04442010-09-02 12:58:25 +02002237 .type = QUIRK_AUDIO_FIXED_ENDPOINT,
2238 .data = & (const struct audioformat) {
2239 .formats = SNDRV_PCM_FMTBIT_S24_3LE,
2240 .channels = 8,
2241 .iface = 1,
2242 .altsetting = 1,
2243 .altset_idx = 1,
2244 .attributes = UAC_EP_CS_ATTR_SAMPLE_RATE,
2245 .endpoint = 0x01,
2246 .ep_attr = 0x09,
2247 .rates = SNDRV_PCM_RATE_44100 |
2248 SNDRV_PCM_RATE_48000 |
2249 SNDRV_PCM_RATE_88200 |
2250 SNDRV_PCM_RATE_96000,
2251 .rate_min = 44100,
2252 .rate_max = 96000,
2253 .nr_rates = 4,
2254 .rate_table = (unsigned int[]) {
2255 44100, 48000, 88200, 96000
2256 }
2257 }
Felix Homannfca5bca2010-03-25 11:29:14 +01002258 },
2259 {
2260 .ifnum = 2,
Clemens Ladisch65f04442010-09-02 12:58:25 +02002261 .type = QUIRK_AUDIO_FIXED_ENDPOINT,
2262 .data = & (const struct audioformat) {
2263 .formats = SNDRV_PCM_FMTBIT_S24_3LE,
2264 .channels = 8,
2265 .iface = 2,
2266 .altsetting = 1,
2267 .altset_idx = 1,
2268 .attributes = UAC_EP_CS_ATTR_SAMPLE_RATE,
2269 .endpoint = 0x81,
2270 .ep_attr = 0x05,
2271 .rates = SNDRV_PCM_RATE_44100 |
2272 SNDRV_PCM_RATE_48000 |
2273 SNDRV_PCM_RATE_88200 |
2274 SNDRV_PCM_RATE_96000,
2275 .rate_min = 44100,
2276 .rate_max = 96000,
2277 .nr_rates = 4,
2278 .rate_table = (unsigned int[]) {
2279 44100, 48000, 88200, 96000
2280 }
2281 }
Felix Homannfca5bca2010-03-25 11:29:14 +01002282 },
2283 /* interface 3 (MIDI) is standard compliant */
2284 {
2285 .ifnum = -1
2286 }
2287 }
2288 }
2289},
2290{
Daniel Mackc91d9cd2011-05-18 11:28:45 +02002291 USB_DEVICE_VENDOR_SPEC(0x0763, 0x2081),
Felix Homannfca5bca2010-03-25 11:29:14 +01002292 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
2293 /* .vendor_name = "M-Audio", */
2294 /* .product_name = "Fast Track Ultra 8R", */
2295 .ifnum = QUIRK_ANY_INTERFACE,
2296 .type = QUIRK_COMPOSITE,
2297 .data = & (const struct snd_usb_audio_quirk[]) {
2298 {
2299 .ifnum = 0,
Daniel Mackd5a0bf62011-05-25 09:09:03 +02002300 .type = QUIRK_AUDIO_STANDARD_MIXER,
Felix Homannfca5bca2010-03-25 11:29:14 +01002301 },
2302 {
2303 .ifnum = 1,
Clemens Ladisch65f04442010-09-02 12:58:25 +02002304 .type = QUIRK_AUDIO_FIXED_ENDPOINT,
2305 .data = & (const struct audioformat) {
2306 .formats = SNDRV_PCM_FMTBIT_S24_3LE,
2307 .channels = 8,
2308 .iface = 1,
2309 .altsetting = 1,
2310 .altset_idx = 1,
2311 .attributes = UAC_EP_CS_ATTR_SAMPLE_RATE,
2312 .endpoint = 0x01,
2313 .ep_attr = 0x09,
2314 .rates = SNDRV_PCM_RATE_44100 |
2315 SNDRV_PCM_RATE_48000 |
2316 SNDRV_PCM_RATE_88200 |
2317 SNDRV_PCM_RATE_96000,
2318 .rate_min = 44100,
2319 .rate_max = 96000,
2320 .nr_rates = 4,
2321 .rate_table = (unsigned int[]) {
2322 44100, 48000, 88200, 96000
2323 }
2324 }
Felix Homannfca5bca2010-03-25 11:29:14 +01002325 },
2326 {
2327 .ifnum = 2,
Clemens Ladisch65f04442010-09-02 12:58:25 +02002328 .type = QUIRK_AUDIO_FIXED_ENDPOINT,
2329 .data = & (const struct audioformat) {
2330 .formats = SNDRV_PCM_FMTBIT_S24_3LE,
2331 .channels = 8,
2332 .iface = 2,
2333 .altsetting = 1,
2334 .altset_idx = 1,
2335 .attributes = UAC_EP_CS_ATTR_SAMPLE_RATE,
2336 .endpoint = 0x81,
2337 .ep_attr = 0x05,
2338 .rates = SNDRV_PCM_RATE_44100 |
2339 SNDRV_PCM_RATE_48000 |
2340 SNDRV_PCM_RATE_88200 |
2341 SNDRV_PCM_RATE_96000,
2342 .rate_min = 44100,
2343 .rate_max = 96000,
2344 .nr_rates = 4,
2345 .rate_table = (unsigned int[]) {
2346 44100, 48000, 88200, 96000
2347 }
2348 }
Felix Homannfca5bca2010-03-25 11:29:14 +01002349 },
2350 /* interface 3 (MIDI) is standard compliant */
2351 {
2352 .ifnum = -1
2353 }
2354 }
2355 }
2356},
Linus Torvalds1da177e2005-04-16 15:20:36 -07002357
Clemens Ladisch0243ef712006-03-09 07:55:55 +01002358/* Casio devices */
2359{
Clemens Ladisch9808dc92006-03-16 08:15:25 +01002360 USB_DEVICE(0x07cf, 0x6801),
2361 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
2362 .vendor_name = "Casio",
2363 .product_name = "PL-40R",
2364 .ifnum = 0,
2365 .type = QUIRK_MIDI_YAMAHA
2366 }
2367},
2368{
Clemens Ladisch318d27f2006-03-09 08:17:08 +01002369 /* this ID is used by several devices without a product ID */
Clemens Ladisch0243ef712006-03-09 07:55:55 +01002370 USB_DEVICE(0x07cf, 0x6802),
2371 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
2372 .vendor_name = "Casio",
Clemens Ladisch318d27f2006-03-09 08:17:08 +01002373 .product_name = "Keyboard",
Clemens Ladisch0243ef712006-03-09 07:55:55 +01002374 .ifnum = 0,
2375 .type = QUIRK_MIDI_YAMAHA
2376 }
2377},
2378
Linus Torvalds1da177e2005-04-16 15:20:36 -07002379/* Mark of the Unicorn devices */
2380{
2381 /* thanks to Robert A. Lerche <ral 'at' msbit.com> */
Clemens Ladischbbd46152005-07-04 09:21:45 +02002382 .match_flags = USB_DEVICE_ID_MATCH_VENDOR |
2383 USB_DEVICE_ID_MATCH_PRODUCT |
2384 USB_DEVICE_ID_MATCH_DEV_SUBCLASS,
2385 .idVendor = 0x07fd,
2386 .idProduct = 0x0001,
2387 .bDeviceSubClass = 2,
Takashi Iwai86e07d32005-11-17 15:08:02 +01002388 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002389 .vendor_name = "MOTU",
2390 .product_name = "Fastlane",
2391 .ifnum = QUIRK_ANY_INTERFACE,
2392 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +01002393 .data = & (const struct snd_usb_audio_quirk[]) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002394 {
2395 .ifnum = 0,
Clemens Ladischc7f57212010-10-22 18:20:48 +02002396 .type = QUIRK_MIDI_RAW_BYTES
Linus Torvalds1da177e2005-04-16 15:20:36 -07002397 },
2398 {
2399 .ifnum = 1,
2400 .type = QUIRK_IGNORE_INTERFACE
2401 },
2402 {
2403 .ifnum = -1
2404 }
2405 }
2406 }
2407},
2408
Linus Torvalds1da177e2005-04-16 15:20:36 -07002409/* Emagic devices */
2410{
2411 USB_DEVICE(0x086a, 0x0001),
Takashi Iwai86e07d32005-11-17 15:08:02 +01002412 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002413 .vendor_name = "Emagic",
Stefan Sauer861bee52019-06-10 11:51:46 +02002414 .product_name = "Unitor8",
Linus Torvalds1da177e2005-04-16 15:20:36 -07002415 .ifnum = 2,
2416 .type = QUIRK_MIDI_EMAGIC,
Takashi Iwai86e07d32005-11-17 15:08:02 +01002417 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002418 .out_cables = 0x80ff,
2419 .in_cables = 0x80ff
2420 }
2421 }
2422},
2423{
2424 USB_DEVICE(0x086a, 0x0002),
Takashi Iwai86e07d32005-11-17 15:08:02 +01002425 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002426 .vendor_name = "Emagic",
2427 /* .product_name = "AMT8", */
2428 .ifnum = 2,
2429 .type = QUIRK_MIDI_EMAGIC,
Takashi Iwai86e07d32005-11-17 15:08:02 +01002430 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002431 .out_cables = 0x80ff,
2432 .in_cables = 0x80ff
2433 }
2434 }
2435},
2436{
2437 USB_DEVICE(0x086a, 0x0003),
Takashi Iwai86e07d32005-11-17 15:08:02 +01002438 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002439 .vendor_name = "Emagic",
2440 /* .product_name = "MT4", */
2441 .ifnum = 2,
2442 .type = QUIRK_MIDI_EMAGIC,
Takashi Iwai86e07d32005-11-17 15:08:02 +01002443 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002444 .out_cables = 0x800f,
2445 .in_cables = 0x8003
2446 }
2447 }
2448},
2449
Daniel Mack56a9eb12011-05-18 11:28:42 +02002450/* KORG devices */
2451{
2452 USB_DEVICE_VENDOR_SPEC(0x0944, 0x0200),
2453 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
2454 .vendor_name = "KORG, Inc.",
2455 /* .product_name = "PANDORA PX5D", */
2456 .ifnum = 3,
2457 .type = QUIRK_MIDI_STANDARD_INTERFACE,
2458 }
2459},
2460
Sergiusz Urbaniak1bba1602011-12-05 20:27:46 +01002461{
2462 USB_DEVICE_VENDOR_SPEC(0x0944, 0x0201),
2463 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
2464 .vendor_name = "KORG, Inc.",
2465 /* .product_name = "ToneLab ST", */
2466 .ifnum = 3,
2467 .type = QUIRK_MIDI_STANDARD_INTERFACE,
2468 }
2469},
2470
Krzysztof Foltman4434ade2010-05-20 20:31:10 +01002471/* AKAI devices */
2472{
2473 USB_DEVICE(0x09e8, 0x0062),
2474 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
2475 .vendor_name = "AKAI",
2476 .product_name = "MPD16",
2477 .ifnum = 0,
2478 .type = QUIRK_MIDI_AKAI,
2479 }
2480},
2481
Paul Bonsere9f49362015-01-07 23:34:16 -06002482{
2483 /* Akai MPC Element */
2484 USB_DEVICE(0x09e8, 0x0021),
2485 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
2486 .ifnum = QUIRK_ANY_INTERFACE,
2487 .type = QUIRK_COMPOSITE,
2488 .data = & (const struct snd_usb_audio_quirk[]) {
2489 {
2490 .ifnum = 0,
2491 .type = QUIRK_IGNORE_INTERFACE
2492 },
2493 {
2494 .ifnum = 1,
2495 .type = QUIRK_MIDI_STANDARD_INTERFACE
2496 },
2497 {
2498 .ifnum = -1
2499 }
2500 }
2501 }
2502},
2503
Dominic Sacré0689a862015-06-30 17:41:33 +02002504/* Steinberg devices */
2505{
2506 /* Steinberg MI2 */
2507 USB_DEVICE_VENDOR_SPEC(0x0a4e, 0x2040),
2508 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
2509 .ifnum = QUIRK_ANY_INTERFACE,
2510 .type = QUIRK_COMPOSITE,
2511 .data = & (const struct snd_usb_audio_quirk[]) {
2512 {
2513 .ifnum = 0,
2514 .type = QUIRK_AUDIO_STANDARD_INTERFACE
2515 },
2516 {
2517 .ifnum = 1,
2518 .type = QUIRK_AUDIO_STANDARD_INTERFACE
2519 },
2520 {
2521 .ifnum = 2,
2522 .type = QUIRK_AUDIO_STANDARD_INTERFACE
2523 },
2524 {
2525 .ifnum = 3,
2526 .type = QUIRK_MIDI_FIXED_ENDPOINT,
2527 .data = &(const struct snd_usb_midi_endpoint_info) {
2528 .out_cables = 0x0001,
2529 .in_cables = 0x0001
2530 }
2531 },
2532 {
2533 .ifnum = -1
2534 }
2535 }
2536 }
2537},
2538{
2539 /* Steinberg MI4 */
2540 USB_DEVICE_VENDOR_SPEC(0x0a4e, 0x4040),
2541 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
2542 .ifnum = QUIRK_ANY_INTERFACE,
2543 .type = QUIRK_COMPOSITE,
2544 .data = & (const struct snd_usb_audio_quirk[]) {
2545 {
2546 .ifnum = 0,
2547 .type = QUIRK_AUDIO_STANDARD_INTERFACE
2548 },
2549 {
2550 .ifnum = 1,
2551 .type = QUIRK_AUDIO_STANDARD_INTERFACE
2552 },
2553 {
2554 .ifnum = 2,
2555 .type = QUIRK_AUDIO_STANDARD_INTERFACE
2556 },
2557 {
2558 .ifnum = 3,
2559 .type = QUIRK_MIDI_FIXED_ENDPOINT,
2560 .data = &(const struct snd_usb_midi_endpoint_info) {
2561 .out_cables = 0x0001,
2562 .in_cables = 0x0001
2563 }
2564 },
2565 {
2566 .ifnum = -1
2567 }
2568 }
2569 }
2570},
2571
Clemens Ladisch31ab9522005-09-26 08:55:01 +02002572/* TerraTec devices */
2573{
2574 USB_DEVICE_VENDOR_SPEC(0x0ccd, 0x0012),
Takashi Iwai86e07d32005-11-17 15:08:02 +01002575 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Clemens Ladisch31ab9522005-09-26 08:55:01 +02002576 .vendor_name = "TerraTec",
2577 .product_name = "PHASE 26",
2578 .ifnum = 3,
2579 .type = QUIRK_MIDI_STANDARD_INTERFACE
2580 }
2581},
Linus Torvalds1da177e2005-04-16 15:20:36 -07002582{
2583 USB_DEVICE_VENDOR_SPEC(0x0ccd, 0x0013),
Takashi Iwai86e07d32005-11-17 15:08:02 +01002584 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Clemens Ladisch31ab9522005-09-26 08:55:01 +02002585 .vendor_name = "TerraTec",
Linus Torvalds1da177e2005-04-16 15:20:36 -07002586 .product_name = "PHASE 26",
2587 .ifnum = 3,
2588 .type = QUIRK_MIDI_STANDARD_INTERFACE
2589 }
2590},
Clemens Ladischb2b82292006-02-08 12:38:23 +01002591{
Clemens Ladischbc56eff2006-04-13 10:16:08 +02002592 USB_DEVICE_VENDOR_SPEC(0x0ccd, 0x0014),
2593 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
2594 .vendor_name = "TerraTec",
2595 .product_name = "PHASE 26",
2596 .ifnum = 3,
2597 .type = QUIRK_MIDI_STANDARD_INTERFACE
2598 }
2599},
2600{
Andrea Borgiaca85b6b2009-06-02 19:21:17 +02002601 USB_DEVICE(0x0ccd, 0x0028),
Takashi Iwai81917432020-05-27 08:12:27 +02002602 QUIRK_RENAME_DEVICE("TerraTec", "Aureon5.1MkII")
Andrea Borgia93bfd012009-06-01 10:48:54 +02002603},
2604{
Clemens Ladischb2b82292006-02-08 12:38:23 +01002605 USB_DEVICE(0x0ccd, 0x0035),
2606 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
2607 .vendor_name = "Miditech",
2608 .product_name = "Play'n Roll",
2609 .ifnum = 0,
2610 .type = QUIRK_MIDI_CME
2611 }
2612},
Linus Torvalds1da177e2005-04-16 15:20:36 -07002613
Mark Hills0f28ecd2007-08-10 08:01:54 +02002614/* Stanton/N2IT Final Scratch v1 device ('Scratchamp') */
2615{
2616 USB_DEVICE(0x103d, 0x0100),
Takashi Iwai81917432020-05-27 08:12:27 +02002617 QUIRK_RENAME_DEVICE("Stanton", "ScratchAmp")
Mark Hills0f28ecd2007-08-10 08:01:54 +02002618},
2619{
2620 USB_DEVICE(0x103d, 0x0101),
Takashi Iwai81917432020-05-27 08:12:27 +02002621 QUIRK_RENAME_DEVICE("Stanton", "ScratchAmp")
Mark Hills0f28ecd2007-08-10 08:01:54 +02002622},
2623
Linus Torvalds1da177e2005-04-16 15:20:36 -07002624/* Novation EMS devices */
2625{
2626 USB_DEVICE_VENDOR_SPEC(0x1235, 0x0001),
Takashi Iwai86e07d32005-11-17 15:08:02 +01002627 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002628 .vendor_name = "Novation",
2629 .product_name = "ReMOTE Audio/XStation",
2630 .ifnum = 4,
2631 .type = QUIRK_MIDI_NOVATION
2632 }
2633},
2634{
2635 USB_DEVICE_VENDOR_SPEC(0x1235, 0x0002),
Takashi Iwai86e07d32005-11-17 15:08:02 +01002636 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002637 .vendor_name = "Novation",
2638 .product_name = "Speedio",
2639 .ifnum = 3,
2640 .type = QUIRK_MIDI_NOVATION
2641 }
2642},
2643{
Ricard Wanderlofdab99812015-10-16 13:38:33 +02002644 USB_DEVICE(0x1235, 0x000a),
2645 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
2646 /* .vendor_name = "Novation", */
2647 /* .product_name = "Nocturn", */
2648 .ifnum = 0,
2649 .type = QUIRK_MIDI_RAW_BYTES
2650 }
2651},
2652{
Clemens Ladischc7f57212010-10-22 18:20:48 +02002653 USB_DEVICE(0x1235, 0x000e),
2654 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
2655 /* .vendor_name = "Novation", */
2656 /* .product_name = "Launchpad", */
2657 .ifnum = 0,
2658 .type = QUIRK_MIDI_RAW_BYTES
2659 }
2660},
2661{
Daniel Mack358b7df2014-01-14 14:37:56 +01002662 USB_DEVICE(0x1235, 0x0010),
2663 .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) {
2664 .vendor_name = "Focusrite",
2665 .product_name = "Saffire 6 USB",
2666 .ifnum = QUIRK_ANY_INTERFACE,
2667 .type = QUIRK_COMPOSITE,
2668 .data = (const struct snd_usb_audio_quirk[]) {
2669 {
2670 .ifnum = 0,
2671 .type = QUIRK_AUDIO_FIXED_ENDPOINT,
2672 .data = &(const struct audioformat) {
2673 .formats = SNDRV_PCM_FMTBIT_S24_3LE,
2674 .channels = 4,
2675 .iface = 0,
2676 .altsetting = 1,
2677 .altset_idx = 1,
2678 .attributes = UAC_EP_CS_ATTR_SAMPLE_RATE,
2679 .endpoint = 0x01,
2680 .ep_attr = USB_ENDPOINT_XFER_ISOC,
2681 .rates = SNDRV_PCM_RATE_44100 |
2682 SNDRV_PCM_RATE_48000,
2683 .rate_min = 44100,
2684 .rate_max = 48000,
2685 .nr_rates = 2,
2686 .rate_table = (unsigned int[]) {
2687 44100, 48000
2688 }
2689 }
2690 },
2691 {
2692 .ifnum = 1,
2693 .type = QUIRK_MIDI_RAW_BYTES
2694 },
2695 {
2696 .ifnum = -1
2697 }
2698 }
2699 }
2700},
2701{
Mark Hills5e212332013-03-17 11:07:53 +00002702 USB_DEVICE(0x1235, 0x0018),
2703 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
2704 .vendor_name = "Novation",
2705 .product_name = "Twitch",
2706 .ifnum = QUIRK_ANY_INTERFACE,
2707 .type = QUIRK_COMPOSITE,
2708 .data = (const struct snd_usb_audio_quirk[]) {
2709 {
2710 .ifnum = 0,
2711 .type = QUIRK_AUDIO_FIXED_ENDPOINT,
2712 .data = & (const struct audioformat) {
2713 .formats = SNDRV_PCM_FMTBIT_S24_3LE,
2714 .channels = 4,
2715 .iface = 0,
2716 .altsetting = 1,
2717 .altset_idx = 1,
2718 .attributes = UAC_EP_CS_ATTR_SAMPLE_RATE,
2719 .endpoint = 0x01,
2720 .ep_attr = USB_ENDPOINT_XFER_ISOC,
2721 .rates = SNDRV_PCM_RATE_44100 |
2722 SNDRV_PCM_RATE_48000,
2723 .rate_min = 44100,
2724 .rate_max = 48000,
2725 .nr_rates = 2,
2726 .rate_table = (unsigned int[]) {
2727 44100, 48000
2728 }
2729 }
2730 },
2731 {
2732 .ifnum = 1,
2733 .type = QUIRK_MIDI_RAW_BYTES
2734 },
2735 {
2736 .ifnum = -1
2737 }
2738 }
2739 }
2740},
2741{
Linus Torvalds1da177e2005-04-16 15:20:36 -07002742 USB_DEVICE_VENDOR_SPEC(0x1235, 0x4661),
Takashi Iwai86e07d32005-11-17 15:08:02 +01002743 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002744 .vendor_name = "Novation",
2745 .product_name = "ReMOTE25",
2746 .ifnum = 0,
2747 .type = QUIRK_MIDI_NOVATION
2748 }
2749},
2750
Sebastien Alaiwand39e82d2010-02-16 08:55:08 +01002751/* Access Music devices */
2752{
2753 /* VirusTI Desktop */
2754 USB_DEVICE_VENDOR_SPEC(0x133e, 0x0815),
2755 .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) {
2756 .ifnum = QUIRK_ANY_INTERFACE,
2757 .type = QUIRK_COMPOSITE,
2758 .data = &(const struct snd_usb_audio_quirk[]) {
2759 {
2760 .ifnum = 3,
2761 .type = QUIRK_MIDI_FIXED_ENDPOINT,
2762 .data = &(const struct snd_usb_midi_endpoint_info) {
2763 .out_cables = 0x0003,
2764 .in_cables = 0x0003
2765 }
2766 },
2767 {
2768 .ifnum = 4,
2769 .type = QUIRK_IGNORE_INTERFACE
2770 },
2771 {
2772 .ifnum = -1
2773 }
2774 }
2775 }
2776},
2777
Mark Hills3a7788b2007-09-03 08:20:09 +02002778/* */
Clemens Ladisch15944802007-08-29 17:38:14 +02002779{
Mark Hills3a7788b2007-09-03 08:20:09 +02002780 /* aka. Serato Scratch Live DJ Box */
Clemens Ladisch15944802007-08-29 17:38:14 +02002781 USB_DEVICE(0x13e5, 0x0001),
Takashi Iwai81917432020-05-27 08:12:27 +02002782 QUIRK_RENAME_DEVICE("Rane", "SL-1")
Clemens Ladisch15944802007-08-29 17:38:14 +02002783},
2784
Daniel Mack54a8c502011-02-11 11:08:06 +00002785/* Native Instruments MK2 series */
2786{
Daniel Mack759e890f2011-05-18 11:28:41 +02002787 /* Komplete Audio 6 */
Daniel Mack9cdc3522011-04-11 17:56:32 +02002788 .match_flags = USB_DEVICE_ID_MATCH_DEVICE,
2789 .idVendor = 0x17cc,
2790 .idProduct = 0x1000,
2791},
2792{
Daniel Mack54a8c502011-02-11 11:08:06 +00002793 /* Traktor Audio 6 */
2794 .match_flags = USB_DEVICE_ID_MATCH_DEVICE,
2795 .idVendor = 0x17cc,
2796 .idProduct = 0x1010,
2797},
2798{
2799 /* Traktor Audio 10 */
2800 .match_flags = USB_DEVICE_ID_MATCH_DEVICE,
2801 .idVendor = 0x17cc,
2802 .idProduct = 0x1020,
2803},
2804
Clemens Ladisch1ca8b202015-11-15 22:38:29 +01002805/* QinHeng devices */
2806{
2807 USB_DEVICE(0x1a86, 0x752d),
2808 .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) {
2809 .vendor_name = "QinHeng",
2810 .product_name = "CH345",
2811 .ifnum = 1,
2812 .type = QUIRK_MIDI_CH345
2813 }
2814},
2815
Miller Puckette02651d12011-08-04 12:25:56 -07002816/* KeithMcMillen Stringport */
2817{
2818 USB_DEVICE(0x1f38, 0x0001),
2819 .bInterfaceClass = USB_CLASS_AUDIO,
2820},
2821
Clemens Ladischcc7a59b2006-02-07 17:11:06 +01002822/* Miditech devices */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002823{
Clemens Ladischf38275f2005-07-25 16:17:29 +02002824 USB_DEVICE(0x4752, 0x0011),
Takashi Iwai86e07d32005-11-17 15:08:02 +01002825 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Clemens Ladischf38275f2005-07-25 16:17:29 +02002826 .vendor_name = "Miditech",
2827 .product_name = "Midistart-2",
2828 .ifnum = 0,
Clemens Ladischcc7a59b2006-02-07 17:11:06 +01002829 .type = QUIRK_MIDI_CME
Clemens Ladischf38275f2005-07-25 16:17:29 +02002830 }
2831},
Clemens Ladischcc7a59b2006-02-07 17:11:06 +01002832
2833/* Central Music devices */
Clemens Ladischf38275f2005-07-25 16:17:29 +02002834{
Clemens Ladischcc7a59b2006-02-07 17:11:06 +01002835 /* this ID used by both Miditech MidiStudio-2 and CME UF-x */
Clemens Ladischf38275f2005-07-25 16:17:29 +02002836 USB_DEVICE(0x7104, 0x2202),
Takashi Iwai86e07d32005-11-17 15:08:02 +01002837 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Clemens Ladischf38275f2005-07-25 16:17:29 +02002838 .ifnum = 0,
Clemens Ladischcc7a59b2006-02-07 17:11:06 +01002839 .type = QUIRK_MIDI_CME
Clemens Ladischf38275f2005-07-25 16:17:29 +02002840 }
2841},
2842
Mauro Carvalho Chehab5d1f00a2014-10-30 07:53:04 -03002843/*
2844 * Auvitek au0828 devices with audio interface.
2845 * This should be kept in sync with drivers/media/usb/au0828/au0828-cards.c
2846 * Please notice that some drivers are DVB only, and don't need to be
2847 * here. That's the case, for example, of DVICO_FUSIONHDTV7.
2848 */
2849
2850#define AU0828_DEVICE(vid, pid, vname, pname) { \
Takashi Iwaibd1cd0e2018-07-25 23:00:46 +02002851 .idVendor = vid, \
2852 .idProduct = pid, \
Mauro Carvalho Chehab5d1f00a2014-10-30 07:53:04 -03002853 .match_flags = USB_DEVICE_ID_MATCH_DEVICE | \
2854 USB_DEVICE_ID_MATCH_INT_CLASS | \
2855 USB_DEVICE_ID_MATCH_INT_SUBCLASS, \
2856 .bInterfaceClass = USB_CLASS_AUDIO, \
2857 .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL, \
2858 .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { \
2859 .vendor_name = vname, \
2860 .product_name = pname, \
2861 .ifnum = QUIRK_ANY_INTERFACE, \
2862 .type = QUIRK_AUDIO_ALIGN_TRANSFER, \
Shuah Khan66354f12019-04-01 20:40:22 -04002863 .shares_media_device = 1, \
Mauro Carvalho Chehab5d1f00a2014-10-30 07:53:04 -03002864 } \
2865}
2866
2867AU0828_DEVICE(0x2040, 0x7200, "Hauppauge", "HVR-950Q"),
Mauro Carvalho Chehab678fa122014-10-30 07:53:05 -03002868AU0828_DEVICE(0x2040, 0x7240, "Hauppauge", "HVR-850"),
Mauro Carvalho Chehab5d1f00a2014-10-30 07:53:04 -03002869AU0828_DEVICE(0x2040, 0x7210, "Hauppauge", "HVR-950Q"),
2870AU0828_DEVICE(0x2040, 0x7217, "Hauppauge", "HVR-950Q"),
2871AU0828_DEVICE(0x2040, 0x721b, "Hauppauge", "HVR-950Q"),
2872AU0828_DEVICE(0x2040, 0x721e, "Hauppauge", "HVR-950Q"),
2873AU0828_DEVICE(0x2040, 0x721f, "Hauppauge", "HVR-950Q"),
Mauro Carvalho Chehab5d1f00a2014-10-30 07:53:04 -03002874AU0828_DEVICE(0x2040, 0x7280, "Hauppauge", "HVR-950Q"),
2875AU0828_DEVICE(0x0fd9, 0x0008, "Hauppauge", "HVR-950Q"),
Mauro Carvalho Chehab678fa122014-10-30 07:53:05 -03002876AU0828_DEVICE(0x2040, 0x7201, "Hauppauge", "HVR-950Q-MXL"),
2877AU0828_DEVICE(0x2040, 0x7211, "Hauppauge", "HVR-950Q-MXL"),
2878AU0828_DEVICE(0x2040, 0x7281, "Hauppauge", "HVR-950Q-MXL"),
2879AU0828_DEVICE(0x05e1, 0x0480, "Hauppauge", "Woodbury"),
2880AU0828_DEVICE(0x2040, 0x8200, "Hauppauge", "Woodbury"),
2881AU0828_DEVICE(0x2040, 0x7260, "Hauppauge", "HVR-950Q"),
2882AU0828_DEVICE(0x2040, 0x7213, "Hauppauge", "HVR-950Q"),
2883AU0828_DEVICE(0x2040, 0x7270, "Hauppauge", "HVR-950Q"),
John S. Gruber52a7a582009-12-27 12:19:59 -05002884
Marcel Haslerbdc34782016-10-27 00:42:27 +02002885/* Syntek STK1160 */
2886{
2887 .match_flags = USB_DEVICE_ID_MATCH_DEVICE |
2888 USB_DEVICE_ID_MATCH_INT_CLASS |
2889 USB_DEVICE_ID_MATCH_INT_SUBCLASS,
2890 .idVendor = 0x05e1,
2891 .idProduct = 0x0408,
2892 .bInterfaceClass = USB_CLASS_AUDIO,
2893 .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL,
2894 .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) {
2895 .vendor_name = "Syntek",
2896 .product_name = "STK1160",
2897 .ifnum = QUIRK_ANY_INTERFACE,
2898 .type = QUIRK_AUDIO_ALIGN_TRANSFER
2899 }
2900},
2901
Chris J Arges40717382010-02-17 12:12:52 -06002902/* Digidesign Mbox */
2903{
2904 /* Thanks to Clemens Ladisch <clemens@ladisch.de> */
2905 USB_DEVICE(0x0dba, 0x1000),
2906 .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) {
2907 .vendor_name = "Digidesign",
2908 .product_name = "MBox",
2909 .ifnum = QUIRK_ANY_INTERFACE,
2910 .type = QUIRK_COMPOSITE,
2911 .data = (const struct snd_usb_audio_quirk[]){
2912 {
2913 .ifnum = 0,
Damien Zammitc63fcb92014-11-12 01:09:55 +11002914 .type = QUIRK_AUDIO_STANDARD_MIXER,
Chris J Arges40717382010-02-17 12:12:52 -06002915 },
2916 {
2917 .ifnum = 1,
2918 .type = QUIRK_AUDIO_FIXED_ENDPOINT,
2919 .data = &(const struct audioformat) {
Clemens Ladisch29088fe2010-03-04 19:46:16 +01002920 .formats = SNDRV_PCM_FMTBIT_S24_3BE,
Chris J Arges40717382010-02-17 12:12:52 -06002921 .channels = 2,
2922 .iface = 1,
2923 .altsetting = 1,
2924 .altset_idx = 1,
Damien Zammitc63fcb92014-11-12 01:09:55 +11002925 .attributes = 0x4,
Chris J Arges40717382010-02-17 12:12:52 -06002926 .endpoint = 0x02,
Damien Zammitc63fcb92014-11-12 01:09:55 +11002927 .ep_attr = USB_ENDPOINT_XFER_ISOC |
2928 USB_ENDPOINT_SYNC_SYNC,
2929 .maxpacksize = 0x130,
2930 .rates = SNDRV_PCM_RATE_48000,
2931 .rate_min = 48000,
Chris J Arges40717382010-02-17 12:12:52 -06002932 .rate_max = 48000,
Damien Zammitc63fcb92014-11-12 01:09:55 +11002933 .nr_rates = 1,
Chris J Arges40717382010-02-17 12:12:52 -06002934 .rate_table = (unsigned int[]) {
Damien Zammitc63fcb92014-11-12 01:09:55 +11002935 48000
2936 }
2937 }
2938 },
2939 {
2940 .ifnum = 1,
2941 .type = QUIRK_AUDIO_FIXED_ENDPOINT,
2942 .data = &(const struct audioformat) {
2943 .formats = SNDRV_PCM_FMTBIT_S24_3BE,
2944 .channels = 2,
2945 .iface = 1,
2946 .altsetting = 1,
2947 .altset_idx = 1,
2948 .attributes = 0x4,
2949 .endpoint = 0x81,
2950 .ep_attr = USB_ENDPOINT_XFER_ISOC |
2951 USB_ENDPOINT_SYNC_ASYNC,
2952 .maxpacksize = 0x130,
2953 .rates = SNDRV_PCM_RATE_48000,
2954 .rate_min = 48000,
2955 .rate_max = 48000,
2956 .nr_rates = 1,
2957 .rate_table = (unsigned int[]) {
2958 48000
Chris J Arges40717382010-02-17 12:12:52 -06002959 }
2960 }
2961 },
2962 {
2963 .ifnum = -1
2964 }
2965 }
Chris J Arges40717382010-02-17 12:12:52 -06002966 }
2967},
Damien Zammitcb998642012-12-19 11:27:22 +01002968
2969/* DIGIDESIGN MBOX 2 */
2970{
2971 USB_DEVICE(0x0dba, 0x3000),
2972 .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) {
2973 .vendor_name = "Digidesign",
2974 .product_name = "Mbox 2",
2975 .ifnum = QUIRK_ANY_INTERFACE,
2976 .type = QUIRK_COMPOSITE,
2977 .data = (const struct snd_usb_audio_quirk[]) {
2978 {
2979 .ifnum = 0,
2980 .type = QUIRK_IGNORE_INTERFACE
2981 },
2982 {
2983 .ifnum = 1,
2984 .type = QUIRK_IGNORE_INTERFACE
2985 },
2986 {
2987 .ifnum = 2,
2988 .type = QUIRK_AUDIO_FIXED_ENDPOINT,
2989 .data = &(const struct audioformat) {
2990 .formats = SNDRV_PCM_FMTBIT_S24_3BE,
2991 .channels = 2,
2992 .iface = 2,
2993 .altsetting = 2,
2994 .altset_idx = 1,
2995 .attributes = 0x00,
2996 .endpoint = 0x03,
2997 .ep_attr = USB_ENDPOINT_SYNC_ASYNC,
Damien Zammitcb998642012-12-19 11:27:22 +01002998 .rates = SNDRV_PCM_RATE_48000,
2999 .rate_min = 48000,
3000 .rate_max = 48000,
3001 .nr_rates = 1,
3002 .rate_table = (unsigned int[]) {
3003 48000
3004 }
3005 }
3006 },
3007 {
3008 .ifnum = 3,
3009 .type = QUIRK_IGNORE_INTERFACE
3010 },
3011 {
3012 .ifnum = 4,
3013 .type = QUIRK_AUDIO_FIXED_ENDPOINT,
3014 .data = &(const struct audioformat) {
3015 .formats = SNDRV_PCM_FMTBIT_S24_3BE,
3016 .channels = 2,
3017 .iface = 4,
3018 .altsetting = 2,
3019 .altset_idx = 1,
3020 .attributes = UAC_EP_CS_ATTR_SAMPLE_RATE,
3021 .endpoint = 0x85,
3022 .ep_attr = USB_ENDPOINT_SYNC_SYNC,
Damien Zammitcb998642012-12-19 11:27:22 +01003023 .rates = SNDRV_PCM_RATE_48000,
3024 .rate_min = 48000,
3025 .rate_max = 48000,
3026 .nr_rates = 1,
3027 .rate_table = (unsigned int[]) {
3028 48000
3029 }
3030 }
3031 },
3032 {
3033 .ifnum = 5,
3034 .type = QUIRK_IGNORE_INTERFACE
3035 },
3036 {
3037 .ifnum = 6,
Damien Zammitb7b435e2013-01-04 09:51:44 +01003038 .type = QUIRK_MIDI_MIDIMAN,
Damien Zammitcb998642012-12-19 11:27:22 +01003039 .data = &(const struct snd_usb_midi_endpoint_info) {
3040 .out_ep = 0x02,
3041 .out_cables = 0x0001,
3042 .in_ep = 0x81,
3043 .in_interval = 0x01,
3044 .in_cables = 0x0001
3045 }
3046 },
3047 {
3048 .ifnum = -1
3049 }
3050 }
3051 }
3052},
Oto Petřík613769f2012-09-24 14:25:04 +02003053{
3054 /* Tascam US122 MKII - playback-only support */
3055 .match_flags = USB_DEVICE_ID_MATCH_DEVICE,
3056 .idVendor = 0x0644,
3057 .idProduct = 0x8021,
3058 .bInterfaceClass = USB_CLASS_AUDIO,
3059 .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) {
3060 .vendor_name = "TASCAM",
3061 .product_name = "US122 MKII",
3062 .ifnum = QUIRK_ANY_INTERFACE,
3063 .type = QUIRK_COMPOSITE,
3064 .data = (const struct snd_usb_audio_quirk[]) {
3065 {
3066 .ifnum = 0,
3067 .type = QUIRK_IGNORE_INTERFACE
3068 },
3069 {
3070 .ifnum = 1,
3071 .type = QUIRK_AUDIO_FIXED_ENDPOINT,
3072 .data = &(const struct audioformat) {
3073 .formats = SNDRV_PCM_FMTBIT_S24_3LE,
3074 .channels = 2,
3075 .iface = 1,
3076 .altsetting = 1,
3077 .altset_idx = 1,
3078 .attributes = UAC_EP_CS_ATTR_SAMPLE_RATE,
3079 .endpoint = 0x02,
3080 .ep_attr = USB_ENDPOINT_XFER_ISOC,
3081 .rates = SNDRV_PCM_RATE_44100 |
3082 SNDRV_PCM_RATE_48000 |
3083 SNDRV_PCM_RATE_88200 |
3084 SNDRV_PCM_RATE_96000,
3085 .rate_min = 44100,
3086 .rate_max = 96000,
3087 .nr_rates = 4,
3088 .rate_table = (unsigned int[]) {
3089 44100, 48000, 88200, 96000
3090 }
3091 }
3092 },
3093 {
3094 .ifnum = -1
3095 }
3096 }
3097 }
3098},
Chris J Arges40717382010-02-17 12:12:52 -06003099
Marko Friedemannc05fce52012-09-03 10:12:40 +02003100/* Microsoft XboxLive Headset/Xbox Communicator */
3101{
3102 USB_DEVICE(0x045e, 0x0283),
3103 .bInterfaceClass = USB_CLASS_PER_INTERFACE,
3104 .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) {
3105 .vendor_name = "Microsoft",
3106 .product_name = "XboxLive Headset/Xbox Communicator",
3107 .ifnum = QUIRK_ANY_INTERFACE,
3108 .type = QUIRK_COMPOSITE,
3109 .data = &(const struct snd_usb_audio_quirk[]) {
3110 {
3111 /* playback */
3112 .ifnum = 0,
3113 .type = QUIRK_AUDIO_FIXED_ENDPOINT,
3114 .data = &(const struct audioformat) {
3115 .formats = SNDRV_PCM_FMTBIT_S16_LE,
3116 .channels = 1,
3117 .iface = 0,
3118 .altsetting = 0,
3119 .altset_idx = 0,
3120 .attributes = 0,
3121 .endpoint = 0x04,
3122 .ep_attr = 0x05,
3123 .rates = SNDRV_PCM_RATE_CONTINUOUS,
3124 .rate_min = 22050,
3125 .rate_max = 22050
3126 }
3127 },
3128 {
3129 /* capture */
3130 .ifnum = 1,
3131 .type = QUIRK_AUDIO_FIXED_ENDPOINT,
3132 .data = &(const struct audioformat) {
3133 .formats = SNDRV_PCM_FMTBIT_S16_LE,
3134 .channels = 1,
3135 .iface = 1,
3136 .altsetting = 0,
3137 .altset_idx = 0,
3138 .attributes = 0,
3139 .endpoint = 0x85,
3140 .ep_attr = 0x05,
3141 .rates = SNDRV_PCM_RATE_CONTINUOUS,
3142 .rate_min = 16000,
3143 .rate_max = 16000
3144 }
3145 },
3146 {
3147 .ifnum = -1
3148 }
3149 }
3150 }
3151},
3152
Didier Villevaloisc9024662012-10-21 18:29:12 +02003153/* Reloop Play */
3154{
3155 USB_DEVICE(0x200c, 0x100b),
3156 .bInterfaceClass = USB_CLASS_PER_INTERFACE,
3157 .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) {
3158 .ifnum = QUIRK_ANY_INTERFACE,
3159 .type = QUIRK_COMPOSITE,
3160 .data = &(const struct snd_usb_audio_quirk[]) {
3161 {
3162 .ifnum = 0,
3163 .type = QUIRK_AUDIO_STANDARD_MIXER,
3164 },
3165 {
3166 .ifnum = 1,
3167 .type = QUIRK_AUDIO_FIXED_ENDPOINT,
3168 .data = &(const struct audioformat) {
3169 .formats = SNDRV_PCM_FMTBIT_S24_3LE,
3170 .channels = 4,
3171 .iface = 1,
3172 .altsetting = 1,
3173 .altset_idx = 1,
3174 .attributes = UAC_EP_CS_ATTR_SAMPLE_RATE,
3175 .endpoint = 0x01,
3176 .ep_attr = USB_ENDPOINT_SYNC_ADAPTIVE,
3177 .rates = SNDRV_PCM_RATE_44100 |
3178 SNDRV_PCM_RATE_48000,
3179 .rate_min = 44100,
3180 .rate_max = 48000,
3181 .nr_rates = 2,
3182 .rate_table = (unsigned int[]) {
3183 44100, 48000
3184 }
3185 }
3186 },
3187 {
3188 .ifnum = -1
3189 }
3190 }
3191 }
3192},
3193
Clemens Ladischf38275f2005-07-25 16:17:29 +02003194{
Linus Torvalds1da177e2005-04-16 15:20:36 -07003195 /*
Panu Matilainendacacb02014-11-30 18:45:40 +02003196 * ZOOM R16/24 in audio interface mode.
Ricard Wanderlofe0570442015-10-19 08:52:53 +02003197 * Playback requires an extra four byte LE length indicator
3198 * at the start of each isochronous packet. This quirk is
3199 * enabled in create_standard_audio_quirk().
Panu Matilainendacacb02014-11-30 18:45:40 +02003200 */
3201 USB_DEVICE(0x1686, 0x00dd),
3202 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
3203 .ifnum = QUIRK_ANY_INTERFACE,
3204 .type = QUIRK_COMPOSITE,
3205 .data = (const struct snd_usb_audio_quirk[]) {
3206 {
Panu Matilainendacacb02014-11-30 18:45:40 +02003207 /* Playback */
3208 .ifnum = 1,
Ricard Wanderlofe0570442015-10-19 08:52:53 +02003209 .type = QUIRK_AUDIO_STANDARD_INTERFACE,
Panu Matilainendacacb02014-11-30 18:45:40 +02003210 },
3211 {
3212 /* Capture */
3213 .ifnum = 2,
3214 .type = QUIRK_AUDIO_STANDARD_INTERFACE,
3215 },
3216 {
3217 /* Midi */
3218 .ifnum = 3,
3219 .type = QUIRK_MIDI_STANDARD_INTERFACE
3220 },
3221 {
3222 .ifnum = -1
3223 },
3224 }
3225 }
3226},
3227
3228{
3229 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -07003230 * Some USB MIDI devices don't have an audio control interface,
3231 * so we have to grab MIDI streaming interfaces here.
3232 */
3233 .match_flags = USB_DEVICE_ID_MATCH_INT_CLASS |
3234 USB_DEVICE_ID_MATCH_INT_SUBCLASS,
3235 .bInterfaceClass = USB_CLASS_AUDIO,
Daniel Mackde48c7b2010-02-22 23:49:13 +01003236 .bInterfaceSubClass = USB_SUBCLASS_MIDISTREAMING,
Takashi Iwai86e07d32005-11-17 15:08:02 +01003237 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003238 .ifnum = QUIRK_ANY_INTERFACE,
3239 .type = QUIRK_MIDI_STANDARD_INTERFACE
3240 }
3241},
3242
Przemek Rudy066624c2013-06-27 23:52:33 +02003243{
3244 /*
3245 * The original product_name is "USB Sound Device", however this name
3246 * is also used by the CM106 based cards, so make it unique.
3247 */
3248 USB_DEVICE(0x0d8c, 0x0103),
Takashi Iwai81917432020-05-27 08:12:27 +02003249 QUIRK_RENAME_DEVICE(NULL, "Audio Advantage MicroII")
Przemek Rudy066624c2013-06-27 23:52:33 +02003250},
3251
Takashi Iwai5ebf6b12018-06-11 22:34:11 +02003252/* disabled due to regression for other devices;
3253 * see https://bugzilla.kernel.org/show_bug.cgi?id=199905
3254 */
3255#if 0
Martin Peres33193dc2018-01-14 18:05:53 +02003256{
3257 /*
3258 * Nura's first gen headphones use Cambridge Silicon Radio's vendor
3259 * ID, but it looks like the product ID actually is only for Nura.
3260 * The capture interface does not work at all (even on Windows),
3261 * and only the 48 kHz sample rate works for the playback interface.
3262 */
3263 USB_DEVICE(0x0a12, 0x1243),
3264 .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) {
3265 .ifnum = QUIRK_ANY_INTERFACE,
3266 .type = QUIRK_COMPOSITE,
3267 .data = (const struct snd_usb_audio_quirk[]) {
3268 {
3269 .ifnum = 0,
3270 .type = QUIRK_AUDIO_STANDARD_MIXER,
3271 },
3272 /* Capture */
3273 {
3274 .ifnum = 1,
3275 .type = QUIRK_IGNORE_INTERFACE,
3276 },
3277 /* Playback */
3278 {
3279 .ifnum = 2,
3280 .type = QUIRK_AUDIO_FIXED_ENDPOINT,
3281 .data = &(const struct audioformat) {
3282 .formats = SNDRV_PCM_FMTBIT_S16_LE,
3283 .channels = 2,
3284 .iface = 2,
3285 .altsetting = 1,
3286 .altset_idx = 1,
3287 .attributes = UAC_EP_CS_ATTR_FILL_MAX |
3288 UAC_EP_CS_ATTR_SAMPLE_RATE,
3289 .endpoint = 0x03,
3290 .ep_attr = USB_ENDPOINT_XFER_ISOC,
3291 .rates = SNDRV_PCM_RATE_48000,
3292 .rate_min = 48000,
3293 .rate_max = 48000,
3294 .nr_rates = 1,
3295 .rate_table = (unsigned int[]) {
3296 48000
3297 }
3298 }
3299 },
Hui Pengcbb2ebf2018-12-25 18:11:52 -05003300 {
3301 .ifnum = -1
3302 },
Martin Peres33193dc2018-01-14 18:05:53 +02003303 }
3304 }
3305},
Takashi Iwai5ebf6b12018-06-11 22:34:11 +02003306#endif /* disabled */
Martin Peres33193dc2018-01-14 18:05:53 +02003307
Erik Veijola240a8af2018-02-23 14:06:52 +02003308{
3309 /*
3310 * Bower's & Wilkins PX headphones only support the 48 kHz sample rate
3311 * even though it advertises more. The capture interface doesn't work
3312 * even on windows.
3313 */
3314 USB_DEVICE(0x19b5, 0x0021),
3315 .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) {
3316 .ifnum = QUIRK_ANY_INTERFACE,
3317 .type = QUIRK_COMPOSITE,
3318 .data = (const struct snd_usb_audio_quirk[]) {
3319 {
3320 .ifnum = 0,
3321 .type = QUIRK_AUDIO_STANDARD_MIXER,
3322 },
Erik Veijola240a8af2018-02-23 14:06:52 +02003323 /* Playback */
3324 {
Nicolas Huamanc369c8d2018-10-04 16:42:05 +02003325 .ifnum = 1,
Erik Veijola240a8af2018-02-23 14:06:52 +02003326 .type = QUIRK_AUDIO_FIXED_ENDPOINT,
3327 .data = &(const struct audioformat) {
3328 .formats = SNDRV_PCM_FMTBIT_S16_LE,
3329 .channels = 2,
Nicolas Huamanc369c8d2018-10-04 16:42:05 +02003330 .iface = 1,
Erik Veijola240a8af2018-02-23 14:06:52 +02003331 .altsetting = 1,
3332 .altset_idx = 1,
3333 .attributes = UAC_EP_CS_ATTR_FILL_MAX |
3334 UAC_EP_CS_ATTR_SAMPLE_RATE,
3335 .endpoint = 0x03,
3336 .ep_attr = USB_ENDPOINT_XFER_ISOC,
3337 .rates = SNDRV_PCM_RATE_48000,
3338 .rate_min = 48000,
3339 .rate_max = 48000,
3340 .nr_rates = 1,
3341 .rate_table = (unsigned int[]) {
3342 48000
3343 }
3344 }
3345 },
Hui Pengcbb2ebf2018-12-25 18:11:52 -05003346 {
3347 .ifnum = -1
3348 },
Erik Veijola240a8af2018-02-23 14:06:52 +02003349 }
3350 }
3351},
Takashi Iwai6455abb2018-05-02 14:28:38 +02003352/* Dell WD15 Dock */
3353{
3354 USB_DEVICE(0x0bda, 0x4014),
Takashi Iwai81917432020-05-27 08:12:27 +02003355 QUIRK_DEVICE_PROFILE("Dell", "WD15 Dock", "Dell-WD15-Dock")
Takashi Iwai6455abb2018-05-02 14:28:38 +02003356},
Hui Wang8159a6a2018-11-28 17:11:26 +08003357/* Dell WD19 Dock */
3358{
3359 USB_DEVICE(0x0bda, 0x402e),
3360 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
3361 .vendor_name = "Dell",
3362 .product_name = "WD19 Dock",
3363 .profile_name = "Dell-WD15-Dock",
Hui Wang92adc962019-12-18 21:26:50 +08003364 .ifnum = QUIRK_ANY_INTERFACE,
3365 .type = QUIRK_SETUP_FMT_AFTER_RESUME
Hui Wang8159a6a2018-11-28 17:11:26 +08003366 }
3367},
Manuel Reinhardta6340902019-02-28 20:34:04 +01003368/* MOTU Microbook II */
3369{
Alexander Tsoy2edb84e2020-02-29 18:18:15 +03003370 USB_DEVICE_VENDOR_SPEC(0x07fd, 0x0004),
Manuel Reinhardta6340902019-02-28 20:34:04 +01003371 .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) {
3372 .vendor_name = "MOTU",
3373 .product_name = "MicroBookII",
3374 .ifnum = QUIRK_ANY_INTERFACE,
3375 .type = QUIRK_COMPOSITE,
3376 .data = (const struct snd_usb_audio_quirk[]) {
3377 {
3378 .ifnum = 0,
3379 .type = QUIRK_AUDIO_STANDARD_MIXER,
3380 },
3381 {
3382 .ifnum = 0,
3383 .type = QUIRK_AUDIO_FIXED_ENDPOINT,
3384 .data = &(const struct audioformat) {
3385 .formats = SNDRV_PCM_FMTBIT_S24_3BE,
3386 .channels = 6,
3387 .iface = 0,
3388 .altsetting = 1,
3389 .altset_idx = 1,
3390 .attributes = 0,
3391 .endpoint = 0x84,
3392 .rates = SNDRV_PCM_RATE_96000,
3393 .ep_attr = USB_ENDPOINT_XFER_ISOC |
3394 USB_ENDPOINT_SYNC_ASYNC,
3395 .rate_min = 96000,
3396 .rate_max = 96000,
3397 .nr_rates = 1,
3398 .maxpacksize = 0x00d8,
3399 .rate_table = (unsigned int[]) {
3400 96000
3401 }
3402 }
3403 },
3404 {
3405 .ifnum = 0,
3406 .type = QUIRK_AUDIO_FIXED_ENDPOINT,
3407 .data = &(const struct audioformat) {
3408 .formats = SNDRV_PCM_FMTBIT_S24_3BE,
3409 .channels = 8,
3410 .iface = 0,
3411 .altsetting = 1,
3412 .altset_idx = 1,
3413 .attributes = 0,
3414 .endpoint = 0x03,
3415 .rates = SNDRV_PCM_RATE_96000,
3416 .ep_attr = USB_ENDPOINT_XFER_ISOC |
3417 USB_ENDPOINT_SYNC_ASYNC,
3418 .rate_min = 96000,
3419 .rate_max = 96000,
3420 .nr_rates = 1,
3421 .maxpacksize = 0x0120,
3422 .rate_table = (unsigned int[]) {
3423 96000
3424 }
3425 }
3426 },
3427 {
3428 .ifnum = -1
3429 }
3430 }
3431 }
3432},
Ard van Breemen118b28062019-08-02 13:52:15 +02003433{
3434 /*
3435 * PIONEER DJ DDJ-SX3
3436 * PCM is 12 channels out, 10 channels in @ 44.1 fixed
3437 * interface 0, vendor class alt setting 1 for endpoints 5 and 0x86
3438 * The feedback for the output is the input.
3439 */
3440 USB_DEVICE_VENDOR_SPEC(0x2b73, 0x0023),
3441 .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) {
3442 .ifnum = QUIRK_ANY_INTERFACE,
3443 .type = QUIRK_COMPOSITE,
3444 .data = (const struct snd_usb_audio_quirk[]) {
3445 {
3446 .ifnum = 0,
3447 .type = QUIRK_AUDIO_FIXED_ENDPOINT,
3448 .data = &(const struct audioformat) {
3449 .formats = SNDRV_PCM_FMTBIT_S32_LE,
3450 .channels = 12,
3451 .iface = 0,
3452 .altsetting = 1,
3453 .altset_idx = 1,
3454 .endpoint = 0x05,
3455 .ep_attr = USB_ENDPOINT_XFER_ISOC|
3456 USB_ENDPOINT_SYNC_ASYNC,
3457 .rates = SNDRV_PCM_RATE_44100,
3458 .rate_min = 44100,
3459 .rate_max = 44100,
3460 .nr_rates = 1,
3461 .rate_table = (unsigned int[]) { 44100 }
3462 }
3463 },
3464 {
3465 .ifnum = 0,
3466 .type = QUIRK_AUDIO_FIXED_ENDPOINT,
3467 .data = &(const struct audioformat) {
3468 .formats = SNDRV_PCM_FMTBIT_S32_LE,
3469 .channels = 10,
3470 .iface = 0,
3471 .altsetting = 1,
3472 .altset_idx = 1,
3473 .endpoint = 0x86,
3474 .ep_attr = USB_ENDPOINT_XFER_ISOC|
3475 USB_ENDPOINT_SYNC_ASYNC|
3476 USB_ENDPOINT_USAGE_IMPLICIT_FB,
3477 .rates = SNDRV_PCM_RATE_44100,
3478 .rate_min = 44100,
3479 .rate_max = 44100,
3480 .nr_rates = 1,
3481 .rate_table = (unsigned int[]) { 44100 }
3482 }
3483 },
3484 {
3485 .ifnum = -1
3486 }
3487 }
3488 }
3489},
František Kučera73d8c942020-04-01 11:59:07 +02003490{
3491 /*
3492 * Pioneer DJ DJM-250MK2
3493 * PCM is 8 channels out @ 48 fixed (endpoints 0x01).
3494 * The output from computer to the mixer is usable.
3495 *
3496 * The input (phono or line to computer) is not working.
3497 * It should be at endpoint 0x82 and probably also 8 channels,
3498 * but it seems that it works only with Pioneer proprietary software.
3499 * Even on officially supported OS, the Audacity was unable to record
3500 * and Mixxx to recognize the control vinyls.
3501 */
3502 USB_DEVICE_VENDOR_SPEC(0x2b73, 0x0017),
3503 .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) {
3504 .ifnum = QUIRK_ANY_INTERFACE,
3505 .type = QUIRK_COMPOSITE,
3506 .data = (const struct snd_usb_audio_quirk[]) {
3507 {
3508 .ifnum = 0,
3509 .type = QUIRK_AUDIO_FIXED_ENDPOINT,
3510 .data = &(const struct audioformat) {
3511 .formats = SNDRV_PCM_FMTBIT_S24_3LE,
3512 .channels = 8, // outputs
3513 .iface = 0,
3514 .altsetting = 1,
3515 .altset_idx = 1,
3516 .endpoint = 0x01,
3517 .ep_attr = USB_ENDPOINT_XFER_ISOC|
3518 USB_ENDPOINT_SYNC_ASYNC,
3519 .rates = SNDRV_PCM_RATE_48000,
3520 .rate_min = 48000,
3521 .rate_max = 48000,
3522 .nr_rates = 1,
3523 .rate_table = (unsigned int[]) { 48000 }
3524 }
3525 },
3526 {
3527 .ifnum = -1
3528 }
3529 }
3530 }
3531},
Erik Veijola240a8af2018-02-23 14:06:52 +02003532
Takashi Iwaia43c1c42020-04-20 08:20:36 +02003533#define ALC1220_VB_DESKTOP(vend, prod) { \
3534 USB_DEVICE(vend, prod), \
Takashi Iwai81917432020-05-27 08:12:27 +02003535 QUIRK_DEVICE_PROFILE("Realtek", "ALC1220-VB-DT", \
3536 "Realtek-ALC1220-VB-Desktop") \
Takashi Iwaia43c1c42020-04-20 08:20:36 +02003537}
3538ALC1220_VB_DESKTOP(0x0414, 0xa002), /* Gigabyte TRX40 Aorus Pro WiFi */
3539ALC1220_VB_DESKTOP(0x0db0, 0x0d64), /* MSI TRX40 Creator */
3540ALC1220_VB_DESKTOP(0x0db0, 0x543d), /* MSI TRX40 */
Andrew Oakleyda7a8f12020-05-03 15:16:39 +01003541ALC1220_VB_DESKTOP(0x26ce, 0x0a01), /* Asrock TRX40 Creator */
Takashi Iwaia43c1c42020-04-20 08:20:36 +02003542#undef ALC1220_VB_DESKTOP
3543
Takashi Iwai7f5ad9c2020-05-26 10:28:10 +02003544/* Two entries for Gigabyte TRX40 Aorus Master:
3545 * TRX40 Aorus Master has two USB-audio devices, one for the front headphone
3546 * with ESS SABRE9218 DAC chip, while another for the rest I/O (the rear
3547 * panel and the front mic) with Realtek ALC1220-VB.
3548 * Here we provide two distinct names for making UCM profiles easier.
3549 */
3550{
3551 USB_DEVICE(0x0414, 0xa000),
Takashi Iwai81917432020-05-27 08:12:27 +02003552 QUIRK_DEVICE_PROFILE("Gigabyte", "Aorus Master Front Headphone",
3553 "Gigabyte-Aorus-Master-Front-Headphone")
Takashi Iwai7f5ad9c2020-05-26 10:28:10 +02003554},
3555{
3556 USB_DEVICE(0x0414, 0xa001),
Takashi Iwai81917432020-05-27 08:12:27 +02003557 QUIRK_DEVICE_PROFILE("Gigabyte", "Aorus Master Main Audio",
3558 "Gigabyte-Aorus-Master-Main-Audio")
Takashi Iwai7f5ad9c2020-05-26 10:28:10 +02003559},
3560
Linus Torvalds1da177e2005-04-16 15:20:36 -07003561#undef USB_DEVICE_VENDOR_SPEC