hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/sound/usb/quirks-table.h
....@@ -1,23 +1,9 @@
1
+/* SPDX-License-Identifier: GPL-2.0-or-later */
12 /*
23 * ALSA USB Audio Driver
34 *
45 * Copyright (c) 2002 by Takashi Iwai <tiwai@suse.de>,
56 * 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
217 */
228
239 /*
....@@ -39,26 +25,16 @@
3925 .idProduct = prod, \
4026 .bInterfaceClass = USB_CLASS_VENDOR_SPEC
4127
42
-/* HP Thunderbolt Dock Audio Headset */
43
-{
44
- USB_DEVICE(0x03f0, 0x0269),
45
- .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) {
46
- .vendor_name = "HP",
47
- .product_name = "Thunderbolt Dock Audio Headset",
48
- .profile_name = "HP-Thunderbolt-Dock-Audio-Headset",
49
- .ifnum = QUIRK_NO_INTERFACE
50
- }
51
-},
52
-/* HP Thunderbolt Dock Audio Module */
53
-{
54
- USB_DEVICE(0x03f0, 0x0567),
55
- .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) {
56
- .vendor_name = "HP",
57
- .product_name = "Thunderbolt Dock Audio Module",
58
- .profile_name = "HP-Thunderbolt-Dock-Audio-Module",
59
- .ifnum = QUIRK_NO_INTERFACE
60
- }
61
-},
28
+/* A standard entry matching with vid/pid and the audio class/subclass */
29
+#define USB_AUDIO_DEVICE(vend, prod) \
30
+ .match_flags = USB_DEVICE_ID_MATCH_DEVICE | \
31
+ USB_DEVICE_ID_MATCH_INT_CLASS | \
32
+ USB_DEVICE_ID_MATCH_INT_SUBCLASS, \
33
+ .idVendor = vend, \
34
+ .idProduct = prod, \
35
+ .bInterfaceClass = USB_CLASS_AUDIO, \
36
+ .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL
37
+
6238 /* FTDI devices */
6339 {
6440 USB_DEVICE(0x0403, 0xb8d8),
....@@ -92,57 +68,63 @@
9268 }
9369 },
9470
95
-/* Creative/E-Mu devices */
71
+/* E-Mu 0202 USB */
72
+{ USB_DEVICE_VENDOR_SPEC(0x041e, 0x3f02) },
73
+/* E-Mu 0404 USB */
74
+{ USB_DEVICE_VENDOR_SPEC(0x041e, 0x3f04) },
75
+/* E-Mu Tracker Pre */
76
+{ USB_DEVICE_VENDOR_SPEC(0x041e, 0x3f0a) },
77
+/* E-Mu 0204 USB */
78
+{ USB_DEVICE_VENDOR_SPEC(0x041e, 0x3f19) },
79
+/* Ktmicro Usb_audio device */
80
+{ USB_DEVICE_VENDOR_SPEC(0x31b2, 0x0011) },
81
+
82
+/*
83
+ * Creative Technology, Ltd Live! Cam Sync HD [VF0770]
84
+ * The device advertises 8 formats, but only a rate of 48kHz is honored by the
85
+ * hardware and 24 bits give chopped audio, so only report the one working
86
+ * combination.
87
+ */
9688 {
97
- USB_DEVICE(0x041e, 0x3010),
98
- .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
99
- .vendor_name = "Creative Labs",
100
- .product_name = "Sound Blaster MP3+",
101
- .ifnum = QUIRK_NO_INTERFACE
102
- }
103
-},
104
-/* Creative/Toshiba Multimedia Center SB-0500 */
105
-{
106
- USB_DEVICE(0x041e, 0x3048),
107
- .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
108
- .vendor_name = "Toshiba",
109
- .product_name = "SB-0500",
110
- .ifnum = QUIRK_NO_INTERFACE
111
- }
112
-},
113
-{
114
- /* E-Mu 0202 USB */
115
- .match_flags = USB_DEVICE_ID_MATCH_DEVICE,
116
- .idVendor = 0x041e,
117
- .idProduct = 0x3f02,
118
- .bInterfaceClass = USB_CLASS_AUDIO,
119
-},
120
-{
121
- /* E-Mu 0404 USB */
122
- .match_flags = USB_DEVICE_ID_MATCH_DEVICE,
123
- .idVendor = 0x041e,
124
- .idProduct = 0x3f04,
125
- .bInterfaceClass = USB_CLASS_AUDIO,
126
-},
127
-{
128
- /* E-Mu Tracker Pre */
129
- .match_flags = USB_DEVICE_ID_MATCH_DEVICE,
130
- .idVendor = 0x041e,
131
- .idProduct = 0x3f0a,
132
- .bInterfaceClass = USB_CLASS_AUDIO,
133
-},
134
-{
135
- /* E-Mu 0204 USB */
136
- .match_flags = USB_DEVICE_ID_MATCH_DEVICE,
137
- .idVendor = 0x041e,
138
- .idProduct = 0x3f19,
139
- .bInterfaceClass = USB_CLASS_AUDIO,
89
+ USB_AUDIO_DEVICE(0x041e, 0x4095),
90
+ .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) {
91
+ .ifnum = QUIRK_ANY_INTERFACE,
92
+ .type = QUIRK_COMPOSITE,
93
+ .data = &(const struct snd_usb_audio_quirk[]) {
94
+ {
95
+ .ifnum = 2,
96
+ .type = QUIRK_AUDIO_STANDARD_MIXER,
97
+ },
98
+ {
99
+ .ifnum = 3,
100
+ .type = QUIRK_AUDIO_FIXED_ENDPOINT,
101
+ .data = &(const struct audioformat) {
102
+ .formats = SNDRV_PCM_FMTBIT_S16_LE,
103
+ .channels = 2,
104
+ .fmt_bits = 16,
105
+ .iface = 3,
106
+ .altsetting = 4,
107
+ .altset_idx = 4,
108
+ .endpoint = 0x82,
109
+ .ep_attr = 0x05,
110
+ .rates = SNDRV_PCM_RATE_48000,
111
+ .rate_min = 48000,
112
+ .rate_max = 48000,
113
+ .nr_rates = 1,
114
+ .rate_table = (unsigned int[]) { 48000 },
115
+ },
116
+ },
117
+ {
118
+ .ifnum = -1
119
+ },
120
+ },
121
+ },
140122 },
141123
142124 /*
143125 * HP Wireless Audio
144126 * When not ignored, causes instability issues for some users, forcing them to
145
- * blacklist the entire module.
127
+ * skip the entire module.
146128 */
147129 {
148130 USB_DEVICE(0x0424, 0xb832),
....@@ -179,74 +161,13 @@
179161 * Logitech QuickCam: bDeviceClass is vendor-specific, so generic interface
180162 * class matches do not take effect without an explicit ID match.
181163 */
182
-{
183
- .match_flags = USB_DEVICE_ID_MATCH_DEVICE |
184
- USB_DEVICE_ID_MATCH_INT_CLASS |
185
- USB_DEVICE_ID_MATCH_INT_SUBCLASS,
186
- .idVendor = 0x046d,
187
- .idProduct = 0x0850,
188
- .bInterfaceClass = USB_CLASS_AUDIO,
189
- .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL
190
-},
191
-{
192
- .match_flags = USB_DEVICE_ID_MATCH_DEVICE |
193
- USB_DEVICE_ID_MATCH_INT_CLASS |
194
- USB_DEVICE_ID_MATCH_INT_SUBCLASS,
195
- .idVendor = 0x046d,
196
- .idProduct = 0x08ae,
197
- .bInterfaceClass = USB_CLASS_AUDIO,
198
- .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL
199
-},
200
-{
201
- .match_flags = USB_DEVICE_ID_MATCH_DEVICE |
202
- USB_DEVICE_ID_MATCH_INT_CLASS |
203
- USB_DEVICE_ID_MATCH_INT_SUBCLASS,
204
- .idVendor = 0x046d,
205
- .idProduct = 0x08c6,
206
- .bInterfaceClass = USB_CLASS_AUDIO,
207
- .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL
208
-},
209
-{
210
- .match_flags = USB_DEVICE_ID_MATCH_DEVICE |
211
- USB_DEVICE_ID_MATCH_INT_CLASS |
212
- USB_DEVICE_ID_MATCH_INT_SUBCLASS,
213
- .idVendor = 0x046d,
214
- .idProduct = 0x08f0,
215
- .bInterfaceClass = USB_CLASS_AUDIO,
216
- .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL
217
-},
218
-{
219
- .match_flags = USB_DEVICE_ID_MATCH_DEVICE |
220
- USB_DEVICE_ID_MATCH_INT_CLASS |
221
- USB_DEVICE_ID_MATCH_INT_SUBCLASS,
222
- .idVendor = 0x046d,
223
- .idProduct = 0x08f5,
224
- .bInterfaceClass = USB_CLASS_AUDIO,
225
- .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL
226
-},
227
-{
228
- .match_flags = USB_DEVICE_ID_MATCH_DEVICE |
229
- USB_DEVICE_ID_MATCH_INT_CLASS |
230
- USB_DEVICE_ID_MATCH_INT_SUBCLASS,
231
- .idVendor = 0x046d,
232
- .idProduct = 0x08f6,
233
- .bInterfaceClass = USB_CLASS_AUDIO,
234
- .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL
235
-},
236
-{
237
- .match_flags = USB_DEVICE_ID_MATCH_DEVICE |
238
- USB_DEVICE_ID_MATCH_INT_CLASS |
239
- USB_DEVICE_ID_MATCH_INT_SUBCLASS,
240
- .idVendor = 0x046d,
241
- .idProduct = 0x0990,
242
- .bInterfaceClass = USB_CLASS_AUDIO,
243
- .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL,
244
- .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
245
- .vendor_name = "Logitech, Inc.",
246
- .product_name = "QuickCam Pro 9000",
247
- .ifnum = QUIRK_NO_INTERFACE
248
- }
249
-},
164
+{ USB_AUDIO_DEVICE(0x046d, 0x0850) },
165
+{ USB_AUDIO_DEVICE(0x046d, 0x08ae) },
166
+{ USB_AUDIO_DEVICE(0x046d, 0x08c6) },
167
+{ USB_AUDIO_DEVICE(0x046d, 0x08f0) },
168
+{ USB_AUDIO_DEVICE(0x046d, 0x08f5) },
169
+{ USB_AUDIO_DEVICE(0x046d, 0x08f6) },
170
+{ USB_AUDIO_DEVICE(0x046d, 0x0990) },
250171
251172 /*
252173 * Yamaha devices
....@@ -2110,6 +2031,10 @@
21102031 }
21112032 },
21122033 {
2034
+ /* M-Audio Micro */
2035
+ USB_DEVICE_VENDOR_SPEC(0x0763, 0x201a),
2036
+},
2037
+{
21132038 USB_DEVICE_VENDOR_SPEC(0x0763, 0x2030),
21142039 .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) {
21152040 /* .vendor_name = "M-Audio", */
....@@ -2442,7 +2367,7 @@
24422367 USB_DEVICE(0x086a, 0x0001),
24432368 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
24442369 .vendor_name = "Emagic",
2445
- /* .product_name = "Unitor8", */
2370
+ .product_name = "Unitor8",
24462371 .ifnum = 2,
24472372 .type = QUIRK_MIDI_EMAGIC,
24482373 .data = & (const struct snd_usb_midi_endpoint_info) {
....@@ -2639,38 +2564,12 @@
26392564 }
26402565 },
26412566 {
2642
- USB_DEVICE(0x0ccd, 0x0028),
2643
- .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
2644
- .vendor_name = "TerraTec",
2645
- .product_name = "Aureon5.1MkII",
2646
- .ifnum = QUIRK_NO_INTERFACE
2647
- }
2648
-},
2649
-{
26502567 USB_DEVICE(0x0ccd, 0x0035),
26512568 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
26522569 .vendor_name = "Miditech",
26532570 .product_name = "Play'n Roll",
26542571 .ifnum = 0,
26552572 .type = QUIRK_MIDI_CME
2656
- }
2657
-},
2658
-
2659
-/* Stanton/N2IT Final Scratch v1 device ('Scratchamp') */
2660
-{
2661
- USB_DEVICE(0x103d, 0x0100),
2662
- .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
2663
- .vendor_name = "Stanton",
2664
- .product_name = "ScratchAmp",
2665
- .ifnum = QUIRK_NO_INTERFACE
2666
- }
2667
-},
2668
-{
2669
- USB_DEVICE(0x103d, 0x0101),
2670
- .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
2671
- .vendor_name = "Stanton",
2672
- .product_name = "ScratchAmp",
2673
- .ifnum = QUIRK_NO_INTERFACE
26742573 }
26752574 },
26762575
....@@ -2721,6 +2620,10 @@
27212620 .data = (const struct snd_usb_audio_quirk[]) {
27222621 {
27232622 .ifnum = 0,
2623
+ .type = QUIRK_AUDIO_STANDARD_MIXER,
2624
+ },
2625
+ {
2626
+ .ifnum = 0,
27242627 .type = QUIRK_AUDIO_FIXED_ENDPOINT,
27252628 .data = &(const struct audioformat) {
27262629 .formats = SNDRV_PCM_FMTBIT_S24_3LE,
....@@ -2731,6 +2634,32 @@
27312634 .attributes = UAC_EP_CS_ATTR_SAMPLE_RATE,
27322635 .endpoint = 0x01,
27332636 .ep_attr = USB_ENDPOINT_XFER_ISOC,
2637
+ .datainterval = 1,
2638
+ .maxpacksize = 0x024c,
2639
+ .rates = SNDRV_PCM_RATE_44100 |
2640
+ SNDRV_PCM_RATE_48000,
2641
+ .rate_min = 44100,
2642
+ .rate_max = 48000,
2643
+ .nr_rates = 2,
2644
+ .rate_table = (unsigned int[]) {
2645
+ 44100, 48000
2646
+ }
2647
+ }
2648
+ },
2649
+ {
2650
+ .ifnum = 0,
2651
+ .type = QUIRK_AUDIO_FIXED_ENDPOINT,
2652
+ .data = &(const struct audioformat) {
2653
+ .formats = SNDRV_PCM_FMTBIT_S24_3LE,
2654
+ .channels = 2,
2655
+ .iface = 0,
2656
+ .altsetting = 1,
2657
+ .altset_idx = 1,
2658
+ .attributes = 0,
2659
+ .endpoint = 0x82,
2660
+ .ep_attr = USB_ENDPOINT_XFER_ISOC,
2661
+ .datainterval = 1,
2662
+ .maxpacksize = 0x0126,
27342663 .rates = SNDRV_PCM_RATE_44100 |
27352664 SNDRV_PCM_RATE_48000,
27362665 .rate_min = 44100,
....@@ -2828,14 +2757,20 @@
28282757 }
28292758 },
28302759
2831
-/* */
2760
+/* Lenovo ThinkStation P620 Rear Line-in, Line-out and Microphone */
28322761 {
2833
- /* aka. Serato Scratch Live DJ Box */
2834
- USB_DEVICE(0x13e5, 0x0001),
2762
+ USB_DEVICE(0x17aa, 0x1046),
28352763 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
2836
- .vendor_name = "Rane",
2837
- .product_name = "SL-1",
2838
- .ifnum = QUIRK_NO_INTERFACE
2764
+ .ifnum = QUIRK_ANY_INTERFACE,
2765
+ .type = QUIRK_SETUP_DISABLE_AUTOSUSPEND
2766
+ }
2767
+},
2768
+/* Lenovo ThinkStation P620 Internal Speaker + Front Headset */
2769
+{
2770
+ USB_DEVICE(0x17aa, 0x104d),
2771
+ .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
2772
+ .ifnum = QUIRK_ANY_INTERFACE,
2773
+ .type = QUIRK_SETUP_DISABLE_AUTOSUSPEND
28392774 }
28402775 },
28412776
....@@ -2871,10 +2806,7 @@
28712806 },
28722807
28732808 /* KeithMcMillen Stringport */
2874
-{
2875
- USB_DEVICE(0x1f38, 0x0001),
2876
- .bInterfaceClass = USB_CLASS_AUDIO,
2877
-},
2809
+{ USB_DEVICE(0x1f38, 0x0001) }, /* FIXME: should be more restrictive matching */
28782810
28792811 /* Miditech devices */
28802812 {
....@@ -2905,18 +2837,13 @@
29052837 */
29062838
29072839 #define AU0828_DEVICE(vid, pid, vname, pname) { \
2908
- .idVendor = vid, \
2909
- .idProduct = pid, \
2910
- .match_flags = USB_DEVICE_ID_MATCH_DEVICE | \
2911
- USB_DEVICE_ID_MATCH_INT_CLASS | \
2912
- USB_DEVICE_ID_MATCH_INT_SUBCLASS, \
2913
- .bInterfaceClass = USB_CLASS_AUDIO, \
2914
- .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL, \
2840
+ USB_AUDIO_DEVICE(vid, pid), \
29152841 .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { \
29162842 .vendor_name = vname, \
29172843 .product_name = pname, \
29182844 .ifnum = QUIRK_ANY_INTERFACE, \
29192845 .type = QUIRK_AUDIO_ALIGN_TRANSFER, \
2846
+ .shares_media_device = 1, \
29202847 } \
29212848 }
29222849
....@@ -2940,13 +2867,7 @@
29402867
29412868 /* Syntek STK1160 */
29422869 {
2943
- .match_flags = USB_DEVICE_ID_MATCH_DEVICE |
2944
- USB_DEVICE_ID_MATCH_INT_CLASS |
2945
- USB_DEVICE_ID_MATCH_INT_SUBCLASS,
2946
- .idVendor = 0x05e1,
2947
- .idProduct = 0x0408,
2948
- .bInterfaceClass = USB_CLASS_AUDIO,
2949
- .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL,
2870
+ USB_AUDIO_DEVICE(0x05e1, 0x0408),
29502871 .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) {
29512872 .vendor_name = "Syntek",
29522873 .product_name = "STK1160",
....@@ -3108,10 +3029,7 @@
31083029 },
31093030 {
31103031 /* Tascam US122 MKII - playback-only support */
3111
- .match_flags = USB_DEVICE_ID_MATCH_DEVICE,
3112
- .idVendor = 0x0644,
3113
- .idProduct = 0x8021,
3114
- .bInterfaceClass = USB_CLASS_AUDIO,
3032
+ USB_DEVICE_VENDOR_SPEC(0x0644, 0x8021),
31153033 .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) {
31163034 .vendor_name = "TASCAM",
31173035 .product_name = "US122 MKII",
....@@ -3296,16 +3214,13 @@
32963214 }
32973215 },
32983216
3217
+/* Rane SL-1 */
32993218 {
3300
- /*
3301
- * The original product_name is "USB Sound Device", however this name
3302
- * is also used by the CM106 based cards, so make it unique.
3303
- */
3304
- USB_DEVICE(0x0d8c, 0x0103),
3305
- .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) {
3306
- .product_name = "Audio Advantage MicroII",
3307
- .ifnum = QUIRK_NO_INTERFACE
3308
- }
3219
+ USB_DEVICE(0x13e5, 0x0001),
3220
+ .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
3221
+ .ifnum = QUIRK_ANY_INTERFACE,
3222
+ .type = QUIRK_AUDIO_STANDARD_INTERFACE
3223
+ }
33093224 },
33103225
33113226 /* disabled due to regression for other devices;
....@@ -3408,25 +3323,222 @@
34083323 }
34093324 }
34103325 },
3411
-/* Dell WD15 Dock */
3412
-{
3413
- USB_DEVICE(0x0bda, 0x4014),
3414
- .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
3415
- .vendor_name = "Dell",
3416
- .product_name = "WD15 Dock",
3417
- .profile_name = "Dell-WD15-Dock",
3418
- .ifnum = QUIRK_NO_INTERFACE
3419
- }
3420
-},
34213326 /* Dell WD19 Dock */
34223327 {
34233328 USB_DEVICE(0x0bda, 0x402e),
34243329 .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
3425
- .vendor_name = "Dell",
3426
- .product_name = "WD19 Dock",
3427
- .profile_name = "Dell-WD15-Dock",
34283330 .ifnum = QUIRK_ANY_INTERFACE,
34293331 .type = QUIRK_SETUP_FMT_AFTER_RESUME
3332
+ }
3333
+},
3334
+/* MOTU Microbook II */
3335
+{
3336
+ USB_DEVICE_VENDOR_SPEC(0x07fd, 0x0004),
3337
+ .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) {
3338
+ .vendor_name = "MOTU",
3339
+ .product_name = "MicroBookII",
3340
+ .ifnum = QUIRK_ANY_INTERFACE,
3341
+ .type = QUIRK_COMPOSITE,
3342
+ .data = (const struct snd_usb_audio_quirk[]) {
3343
+ {
3344
+ .ifnum = 0,
3345
+ .type = QUIRK_AUDIO_STANDARD_MIXER,
3346
+ },
3347
+ {
3348
+ .ifnum = 0,
3349
+ .type = QUIRK_AUDIO_FIXED_ENDPOINT,
3350
+ .data = &(const struct audioformat) {
3351
+ .formats = SNDRV_PCM_FMTBIT_S24_3BE,
3352
+ .channels = 6,
3353
+ .iface = 0,
3354
+ .altsetting = 1,
3355
+ .altset_idx = 1,
3356
+ .attributes = 0,
3357
+ .endpoint = 0x84,
3358
+ .rates = SNDRV_PCM_RATE_96000,
3359
+ .ep_attr = USB_ENDPOINT_XFER_ISOC |
3360
+ USB_ENDPOINT_SYNC_ASYNC,
3361
+ .rate_min = 96000,
3362
+ .rate_max = 96000,
3363
+ .nr_rates = 1,
3364
+ .maxpacksize = 0x00d8,
3365
+ .rate_table = (unsigned int[]) {
3366
+ 96000
3367
+ }
3368
+ }
3369
+ },
3370
+ {
3371
+ .ifnum = 0,
3372
+ .type = QUIRK_AUDIO_FIXED_ENDPOINT,
3373
+ .data = &(const struct audioformat) {
3374
+ .formats = SNDRV_PCM_FMTBIT_S24_3BE,
3375
+ .channels = 8,
3376
+ .iface = 0,
3377
+ .altsetting = 1,
3378
+ .altset_idx = 1,
3379
+ .attributes = 0,
3380
+ .endpoint = 0x03,
3381
+ .rates = SNDRV_PCM_RATE_96000,
3382
+ .ep_attr = USB_ENDPOINT_XFER_ISOC |
3383
+ USB_ENDPOINT_SYNC_ASYNC,
3384
+ .rate_min = 96000,
3385
+ .rate_max = 96000,
3386
+ .nr_rates = 1,
3387
+ .maxpacksize = 0x0120,
3388
+ .rate_table = (unsigned int[]) {
3389
+ 96000
3390
+ }
3391
+ }
3392
+ },
3393
+ {
3394
+ .ifnum = -1
3395
+ }
3396
+ }
3397
+ }
3398
+},
3399
+{
3400
+ /*
3401
+ * PIONEER DJ DDJ-SX3
3402
+ * PCM is 12 channels out, 10 channels in @ 44.1 fixed
3403
+ * interface 0, vendor class alt setting 1 for endpoints 5 and 0x86
3404
+ * The feedback for the output is the input.
3405
+ */
3406
+ USB_DEVICE_VENDOR_SPEC(0x2b73, 0x0023),
3407
+ .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) {
3408
+ .ifnum = QUIRK_ANY_INTERFACE,
3409
+ .type = QUIRK_COMPOSITE,
3410
+ .data = (const struct snd_usb_audio_quirk[]) {
3411
+ {
3412
+ .ifnum = 0,
3413
+ .type = QUIRK_AUDIO_FIXED_ENDPOINT,
3414
+ .data = &(const struct audioformat) {
3415
+ .formats = SNDRV_PCM_FMTBIT_S32_LE,
3416
+ .channels = 12,
3417
+ .iface = 0,
3418
+ .altsetting = 1,
3419
+ .altset_idx = 1,
3420
+ .endpoint = 0x05,
3421
+ .ep_attr = USB_ENDPOINT_XFER_ISOC|
3422
+ USB_ENDPOINT_SYNC_ASYNC,
3423
+ .rates = SNDRV_PCM_RATE_44100,
3424
+ .rate_min = 44100,
3425
+ .rate_max = 44100,
3426
+ .nr_rates = 1,
3427
+ .rate_table = (unsigned int[]) { 44100 }
3428
+ }
3429
+ },
3430
+ {
3431
+ .ifnum = 0,
3432
+ .type = QUIRK_AUDIO_FIXED_ENDPOINT,
3433
+ .data = &(const struct audioformat) {
3434
+ .formats = SNDRV_PCM_FMTBIT_S32_LE,
3435
+ .channels = 10,
3436
+ .iface = 0,
3437
+ .altsetting = 1,
3438
+ .altset_idx = 1,
3439
+ .endpoint = 0x86,
3440
+ .ep_attr = USB_ENDPOINT_XFER_ISOC|
3441
+ USB_ENDPOINT_SYNC_ASYNC|
3442
+ USB_ENDPOINT_USAGE_IMPLICIT_FB,
3443
+ .rates = SNDRV_PCM_RATE_44100,
3444
+ .rate_min = 44100,
3445
+ .rate_max = 44100,
3446
+ .nr_rates = 1,
3447
+ .rate_table = (unsigned int[]) { 44100 }
3448
+ }
3449
+ },
3450
+ {
3451
+ .ifnum = -1
3452
+ }
3453
+ }
3454
+ }
3455
+},
3456
+{
3457
+ /*
3458
+ * Pioneer DJ DJM-250MK2
3459
+ * PCM is 8 channels out @ 48 fixed (endpoint 0x01)
3460
+ * and 8 channels in @ 48 fixed (endpoint 0x82).
3461
+ *
3462
+ * Both playback and recording is working, even simultaneously.
3463
+ *
3464
+ * Playback channels could be mapped to:
3465
+ * - CH1
3466
+ * - CH2
3467
+ * - AUX
3468
+ *
3469
+ * Recording channels could be mapped to:
3470
+ * - Post CH1 Fader
3471
+ * - Post CH2 Fader
3472
+ * - Cross Fader A
3473
+ * - Cross Fader B
3474
+ * - MIC
3475
+ * - AUX
3476
+ * - REC OUT
3477
+ *
3478
+ * There is remaining problem with recording directly from PHONO/LINE.
3479
+ * If we map a channel to:
3480
+ * - CH1 Control Tone PHONO
3481
+ * - CH1 Control Tone LINE
3482
+ * - CH2 Control Tone PHONO
3483
+ * - CH2 Control Tone LINE
3484
+ * it is silent.
3485
+ * There is no signal even on other operating systems with official drivers.
3486
+ * The signal appears only when a supported application is started.
3487
+ * This needs to be investigated yet...
3488
+ * (there is quite a lot communication on the USB in both directions)
3489
+ *
3490
+ * In current version this mixer could be used for playback
3491
+ * and for recording from vinyls (through Post CH* Fader)
3492
+ * but not for DVS (Digital Vinyl Systems) like in Mixxx.
3493
+ */
3494
+ USB_DEVICE_VENDOR_SPEC(0x2b73, 0x0017),
3495
+ .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) {
3496
+ .ifnum = QUIRK_ANY_INTERFACE,
3497
+ .type = QUIRK_COMPOSITE,
3498
+ .data = (const struct snd_usb_audio_quirk[]) {
3499
+ {
3500
+ .ifnum = 0,
3501
+ .type = QUIRK_AUDIO_FIXED_ENDPOINT,
3502
+ .data = &(const struct audioformat) {
3503
+ .formats = SNDRV_PCM_FMTBIT_S24_3LE,
3504
+ .channels = 8, // outputs
3505
+ .iface = 0,
3506
+ .altsetting = 1,
3507
+ .altset_idx = 1,
3508
+ .endpoint = 0x01,
3509
+ .ep_attr = USB_ENDPOINT_XFER_ISOC|
3510
+ USB_ENDPOINT_SYNC_ASYNC,
3511
+ .rates = SNDRV_PCM_RATE_48000,
3512
+ .rate_min = 48000,
3513
+ .rate_max = 48000,
3514
+ .nr_rates = 1,
3515
+ .rate_table = (unsigned int[]) { 48000 }
3516
+ }
3517
+ },
3518
+ {
3519
+ .ifnum = 0,
3520
+ .type = QUIRK_AUDIO_FIXED_ENDPOINT,
3521
+ .data = &(const struct audioformat) {
3522
+ .formats = SNDRV_PCM_FMTBIT_S24_3LE,
3523
+ .channels = 8, // inputs
3524
+ .iface = 0,
3525
+ .altsetting = 1,
3526
+ .altset_idx = 1,
3527
+ .endpoint = 0x82,
3528
+ .ep_attr = USB_ENDPOINT_XFER_ISOC|
3529
+ USB_ENDPOINT_SYNC_ASYNC|
3530
+ USB_ENDPOINT_USAGE_IMPLICIT_FB,
3531
+ .rates = SNDRV_PCM_RATE_48000,
3532
+ .rate_min = 48000,
3533
+ .rate_max = 48000,
3534
+ .nr_rates = 1,
3535
+ .rate_table = (unsigned int[]) { 48000 }
3536
+ }
3537
+ },
3538
+ {
3539
+ .ifnum = -1
3540
+ }
3541
+ }
34303542 }
34313543 },
34323544 {
....@@ -3486,43 +3598,119 @@
34863598 }
34873599 },
34883600
3489
-#define ALC1220_VB_DESKTOP(vend, prod) { \
3490
- USB_DEVICE(vend, prod), \
3491
- .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { \
3492
- .vendor_name = "Realtek", \
3493
- .product_name = "ALC1220-VB-DT", \
3494
- .profile_name = "Realtek-ALC1220-VB-Desktop", \
3495
- .ifnum = QUIRK_NO_INTERFACE \
3496
- } \
3497
-}
3498
-ALC1220_VB_DESKTOP(0x0414, 0xa002), /* Gigabyte TRX40 Aorus Pro WiFi */
3499
-ALC1220_VB_DESKTOP(0x0db0, 0x0d64), /* MSI TRX40 Creator */
3500
-ALC1220_VB_DESKTOP(0x0db0, 0x543d), /* MSI TRX40 */
3501
-ALC1220_VB_DESKTOP(0x26ce, 0x0a01), /* Asrock TRX40 Creator */
3502
-#undef ALC1220_VB_DESKTOP
3503
-
3504
-/* Two entries for Gigabyte TRX40 Aorus Master:
3505
- * TRX40 Aorus Master has two USB-audio devices, one for the front headphone
3506
- * with ESS SABRE9218 DAC chip, while another for the rest I/O (the rear
3507
- * panel and the front mic) with Realtek ALC1220-VB.
3508
- * Here we provide two distinct names for making UCM profiles easier.
3509
- */
35103601 {
3511
- USB_DEVICE(0x0414, 0xa000),
3512
- .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
3513
- .vendor_name = "Gigabyte",
3514
- .product_name = "Aorus Master Front Headphone",
3515
- .profile_name = "Gigabyte-Aorus-Master-Front-Headphone",
3516
- .ifnum = QUIRK_NO_INTERFACE
3602
+ /*
3603
+ * Pioneer DJ DJM-900NXS2
3604
+ * 10 channels playback & 12 channels capture @ 44.1/48/96kHz S24LE
3605
+ */
3606
+ USB_DEVICE_VENDOR_SPEC(0x2b73, 0x000a),
3607
+ .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) {
3608
+ .ifnum = QUIRK_ANY_INTERFACE,
3609
+ .type = QUIRK_COMPOSITE,
3610
+ .data = (const struct snd_usb_audio_quirk[]) {
3611
+ {
3612
+ .ifnum = 0,
3613
+ .type = QUIRK_AUDIO_FIXED_ENDPOINT,
3614
+ .data = &(const struct audioformat) {
3615
+ .formats = SNDRV_PCM_FMTBIT_S24_3LE,
3616
+ .channels = 10,
3617
+ .iface = 0,
3618
+ .altsetting = 1,
3619
+ .altset_idx = 1,
3620
+ .endpoint = 0x01,
3621
+ .ep_attr = USB_ENDPOINT_XFER_ISOC|
3622
+ USB_ENDPOINT_SYNC_ASYNC,
3623
+ .rates = SNDRV_PCM_RATE_44100|
3624
+ SNDRV_PCM_RATE_48000|
3625
+ SNDRV_PCM_RATE_96000,
3626
+ .rate_min = 44100,
3627
+ .rate_max = 96000,
3628
+ .nr_rates = 3,
3629
+ .rate_table = (unsigned int[]) {
3630
+ 44100, 48000, 96000
3631
+ }
3632
+ }
3633
+ },
3634
+ {
3635
+ .ifnum = 0,
3636
+ .type = QUIRK_AUDIO_FIXED_ENDPOINT,
3637
+ .data = &(const struct audioformat) {
3638
+ .formats = SNDRV_PCM_FMTBIT_S24_3LE,
3639
+ .channels = 12,
3640
+ .iface = 0,
3641
+ .altsetting = 1,
3642
+ .altset_idx = 1,
3643
+ .endpoint = 0x82,
3644
+ .ep_attr = USB_ENDPOINT_XFER_ISOC|
3645
+ USB_ENDPOINT_SYNC_ASYNC|
3646
+ USB_ENDPOINT_USAGE_IMPLICIT_FB,
3647
+ .rates = SNDRV_PCM_RATE_44100|
3648
+ SNDRV_PCM_RATE_48000|
3649
+ SNDRV_PCM_RATE_96000,
3650
+ .rate_min = 44100,
3651
+ .rate_max = 96000,
3652
+ .nr_rates = 3,
3653
+ .rate_table = (unsigned int[]) {
3654
+ 44100, 48000, 96000
3655
+ }
3656
+ }
3657
+ },
3658
+ {
3659
+ .ifnum = -1
3660
+ }
3661
+ }
35173662 }
35183663 },
3664
+
3665
+/*
3666
+ * MacroSilicon MS2100/MS2106 based AV capture cards
3667
+ *
3668
+ * These claim 96kHz 1ch in the descriptors, but are actually 48kHz 2ch.
3669
+ * They also need QUIRK_AUDIO_ALIGN_TRANSFER, which makes one wonder if
3670
+ * they pretend to be 96kHz mono as a workaround for stereo being broken
3671
+ * by that...
3672
+ *
3673
+ * They also have an issue with initial stream alignment that causes the
3674
+ * channels to be swapped and out of phase, which is dealt with in quirks.c.
3675
+ */
35193676 {
3520
- USB_DEVICE(0x0414, 0xa001),
3521
- .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
3522
- .vendor_name = "Gigabyte",
3523
- .product_name = "Aorus Master Main Audio",
3524
- .profile_name = "Gigabyte-Aorus-Master-Main-Audio",
3525
- .ifnum = QUIRK_NO_INTERFACE
3677
+ USB_AUDIO_DEVICE(0x534d, 0x0021),
3678
+ .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) {
3679
+ .vendor_name = "MacroSilicon",
3680
+ .product_name = "MS210x",
3681
+ .ifnum = QUIRK_ANY_INTERFACE,
3682
+ .type = QUIRK_COMPOSITE,
3683
+ .data = &(const struct snd_usb_audio_quirk[]) {
3684
+ {
3685
+ .ifnum = 2,
3686
+ .type = QUIRK_AUDIO_ALIGN_TRANSFER,
3687
+ },
3688
+ {
3689
+ .ifnum = 2,
3690
+ .type = QUIRK_AUDIO_STANDARD_MIXER,
3691
+ },
3692
+ {
3693
+ .ifnum = 3,
3694
+ .type = QUIRK_AUDIO_FIXED_ENDPOINT,
3695
+ .data = &(const struct audioformat) {
3696
+ .formats = SNDRV_PCM_FMTBIT_S16_LE,
3697
+ .channels = 2,
3698
+ .iface = 3,
3699
+ .altsetting = 1,
3700
+ .altset_idx = 1,
3701
+ .attributes = 0,
3702
+ .endpoint = 0x82,
3703
+ .ep_attr = USB_ENDPOINT_XFER_ISOC |
3704
+ USB_ENDPOINT_SYNC_ASYNC,
3705
+ .rates = SNDRV_PCM_RATE_CONTINUOUS,
3706
+ .rate_min = 48000,
3707
+ .rate_max = 48000,
3708
+ }
3709
+ },
3710
+ {
3711
+ .ifnum = -1
3712
+ }
3713
+ }
35263714 }
35273715 },
35283716
....@@ -3538,13 +3726,7 @@
35383726 * channels to be swapped and out of phase, which is dealt with in quirks.c.
35393727 */
35403728 {
3541
- .match_flags = USB_DEVICE_ID_MATCH_DEVICE |
3542
- USB_DEVICE_ID_MATCH_INT_CLASS |
3543
- USB_DEVICE_ID_MATCH_INT_SUBCLASS,
3544
- .idVendor = 0x534d,
3545
- .idProduct = 0x2109,
3546
- .bInterfaceClass = USB_CLASS_AUDIO,
3547
- .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL,
3729
+ USB_AUDIO_DEVICE(0x534d, 0x2109),
35483730 .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) {
35493731 .vendor_name = "MacroSilicon",
35503732 .product_name = "MS2109",
....@@ -3615,5 +3797,35 @@
36153797 }
36163798 }
36173799 },
3800
+{
3801
+ /* Advanced modes of the Mythware XA001AU.
3802
+ * For the standard mode, Mythware XA001AU has ID ffad:a001
3803
+ */
3804
+ USB_DEVICE_VENDOR_SPEC(0xffad, 0xa001),
3805
+ .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) {
3806
+ .vendor_name = "Mythware",
3807
+ .product_name = "XA001AU",
3808
+ .ifnum = QUIRK_ANY_INTERFACE,
3809
+ .type = QUIRK_COMPOSITE,
3810
+ .data = (const struct snd_usb_audio_quirk[]) {
3811
+ {
3812
+ .ifnum = 0,
3813
+ .type = QUIRK_IGNORE_INTERFACE,
3814
+ },
3815
+ {
3816
+ .ifnum = 1,
3817
+ .type = QUIRK_AUDIO_STANDARD_INTERFACE,
3818
+ },
3819
+ {
3820
+ .ifnum = 2,
3821
+ .type = QUIRK_AUDIO_STANDARD_INTERFACE,
3822
+ },
3823
+ {
3824
+ .ifnum = -1
3825
+ }
3826
+ }
3827
+ }
3828
+},
36183829
36193830 #undef USB_DEVICE_VENDOR_SPEC
3831
+#undef USB_AUDIO_DEVICE