blob: 88bbd944d4be997b1a672b3f504e15568b983855 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
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/*
43 * Yamaha devices
44 */
45
46#define YAMAHA_DEVICE(id, name) { \
47 USB_DEVICE(0x0499, id), \
48 .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) { \
49 .vendor_name = "Yamaha", \
50 .product_name = name, \
51 .ifnum = QUIRK_ANY_INTERFACE, \
52 .type = QUIRK_MIDI_YAMAHA \
53 } \
54}
55#define YAMAHA_INTERFACE(id, intf, name) { \
56 USB_DEVICE_VENDOR_SPEC(0x0499, id), \
57 .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) { \
58 .vendor_name = "Yamaha", \
59 .product_name = name, \
60 .ifnum = intf, \
61 .type = QUIRK_MIDI_YAMAHA \
62 } \
63}
64YAMAHA_DEVICE(0x1000, "UX256"),
65YAMAHA_DEVICE(0x1001, "MU1000"),
66YAMAHA_DEVICE(0x1002, "MU2000"),
67YAMAHA_DEVICE(0x1003, "MU500"),
68YAMAHA_INTERFACE(0x1004, 3, "UW500"),
69YAMAHA_DEVICE(0x1005, "MOTIF6"),
70YAMAHA_DEVICE(0x1006, "MOTIF7"),
71YAMAHA_DEVICE(0x1007, "MOTIF8"),
72YAMAHA_DEVICE(0x1008, "UX96"),
73YAMAHA_DEVICE(0x1009, "UX16"),
74YAMAHA_INTERFACE(0x100a, 3, "EOS BX"),
75YAMAHA_DEVICE(0x100c, "UC-MX"),
76YAMAHA_DEVICE(0x100d, "UC-KX"),
77YAMAHA_DEVICE(0x100e, "S08"),
78YAMAHA_DEVICE(0x100f, "CLP-150"),
79YAMAHA_DEVICE(0x1010, "CLP-170"),
80YAMAHA_DEVICE(0x1011, "P-250"),
81YAMAHA_DEVICE(0x1012, "TYROS"),
82YAMAHA_DEVICE(0x1013, "PF-500"),
83YAMAHA_DEVICE(0x1014, "S90"),
84YAMAHA_DEVICE(0x1015, "MOTIF-R"),
85YAMAHA_DEVICE(0x1017, "CVP-204"),
86YAMAHA_DEVICE(0x1018, "CVP-206"),
87YAMAHA_DEVICE(0x1019, "CVP-208"),
88YAMAHA_DEVICE(0x101a, "CVP-210"),
89YAMAHA_DEVICE(0x101b, "PSR-1100"),
90YAMAHA_DEVICE(0x101c, "PSR-2100"),
91YAMAHA_DEVICE(0x101d, "CLP-175"),
92YAMAHA_DEVICE(0x101e, "PSR-K1"),
93YAMAHA_DEVICE(0x1020, "EZ-250i"),
94YAMAHA_DEVICE(0x1021, "MOTIF ES 6"),
95YAMAHA_DEVICE(0x1022, "MOTIF ES 7"),
96YAMAHA_DEVICE(0x1023, "MOTIF ES 8"),
97YAMAHA_DEVICE(0x1024, "CVP-301"),
98YAMAHA_DEVICE(0x1025, "CVP-303"),
99YAMAHA_DEVICE(0x1026, "CVP-305"),
100YAMAHA_DEVICE(0x1027, "CVP-307"),
101YAMAHA_DEVICE(0x1028, "CVP-309"),
102YAMAHA_DEVICE(0x1029, "CVP-309GP"),
103YAMAHA_DEVICE(0x102a, "PSR-1500"),
104YAMAHA_DEVICE(0x102b, "PSR-3000"),
105YAMAHA_DEVICE(0x102e, "ELS-01/01C"),
106YAMAHA_DEVICE(0x1030, "PSR-295/293"),
107YAMAHA_DEVICE(0x1031, "DGX-205/203"),
108YAMAHA_DEVICE(0x1032, "DGX-305"),
109YAMAHA_DEVICE(0x1033, "DGX-505"),
110YAMAHA_DEVICE(0x1034, NULL),
111YAMAHA_DEVICE(0x1035, NULL),
112YAMAHA_DEVICE(0x1036, NULL),
113YAMAHA_DEVICE(0x1037, NULL),
114YAMAHA_DEVICE(0x1038, NULL),
115YAMAHA_DEVICE(0x1039, NULL),
116YAMAHA_DEVICE(0x103a, NULL),
117YAMAHA_DEVICE(0x103b, NULL),
118YAMAHA_DEVICE(0x103c, NULL),
119YAMAHA_DEVICE(0x2000, "DGP-7"),
120YAMAHA_DEVICE(0x2001, "DGP-5"),
121YAMAHA_DEVICE(0x2002, NULL),
122YAMAHA_DEVICE(0x5000, "CS1D"),
123YAMAHA_DEVICE(0x5001, "DSP1D"),
124YAMAHA_DEVICE(0x5002, "DME32"),
125YAMAHA_DEVICE(0x5003, "DM2000"),
126YAMAHA_DEVICE(0x5004, "02R96"),
127YAMAHA_DEVICE(0x5005, "ACU16-C"),
128YAMAHA_DEVICE(0x5006, "NHB32-C"),
129YAMAHA_DEVICE(0x5007, "DM1000"),
130YAMAHA_DEVICE(0x5008, "01V96"),
131YAMAHA_DEVICE(0x5009, "SPX2000"),
132YAMAHA_DEVICE(0x500a, "PM5D"),
133YAMAHA_DEVICE(0x500b, "DME64N"),
134YAMAHA_DEVICE(0x500c, "DME24N"),
135YAMAHA_DEVICE(0x500d, NULL),
136YAMAHA_DEVICE(0x500e, NULL),
137YAMAHA_DEVICE(0x7000, "DTX"),
138YAMAHA_DEVICE(0x7010, "UB99"),
139#undef YAMAHA_DEVICE
140#undef YAMAHA_INTERFACE
141
142/*
143 * Roland/RolandED/Edirol/BOSS devices
144 */
145{
146 USB_DEVICE(0x0582, 0x0000),
147 .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
148 .vendor_name = "Roland",
149 .product_name = "UA-100",
150 .ifnum = QUIRK_ANY_INTERFACE,
151 .type = QUIRK_COMPOSITE,
152 .data = (const snd_usb_audio_quirk_t[]) {
153 {
154 .ifnum = 0,
155 .type = QUIRK_AUDIO_FIXED_ENDPOINT,
156 .data = & (const struct audioformat) {
157 .format = SNDRV_PCM_FORMAT_S16_LE,
158 .channels = 4,
159 .iface = 0,
160 .altsetting = 1,
161 .altset_idx = 1,
162 .attributes = 0,
163 .endpoint = 0x01,
164 .ep_attr = 0x09,
165 .rates = SNDRV_PCM_RATE_CONTINUOUS,
166 .rate_min = 44100,
167 .rate_max = 44100,
168 }
169 },
170 {
171 .ifnum = 1,
172 .type = QUIRK_AUDIO_FIXED_ENDPOINT,
173 .data = & (const struct audioformat) {
174 .format = SNDRV_PCM_FORMAT_S16_LE,
175 .channels = 2,
176 .iface = 1,
177 .altsetting = 1,
178 .altset_idx = 1,
179 .attributes = EP_CS_ATTR_FILL_MAX,
180 .endpoint = 0x81,
181 .ep_attr = 0x05,
182 .rates = SNDRV_PCM_RATE_CONTINUOUS,
183 .rate_min = 44100,
184 .rate_max = 44100,
185 }
186 },
187 {
188 .ifnum = 2,
189 .type = QUIRK_MIDI_FIXED_ENDPOINT,
190 .data = & (const snd_usb_midi_endpoint_info_t) {
191 .out_cables = 0x0007,
192 .in_cables = 0x0007
193 }
194 },
195 {
196 .ifnum = -1
197 }
198 }
199 }
200},
201{
202 USB_DEVICE(0x0582, 0x0002),
203 .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
204 .vendor_name = "EDIROL",
205 .product_name = "UM-4",
206 .ifnum = 2,
207 .type = QUIRK_MIDI_FIXED_ENDPOINT,
208 .data = & (const snd_usb_midi_endpoint_info_t) {
209 .out_cables = 0x000f,
210 .in_cables = 0x000f
211 }
212 }
213},
214{
215 USB_DEVICE(0x0582, 0x0003),
216 .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
217 .vendor_name = "Roland",
218 .product_name = "SC-8850",
219 .ifnum = 2,
220 .type = QUIRK_MIDI_FIXED_ENDPOINT,
221 .data = & (const snd_usb_midi_endpoint_info_t) {
222 .out_cables = 0x003f,
223 .in_cables = 0x003f
224 }
225 }
226},
227{
228 USB_DEVICE(0x0582, 0x0004),
229 .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
230 .vendor_name = "Roland",
231 .product_name = "U-8",
232 .ifnum = 2,
233 .type = QUIRK_MIDI_FIXED_ENDPOINT,
234 .data = & (const snd_usb_midi_endpoint_info_t) {
235 .out_cables = 0x0005,
236 .in_cables = 0x0005
237 }
238 }
239},
240{
241 USB_DEVICE(0x0582, 0x0005),
242 .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
243 .vendor_name = "EDIROL",
244 .product_name = "UM-2",
245 .ifnum = 2,
246 .type = QUIRK_MIDI_FIXED_ENDPOINT,
247 .data = & (const snd_usb_midi_endpoint_info_t) {
248 .out_cables = 0x0003,
249 .in_cables = 0x0003
250 }
251 }
252},
253{
254 USB_DEVICE(0x0582, 0x0007),
255 .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
256 .vendor_name = "Roland",
257 .product_name = "SC-8820",
258 .ifnum = 2,
259 .type = QUIRK_MIDI_FIXED_ENDPOINT,
260 .data = & (const snd_usb_midi_endpoint_info_t) {
261 .out_cables = 0x0013,
262 .in_cables = 0x0013
263 }
264 }
265},
266{
267 USB_DEVICE(0x0582, 0x0008),
268 .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
269 .vendor_name = "Roland",
270 .product_name = "PC-300",
271 .ifnum = 2,
272 .type = QUIRK_MIDI_FIXED_ENDPOINT,
273 .data = & (const snd_usb_midi_endpoint_info_t) {
274 .out_cables = 0x0001,
275 .in_cables = 0x0001
276 }
277 }
278},
279{
280 USB_DEVICE(0x0582, 0x0009),
281 .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
282 .vendor_name = "EDIROL",
283 .product_name = "UM-1",
284 .ifnum = 2,
285 .type = QUIRK_MIDI_FIXED_ENDPOINT,
286 .data = & (const snd_usb_midi_endpoint_info_t) {
287 .out_cables = 0x0001,
288 .in_cables = 0x0001
289 }
290 }
291},
292{
293 USB_DEVICE(0x0582, 0x000b),
294 .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
295 .vendor_name = "Roland",
296 .product_name = "SK-500",
297 .ifnum = 2,
298 .type = QUIRK_MIDI_FIXED_ENDPOINT,
299 .data = & (const snd_usb_midi_endpoint_info_t) {
300 .out_cables = 0x0013,
301 .in_cables = 0x0013
302 }
303 }
304},
305{
306 /* thanks to Emiliano Grilli <emillo@libero.it>
307 * for helping researching this data */
308 USB_DEVICE(0x0582, 0x000c),
309 .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
310 .vendor_name = "Roland",
311 .product_name = "SC-D70",
312 .ifnum = QUIRK_ANY_INTERFACE,
313 .type = QUIRK_COMPOSITE,
314 .data = (const snd_usb_audio_quirk_t[]) {
315 {
316 .ifnum = 0,
317 .type = QUIRK_AUDIO_FIXED_ENDPOINT,
318 .data = & (const struct audioformat) {
319 .format = SNDRV_PCM_FORMAT_S24_3LE,
320 .channels = 2,
321 .iface = 0,
322 .altsetting = 1,
323 .altset_idx = 1,
324 .attributes = 0,
325 .endpoint = 0x01,
326 .ep_attr = 0x01,
327 .rates = SNDRV_PCM_RATE_CONTINUOUS,
328 .rate_min = 44100,
329 .rate_max = 44100,
330 }
331 },
332 {
333 .ifnum = 1,
334 .type = QUIRK_AUDIO_FIXED_ENDPOINT,
335 .data = & (const struct audioformat) {
336 .format = SNDRV_PCM_FORMAT_S24_3LE,
337 .channels = 2,
338 .iface = 1,
339 .altsetting = 1,
340 .altset_idx = 1,
341 .attributes = 0,
342 .endpoint = 0x81,
343 .ep_attr = 0x01,
344 .rates = SNDRV_PCM_RATE_CONTINUOUS,
345 .rate_min = 44100,
346 .rate_max = 44100,
347 }
348 },
349 {
350 .ifnum = 2,
351 .type = QUIRK_MIDI_FIXED_ENDPOINT,
352 .data = & (const snd_usb_midi_endpoint_info_t) {
353 .out_cables = 0x0007,
354 .in_cables = 0x0007
355 }
356 },
357 {
358 .ifnum = -1
359 }
360 }
361 }
362},
363{ /*
364 * This quirk is for the "Advanced Driver" mode of the Edirol UA-5.
365 * If the advanced mode switch at the back of the unit is off, the
366 * UA-5 has ID 0x0582/0x0011 and is standard compliant (no quirks),
367 * but offers only 16-bit PCM.
368 * In advanced mode, the UA-5 will output S24_3LE samples (two
369 * channels) at the rate indicated on the front switch, including
370 * the 96kHz sample rate.
371 */
372 USB_DEVICE(0x0582, 0x0010),
373 .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
374 .vendor_name = "EDIROL",
375 .product_name = "UA-5",
376 .ifnum = QUIRK_ANY_INTERFACE,
377 .type = QUIRK_COMPOSITE,
378 .data = (const snd_usb_audio_quirk_t[]) {
379 {
380 .ifnum = 1,
381 .type = QUIRK_AUDIO_STANDARD_INTERFACE
382 },
383 {
384 .ifnum = 2,
385 .type = QUIRK_AUDIO_STANDARD_INTERFACE
386 },
387 {
388 .ifnum = -1
389 }
390 }
391 }
392},
393{
394 USB_DEVICE(0x0582, 0x0012),
395 .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
396 .vendor_name = "Roland",
397 .product_name = "XV-5050",
398 .ifnum = 0,
399 .type = QUIRK_MIDI_FIXED_ENDPOINT,
400 .data = & (const snd_usb_midi_endpoint_info_t) {
401 .out_cables = 0x0001,
402 .in_cables = 0x0001
403 }
404 }
405},
406{
407 USB_DEVICE(0x0582, 0x0014),
408 .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
409 .vendor_name = "EDIROL",
410 .product_name = "UM-880",
411 .ifnum = 0,
412 .type = QUIRK_MIDI_FIXED_ENDPOINT,
413 .data = & (const snd_usb_midi_endpoint_info_t) {
414 .out_cables = 0x01ff,
415 .in_cables = 0x01ff
416 }
417 }
418},
419{
420 USB_DEVICE(0x0582, 0x0016),
421 .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
422 .vendor_name = "EDIROL",
423 .product_name = "SD-90",
424 .ifnum = 2,
425 .type = QUIRK_MIDI_FIXED_ENDPOINT,
426 .data = & (const snd_usb_midi_endpoint_info_t) {
427 .out_cables = 0x000f,
428 .in_cables = 0x000f
429 }
430 }
431},
432{
433 USB_DEVICE(0x0582, 0x001b),
434 .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
435 .vendor_name = "Roland",
436 .product_name = "MMP-2",
437 .ifnum = 2,
438 .type = QUIRK_MIDI_FIXED_ENDPOINT,
439 .data = & (const snd_usb_midi_endpoint_info_t) {
440 .out_cables = 0x0001,
441 .in_cables = 0x0001
442 }
443 }
444},
445{
446 USB_DEVICE(0x0582, 0x001d),
447 .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
448 .vendor_name = "Roland",
449 .product_name = "V-SYNTH",
450 .ifnum = 0,
451 .type = QUIRK_MIDI_FIXED_ENDPOINT,
452 .data = & (const snd_usb_midi_endpoint_info_t) {
453 .out_cables = 0x0001,
454 .in_cables = 0x0001
455 }
456 }
457},
458{
459 USB_DEVICE(0x0582, 0x0023),
460 .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
461 .vendor_name = "EDIROL",
462 .product_name = "UM-550",
463 .ifnum = 0,
464 .type = QUIRK_MIDI_FIXED_ENDPOINT,
465 .data = & (const snd_usb_midi_endpoint_info_t) {
466 .out_cables = 0x003f,
467 .in_cables = 0x003f
468 }
469 }
470},
471{
472 /*
473 * This quirk is for the "Advanced Driver" mode. If off, the UA-20
474 * has ID 0x0026 and is standard compliant, but has only 16-bit PCM
475 * and no MIDI.
476 */
477 USB_DEVICE(0x0582, 0x0025),
478 .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
479 .vendor_name = "EDIROL",
480 .product_name = "UA-20",
481 .ifnum = QUIRK_ANY_INTERFACE,
482 .type = QUIRK_COMPOSITE,
483 .data = (const snd_usb_audio_quirk_t[]) {
484 {
485 .ifnum = 1,
486 .type = QUIRK_AUDIO_STANDARD_INTERFACE
487 },
488 {
489 .ifnum = 2,
490 .type = QUIRK_AUDIO_STANDARD_INTERFACE
491 },
492 {
493 .ifnum = 3,
494 .type = QUIRK_MIDI_STANDARD_INTERFACE
495 },
496 {
497 .ifnum = -1
498 }
499 }
500 }
501},
502{
503 USB_DEVICE(0x0582, 0x0027),
504 .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
505 .vendor_name = "EDIROL",
506 .product_name = "SD-20",
507 .ifnum = 0,
508 .type = QUIRK_MIDI_FIXED_ENDPOINT,
509 .data = & (const snd_usb_midi_endpoint_info_t) {
510 .out_cables = 0x0003,
511 .in_cables = 0x0007
512 }
513 }
514},
515{
516 USB_DEVICE(0x0582, 0x0029),
517 .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
518 .vendor_name = "EDIROL",
519 .product_name = "SD-80",
520 .ifnum = 0,
521 .type = QUIRK_MIDI_FIXED_ENDPOINT,
522 .data = & (const snd_usb_midi_endpoint_info_t) {
523 .out_cables = 0x000f,
524 .in_cables = 0x000f
525 }
526 }
527},
528{ /*
529 * This quirk is for the "Advanced" modes of the Edirol UA-700.
530 * If the sample format switch is not in an advanced setting, the
531 * UA-700 has ID 0x0582/0x002c and is standard compliant (no quirks),
532 * but offers only 16-bit PCM and no MIDI.
533 */
534 USB_DEVICE_VENDOR_SPEC(0x0582, 0x002b),
535 .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
536 .vendor_name = "EDIROL",
537 .product_name = "UA-700",
538 .ifnum = QUIRK_ANY_INTERFACE,
539 .type = QUIRK_COMPOSITE,
540 .data = (const snd_usb_audio_quirk_t[]) {
541 {
542 .ifnum = 1,
543 .type = QUIRK_AUDIO_EDIROL_UA700_UA25
544 },
545 {
546 .ifnum = 2,
547 .type = QUIRK_AUDIO_EDIROL_UA700_UA25
548 },
549 {
550 .ifnum = 3,
551 .type = QUIRK_AUDIO_EDIROL_UA700_UA25
552 },
553 {
554 .ifnum = -1
555 }
556 }
557 }
558},
559{
560 USB_DEVICE(0x0582, 0x002d),
561 .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
562 .vendor_name = "Roland",
563 .product_name = "XV-2020",
564 .ifnum = 0,
565 .type = QUIRK_MIDI_FIXED_ENDPOINT,
566 .data = & (const snd_usb_midi_endpoint_info_t) {
567 .out_cables = 0x0001,
568 .in_cables = 0x0001
569 }
570 }
571},
572{
573 USB_DEVICE(0x0582, 0x002f),
574 .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
575 .vendor_name = "Roland",
576 .product_name = "VariOS",
577 .ifnum = 0,
578 .type = QUIRK_MIDI_FIXED_ENDPOINT,
579 .data = & (const snd_usb_midi_endpoint_info_t) {
580 .out_cables = 0x0007,
581 .in_cables = 0x0007
582 }
583 }
584},
585{
586 USB_DEVICE(0x0582, 0x0033),
587 .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
588 .vendor_name = "EDIROL",
589 .product_name = "PCR",
590 .ifnum = 0,
591 .type = QUIRK_MIDI_FIXED_ENDPOINT,
592 .data = & (const snd_usb_midi_endpoint_info_t) {
593 .out_cables = 0x0003,
594 .in_cables = 0x0007
595 }
596 }
597},
598{
599 USB_DEVICE(0x0582, 0x0037),
600 .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
601 .vendor_name = "Roland",
602 .product_name = "Digital Piano",
603 .ifnum = 0,
604 .type = QUIRK_MIDI_FIXED_ENDPOINT,
605 .data = & (const snd_usb_midi_endpoint_info_t) {
606 .out_cables = 0x0001,
607 .in_cables = 0x0001
608 }
609 }
610},
611{
612 USB_DEVICE_VENDOR_SPEC(0x0582, 0x003b),
613 .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
614 .vendor_name = "BOSS",
615 .product_name = "GS-10",
616 .ifnum = 3,
617 .type = QUIRK_MIDI_FIXED_ENDPOINT,
618 .data = & (const snd_usb_midi_endpoint_info_t) {
619 .out_cables = 0x0003,
620 .in_cables = 0x0003
621 }
622 }
623},
624{
625 USB_DEVICE(0x0582, 0x0040),
626 .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
627 .vendor_name = "Roland",
628 .product_name = "GI-20",
629 .ifnum = 0,
630 .type = QUIRK_MIDI_FIXED_ENDPOINT,
631 .data = & (const snd_usb_midi_endpoint_info_t) {
632 .out_cables = 0x0001,
633 .in_cables = 0x0001
634 }
635 }
636},
637{
638 USB_DEVICE(0x0582, 0x0042),
639 .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
640 .vendor_name = "Roland",
641 .product_name = "RS-70",
642 .ifnum = 0,
643 .type = QUIRK_MIDI_FIXED_ENDPOINT,
644 .data = & (const snd_usb_midi_endpoint_info_t) {
645 .out_cables = 0x0001,
646 .in_cables = 0x0001
647 }
648 }
649},
650{
651 USB_DEVICE(0x0582, 0x0044),
652 .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
653 .vendor_name = "Roland",
654 .product_name = "UA-1000",
655 .ifnum = QUIRK_ANY_INTERFACE,
656 .type = QUIRK_COMPOSITE,
657 .data = (const snd_usb_audio_quirk_t[]) {
658 {
659 .ifnum = 1,
660 .type = QUIRK_AUDIO_EDIROL_UA1000
661 },
662 {
663 .ifnum = 2,
664 .type = QUIRK_AUDIO_EDIROL_UA1000
665 },
666 {
667 .ifnum = 3,
668 .type = QUIRK_MIDI_FIXED_ENDPOINT,
669 .data = & (const snd_usb_midi_endpoint_info_t) {
670 .out_cables = 0x0003,
671 .in_cables = 0x0003
672 }
673 },
674 {
675 .ifnum = -1
676 }
677 }
678 }
679},
680{
681 USB_DEVICE(0x0582, 0x0048),
682 .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
683 .vendor_name = "EDIROL",
684 .product_name = "UR-80",
685 .ifnum = 0,
686 .type = QUIRK_MIDI_FIXED_ENDPOINT,
687 .data = & (const snd_usb_midi_endpoint_info_t) {
688 .out_cables = 0x0003,
689 .in_cables = 0x0007
690 }
691 }
692},
693{
694 USB_DEVICE(0x0582, 0x004d),
695 .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
696 .vendor_name = "EDIROL",
697 .product_name = "PCR-A",
698 .ifnum = 0,
699 .type = QUIRK_MIDI_FIXED_ENDPOINT,
700 .data = & (const snd_usb_midi_endpoint_info_t) {
701 .out_cables = 0x0003,
702 .in_cables = 0x0007
703 }
704 }
705},
706{
707 /*
708 * This quirk is for the "Advanced Driver" mode. If off, the UA-3FX
709 * is standard compliant, but has only 16-bit PCM.
710 */
711 USB_DEVICE(0x0582, 0x0050),
712 .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
713 .vendor_name = "EDIROL",
714 .product_name = "UA-3FX",
715 .ifnum = QUIRK_ANY_INTERFACE,
716 .type = QUIRK_COMPOSITE,
717 .data = (const snd_usb_audio_quirk_t[]) {
718 {
719 .ifnum = 1,
720 .type = QUIRK_AUDIO_STANDARD_INTERFACE
721 },
722 {
723 .ifnum = 2,
724 .type = QUIRK_AUDIO_STANDARD_INTERFACE
725 },
726 {
727 .ifnum = -1
728 }
729 }
730 }
731},
732{
733 USB_DEVICE(0x0582, 0x0052),
734 .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
735 .vendor_name = "EDIROL",
736 .product_name = "UM-1SX",
737 .ifnum = 0,
738 .type = QUIRK_MIDI_STANDARD_INTERFACE
739 }
740},
741{
742 USB_DEVICE(0x0582, 0x0065),
743 .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
744 .vendor_name = "EDIROL",
745 .product_name = "PCR-1",
746 .ifnum = 0,
747 .type = QUIRK_MIDI_FIXED_ENDPOINT,
748 .data = & (const snd_usb_midi_endpoint_info_t) {
749 .out_cables = 0x0001,
750 .in_cables = 0x0003
751 }
752 }
753},
754{
755 USB_DEVICE_VENDOR_SPEC(0x0582, 0x006a),
756 .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
757 .vendor_name = "Roland",
758 .product_name = "SP-606",
759 .ifnum = 3,
760 .type = QUIRK_MIDI_FIXED_ENDPOINT,
761 .data = & (const snd_usb_midi_endpoint_info_t) {
762 .out_cables = 0x0001,
763 .in_cables = 0x0001
764 }
765 }
766},
767{
768 USB_DEVICE(0x0582, 0x006d),
769 .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
770 .vendor_name = "Roland",
771 .product_name = "FANTOM-X",
772 .ifnum = 0,
773 .type = QUIRK_MIDI_FIXED_ENDPOINT,
774 .data = & (const snd_usb_midi_endpoint_info_t) {
775 .out_cables = 0x0001,
776 .in_cables = 0x0001
777 }
778 }
779},
780{ /*
781 * This quirk is for the "Advanced" modes of the Edirol UA-25.
782 * If the switch is not in an advanced setting, the UA-25 has
783 * ID 0x0582/0x0073 and is standard compliant (no quirks), but
784 * offers only 16-bit PCM at 44.1 kHz and no MIDI.
785 */
786 USB_DEVICE_VENDOR_SPEC(0x0582, 0x0074),
787 .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
788 .vendor_name = "EDIROL",
789 .product_name = "UA-25",
790 .ifnum = QUIRK_ANY_INTERFACE,
791 .type = QUIRK_COMPOSITE,
792 .data = (const snd_usb_audio_quirk_t[]) {
793 {
794 .ifnum = 0,
795 .type = QUIRK_AUDIO_EDIROL_UA700_UA25
796 },
797 {
798 .ifnum = 1,
799 .type = QUIRK_AUDIO_EDIROL_UA700_UA25
800 },
801 {
802 .ifnum = 2,
803 .type = QUIRK_AUDIO_EDIROL_UA700_UA25
804 },
805 {
806 .ifnum = -1
807 }
808 }
809 }
810},
811{
812 USB_DEVICE(0x0582, 0x0075),
813 .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
814 .vendor_name = "BOSS",
815 .product_name = "DR-880",
816 .ifnum = 0,
817 .type = QUIRK_MIDI_FIXED_ENDPOINT,
818 .data = & (const snd_usb_midi_endpoint_info_t) {
819 .out_cables = 0x0001,
820 .in_cables = 0x0001
821 }
822 }
823},
824
825/* Midiman/M-Audio devices */
826{
827 USB_DEVICE_VENDOR_SPEC(0x0763, 0x1002),
828 .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
829 .vendor_name = "M-Audio",
830 .product_name = "MidiSport 2x2",
831 .ifnum = QUIRK_ANY_INTERFACE,
832 .type = QUIRK_MIDI_MIDIMAN,
833 .data = & (const snd_usb_midi_endpoint_info_t) {
834 .out_cables = 0x0003,
835 .in_cables = 0x0003
836 }
837 }
838},
839{
840 USB_DEVICE_VENDOR_SPEC(0x0763, 0x1011),
841 .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
842 .vendor_name = "M-Audio",
843 .product_name = "MidiSport 1x1",
844 .ifnum = QUIRK_ANY_INTERFACE,
845 .type = QUIRK_MIDI_MIDIMAN,
846 .data = & (const snd_usb_midi_endpoint_info_t) {
847 .out_cables = 0x0001,
848 .in_cables = 0x0001
849 }
850 }
851},
852{
853 USB_DEVICE_VENDOR_SPEC(0x0763, 0x1015),
854 .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
855 .vendor_name = "M-Audio",
856 .product_name = "Keystation",
857 .ifnum = QUIRK_ANY_INTERFACE,
858 .type = QUIRK_MIDI_MIDIMAN,
859 .data = & (const snd_usb_midi_endpoint_info_t) {
860 .out_cables = 0x0001,
861 .in_cables = 0x0001
862 }
863 }
864},
865{
866 USB_DEVICE_VENDOR_SPEC(0x0763, 0x1021),
867 .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
868 .vendor_name = "M-Audio",
869 .product_name = "MidiSport 4x4",
870 .ifnum = QUIRK_ANY_INTERFACE,
871 .type = QUIRK_MIDI_MIDIMAN,
872 .data = & (const snd_usb_midi_endpoint_info_t) {
873 .out_cables = 0x000f,
874 .in_cables = 0x000f
875 }
876 }
877},
878{
879 /*
880 * For hardware revision 1.05; in the later revisions (1.10 and
881 * 1.21), 0x1031 is the ID for the device without firmware.
882 * Thanks to Olaf Giesbrecht <Olaf_Giesbrecht@yahoo.de>
883 */
884 USB_DEVICE_VER(0x0763, 0x1031, 0x0100, 0x0109),
885 .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
886 .vendor_name = "M-Audio",
887 .product_name = "MidiSport 8x8",
888 .ifnum = QUIRK_ANY_INTERFACE,
889 .type = QUIRK_MIDI_MIDIMAN,
890 .data = & (const snd_usb_midi_endpoint_info_t) {
891 .out_cables = 0x01ff,
892 .in_cables = 0x01ff
893 }
894 }
895},
896{
897 USB_DEVICE_VENDOR_SPEC(0x0763, 0x1033),
898 .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
899 .vendor_name = "M-Audio",
900 .product_name = "MidiSport 8x8",
901 .ifnum = QUIRK_ANY_INTERFACE,
902 .type = QUIRK_MIDI_MIDIMAN,
903 .data = & (const snd_usb_midi_endpoint_info_t) {
904 .out_cables = 0x01ff,
905 .in_cables = 0x01ff
906 }
907 }
908},
909{
910 USB_DEVICE_VENDOR_SPEC(0x0763, 0x1041),
911 .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
912 .vendor_name = "M-Audio",
913 .product_name = "MidiSport 2x4",
914 .ifnum = QUIRK_ANY_INTERFACE,
915 .type = QUIRK_MIDI_MIDIMAN,
916 .data = & (const snd_usb_midi_endpoint_info_t) {
917 .out_cables = 0x000f,
918 .in_cables = 0x0003
919 }
920 }
921},
922{
923 USB_DEVICE_VENDOR_SPEC(0x0763, 0x2001),
924 .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
925 .vendor_name = "M-Audio",
926 .product_name = "Quattro",
927 .ifnum = QUIRK_ANY_INTERFACE,
928 .type = QUIRK_COMPOSITE,
929 .data = & (const snd_usb_audio_quirk_t[]) {
930 /*
931 * Interfaces 0-2 are "Windows-compatible", 16-bit only,
932 * and share endpoints with the other interfaces.
933 * Ignore them. The other interfaces can do 24 bits,
934 * but captured samples are big-endian (see usbaudio.c).
935 */
936 {
937 .ifnum = 0,
938 .type = QUIRK_IGNORE_INTERFACE
939 },
940 {
941 .ifnum = 1,
942 .type = QUIRK_IGNORE_INTERFACE
943 },
944 {
945 .ifnum = 2,
946 .type = QUIRK_IGNORE_INTERFACE
947 },
948 {
949 .ifnum = 3,
950 .type = QUIRK_IGNORE_INTERFACE
951 },
952 {
953 .ifnum = 4,
954 .type = QUIRK_AUDIO_STANDARD_INTERFACE
955 },
956 {
957 .ifnum = 5,
958 .type = QUIRK_AUDIO_STANDARD_INTERFACE
959 },
960 {
961 .ifnum = 6,
962 .type = QUIRK_IGNORE_INTERFACE
963 },
964 {
965 .ifnum = 7,
966 .type = QUIRK_AUDIO_STANDARD_INTERFACE
967 },
968 {
969 .ifnum = 8,
970 .type = QUIRK_AUDIO_STANDARD_INTERFACE
971 },
972 {
973 .ifnum = 9,
974 .type = QUIRK_MIDI_MIDIMAN,
975 .data = & (const snd_usb_midi_endpoint_info_t) {
976 .out_cables = 0x0001,
977 .in_cables = 0x0001
978 }
979 },
980 {
981 .ifnum = -1
982 }
983 }
984 }
985},
986{
987 USB_DEVICE_VENDOR_SPEC(0x0763, 0x2003),
988 .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
989 .vendor_name = "M-Audio",
990 .product_name = "AudioPhile",
991 .ifnum = 6,
992 .type = QUIRK_MIDI_MIDIMAN,
993 .data = & (const snd_usb_midi_endpoint_info_t) {
994 .out_cables = 0x0001,
995 .in_cables = 0x0001
996 }
997 }
998},
999{
1000 USB_DEVICE_VENDOR_SPEC(0x0763, 0x2008),
1001 .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
1002 .vendor_name = "M-Audio",
1003 .product_name = "Ozone",
1004 .ifnum = 3,
1005 .type = QUIRK_MIDI_MIDIMAN,
1006 .data = & (const snd_usb_midi_endpoint_info_t) {
1007 .out_cables = 0x0001,
1008 .in_cables = 0x0001
1009 }
1010 }
1011},
1012{
1013 USB_DEVICE_VENDOR_SPEC(0x0763, 0x200d),
1014 .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
1015 .vendor_name = "M-Audio",
1016 .product_name = "OmniStudio",
1017 .ifnum = QUIRK_ANY_INTERFACE,
1018 .type = QUIRK_COMPOSITE,
1019 .data = & (const snd_usb_audio_quirk_t[]) {
1020 {
1021 .ifnum = 0,
1022 .type = QUIRK_IGNORE_INTERFACE
1023 },
1024 {
1025 .ifnum = 1,
1026 .type = QUIRK_IGNORE_INTERFACE
1027 },
1028 {
1029 .ifnum = 2,
1030 .type = QUIRK_IGNORE_INTERFACE
1031 },
1032 {
1033 .ifnum = 3,
1034 .type = QUIRK_IGNORE_INTERFACE
1035 },
1036 {
1037 .ifnum = 4,
1038 .type = QUIRK_AUDIO_STANDARD_INTERFACE
1039 },
1040 {
1041 .ifnum = 5,
1042 .type = QUIRK_AUDIO_STANDARD_INTERFACE
1043 },
1044 {
1045 .ifnum = 6,
1046 .type = QUIRK_IGNORE_INTERFACE
1047 },
1048 {
1049 .ifnum = 7,
1050 .type = QUIRK_AUDIO_STANDARD_INTERFACE
1051 },
1052 {
1053 .ifnum = 8,
1054 .type = QUIRK_AUDIO_STANDARD_INTERFACE
1055 },
1056 {
1057 .ifnum = 9,
1058 .type = QUIRK_MIDI_MIDIMAN,
1059 .data = & (const snd_usb_midi_endpoint_info_t) {
1060 .out_cables = 0x0001,
1061 .in_cables = 0x0001
1062 }
1063 },
1064 {
1065 .ifnum = -1
1066 }
1067 }
1068 }
1069},
1070
1071/* Mark of the Unicorn devices */
1072{
1073 /* thanks to Robert A. Lerche <ral 'at' msbit.com> */
1074 USB_DEVICE(0x07fd, 0x0001),
1075 .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
1076 .vendor_name = "MOTU",
1077 .product_name = "Fastlane",
1078 .ifnum = QUIRK_ANY_INTERFACE,
1079 .type = QUIRK_COMPOSITE,
1080 .data = & (const snd_usb_audio_quirk_t[]) {
1081 {
1082 .ifnum = 0,
1083 .type = QUIRK_MIDI_MOTU
1084 },
1085 {
1086 .ifnum = 1,
1087 .type = QUIRK_IGNORE_INTERFACE
1088 },
1089 {
1090 .ifnum = -1
1091 }
1092 }
1093 }
1094},
1095
1096{
1097 /* Creative Sound Blaster MP3+ */
1098 USB_DEVICE(0x041e, 0x3010),
1099 .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
1100 .vendor_name = "Creative Labs",
1101 .product_name = "Sound Blaster MP3+",
1102 .ifnum = QUIRK_NO_INTERFACE
1103 }
1104
1105},
1106
1107/* Emagic devices */
1108{
1109 USB_DEVICE(0x086a, 0x0001),
1110 .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
1111 .vendor_name = "Emagic",
1112 /* .product_name = "Unitor8", */
1113 .ifnum = 2,
1114 .type = QUIRK_MIDI_EMAGIC,
1115 .data = & (const snd_usb_midi_endpoint_info_t) {
1116 .out_cables = 0x80ff,
1117 .in_cables = 0x80ff
1118 }
1119 }
1120},
1121{
1122 USB_DEVICE(0x086a, 0x0002),
1123 .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
1124 .vendor_name = "Emagic",
1125 /* .product_name = "AMT8", */
1126 .ifnum = 2,
1127 .type = QUIRK_MIDI_EMAGIC,
1128 .data = & (const snd_usb_midi_endpoint_info_t) {
1129 .out_cables = 0x80ff,
1130 .in_cables = 0x80ff
1131 }
1132 }
1133},
1134{
1135 USB_DEVICE(0x086a, 0x0003),
1136 .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
1137 .vendor_name = "Emagic",
1138 /* .product_name = "MT4", */
1139 .ifnum = 2,
1140 .type = QUIRK_MIDI_EMAGIC,
1141 .data = & (const snd_usb_midi_endpoint_info_t) {
1142 .out_cables = 0x800f,
1143 .in_cables = 0x8003
1144 }
1145 }
1146},
1147
1148{
1149 USB_DEVICE_VENDOR_SPEC(0x0ccd, 0x0013),
1150 .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
1151 .vendor_name = "Terratec",
1152 .product_name = "PHASE 26",
1153 .ifnum = 3,
1154 .type = QUIRK_MIDI_STANDARD_INTERFACE
1155 }
1156},
1157
1158/* Novation EMS devices */
1159{
1160 USB_DEVICE_VENDOR_SPEC(0x1235, 0x0001),
1161 .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
1162 .vendor_name = "Novation",
1163 .product_name = "ReMOTE Audio/XStation",
1164 .ifnum = 4,
1165 .type = QUIRK_MIDI_NOVATION
1166 }
1167},
1168{
1169 USB_DEVICE_VENDOR_SPEC(0x1235, 0x0002),
1170 .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
1171 .vendor_name = "Novation",
1172 .product_name = "Speedio",
1173 .ifnum = 3,
1174 .type = QUIRK_MIDI_NOVATION
1175 }
1176},
1177{
1178 USB_DEVICE_VENDOR_SPEC(0x1235, 0x4661),
1179 .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
1180 .vendor_name = "Novation",
1181 .product_name = "ReMOTE25",
1182 .ifnum = 0,
1183 .type = QUIRK_MIDI_NOVATION
1184 }
1185},
1186
1187{
1188 /*
1189 * Some USB MIDI devices don't have an audio control interface,
1190 * so we have to grab MIDI streaming interfaces here.
1191 */
1192 .match_flags = USB_DEVICE_ID_MATCH_INT_CLASS |
1193 USB_DEVICE_ID_MATCH_INT_SUBCLASS,
1194 .bInterfaceClass = USB_CLASS_AUDIO,
1195 .bInterfaceSubClass = USB_SUBCLASS_MIDI_STREAMING,
1196 .driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
1197 .ifnum = QUIRK_ANY_INTERFACE,
1198 .type = QUIRK_MIDI_STANDARD_INTERFACE
1199 }
1200},
1201
1202#undef USB_DEVICE_VENDOR_SPEC