blob: 8fcbe93b258927c5ffb45440cc4663ff10548163 [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,
51 .idProduct = 0x08f0,
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,
60 .idProduct = 0x08f6,
61 .bInterfaceClass = USB_CLASS_AUDIO,
62 .bInterfaceSubClass = USB_SUBCLASS_AUDIO_CONTROL
63},
64
65/*
Linus Torvalds1da177e2005-04-16 15:20:36 -070066 * Yamaha devices
67 */
68
69#define YAMAHA_DEVICE(id, name) { \
70 USB_DEVICE(0x0499, id), \
Takashi Iwai86e07d32005-11-17 15:08:02 +010071 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { \
Linus Torvalds1da177e2005-04-16 15:20:36 -070072 .vendor_name = "Yamaha", \
73 .product_name = name, \
74 .ifnum = QUIRK_ANY_INTERFACE, \
75 .type = QUIRK_MIDI_YAMAHA \
76 } \
77}
78#define YAMAHA_INTERFACE(id, intf, name) { \
79 USB_DEVICE_VENDOR_SPEC(0x0499, id), \
Takashi Iwai86e07d32005-11-17 15:08:02 +010080 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { \
Linus Torvalds1da177e2005-04-16 15:20:36 -070081 .vendor_name = "Yamaha", \
82 .product_name = name, \
83 .ifnum = intf, \
84 .type = QUIRK_MIDI_YAMAHA \
85 } \
86}
87YAMAHA_DEVICE(0x1000, "UX256"),
88YAMAHA_DEVICE(0x1001, "MU1000"),
89YAMAHA_DEVICE(0x1002, "MU2000"),
90YAMAHA_DEVICE(0x1003, "MU500"),
91YAMAHA_INTERFACE(0x1004, 3, "UW500"),
92YAMAHA_DEVICE(0x1005, "MOTIF6"),
93YAMAHA_DEVICE(0x1006, "MOTIF7"),
94YAMAHA_DEVICE(0x1007, "MOTIF8"),
95YAMAHA_DEVICE(0x1008, "UX96"),
96YAMAHA_DEVICE(0x1009, "UX16"),
97YAMAHA_INTERFACE(0x100a, 3, "EOS BX"),
98YAMAHA_DEVICE(0x100c, "UC-MX"),
99YAMAHA_DEVICE(0x100d, "UC-KX"),
100YAMAHA_DEVICE(0x100e, "S08"),
101YAMAHA_DEVICE(0x100f, "CLP-150"),
102YAMAHA_DEVICE(0x1010, "CLP-170"),
103YAMAHA_DEVICE(0x1011, "P-250"),
104YAMAHA_DEVICE(0x1012, "TYROS"),
105YAMAHA_DEVICE(0x1013, "PF-500"),
106YAMAHA_DEVICE(0x1014, "S90"),
107YAMAHA_DEVICE(0x1015, "MOTIF-R"),
Clemens Ladisch4ccb4a42006-03-15 12:24:19 +0100108YAMAHA_DEVICE(0x1016, "MDP-5"),
Linus Torvalds1da177e2005-04-16 15:20:36 -0700109YAMAHA_DEVICE(0x1017, "CVP-204"),
110YAMAHA_DEVICE(0x1018, "CVP-206"),
111YAMAHA_DEVICE(0x1019, "CVP-208"),
112YAMAHA_DEVICE(0x101a, "CVP-210"),
113YAMAHA_DEVICE(0x101b, "PSR-1100"),
114YAMAHA_DEVICE(0x101c, "PSR-2100"),
115YAMAHA_DEVICE(0x101d, "CLP-175"),
116YAMAHA_DEVICE(0x101e, "PSR-K1"),
Clemens Ladisch4ccb4a42006-03-15 12:24:19 +0100117YAMAHA_DEVICE(0x101f, "EZ-J24"),
Linus Torvalds1da177e2005-04-16 15:20:36 -0700118YAMAHA_DEVICE(0x1020, "EZ-250i"),
119YAMAHA_DEVICE(0x1021, "MOTIF ES 6"),
120YAMAHA_DEVICE(0x1022, "MOTIF ES 7"),
121YAMAHA_DEVICE(0x1023, "MOTIF ES 8"),
122YAMAHA_DEVICE(0x1024, "CVP-301"),
123YAMAHA_DEVICE(0x1025, "CVP-303"),
124YAMAHA_DEVICE(0x1026, "CVP-305"),
125YAMAHA_DEVICE(0x1027, "CVP-307"),
126YAMAHA_DEVICE(0x1028, "CVP-309"),
127YAMAHA_DEVICE(0x1029, "CVP-309GP"),
128YAMAHA_DEVICE(0x102a, "PSR-1500"),
129YAMAHA_DEVICE(0x102b, "PSR-3000"),
130YAMAHA_DEVICE(0x102e, "ELS-01/01C"),
131YAMAHA_DEVICE(0x1030, "PSR-295/293"),
132YAMAHA_DEVICE(0x1031, "DGX-205/203"),
133YAMAHA_DEVICE(0x1032, "DGX-305"),
134YAMAHA_DEVICE(0x1033, "DGX-505"),
135YAMAHA_DEVICE(0x1034, NULL),
136YAMAHA_DEVICE(0x1035, NULL),
137YAMAHA_DEVICE(0x1036, NULL),
138YAMAHA_DEVICE(0x1037, NULL),
139YAMAHA_DEVICE(0x1038, NULL),
140YAMAHA_DEVICE(0x1039, NULL),
141YAMAHA_DEVICE(0x103a, NULL),
142YAMAHA_DEVICE(0x103b, NULL),
143YAMAHA_DEVICE(0x103c, NULL),
Clemens Ladisch0ac2ac02005-07-01 16:19:39 +0200144YAMAHA_DEVICE(0x103d, NULL),
Clemens Ladischf542fda2005-09-20 09:06:36 +0200145YAMAHA_DEVICE(0x103e, NULL),
146YAMAHA_DEVICE(0x103f, NULL),
147YAMAHA_DEVICE(0x1040, NULL),
148YAMAHA_DEVICE(0x1041, NULL),
Clemens Ladischf1265392006-07-21 10:46:18 +0200149YAMAHA_DEVICE(0x1042, NULL),
150YAMAHA_DEVICE(0x1043, NULL),
151YAMAHA_DEVICE(0x1044, NULL),
152YAMAHA_DEVICE(0x1045, NULL),
Linus Torvalds1da177e2005-04-16 15:20:36 -0700153YAMAHA_DEVICE(0x2000, "DGP-7"),
154YAMAHA_DEVICE(0x2001, "DGP-5"),
155YAMAHA_DEVICE(0x2002, NULL),
156YAMAHA_DEVICE(0x5000, "CS1D"),
157YAMAHA_DEVICE(0x5001, "DSP1D"),
158YAMAHA_DEVICE(0x5002, "DME32"),
159YAMAHA_DEVICE(0x5003, "DM2000"),
160YAMAHA_DEVICE(0x5004, "02R96"),
161YAMAHA_DEVICE(0x5005, "ACU16-C"),
162YAMAHA_DEVICE(0x5006, "NHB32-C"),
163YAMAHA_DEVICE(0x5007, "DM1000"),
164YAMAHA_DEVICE(0x5008, "01V96"),
165YAMAHA_DEVICE(0x5009, "SPX2000"),
166YAMAHA_DEVICE(0x500a, "PM5D"),
167YAMAHA_DEVICE(0x500b, "DME64N"),
168YAMAHA_DEVICE(0x500c, "DME24N"),
169YAMAHA_DEVICE(0x500d, NULL),
170YAMAHA_DEVICE(0x500e, NULL),
Clemens Ladischf1265392006-07-21 10:46:18 +0200171YAMAHA_DEVICE(0x500f, NULL),
Linus Torvalds1da177e2005-04-16 15:20:36 -0700172YAMAHA_DEVICE(0x7000, "DTX"),
173YAMAHA_DEVICE(0x7010, "UB99"),
174#undef YAMAHA_DEVICE
175#undef YAMAHA_INTERFACE
176
177/*
178 * Roland/RolandED/Edirol/BOSS devices
179 */
180{
181 USB_DEVICE(0x0582, 0x0000),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100182 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700183 .vendor_name = "Roland",
184 .product_name = "UA-100",
185 .ifnum = QUIRK_ANY_INTERFACE,
186 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100187 .data = (const struct snd_usb_audio_quirk[]) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700188 {
189 .ifnum = 0,
190 .type = QUIRK_AUDIO_FIXED_ENDPOINT,
191 .data = & (const struct audioformat) {
192 .format = SNDRV_PCM_FORMAT_S16_LE,
193 .channels = 4,
194 .iface = 0,
195 .altsetting = 1,
196 .altset_idx = 1,
197 .attributes = 0,
198 .endpoint = 0x01,
199 .ep_attr = 0x09,
200 .rates = SNDRV_PCM_RATE_CONTINUOUS,
201 .rate_min = 44100,
202 .rate_max = 44100,
203 }
204 },
205 {
206 .ifnum = 1,
207 .type = QUIRK_AUDIO_FIXED_ENDPOINT,
208 .data = & (const struct audioformat) {
209 .format = SNDRV_PCM_FORMAT_S16_LE,
210 .channels = 2,
211 .iface = 1,
212 .altsetting = 1,
213 .altset_idx = 1,
214 .attributes = EP_CS_ATTR_FILL_MAX,
215 .endpoint = 0x81,
216 .ep_attr = 0x05,
217 .rates = SNDRV_PCM_RATE_CONTINUOUS,
218 .rate_min = 44100,
219 .rate_max = 44100,
220 }
221 },
222 {
223 .ifnum = 2,
224 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100225 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700226 .out_cables = 0x0007,
227 .in_cables = 0x0007
228 }
229 },
230 {
231 .ifnum = -1
232 }
233 }
234 }
235},
236{
237 USB_DEVICE(0x0582, 0x0002),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100238 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700239 .vendor_name = "EDIROL",
240 .product_name = "UM-4",
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200241 .ifnum = QUIRK_ANY_INTERFACE,
242 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100243 .data = (const struct snd_usb_audio_quirk[]) {
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200244 {
245 .ifnum = 0,
246 .type = QUIRK_IGNORE_INTERFACE
247 },
248 {
249 .ifnum = 1,
250 .type = QUIRK_IGNORE_INTERFACE
251 },
252 {
253 .ifnum = 2,
254 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100255 .data = & (const struct snd_usb_midi_endpoint_info) {
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200256 .out_cables = 0x000f,
257 .in_cables = 0x000f
258 }
259 },
260 {
261 .ifnum = -1
262 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700263 }
264 }
265},
266{
267 USB_DEVICE(0x0582, 0x0003),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100268 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700269 .vendor_name = "Roland",
270 .product_name = "SC-8850",
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200271 .ifnum = QUIRK_ANY_INTERFACE,
272 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100273 .data = (const struct snd_usb_audio_quirk[]) {
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200274 {
275 .ifnum = 0,
276 .type = QUIRK_IGNORE_INTERFACE
277 },
278 {
279 .ifnum = 1,
280 .type = QUIRK_IGNORE_INTERFACE
281 },
282 {
283 .ifnum = 2,
284 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100285 .data = & (const struct snd_usb_midi_endpoint_info) {
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200286 .out_cables = 0x003f,
287 .in_cables = 0x003f
288 }
289 },
290 {
291 .ifnum = -1
292 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700293 }
294 }
295},
296{
297 USB_DEVICE(0x0582, 0x0004),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100298 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700299 .vendor_name = "Roland",
300 .product_name = "U-8",
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200301 .ifnum = QUIRK_ANY_INTERFACE,
302 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100303 .data = (const struct snd_usb_audio_quirk[]) {
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200304 {
305 .ifnum = 0,
306 .type = QUIRK_IGNORE_INTERFACE
307 },
308 {
309 .ifnum = 1,
310 .type = QUIRK_IGNORE_INTERFACE
311 },
312 {
313 .ifnum = 2,
314 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100315 .data = & (const struct snd_usb_midi_endpoint_info) {
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200316 .out_cables = 0x0005,
317 .in_cables = 0x0005
318 }
319 },
320 {
321 .ifnum = -1
322 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700323 }
324 }
325},
326{
Clemens Ladisch119c4ff2006-01-19 08:25:19 +0100327 /* Has ID 0x0099 when not in "Advanced Driver" mode.
328 * The UM-2EX has only one input, but we cannot detect this. */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700329 USB_DEVICE(0x0582, 0x0005),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100330 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700331 .vendor_name = "EDIROL",
332 .product_name = "UM-2",
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200333 .ifnum = QUIRK_ANY_INTERFACE,
334 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100335 .data = (const struct snd_usb_audio_quirk[]) {
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200336 {
337 .ifnum = 0,
338 .type = QUIRK_IGNORE_INTERFACE
339 },
340 {
341 .ifnum = 1,
342 .type = QUIRK_IGNORE_INTERFACE
343 },
344 {
345 .ifnum = 2,
346 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100347 .data = & (const struct snd_usb_midi_endpoint_info) {
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200348 .out_cables = 0x0003,
349 .in_cables = 0x0003
350 }
351 },
352 {
353 .ifnum = -1
354 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700355 }
356 }
357},
358{
359 USB_DEVICE(0x0582, 0x0007),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100360 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700361 .vendor_name = "Roland",
362 .product_name = "SC-8820",
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200363 .ifnum = QUIRK_ANY_INTERFACE,
364 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100365 .data = (const struct snd_usb_audio_quirk[]) {
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200366 {
367 .ifnum = 0,
368 .type = QUIRK_IGNORE_INTERFACE
369 },
370 {
371 .ifnum = 1,
372 .type = QUIRK_IGNORE_INTERFACE
373 },
374 {
375 .ifnum = 2,
376 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100377 .data = & (const struct snd_usb_midi_endpoint_info) {
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200378 .out_cables = 0x0013,
379 .in_cables = 0x0013
380 }
381 },
382 {
383 .ifnum = -1
384 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700385 }
386 }
387},
388{
389 USB_DEVICE(0x0582, 0x0008),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100390 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700391 .vendor_name = "Roland",
392 .product_name = "PC-300",
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200393 .ifnum = QUIRK_ANY_INTERFACE,
394 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100395 .data = (const struct snd_usb_audio_quirk[]) {
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200396 {
397 .ifnum = 0,
398 .type = QUIRK_IGNORE_INTERFACE
399 },
400 {
401 .ifnum = 1,
402 .type = QUIRK_IGNORE_INTERFACE
403 },
404 {
405 .ifnum = 2,
406 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100407 .data = & (const struct snd_usb_midi_endpoint_info) {
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200408 .out_cables = 0x0001,
409 .in_cables = 0x0001
410 }
411 },
412 {
413 .ifnum = -1
414 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700415 }
416 }
417},
418{
Clemens Ladisch119c4ff2006-01-19 08:25:19 +0100419 /* has ID 0x009d when not in "Advanced Driver" mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700420 USB_DEVICE(0x0582, 0x0009),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100421 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700422 .vendor_name = "EDIROL",
423 .product_name = "UM-1",
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200424 .ifnum = QUIRK_ANY_INTERFACE,
425 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100426 .data = (const struct snd_usb_audio_quirk[]) {
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200427 {
428 .ifnum = 0,
429 .type = QUIRK_IGNORE_INTERFACE
430 },
431 {
432 .ifnum = 1,
433 .type = QUIRK_IGNORE_INTERFACE
434 },
435 {
436 .ifnum = 2,
437 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100438 .data = & (const struct snd_usb_midi_endpoint_info) {
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200439 .out_cables = 0x0001,
440 .in_cables = 0x0001
441 }
442 },
443 {
444 .ifnum = -1
445 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700446 }
447 }
448},
449{
450 USB_DEVICE(0x0582, 0x000b),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100451 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700452 .vendor_name = "Roland",
453 .product_name = "SK-500",
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200454 .ifnum = QUIRK_ANY_INTERFACE,
455 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100456 .data = (const struct snd_usb_audio_quirk[]) {
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200457 {
458 .ifnum = 0,
459 .type = QUIRK_IGNORE_INTERFACE
460 },
461 {
462 .ifnum = 1,
463 .type = QUIRK_IGNORE_INTERFACE
464 },
465 {
466 .ifnum = 2,
467 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100468 .data = & (const struct snd_usb_midi_endpoint_info) {
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200469 .out_cables = 0x0013,
470 .in_cables = 0x0013
471 }
472 },
473 {
474 .ifnum = -1
475 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700476 }
477 }
478},
479{
480 /* thanks to Emiliano Grilli <emillo@libero.it>
481 * for helping researching this data */
482 USB_DEVICE(0x0582, 0x000c),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100483 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700484 .vendor_name = "Roland",
485 .product_name = "SC-D70",
486 .ifnum = QUIRK_ANY_INTERFACE,
487 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100488 .data = (const struct snd_usb_audio_quirk[]) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700489 {
490 .ifnum = 0,
491 .type = QUIRK_AUDIO_FIXED_ENDPOINT,
492 .data = & (const struct audioformat) {
493 .format = SNDRV_PCM_FORMAT_S24_3LE,
494 .channels = 2,
495 .iface = 0,
496 .altsetting = 1,
497 .altset_idx = 1,
498 .attributes = 0,
499 .endpoint = 0x01,
500 .ep_attr = 0x01,
501 .rates = SNDRV_PCM_RATE_CONTINUOUS,
502 .rate_min = 44100,
503 .rate_max = 44100,
504 }
505 },
506 {
507 .ifnum = 1,
508 .type = QUIRK_AUDIO_FIXED_ENDPOINT,
509 .data = & (const struct audioformat) {
510 .format = SNDRV_PCM_FORMAT_S24_3LE,
511 .channels = 2,
512 .iface = 1,
513 .altsetting = 1,
514 .altset_idx = 1,
515 .attributes = 0,
516 .endpoint = 0x81,
517 .ep_attr = 0x01,
518 .rates = SNDRV_PCM_RATE_CONTINUOUS,
519 .rate_min = 44100,
520 .rate_max = 44100,
521 }
522 },
523 {
524 .ifnum = 2,
525 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100526 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700527 .out_cables = 0x0007,
528 .in_cables = 0x0007
529 }
530 },
531 {
532 .ifnum = -1
533 }
534 }
535 }
536},
537{ /*
538 * This quirk is for the "Advanced Driver" mode of the Edirol UA-5.
539 * If the advanced mode switch at the back of the unit is off, the
540 * UA-5 has ID 0x0582/0x0011 and is standard compliant (no quirks),
541 * but offers only 16-bit PCM.
542 * In advanced mode, the UA-5 will output S24_3LE samples (two
543 * channels) at the rate indicated on the front switch, including
544 * the 96kHz sample rate.
545 */
546 USB_DEVICE(0x0582, 0x0010),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100547 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700548 .vendor_name = "EDIROL",
549 .product_name = "UA-5",
550 .ifnum = QUIRK_ANY_INTERFACE,
551 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100552 .data = (const struct snd_usb_audio_quirk[]) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700553 {
554 .ifnum = 1,
555 .type = QUIRK_AUDIO_STANDARD_INTERFACE
556 },
557 {
558 .ifnum = 2,
559 .type = QUIRK_AUDIO_STANDARD_INTERFACE
560 },
561 {
562 .ifnum = -1
563 }
564 }
565 }
566},
567{
Clemens Ladischd879f0c2005-09-21 16:33:49 +0200568 /* has ID 0x0013 when not in "Advanced Driver" mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700569 USB_DEVICE(0x0582, 0x0012),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100570 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700571 .vendor_name = "Roland",
572 .product_name = "XV-5050",
573 .ifnum = 0,
574 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100575 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700576 .out_cables = 0x0001,
577 .in_cables = 0x0001
578 }
579 }
580},
581{
Clemens Ladischd879f0c2005-09-21 16:33:49 +0200582 /* has ID 0x0015 when not in "Advanced Driver" mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700583 USB_DEVICE(0x0582, 0x0014),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100584 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700585 .vendor_name = "EDIROL",
586 .product_name = "UM-880",
587 .ifnum = 0,
588 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100589 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700590 .out_cables = 0x01ff,
591 .in_cables = 0x01ff
592 }
593 }
594},
595{
Clemens Ladischd879f0c2005-09-21 16:33:49 +0200596 /* has ID 0x0017 when not in "Advanced Driver" mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700597 USB_DEVICE(0x0582, 0x0016),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100598 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700599 .vendor_name = "EDIROL",
600 .product_name = "SD-90",
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200601 .ifnum = QUIRK_ANY_INTERFACE,
602 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100603 .data = (const struct snd_usb_audio_quirk[]) {
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200604 {
605 .ifnum = 0,
606 .type = QUIRK_IGNORE_INTERFACE
607 },
608 {
609 .ifnum = 1,
610 .type = QUIRK_IGNORE_INTERFACE
611 },
612 {
613 .ifnum = 2,
614 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100615 .data = & (const struct snd_usb_midi_endpoint_info) {
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200616 .out_cables = 0x000f,
617 .in_cables = 0x000f
618 }
619 },
620 {
621 .ifnum = -1
622 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700623 }
624 }
625},
626{
Clemens Ladischd879f0c2005-09-21 16:33:49 +0200627 /* has ID 0x001c when not in "Advanced Driver" mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700628 USB_DEVICE(0x0582, 0x001b),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100629 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700630 .vendor_name = "Roland",
631 .product_name = "MMP-2",
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200632 .ifnum = QUIRK_ANY_INTERFACE,
633 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100634 .data = (const struct snd_usb_audio_quirk[]) {
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200635 {
636 .ifnum = 0,
637 .type = QUIRK_IGNORE_INTERFACE
638 },
639 {
640 .ifnum = 1,
641 .type = QUIRK_IGNORE_INTERFACE
642 },
643 {
644 .ifnum = 2,
645 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100646 .data = & (const struct snd_usb_midi_endpoint_info) {
Clemens Ladischd3ff42f2005-05-17 09:14:27 +0200647 .out_cables = 0x0001,
648 .in_cables = 0x0001
649 }
650 },
651 {
652 .ifnum = -1
653 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700654 }
655 }
656},
657{
Clemens Ladischd879f0c2005-09-21 16:33:49 +0200658 /* has ID 0x001e when not in "Advanced Driver" mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700659 USB_DEVICE(0x0582, 0x001d),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100660 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700661 .vendor_name = "Roland",
662 .product_name = "V-SYNTH",
663 .ifnum = 0,
664 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100665 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700666 .out_cables = 0x0001,
667 .in_cables = 0x0001
668 }
669 }
670},
671{
Clemens Ladischd879f0c2005-09-21 16:33:49 +0200672 /* has ID 0x0024 when not in "Advanced Driver" mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700673 USB_DEVICE(0x0582, 0x0023),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100674 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700675 .vendor_name = "EDIROL",
676 .product_name = "UM-550",
677 .ifnum = 0,
678 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100679 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700680 .out_cables = 0x003f,
681 .in_cables = 0x003f
682 }
683 }
684},
685{
686 /*
687 * This quirk is for the "Advanced Driver" mode. If off, the UA-20
688 * has ID 0x0026 and is standard compliant, but has only 16-bit PCM
689 * and no MIDI.
690 */
691 USB_DEVICE(0x0582, 0x0025),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100692 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700693 .vendor_name = "EDIROL",
694 .product_name = "UA-20",
695 .ifnum = QUIRK_ANY_INTERFACE,
696 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100697 .data = (const struct snd_usb_audio_quirk[]) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700698 {
Clemens Ladisch1f14a652005-11-21 16:40:00 +0100699 .ifnum = 0,
700 .type = QUIRK_IGNORE_INTERFACE
701 },
702 {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700703 .ifnum = 1,
Clemens Ladisch1f14a652005-11-21 16:40:00 +0100704 .type = QUIRK_AUDIO_FIXED_ENDPOINT,
705 .data = & (const struct audioformat) {
706 .format = SNDRV_PCM_FORMAT_S24_3LE,
707 .channels = 2,
708 .iface = 1,
709 .altsetting = 1,
710 .altset_idx = 1,
711 .attributes = 0,
712 .endpoint = 0x01,
713 .ep_attr = 0x01,
714 .rates = SNDRV_PCM_RATE_CONTINUOUS,
715 .rate_min = 44100,
716 .rate_max = 44100,
717 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700718 },
719 {
720 .ifnum = 2,
Clemens Ladisch1f14a652005-11-21 16:40:00 +0100721 .type = QUIRK_AUDIO_FIXED_ENDPOINT,
722 .data = & (const struct audioformat) {
723 .format = SNDRV_PCM_FORMAT_S24_3LE,
724 .channels = 2,
725 .iface = 2,
726 .altsetting = 1,
727 .altset_idx = 1,
728 .attributes = 0,
729 .endpoint = 0x82,
730 .ep_attr = 0x01,
731 .rates = SNDRV_PCM_RATE_CONTINUOUS,
732 .rate_min = 44100,
733 .rate_max = 44100,
734 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700735 },
736 {
737 .ifnum = 3,
Clemens Ladisch1f14a652005-11-21 16:40:00 +0100738 .type = QUIRK_MIDI_FIXED_ENDPOINT,
739 .data = & (const struct snd_usb_midi_endpoint_info) {
740 .out_cables = 0x0001,
741 .in_cables = 0x0001
742 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700743 },
744 {
745 .ifnum = -1
746 }
747 }
748 }
749},
750{
Clemens Ladischd879f0c2005-09-21 16:33:49 +0200751 /* has ID 0x0028 when not in "Advanced Driver" mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700752 USB_DEVICE(0x0582, 0x0027),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100753 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700754 .vendor_name = "EDIROL",
755 .product_name = "SD-20",
756 .ifnum = 0,
757 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100758 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700759 .out_cables = 0x0003,
760 .in_cables = 0x0007
761 }
762 }
763},
764{
Clemens Ladischd879f0c2005-09-21 16:33:49 +0200765 /* has ID 0x002a when not in "Advanced Driver" mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700766 USB_DEVICE(0x0582, 0x0029),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100767 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700768 .vendor_name = "EDIROL",
769 .product_name = "SD-80",
770 .ifnum = 0,
771 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100772 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700773 .out_cables = 0x000f,
774 .in_cables = 0x000f
775 }
776 }
777},
778{ /*
779 * This quirk is for the "Advanced" modes of the Edirol UA-700.
780 * If the sample format switch is not in an advanced setting, the
781 * UA-700 has ID 0x0582/0x002c and is standard compliant (no quirks),
782 * but offers only 16-bit PCM and no MIDI.
783 */
784 USB_DEVICE_VENDOR_SPEC(0x0582, 0x002b),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100785 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700786 .vendor_name = "EDIROL",
787 .product_name = "UA-700",
788 .ifnum = QUIRK_ANY_INTERFACE,
789 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100790 .data = (const struct snd_usb_audio_quirk[]) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700791 {
792 .ifnum = 1,
793 .type = QUIRK_AUDIO_EDIROL_UA700_UA25
794 },
795 {
796 .ifnum = 2,
797 .type = QUIRK_AUDIO_EDIROL_UA700_UA25
798 },
799 {
800 .ifnum = 3,
801 .type = QUIRK_AUDIO_EDIROL_UA700_UA25
802 },
803 {
804 .ifnum = -1
805 }
806 }
807 }
808},
809{
Clemens Ladischd879f0c2005-09-21 16:33:49 +0200810 /* has ID 0x002e when not in "Advanced Driver" mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700811 USB_DEVICE(0x0582, 0x002d),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100812 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700813 .vendor_name = "Roland",
814 .product_name = "XV-2020",
815 .ifnum = 0,
816 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100817 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700818 .out_cables = 0x0001,
819 .in_cables = 0x0001
820 }
821 }
822},
823{
Clemens Ladischd879f0c2005-09-21 16:33:49 +0200824 /* has ID 0x0030 when not in "Advanced Driver" mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700825 USB_DEVICE(0x0582, 0x002f),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100826 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700827 .vendor_name = "Roland",
828 .product_name = "VariOS",
829 .ifnum = 0,
830 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100831 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700832 .out_cables = 0x0007,
833 .in_cables = 0x0007
834 }
835 }
836},
837{
Clemens Ladischd879f0c2005-09-21 16:33:49 +0200838 /* has ID 0x0034 when not in "Advanced Driver" mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700839 USB_DEVICE(0x0582, 0x0033),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100840 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700841 .vendor_name = "EDIROL",
842 .product_name = "PCR",
843 .ifnum = 0,
844 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100845 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700846 .out_cables = 0x0003,
847 .in_cables = 0x0007
848 }
849 }
850},
Clemens Ladischd879f0c2005-09-21 16:33:49 +0200851 /* TODO: add Roland M-1000 support */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700852{
Clemens Ladischd879f0c2005-09-21 16:33:49 +0200853 /*
854 * Has ID 0x0038 when not in "Advanced Driver" mode;
855 * later revisions use IDs 0x0054 and 0x00a2.
856 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700857 USB_DEVICE(0x0582, 0x0037),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100858 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700859 .vendor_name = "Roland",
860 .product_name = "Digital Piano",
861 .ifnum = 0,
862 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100863 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700864 .out_cables = 0x0001,
865 .in_cables = 0x0001
866 }
867 }
868},
869{
Clemens Ladisch5af4c832005-04-06 09:47:02 +0200870 /*
871 * This quirk is for the "Advanced Driver" mode. If off, the GS-10
872 * has ID 0x003c and is standard compliant, but has only 16-bit PCM
873 * and no MIDI.
874 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700875 USB_DEVICE_VENDOR_SPEC(0x0582, 0x003b),
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 = "BOSS",
878 .product_name = "GS-10",
Clemens Ladisch5af4c832005-04-06 09:47:02 +0200879 .ifnum = QUIRK_ANY_INTERFACE,
880 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100881 .data = & (const struct snd_usb_audio_quirk[]) {
Clemens Ladisch5af4c832005-04-06 09:47:02 +0200882 {
883 .ifnum = 1,
884 .type = QUIRK_AUDIO_STANDARD_INTERFACE
885 },
886 {
887 .ifnum = 2,
888 .type = QUIRK_AUDIO_STANDARD_INTERFACE
889 },
890 {
891 .ifnum = 3,
892 .type = QUIRK_MIDI_STANDARD_INTERFACE
893 },
894 {
895 .ifnum = -1
896 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700897 }
898 }
899},
900{
Clemens Ladischd879f0c2005-09-21 16:33:49 +0200901 /* has ID 0x0041 when not in "Advanced Driver" mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700902 USB_DEVICE(0x0582, 0x0040),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100903 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700904 .vendor_name = "Roland",
905 .product_name = "GI-20",
906 .ifnum = 0,
907 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100908 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700909 .out_cables = 0x0001,
910 .in_cables = 0x0001
911 }
912 }
913},
914{
Clemens Ladischd879f0c2005-09-21 16:33:49 +0200915 /* has ID 0x0043 when not in "Advanced Driver" mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700916 USB_DEVICE(0x0582, 0x0042),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100917 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700918 .vendor_name = "Roland",
919 .product_name = "RS-70",
920 .ifnum = 0,
921 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100922 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700923 .out_cables = 0x0001,
924 .in_cables = 0x0001
925 }
926 }
927},
928{
929 USB_DEVICE(0x0582, 0x0044),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100930 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700931 .vendor_name = "Roland",
932 .product_name = "UA-1000",
933 .ifnum = QUIRK_ANY_INTERFACE,
934 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100935 .data = (const struct snd_usb_audio_quirk[]) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700936 {
937 .ifnum = 1,
938 .type = QUIRK_AUDIO_EDIROL_UA1000
939 },
940 {
941 .ifnum = 2,
942 .type = QUIRK_AUDIO_EDIROL_UA1000
943 },
944 {
945 .ifnum = 3,
946 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100947 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700948 .out_cables = 0x0003,
949 .in_cables = 0x0003
950 }
951 },
952 {
953 .ifnum = -1
954 }
955 }
956 }
957},
958{
Clemens Ladischd879f0c2005-09-21 16:33:49 +0200959 /* has ID 0x004a when not in "Advanced Driver" mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700960 USB_DEVICE(0x0582, 0x0048),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100961 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700962 .vendor_name = "EDIROL",
963 .product_name = "UR-80",
964 .ifnum = 0,
965 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +0100966 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700967 .out_cables = 0x0003,
968 .in_cables = 0x0007
969 }
970 }
971},
Clemens Ladischd879f0c2005-09-21 16:33:49 +0200972 /* TODO: add Edirol M-100FX support */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700973{
Clemens Ladischf38cc312007-02-09 20:52:55 +0100974 /* has ID 0x004e when not in "Advanced Driver" mode */
975 USB_DEVICE(0x0582, 0x004c),
976 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
977 .vendor_name = "EDIROL",
978 .product_name = "PCR-A",
979 .ifnum = QUIRK_ANY_INTERFACE,
980 .type = QUIRK_COMPOSITE,
981 .data = (const struct snd_usb_audio_quirk[]) {
982 {
983 .ifnum = 1,
984 .type = QUIRK_AUDIO_STANDARD_INTERFACE
985 },
986 {
987 .ifnum = 2,
988 .type = QUIRK_AUDIO_STANDARD_INTERFACE
989 },
990 {
991 .ifnum = -1
992 }
993 }
994 }
995},
996{
Clemens Ladischd879f0c2005-09-21 16:33:49 +0200997 /* has ID 0x004f when not in "Advanced Driver" mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700998 USB_DEVICE(0x0582, 0x004d),
Takashi Iwai86e07d32005-11-17 15:08:02 +0100999 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001000 .vendor_name = "EDIROL",
1001 .product_name = "PCR-A",
1002 .ifnum = 0,
1003 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001004 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001005 .out_cables = 0x0003,
1006 .in_cables = 0x0007
1007 }
1008 }
1009},
1010{
1011 /*
1012 * This quirk is for the "Advanced Driver" mode. If off, the UA-3FX
1013 * is standard compliant, but has only 16-bit PCM.
1014 */
1015 USB_DEVICE(0x0582, 0x0050),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001016 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001017 .vendor_name = "EDIROL",
1018 .product_name = "UA-3FX",
1019 .ifnum = QUIRK_ANY_INTERFACE,
1020 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001021 .data = (const struct snd_usb_audio_quirk[]) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001022 {
1023 .ifnum = 1,
1024 .type = QUIRK_AUDIO_STANDARD_INTERFACE
1025 },
1026 {
1027 .ifnum = 2,
1028 .type = QUIRK_AUDIO_STANDARD_INTERFACE
1029 },
1030 {
1031 .ifnum = -1
1032 }
1033 }
1034 }
1035},
1036{
1037 USB_DEVICE(0x0582, 0x0052),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001038 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001039 .vendor_name = "EDIROL",
1040 .product_name = "UM-1SX",
1041 .ifnum = 0,
1042 .type = QUIRK_MIDI_STANDARD_INTERFACE
1043 }
1044},
Clemens Ladischd879f0c2005-09-21 16:33:49 +02001045 /* TODO: add Roland EXR support */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001046{
Clemens Ladischd879f0c2005-09-21 16:33:49 +02001047 /* has ID 0x0067 when not in "Advanced Driver" mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001048 USB_DEVICE(0x0582, 0x0065),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001049 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001050 .vendor_name = "EDIROL",
1051 .product_name = "PCR-1",
1052 .ifnum = 0,
1053 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001054 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001055 .out_cables = 0x0001,
1056 .in_cables = 0x0003
1057 }
1058 }
1059},
1060{
Clemens Ladischd879f0c2005-09-21 16:33:49 +02001061 /* has ID 0x006b when not in "Advanced Driver" mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001062 USB_DEVICE_VENDOR_SPEC(0x0582, 0x006a),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001063 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001064 .vendor_name = "Roland",
1065 .product_name = "SP-606",
1066 .ifnum = 3,
1067 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001068 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001069 .out_cables = 0x0001,
1070 .in_cables = 0x0001
1071 }
1072 }
1073},
1074{
Clemens Ladischd879f0c2005-09-21 16:33:49 +02001075 /* has ID 0x006e when not in "Advanced Driver" mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001076 USB_DEVICE(0x0582, 0x006d),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001077 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001078 .vendor_name = "Roland",
1079 .product_name = "FANTOM-X",
1080 .ifnum = 0,
1081 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001082 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001083 .out_cables = 0x0001,
1084 .in_cables = 0x0001
1085 }
1086 }
1087},
1088{ /*
1089 * This quirk is for the "Advanced" modes of the Edirol UA-25.
1090 * If the switch is not in an advanced setting, the UA-25 has
1091 * ID 0x0582/0x0073 and is standard compliant (no quirks), but
1092 * offers only 16-bit PCM at 44.1 kHz and no MIDI.
1093 */
1094 USB_DEVICE_VENDOR_SPEC(0x0582, 0x0074),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001095 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001096 .vendor_name = "EDIROL",
1097 .product_name = "UA-25",
1098 .ifnum = QUIRK_ANY_INTERFACE,
1099 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001100 .data = (const struct snd_usb_audio_quirk[]) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001101 {
1102 .ifnum = 0,
1103 .type = QUIRK_AUDIO_EDIROL_UA700_UA25
1104 },
1105 {
1106 .ifnum = 1,
1107 .type = QUIRK_AUDIO_EDIROL_UA700_UA25
1108 },
1109 {
1110 .ifnum = 2,
1111 .type = QUIRK_AUDIO_EDIROL_UA700_UA25
1112 },
1113 {
1114 .ifnum = -1
1115 }
1116 }
1117 }
1118},
1119{
Clemens Ladischd879f0c2005-09-21 16:33:49 +02001120 /* has ID 0x0076 when not in "Advanced Driver" mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001121 USB_DEVICE(0x0582, 0x0075),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001122 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001123 .vendor_name = "BOSS",
1124 .product_name = "DR-880",
1125 .ifnum = 0,
1126 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001127 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001128 .out_cables = 0x0001,
1129 .in_cables = 0x0001
1130 }
1131 }
1132},
Clemens Ladisch5a2a68f2005-09-19 12:24:00 +02001133{
Clemens Ladischd879f0c2005-09-21 16:33:49 +02001134 /* has ID 0x007b when not in "Advanced Driver" mode */
Clemens Ladisch5a2a68f2005-09-19 12:24:00 +02001135 USB_DEVICE_VENDOR_SPEC(0x0582, 0x007a),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001136 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Clemens Ladisch5a2a68f2005-09-19 12:24:00 +02001137 .vendor_name = "Roland",
Clemens Ladischd879f0c2005-09-21 16:33:49 +02001138 /* "RD" or "RD-700SX"? */
Clemens Ladisch5a2a68f2005-09-19 12:24:00 +02001139 .ifnum = 0,
1140 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001141 .data = & (const struct snd_usb_midi_endpoint_info) {
Clemens Ladisch5a2a68f2005-09-19 12:24:00 +02001142 .out_cables = 0x0003,
1143 .in_cables = 0x0003
1144 }
1145 }
1146},
Bjoern Fayd0b0fac2007-02-05 12:27:21 +01001147/* Roland UA-101 in High-Speed Mode only */
1148{
1149 USB_DEVICE(0x0582, 0x007d),
1150 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1151 .vendor_name = "Roland",
1152 .product_name = "UA-101",
1153 .ifnum = QUIRK_ANY_INTERFACE,
1154 .type = QUIRK_COMPOSITE,
1155 .data = (const struct snd_usb_audio_quirk[]) {
1156 {
1157 .ifnum = 0,
1158 .type = QUIRK_AUDIO_EDIROL_UA101
1159 },
1160 {
1161 .ifnum = 1,
1162 .type = QUIRK_AUDIO_EDIROL_UA101
1163 },
1164 {
1165 .ifnum = 2,
1166 .type = QUIRK_MIDI_FIXED_ENDPOINT,
1167 .data = & (const struct snd_usb_midi_endpoint_info) {
1168 .out_cables = 0x0001,
1169 .in_cables = 0x0001
1170 }
1171 },
1172 {
1173 .ifnum = -1
1174 }
1175 }
1176 }
1177},
Clemens Ladischcdca8812006-01-18 08:53:32 +01001178{
1179 /* has ID 0x0081 when not in "Advanced Driver" mode */
1180 USB_DEVICE(0x0582, 0x0080),
1181 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1182 .vendor_name = "Roland",
1183 .product_name = "G-70",
1184 .ifnum = 0,
1185 .type = QUIRK_MIDI_FIXED_ENDPOINT,
1186 .data = & (const struct snd_usb_midi_endpoint_info) {
Clemens Ladisch05422572006-01-18 15:44:53 +01001187 .out_cables = 0x0001,
1188 .in_cables = 0x0001
Clemens Ladischcdca8812006-01-18 08:53:32 +01001189 }
1190 }
1191},
Clemens Ladisch7c79b762006-01-10 18:56:23 +01001192 /* TODO: add Roland V-SYNTH XT support */
1193 /* TODO: add BOSS GT-PRO support */
Clemens Ladisch415b09e2006-01-16 08:03:52 +01001194{
1195 /* has ID 0x008c when not in "Advanced Driver" mode */
1196 USB_DEVICE(0x0582, 0x008b),
1197 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1198 .vendor_name = "EDIROL",
1199 .product_name = "PC-50",
1200 .ifnum = 0,
1201 .type = QUIRK_MIDI_FIXED_ENDPOINT,
1202 .data = & (const struct snd_usb_midi_endpoint_info) {
1203 .out_cables = 0x0001,
1204 .in_cables = 0x0001
1205 }
1206 }
1207},
Clemens Ladisch7c79b762006-01-10 18:56:23 +01001208 /* TODO: add Edirol PC-80 support */
1209 /* TODO: add Edirol UA-1EX support */
1210{
1211 USB_DEVICE(0x0582, 0x009a),
1212 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1213 .vendor_name = "EDIROL",
1214 .product_name = "UM-3EX",
1215 .ifnum = 0,
1216 .type = QUIRK_MIDI_FIXED_ENDPOINT,
1217 .data = & (const struct snd_usb_midi_endpoint_info) {
1218 .out_cables = 0x000f,
1219 .in_cables = 0x000f
1220 }
1221 }
1222},
1223 /* TODO: add Edirol MD-P1 support */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001224
Clemens Ladischa25f1752005-10-05 13:23:19 +02001225/* Guillemot devices */
1226{
1227 /*
1228 * This is for the "Windows Edition" where the external MIDI ports are
1229 * the only MIDI ports; the control data is reported through HID
1230 * interfaces. The "Macintosh Edition" has ID 0xd002 and uses standard
1231 * compliant USB MIDI ports for external MIDI and controls.
1232 */
1233 USB_DEVICE_VENDOR_SPEC(0x06f8, 0xb000),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001234 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Clemens Ladischa25f1752005-10-05 13:23:19 +02001235 .vendor_name = "Hercules",
1236 .product_name = "DJ Console (WE)",
1237 .ifnum = 4,
1238 .type = QUIRK_MIDI_FIXED_ENDPOINT,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001239 .data = & (const struct snd_usb_midi_endpoint_info) {
Clemens Ladischa25f1752005-10-05 13:23:19 +02001240 .out_cables = 0x0001,
1241 .in_cables = 0x0001
1242 }
1243 }
1244},
1245
Linus Torvalds1da177e2005-04-16 15:20:36 -07001246/* Midiman/M-Audio devices */
1247{
1248 USB_DEVICE_VENDOR_SPEC(0x0763, 0x1002),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001249 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001250 .vendor_name = "M-Audio",
1251 .product_name = "MidiSport 2x2",
1252 .ifnum = QUIRK_ANY_INTERFACE,
1253 .type = QUIRK_MIDI_MIDIMAN,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001254 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001255 .out_cables = 0x0003,
1256 .in_cables = 0x0003
1257 }
1258 }
1259},
1260{
1261 USB_DEVICE_VENDOR_SPEC(0x0763, 0x1011),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001262 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001263 .vendor_name = "M-Audio",
1264 .product_name = "MidiSport 1x1",
1265 .ifnum = QUIRK_ANY_INTERFACE,
1266 .type = QUIRK_MIDI_MIDIMAN,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001267 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001268 .out_cables = 0x0001,
1269 .in_cables = 0x0001
1270 }
1271 }
1272},
1273{
1274 USB_DEVICE_VENDOR_SPEC(0x0763, 0x1015),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001275 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001276 .vendor_name = "M-Audio",
1277 .product_name = "Keystation",
1278 .ifnum = QUIRK_ANY_INTERFACE,
1279 .type = QUIRK_MIDI_MIDIMAN,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001280 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001281 .out_cables = 0x0001,
1282 .in_cables = 0x0001
1283 }
1284 }
1285},
1286{
1287 USB_DEVICE_VENDOR_SPEC(0x0763, 0x1021),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001288 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001289 .vendor_name = "M-Audio",
1290 .product_name = "MidiSport 4x4",
1291 .ifnum = QUIRK_ANY_INTERFACE,
1292 .type = QUIRK_MIDI_MIDIMAN,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001293 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001294 .out_cables = 0x000f,
1295 .in_cables = 0x000f
1296 }
1297 }
1298},
1299{
1300 /*
1301 * For hardware revision 1.05; in the later revisions (1.10 and
1302 * 1.21), 0x1031 is the ID for the device without firmware.
1303 * Thanks to Olaf Giesbrecht <Olaf_Giesbrecht@yahoo.de>
1304 */
1305 USB_DEVICE_VER(0x0763, 0x1031, 0x0100, 0x0109),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001306 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001307 .vendor_name = "M-Audio",
1308 .product_name = "MidiSport 8x8",
1309 .ifnum = QUIRK_ANY_INTERFACE,
1310 .type = QUIRK_MIDI_MIDIMAN,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001311 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001312 .out_cables = 0x01ff,
1313 .in_cables = 0x01ff
1314 }
1315 }
1316},
1317{
1318 USB_DEVICE_VENDOR_SPEC(0x0763, 0x1033),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001319 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001320 .vendor_name = "M-Audio",
1321 .product_name = "MidiSport 8x8",
1322 .ifnum = QUIRK_ANY_INTERFACE,
1323 .type = QUIRK_MIDI_MIDIMAN,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001324 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001325 .out_cables = 0x01ff,
1326 .in_cables = 0x01ff
1327 }
1328 }
1329},
1330{
1331 USB_DEVICE_VENDOR_SPEC(0x0763, 0x1041),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001332 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001333 .vendor_name = "M-Audio",
1334 .product_name = "MidiSport 2x4",
1335 .ifnum = QUIRK_ANY_INTERFACE,
1336 .type = QUIRK_MIDI_MIDIMAN,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001337 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001338 .out_cables = 0x000f,
1339 .in_cables = 0x0003
1340 }
1341 }
1342},
1343{
1344 USB_DEVICE_VENDOR_SPEC(0x0763, 0x2001),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001345 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001346 .vendor_name = "M-Audio",
1347 .product_name = "Quattro",
1348 .ifnum = QUIRK_ANY_INTERFACE,
1349 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001350 .data = & (const struct snd_usb_audio_quirk[]) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001351 /*
1352 * Interfaces 0-2 are "Windows-compatible", 16-bit only,
1353 * and share endpoints with the other interfaces.
1354 * Ignore them. The other interfaces can do 24 bits,
1355 * but captured samples are big-endian (see usbaudio.c).
1356 */
1357 {
1358 .ifnum = 0,
1359 .type = QUIRK_IGNORE_INTERFACE
1360 },
1361 {
1362 .ifnum = 1,
1363 .type = QUIRK_IGNORE_INTERFACE
1364 },
1365 {
1366 .ifnum = 2,
1367 .type = QUIRK_IGNORE_INTERFACE
1368 },
1369 {
1370 .ifnum = 3,
1371 .type = QUIRK_IGNORE_INTERFACE
1372 },
1373 {
1374 .ifnum = 4,
1375 .type = QUIRK_AUDIO_STANDARD_INTERFACE
1376 },
1377 {
1378 .ifnum = 5,
1379 .type = QUIRK_AUDIO_STANDARD_INTERFACE
1380 },
1381 {
1382 .ifnum = 6,
1383 .type = QUIRK_IGNORE_INTERFACE
1384 },
1385 {
1386 .ifnum = 7,
1387 .type = QUIRK_AUDIO_STANDARD_INTERFACE
1388 },
1389 {
1390 .ifnum = 8,
1391 .type = QUIRK_AUDIO_STANDARD_INTERFACE
1392 },
1393 {
1394 .ifnum = 9,
1395 .type = QUIRK_MIDI_MIDIMAN,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001396 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001397 .out_cables = 0x0001,
1398 .in_cables = 0x0001
1399 }
1400 },
1401 {
1402 .ifnum = -1
1403 }
1404 }
1405 }
1406},
1407{
1408 USB_DEVICE_VENDOR_SPEC(0x0763, 0x2003),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001409 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001410 .vendor_name = "M-Audio",
1411 .product_name = "AudioPhile",
1412 .ifnum = 6,
1413 .type = QUIRK_MIDI_MIDIMAN,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001414 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001415 .out_cables = 0x0001,
1416 .in_cables = 0x0001
1417 }
1418 }
1419},
1420{
1421 USB_DEVICE_VENDOR_SPEC(0x0763, 0x2008),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001422 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001423 .vendor_name = "M-Audio",
1424 .product_name = "Ozone",
1425 .ifnum = 3,
1426 .type = QUIRK_MIDI_MIDIMAN,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001427 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001428 .out_cables = 0x0001,
1429 .in_cables = 0x0001
1430 }
1431 }
1432},
1433{
1434 USB_DEVICE_VENDOR_SPEC(0x0763, 0x200d),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001435 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001436 .vendor_name = "M-Audio",
1437 .product_name = "OmniStudio",
1438 .ifnum = QUIRK_ANY_INTERFACE,
1439 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001440 .data = & (const struct snd_usb_audio_quirk[]) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001441 {
1442 .ifnum = 0,
1443 .type = QUIRK_IGNORE_INTERFACE
1444 },
1445 {
1446 .ifnum = 1,
1447 .type = QUIRK_IGNORE_INTERFACE
1448 },
1449 {
1450 .ifnum = 2,
1451 .type = QUIRK_IGNORE_INTERFACE
1452 },
1453 {
1454 .ifnum = 3,
1455 .type = QUIRK_IGNORE_INTERFACE
1456 },
1457 {
1458 .ifnum = 4,
1459 .type = QUIRK_AUDIO_STANDARD_INTERFACE
1460 },
1461 {
1462 .ifnum = 5,
1463 .type = QUIRK_AUDIO_STANDARD_INTERFACE
1464 },
1465 {
1466 .ifnum = 6,
1467 .type = QUIRK_IGNORE_INTERFACE
1468 },
1469 {
1470 .ifnum = 7,
1471 .type = QUIRK_AUDIO_STANDARD_INTERFACE
1472 },
1473 {
1474 .ifnum = 8,
1475 .type = QUIRK_AUDIO_STANDARD_INTERFACE
1476 },
1477 {
1478 .ifnum = 9,
1479 .type = QUIRK_MIDI_MIDIMAN,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001480 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001481 .out_cables = 0x0001,
1482 .in_cables = 0x0001
1483 }
1484 },
1485 {
1486 .ifnum = -1
1487 }
1488 }
1489 }
1490},
1491
Clemens Ladisch0243ef712006-03-09 07:55:55 +01001492/* Casio devices */
1493{
Clemens Ladisch9808dc92006-03-16 08:15:25 +01001494 USB_DEVICE(0x07cf, 0x6801),
1495 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1496 .vendor_name = "Casio",
1497 .product_name = "PL-40R",
1498 .ifnum = 0,
1499 .type = QUIRK_MIDI_YAMAHA
1500 }
1501},
1502{
Clemens Ladisch318d27f2006-03-09 08:17:08 +01001503 /* this ID is used by several devices without a product ID */
Clemens Ladisch0243ef712006-03-09 07:55:55 +01001504 USB_DEVICE(0x07cf, 0x6802),
1505 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1506 .vendor_name = "Casio",
Clemens Ladisch318d27f2006-03-09 08:17:08 +01001507 .product_name = "Keyboard",
Clemens Ladisch0243ef712006-03-09 07:55:55 +01001508 .ifnum = 0,
1509 .type = QUIRK_MIDI_YAMAHA
1510 }
1511},
1512
Linus Torvalds1da177e2005-04-16 15:20:36 -07001513/* Mark of the Unicorn devices */
1514{
1515 /* thanks to Robert A. Lerche <ral 'at' msbit.com> */
Clemens Ladischbbd46152005-07-04 09:21:45 +02001516 .match_flags = USB_DEVICE_ID_MATCH_VENDOR |
1517 USB_DEVICE_ID_MATCH_PRODUCT |
1518 USB_DEVICE_ID_MATCH_DEV_SUBCLASS,
1519 .idVendor = 0x07fd,
1520 .idProduct = 0x0001,
1521 .bDeviceSubClass = 2,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001522 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001523 .vendor_name = "MOTU",
1524 .product_name = "Fastlane",
1525 .ifnum = QUIRK_ANY_INTERFACE,
1526 .type = QUIRK_COMPOSITE,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001527 .data = & (const struct snd_usb_audio_quirk[]) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001528 {
1529 .ifnum = 0,
Clemens Ladisch6155aff2005-07-04 09:20:42 +02001530 .type = QUIRK_MIDI_RAW
Linus Torvalds1da177e2005-04-16 15:20:36 -07001531 },
1532 {
1533 .ifnum = 1,
1534 .type = QUIRK_IGNORE_INTERFACE
1535 },
1536 {
1537 .ifnum = -1
1538 }
1539 }
1540 }
1541},
1542
1543{
1544 /* Creative Sound Blaster MP3+ */
1545 USB_DEVICE(0x041e, 0x3010),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001546 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001547 .vendor_name = "Creative Labs",
1548 .product_name = "Sound Blaster MP3+",
1549 .ifnum = QUIRK_NO_INTERFACE
1550 }
1551
1552},
1553
1554/* Emagic devices */
1555{
1556 USB_DEVICE(0x086a, 0x0001),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001557 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001558 .vendor_name = "Emagic",
1559 /* .product_name = "Unitor8", */
1560 .ifnum = 2,
1561 .type = QUIRK_MIDI_EMAGIC,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001562 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001563 .out_cables = 0x80ff,
1564 .in_cables = 0x80ff
1565 }
1566 }
1567},
1568{
1569 USB_DEVICE(0x086a, 0x0002),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001570 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001571 .vendor_name = "Emagic",
1572 /* .product_name = "AMT8", */
1573 .ifnum = 2,
1574 .type = QUIRK_MIDI_EMAGIC,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001575 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001576 .out_cables = 0x80ff,
1577 .in_cables = 0x80ff
1578 }
1579 }
1580},
1581{
1582 USB_DEVICE(0x086a, 0x0003),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001583 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001584 .vendor_name = "Emagic",
1585 /* .product_name = "MT4", */
1586 .ifnum = 2,
1587 .type = QUIRK_MIDI_EMAGIC,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001588 .data = & (const struct snd_usb_midi_endpoint_info) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001589 .out_cables = 0x800f,
1590 .in_cables = 0x8003
1591 }
1592 }
1593},
1594
Clemens Ladisch31ab9522005-09-26 08:55:01 +02001595/* TerraTec devices */
1596{
1597 USB_DEVICE_VENDOR_SPEC(0x0ccd, 0x0012),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001598 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Clemens Ladisch31ab9522005-09-26 08:55:01 +02001599 .vendor_name = "TerraTec",
1600 .product_name = "PHASE 26",
1601 .ifnum = 3,
1602 .type = QUIRK_MIDI_STANDARD_INTERFACE
1603 }
1604},
Linus Torvalds1da177e2005-04-16 15:20:36 -07001605{
1606 USB_DEVICE_VENDOR_SPEC(0x0ccd, 0x0013),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001607 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Clemens Ladisch31ab9522005-09-26 08:55:01 +02001608 .vendor_name = "TerraTec",
Linus Torvalds1da177e2005-04-16 15:20:36 -07001609 .product_name = "PHASE 26",
1610 .ifnum = 3,
1611 .type = QUIRK_MIDI_STANDARD_INTERFACE
1612 }
1613},
Clemens Ladischb2b82292006-02-08 12:38:23 +01001614{
Clemens Ladischbc56eff2006-04-13 10:16:08 +02001615 USB_DEVICE_VENDOR_SPEC(0x0ccd, 0x0014),
1616 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1617 .vendor_name = "TerraTec",
1618 .product_name = "PHASE 26",
1619 .ifnum = 3,
1620 .type = QUIRK_MIDI_STANDARD_INTERFACE
1621 }
1622},
1623{
Clemens Ladischb2b82292006-02-08 12:38:23 +01001624 USB_DEVICE(0x0ccd, 0x0035),
1625 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1626 .vendor_name = "Miditech",
1627 .product_name = "Play'n Roll",
1628 .ifnum = 0,
1629 .type = QUIRK_MIDI_CME
1630 }
1631},
Linus Torvalds1da177e2005-04-16 15:20:36 -07001632
1633/* Novation EMS devices */
1634{
1635 USB_DEVICE_VENDOR_SPEC(0x1235, 0x0001),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001636 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001637 .vendor_name = "Novation",
1638 .product_name = "ReMOTE Audio/XStation",
1639 .ifnum = 4,
1640 .type = QUIRK_MIDI_NOVATION
1641 }
1642},
1643{
1644 USB_DEVICE_VENDOR_SPEC(0x1235, 0x0002),
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 = "Novation",
1647 .product_name = "Speedio",
1648 .ifnum = 3,
1649 .type = QUIRK_MIDI_NOVATION
1650 }
1651},
1652{
1653 USB_DEVICE_VENDOR_SPEC(0x1235, 0x4661),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001654 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001655 .vendor_name = "Novation",
1656 .product_name = "ReMOTE25",
1657 .ifnum = 0,
1658 .type = QUIRK_MIDI_NOVATION
1659 }
1660},
1661
Clemens Ladischcc7a59b2006-02-07 17:11:06 +01001662/* Miditech devices */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001663{
Clemens Ladischf38275f2005-07-25 16:17:29 +02001664 USB_DEVICE(0x4752, 0x0011),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001665 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Clemens Ladischf38275f2005-07-25 16:17:29 +02001666 .vendor_name = "Miditech",
1667 .product_name = "Midistart-2",
1668 .ifnum = 0,
Clemens Ladischcc7a59b2006-02-07 17:11:06 +01001669 .type = QUIRK_MIDI_CME
Clemens Ladischf38275f2005-07-25 16:17:29 +02001670 }
1671},
Clemens Ladischcc7a59b2006-02-07 17:11:06 +01001672
1673/* Central Music devices */
Clemens Ladischf38275f2005-07-25 16:17:29 +02001674{
Clemens Ladischcc7a59b2006-02-07 17:11:06 +01001675 /* this ID used by both Miditech MidiStudio-2 and CME UF-x */
Clemens Ladischf38275f2005-07-25 16:17:29 +02001676 USB_DEVICE(0x7104, 0x2202),
Takashi Iwai86e07d32005-11-17 15:08:02 +01001677 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Clemens Ladischf38275f2005-07-25 16:17:29 +02001678 .ifnum = 0,
Clemens Ladischcc7a59b2006-02-07 17:11:06 +01001679 .type = QUIRK_MIDI_CME
Clemens Ladischf38275f2005-07-25 16:17:29 +02001680 }
1681},
1682
1683{
Linus Torvalds1da177e2005-04-16 15:20:36 -07001684 /*
1685 * Some USB MIDI devices don't have an audio control interface,
1686 * so we have to grab MIDI streaming interfaces here.
1687 */
1688 .match_flags = USB_DEVICE_ID_MATCH_INT_CLASS |
1689 USB_DEVICE_ID_MATCH_INT_SUBCLASS,
1690 .bInterfaceClass = USB_CLASS_AUDIO,
1691 .bInterfaceSubClass = USB_SUBCLASS_MIDI_STREAMING,
Takashi Iwai86e07d32005-11-17 15:08:02 +01001692 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001693 .ifnum = QUIRK_ANY_INTERFACE,
1694 .type = QUIRK_MIDI_STANDARD_INTERFACE
1695 }
1696},
1697
1698#undef USB_DEVICE_VENDOR_SPEC