blob: 32de6c3f4ddd451795f8a5d66b2e5d8c248cdcc2 [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/*
Daniel Drakea9121452007-05-07 09:27:05 +020043 * Logitech QuickCam: bDeviceClass is vendor-specific, so generic interface
44 * class matches do not take effect without an explicit ID match.
45 */
46{
47 .match_flags = USB_DEVICE_ID_MATCH_DEVICE |
48 USB_DEVICE_ID_MATCH_INT_CLASS |
49 USB_DEVICE_ID_MATCH_INT_SUBCLASS,
50 .idVendor = 0x046d,
Daniel Draked4170452007-05-10 08:52:19 +020051 .idProduct = 0x0850,
52 .bInterfaceClass = USB_CLASS_AUDIO,
53 .bInterfaceSubClass = USB_SUBCLASS_AUDIO_CONTROL
54},
55{
56 .match_flags = USB_DEVICE_ID_MATCH_DEVICE |
57 USB_DEVICE_ID_MATCH_INT_CLASS |
58 USB_DEVICE_ID_MATCH_INT_SUBCLASS,
59 .idVendor = 0x046d,
George Shapovalovc34532d2007-07-09 10:42:35 +020060 .idProduct = 0x08ae,
61 .bInterfaceClass = USB_CLASS_AUDIO,
62 .bInterfaceSubClass = USB_SUBCLASS_AUDIO_CONTROL
63},
64{
65 .match_flags = USB_DEVICE_ID_MATCH_DEVICE |
66 USB_DEVICE_ID_MATCH_INT_CLASS |
67 USB_DEVICE_ID_MATCH_INT_SUBCLASS,
68 .idVendor = 0x046d,
Ritesh Raj Sarrafcfc24ec2007-07-10 13:03:57 +020069 .idProduct = 0x08c6,
70 .bInterfaceClass = USB_CLASS_AUDIO,
71 .bInterfaceSubClass = USB_SUBCLASS_AUDIO_CONTROL
72},
73{
74 .match_flags = USB_DEVICE_ID_MATCH_DEVICE |
75 USB_DEVICE_ID_MATCH_INT_CLASS |
76 USB_DEVICE_ID_MATCH_INT_SUBCLASS,
77 .idVendor = 0x046d,
Daniel Drake500bec32007-05-10 08:52:19 +020078 .idProduct = 0x0850,
79 .bInterfaceClass = USB_CLASS_AUDIO,
80 .bInterfaceSubClass = USB_SUBCLASS_AUDIO_CONTROL
81},
82{
83 .match_flags = USB_DEVICE_ID_MATCH_DEVICE |
84 USB_DEVICE_ID_MATCH_INT_CLASS |
85 USB_DEVICE_ID_MATCH_INT_SUBCLASS,
86 .idVendor = 0x046d,
Daniel Drakea9121452007-05-07 09:27:05 +020087 .idProduct = 0x08f0,
88 .bInterfaceClass = USB_CLASS_AUDIO,
89 .bInterfaceSubClass = USB_SUBCLASS_AUDIO_CONTROL
90},
91{
92 .match_flags = USB_DEVICE_ID_MATCH_DEVICE |
93 USB_DEVICE_ID_MATCH_INT_CLASS |
94 USB_DEVICE_ID_MATCH_INT_SUBCLASS,
95 .idVendor = 0x046d,
96 .idProduct = 0x08f6,
97 .bInterfaceClass = USB_CLASS_AUDIO,
98 .bInterfaceSubClass = USB_SUBCLASS_AUDIO_CONTROL
99},
100
101/*
Linus Torvalds1da177e2005-04-16 15:20:36 -0700102 * Yamaha devices
103 */
104
105#define YAMAHA_DEVICE(id, name) { \
106 USB_DEVICE(0x0499, id), \
Takashi Iwai86e07d32005-11-17 15:08:02 +0100107 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { \
Linus Torvalds1da177e2005-04-16 15:20:36 -0700108 .vendor_name = "Yamaha", \
109 .product_name = name, \
110 .ifnum = QUIRK_ANY_INTERFACE, \
111 .type = QUIRK_MIDI_YAMAHA \
112 } \
113}
114#define YAMAHA_INTERFACE(id, intf, name) { \
115 USB_DEVICE_VENDOR_SPEC(0x0499, id), \
Takashi Iwai86e07d32005-11-17 15:08:02 +0100116 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { \
Linus Torvalds1da177e2005-04-16 15:20:36 -0700117 .vendor_name = "Yamaha", \
118 .product_name = name, \
119 .ifnum = intf, \
120 .type = QUIRK_MIDI_YAMAHA \
121 } \
122}
123YAMAHA_DEVICE(0x1000, "UX256"),
124YAMAHA_DEVICE(0x1001, "MU1000"),
125YAMAHA_DEVICE(0x1002, "MU2000"),
126YAMAHA_DEVICE(0x1003, "MU500"),
127YAMAHA_INTERFACE(0x1004, 3, "UW500"),
128YAMAHA_DEVICE(0x1005, "MOTIF6"),
129YAMAHA_DEVICE(0x1006, "MOTIF7"),
130YAMAHA_DEVICE(0x1007, "MOTIF8"),
131YAMAHA_DEVICE(0x1008, "UX96"),
132YAMAHA_DEVICE(0x1009, "UX16"),
133YAMAHA_INTERFACE(0x100a, 3, "EOS BX"),
134YAMAHA_DEVICE(0x100c, "UC-MX"),
135YAMAHA_DEVICE(0x100d, "UC-KX"),
136YAMAHA_DEVICE(0x100e, "S08"),
137YAMAHA_DEVICE(0x100f, "CLP-150"),
138YAMAHA_DEVICE(0x1010, "CLP-170"),
139YAMAHA_DEVICE(0x1011, "P-250"),
140YAMAHA_DEVICE(0x1012, "TYROS"),
141YAMAHA_DEVICE(0x1013, "PF-500"),
142YAMAHA_DEVICE(0x1014, "S90"),
143YAMAHA_DEVICE(0x1015, "MOTIF-R"),
Clemens Ladisch4ccb4a42006-03-15 12:24:19 +0100144YAMAHA_DEVICE(0x1016, "MDP-5"),
Linus Torvalds1da177e2005-04-16 15:20:36 -0700145YAMAHA_DEVICE(0x1017, "CVP-204"),
146YAMAHA_DEVICE(0x1018, "CVP-206"),
147YAMAHA_DEVICE(0x1019, "CVP-208"),
148YAMAHA_DEVICE(0x101a, "CVP-210"),
149YAMAHA_DEVICE(0x101b, "PSR-1100"),
150YAMAHA_DEVICE(0x101c, "PSR-2100"),
151YAMAHA_DEVICE(0x101d, "CLP-175"),
152YAMAHA_DEVICE(0x101e, "PSR-K1"),
Clemens Ladisch4ccb4a42006-03-15 12:24:19 +0100153YAMAHA_DEVICE(0x101f, "EZ-J24"),
Linus Torvalds1da177e2005-04-16 15:20:36 -0700154YAMAHA_DEVICE(0x1020, "EZ-250i"),
155YAMAHA_DEVICE(0x1021, "MOTIF ES 6"),
156YAMAHA_DEVICE(0x1022, "MOTIF ES 7"),
157YAMAHA_DEVICE(0x1023, "MOTIF ES 8"),
158YAMAHA_DEVICE(0x1024, "CVP-301"),
159YAMAHA_DEVICE(0x1025, "CVP-303"),
160YAMAHA_DEVICE(0x1026, "CVP-305"),
161YAMAHA_DEVICE(0x1027, "CVP-307"),
162YAMAHA_DEVICE(0x1028, "CVP-309"),
163YAMAHA_DEVICE(0x1029, "CVP-309GP"),
164YAMAHA_DEVICE(0x102a, "PSR-1500"),
165YAMAHA_DEVICE(0x102b, "PSR-3000"),
166YAMAHA_DEVICE(0x102e, "ELS-01/01C"),
167YAMAHA_DEVICE(0x1030, "PSR-295/293"),
168YAMAHA_DEVICE(0x1031, "DGX-205/203"),
169YAMAHA_DEVICE(0x1032, "DGX-305"),
170YAMAHA_DEVICE(0x1033, "DGX-505"),
171YAMAHA_DEVICE(0x1034, NULL),
172YAMAHA_DEVICE(0x1035, NULL),
173YAMAHA_DEVICE(0x1036, NULL),
174YAMAHA_DEVICE(0x1037, NULL),
175YAMAHA_DEVICE(0x1038, NULL),
176YAMAHA_DEVICE(0x1039, NULL),
177YAMAHA_DEVICE(0x103a, NULL),
178YAMAHA_DEVICE(0x103b, NULL),
179YAMAHA_DEVICE(0x103c, NULL),
Clemens Ladisch0ac2ac02005-07-01 16:19:39 +0200180YAMAHA_DEVICE(0x103d, NULL),
Clemens Ladischf542fda2005-09-20 09:06:36 +0200181YAMAHA_DEVICE(0x103e, NULL),
182YAMAHA_DEVICE(0x103f, NULL),
183YAMAHA_DEVICE(0x1040, NULL),
184YAMAHA_DEVICE(0x1041, NULL),
Clemens Ladischf1265392006-07-21 10:46:18 +0200185YAMAHA_DEVICE(0x1042, NULL),
186YAMAHA_DEVICE(0x1043, NULL),
187YAMAHA_DEVICE(0x1044, NULL),
188YAMAHA_DEVICE(0x1045, NULL),
Linus Torvalds1da177e2005-04-16 15:20:36 -0700189YAMAHA_DEVICE(0x2000, "DGP-7"),
190YAMAHA_DEVICE(0x2001, "DGP-5"),
191YAMAHA_DEVICE(0x2002, NULL),
192YAMAHA_DEVICE(0x5000, "CS1D"),
193YAMAHA_DEVICE(0x5001, "DSP1D"),
194YAMAHA_DEVICE(0x5002, "DME32"),
195YAMAHA_DEVICE(0x5003, "DM2000"),
196YAMAHA_DEVICE(0x5004, "02R96"),
197YAMAHA_DEVICE(0x5005, "ACU16-C"),
198YAMAHA_DEVICE(0x5006, "NHB32-C"),
199YAMAHA_DEVICE(0x5007, "DM1000"),
200YAMAHA_DEVICE(0x5008, "01V96"),
201YAMAHA_DEVICE(0x5009, "SPX2000"),
202YAMAHA_DEVICE(0x500a, "PM5D"),
203YAMAHA_DEVICE(0x500b, "DME64N"),
204YAMAHA_DEVICE(0x500c, "DME24N"),
205YAMAHA_DEVICE(0x500d, NULL),
206YAMAHA_DEVICE(0x500e, NULL),
Clemens Ladischf1265392006-07-21 10:46:18 +0200207YAMAHA_DEVICE(0x500f, NULL),
Linus Torvalds1da177e2005-04-16 15:20:36 -0700208YAMAHA_DEVICE(0x7000, "DTX"),
209YAMAHA_DEVICE(0x7010, "UB99"),
210#undef YAMAHA_DEVICE
211#undef YAMAHA_INTERFACE
212
213/*
214 * Roland/RolandED/Edirol/BOSS devices
215 */
216{
217 USB_DEVICE(0x0582, 0x0000),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100218 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700219 .vendor_name = "Roland",
220 .product_name = "UA-100",
221 .ifnum = QUIRK_ANY_INTERFACE,
222 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100223 .data = (const struct snd_usb_audio_quirk[]) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700224 {
225 .ifnum = 0,
226 .type = QUIRK_AUDIO_FIXED_ENDPOINT,
227 .data = & (const struct audioformat) {
228 .format = SNDRV_PCM_FORMAT_S16_LE,
229 .channels = 4,
230 .iface = 0,
231 .altsetting = 1,
232 .altset_idx = 1,
233 .attributes = 0,
234 .endpoint = 0x01,
235 .ep_attr = 0x09,
236 .rates = SNDRV_PCM_RATE_CONTINUOUS,
237 .rate_min = 44100,
238 .rate_max = 44100,
239 }
240 },
241 {
242 .ifnum = 1,
243 .type = QUIRK_AUDIO_FIXED_ENDPOINT,
244 .data = & (const struct audioformat) {
245 .format = SNDRV_PCM_FORMAT_S16_LE,
246 .channels = 2,
247 .iface = 1,
248 .altsetting = 1,
249 .altset_idx = 1,
250 .attributes = EP_CS_ATTR_FILL_MAX,
251 .endpoint = 0x81,
252 .ep_attr = 0x05,
253 .rates = SNDRV_PCM_RATE_CONTINUOUS,
254 .rate_min = 44100,
255 .rate_max = 44100,
256 }
257 },
258 {
259 .ifnum = 2,
260 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100261 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700262 .out_cables = 0x0007,
263 .in_cables = 0x0007
264 }
265 },
266 {
267 .ifnum = -1
268 }
269 }
270 }
271},
272{
273 USB_DEVICE(0x0582, 0x0002),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100274 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700275 .vendor_name = "EDIROL",
276 .product_name = "UM-4",
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200277 .ifnum = QUIRK_ANY_INTERFACE,
278 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100279 .data = (const struct snd_usb_audio_quirk[]) {
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200280 {
281 .ifnum = 0,
282 .type = QUIRK_IGNORE_INTERFACE
283 },
284 {
285 .ifnum = 1,
286 .type = QUIRK_IGNORE_INTERFACE
287 },
288 {
289 .ifnum = 2,
290 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100291 .data = & (const struct snd_usb_midi_endpoint_info) {
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200292 .out_cables = 0x000f,
293 .in_cables = 0x000f
294 }
295 },
296 {
297 .ifnum = -1
298 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700299 }
300 }
301},
302{
303 USB_DEVICE(0x0582, 0x0003),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100304 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700305 .vendor_name = "Roland",
306 .product_name = "SC-8850",
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200307 .ifnum = QUIRK_ANY_INTERFACE,
308 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100309 .data = (const struct snd_usb_audio_quirk[]) {
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200310 {
311 .ifnum = 0,
312 .type = QUIRK_IGNORE_INTERFACE
313 },
314 {
315 .ifnum = 1,
316 .type = QUIRK_IGNORE_INTERFACE
317 },
318 {
319 .ifnum = 2,
320 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100321 .data = & (const struct snd_usb_midi_endpoint_info) {
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200322 .out_cables = 0x003f,
323 .in_cables = 0x003f
324 }
325 },
326 {
327 .ifnum = -1
328 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700329 }
330 }
331},
332{
333 USB_DEVICE(0x0582, 0x0004),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100334 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700335 .vendor_name = "Roland",
336 .product_name = "U-8",
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200337 .ifnum = QUIRK_ANY_INTERFACE,
338 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100339 .data = (const struct snd_usb_audio_quirk[]) {
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200340 {
341 .ifnum = 0,
342 .type = QUIRK_IGNORE_INTERFACE
343 },
344 {
345 .ifnum = 1,
346 .type = QUIRK_IGNORE_INTERFACE
347 },
348 {
349 .ifnum = 2,
350 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100351 .data = & (const struct snd_usb_midi_endpoint_info) {
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200352 .out_cables = 0x0005,
353 .in_cables = 0x0005
354 }
355 },
356 {
357 .ifnum = -1
358 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700359 }
360 }
361},
362{
Clemens Ladisch119c4ff2006-01-19 08:25:19 +0100363 /* Has ID 0x0099 when not in "Advanced Driver" mode.
364 * The UM-2EX has only one input, but we cannot detect this. */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700365 USB_DEVICE(0x0582, 0x0005),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100366 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700367 .vendor_name = "EDIROL",
368 .product_name = "UM-2",
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200369 .ifnum = QUIRK_ANY_INTERFACE,
370 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100371 .data = (const struct snd_usb_audio_quirk[]) {
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200372 {
373 .ifnum = 0,
374 .type = QUIRK_IGNORE_INTERFACE
375 },
376 {
377 .ifnum = 1,
378 .type = QUIRK_IGNORE_INTERFACE
379 },
380 {
381 .ifnum = 2,
382 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100383 .data = & (const struct snd_usb_midi_endpoint_info) {
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200384 .out_cables = 0x0003,
385 .in_cables = 0x0003
386 }
387 },
388 {
389 .ifnum = -1
390 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700391 }
392 }
393},
394{
395 USB_DEVICE(0x0582, 0x0007),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100396 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700397 .vendor_name = "Roland",
398 .product_name = "SC-8820",
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200399 .ifnum = QUIRK_ANY_INTERFACE,
400 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100401 .data = (const struct snd_usb_audio_quirk[]) {
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200402 {
403 .ifnum = 0,
404 .type = QUIRK_IGNORE_INTERFACE
405 },
406 {
407 .ifnum = 1,
408 .type = QUIRK_IGNORE_INTERFACE
409 },
410 {
411 .ifnum = 2,
412 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100413 .data = & (const struct snd_usb_midi_endpoint_info) {
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200414 .out_cables = 0x0013,
415 .in_cables = 0x0013
416 }
417 },
418 {
419 .ifnum = -1
420 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700421 }
422 }
423},
424{
425 USB_DEVICE(0x0582, 0x0008),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100426 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700427 .vendor_name = "Roland",
428 .product_name = "PC-300",
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200429 .ifnum = QUIRK_ANY_INTERFACE,
430 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100431 .data = (const struct snd_usb_audio_quirk[]) {
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200432 {
433 .ifnum = 0,
434 .type = QUIRK_IGNORE_INTERFACE
435 },
436 {
437 .ifnum = 1,
438 .type = QUIRK_IGNORE_INTERFACE
439 },
440 {
441 .ifnum = 2,
442 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100443 .data = & (const struct snd_usb_midi_endpoint_info) {
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200444 .out_cables = 0x0001,
445 .in_cables = 0x0001
446 }
447 },
448 {
449 .ifnum = -1
450 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700451 }
452 }
453},
454{
Clemens Ladisch119c4ff2006-01-19 08:25:19 +0100455 /* has ID 0x009d when not in "Advanced Driver" mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700456 USB_DEVICE(0x0582, 0x0009),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100457 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700458 .vendor_name = "EDIROL",
459 .product_name = "UM-1",
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200460 .ifnum = QUIRK_ANY_INTERFACE,
461 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100462 .data = (const struct snd_usb_audio_quirk[]) {
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200463 {
464 .ifnum = 0,
465 .type = QUIRK_IGNORE_INTERFACE
466 },
467 {
468 .ifnum = 1,
469 .type = QUIRK_IGNORE_INTERFACE
470 },
471 {
472 .ifnum = 2,
473 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100474 .data = & (const struct snd_usb_midi_endpoint_info) {
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200475 .out_cables = 0x0001,
476 .in_cables = 0x0001
477 }
478 },
479 {
480 .ifnum = -1
481 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700482 }
483 }
484},
485{
486 USB_DEVICE(0x0582, 0x000b),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100487 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700488 .vendor_name = "Roland",
489 .product_name = "SK-500",
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200490 .ifnum = QUIRK_ANY_INTERFACE,
491 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100492 .data = (const struct snd_usb_audio_quirk[]) {
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200493 {
494 .ifnum = 0,
495 .type = QUIRK_IGNORE_INTERFACE
496 },
497 {
498 .ifnum = 1,
499 .type = QUIRK_IGNORE_INTERFACE
500 },
501 {
502 .ifnum = 2,
503 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100504 .data = & (const struct snd_usb_midi_endpoint_info) {
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200505 .out_cables = 0x0013,
506 .in_cables = 0x0013
507 }
508 },
509 {
510 .ifnum = -1
511 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700512 }
513 }
514},
515{
516 /* thanks to Emiliano Grilli <emillo@libero.it>
517 * for helping researching this data */
518 USB_DEVICE(0x0582, 0x000c),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100519 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700520 .vendor_name = "Roland",
521 .product_name = "SC-D70",
522 .ifnum = QUIRK_ANY_INTERFACE,
523 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100524 .data = (const struct snd_usb_audio_quirk[]) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700525 {
526 .ifnum = 0,
527 .type = QUIRK_AUDIO_FIXED_ENDPOINT,
528 .data = & (const struct audioformat) {
529 .format = SNDRV_PCM_FORMAT_S24_3LE,
530 .channels = 2,
531 .iface = 0,
532 .altsetting = 1,
533 .altset_idx = 1,
534 .attributes = 0,
535 .endpoint = 0x01,
536 .ep_attr = 0x01,
537 .rates = SNDRV_PCM_RATE_CONTINUOUS,
538 .rate_min = 44100,
539 .rate_max = 44100,
540 }
541 },
542 {
543 .ifnum = 1,
544 .type = QUIRK_AUDIO_FIXED_ENDPOINT,
545 .data = & (const struct audioformat) {
546 .format = SNDRV_PCM_FORMAT_S24_3LE,
547 .channels = 2,
548 .iface = 1,
549 .altsetting = 1,
550 .altset_idx = 1,
551 .attributes = 0,
552 .endpoint = 0x81,
553 .ep_attr = 0x01,
554 .rates = SNDRV_PCM_RATE_CONTINUOUS,
555 .rate_min = 44100,
556 .rate_max = 44100,
557 }
558 },
559 {
560 .ifnum = 2,
561 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100562 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700563 .out_cables = 0x0007,
564 .in_cables = 0x0007
565 }
566 },
567 {
568 .ifnum = -1
569 }
570 }
571 }
572},
573{ /*
574 * This quirk is for the "Advanced Driver" mode of the Edirol UA-5.
575 * If the advanced mode switch at the back of the unit is off, the
576 * UA-5 has ID 0x0582/0x0011 and is standard compliant (no quirks),
577 * but offers only 16-bit PCM.
578 * In advanced mode, the UA-5 will output S24_3LE samples (two
579 * channels) at the rate indicated on the front switch, including
580 * the 96kHz sample rate.
581 */
582 USB_DEVICE(0x0582, 0x0010),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100583 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700584 .vendor_name = "EDIROL",
585 .product_name = "UA-5",
586 .ifnum = QUIRK_ANY_INTERFACE,
587 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100588 .data = (const struct snd_usb_audio_quirk[]) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700589 {
590 .ifnum = 1,
591 .type = QUIRK_AUDIO_STANDARD_INTERFACE
592 },
593 {
594 .ifnum = 2,
595 .type = QUIRK_AUDIO_STANDARD_INTERFACE
596 },
597 {
598 .ifnum = -1
599 }
600 }
601 }
602},
603{
Clemens Ladischd879f0c2005-09-21 16:33:49 +0200604 /* has ID 0x0013 when not in "Advanced Driver" mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700605 USB_DEVICE(0x0582, 0x0012),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100606 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700607 .vendor_name = "Roland",
608 .product_name = "XV-5050",
609 .ifnum = 0,
610 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100611 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700612 .out_cables = 0x0001,
613 .in_cables = 0x0001
614 }
615 }
616},
617{
Clemens Ladischd879f0c2005-09-21 16:33:49 +0200618 /* has ID 0x0015 when not in "Advanced Driver" mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700619 USB_DEVICE(0x0582, 0x0014),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100620 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700621 .vendor_name = "EDIROL",
622 .product_name = "UM-880",
623 .ifnum = 0,
624 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100625 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700626 .out_cables = 0x01ff,
627 .in_cables = 0x01ff
628 }
629 }
630},
631{
Clemens Ladischd879f0c2005-09-21 16:33:49 +0200632 /* has ID 0x0017 when not in "Advanced Driver" mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700633 USB_DEVICE(0x0582, 0x0016),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100634 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700635 .vendor_name = "EDIROL",
636 .product_name = "SD-90",
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200637 .ifnum = QUIRK_ANY_INTERFACE,
638 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100639 .data = (const struct snd_usb_audio_quirk[]) {
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200640 {
641 .ifnum = 0,
642 .type = QUIRK_IGNORE_INTERFACE
643 },
644 {
645 .ifnum = 1,
646 .type = QUIRK_IGNORE_INTERFACE
647 },
648 {
649 .ifnum = 2,
650 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100651 .data = & (const struct snd_usb_midi_endpoint_info) {
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200652 .out_cables = 0x000f,
653 .in_cables = 0x000f
654 }
655 },
656 {
657 .ifnum = -1
658 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700659 }
660 }
661},
662{
Clemens Ladischd879f0c2005-09-21 16:33:49 +0200663 /* has ID 0x001c when not in "Advanced Driver" mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700664 USB_DEVICE(0x0582, 0x001b),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100665 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700666 .vendor_name = "Roland",
667 .product_name = "MMP-2",
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200668 .ifnum = QUIRK_ANY_INTERFACE,
669 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100670 .data = (const struct snd_usb_audio_quirk[]) {
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200671 {
672 .ifnum = 0,
673 .type = QUIRK_IGNORE_INTERFACE
674 },
675 {
676 .ifnum = 1,
677 .type = QUIRK_IGNORE_INTERFACE
678 },
679 {
680 .ifnum = 2,
681 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100682 .data = & (const struct snd_usb_midi_endpoint_info) {
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200683 .out_cables = 0x0001,
684 .in_cables = 0x0001
685 }
686 },
687 {
688 .ifnum = -1
689 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700690 }
691 }
692},
693{
Clemens Ladischd879f0c2005-09-21 16:33:49 +0200694 /* has ID 0x001e when not in "Advanced Driver" mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700695 USB_DEVICE(0x0582, 0x001d),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100696 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700697 .vendor_name = "Roland",
698 .product_name = "V-SYNTH",
699 .ifnum = 0,
700 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100701 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700702 .out_cables = 0x0001,
703 .in_cables = 0x0001
704 }
705 }
706},
707{
Clemens Ladischd879f0c2005-09-21 16:33:49 +0200708 /* has ID 0x0024 when not in "Advanced Driver" mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700709 USB_DEVICE(0x0582, 0x0023),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100710 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700711 .vendor_name = "EDIROL",
712 .product_name = "UM-550",
713 .ifnum = 0,
714 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100715 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700716 .out_cables = 0x003f,
717 .in_cables = 0x003f
718 }
719 }
720},
721{
722 /*
723 * This quirk is for the "Advanced Driver" mode. If off, the UA-20
724 * has ID 0x0026 and is standard compliant, but has only 16-bit PCM
725 * and no MIDI.
726 */
727 USB_DEVICE(0x0582, 0x0025),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100728 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700729 .vendor_name = "EDIROL",
730 .product_name = "UA-20",
731 .ifnum = QUIRK_ANY_INTERFACE,
732 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100733 .data = (const struct snd_usb_audio_quirk[]) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700734 {
Clemens Ladisch1f14a652005-11-21 16:40:00 +0100735 .ifnum = 0,
736 .type = QUIRK_IGNORE_INTERFACE
737 },
738 {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700739 .ifnum = 1,
Clemens Ladisch1f14a652005-11-21 16:40:00 +0100740 .type = QUIRK_AUDIO_FIXED_ENDPOINT,
741 .data = & (const struct audioformat) {
742 .format = SNDRV_PCM_FORMAT_S24_3LE,
743 .channels = 2,
744 .iface = 1,
745 .altsetting = 1,
746 .altset_idx = 1,
747 .attributes = 0,
748 .endpoint = 0x01,
749 .ep_attr = 0x01,
750 .rates = SNDRV_PCM_RATE_CONTINUOUS,
751 .rate_min = 44100,
752 .rate_max = 44100,
753 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700754 },
755 {
756 .ifnum = 2,
Clemens Ladisch1f14a652005-11-21 16:40:00 +0100757 .type = QUIRK_AUDIO_FIXED_ENDPOINT,
758 .data = & (const struct audioformat) {
759 .format = SNDRV_PCM_FORMAT_S24_3LE,
760 .channels = 2,
761 .iface = 2,
762 .altsetting = 1,
763 .altset_idx = 1,
764 .attributes = 0,
765 .endpoint = 0x82,
766 .ep_attr = 0x01,
767 .rates = SNDRV_PCM_RATE_CONTINUOUS,
768 .rate_min = 44100,
769 .rate_max = 44100,
770 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700771 },
772 {
773 .ifnum = 3,
Clemens Ladisch1f14a652005-11-21 16:40:00 +0100774 .type = QUIRK_MIDI_FIXED_ENDPOINT,
775 .data = & (const struct snd_usb_midi_endpoint_info) {
776 .out_cables = 0x0001,
777 .in_cables = 0x0001
778 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700779 },
780 {
781 .ifnum = -1
782 }
783 }
784 }
785},
786{
Clemens Ladischd879f0c2005-09-21 16:33:49 +0200787 /* has ID 0x0028 when not in "Advanced Driver" mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700788 USB_DEVICE(0x0582, 0x0027),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100789 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700790 .vendor_name = "EDIROL",
791 .product_name = "SD-20",
792 .ifnum = 0,
793 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100794 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700795 .out_cables = 0x0003,
796 .in_cables = 0x0007
797 }
798 }
799},
800{
Clemens Ladischd879f0c2005-09-21 16:33:49 +0200801 /* has ID 0x002a when not in "Advanced Driver" mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700802 USB_DEVICE(0x0582, 0x0029),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100803 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700804 .vendor_name = "EDIROL",
805 .product_name = "SD-80",
806 .ifnum = 0,
807 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100808 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700809 .out_cables = 0x000f,
810 .in_cables = 0x000f
811 }
812 }
813},
814{ /*
815 * This quirk is for the "Advanced" modes of the Edirol UA-700.
816 * If the sample format switch is not in an advanced setting, the
817 * UA-700 has ID 0x0582/0x002c and is standard compliant (no quirks),
818 * but offers only 16-bit PCM and no MIDI.
819 */
820 USB_DEVICE_VENDOR_SPEC(0x0582, 0x002b),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100821 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700822 .vendor_name = "EDIROL",
823 .product_name = "UA-700",
824 .ifnum = QUIRK_ANY_INTERFACE,
825 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100826 .data = (const struct snd_usb_audio_quirk[]) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700827 {
828 .ifnum = 1,
829 .type = QUIRK_AUDIO_EDIROL_UA700_UA25
830 },
831 {
832 .ifnum = 2,
833 .type = QUIRK_AUDIO_EDIROL_UA700_UA25
834 },
835 {
836 .ifnum = 3,
837 .type = QUIRK_AUDIO_EDIROL_UA700_UA25
838 },
839 {
840 .ifnum = -1
841 }
842 }
843 }
844},
845{
Clemens Ladischd879f0c2005-09-21 16:33:49 +0200846 /* has ID 0x002e when not in "Advanced Driver" mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700847 USB_DEVICE(0x0582, 0x002d),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100848 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700849 .vendor_name = "Roland",
850 .product_name = "XV-2020",
851 .ifnum = 0,
852 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100853 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700854 .out_cables = 0x0001,
855 .in_cables = 0x0001
856 }
857 }
858},
859{
Clemens Ladischd879f0c2005-09-21 16:33:49 +0200860 /* has ID 0x0030 when not in "Advanced Driver" mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700861 USB_DEVICE(0x0582, 0x002f),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100862 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700863 .vendor_name = "Roland",
864 .product_name = "VariOS",
865 .ifnum = 0,
866 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100867 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700868 .out_cables = 0x0007,
869 .in_cables = 0x0007
870 }
871 }
872},
873{
Clemens Ladischd879f0c2005-09-21 16:33:49 +0200874 /* has ID 0x0034 when not in "Advanced Driver" mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700875 USB_DEVICE(0x0582, 0x0033),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100876 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700877 .vendor_name = "EDIROL",
878 .product_name = "PCR",
879 .ifnum = 0,
880 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100881 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700882 .out_cables = 0x0003,
883 .in_cables = 0x0007
884 }
885 }
886},
Clemens Ladischd879f0c2005-09-21 16:33:49 +0200887 /* TODO: add Roland M-1000 support */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700888{
Clemens Ladischd879f0c2005-09-21 16:33:49 +0200889 /*
890 * Has ID 0x0038 when not in "Advanced Driver" mode;
891 * later revisions use IDs 0x0054 and 0x00a2.
892 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700893 USB_DEVICE(0x0582, 0x0037),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100894 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700895 .vendor_name = "Roland",
896 .product_name = "Digital Piano",
897 .ifnum = 0,
898 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100899 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700900 .out_cables = 0x0001,
901 .in_cables = 0x0001
902 }
903 }
904},
905{
Clemens Ladisch5af4c832005-04-06 09:47:02 +0200906 /*
907 * This quirk is for the "Advanced Driver" mode. If off, the GS-10
908 * has ID 0x003c and is standard compliant, but has only 16-bit PCM
909 * and no MIDI.
910 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700911 USB_DEVICE_VENDOR_SPEC(0x0582, 0x003b),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100912 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700913 .vendor_name = "BOSS",
914 .product_name = "GS-10",
Clemens Ladisch5af4c832005-04-06 09:47:02 +0200915 .ifnum = QUIRK_ANY_INTERFACE,
916 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100917 .data = & (const struct snd_usb_audio_quirk[]) {
Clemens Ladisch5af4c832005-04-06 09:47:02 +0200918 {
919 .ifnum = 1,
920 .type = QUIRK_AUDIO_STANDARD_INTERFACE
921 },
922 {
923 .ifnum = 2,
924 .type = QUIRK_AUDIO_STANDARD_INTERFACE
925 },
926 {
927 .ifnum = 3,
928 .type = QUIRK_MIDI_STANDARD_INTERFACE
929 },
930 {
931 .ifnum = -1
932 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700933 }
934 }
935},
936{
Clemens Ladischd879f0c2005-09-21 16:33:49 +0200937 /* has ID 0x0041 when not in "Advanced Driver" mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700938 USB_DEVICE(0x0582, 0x0040),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100939 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700940 .vendor_name = "Roland",
941 .product_name = "GI-20",
942 .ifnum = 0,
943 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100944 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700945 .out_cables = 0x0001,
946 .in_cables = 0x0001
947 }
948 }
949},
950{
Clemens Ladischd879f0c2005-09-21 16:33:49 +0200951 /* has ID 0x0043 when not in "Advanced Driver" mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700952 USB_DEVICE(0x0582, 0x0042),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100953 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700954 .vendor_name = "Roland",
955 .product_name = "RS-70",
956 .ifnum = 0,
957 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100958 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700959 .out_cables = 0x0001,
960 .in_cables = 0x0001
961 }
962 }
963},
964{
965 USB_DEVICE(0x0582, 0x0044),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100966 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700967 .vendor_name = "Roland",
968 .product_name = "UA-1000",
969 .ifnum = QUIRK_ANY_INTERFACE,
970 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100971 .data = (const struct snd_usb_audio_quirk[]) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700972 {
973 .ifnum = 1,
974 .type = QUIRK_AUDIO_EDIROL_UA1000
975 },
976 {
977 .ifnum = 2,
978 .type = QUIRK_AUDIO_EDIROL_UA1000
979 },
980 {
981 .ifnum = 3,
982 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100983 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700984 .out_cables = 0x0003,
985 .in_cables = 0x0003
986 }
987 },
988 {
989 .ifnum = -1
990 }
991 }
992 }
993},
994{
Clemens Ladischd879f0c2005-09-21 16:33:49 +0200995 /* has ID 0x004a when not in "Advanced Driver" mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700996 USB_DEVICE(0x0582, 0x0048),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100997 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700998 .vendor_name = "EDIROL",
999 .product_name = "UR-80",
1000 .ifnum = 0,
1001 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001002 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001003 .out_cables = 0x0003,
1004 .in_cables = 0x0007
1005 }
1006 }
1007},
Clemens Ladischd879f0c2005-09-21 16:33:49 +02001008 /* TODO: add Edirol M-100FX support */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001009{
Clemens Ladischf38cc312007-02-09 20:52:55 +01001010 /* has ID 0x004e when not in "Advanced Driver" mode */
1011 USB_DEVICE(0x0582, 0x004c),
1012 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1013 .vendor_name = "EDIROL",
1014 .product_name = "PCR-A",
1015 .ifnum = QUIRK_ANY_INTERFACE,
1016 .type = QUIRK_COMPOSITE,
1017 .data = (const struct snd_usb_audio_quirk[]) {
1018 {
1019 .ifnum = 1,
1020 .type = QUIRK_AUDIO_STANDARD_INTERFACE
1021 },
1022 {
1023 .ifnum = 2,
1024 .type = QUIRK_AUDIO_STANDARD_INTERFACE
1025 },
1026 {
1027 .ifnum = -1
1028 }
1029 }
1030 }
1031},
1032{
Clemens Ladischd879f0c2005-09-21 16:33:49 +02001033 /* has ID 0x004f when not in "Advanced Driver" mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001034 USB_DEVICE(0x0582, 0x004d),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001035 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001036 .vendor_name = "EDIROL",
1037 .product_name = "PCR-A",
1038 .ifnum = 0,
1039 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001040 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001041 .out_cables = 0x0003,
1042 .in_cables = 0x0007
1043 }
1044 }
1045},
1046{
1047 /*
1048 * This quirk is for the "Advanced Driver" mode. If off, the UA-3FX
1049 * is standard compliant, but has only 16-bit PCM.
1050 */
1051 USB_DEVICE(0x0582, 0x0050),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001052 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001053 .vendor_name = "EDIROL",
1054 .product_name = "UA-3FX",
1055 .ifnum = QUIRK_ANY_INTERFACE,
1056 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001057 .data = (const struct snd_usb_audio_quirk[]) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001058 {
1059 .ifnum = 1,
1060 .type = QUIRK_AUDIO_STANDARD_INTERFACE
1061 },
1062 {
1063 .ifnum = 2,
1064 .type = QUIRK_AUDIO_STANDARD_INTERFACE
1065 },
1066 {
1067 .ifnum = -1
1068 }
1069 }
1070 }
1071},
1072{
1073 USB_DEVICE(0x0582, 0x0052),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001074 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001075 .vendor_name = "EDIROL",
1076 .product_name = "UM-1SX",
1077 .ifnum = 0,
1078 .type = QUIRK_MIDI_STANDARD_INTERFACE
1079 }
1080},
Takashi Iwaif1676842007-07-09 10:39:44 +02001081{
1082 USB_DEVICE(0x0582, 0x0060),
1083 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1084 .vendor_name = "Roland",
1085 .product_name = "EXR Series",
1086 .ifnum = 0,
1087 .type = QUIRK_MIDI_STANDARD_INTERFACE
1088 }
1089},
Linus Torvalds1da177e2005-04-16 15:20:36 -07001090{
Clemens Ladischd879f0c2005-09-21 16:33:49 +02001091 /* has ID 0x0067 when not in "Advanced Driver" mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001092 USB_DEVICE(0x0582, 0x0065),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001093 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001094 .vendor_name = "EDIROL",
1095 .product_name = "PCR-1",
1096 .ifnum = 0,
1097 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001098 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001099 .out_cables = 0x0001,
1100 .in_cables = 0x0003
1101 }
1102 }
1103},
1104{
Clemens Ladischd879f0c2005-09-21 16:33:49 +02001105 /* has ID 0x006b when not in "Advanced Driver" mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001106 USB_DEVICE_VENDOR_SPEC(0x0582, 0x006a),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001107 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001108 .vendor_name = "Roland",
1109 .product_name = "SP-606",
1110 .ifnum = 3,
1111 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001112 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001113 .out_cables = 0x0001,
1114 .in_cables = 0x0001
1115 }
1116 }
1117},
1118{
Clemens Ladischd879f0c2005-09-21 16:33:49 +02001119 /* has ID 0x006e when not in "Advanced Driver" mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001120 USB_DEVICE(0x0582, 0x006d),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001121 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001122 .vendor_name = "Roland",
1123 .product_name = "FANTOM-X",
1124 .ifnum = 0,
1125 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001126 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001127 .out_cables = 0x0001,
1128 .in_cables = 0x0001
1129 }
1130 }
1131},
Claudio Matsuoka95093a22007-07-03 20:07:39 +02001132{
1133 USB_DEVICE(0x582, 0x00a6),
1134 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1135 .vendor_name = "Roland",
1136 .product_name = "Juno-G",
1137 .ifnum = 0,
1138 .type = QUIRK_MIDI_FIXED_ENDPOINT,
1139 .data = & (const struct snd_usb_midi_endpoint_info) {
1140 .out_cables = 0x0001,
1141 .in_cables = 0x0001
1142 }
1143 }
1144},
Linus Torvalds1da177e2005-04-16 15:20:36 -07001145{ /*
1146 * This quirk is for the "Advanced" modes of the Edirol UA-25.
1147 * If the switch is not in an advanced setting, the UA-25 has
1148 * ID 0x0582/0x0073 and is standard compliant (no quirks), but
1149 * offers only 16-bit PCM at 44.1 kHz and no MIDI.
1150 */
1151 USB_DEVICE_VENDOR_SPEC(0x0582, 0x0074),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001152 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001153 .vendor_name = "EDIROL",
1154 .product_name = "UA-25",
1155 .ifnum = QUIRK_ANY_INTERFACE,
1156 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001157 .data = (const struct snd_usb_audio_quirk[]) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001158 {
1159 .ifnum = 0,
1160 .type = QUIRK_AUDIO_EDIROL_UA700_UA25
1161 },
1162 {
1163 .ifnum = 1,
1164 .type = QUIRK_AUDIO_EDIROL_UA700_UA25
1165 },
1166 {
1167 .ifnum = 2,
1168 .type = QUIRK_AUDIO_EDIROL_UA700_UA25
1169 },
1170 {
1171 .ifnum = -1
1172 }
1173 }
1174 }
1175},
1176{
Clemens Ladischd879f0c2005-09-21 16:33:49 +02001177 /* has ID 0x0076 when not in "Advanced Driver" mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001178 USB_DEVICE(0x0582, 0x0075),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001179 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001180 .vendor_name = "BOSS",
1181 .product_name = "DR-880",
1182 .ifnum = 0,
1183 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001184 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001185 .out_cables = 0x0001,
1186 .in_cables = 0x0001
1187 }
1188 }
1189},
Clemens Ladisch5a2a68f2005-09-19 12:24:00 +02001190{
Clemens Ladischd879f0c2005-09-21 16:33:49 +02001191 /* has ID 0x007b when not in "Advanced Driver" mode */
Clemens Ladisch5a2a68f2005-09-19 12:24:00 +02001192 USB_DEVICE_VENDOR_SPEC(0x0582, 0x007a),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001193 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Clemens Ladisch5a2a68f2005-09-19 12:24:00 +02001194 .vendor_name = "Roland",
Clemens Ladischd879f0c2005-09-21 16:33:49 +02001195 /* "RD" or "RD-700SX"? */
Clemens Ladisch5a2a68f2005-09-19 12:24:00 +02001196 .ifnum = 0,
1197 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001198 .data = & (const struct snd_usb_midi_endpoint_info) {
Clemens Ladisch5a2a68f2005-09-19 12:24:00 +02001199 .out_cables = 0x0003,
1200 .in_cables = 0x0003
1201 }
1202 }
1203},
Bjoern Fayd0b0fac2007-02-05 12:27:21 +01001204/* Roland UA-101 in High-Speed Mode only */
1205{
1206 USB_DEVICE(0x0582, 0x007d),
1207 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1208 .vendor_name = "Roland",
1209 .product_name = "UA-101",
1210 .ifnum = QUIRK_ANY_INTERFACE,
1211 .type = QUIRK_COMPOSITE,
1212 .data = (const struct snd_usb_audio_quirk[]) {
1213 {
1214 .ifnum = 0,
1215 .type = QUIRK_AUDIO_EDIROL_UA101
1216 },
1217 {
1218 .ifnum = 1,
1219 .type = QUIRK_AUDIO_EDIROL_UA101
1220 },
1221 {
1222 .ifnum = 2,
1223 .type = QUIRK_MIDI_FIXED_ENDPOINT,
1224 .data = & (const struct snd_usb_midi_endpoint_info) {
1225 .out_cables = 0x0001,
1226 .in_cables = 0x0001
1227 }
1228 },
1229 {
1230 .ifnum = -1
1231 }
1232 }
1233 }
1234},
Clemens Ladischcdca8812006-01-18 08:53:32 +01001235{
1236 /* has ID 0x0081 when not in "Advanced Driver" mode */
1237 USB_DEVICE(0x0582, 0x0080),
1238 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1239 .vendor_name = "Roland",
1240 .product_name = "G-70",
1241 .ifnum = 0,
1242 .type = QUIRK_MIDI_FIXED_ENDPOINT,
1243 .data = & (const struct snd_usb_midi_endpoint_info) {
Clemens Ladisch05422572006-01-18 15:44:53 +01001244 .out_cables = 0x0001,
1245 .in_cables = 0x0001
Clemens Ladischcdca8812006-01-18 08:53:32 +01001246 }
1247 }
1248},
Clemens Ladisch7c79b762006-01-10 18:56:23 +01001249 /* TODO: add Roland V-SYNTH XT support */
1250 /* TODO: add BOSS GT-PRO support */
Clemens Ladisch415b09e2006-01-16 08:03:52 +01001251{
1252 /* has ID 0x008c when not in "Advanced Driver" mode */
1253 USB_DEVICE(0x0582, 0x008b),
1254 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1255 .vendor_name = "EDIROL",
1256 .product_name = "PC-50",
1257 .ifnum = 0,
1258 .type = QUIRK_MIDI_FIXED_ENDPOINT,
1259 .data = & (const struct snd_usb_midi_endpoint_info) {
1260 .out_cables = 0x0001,
1261 .in_cables = 0x0001
1262 }
1263 }
1264},
Clemens Ladisch7c79b762006-01-10 18:56:23 +01001265 /* TODO: add Edirol PC-80 support */
1266 /* TODO: add Edirol UA-1EX support */
1267{
1268 USB_DEVICE(0x0582, 0x009a),
1269 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1270 .vendor_name = "EDIROL",
1271 .product_name = "UM-3EX",
1272 .ifnum = 0,
1273 .type = QUIRK_MIDI_FIXED_ENDPOINT,
1274 .data = & (const struct snd_usb_midi_endpoint_info) {
1275 .out_cables = 0x000f,
1276 .in_cables = 0x000f
1277 }
1278 }
1279},
1280 /* TODO: add Edirol MD-P1 support */
Carlo Beccaria87823092007-07-03 08:04:25 +02001281{
1282 /* Roland SH-201 */
1283 USB_DEVICE(0x0582, 0x00ad),
1284 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1285 .vendor_name = "Roland",
1286 .product_name = "SH-201",
1287 .ifnum = QUIRK_ANY_INTERFACE,
1288 .type = QUIRK_COMPOSITE,
1289 .data = (const struct snd_usb_audio_quirk[]) {
1290 {
1291 .ifnum = 0,
1292 .type = QUIRK_AUDIO_STANDARD_INTERFACE
1293 },
1294 {
1295 .ifnum = 1,
1296 .type = QUIRK_AUDIO_STANDARD_INTERFACE
1297 },
1298 {
1299 .ifnum = 2,
1300 .type = QUIRK_MIDI_FIXED_ENDPOINT,
1301 .data = & (const struct snd_usb_midi_endpoint_info) {
1302 .out_cables = 0x0001,
1303 .in_cables = 0x0001
1304 }
1305 },
1306 {
1307 .ifnum = -1
1308 }
1309 }
1310 }
1311},
Linus Torvalds1da177e2005-04-16 15:20:36 -07001312
Clemens Ladischa25f1752005-10-05 13:23:19 +02001313/* Guillemot devices */
1314{
1315 /*
1316 * This is for the "Windows Edition" where the external MIDI ports are
1317 * the only MIDI ports; the control data is reported through HID
1318 * interfaces. The "Macintosh Edition" has ID 0xd002 and uses standard
1319 * compliant USB MIDI ports for external MIDI and controls.
1320 */
1321 USB_DEVICE_VENDOR_SPEC(0x06f8, 0xb000),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001322 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Clemens Ladischa25f1752005-10-05 13:23:19 +02001323 .vendor_name = "Hercules",
1324 .product_name = "DJ Console (WE)",
1325 .ifnum = 4,
1326 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001327 .data = & (const struct snd_usb_midi_endpoint_info) {
Clemens Ladischa25f1752005-10-05 13:23:19 +02001328 .out_cables = 0x0001,
1329 .in_cables = 0x0001
1330 }
1331 }
1332},
1333
Linus Torvalds1da177e2005-04-16 15:20:36 -07001334/* Midiman/M-Audio devices */
1335{
1336 USB_DEVICE_VENDOR_SPEC(0x0763, 0x1002),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001337 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001338 .vendor_name = "M-Audio",
1339 .product_name = "MidiSport 2x2",
1340 .ifnum = QUIRK_ANY_INTERFACE,
1341 .type = QUIRK_MIDI_MIDIMAN,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001342 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001343 .out_cables = 0x0003,
1344 .in_cables = 0x0003
1345 }
1346 }
1347},
1348{
1349 USB_DEVICE_VENDOR_SPEC(0x0763, 0x1011),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001350 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001351 .vendor_name = "M-Audio",
1352 .product_name = "MidiSport 1x1",
1353 .ifnum = QUIRK_ANY_INTERFACE,
1354 .type = QUIRK_MIDI_MIDIMAN,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001355 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001356 .out_cables = 0x0001,
1357 .in_cables = 0x0001
1358 }
1359 }
1360},
1361{
1362 USB_DEVICE_VENDOR_SPEC(0x0763, 0x1015),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001363 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001364 .vendor_name = "M-Audio",
1365 .product_name = "Keystation",
1366 .ifnum = QUIRK_ANY_INTERFACE,
1367 .type = QUIRK_MIDI_MIDIMAN,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001368 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001369 .out_cables = 0x0001,
1370 .in_cables = 0x0001
1371 }
1372 }
1373},
1374{
1375 USB_DEVICE_VENDOR_SPEC(0x0763, 0x1021),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001376 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001377 .vendor_name = "M-Audio",
1378 .product_name = "MidiSport 4x4",
1379 .ifnum = QUIRK_ANY_INTERFACE,
1380 .type = QUIRK_MIDI_MIDIMAN,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001381 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001382 .out_cables = 0x000f,
1383 .in_cables = 0x000f
1384 }
1385 }
1386},
1387{
1388 /*
1389 * For hardware revision 1.05; in the later revisions (1.10 and
1390 * 1.21), 0x1031 is the ID for the device without firmware.
1391 * Thanks to Olaf Giesbrecht <Olaf_Giesbrecht@yahoo.de>
1392 */
1393 USB_DEVICE_VER(0x0763, 0x1031, 0x0100, 0x0109),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001394 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001395 .vendor_name = "M-Audio",
1396 .product_name = "MidiSport 8x8",
1397 .ifnum = QUIRK_ANY_INTERFACE,
1398 .type = QUIRK_MIDI_MIDIMAN,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001399 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001400 .out_cables = 0x01ff,
1401 .in_cables = 0x01ff
1402 }
1403 }
1404},
1405{
1406 USB_DEVICE_VENDOR_SPEC(0x0763, 0x1033),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001407 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001408 .vendor_name = "M-Audio",
1409 .product_name = "MidiSport 8x8",
1410 .ifnum = QUIRK_ANY_INTERFACE,
1411 .type = QUIRK_MIDI_MIDIMAN,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001412 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001413 .out_cables = 0x01ff,
1414 .in_cables = 0x01ff
1415 }
1416 }
1417},
1418{
1419 USB_DEVICE_VENDOR_SPEC(0x0763, 0x1041),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001420 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001421 .vendor_name = "M-Audio",
1422 .product_name = "MidiSport 2x4",
1423 .ifnum = QUIRK_ANY_INTERFACE,
1424 .type = QUIRK_MIDI_MIDIMAN,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001425 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001426 .out_cables = 0x000f,
1427 .in_cables = 0x0003
1428 }
1429 }
1430},
1431{
1432 USB_DEVICE_VENDOR_SPEC(0x0763, 0x2001),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001433 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001434 .vendor_name = "M-Audio",
1435 .product_name = "Quattro",
1436 .ifnum = QUIRK_ANY_INTERFACE,
1437 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001438 .data = & (const struct snd_usb_audio_quirk[]) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001439 /*
1440 * Interfaces 0-2 are "Windows-compatible", 16-bit only,
1441 * and share endpoints with the other interfaces.
1442 * Ignore them. The other interfaces can do 24 bits,
1443 * but captured samples are big-endian (see usbaudio.c).
1444 */
1445 {
1446 .ifnum = 0,
1447 .type = QUIRK_IGNORE_INTERFACE
1448 },
1449 {
1450 .ifnum = 1,
1451 .type = QUIRK_IGNORE_INTERFACE
1452 },
1453 {
1454 .ifnum = 2,
1455 .type = QUIRK_IGNORE_INTERFACE
1456 },
1457 {
1458 .ifnum = 3,
1459 .type = QUIRK_IGNORE_INTERFACE
1460 },
1461 {
1462 .ifnum = 4,
1463 .type = QUIRK_AUDIO_STANDARD_INTERFACE
1464 },
1465 {
1466 .ifnum = 5,
1467 .type = QUIRK_AUDIO_STANDARD_INTERFACE
1468 },
1469 {
1470 .ifnum = 6,
1471 .type = QUIRK_IGNORE_INTERFACE
1472 },
1473 {
1474 .ifnum = 7,
1475 .type = QUIRK_AUDIO_STANDARD_INTERFACE
1476 },
1477 {
1478 .ifnum = 8,
1479 .type = QUIRK_AUDIO_STANDARD_INTERFACE
1480 },
1481 {
1482 .ifnum = 9,
1483 .type = QUIRK_MIDI_MIDIMAN,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001484 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001485 .out_cables = 0x0001,
1486 .in_cables = 0x0001
1487 }
1488 },
1489 {
1490 .ifnum = -1
1491 }
1492 }
1493 }
1494},
1495{
1496 USB_DEVICE_VENDOR_SPEC(0x0763, 0x2003),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001497 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001498 .vendor_name = "M-Audio",
1499 .product_name = "AudioPhile",
1500 .ifnum = 6,
1501 .type = QUIRK_MIDI_MIDIMAN,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001502 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001503 .out_cables = 0x0001,
1504 .in_cables = 0x0001
1505 }
1506 }
1507},
1508{
1509 USB_DEVICE_VENDOR_SPEC(0x0763, 0x2008),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001510 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001511 .vendor_name = "M-Audio",
1512 .product_name = "Ozone",
1513 .ifnum = 3,
1514 .type = QUIRK_MIDI_MIDIMAN,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001515 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001516 .out_cables = 0x0001,
1517 .in_cables = 0x0001
1518 }
1519 }
1520},
1521{
1522 USB_DEVICE_VENDOR_SPEC(0x0763, 0x200d),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001523 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001524 .vendor_name = "M-Audio",
1525 .product_name = "OmniStudio",
1526 .ifnum = QUIRK_ANY_INTERFACE,
1527 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001528 .data = & (const struct snd_usb_audio_quirk[]) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001529 {
1530 .ifnum = 0,
1531 .type = QUIRK_IGNORE_INTERFACE
1532 },
1533 {
1534 .ifnum = 1,
1535 .type = QUIRK_IGNORE_INTERFACE
1536 },
1537 {
1538 .ifnum = 2,
1539 .type = QUIRK_IGNORE_INTERFACE
1540 },
1541 {
1542 .ifnum = 3,
1543 .type = QUIRK_IGNORE_INTERFACE
1544 },
1545 {
1546 .ifnum = 4,
1547 .type = QUIRK_AUDIO_STANDARD_INTERFACE
1548 },
1549 {
1550 .ifnum = 5,
1551 .type = QUIRK_AUDIO_STANDARD_INTERFACE
1552 },
1553 {
1554 .ifnum = 6,
1555 .type = QUIRK_IGNORE_INTERFACE
1556 },
1557 {
1558 .ifnum = 7,
1559 .type = QUIRK_AUDIO_STANDARD_INTERFACE
1560 },
1561 {
1562 .ifnum = 8,
1563 .type = QUIRK_AUDIO_STANDARD_INTERFACE
1564 },
1565 {
1566 .ifnum = 9,
1567 .type = QUIRK_MIDI_MIDIMAN,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001568 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001569 .out_cables = 0x0001,
1570 .in_cables = 0x0001
1571 }
1572 },
1573 {
1574 .ifnum = -1
1575 }
1576 }
1577 }
1578},
1579
Clemens Ladisch0243ef712006-03-09 07:55:55 +01001580/* Casio devices */
1581{
Clemens Ladisch9808dc92006-03-16 08:15:25 +01001582 USB_DEVICE(0x07cf, 0x6801),
1583 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1584 .vendor_name = "Casio",
1585 .product_name = "PL-40R",
1586 .ifnum = 0,
1587 .type = QUIRK_MIDI_YAMAHA
1588 }
1589},
1590{
Clemens Ladisch318d27f2006-03-09 08:17:08 +01001591 /* this ID is used by several devices without a product ID */
Clemens Ladisch0243ef712006-03-09 07:55:55 +01001592 USB_DEVICE(0x07cf, 0x6802),
1593 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1594 .vendor_name = "Casio",
Clemens Ladisch318d27f2006-03-09 08:17:08 +01001595 .product_name = "Keyboard",
Clemens Ladisch0243ef712006-03-09 07:55:55 +01001596 .ifnum = 0,
1597 .type = QUIRK_MIDI_YAMAHA
1598 }
1599},
1600
Linus Torvalds1da177e2005-04-16 15:20:36 -07001601/* Mark of the Unicorn devices */
1602{
1603 /* thanks to Robert A. Lerche <ral 'at' msbit.com> */
Clemens Ladischbbd46152005-07-04 09:21:45 +02001604 .match_flags = USB_DEVICE_ID_MATCH_VENDOR |
1605 USB_DEVICE_ID_MATCH_PRODUCT |
1606 USB_DEVICE_ID_MATCH_DEV_SUBCLASS,
1607 .idVendor = 0x07fd,
1608 .idProduct = 0x0001,
1609 .bDeviceSubClass = 2,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001610 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001611 .vendor_name = "MOTU",
1612 .product_name = "Fastlane",
1613 .ifnum = QUIRK_ANY_INTERFACE,
1614 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001615 .data = & (const struct snd_usb_audio_quirk[]) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001616 {
1617 .ifnum = 0,
Clemens Ladisch6155aff2005-07-04 09:20:42 +02001618 .type = QUIRK_MIDI_RAW
Linus Torvalds1da177e2005-04-16 15:20:36 -07001619 },
1620 {
1621 .ifnum = 1,
1622 .type = QUIRK_IGNORE_INTERFACE
1623 },
1624 {
1625 .ifnum = -1
1626 }
1627 }
1628 }
1629},
1630
1631{
1632 /* Creative Sound Blaster MP3+ */
1633 USB_DEVICE(0x041e, 0x3010),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001634 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001635 .vendor_name = "Creative Labs",
1636 .product_name = "Sound Blaster MP3+",
1637 .ifnum = QUIRK_NO_INTERFACE
1638 }
1639
1640},
1641
1642/* Emagic devices */
1643{
1644 USB_DEVICE(0x086a, 0x0001),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001645 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001646 .vendor_name = "Emagic",
1647 /* .product_name = "Unitor8", */
1648 .ifnum = 2,
1649 .type = QUIRK_MIDI_EMAGIC,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001650 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001651 .out_cables = 0x80ff,
1652 .in_cables = 0x80ff
1653 }
1654 }
1655},
1656{
1657 USB_DEVICE(0x086a, 0x0002),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001658 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001659 .vendor_name = "Emagic",
1660 /* .product_name = "AMT8", */
1661 .ifnum = 2,
1662 .type = QUIRK_MIDI_EMAGIC,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001663 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001664 .out_cables = 0x80ff,
1665 .in_cables = 0x80ff
1666 }
1667 }
1668},
1669{
1670 USB_DEVICE(0x086a, 0x0003),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001671 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001672 .vendor_name = "Emagic",
1673 /* .product_name = "MT4", */
1674 .ifnum = 2,
1675 .type = QUIRK_MIDI_EMAGIC,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001676 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001677 .out_cables = 0x800f,
1678 .in_cables = 0x8003
1679 }
1680 }
1681},
1682
Clemens Ladisch31ab9522005-09-26 08:55:01 +02001683/* TerraTec devices */
1684{
1685 USB_DEVICE_VENDOR_SPEC(0x0ccd, 0x0012),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001686 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Clemens Ladisch31ab9522005-09-26 08:55:01 +02001687 .vendor_name = "TerraTec",
1688 .product_name = "PHASE 26",
1689 .ifnum = 3,
1690 .type = QUIRK_MIDI_STANDARD_INTERFACE
1691 }
1692},
Linus Torvalds1da177e2005-04-16 15:20:36 -07001693{
1694 USB_DEVICE_VENDOR_SPEC(0x0ccd, 0x0013),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001695 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Clemens Ladisch31ab9522005-09-26 08:55:01 +02001696 .vendor_name = "TerraTec",
Linus Torvalds1da177e2005-04-16 15:20:36 -07001697 .product_name = "PHASE 26",
1698 .ifnum = 3,
1699 .type = QUIRK_MIDI_STANDARD_INTERFACE
1700 }
1701},
Clemens Ladischb2b82292006-02-08 12:38:23 +01001702{
Clemens Ladischbc56eff2006-04-13 10:16:08 +02001703 USB_DEVICE_VENDOR_SPEC(0x0ccd, 0x0014),
1704 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1705 .vendor_name = "TerraTec",
1706 .product_name = "PHASE 26",
1707 .ifnum = 3,
1708 .type = QUIRK_MIDI_STANDARD_INTERFACE
1709 }
1710},
1711{
Clemens Ladischb2b82292006-02-08 12:38:23 +01001712 USB_DEVICE(0x0ccd, 0x0035),
1713 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1714 .vendor_name = "Miditech",
1715 .product_name = "Play'n Roll",
1716 .ifnum = 0,
1717 .type = QUIRK_MIDI_CME
1718 }
1719},
Linus Torvalds1da177e2005-04-16 15:20:36 -07001720
1721/* Novation EMS devices */
1722{
1723 USB_DEVICE_VENDOR_SPEC(0x1235, 0x0001),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001724 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001725 .vendor_name = "Novation",
1726 .product_name = "ReMOTE Audio/XStation",
1727 .ifnum = 4,
1728 .type = QUIRK_MIDI_NOVATION
1729 }
1730},
1731{
1732 USB_DEVICE_VENDOR_SPEC(0x1235, 0x0002),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001733 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001734 .vendor_name = "Novation",
1735 .product_name = "Speedio",
1736 .ifnum = 3,
1737 .type = QUIRK_MIDI_NOVATION
1738 }
1739},
1740{
1741 USB_DEVICE_VENDOR_SPEC(0x1235, 0x4661),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001742 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001743 .vendor_name = "Novation",
1744 .product_name = "ReMOTE25",
1745 .ifnum = 0,
1746 .type = QUIRK_MIDI_NOVATION
1747 }
1748},
1749
Clemens Ladischcc7a59b2006-02-07 17:11:06 +01001750/* Miditech devices */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001751{
Clemens Ladischf38275f2005-07-25 16:17:29 +02001752 USB_DEVICE(0x4752, 0x0011),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001753 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Clemens Ladischf38275f2005-07-25 16:17:29 +02001754 .vendor_name = "Miditech",
1755 .product_name = "Midistart-2",
1756 .ifnum = 0,
Clemens Ladischcc7a59b2006-02-07 17:11:06 +01001757 .type = QUIRK_MIDI_CME
Clemens Ladischf38275f2005-07-25 16:17:29 +02001758 }
1759},
Clemens Ladischcc7a59b2006-02-07 17:11:06 +01001760
1761/* Central Music devices */
Clemens Ladischf38275f2005-07-25 16:17:29 +02001762{
Clemens Ladischcc7a59b2006-02-07 17:11:06 +01001763 /* this ID used by both Miditech MidiStudio-2 and CME UF-x */
Clemens Ladischf38275f2005-07-25 16:17:29 +02001764 USB_DEVICE(0x7104, 0x2202),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001765 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Clemens Ladischf38275f2005-07-25 16:17:29 +02001766 .ifnum = 0,
Clemens Ladischcc7a59b2006-02-07 17:11:06 +01001767 .type = QUIRK_MIDI_CME
Clemens Ladischf38275f2005-07-25 16:17:29 +02001768 }
1769},
1770
1771{
Linus Torvalds1da177e2005-04-16 15:20:36 -07001772 /*
1773 * Some USB MIDI devices don't have an audio control interface,
1774 * so we have to grab MIDI streaming interfaces here.
1775 */
1776 .match_flags = USB_DEVICE_ID_MATCH_INT_CLASS |
1777 USB_DEVICE_ID_MATCH_INT_SUBCLASS,
1778 .bInterfaceClass = USB_CLASS_AUDIO,
1779 .bInterfaceSubClass = USB_SUBCLASS_MIDI_STREAMING,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001780 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001781 .ifnum = QUIRK_ANY_INTERFACE,
1782 .type = QUIRK_MIDI_STANDARD_INTERFACE
1783 }
1784},
1785
1786#undef USB_DEVICE_VENDOR_SPEC