| .. | .. |
|---|
| 1 | +/* SPDX-License-Identifier: GPL-2.0-or-later */ |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * ALSA USB Audio Driver |
|---|
| 3 | 4 | * |
|---|
| 4 | 5 | * Copyright (c) 2002 by Takashi Iwai <tiwai@suse.de>, |
|---|
| 5 | 6 | * 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 | 7 | */ |
|---|
| 22 | 8 | |
|---|
| 23 | 9 | /* |
|---|
| .. | .. |
|---|
| 39 | 25 | .idProduct = prod, \ |
|---|
| 40 | 26 | .bInterfaceClass = USB_CLASS_VENDOR_SPEC |
|---|
| 41 | 27 | |
|---|
| 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 | + |
|---|
| 62 | 38 | /* FTDI devices */ |
|---|
| 63 | 39 | { |
|---|
| 64 | 40 | USB_DEVICE(0x0403, 0xb8d8), |
|---|
| .. | .. |
|---|
| 92 | 68 | } |
|---|
| 93 | 69 | }, |
|---|
| 94 | 70 | |
|---|
| 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 | + */ |
|---|
| 96 | 88 | { |
|---|
| 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 | + }, |
|---|
| 140 | 122 | }, |
|---|
| 141 | 123 | |
|---|
| 142 | 124 | /* |
|---|
| 143 | 125 | * HP Wireless Audio |
|---|
| 144 | 126 | * When not ignored, causes instability issues for some users, forcing them to |
|---|
| 145 | | - * blacklist the entire module. |
|---|
| 127 | + * skip the entire module. |
|---|
| 146 | 128 | */ |
|---|
| 147 | 129 | { |
|---|
| 148 | 130 | USB_DEVICE(0x0424, 0xb832), |
|---|
| .. | .. |
|---|
| 179 | 161 | * Logitech QuickCam: bDeviceClass is vendor-specific, so generic interface |
|---|
| 180 | 162 | * class matches do not take effect without an explicit ID match. |
|---|
| 181 | 163 | */ |
|---|
| 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) }, |
|---|
| 250 | 171 | |
|---|
| 251 | 172 | /* |
|---|
| 252 | 173 | * Yamaha devices |
|---|
| .. | .. |
|---|
| 2110 | 2031 | } |
|---|
| 2111 | 2032 | }, |
|---|
| 2112 | 2033 | { |
|---|
| 2034 | + /* M-Audio Micro */ |
|---|
| 2035 | + USB_DEVICE_VENDOR_SPEC(0x0763, 0x201a), |
|---|
| 2036 | +}, |
|---|
| 2037 | +{ |
|---|
| 2113 | 2038 | USB_DEVICE_VENDOR_SPEC(0x0763, 0x2030), |
|---|
| 2114 | 2039 | .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { |
|---|
| 2115 | 2040 | /* .vendor_name = "M-Audio", */ |
|---|
| .. | .. |
|---|
| 2442 | 2367 | USB_DEVICE(0x086a, 0x0001), |
|---|
| 2443 | 2368 | .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { |
|---|
| 2444 | 2369 | .vendor_name = "Emagic", |
|---|
| 2445 | | - /* .product_name = "Unitor8", */ |
|---|
| 2370 | + .product_name = "Unitor8", |
|---|
| 2446 | 2371 | .ifnum = 2, |
|---|
| 2447 | 2372 | .type = QUIRK_MIDI_EMAGIC, |
|---|
| 2448 | 2373 | .data = & (const struct snd_usb_midi_endpoint_info) { |
|---|
| .. | .. |
|---|
| 2639 | 2564 | } |
|---|
| 2640 | 2565 | }, |
|---|
| 2641 | 2566 | { |
|---|
| 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 | | -{ |
|---|
| 2650 | 2567 | USB_DEVICE(0x0ccd, 0x0035), |
|---|
| 2651 | 2568 | .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { |
|---|
| 2652 | 2569 | .vendor_name = "Miditech", |
|---|
| 2653 | 2570 | .product_name = "Play'n Roll", |
|---|
| 2654 | 2571 | .ifnum = 0, |
|---|
| 2655 | 2572 | .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 |
|---|
| 2674 | 2573 | } |
|---|
| 2675 | 2574 | }, |
|---|
| 2676 | 2575 | |
|---|
| .. | .. |
|---|
| 2721 | 2620 | .data = (const struct snd_usb_audio_quirk[]) { |
|---|
| 2722 | 2621 | { |
|---|
| 2723 | 2622 | .ifnum = 0, |
|---|
| 2623 | + .type = QUIRK_AUDIO_STANDARD_MIXER, |
|---|
| 2624 | + }, |
|---|
| 2625 | + { |
|---|
| 2626 | + .ifnum = 0, |
|---|
| 2724 | 2627 | .type = QUIRK_AUDIO_FIXED_ENDPOINT, |
|---|
| 2725 | 2628 | .data = &(const struct audioformat) { |
|---|
| 2726 | 2629 | .formats = SNDRV_PCM_FMTBIT_S24_3LE, |
|---|
| .. | .. |
|---|
| 2731 | 2634 | .attributes = UAC_EP_CS_ATTR_SAMPLE_RATE, |
|---|
| 2732 | 2635 | .endpoint = 0x01, |
|---|
| 2733 | 2636 | .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, |
|---|
| 2734 | 2663 | .rates = SNDRV_PCM_RATE_44100 | |
|---|
| 2735 | 2664 | SNDRV_PCM_RATE_48000, |
|---|
| 2736 | 2665 | .rate_min = 44100, |
|---|
| .. | .. |
|---|
| 2828 | 2757 | } |
|---|
| 2829 | 2758 | }, |
|---|
| 2830 | 2759 | |
|---|
| 2831 | | -/* */ |
|---|
| 2760 | +/* Lenovo ThinkStation P620 Rear Line-in, Line-out and Microphone */ |
|---|
| 2832 | 2761 | { |
|---|
| 2833 | | - /* aka. Serato Scratch Live DJ Box */ |
|---|
| 2834 | | - USB_DEVICE(0x13e5, 0x0001), |
|---|
| 2762 | + USB_DEVICE(0x17aa, 0x1046), |
|---|
| 2835 | 2763 | .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 |
|---|
| 2839 | 2774 | } |
|---|
| 2840 | 2775 | }, |
|---|
| 2841 | 2776 | |
|---|
| .. | .. |
|---|
| 2871 | 2806 | }, |
|---|
| 2872 | 2807 | |
|---|
| 2873 | 2808 | /* 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 */ |
|---|
| 2878 | 2810 | |
|---|
| 2879 | 2811 | /* Miditech devices */ |
|---|
| 2880 | 2812 | { |
|---|
| .. | .. |
|---|
| 2905 | 2837 | */ |
|---|
| 2906 | 2838 | |
|---|
| 2907 | 2839 | #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), \ |
|---|
| 2915 | 2841 | .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { \ |
|---|
| 2916 | 2842 | .vendor_name = vname, \ |
|---|
| 2917 | 2843 | .product_name = pname, \ |
|---|
| 2918 | 2844 | .ifnum = QUIRK_ANY_INTERFACE, \ |
|---|
| 2919 | 2845 | .type = QUIRK_AUDIO_ALIGN_TRANSFER, \ |
|---|
| 2846 | + .shares_media_device = 1, \ |
|---|
| 2920 | 2847 | } \ |
|---|
| 2921 | 2848 | } |
|---|
| 2922 | 2849 | |
|---|
| .. | .. |
|---|
| 2940 | 2867 | |
|---|
| 2941 | 2868 | /* Syntek STK1160 */ |
|---|
| 2942 | 2869 | { |
|---|
| 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), |
|---|
| 2950 | 2871 | .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { |
|---|
| 2951 | 2872 | .vendor_name = "Syntek", |
|---|
| 2952 | 2873 | .product_name = "STK1160", |
|---|
| .. | .. |
|---|
| 3108 | 3029 | }, |
|---|
| 3109 | 3030 | { |
|---|
| 3110 | 3031 | /* 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), |
|---|
| 3115 | 3033 | .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { |
|---|
| 3116 | 3034 | .vendor_name = "TASCAM", |
|---|
| 3117 | 3035 | .product_name = "US122 MKII", |
|---|
| .. | .. |
|---|
| 3296 | 3214 | } |
|---|
| 3297 | 3215 | }, |
|---|
| 3298 | 3216 | |
|---|
| 3217 | +/* Rane SL-1 */ |
|---|
| 3299 | 3218 | { |
|---|
| 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 | + } |
|---|
| 3309 | 3224 | }, |
|---|
| 3310 | 3225 | |
|---|
| 3311 | 3226 | /* disabled due to regression for other devices; |
|---|
| .. | .. |
|---|
| 3408 | 3323 | } |
|---|
| 3409 | 3324 | } |
|---|
| 3410 | 3325 | }, |
|---|
| 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 | | -}, |
|---|
| 3421 | 3326 | /* Dell WD19 Dock */ |
|---|
| 3422 | 3327 | { |
|---|
| 3423 | 3328 | USB_DEVICE(0x0bda, 0x402e), |
|---|
| 3424 | 3329 | .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", |
|---|
| 3428 | 3330 | .ifnum = QUIRK_ANY_INTERFACE, |
|---|
| 3429 | 3331 | .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 | + } |
|---|
| 3430 | 3542 | } |
|---|
| 3431 | 3543 | }, |
|---|
| 3432 | 3544 | { |
|---|
| .. | .. |
|---|
| 3486 | 3598 | } |
|---|
| 3487 | 3599 | }, |
|---|
| 3488 | 3600 | |
|---|
| 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 | | - */ |
|---|
| 3510 | 3601 | { |
|---|
| 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 | + } |
|---|
| 3517 | 3662 | } |
|---|
| 3518 | 3663 | }, |
|---|
| 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 | + */ |
|---|
| 3519 | 3676 | { |
|---|
| 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 | + } |
|---|
| 3526 | 3714 | } |
|---|
| 3527 | 3715 | }, |
|---|
| 3528 | 3716 | |
|---|
| .. | .. |
|---|
| 3538 | 3726 | * channels to be swapped and out of phase, which is dealt with in quirks.c. |
|---|
| 3539 | 3727 | */ |
|---|
| 3540 | 3728 | { |
|---|
| 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), |
|---|
| 3548 | 3730 | .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { |
|---|
| 3549 | 3731 | .vendor_name = "MacroSilicon", |
|---|
| 3550 | 3732 | .product_name = "MS2109", |
|---|
| .. | .. |
|---|
| 3615 | 3797 | } |
|---|
| 3616 | 3798 | } |
|---|
| 3617 | 3799 | }, |
|---|
| 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 | +}, |
|---|
| 3618 | 3829 | |
|---|
| 3619 | 3830 | #undef USB_DEVICE_VENDOR_SPEC |
|---|
| 3831 | +#undef USB_AUDIO_DEVICE |
|---|