1/*
2 * ALSA USB Audio Driver
3 *
4 * Copyright (c) 2002 by Takashi Iwai <tiwai@suse.de>,
5 *                       Clemens Ladisch <clemens@ladisch.de>
6 *
7 *
8 *  This program is free software; you can redistribute it and/or modify
9 *  it under the terms of the GNU General Public License as published by
10 *  the Free Software Foundation; either version 2 of the License, or
11 *  (at your option) any later version.
12 *
13 *  This program is distributed in the hope that it will be useful,
14 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
15 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 *  GNU General Public License for more details.
17 *
18 *  You should have received a copy of the GNU General Public License
19 *  along with this program; if not, write to the Free Software
20 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
21 */
22
23/*
24 * The contents of this file are part of the driver's id_table.
25 *
26 * In a perfect world, this file would be empty.
27 */
28
29/*
30 * Use this for devices where other interfaces are standard compliant,
31 * to prevent the quirk being applied to those interfaces. (To work with
32 * hotplugging, bDeviceClass must be set to USB_CLASS_PER_INTERFACE.)
33 */
34#define USB_DEVICE_VENDOR_SPEC(vend, prod) \
35	.match_flags = USB_DEVICE_ID_MATCH_VENDOR | \
36		       USB_DEVICE_ID_MATCH_PRODUCT | \
37		       USB_DEVICE_ID_MATCH_INT_CLASS, \
38	.idVendor = vend, \
39	.idProduct = prod, \
40	.bInterfaceClass = USB_CLASS_VENDOR_SPEC
41
42/* Creative/Toshiba Multimedia Center SB-0500 */
43{
44	USB_DEVICE(0x041e, 0x3048),
45	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
46		.vendor_name = "Toshiba",
47		.product_name = "SB-0500",
48		.ifnum = QUIRK_NO_INTERFACE
49	}
50},
51
52/* Creative/E-Mu devices */
53{
54	USB_DEVICE(0x041e, 0x3010),
55	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
56		.vendor_name = "Creative Labs",
57		.product_name = "Sound Blaster MP3+",
58		.ifnum = QUIRK_NO_INTERFACE
59	}
60},
61{
62	/* E-Mu 0202 USB */
63	.match_flags = USB_DEVICE_ID_MATCH_DEVICE,
64	.idVendor = 0x041e,
65	.idProduct = 0x3f02,
66	.bInterfaceClass = USB_CLASS_AUDIO,
67},
68{
69	/* E-Mu 0404 USB */
70	.match_flags = USB_DEVICE_ID_MATCH_DEVICE,
71	.idVendor = 0x041e,
72	.idProduct = 0x3f04,
73	.bInterfaceClass = USB_CLASS_AUDIO,
74},
75{
76	/* E-Mu Tracker Pre */
77	.match_flags = USB_DEVICE_ID_MATCH_DEVICE,
78	.idVendor = 0x041e,
79	.idProduct = 0x3f0a,
80	.bInterfaceClass = USB_CLASS_AUDIO,
81},
82
83/*
84 * Logitech QuickCam: bDeviceClass is vendor-specific, so generic interface
85 * class matches do not take effect without an explicit ID match.
86 */
87{
88	.match_flags = USB_DEVICE_ID_MATCH_DEVICE |
89		       USB_DEVICE_ID_MATCH_INT_CLASS |
90		       USB_DEVICE_ID_MATCH_INT_SUBCLASS,
91	.idVendor = 0x046d,
92	.idProduct = 0x0850,
93	.bInterfaceClass = USB_CLASS_AUDIO,
94	.bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL
95},
96{
97	.match_flags = USB_DEVICE_ID_MATCH_DEVICE |
98		       USB_DEVICE_ID_MATCH_INT_CLASS |
99		       USB_DEVICE_ID_MATCH_INT_SUBCLASS,
100	.idVendor = 0x046d,
101	.idProduct = 0x08ae,
102	.bInterfaceClass = USB_CLASS_AUDIO,
103	.bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL
104},
105{
106	.match_flags = USB_DEVICE_ID_MATCH_DEVICE |
107		       USB_DEVICE_ID_MATCH_INT_CLASS |
108		       USB_DEVICE_ID_MATCH_INT_SUBCLASS,
109	.idVendor = 0x046d,
110	.idProduct = 0x08c6,
111	.bInterfaceClass = USB_CLASS_AUDIO,
112	.bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL
113},
114{
115	.match_flags = USB_DEVICE_ID_MATCH_DEVICE |
116		       USB_DEVICE_ID_MATCH_INT_CLASS |
117		       USB_DEVICE_ID_MATCH_INT_SUBCLASS,
118	.idVendor = 0x046d,
119	.idProduct = 0x08f0,
120	.bInterfaceClass = USB_CLASS_AUDIO,
121	.bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL
122},
123{
124	.match_flags = USB_DEVICE_ID_MATCH_DEVICE |
125		       USB_DEVICE_ID_MATCH_INT_CLASS |
126		       USB_DEVICE_ID_MATCH_INT_SUBCLASS,
127	.idVendor = 0x046d,
128	.idProduct = 0x08f5,
129	.bInterfaceClass = USB_CLASS_AUDIO,
130	.bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL
131},
132{
133	.match_flags = USB_DEVICE_ID_MATCH_DEVICE |
134		       USB_DEVICE_ID_MATCH_INT_CLASS |
135		       USB_DEVICE_ID_MATCH_INT_SUBCLASS,
136	.idVendor = 0x046d,
137	.idProduct = 0x08f6,
138	.bInterfaceClass = USB_CLASS_AUDIO,
139	.bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL
140},
141{
142	USB_DEVICE(0x046d, 0x0990),
143	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
144		.vendor_name = "Logitech, Inc.",
145		.product_name = "QuickCam Pro 9000",
146		.ifnum = QUIRK_NO_INTERFACE
147	}
148},
149
150/*
151 * Yamaha devices
152 */
153
154#define YAMAHA_DEVICE(id, name) { \
155	USB_DEVICE(0x0499, id), \
156	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { \
157		.vendor_name = "Yamaha", \
158		.product_name = name, \
159		.ifnum = QUIRK_ANY_INTERFACE, \
160		.type = QUIRK_MIDI_YAMAHA \
161	} \
162}
163#define YAMAHA_INTERFACE(id, intf, name) { \
164	USB_DEVICE_VENDOR_SPEC(0x0499, id), \
165	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { \
166		.vendor_name = "Yamaha", \
167		.product_name = name, \
168		.ifnum = intf, \
169		.type = QUIRK_MIDI_YAMAHA \
170	} \
171}
172YAMAHA_DEVICE(0x1000, "UX256"),
173YAMAHA_DEVICE(0x1001, "MU1000"),
174YAMAHA_DEVICE(0x1002, "MU2000"),
175YAMAHA_DEVICE(0x1003, "MU500"),
176YAMAHA_INTERFACE(0x1004, 3, "UW500"),
177YAMAHA_DEVICE(0x1005, "MOTIF6"),
178YAMAHA_DEVICE(0x1006, "MOTIF7"),
179YAMAHA_DEVICE(0x1007, "MOTIF8"),
180YAMAHA_DEVICE(0x1008, "UX96"),
181YAMAHA_DEVICE(0x1009, "UX16"),
182YAMAHA_INTERFACE(0x100a, 3, "EOS BX"),
183YAMAHA_DEVICE(0x100c, "UC-MX"),
184YAMAHA_DEVICE(0x100d, "UC-KX"),
185YAMAHA_DEVICE(0x100e, "S08"),
186YAMAHA_DEVICE(0x100f, "CLP-150"),
187YAMAHA_DEVICE(0x1010, "CLP-170"),
188YAMAHA_DEVICE(0x1011, "P-250"),
189YAMAHA_DEVICE(0x1012, "TYROS"),
190YAMAHA_DEVICE(0x1013, "PF-500"),
191YAMAHA_DEVICE(0x1014, "S90"),
192YAMAHA_DEVICE(0x1015, "MOTIF-R"),
193YAMAHA_DEVICE(0x1016, "MDP-5"),
194YAMAHA_DEVICE(0x1017, "CVP-204"),
195YAMAHA_DEVICE(0x1018, "CVP-206"),
196YAMAHA_DEVICE(0x1019, "CVP-208"),
197YAMAHA_DEVICE(0x101a, "CVP-210"),
198YAMAHA_DEVICE(0x101b, "PSR-1100"),
199YAMAHA_DEVICE(0x101c, "PSR-2100"),
200YAMAHA_DEVICE(0x101d, "CLP-175"),
201YAMAHA_DEVICE(0x101e, "PSR-K1"),
202YAMAHA_DEVICE(0x101f, "EZ-J24"),
203YAMAHA_DEVICE(0x1020, "EZ-250i"),
204YAMAHA_DEVICE(0x1021, "MOTIF ES 6"),
205YAMAHA_DEVICE(0x1022, "MOTIF ES 7"),
206YAMAHA_DEVICE(0x1023, "MOTIF ES 8"),
207YAMAHA_DEVICE(0x1024, "CVP-301"),
208YAMAHA_DEVICE(0x1025, "CVP-303"),
209YAMAHA_DEVICE(0x1026, "CVP-305"),
210YAMAHA_DEVICE(0x1027, "CVP-307"),
211YAMAHA_DEVICE(0x1028, "CVP-309"),
212YAMAHA_DEVICE(0x1029, "CVP-309GP"),
213YAMAHA_DEVICE(0x102a, "PSR-1500"),
214YAMAHA_DEVICE(0x102b, "PSR-3000"),
215YAMAHA_DEVICE(0x102e, "ELS-01/01C"),
216YAMAHA_DEVICE(0x1030, "PSR-295/293"),
217YAMAHA_DEVICE(0x1031, "DGX-205/203"),
218YAMAHA_DEVICE(0x1032, "DGX-305"),
219YAMAHA_DEVICE(0x1033, "DGX-505"),
220YAMAHA_DEVICE(0x1034, NULL),
221YAMAHA_DEVICE(0x1035, NULL),
222YAMAHA_DEVICE(0x1036, NULL),
223YAMAHA_DEVICE(0x1037, NULL),
224YAMAHA_DEVICE(0x1038, NULL),
225YAMAHA_DEVICE(0x1039, NULL),
226YAMAHA_DEVICE(0x103a, NULL),
227YAMAHA_DEVICE(0x103b, NULL),
228YAMAHA_DEVICE(0x103c, NULL),
229YAMAHA_DEVICE(0x103d, NULL),
230YAMAHA_DEVICE(0x103e, NULL),
231YAMAHA_DEVICE(0x103f, NULL),
232YAMAHA_DEVICE(0x1040, NULL),
233YAMAHA_DEVICE(0x1041, NULL),
234YAMAHA_DEVICE(0x1042, NULL),
235YAMAHA_DEVICE(0x1043, NULL),
236YAMAHA_DEVICE(0x1044, NULL),
237YAMAHA_DEVICE(0x1045, NULL),
238YAMAHA_INTERFACE(0x104e, 0, NULL),
239YAMAHA_DEVICE(0x104f, NULL),
240YAMAHA_DEVICE(0x1050, NULL),
241YAMAHA_DEVICE(0x1051, NULL),
242YAMAHA_DEVICE(0x1052, NULL),
243YAMAHA_DEVICE(0x2000, "DGP-7"),
244YAMAHA_DEVICE(0x2001, "DGP-5"),
245YAMAHA_DEVICE(0x2002, NULL),
246YAMAHA_DEVICE(0x5000, "CS1D"),
247YAMAHA_DEVICE(0x5001, "DSP1D"),
248YAMAHA_DEVICE(0x5002, "DME32"),
249YAMAHA_DEVICE(0x5003, "DM2000"),
250YAMAHA_DEVICE(0x5004, "02R96"),
251YAMAHA_DEVICE(0x5005, "ACU16-C"),
252YAMAHA_DEVICE(0x5006, "NHB32-C"),
253YAMAHA_DEVICE(0x5007, "DM1000"),
254YAMAHA_DEVICE(0x5008, "01V96"),
255YAMAHA_DEVICE(0x5009, "SPX2000"),
256YAMAHA_DEVICE(0x500a, "PM5D"),
257YAMAHA_DEVICE(0x500b, "DME64N"),
258YAMAHA_DEVICE(0x500c, "DME24N"),
259YAMAHA_DEVICE(0x500d, NULL),
260YAMAHA_DEVICE(0x500e, NULL),
261YAMAHA_DEVICE(0x500f, NULL),
262YAMAHA_DEVICE(0x7000, "DTX"),
263YAMAHA_DEVICE(0x7010, "UB99"),
264#undef YAMAHA_DEVICE
265#undef YAMAHA_INTERFACE
266
267/*
268 * Roland/RolandED/Edirol/BOSS devices
269 */
270{
271	USB_DEVICE(0x0582, 0x0000),
272	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
273		.vendor_name = "Roland",
274		.product_name = "UA-100",
275		.ifnum = QUIRK_ANY_INTERFACE,
276		.type = QUIRK_COMPOSITE,
277		.data = (const struct snd_usb_audio_quirk[]) {
278			{
279				.ifnum = 0,
280				.type = QUIRK_AUDIO_FIXED_ENDPOINT,
281				.data = & (const struct audioformat) {
282					.formats = SNDRV_PCM_FMTBIT_S16_LE,
283					.channels = 4,
284					.iface = 0,
285					.altsetting = 1,
286					.altset_idx = 1,
287					.attributes = 0,
288					.endpoint = 0x01,
289					.ep_attr = 0x09,
290					.rates = SNDRV_PCM_RATE_CONTINUOUS,
291					.rate_min = 44100,
292					.rate_max = 44100,
293				}
294			},
295			{
296				.ifnum = 1,
297				.type = QUIRK_AUDIO_FIXED_ENDPOINT,
298				.data = & (const struct audioformat) {
299					.formats = SNDRV_PCM_FMTBIT_S16_LE,
300					.channels = 2,
301					.iface = 1,
302					.altsetting = 1,
303					.altset_idx = 1,
304					.attributes = UAC_EP_CS_ATTR_FILL_MAX,
305					.endpoint = 0x81,
306					.ep_attr = 0x05,
307					.rates = SNDRV_PCM_RATE_CONTINUOUS,
308					.rate_min = 44100,
309					.rate_max = 44100,
310				}
311			},
312			{
313				.ifnum = 2,
314				.type = QUIRK_MIDI_FIXED_ENDPOINT,
315				.data = & (const struct snd_usb_midi_endpoint_info) {
316					.out_cables = 0x0007,
317					.in_cables  = 0x0007
318				}
319			},
320			{
321				.ifnum = -1
322			}
323		}
324	}
325},
326{
327	USB_DEVICE(0x0582, 0x0002),
328	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
329		.vendor_name = "EDIROL",
330		.product_name = "UM-4",
331		.ifnum = QUIRK_ANY_INTERFACE,
332		.type = QUIRK_COMPOSITE,
333		.data = (const struct snd_usb_audio_quirk[]) {
334			{
335				.ifnum = 0,
336				.type = QUIRK_IGNORE_INTERFACE
337			},
338			{
339				.ifnum = 1,
340				.type = QUIRK_IGNORE_INTERFACE
341			},
342			{
343				.ifnum = 2,
344				.type = QUIRK_MIDI_FIXED_ENDPOINT,
345				.data = & (const struct snd_usb_midi_endpoint_info) {
346					.out_cables = 0x000f,
347					.in_cables  = 0x000f
348				}
349			},
350			{
351				.ifnum = -1
352			}
353		}
354	}
355},
356{
357	USB_DEVICE(0x0582, 0x0003),
358	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
359		.vendor_name = "Roland",
360		.product_name = "SC-8850",
361		.ifnum = QUIRK_ANY_INTERFACE,
362		.type = QUIRK_COMPOSITE,
363		.data = (const struct snd_usb_audio_quirk[]) {
364			{
365				.ifnum = 0,
366				.type = QUIRK_IGNORE_INTERFACE
367			},
368			{
369				.ifnum = 1,
370				.type = QUIRK_IGNORE_INTERFACE
371			},
372			{
373				.ifnum = 2,
374				.type = QUIRK_MIDI_FIXED_ENDPOINT,
375				.data = & (const struct snd_usb_midi_endpoint_info) {
376					.out_cables = 0x003f,
377					.in_cables  = 0x003f
378				}
379			},
380			{
381				.ifnum = -1
382			}
383		}
384	}
385},
386{
387	USB_DEVICE(0x0582, 0x0004),
388	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
389		.vendor_name = "Roland",
390		.product_name = "U-8",
391		.ifnum = QUIRK_ANY_INTERFACE,
392		.type = QUIRK_COMPOSITE,
393		.data = (const struct snd_usb_audio_quirk[]) {
394			{
395				.ifnum = 0,
396				.type = QUIRK_IGNORE_INTERFACE
397			},
398			{
399				.ifnum = 1,
400				.type = QUIRK_IGNORE_INTERFACE
401			},
402			{
403				.ifnum = 2,
404				.type = QUIRK_MIDI_FIXED_ENDPOINT,
405				.data = & (const struct snd_usb_midi_endpoint_info) {
406					.out_cables = 0x0005,
407					.in_cables  = 0x0005
408				}
409			},
410			{
411				.ifnum = -1
412			}
413		}
414	}
415},
416{
417	/* Has ID 0x0099 when not in "Advanced Driver" mode.
418	 * The UM-2EX has only one input, but we cannot detect this. */
419	USB_DEVICE(0x0582, 0x0005),
420	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
421		.vendor_name = "EDIROL",
422		.product_name = "UM-2",
423		.ifnum = QUIRK_ANY_INTERFACE,
424		.type = QUIRK_COMPOSITE,
425		.data = (const struct snd_usb_audio_quirk[]) {
426			{
427				.ifnum = 0,
428				.type = QUIRK_IGNORE_INTERFACE
429			},
430			{
431				.ifnum = 1,
432				.type = QUIRK_IGNORE_INTERFACE
433			},
434			{
435				.ifnum = 2,
436				.type = QUIRK_MIDI_FIXED_ENDPOINT,
437				.data = & (const struct snd_usb_midi_endpoint_info) {
438					.out_cables = 0x0003,
439					.in_cables  = 0x0003
440				}
441			},
442			{
443				.ifnum = -1
444			}
445		}
446	}
447},
448{
449	USB_DEVICE(0x0582, 0x0007),
450	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
451		.vendor_name = "Roland",
452		.product_name = "SC-8820",
453		.ifnum = QUIRK_ANY_INTERFACE,
454		.type = QUIRK_COMPOSITE,
455		.data = (const struct snd_usb_audio_quirk[]) {
456			{
457				.ifnum = 0,
458				.type = QUIRK_IGNORE_INTERFACE
459			},
460			{
461				.ifnum = 1,
462				.type = QUIRK_IGNORE_INTERFACE
463			},
464			{
465				.ifnum = 2,
466				.type = QUIRK_MIDI_FIXED_ENDPOINT,
467				.data = & (const struct snd_usb_midi_endpoint_info) {
468					.out_cables = 0x0013,
469					.in_cables  = 0x0013
470				}
471			},
472			{
473				.ifnum = -1
474			}
475		}
476	}
477},
478{
479	USB_DEVICE(0x0582, 0x0008),
480	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
481		.vendor_name = "Roland",
482		.product_name = "PC-300",
483		.ifnum = QUIRK_ANY_INTERFACE,
484		.type = QUIRK_COMPOSITE,
485		.data = (const struct snd_usb_audio_quirk[]) {
486			{
487				.ifnum = 0,
488				.type = QUIRK_IGNORE_INTERFACE
489			},
490			{
491				.ifnum = 1,
492				.type = QUIRK_IGNORE_INTERFACE
493			},
494			{
495				.ifnum = 2,
496				.type = QUIRK_MIDI_FIXED_ENDPOINT,
497				.data = & (const struct snd_usb_midi_endpoint_info) {
498					.out_cables = 0x0001,
499					.in_cables  = 0x0001
500				}
501			},
502			{
503				.ifnum = -1
504			}
505		}
506	}
507},
508{
509	/* has ID 0x009d when not in "Advanced Driver" mode */
510	USB_DEVICE(0x0582, 0x0009),
511	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
512		.vendor_name = "EDIROL",
513		.product_name = "UM-1",
514		.ifnum = QUIRK_ANY_INTERFACE,
515		.type = QUIRK_COMPOSITE,
516		.data = (const struct snd_usb_audio_quirk[]) {
517			{
518				.ifnum = 0,
519				.type = QUIRK_IGNORE_INTERFACE
520			},
521			{
522				.ifnum = 1,
523				.type = QUIRK_IGNORE_INTERFACE
524			},
525			{
526				.ifnum = 2,
527				.type = QUIRK_MIDI_FIXED_ENDPOINT,
528				.data = & (const struct snd_usb_midi_endpoint_info) {
529					.out_cables = 0x0001,
530					.in_cables  = 0x0001
531				}
532			},
533			{
534				.ifnum = -1
535			}
536		}
537	}
538},
539{
540	USB_DEVICE(0x0582, 0x000b),
541	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
542		.vendor_name = "Roland",
543		.product_name = "SK-500",
544		.ifnum = QUIRK_ANY_INTERFACE,
545		.type = QUIRK_COMPOSITE,
546		.data = (const struct snd_usb_audio_quirk[]) {
547			{
548				.ifnum = 0,
549				.type = QUIRK_IGNORE_INTERFACE
550			},
551			{
552				.ifnum = 1,
553				.type = QUIRK_IGNORE_INTERFACE
554			},
555			{
556				.ifnum = 2,
557				.type = QUIRK_MIDI_FIXED_ENDPOINT,
558				.data = & (const struct snd_usb_midi_endpoint_info) {
559					.out_cables = 0x0013,
560					.in_cables  = 0x0013
561				}
562			},
563			{
564				.ifnum = -1
565			}
566		}
567	}
568},
569{
570	/* thanks to Emiliano Grilli <emillo@libero.it>
571	 * for helping researching this data */
572	USB_DEVICE(0x0582, 0x000c),
573	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
574		.vendor_name = "Roland",
575		.product_name = "SC-D70",
576		.ifnum = QUIRK_ANY_INTERFACE,
577		.type = QUIRK_COMPOSITE,
578		.data = (const struct snd_usb_audio_quirk[]) {
579			{
580				.ifnum = 0,
581				.type = QUIRK_AUDIO_FIXED_ENDPOINT,
582				.data = & (const struct audioformat) {
583					.formats = SNDRV_PCM_FMTBIT_S24_3LE,
584					.channels = 2,
585					.iface = 0,
586					.altsetting = 1,
587					.altset_idx = 1,
588					.attributes = 0,
589					.endpoint = 0x01,
590					.ep_attr = 0x01,
591					.rates = SNDRV_PCM_RATE_CONTINUOUS,
592					.rate_min = 44100,
593					.rate_max = 44100,
594				}
595			},
596			{
597				.ifnum = 1,
598				.type = QUIRK_AUDIO_FIXED_ENDPOINT,
599				.data = & (const struct audioformat) {
600					.formats = SNDRV_PCM_FMTBIT_S24_3LE,
601					.channels = 2,
602					.iface = 1,
603					.altsetting = 1,
604					.altset_idx = 1,
605					.attributes = 0,
606					.endpoint = 0x81,
607					.ep_attr = 0x01,
608					.rates = SNDRV_PCM_RATE_CONTINUOUS,
609					.rate_min = 44100,
610					.rate_max = 44100,
611				}
612			},
613			{
614				.ifnum = 2,
615				.type = QUIRK_MIDI_FIXED_ENDPOINT,
616				.data = & (const struct snd_usb_midi_endpoint_info) {
617					.out_cables = 0x0007,
618					.in_cables  = 0x0007
619				}
620			},
621			{
622				.ifnum = -1
623			}
624		}
625	}
626},
627{	/*
628	 * This quirk is for the "Advanced Driver" mode of the Edirol UA-5.
629	 * If the advanced mode switch at the back of the unit is off, the
630	 * UA-5 has ID 0x0582/0x0011 and is standard compliant (no quirks),
631	 * but offers only 16-bit PCM.
632	 * In advanced mode, the UA-5 will output S24_3LE samples (two
633	 * channels) at the rate indicated on the front switch, including
634	 * the 96kHz sample rate.
635	 */
636	USB_DEVICE(0x0582, 0x0010),
637	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
638		.vendor_name = "EDIROL",
639		.product_name = "UA-5",
640		.ifnum = QUIRK_ANY_INTERFACE,
641		.type = QUIRK_COMPOSITE,
642		.data = (const struct snd_usb_audio_quirk[]) {
643			{
644				.ifnum = 1,
645				.type = QUIRK_AUDIO_STANDARD_INTERFACE
646			},
647			{
648				.ifnum = 2,
649				.type = QUIRK_AUDIO_STANDARD_INTERFACE
650			},
651			{
652				.ifnum = -1
653			}
654		}
655	}
656},
657{
658	/* has ID 0x0013 when not in "Advanced Driver" mode */
659	USB_DEVICE(0x0582, 0x0012),
660	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
661		.vendor_name = "Roland",
662		.product_name = "XV-5050",
663		.ifnum = 0,
664		.type = QUIRK_MIDI_FIXED_ENDPOINT,
665		.data = & (const struct snd_usb_midi_endpoint_info) {
666			.out_cables = 0x0001,
667			.in_cables  = 0x0001
668		}
669	}
670},
671{
672	/* has ID 0x0015 when not in "Advanced Driver" mode */
673	USB_DEVICE(0x0582, 0x0014),
674	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
675		.vendor_name = "EDIROL",
676		.product_name = "UM-880",
677		.ifnum = 0,
678		.type = QUIRK_MIDI_FIXED_ENDPOINT,
679		.data = & (const struct snd_usb_midi_endpoint_info) {
680			.out_cables = 0x01ff,
681			.in_cables  = 0x01ff
682		}
683	}
684},
685{
686	/* has ID 0x0017 when not in "Advanced Driver" mode */
687	USB_DEVICE(0x0582, 0x0016),
688	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
689		.vendor_name = "EDIROL",
690		.product_name = "SD-90",
691		.ifnum = QUIRK_ANY_INTERFACE,
692		.type = QUIRK_COMPOSITE,
693		.data = (const struct snd_usb_audio_quirk[]) {
694			{
695				.ifnum = 0,
696				.type = QUIRK_IGNORE_INTERFACE
697			},
698			{
699				.ifnum = 1,
700				.type = QUIRK_IGNORE_INTERFACE
701			},
702			{
703				.ifnum = 2,
704				.type = QUIRK_MIDI_FIXED_ENDPOINT,
705				.data = & (const struct snd_usb_midi_endpoint_info) {
706					.out_cables = 0x000f,
707					.in_cables  = 0x000f
708				}
709			},
710			{
711				.ifnum = -1
712			}
713		}
714	}
715},
716{
717	/* has ID 0x001c when not in "Advanced Driver" mode */
718	USB_DEVICE(0x0582, 0x001b),
719	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
720		.vendor_name = "Roland",
721		.product_name = "MMP-2",
722		.ifnum = QUIRK_ANY_INTERFACE,
723		.type = QUIRK_COMPOSITE,
724		.data = (const struct snd_usb_audio_quirk[]) {
725			{
726				.ifnum = 0,
727				.type = QUIRK_IGNORE_INTERFACE
728			},
729			{
730				.ifnum = 1,
731				.type = QUIRK_IGNORE_INTERFACE
732			},
733			{
734				.ifnum = 2,
735				.type = QUIRK_MIDI_FIXED_ENDPOINT,
736				.data = & (const struct snd_usb_midi_endpoint_info) {
737					.out_cables = 0x0001,
738					.in_cables  = 0x0001
739				}
740			},
741			{
742				.ifnum = -1
743			}
744		}
745	}
746},
747{
748	/* has ID 0x001e when not in "Advanced Driver" mode */
749	USB_DEVICE(0x0582, 0x001d),
750	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
751		.vendor_name = "Roland",
752		.product_name = "V-SYNTH",
753		.ifnum = 0,
754		.type = QUIRK_MIDI_FIXED_ENDPOINT,
755		.data = & (const struct snd_usb_midi_endpoint_info) {
756			.out_cables = 0x0001,
757			.in_cables  = 0x0001
758		}
759	}
760},
761{
762	/* has ID 0x0024 when not in "Advanced Driver" mode */
763	USB_DEVICE(0x0582, 0x0023),
764	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
765		.vendor_name = "EDIROL",
766		.product_name = "UM-550",
767		.ifnum = 0,
768		.type = QUIRK_MIDI_FIXED_ENDPOINT,
769		.data = & (const struct snd_usb_midi_endpoint_info) {
770			.out_cables = 0x003f,
771			.in_cables  = 0x003f
772		}
773	}
774},
775{
776	/*
777	 * This quirk is for the "Advanced Driver" mode. If off, the UA-20
778	 * has ID 0x0026 and is standard compliant, but has only 16-bit PCM
779	 * and no MIDI.
780	 */
781	USB_DEVICE(0x0582, 0x0025),
782	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
783		.vendor_name = "EDIROL",
784		.product_name = "UA-20",
785		.ifnum = QUIRK_ANY_INTERFACE,
786		.type = QUIRK_COMPOSITE,
787		.data = (const struct snd_usb_audio_quirk[]) {
788			{
789				.ifnum = 0,
790				.type = QUIRK_IGNORE_INTERFACE
791			},
792			{
793				.ifnum = 1,
794				.type = QUIRK_AUDIO_FIXED_ENDPOINT,
795				.data = & (const struct audioformat) {
796					.formats = SNDRV_PCM_FMTBIT_S24_3LE,
797					.channels = 2,
798					.iface = 1,
799					.altsetting = 1,
800					.altset_idx = 1,
801					.attributes = 0,
802					.endpoint = 0x01,
803					.ep_attr = 0x01,
804					.rates = SNDRV_PCM_RATE_CONTINUOUS,
805					.rate_min = 44100,
806					.rate_max = 44100,
807				}
808			},
809			{
810				.ifnum = 2,
811				.type = QUIRK_AUDIO_FIXED_ENDPOINT,
812				.data = & (const struct audioformat) {
813					.formats = SNDRV_PCM_FMTBIT_S24_3LE,
814					.channels = 2,
815					.iface = 2,
816					.altsetting = 1,
817					.altset_idx = 1,
818					.attributes = 0,
819					.endpoint = 0x82,
820					.ep_attr = 0x01,
821					.rates = SNDRV_PCM_RATE_CONTINUOUS,
822					.rate_min = 44100,
823					.rate_max = 44100,
824				}
825			},
826			{
827				.ifnum = 3,
828				.type = QUIRK_MIDI_FIXED_ENDPOINT,
829				.data = & (const struct snd_usb_midi_endpoint_info) {
830					.out_cables = 0x0001,
831					.in_cables  = 0x0001
832				}
833			},
834			{
835				.ifnum = -1
836			}
837		}
838	}
839},
840{
841	/* has ID 0x0028 when not in "Advanced Driver" mode */
842	USB_DEVICE(0x0582, 0x0027),
843	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
844		.vendor_name = "EDIROL",
845		.product_name = "SD-20",
846		.ifnum = 0,
847		.type = QUIRK_MIDI_FIXED_ENDPOINT,
848		.data = & (const struct snd_usb_midi_endpoint_info) {
849			.out_cables = 0x0003,
850			.in_cables  = 0x0007
851		}
852	}
853},
854{
855	/* has ID 0x002a when not in "Advanced Driver" mode */
856	USB_DEVICE(0x0582, 0x0029),
857	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
858		.vendor_name = "EDIROL",
859		.product_name = "SD-80",
860		.ifnum = 0,
861		.type = QUIRK_MIDI_FIXED_ENDPOINT,
862		.data = & (const struct snd_usb_midi_endpoint_info) {
863			.out_cables = 0x000f,
864			.in_cables  = 0x000f
865		}
866	}
867},
868{	/*
869	 * This quirk is for the "Advanced" modes of the Edirol UA-700.
870	 * If the sample format switch is not in an advanced setting, the
871	 * UA-700 has ID 0x0582/0x002c and is standard compliant (no quirks),
872	 * but offers only 16-bit PCM and no MIDI.
873	 */
874	USB_DEVICE_VENDOR_SPEC(0x0582, 0x002b),
875	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
876		.vendor_name = "EDIROL",
877		.product_name = "UA-700",
878		.ifnum = QUIRK_ANY_INTERFACE,
879		.type = QUIRK_COMPOSITE,
880		.data = (const struct snd_usb_audio_quirk[]) {
881			{
882				.ifnum = 1,
883				.type = QUIRK_AUDIO_EDIROL_UAXX
884			},
885			{
886				.ifnum = 2,
887				.type = QUIRK_AUDIO_EDIROL_UAXX
888			},
889			{
890				.ifnum = 3,
891				.type = QUIRK_AUDIO_EDIROL_UAXX
892			},
893			{
894				.ifnum = -1
895			}
896		}
897	}
898},
899{
900	/* has ID 0x002e when not in "Advanced Driver" mode */
901	USB_DEVICE(0x0582, 0x002d),
902	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
903		.vendor_name = "Roland",
904		.product_name = "XV-2020",
905		.ifnum = 0,
906		.type = QUIRK_MIDI_FIXED_ENDPOINT,
907		.data = & (const struct snd_usb_midi_endpoint_info) {
908			.out_cables = 0x0001,
909			.in_cables  = 0x0001
910		}
911	}
912},
913{
914	/* has ID 0x0030 when not in "Advanced Driver" mode */
915	USB_DEVICE(0x0582, 0x002f),
916	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
917		.vendor_name = "Roland",
918		.product_name = "VariOS",
919		.ifnum = 0,
920		.type = QUIRK_MIDI_FIXED_ENDPOINT,
921		.data = & (const struct snd_usb_midi_endpoint_info) {
922			.out_cables = 0x0007,
923			.in_cables  = 0x0007
924		}
925	}
926},
927{
928	/* has ID 0x0034 when not in "Advanced Driver" mode */
929	USB_DEVICE(0x0582, 0x0033),
930	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
931		.vendor_name = "EDIROL",
932		.product_name = "PCR",
933		.ifnum = 0,
934		.type = QUIRK_MIDI_FIXED_ENDPOINT,
935		.data = & (const struct snd_usb_midi_endpoint_info) {
936			.out_cables = 0x0003,
937			.in_cables  = 0x0007
938		}
939	}
940},
941	/* TODO: add Roland M-1000 support */
942{
943	/*
944	 * Has ID 0x0038 when not in "Advanced Driver" mode;
945	 * later revisions use IDs 0x0054 and 0x00a2.
946	 */
947	USB_DEVICE(0x0582, 0x0037),
948	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
949		.vendor_name = "Roland",
950		.product_name = "Digital Piano",
951		.ifnum = 0,
952		.type = QUIRK_MIDI_FIXED_ENDPOINT,
953		.data = & (const struct snd_usb_midi_endpoint_info) {
954			.out_cables = 0x0001,
955			.in_cables  = 0x0001
956		}
957	}
958},
959{
960	/*
961	 * This quirk is for the "Advanced Driver" mode.  If off, the GS-10
962	 * has ID 0x003c and is standard compliant, but has only 16-bit PCM
963	 * and no MIDI.
964	 */
965	USB_DEVICE_VENDOR_SPEC(0x0582, 0x003b),
966	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
967		.vendor_name = "BOSS",
968		.product_name = "GS-10",
969		.ifnum = QUIRK_ANY_INTERFACE,
970		.type = QUIRK_COMPOSITE,
971		.data = & (const struct snd_usb_audio_quirk[]) {
972			{
973				.ifnum = 1,
974				.type = QUIRK_AUDIO_STANDARD_INTERFACE
975			},
976			{
977				.ifnum = 2,
978				.type = QUIRK_AUDIO_STANDARD_INTERFACE
979			},
980			{
981				.ifnum = 3,
982				.type = QUIRK_MIDI_STANDARD_INTERFACE
983			},
984			{
985				.ifnum = -1
986			}
987		}
988	}
989},
990{
991	/* has ID 0x0041 when not in "Advanced Driver" mode */
992	USB_DEVICE(0x0582, 0x0040),
993	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
994		.vendor_name = "Roland",
995		.product_name = "GI-20",
996		.ifnum = 0,
997		.type = QUIRK_MIDI_FIXED_ENDPOINT,
998		.data = & (const struct snd_usb_midi_endpoint_info) {
999			.out_cables = 0x0001,
1000			.in_cables  = 0x0001
1001		}
1002	}
1003},
1004{
1005	/* has ID 0x0043 when not in "Advanced Driver" mode */
1006	USB_DEVICE(0x0582, 0x0042),
1007	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1008		.vendor_name = "Roland",
1009		.product_name = "RS-70",
1010		.ifnum = 0,
1011		.type = QUIRK_MIDI_FIXED_ENDPOINT,
1012		.data = & (const struct snd_usb_midi_endpoint_info) {
1013			.out_cables = 0x0001,
1014			.in_cables  = 0x0001
1015		}
1016	}
1017},
1018{
1019	/* has ID 0x0049 when not in "Advanced Driver" mode */
1020	USB_DEVICE(0x0582, 0x0047),
1021	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1022		/* .vendor_name = "EDIROL", */
1023		/* .product_name = "UR-80", */
1024		.ifnum = QUIRK_ANY_INTERFACE,
1025		.type = QUIRK_COMPOSITE,
1026		.data = (const struct snd_usb_audio_quirk[]) {
1027			/* in the 96 kHz modes, only interface 1 is there */
1028			{
1029				.ifnum = 1,
1030				.type = QUIRK_AUDIO_STANDARD_INTERFACE
1031			},
1032			{
1033				.ifnum = 2,
1034				.type = QUIRK_AUDIO_STANDARD_INTERFACE
1035			},
1036			{
1037				.ifnum = -1
1038			}
1039		}
1040	}
1041},
1042{
1043	/* has ID 0x004a when not in "Advanced Driver" mode */
1044	USB_DEVICE(0x0582, 0x0048),
1045	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1046		/* .vendor_name = "EDIROL", */
1047		/* .product_name = "UR-80", */
1048		.ifnum = 0,
1049		.type = QUIRK_MIDI_FIXED_ENDPOINT,
1050		.data = & (const struct snd_usb_midi_endpoint_info) {
1051			.out_cables = 0x0003,
1052			.in_cables  = 0x0007
1053		}
1054	}
1055},
1056	/* TODO: add Edirol M-100FX support */
1057{
1058	/* has ID 0x004e when not in "Advanced Driver" mode */
1059	USB_DEVICE(0x0582, 0x004c),
1060	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1061		.vendor_name = "EDIROL",
1062		.product_name = "PCR-A",
1063		.ifnum = QUIRK_ANY_INTERFACE,
1064		.type = QUIRK_COMPOSITE,
1065		.data = (const struct snd_usb_audio_quirk[]) {
1066			{
1067				.ifnum = 1,
1068				.type = QUIRK_AUDIO_STANDARD_INTERFACE
1069			},
1070			{
1071				.ifnum = 2,
1072				.type = QUIRK_AUDIO_STANDARD_INTERFACE
1073			},
1074			{
1075				.ifnum = -1
1076			}
1077		}
1078	}
1079},
1080{
1081	/* has ID 0x004f when not in "Advanced Driver" mode */
1082	USB_DEVICE(0x0582, 0x004d),
1083	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1084		.vendor_name = "EDIROL",
1085		.product_name = "PCR-A",
1086		.ifnum = 0,
1087		.type = QUIRK_MIDI_FIXED_ENDPOINT,
1088		.data = & (const struct snd_usb_midi_endpoint_info) {
1089			.out_cables = 0x0003,
1090			.in_cables  = 0x0007
1091		}
1092	}
1093},
1094{
1095	/*
1096	 * This quirk is for the "Advanced Driver" mode. If off, the UA-3FX
1097	 * is standard compliant, but has only 16-bit PCM.
1098	 */
1099	USB_DEVICE(0x0582, 0x0050),
1100	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1101		.vendor_name = "EDIROL",
1102		.product_name = "UA-3FX",
1103		.ifnum = QUIRK_ANY_INTERFACE,
1104		.type = QUIRK_COMPOSITE,
1105		.data = (const struct snd_usb_audio_quirk[]) {
1106			{
1107				.ifnum = 1,
1108				.type = QUIRK_AUDIO_STANDARD_INTERFACE
1109			},
1110			{
1111				.ifnum = 2,
1112				.type = QUIRK_AUDIO_STANDARD_INTERFACE
1113			},
1114			{
1115				.ifnum = -1
1116			}
1117		}
1118	}
1119},
1120{
1121	USB_DEVICE(0x0582, 0x0052),
1122	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1123		.vendor_name = "EDIROL",
1124		.product_name = "UM-1SX",
1125		.ifnum = 0,
1126		.type = QUIRK_MIDI_STANDARD_INTERFACE
1127	}
1128},
1129{
1130	USB_DEVICE(0x0582, 0x0060),
1131	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1132		.vendor_name = "Roland",
1133		.product_name = "EXR Series",
1134		.ifnum = 0,
1135		.type = QUIRK_MIDI_STANDARD_INTERFACE
1136	}
1137},
1138{
1139	/* has ID 0x0067 when not in "Advanced Driver" mode */
1140	USB_DEVICE(0x0582, 0x0065),
1141	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1142		.vendor_name = "EDIROL",
1143		.product_name = "PCR-1",
1144		.ifnum = 0,
1145		.type = QUIRK_MIDI_FIXED_ENDPOINT,
1146		.data = & (const struct snd_usb_midi_endpoint_info) {
1147			.out_cables = 0x0001,
1148			.in_cables  = 0x0003
1149		}
1150	}
1151},
1152{
1153	/* has ID 0x006b when not in "Advanced Driver" mode */
1154	USB_DEVICE_VENDOR_SPEC(0x0582, 0x006a),
1155	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1156		.vendor_name = "Roland",
1157		.product_name = "SP-606",
1158		.ifnum = 3,
1159		.type = QUIRK_MIDI_FIXED_ENDPOINT,
1160		.data = & (const struct snd_usb_midi_endpoint_info) {
1161			.out_cables = 0x0001,
1162			.in_cables  = 0x0001
1163		}
1164	}
1165},
1166{
1167	/* has ID 0x006e when not in "Advanced Driver" mode */
1168	USB_DEVICE(0x0582, 0x006d),
1169	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1170		.vendor_name = "Roland",
1171		.product_name = "FANTOM-X",
1172		.ifnum = 0,
1173		.type = QUIRK_MIDI_FIXED_ENDPOINT,
1174		.data = & (const struct snd_usb_midi_endpoint_info) {
1175			.out_cables = 0x0001,
1176			.in_cables  = 0x0001
1177		}
1178	}
1179},
1180{	/*
1181	 * This quirk is for the "Advanced" modes of the Edirol UA-25.
1182	 * If the switch is not in an advanced setting, the UA-25 has
1183	 * ID 0x0582/0x0073 and is standard compliant (no quirks), but
1184	 * offers only 16-bit PCM at 44.1 kHz and no MIDI.
1185	 */
1186	USB_DEVICE_VENDOR_SPEC(0x0582, 0x0074),
1187	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1188		.vendor_name = "EDIROL",
1189		.product_name = "UA-25",
1190		.ifnum = QUIRK_ANY_INTERFACE,
1191		.type = QUIRK_COMPOSITE,
1192		.data = (const struct snd_usb_audio_quirk[]) {
1193			{
1194				.ifnum = 0,
1195				.type = QUIRK_AUDIO_EDIROL_UAXX
1196			},
1197			{
1198				.ifnum = 1,
1199				.type = QUIRK_AUDIO_EDIROL_UAXX
1200			},
1201			{
1202				.ifnum = 2,
1203				.type = QUIRK_AUDIO_EDIROL_UAXX
1204			},
1205			{
1206				.ifnum = -1
1207			}
1208		}
1209	}
1210},
1211{
1212	/* has ID 0x0076 when not in "Advanced Driver" mode */
1213	USB_DEVICE(0x0582, 0x0075),
1214	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1215		.vendor_name = "BOSS",
1216		.product_name = "DR-880",
1217		.ifnum = 0,
1218		.type = QUIRK_MIDI_FIXED_ENDPOINT,
1219		.data = & (const struct snd_usb_midi_endpoint_info) {
1220			.out_cables = 0x0001,
1221			.in_cables  = 0x0001
1222		}
1223	}
1224},
1225{
1226	/* has ID 0x007b when not in "Advanced Driver" mode */
1227	USB_DEVICE_VENDOR_SPEC(0x0582, 0x007a),
1228	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1229		.vendor_name = "Roland",
1230		/* "RD" or "RD-700SX"? */
1231		.ifnum = 0,
1232		.type = QUIRK_MIDI_FIXED_ENDPOINT,
1233		.data = & (const struct snd_usb_midi_endpoint_info) {
1234			.out_cables = 0x0003,
1235			.in_cables  = 0x0003
1236		}
1237	}
1238},
1239{
1240	/* has ID 0x0081 when not in "Advanced Driver" mode */
1241	USB_DEVICE(0x0582, 0x0080),
1242	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1243		.vendor_name = "Roland",
1244		.product_name = "G-70",
1245		.ifnum = 0,
1246		.type = QUIRK_MIDI_FIXED_ENDPOINT,
1247		.data = & (const struct snd_usb_midi_endpoint_info) {
1248			.out_cables = 0x0001,
1249			.in_cables  = 0x0001
1250		}
1251	}
1252},
1253	/* TODO: add Roland V-SYNTH XT support */
1254	/* TODO: add BOSS GT-PRO support */
1255{
1256	/* has ID 0x008c when not in "Advanced Driver" mode */
1257	USB_DEVICE(0x0582, 0x008b),
1258	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1259		.vendor_name = "EDIROL",
1260		.product_name = "PC-50",
1261		.ifnum = 0,
1262		.type = QUIRK_MIDI_FIXED_ENDPOINT,
1263		.data = & (const struct snd_usb_midi_endpoint_info) {
1264			.out_cables = 0x0001,
1265			.in_cables  = 0x0001
1266		}
1267	}
1268},
1269	/* TODO: add Edirol PC-80 support */
1270{
1271	USB_DEVICE(0x0582, 0x0096),
1272	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1273		.vendor_name = "EDIROL",
1274		.product_name = "UA-1EX",
1275		.ifnum = QUIRK_ANY_INTERFACE,
1276		.type = QUIRK_COMPOSITE,
1277		.data = (const struct snd_usb_audio_quirk[]) {
1278			{
1279				.ifnum = 0,
1280				.type = QUIRK_AUDIO_STANDARD_INTERFACE
1281			},
1282			{
1283				.ifnum = 1,
1284				.type = QUIRK_AUDIO_STANDARD_INTERFACE
1285			},
1286			{
1287				.ifnum = -1
1288			}
1289		}
1290	}
1291},
1292{
1293	USB_DEVICE(0x0582, 0x009a),
1294	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1295		.vendor_name = "EDIROL",
1296		.product_name = "UM-3EX",
1297		.ifnum = 0,
1298		.type = QUIRK_MIDI_FIXED_ENDPOINT,
1299		.data = & (const struct snd_usb_midi_endpoint_info) {
1300			.out_cables = 0x000f,
1301			.in_cables  = 0x000f
1302		}
1303	}
1304},
1305{
1306	/*
1307	 * This quirk is for the "Advanced Driver" mode. If off, the UA-4FX
1308	 * is standard compliant, but has only 16-bit PCM and no MIDI.
1309	 */
1310	USB_DEVICE(0x0582, 0x00a3),
1311	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1312		.vendor_name = "EDIROL",
1313		.product_name = "UA-4FX",
1314		.ifnum = QUIRK_ANY_INTERFACE,
1315		.type = QUIRK_COMPOSITE,
1316		.data = (const struct snd_usb_audio_quirk[]) {
1317			{
1318				.ifnum = 0,
1319				.type = QUIRK_AUDIO_EDIROL_UAXX
1320			},
1321			{
1322				.ifnum = 1,
1323				.type = QUIRK_AUDIO_EDIROL_UAXX
1324			},
1325			{
1326				.ifnum = 2,
1327				.type = QUIRK_AUDIO_EDIROL_UAXX
1328			},
1329			{
1330				.ifnum = -1
1331			}
1332		}
1333	}
1334},
1335	/* TODO: add Edirol MD-P1 support */
1336{
1337	USB_DEVICE(0x582, 0x00a6),
1338	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1339		.vendor_name = "Roland",
1340		.product_name = "Juno-G",
1341		.ifnum = 0,
1342		.type = QUIRK_MIDI_FIXED_ENDPOINT,
1343		.data = & (const struct snd_usb_midi_endpoint_info) {
1344			.out_cables = 0x0001,
1345			.in_cables  = 0x0001
1346		}
1347	}
1348},
1349{
1350	/* Roland SH-201 */
1351	USB_DEVICE(0x0582, 0x00ad),
1352	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1353		.vendor_name = "Roland",
1354		.product_name = "SH-201",
1355		.ifnum = QUIRK_ANY_INTERFACE,
1356		.type = QUIRK_COMPOSITE,
1357		.data = (const struct snd_usb_audio_quirk[]) {
1358			{
1359				.ifnum = 0,
1360				.type = QUIRK_AUDIO_STANDARD_INTERFACE
1361			},
1362			{
1363				.ifnum = 1,
1364				.type = QUIRK_AUDIO_STANDARD_INTERFACE
1365			},
1366			{
1367				.ifnum = 2,
1368				.type = QUIRK_MIDI_FIXED_ENDPOINT,
1369				.data = & (const struct snd_usb_midi_endpoint_info) {
1370					.out_cables = 0x0001,
1371					.in_cables  = 0x0001
1372				}
1373			},
1374			{
1375				.ifnum = -1
1376			}
1377		}
1378	}
1379},
1380{
1381	/* Roland SonicCell */
1382	USB_DEVICE(0x0582, 0x00c2),
1383	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1384		.vendor_name = "Roland",
1385		.product_name = "SonicCell",
1386		.ifnum = QUIRK_ANY_INTERFACE,
1387		.type = QUIRK_COMPOSITE,
1388		.data = (const struct snd_usb_audio_quirk[]) {
1389			{
1390				.ifnum = 0,
1391				.type = QUIRK_AUDIO_STANDARD_INTERFACE
1392			},
1393			{
1394				.ifnum = 1,
1395				.type = QUIRK_AUDIO_STANDARD_INTERFACE
1396			},
1397			{
1398				.ifnum = 2,
1399				.type = QUIRK_MIDI_FIXED_ENDPOINT,
1400				.data = & (const struct snd_usb_midi_endpoint_info) {
1401					.out_cables = 0x0001,
1402					.in_cables  = 0x0001
1403				}
1404			},
1405			{
1406				.ifnum = -1
1407			}
1408		}
1409	}
1410},
1411{
1412	/* Edirol M-16DX */
1413	USB_DEVICE(0x0582, 0x00c4),
1414	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1415		.ifnum = QUIRK_ANY_INTERFACE,
1416		.type = QUIRK_COMPOSITE,
1417		.data = (const struct snd_usb_audio_quirk[]) {
1418			{
1419				.ifnum = 0,
1420				.type = QUIRK_AUDIO_STANDARD_INTERFACE
1421			},
1422			{
1423				.ifnum = 1,
1424				.type = QUIRK_AUDIO_STANDARD_INTERFACE
1425			},
1426			{
1427				.ifnum = 2,
1428				.type = QUIRK_MIDI_FIXED_ENDPOINT,
1429				.data = & (const struct snd_usb_midi_endpoint_info) {
1430					.out_cables = 0x0001,
1431					.in_cables  = 0x0001
1432				}
1433			},
1434			{
1435				.ifnum = -1
1436			}
1437		}
1438	}
1439},
1440{
1441	/* BOSS GT-10 */
1442	USB_DEVICE(0x0582, 0x00da),
1443	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1444		.ifnum = QUIRK_ANY_INTERFACE,
1445		.type = QUIRK_COMPOSITE,
1446		.data = (const struct snd_usb_audio_quirk[]) {
1447			{
1448				.ifnum = 0,
1449				.type = QUIRK_AUDIO_STANDARD_INTERFACE
1450			},
1451			{
1452				.ifnum = 1,
1453				.type = QUIRK_AUDIO_STANDARD_INTERFACE
1454			},
1455			{
1456				.ifnum = 2,
1457				.type = QUIRK_MIDI_FIXED_ENDPOINT,
1458				.data = & (const struct snd_usb_midi_endpoint_info) {
1459					.out_cables = 0x0001,
1460					.in_cables  = 0x0001
1461				}
1462			},
1463			{
1464				.ifnum = -1
1465			}
1466		}
1467	}
1468},
1469{
1470	/* Advanced modes of the Edirol UA-25EX.
1471	 * For the standard mode, UA-25EX has ID 0582:00e7, which
1472	 * offers only 16-bit PCM at 44.1 kHz and no MIDI.
1473	 */
1474	USB_DEVICE_VENDOR_SPEC(0x0582, 0x00e6),
1475	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1476		.vendor_name = "EDIROL",
1477		.product_name = "UA-25EX",
1478		.ifnum = QUIRK_ANY_INTERFACE,
1479		.type = QUIRK_COMPOSITE,
1480		.data = (const struct snd_usb_audio_quirk[]) {
1481			{
1482				.ifnum = 0,
1483				.type = QUIRK_AUDIO_EDIROL_UAXX
1484			},
1485			{
1486				.ifnum = 1,
1487				.type = QUIRK_AUDIO_EDIROL_UAXX
1488			},
1489			{
1490				.ifnum = 2,
1491				.type = QUIRK_AUDIO_EDIROL_UAXX
1492			},
1493			{
1494				.ifnum = -1
1495			}
1496		}
1497	}
1498},
1499{
1500	/* has ID 0x00ea when not in Advanced Driver mode */
1501	USB_DEVICE_VENDOR_SPEC(0x0582, 0x00e9),
1502	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1503		/* .vendor_name = "Roland", */
1504		/* .product_name = "UA-1G", */
1505		.ifnum = QUIRK_ANY_INTERFACE,
1506		.type = QUIRK_COMPOSITE,
1507		.data = (const struct snd_usb_audio_quirk[]) {
1508			{
1509				.ifnum = 0,
1510				.type = QUIRK_AUDIO_STANDARD_INTERFACE
1511			},
1512			{
1513				.ifnum = 1,
1514				.type = QUIRK_AUDIO_STANDARD_INTERFACE
1515			},
1516			{
1517				.ifnum = -1
1518			}
1519		}
1520	}
1521},
1522
1523/* Guillemot devices */
1524{
1525	/*
1526	 * This is for the "Windows Edition" where the external MIDI ports are
1527	 * the only MIDI ports; the control data is reported through HID
1528	 * interfaces.  The "Macintosh Edition" has ID 0xd002 and uses standard
1529	 * compliant USB MIDI ports for external MIDI and controls.
1530	 */
1531	USB_DEVICE_VENDOR_SPEC(0x06f8, 0xb000),
1532	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1533		.vendor_name = "Hercules",
1534		.product_name = "DJ Console (WE)",
1535		.ifnum = 4,
1536		.type = QUIRK_MIDI_FIXED_ENDPOINT,
1537		.data = & (const struct snd_usb_midi_endpoint_info) {
1538			.out_cables = 0x0001,
1539			.in_cables = 0x0001
1540		}
1541	}
1542},
1543
1544/* Midiman/M-Audio devices */
1545{
1546	USB_DEVICE_VENDOR_SPEC(0x0763, 0x1002),
1547	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1548		.vendor_name = "M-Audio",
1549		.product_name = "MidiSport 2x2",
1550		.ifnum = QUIRK_ANY_INTERFACE,
1551		.type = QUIRK_MIDI_MIDIMAN,
1552		.data = & (const struct snd_usb_midi_endpoint_info) {
1553			.out_cables = 0x0003,
1554			.in_cables  = 0x0003
1555		}
1556	}
1557},
1558{
1559	USB_DEVICE_VENDOR_SPEC(0x0763, 0x1011),
1560	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1561		.vendor_name = "M-Audio",
1562		.product_name = "MidiSport 1x1",
1563		.ifnum = QUIRK_ANY_INTERFACE,
1564		.type = QUIRK_MIDI_MIDIMAN,
1565		.data = & (const struct snd_usb_midi_endpoint_info) {
1566			.out_cables = 0x0001,
1567			.in_cables  = 0x0001
1568		}
1569	}
1570},
1571{
1572	USB_DEVICE_VENDOR_SPEC(0x0763, 0x1015),
1573	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1574		.vendor_name = "M-Audio",
1575		.product_name = "Keystation",
1576		.ifnum = QUIRK_ANY_INTERFACE,
1577		.type = QUIRK_MIDI_MIDIMAN,
1578		.data = & (const struct snd_usb_midi_endpoint_info) {
1579			.out_cables = 0x0001,
1580			.in_cables  = 0x0001
1581		}
1582	}
1583},
1584{
1585	USB_DEVICE_VENDOR_SPEC(0x0763, 0x1021),
1586	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1587		.vendor_name = "M-Audio",
1588		.product_name = "MidiSport 4x4",
1589		.ifnum = QUIRK_ANY_INTERFACE,
1590		.type = QUIRK_MIDI_MIDIMAN,
1591		.data = & (const struct snd_usb_midi_endpoint_info) {
1592			.out_cables = 0x000f,
1593			.in_cables  = 0x000f
1594		}
1595	}
1596},
1597{
1598	/*
1599	 * For hardware revision 1.05; in the later revisions (1.10 and
1600	 * 1.21), 0x1031 is the ID for the device without firmware.
1601	 * Thanks to Olaf Giesbrecht <Olaf_Giesbrecht@yahoo.de>
1602	 */
1603	USB_DEVICE_VER(0x0763, 0x1031, 0x0100, 0x0109),
1604	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1605		.vendor_name = "M-Audio",
1606		.product_name = "MidiSport 8x8",
1607		.ifnum = QUIRK_ANY_INTERFACE,
1608		.type = QUIRK_MIDI_MIDIMAN,
1609		.data = & (const struct snd_usb_midi_endpoint_info) {
1610			.out_cables = 0x01ff,
1611			.in_cables  = 0x01ff
1612		}
1613	}
1614},
1615{
1616	USB_DEVICE_VENDOR_SPEC(0x0763, 0x1033),
1617	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1618		.vendor_name = "M-Audio",
1619		.product_name = "MidiSport 8x8",
1620		.ifnum = QUIRK_ANY_INTERFACE,
1621		.type = QUIRK_MIDI_MIDIMAN,
1622		.data = & (const struct snd_usb_midi_endpoint_info) {
1623			.out_cables = 0x01ff,
1624			.in_cables  = 0x01ff
1625		}
1626	}
1627},
1628{
1629	USB_DEVICE_VENDOR_SPEC(0x0763, 0x1041),
1630	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1631		.vendor_name = "M-Audio",
1632		.product_name = "MidiSport 2x4",
1633		.ifnum = QUIRK_ANY_INTERFACE,
1634		.type = QUIRK_MIDI_MIDIMAN,
1635		.data = & (const struct snd_usb_midi_endpoint_info) {
1636			.out_cables = 0x000f,
1637			.in_cables  = 0x0003
1638		}
1639	}
1640},
1641{
1642	USB_DEVICE_VENDOR_SPEC(0x0763, 0x2001),
1643	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1644		.vendor_name = "M-Audio",
1645		.product_name = "Quattro",
1646		.ifnum = QUIRK_ANY_INTERFACE,
1647		.type = QUIRK_COMPOSITE,
1648		.data = & (const struct snd_usb_audio_quirk[]) {
1649			/*
1650			 * Interfaces 0-2 are "Windows-compatible", 16-bit only,
1651			 * and share endpoints with the other interfaces.
1652			 * Ignore them.  The other interfaces can do 24 bits,
1653			 * but captured samples are big-endian (see usbaudio.c).
1654			 */
1655			{
1656				.ifnum = 0,
1657				.type = QUIRK_IGNORE_INTERFACE
1658			},
1659			{
1660				.ifnum = 1,
1661				.type = QUIRK_IGNORE_INTERFACE
1662			},
1663			{
1664				.ifnum = 2,
1665				.type = QUIRK_IGNORE_INTERFACE
1666			},
1667			{
1668				.ifnum = 3,
1669				.type = QUIRK_IGNORE_INTERFACE
1670			},
1671			{
1672				.ifnum = 4,
1673				.type = QUIRK_AUDIO_STANDARD_INTERFACE
1674			},
1675			{
1676				.ifnum = 5,
1677				.type = QUIRK_AUDIO_STANDARD_INTERFACE
1678			},
1679			{
1680				.ifnum = 6,
1681				.type = QUIRK_IGNORE_INTERFACE
1682			},
1683			{
1684				.ifnum = 7,
1685				.type = QUIRK_AUDIO_STANDARD_INTERFACE
1686			},
1687			{
1688				.ifnum = 8,
1689				.type = QUIRK_AUDIO_STANDARD_INTERFACE
1690			},
1691			{
1692				.ifnum = 9,
1693				.type = QUIRK_MIDI_MIDIMAN,
1694				.data = & (const struct snd_usb_midi_endpoint_info) {
1695					.out_cables = 0x0001,
1696					.in_cables  = 0x0001
1697				}
1698			},
1699			{
1700				.ifnum = -1
1701			}
1702		}
1703	}
1704},
1705{
1706	USB_DEVICE_VENDOR_SPEC(0x0763, 0x2003),
1707	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1708		.vendor_name = "M-Audio",
1709		.product_name = "AudioPhile",
1710		.ifnum = 6,
1711		.type = QUIRK_MIDI_MIDIMAN,
1712		.data = & (const struct snd_usb_midi_endpoint_info) {
1713			.out_cables = 0x0001,
1714			.in_cables  = 0x0001
1715		}
1716	}
1717},
1718{
1719	USB_DEVICE_VENDOR_SPEC(0x0763, 0x2008),
1720	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1721		.vendor_name = "M-Audio",
1722		.product_name = "Ozone",
1723		.ifnum = 3,
1724		.type = QUIRK_MIDI_MIDIMAN,
1725		.data = & (const struct snd_usb_midi_endpoint_info) {
1726			.out_cables = 0x0001,
1727			.in_cables  = 0x0001
1728		}
1729	}
1730},
1731{
1732	USB_DEVICE_VENDOR_SPEC(0x0763, 0x200d),
1733	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1734		.vendor_name = "M-Audio",
1735		.product_name = "OmniStudio",
1736		.ifnum = QUIRK_ANY_INTERFACE,
1737		.type = QUIRK_COMPOSITE,
1738		.data = & (const struct snd_usb_audio_quirk[]) {
1739			{
1740				.ifnum = 0,
1741				.type = QUIRK_IGNORE_INTERFACE
1742			},
1743			{
1744				.ifnum = 1,
1745				.type = QUIRK_IGNORE_INTERFACE
1746			},
1747			{
1748				.ifnum = 2,
1749				.type = QUIRK_IGNORE_INTERFACE
1750			},
1751			{
1752				.ifnum = 3,
1753				.type = QUIRK_IGNORE_INTERFACE
1754			},
1755			{
1756				.ifnum = 4,
1757				.type = QUIRK_AUDIO_STANDARD_INTERFACE
1758			},
1759			{
1760				.ifnum = 5,
1761				.type = QUIRK_AUDIO_STANDARD_INTERFACE
1762			},
1763			{
1764				.ifnum = 6,
1765				.type = QUIRK_IGNORE_INTERFACE
1766			},
1767			{
1768				.ifnum = 7,
1769				.type = QUIRK_AUDIO_STANDARD_INTERFACE
1770			},
1771			{
1772				.ifnum = 8,
1773				.type = QUIRK_AUDIO_STANDARD_INTERFACE
1774			},
1775			{
1776				.ifnum = 9,
1777				.type = QUIRK_MIDI_MIDIMAN,
1778				.data = & (const struct snd_usb_midi_endpoint_info) {
1779					.out_cables = 0x0001,
1780					.in_cables  = 0x0001
1781				}
1782			},
1783			{
1784				.ifnum = -1
1785			}
1786		}
1787	}
1788},
1789{
1790	USB_DEVICE(0x0763, 0x2019),
1791	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1792		/* .vendor_name = "M-Audio", */
1793		/* .product_name = "Ozone Academic", */
1794		.ifnum = QUIRK_ANY_INTERFACE,
1795		.type = QUIRK_COMPOSITE,
1796		.data = & (const struct snd_usb_audio_quirk[]) {
1797			{
1798				.ifnum = 0,
1799				.type = QUIRK_AUDIO_STANDARD_INTERFACE
1800			},
1801			{
1802				.ifnum = 1,
1803				.type = QUIRK_AUDIO_STANDARD_INTERFACE
1804			},
1805			{
1806				.ifnum = 2,
1807				.type = QUIRK_AUDIO_STANDARD_INTERFACE
1808			},
1809			{
1810				.ifnum = 3,
1811				.type = QUIRK_MIDI_MIDIMAN,
1812				.data = & (const struct snd_usb_midi_endpoint_info) {
1813					.out_cables = 0x0001,
1814					.in_cables  = 0x0001
1815				}
1816			},
1817			{
1818				.ifnum = -1
1819			}
1820		}
1821	}
1822},
1823{
1824	USB_DEVICE(0x0763, 0x2080),
1825	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1826		/* .vendor_name = "M-Audio", */
1827		/* .product_name = "Fast Track Ultra 8", */
1828		.ifnum = QUIRK_ANY_INTERFACE,
1829		.type = QUIRK_COMPOSITE,
1830		.data = & (const struct snd_usb_audio_quirk[]) {
1831			{
1832				.ifnum = 0,
1833				.type = QUIRK_IGNORE_INTERFACE
1834			},
1835			{
1836				.ifnum = 1,
1837				.type = QUIRK_AUDIO_STANDARD_INTERFACE
1838			},
1839			{
1840				.ifnum = 2,
1841				.type = QUIRK_AUDIO_STANDARD_INTERFACE
1842			},
1843			/* interface 3 (MIDI) is standard compliant */
1844			{
1845				.ifnum = -1
1846			}
1847		}
1848	}
1849},
1850{
1851	USB_DEVICE(0x0763, 0x2081),
1852	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1853		/* .vendor_name = "M-Audio", */
1854		/* .product_name = "Fast Track Ultra 8R", */
1855		.ifnum = QUIRK_ANY_INTERFACE,
1856		.type = QUIRK_COMPOSITE,
1857		.data = & (const struct snd_usb_audio_quirk[]) {
1858			{
1859				.ifnum = 0,
1860				.type = QUIRK_IGNORE_INTERFACE
1861			},
1862			{
1863				.ifnum = 1,
1864				.type = QUIRK_AUDIO_STANDARD_INTERFACE
1865			},
1866			{
1867				.ifnum = 2,
1868				.type = QUIRK_AUDIO_STANDARD_INTERFACE
1869			},
1870			/* interface 3 (MIDI) is standard compliant */
1871			{
1872				.ifnum = -1
1873			}
1874		}
1875	}
1876},
1877
1878/* Casio devices */
1879{
1880	USB_DEVICE(0x07cf, 0x6801),
1881	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1882		.vendor_name = "Casio",
1883		.product_name = "PL-40R",
1884		.ifnum = 0,
1885		.type = QUIRK_MIDI_YAMAHA
1886	}
1887},
1888{
1889	/* this ID is used by several devices without a product ID */
1890	USB_DEVICE(0x07cf, 0x6802),
1891	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1892		.vendor_name = "Casio",
1893		.product_name = "Keyboard",
1894		.ifnum = 0,
1895		.type = QUIRK_MIDI_YAMAHA
1896	}
1897},
1898
1899/* Mark of the Unicorn devices */
1900{
1901	/* thanks to Robert A. Lerche <ral 'at' msbit.com> */
1902	.match_flags = USB_DEVICE_ID_MATCH_VENDOR |
1903		       USB_DEVICE_ID_MATCH_PRODUCT |
1904		       USB_DEVICE_ID_MATCH_DEV_SUBCLASS,
1905	.idVendor = 0x07fd,
1906	.idProduct = 0x0001,
1907	.bDeviceSubClass = 2,
1908	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1909		.vendor_name = "MOTU",
1910		.product_name = "Fastlane",
1911		.ifnum = QUIRK_ANY_INTERFACE,
1912		.type = QUIRK_COMPOSITE,
1913		.data = & (const struct snd_usb_audio_quirk[]) {
1914			{
1915				.ifnum = 0,
1916				.type = QUIRK_MIDI_FASTLANE
1917			},
1918			{
1919				.ifnum = 1,
1920				.type = QUIRK_IGNORE_INTERFACE
1921			},
1922			{
1923				.ifnum = -1
1924			}
1925		}
1926	}
1927},
1928
1929/* Emagic devices */
1930{
1931	USB_DEVICE(0x086a, 0x0001),
1932	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1933		.vendor_name = "Emagic",
1934		/* .product_name = "Unitor8", */
1935		.ifnum = 2,
1936		.type = QUIRK_MIDI_EMAGIC,
1937		.data = & (const struct snd_usb_midi_endpoint_info) {
1938			.out_cables = 0x80ff,
1939			.in_cables  = 0x80ff
1940		}
1941	}
1942},
1943{
1944	USB_DEVICE(0x086a, 0x0002),
1945	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1946		.vendor_name = "Emagic",
1947		/* .product_name = "AMT8", */
1948		.ifnum = 2,
1949		.type = QUIRK_MIDI_EMAGIC,
1950		.data = & (const struct snd_usb_midi_endpoint_info) {
1951			.out_cables = 0x80ff,
1952			.in_cables  = 0x80ff
1953		}
1954	}
1955},
1956{
1957	USB_DEVICE(0x086a, 0x0003),
1958	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1959		.vendor_name = "Emagic",
1960		/* .product_name = "MT4", */
1961		.ifnum = 2,
1962		.type = QUIRK_MIDI_EMAGIC,
1963		.data = & (const struct snd_usb_midi_endpoint_info) {
1964			.out_cables = 0x800f,
1965			.in_cables  = 0x8003
1966		}
1967	}
1968},
1969
1970/* AKAI devices */
1971{
1972	USB_DEVICE(0x09e8, 0x0062),
1973	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1974		.vendor_name = "AKAI",
1975		.product_name = "MPD16",
1976		.ifnum = 0,
1977		.type = QUIRK_MIDI_AKAI,
1978	}
1979},
1980
1981/* TerraTec devices */
1982{
1983	USB_DEVICE_VENDOR_SPEC(0x0ccd, 0x0012),
1984	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1985		.vendor_name = "TerraTec",
1986		.product_name = "PHASE 26",
1987		.ifnum = 3,
1988		.type = QUIRK_MIDI_STANDARD_INTERFACE
1989	}
1990},
1991{
1992	USB_DEVICE_VENDOR_SPEC(0x0ccd, 0x0013),
1993	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1994		.vendor_name = "TerraTec",
1995		.product_name = "PHASE 26",
1996		.ifnum = 3,
1997		.type = QUIRK_MIDI_STANDARD_INTERFACE
1998	}
1999},
2000{
2001	USB_DEVICE_VENDOR_SPEC(0x0ccd, 0x0014),
2002	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
2003		.vendor_name = "TerraTec",
2004		.product_name = "PHASE 26",
2005		.ifnum = 3,
2006		.type = QUIRK_MIDI_STANDARD_INTERFACE
2007	}
2008},
2009{
2010	USB_DEVICE(0x0ccd, 0x0028),
2011	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
2012		.vendor_name = "TerraTec",
2013		.product_name = "Aureon5.1MkII",
2014		.ifnum = QUIRK_NO_INTERFACE
2015	}
2016},
2017{
2018	USB_DEVICE(0x0ccd, 0x0035),
2019	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
2020		.vendor_name = "Miditech",
2021		.product_name = "Play'n Roll",
2022		.ifnum = 0,
2023		.type = QUIRK_MIDI_CME
2024	}
2025},
2026
2027/* Stanton/N2IT Final Scratch v1 device ('Scratchamp') */
2028{
2029	USB_DEVICE(0x103d, 0x0100),
2030		.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
2031		.vendor_name = "Stanton",
2032		.product_name = "ScratchAmp",
2033		.ifnum = QUIRK_NO_INTERFACE
2034	}
2035},
2036{
2037	USB_DEVICE(0x103d, 0x0101),
2038		.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
2039		.vendor_name = "Stanton",
2040		.product_name = "ScratchAmp",
2041		.ifnum = QUIRK_NO_INTERFACE
2042	}
2043},
2044
2045/* Novation EMS devices */
2046{
2047	USB_DEVICE_VENDOR_SPEC(0x1235, 0x0001),
2048	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
2049		.vendor_name = "Novation",
2050		.product_name = "ReMOTE Audio/XStation",
2051		.ifnum = 4,
2052		.type = QUIRK_MIDI_NOVATION
2053	}
2054},
2055{
2056	USB_DEVICE_VENDOR_SPEC(0x1235, 0x0002),
2057	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
2058		.vendor_name = "Novation",
2059		.product_name = "Speedio",
2060		.ifnum = 3,
2061		.type = QUIRK_MIDI_NOVATION
2062	}
2063},
2064{
2065	USB_DEVICE_VENDOR_SPEC(0x1235, 0x4661),
2066	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
2067		.vendor_name = "Novation",
2068		.product_name = "ReMOTE25",
2069		.ifnum = 0,
2070		.type = QUIRK_MIDI_NOVATION
2071	}
2072},
2073
2074/* Access Music devices */
2075{
2076	/* VirusTI Desktop */
2077	USB_DEVICE_VENDOR_SPEC(0x133e, 0x0815),
2078	.driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) {
2079		.ifnum = QUIRK_ANY_INTERFACE,
2080		.type = QUIRK_COMPOSITE,
2081		.data = &(const struct snd_usb_audio_quirk[]) {
2082			{
2083				.ifnum = 3,
2084				.type = QUIRK_MIDI_FIXED_ENDPOINT,
2085				.data = &(const struct snd_usb_midi_endpoint_info) {
2086					.out_cables = 0x0003,
2087					.in_cables  = 0x0003
2088				}
2089			},
2090			{
2091				.ifnum = 4,
2092				.type = QUIRK_IGNORE_INTERFACE
2093			},
2094			{
2095				.ifnum = -1
2096			}
2097		}
2098	}
2099},
2100
2101/* */
2102{
2103	/* aka. Serato Scratch Live DJ Box */
2104	USB_DEVICE(0x13e5, 0x0001),
2105	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
2106		.vendor_name = "Rane",
2107		.product_name = "SL-1",
2108		.ifnum = QUIRK_NO_INTERFACE
2109	}
2110},
2111
2112/* Miditech devices */
2113{
2114	USB_DEVICE(0x4752, 0x0011),
2115	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
2116		.vendor_name = "Miditech",
2117		.product_name = "Midistart-2",
2118		.ifnum = 0,
2119		.type = QUIRK_MIDI_CME
2120	}
2121},
2122
2123/* Central Music devices */
2124{
2125	/* this ID used by both Miditech MidiStudio-2 and CME UF-x */
2126	USB_DEVICE(0x7104, 0x2202),
2127	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
2128		.ifnum = 0,
2129		.type = QUIRK_MIDI_CME
2130	}
2131},
2132
2133/* Hauppauge HVR-950Q and HVR-850 */
2134{
2135	USB_DEVICE_VENDOR_SPEC(0x2040, 0x7200),
2136	.match_flags = USB_DEVICE_ID_MATCH_DEVICE |
2137		       USB_DEVICE_ID_MATCH_INT_CLASS |
2138		       USB_DEVICE_ID_MATCH_INT_SUBCLASS,
2139	.bInterfaceClass = USB_CLASS_AUDIO,
2140	.bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL,
2141	.driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) {
2142		.vendor_name = "Hauppauge",
2143		.product_name = "HVR-950Q",
2144		.ifnum = QUIRK_ANY_INTERFACE,
2145		.type = QUIRK_AUDIO_ALIGN_TRANSFER,
2146	}
2147},
2148{
2149	USB_DEVICE_VENDOR_SPEC(0x2040, 0x7240),
2150	.match_flags = USB_DEVICE_ID_MATCH_DEVICE |
2151		       USB_DEVICE_ID_MATCH_INT_CLASS |
2152		       USB_DEVICE_ID_MATCH_INT_SUBCLASS,
2153	.bInterfaceClass = USB_CLASS_AUDIO,
2154	.bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL,
2155	.driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) {
2156		.vendor_name = "Hauppauge",
2157		.product_name = "HVR-850",
2158		.ifnum = QUIRK_ANY_INTERFACE,
2159		.type = QUIRK_AUDIO_ALIGN_TRANSFER,
2160	}
2161},
2162{
2163	USB_DEVICE_VENDOR_SPEC(0x2040, 0x7210),
2164	.match_flags = USB_DEVICE_ID_MATCH_DEVICE |
2165		       USB_DEVICE_ID_MATCH_INT_CLASS |
2166		       USB_DEVICE_ID_MATCH_INT_SUBCLASS,
2167	.bInterfaceClass = USB_CLASS_AUDIO,
2168	.bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL,
2169	.driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) {
2170		.vendor_name = "Hauppauge",
2171		.product_name = "HVR-950Q",
2172		.ifnum = QUIRK_ANY_INTERFACE,
2173		.type = QUIRK_AUDIO_ALIGN_TRANSFER,
2174	}
2175},
2176{
2177	USB_DEVICE_VENDOR_SPEC(0x2040, 0x7217),
2178	.match_flags = USB_DEVICE_ID_MATCH_DEVICE |
2179		       USB_DEVICE_ID_MATCH_INT_CLASS |
2180		       USB_DEVICE_ID_MATCH_INT_SUBCLASS,
2181	.bInterfaceClass = USB_CLASS_AUDIO,
2182	.bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL,
2183	.driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) {
2184		.vendor_name = "Hauppauge",
2185		.product_name = "HVR-950Q",
2186		.ifnum = QUIRK_ANY_INTERFACE,
2187		.type = QUIRK_AUDIO_ALIGN_TRANSFER,
2188	}
2189},
2190{
2191	USB_DEVICE_VENDOR_SPEC(0x2040, 0x721b),
2192	.match_flags = USB_DEVICE_ID_MATCH_DEVICE |
2193		       USB_DEVICE_ID_MATCH_INT_CLASS |
2194		       USB_DEVICE_ID_MATCH_INT_SUBCLASS,
2195	.bInterfaceClass = USB_CLASS_AUDIO,
2196	.bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL,
2197	.driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) {
2198		.vendor_name = "Hauppauge",
2199		.product_name = "HVR-950Q",
2200		.ifnum = QUIRK_ANY_INTERFACE,
2201		.type = QUIRK_AUDIO_ALIGN_TRANSFER,
2202	}
2203},
2204{
2205	USB_DEVICE_VENDOR_SPEC(0x2040, 0x721e),
2206	.match_flags = USB_DEVICE_ID_MATCH_DEVICE |
2207		       USB_DEVICE_ID_MATCH_INT_CLASS |
2208		       USB_DEVICE_ID_MATCH_INT_SUBCLASS,
2209	.bInterfaceClass = USB_CLASS_AUDIO,
2210	.bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL,
2211	.driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) {
2212		.vendor_name = "Hauppauge",
2213		.product_name = "HVR-950Q",
2214		.ifnum = QUIRK_ANY_INTERFACE,
2215		.type = QUIRK_AUDIO_ALIGN_TRANSFER,
2216	}
2217},
2218{
2219	USB_DEVICE_VENDOR_SPEC(0x2040, 0x721f),
2220	.match_flags = USB_DEVICE_ID_MATCH_DEVICE |
2221		       USB_DEVICE_ID_MATCH_INT_CLASS |
2222		       USB_DEVICE_ID_MATCH_INT_SUBCLASS,
2223	.bInterfaceClass = USB_CLASS_AUDIO,
2224	.bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL,
2225	.driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) {
2226		.vendor_name = "Hauppauge",
2227		.product_name = "HVR-950Q",
2228		.ifnum = QUIRK_ANY_INTERFACE,
2229		.type = QUIRK_AUDIO_ALIGN_TRANSFER,
2230	}
2231},
2232{
2233	USB_DEVICE_VENDOR_SPEC(0x2040, 0x7280),
2234	.match_flags = USB_DEVICE_ID_MATCH_DEVICE |
2235		       USB_DEVICE_ID_MATCH_INT_CLASS |
2236		       USB_DEVICE_ID_MATCH_INT_SUBCLASS,
2237	.bInterfaceClass = USB_CLASS_AUDIO,
2238	.bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL,
2239	.driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) {
2240		.vendor_name = "Hauppauge",
2241		.product_name = "HVR-950Q",
2242		.ifnum = QUIRK_ANY_INTERFACE,
2243		.type = QUIRK_AUDIO_ALIGN_TRANSFER,
2244	}
2245},
2246{
2247	USB_DEVICE_VENDOR_SPEC(0x0fd9, 0x0008),
2248	.match_flags = USB_DEVICE_ID_MATCH_DEVICE |
2249		       USB_DEVICE_ID_MATCH_INT_CLASS |
2250		       USB_DEVICE_ID_MATCH_INT_SUBCLASS,
2251	.bInterfaceClass = USB_CLASS_AUDIO,
2252	.bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL,
2253	.driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) {
2254		.vendor_name = "Hauppauge",
2255		.product_name = "HVR-950Q",
2256		.ifnum = QUIRK_ANY_INTERFACE,
2257		.type = QUIRK_AUDIO_ALIGN_TRANSFER,
2258	}
2259},
2260
2261/* Digidesign Mbox */
2262{
2263	/* Thanks to Clemens Ladisch <clemens@ladisch.de> */
2264	USB_DEVICE(0x0dba, 0x1000),
2265	.driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) {
2266		.vendor_name = "Digidesign",
2267		.product_name = "MBox",
2268		.ifnum = QUIRK_ANY_INTERFACE,
2269		.type = QUIRK_COMPOSITE,
2270		.data = (const struct snd_usb_audio_quirk[]){
2271			{
2272				.ifnum = 0,
2273				.type = QUIRK_IGNORE_INTERFACE,
2274			},
2275			{
2276				.ifnum = 1,
2277				.type = QUIRK_AUDIO_FIXED_ENDPOINT,
2278				.data = &(const struct audioformat) {
2279					.formats = SNDRV_PCM_FMTBIT_S24_3BE,
2280					.channels = 2,
2281					.iface = 1,
2282					.altsetting = 1,
2283					.altset_idx = 1,
2284					.attributes = UAC_EP_CS_ATTR_SAMPLE_RATE,
2285					.endpoint = 0x02,
2286					.ep_attr = 0x01,
2287					.maxpacksize = 0x130,
2288					.rates = SNDRV_PCM_RATE_44100 |
2289						 SNDRV_PCM_RATE_48000,
2290					.rate_min = 44100,
2291					.rate_max = 48000,
2292					.nr_rates = 2,
2293					.rate_table = (unsigned int[]) {
2294						44100, 48000
2295					}
2296				}
2297			},
2298			{
2299				.ifnum = -1
2300			}
2301		}
2302
2303	}
2304},
2305
2306{
2307	/*
2308	 * Some USB MIDI devices don't have an audio control interface,
2309	 * so we have to grab MIDI streaming interfaces here.
2310	 */
2311	.match_flags = USB_DEVICE_ID_MATCH_INT_CLASS |
2312		       USB_DEVICE_ID_MATCH_INT_SUBCLASS,
2313	.bInterfaceClass = USB_CLASS_AUDIO,
2314	.bInterfaceSubClass = USB_SUBCLASS_MIDISTREAMING,
2315	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
2316		.ifnum = QUIRK_ANY_INTERFACE,
2317		.type = QUIRK_MIDI_STANDARD_INTERFACE
2318	}
2319},
2320
2321#undef USB_DEVICE_VENDOR_SPEC
2322