1 | // SPDX-License-Identifier: GPL-2.0-or-later |
2 | /* |
3 | * Additional mixer mapping |
4 | * |
5 | * Copyright (c) 2002 by Takashi Iwai <tiwai@suse.de> |
6 | */ |
7 | |
8 | struct usbmix_dB_map { |
9 | int min; |
10 | int max; |
11 | bool min_mute; |
12 | }; |
13 | |
14 | struct usbmix_name_map { |
15 | int id; |
16 | const char *name; |
17 | int control; |
18 | const struct usbmix_dB_map *dB; |
19 | }; |
20 | |
21 | struct usbmix_selector_map { |
22 | int id; |
23 | int count; |
24 | const char **names; |
25 | }; |
26 | |
27 | struct usbmix_ctl_map { |
28 | u32 id; |
29 | const struct usbmix_name_map *map; |
30 | const struct usbmix_selector_map *selector_map; |
31 | const struct usbmix_connector_map *connector_map; |
32 | }; |
33 | |
34 | /* |
35 | * USB control mappers for SB Exitigy |
36 | */ |
37 | |
38 | /* |
39 | * Topology of SB Extigy (see on the wide screen :) |
40 | |
41 | USB_IN[1] --->FU[2]------------------------------+->MU[16]-->PU[17]-+->FU[18]--+->EU[27]--+->EU[21]-->FU[22]--+->FU[23] > Dig_OUT[24] |
42 | ^ | | | | |
43 | USB_IN[3] -+->SU[5]-->FU[6]--+->MU[14] ->PU[15]->+ | | | +->FU[25] > Dig_OUT[26] |
44 | ^ ^ | | | | |
45 | Dig_IN[4] -+ | | | | +->FU[28]---------------------> Spk_OUT[19] |
46 | | | | | |
47 | Lin-IN[7] -+-->FU[8]---------+ | | +----------------------------------------> Hph_OUT[20] |
48 | | | | |
49 | Mic-IN[9] --+->FU[10]----------------------------+ | |
50 | || | |
51 | || +----------------------------------------------------+ |
52 | VV V |
53 | ++--+->SU[11]-->FU[12] --------------------------------------------------------------------------------------> USB_OUT[13] |
54 | */ |
55 | |
56 | static const struct usbmix_name_map extigy_map[] = { |
57 | /* 1: IT pcm */ |
58 | { 2, "PCM Playback" }, /* FU */ |
59 | /* 3: IT pcm */ |
60 | /* 4: IT digital in */ |
61 | { 5, NULL }, /* DISABLED: this seems to be bogus on some firmware */ |
62 | { 6, "Digital In" }, /* FU */ |
63 | /* 7: IT line */ |
64 | { 8, "Line Playback" }, /* FU */ |
65 | /* 9: IT mic */ |
66 | { 10, "Mic Playback" }, /* FU */ |
67 | { 11, "Capture Source" }, /* SU */ |
68 | { 12, "Capture" }, /* FU */ |
69 | /* 13: OT pcm capture */ |
70 | /* 14: MU (w/o controls) */ |
71 | /* 15: PU (3D enh) */ |
72 | /* 16: MU (w/o controls) */ |
73 | { 17, NULL, 1 }, /* DISABLED: PU-switch (any effect?) */ |
74 | { 17, "Channel Routing" , 2 }, /* PU: mode select */ |
75 | { 18, "Tone Control - Bass" , UAC_FU_BASS }, /* FU */ |
76 | { 18, "Tone Control - Treble" , UAC_FU_TREBLE }, /* FU */ |
77 | { 18, "Master Playback" }, /* FU; others */ |
78 | /* 19: OT speaker */ |
79 | /* 20: OT headphone */ |
80 | { 21, NULL }, /* DISABLED: EU (for what?) */ |
81 | { 22, "Digital Out Playback" }, /* FU */ |
82 | { 23, "Digital Out1 Playback" }, /* FU */ /* FIXME: corresponds to 24 */ |
83 | /* 24: OT digital out */ |
84 | { 25, "IEC958 Optical Playback" }, /* FU */ |
85 | { 26, "IEC958 Optical Playback" }, /* OT */ |
86 | { 27, NULL }, /* DISABLED: EU (for what?) */ |
87 | /* 28: FU speaker (mute) */ |
88 | { 29, NULL }, /* Digital Input Playback Source? */ |
89 | { 0 } /* terminator */ |
90 | }; |
91 | |
92 | /* Sound Blaster MP3+ controls mapping |
93 | * The default mixer channels have totally misleading names, |
94 | * e.g. no Master and fake PCM volume |
95 | * Pavel Mihaylov <bin@bash.info> |
96 | */ |
97 | static const struct usbmix_dB_map mp3plus_dB_1 = {.min = -4781, .max = 0}; |
98 | /* just guess */ |
99 | static const struct usbmix_dB_map mp3plus_dB_2 = {.min = -1781, .max = 618}; |
100 | /* just guess */ |
101 | |
102 | static const struct usbmix_name_map mp3plus_map[] = { |
103 | /* 1: IT pcm */ |
104 | /* 2: IT mic */ |
105 | /* 3: IT line */ |
106 | /* 4: IT digital in */ |
107 | /* 5: OT digital out */ |
108 | /* 6: OT speaker */ |
109 | /* 7: OT pcm capture */ |
110 | { 8, "Capture Source" }, /* FU, default PCM Capture Source */ |
111 | /* (Mic, Input 1 = Line input, Input 2 = Optical input) */ |
112 | { 9, "Master Playback" }, /* FU, default Speaker 1 */ |
113 | /* { 10, "Mic Capture", 1 }, */ /* FU, Mic Capture */ |
114 | { 10, /* "Mic Capture", */ NULL, 2, .dB = &mp3plus_dB_2 }, |
115 | /* FU, Mic Capture */ |
116 | { 10, "Mic Boost" , 7 }, /* FU, default Auto Gain Input */ |
117 | { 11, "Line Capture" , .dB = &mp3plus_dB_2 }, |
118 | /* FU, default PCM Capture */ |
119 | { 12, "Digital In Playback" }, /* FU, default PCM 1 */ |
120 | { 13, /* "Mic Playback", */ .dB = &mp3plus_dB_1 }, |
121 | /* FU, default Mic Playback */ |
122 | { 14, "Line Playback" , .dB = &mp3plus_dB_1 }, /* FU, default Speaker */ |
123 | /* 15: MU */ |
124 | { 0 } /* terminator */ |
125 | }; |
126 | |
127 | /* Topology of SB Audigy 2 NX |
128 | |
129 | +----------------------------->EU[27]--+ |
130 | | v |
131 | | +----------------------------------->SU[29]---->FU[22]-->Dig_OUT[24] |
132 | | | ^ |
133 | USB_IN[1]-+------------+ +->EU[17]->+->FU[11]-+ |
134 | | v | v | |
135 | Dig_IN[4]---+->FU[6]-->MU[16]->FU[18]-+->EU[21]->SU[31]----->FU[30]->Hph_OUT[20] |
136 | | ^ | | |
137 | Lin_IN[7]-+--->FU[8]---+ +->EU[23]->FU[28]------------->Spk_OUT[19] |
138 | | | v |
139 | +--->FU[12]------------------------------------->SU[14]--->USB_OUT[15] |
140 | | ^ |
141 | +->FU[13]--------------------------------------+ |
142 | */ |
143 | static const struct usbmix_name_map audigy2nx_map[] = { |
144 | /* 1: IT pcm playback */ |
145 | /* 4: IT digital in */ |
146 | { 6, "Digital In Playback" }, /* FU */ |
147 | /* 7: IT line in */ |
148 | { 8, "Line Playback" }, /* FU */ |
149 | { 11, "What-U-Hear Capture" }, /* FU */ |
150 | { 12, "Line Capture" }, /* FU */ |
151 | { 13, "Digital In Capture" }, /* FU */ |
152 | { 14, "Capture Source" }, /* SU */ |
153 | /* 15: OT pcm capture */ |
154 | /* 16: MU w/o controls */ |
155 | { 17, NULL }, /* DISABLED: EU (for what?) */ |
156 | { 18, "Master Playback" }, /* FU */ |
157 | /* 19: OT speaker */ |
158 | /* 20: OT headphone */ |
159 | { 21, NULL }, /* DISABLED: EU (for what?) */ |
160 | { 22, "Digital Out Playback" }, /* FU */ |
161 | { 23, NULL }, /* DISABLED: EU (for what?) */ |
162 | /* 24: OT digital out */ |
163 | { 27, NULL }, /* DISABLED: EU (for what?) */ |
164 | { 28, "Speaker Playback" }, /* FU */ |
165 | { 29, "Digital Out Source" }, /* SU */ |
166 | { 30, "Headphone Playback" }, /* FU */ |
167 | { 31, "Headphone Source" }, /* SU */ |
168 | { 0 } /* terminator */ |
169 | }; |
170 | |
171 | static const struct usbmix_name_map mbox1_map[] = { |
172 | { 1, "Clock" }, |
173 | { 0 } /* terminator */ |
174 | }; |
175 | |
176 | static const struct usbmix_selector_map c400_selectors[] = { |
177 | { |
178 | .id = 0x80, |
179 | .count = 2, |
180 | .names = (const char*[]) {"Internal" , "SPDIF" } |
181 | }, |
182 | { 0 } /* terminator */ |
183 | }; |
184 | |
185 | static const struct usbmix_selector_map audigy2nx_selectors[] = { |
186 | { |
187 | .id = 14, /* Capture Source */ |
188 | .count = 3, |
189 | .names = (const char*[]) {"Line" , "Digital In" , "What-U-Hear" } |
190 | }, |
191 | { |
192 | .id = 29, /* Digital Out Source */ |
193 | .count = 3, |
194 | .names = (const char*[]) {"Front" , "PCM" , "Digital In" } |
195 | }, |
196 | { |
197 | .id = 31, /* Headphone Source */ |
198 | .count = 2, |
199 | .names = (const char*[]) {"Front" , "Side" } |
200 | }, |
201 | { 0 } /* terminator */ |
202 | }; |
203 | |
204 | /* Creative SoundBlaster Live! 24-bit External */ |
205 | static const struct usbmix_name_map live24ext_map[] = { |
206 | /* 2: PCM Playback Volume */ |
207 | { 5, "Mic Capture" }, /* FU, default PCM Capture Volume */ |
208 | { 0 } /* terminator */ |
209 | }; |
210 | |
211 | /* LineX FM Transmitter entry - needed to bypass controls bug */ |
212 | static const struct usbmix_name_map linex_map[] = { |
213 | /* 1: IT pcm */ |
214 | /* 2: OT Speaker */ |
215 | { 3, "Master" }, /* FU: master volume - left / right / mute */ |
216 | { 0 } /* terminator */ |
217 | }; |
218 | |
219 | static const struct usbmix_name_map maya44_map[] = { |
220 | /* 1: IT line */ |
221 | { 2, "Line Playback" }, /* FU */ |
222 | /* 3: IT line */ |
223 | { 4, "Line Playback" }, /* FU */ |
224 | /* 5: IT pcm playback */ |
225 | /* 6: MU */ |
226 | { 7, "Master Playback" }, /* FU */ |
227 | /* 8: OT speaker */ |
228 | /* 9: IT line */ |
229 | { 10, "Line Capture" }, /* FU */ |
230 | /* 11: MU */ |
231 | /* 12: OT pcm capture */ |
232 | { } |
233 | }; |
234 | |
235 | /* Section "justlink_map" below added by James Courtier-Dutton <James@superbug.demon.co.uk> |
236 | * sourced from Maplin Electronics (https://www.maplin.co.uk), part number A56AK |
237 | * Part has 2 connectors that act as a single output. (TOSLINK Optical for digital out, and 3.5mm Jack for Analogue out.) |
238 | * The USB Mixer publishes a Microphone and extra Volume controls for it, but none exist on the device, |
239 | * so this map removes all unwanted sliders from alsamixer |
240 | */ |
241 | |
242 | static const struct usbmix_name_map justlink_map[] = { |
243 | /* 1: IT pcm playback */ |
244 | /* 2: Not present */ |
245 | { 3, NULL}, /* IT mic (No mic input on device) */ |
246 | /* 4: Not present */ |
247 | /* 5: OT speacker */ |
248 | /* 6: OT pcm capture */ |
249 | { 7, "Master Playback" }, /* Mute/volume for speaker */ |
250 | { 8, NULL }, /* Capture Switch (No capture inputs on device) */ |
251 | { 9, NULL }, /* Capture Mute/volume (No capture inputs on device */ |
252 | /* 0xa: Not present */ |
253 | /* 0xb: MU (w/o controls) */ |
254 | { 0xc, NULL }, /* Mic feedback Mute/volume (No capture inputs on device) */ |
255 | { 0 } /* terminator */ |
256 | }; |
257 | |
258 | /* TerraTec Aureon 5.1 MkII USB */ |
259 | static const struct usbmix_name_map aureon_51_2_map[] = { |
260 | /* 1: IT USB */ |
261 | /* 2: IT Mic */ |
262 | /* 3: IT Line */ |
263 | /* 4: IT SPDIF */ |
264 | /* 5: OT SPDIF */ |
265 | /* 6: OT Speaker */ |
266 | /* 7: OT USB */ |
267 | { 8, "Capture Source" }, /* SU */ |
268 | { 9, "Master Playback" }, /* FU */ |
269 | { 10, "Mic Capture" }, /* FU */ |
270 | { 11, "Line Capture" }, /* FU */ |
271 | { 12, "IEC958 In Capture" }, /* FU */ |
272 | { 13, "Mic Playback" }, /* FU */ |
273 | { 14, "Line Playback" }, /* FU */ |
274 | /* 15: MU */ |
275 | {} /* terminator */ |
276 | }; |
277 | |
278 | static const struct usbmix_name_map scratch_live_map[] = { |
279 | /* 1: IT Line 1 (USB streaming) */ |
280 | /* 2: OT Line 1 (Speaker) */ |
281 | /* 3: IT Line 1 (Line connector) */ |
282 | { 4, "Line 1 In" }, /* FU */ |
283 | /* 5: OT Line 1 (USB streaming) */ |
284 | /* 6: IT Line 2 (USB streaming) */ |
285 | /* 7: OT Line 2 (Speaker) */ |
286 | /* 8: IT Line 2 (Line connector) */ |
287 | { 9, "Line 2 In" }, /* FU */ |
288 | /* 10: OT Line 2 (USB streaming) */ |
289 | /* 11: IT Mic (Line connector) */ |
290 | /* 12: OT Mic (USB streaming) */ |
291 | { 0 } /* terminator */ |
292 | }; |
293 | |
294 | static const struct usbmix_name_map ebox44_map[] = { |
295 | { 4, NULL }, /* FU */ |
296 | { 6, NULL }, /* MU */ |
297 | { 7, NULL }, /* FU */ |
298 | { 10, NULL }, /* FU */ |
299 | { 11, NULL }, /* MU */ |
300 | { 0 } |
301 | }; |
302 | |
303 | /* "Gamesurround Muse Pocket LT" looks same like "Sound Blaster MP3+" |
304 | * most importand difference is SU[8], it should be set to "Capture Source" |
305 | * to make alsamixer and PA working properly. |
306 | * FIXME: or mp3plus_map should use "Capture Source" too, |
307 | * so this maps can be merget |
308 | */ |
309 | static const struct usbmix_name_map hercules_usb51_map[] = { |
310 | { 8, "Capture Source" }, /* SU, default "PCM Capture Source" */ |
311 | { 9, "Master Playback" }, /* FU, default "Speaker Playback" */ |
312 | { 10, "Mic Boost" , 7 }, /* FU, default "Auto Gain Input" */ |
313 | { 11, "Line Capture" }, /* FU, default "PCM Capture" */ |
314 | { 13, "Mic Bypass Playback" }, /* FU, default "Mic Playback" */ |
315 | { 14, "Line Bypass Playback" }, /* FU, default "Line Playback" */ |
316 | { 0 } /* terminator */ |
317 | }; |
318 | |
319 | /* Plantronics Gamecom 780 has a broken volume control, better to disable it */ |
320 | static const struct usbmix_name_map gamecom780_map[] = { |
321 | { 9, NULL }, /* FU, speaker out */ |
322 | {} |
323 | }; |
324 | |
325 | /* some (all?) SCMS USB3318 devices are affected by a firmware lock up |
326 | * when anything attempts to access FU 10 (control) |
327 | */ |
328 | static const struct usbmix_name_map scms_usb3318_map[] = { |
329 | { 10, NULL }, |
330 | { 0 } |
331 | }; |
332 | |
333 | /* Bose companion 5, the dB conversion factor is 16 instead of 256 */ |
334 | static const struct usbmix_dB_map bose_companion5_dB = {-5006, -6}; |
335 | static const struct usbmix_name_map bose_companion5_map[] = { |
336 | { 3, NULL, .dB = &bose_companion5_dB }, |
337 | { 0 } /* terminator */ |
338 | }; |
339 | |
340 | /* Bose Revolve+ SoundLink, correction of dB maps */ |
341 | static const struct usbmix_dB_map bose_soundlink_dB = {-8283, -0, true}; |
342 | static const struct usbmix_name_map bose_soundlink_map[] = { |
343 | { .id: 2, NULL, .dB = &bose_soundlink_dB }, |
344 | { 0 } /* terminator */ |
345 | }; |
346 | |
347 | /* Sennheiser Communications Headset [PC 8], the dB value is reported as -6 negative maximum */ |
348 | static const struct usbmix_dB_map sennheiser_pc8_dB = {-9500, 0}; |
349 | static const struct usbmix_name_map sennheiser_pc8_map[] = { |
350 | { 9, NULL, .dB = &sennheiser_pc8_dB }, |
351 | { 0 } /* terminator */ |
352 | }; |
353 | |
354 | /* |
355 | * Dell usb dock with ALC4020 codec had a firmware problem where it got |
356 | * screwed up when zero volume is passed; just skip it as a workaround |
357 | * |
358 | * Also the extension unit gives an access error, so skip it as well. |
359 | */ |
360 | static const struct usbmix_name_map dell_alc4020_map[] = { |
361 | { 4, NULL }, /* extension unit */ |
362 | { 16, NULL }, |
363 | { 19, NULL }, |
364 | { 0 } |
365 | }; |
366 | |
367 | /* |
368 | * Corsair Virtuoso calls everything "Headset" without this, leading to |
369 | * applications moving the sidetone control instead of the main one. |
370 | */ |
371 | static const struct usbmix_name_map corsair_virtuoso_map[] = { |
372 | { 3, "Mic Capture" }, |
373 | { 6, "Sidetone Playback" }, |
374 | { 0 } |
375 | }; |
376 | |
377 | /* Microsoft USB Link headset */ |
378 | /* a guess work: raw playback volume values are from 2 to 129 */ |
379 | static const struct usbmix_dB_map ms_usb_link_dB = { -3225, 0, true }; |
380 | static const struct usbmix_name_map ms_usb_link_map[] = { |
381 | { .id: 9, NULL, .dB = &ms_usb_link_dB }, |
382 | { 10, NULL }, /* Headset Capture volume; seems non-working, disabled */ |
383 | { 0 } /* terminator */ |
384 | }; |
385 | |
386 | /* ASUS ROG Zenith II with Realtek ALC1220-VB */ |
387 | static const struct usbmix_name_map asus_zenith_ii_map[] = { |
388 | { 19, NULL, 12 }, /* FU, Input Gain Pad - broken response, disabled */ |
389 | { 16, "Speaker" }, /* OT */ |
390 | { 22, "Speaker Playback" }, /* FU */ |
391 | { 7, "Line" }, /* IT */ |
392 | { 19, "Line Capture" }, /* FU */ |
393 | { 8, "Mic" }, /* IT */ |
394 | { 20, "Mic Capture" }, /* FU */ |
395 | { 9, "Front Mic" }, /* IT */ |
396 | { 21, "Front Mic Capture" }, /* FU */ |
397 | { 17, "IEC958" }, /* OT */ |
398 | { 23, "IEC958 Playback" }, /* FU */ |
399 | {} |
400 | }; |
401 | |
402 | static const struct usbmix_connector_map asus_zenith_ii_connector_map[] = { |
403 | { 10, 16 }, /* (Back) Speaker */ |
404 | { 11, 17 }, /* SPDIF */ |
405 | { 13, 7 }, /* Line */ |
406 | { 14, 8 }, /* Mic */ |
407 | { 15, 9 }, /* Front Mic */ |
408 | {} |
409 | }; |
410 | |
411 | static const struct usbmix_name_map lenovo_p620_rear_map[] = { |
412 | { 19, NULL, 12 }, /* FU, Input Gain Pad */ |
413 | {} |
414 | }; |
415 | |
416 | /* TRX40 mobos with Realtek ALC1220-VB */ |
417 | static const struct usbmix_name_map trx40_mobo_map[] = { |
418 | { 18, NULL }, /* OT, IEC958 - broken response, disabled */ |
419 | { 19, NULL, 12 }, /* FU, Input Gain Pad - broken response, disabled */ |
420 | { 16, "Speaker" }, /* OT */ |
421 | { 22, "Speaker Playback" }, /* FU */ |
422 | { 7, "Line" }, /* IT */ |
423 | { 19, "Line Capture" }, /* FU */ |
424 | { 17, "Front Headphone" }, /* OT */ |
425 | { 23, "Front Headphone Playback" }, /* FU */ |
426 | { 8, "Mic" }, /* IT */ |
427 | { 20, "Mic Capture" }, /* FU */ |
428 | { 9, "Front Mic" }, /* IT */ |
429 | { 21, "Front Mic Capture" }, /* FU */ |
430 | { 24, "IEC958 Playback" }, /* FU */ |
431 | {} |
432 | }; |
433 | |
434 | static const struct usbmix_connector_map trx40_mobo_connector_map[] = { |
435 | { 10, 16 }, /* (Back) Speaker */ |
436 | { 11, 17 }, /* Front Headphone */ |
437 | { 13, 7 }, /* Line */ |
438 | { 14, 8 }, /* Mic */ |
439 | { 15, 9 }, /* Front Mic */ |
440 | {} |
441 | }; |
442 | |
443 | /* Rear panel + front mic on Gigabyte TRX40 Aorus Master with ALC1220-VB */ |
444 | static const struct usbmix_name_map aorus_master_alc1220vb_map[] = { |
445 | { 17, NULL }, /* OT, IEC958?, disabled */ |
446 | { 19, NULL, 12 }, /* FU, Input Gain Pad - broken response, disabled */ |
447 | { 16, "Line Out" }, /* OT */ |
448 | { 22, "Line Out Playback" }, /* FU */ |
449 | { 7, "Line" }, /* IT */ |
450 | { 19, "Line Capture" }, /* FU */ |
451 | { 8, "Mic" }, /* IT */ |
452 | { 20, "Mic Capture" }, /* FU */ |
453 | { 9, "Front Mic" }, /* IT */ |
454 | { 21, "Front Mic Capture" }, /* FU */ |
455 | {} |
456 | }; |
457 | |
458 | /* MSI MPG X570S Carbon Max Wifi with ALC4080 */ |
459 | static const struct usbmix_name_map msi_mpg_x570s_carbon_max_wifi_alc4080_map[] = { |
460 | { .id: 29, .name: "Speaker Playback" }, |
461 | { 30, "Front Headphone Playback" }, |
462 | { 32, "IEC958 Playback" }, |
463 | {} |
464 | }; |
465 | |
466 | /* Gigabyte B450/550 Mobo */ |
467 | static const struct usbmix_name_map gigabyte_b450_map[] = { |
468 | { 24, NULL }, /* OT, IEC958?, disabled */ |
469 | { 21, "Speaker" }, /* OT */ |
470 | { 29, "Speaker Playback" }, /* FU */ |
471 | { 22, "Headphone" }, /* OT */ |
472 | { 30, "Headphone Playback" }, /* FU */ |
473 | { 11, "Line" }, /* IT */ |
474 | { 27, "Line Capture" }, /* FU */ |
475 | { 12, "Mic" }, /* IT */ |
476 | { 28, "Mic Capture" }, /* FU */ |
477 | { 9, "Front Mic" }, /* IT */ |
478 | { 25, "Front Mic Capture" }, /* FU */ |
479 | {} |
480 | }; |
481 | |
482 | static const struct usbmix_connector_map gigabyte_b450_connector_map[] = { |
483 | { 13, 21 }, /* Speaker */ |
484 | { 14, 22 }, /* Headphone */ |
485 | { 19, 11 }, /* Line */ |
486 | { 20, 12 }, /* Mic */ |
487 | { 17, 9 }, /* Front Mic */ |
488 | {} |
489 | }; |
490 | |
491 | /* |
492 | * Control map entries |
493 | */ |
494 | |
495 | static const struct usbmix_ctl_map usbmix_ctl_maps[] = { |
496 | { |
497 | .id = USB_ID(0x041e, 0x3000), |
498 | .map = extigy_map, |
499 | }, |
500 | { |
501 | .id = USB_ID(0x041e, 0x3010), |
502 | .map = mp3plus_map, |
503 | }, |
504 | { |
505 | .id = USB_ID(0x041e, 0x3020), |
506 | .map = audigy2nx_map, |
507 | .selector_map = audigy2nx_selectors, |
508 | }, |
509 | { |
510 | .id = USB_ID(0x041e, 0x3040), |
511 | .map = live24ext_map, |
512 | }, |
513 | { |
514 | .id = USB_ID(0x041e, 0x3048), |
515 | .map = audigy2nx_map, |
516 | .selector_map = audigy2nx_selectors, |
517 | }, |
518 | { /* Plantronics GameCom 780 */ |
519 | .id = USB_ID(0x047f, 0xc010), |
520 | .map = gamecom780_map, |
521 | }, |
522 | { |
523 | /* Hercules Gamesurround Muse Pocket LT |
524 | * (USB 5.1 Channel Audio Adapter) |
525 | */ |
526 | .id = USB_ID(0x06f8, 0xc000), |
527 | .map = hercules_usb51_map, |
528 | }, |
529 | { |
530 | .id = USB_ID(0x0763, 0x2030), |
531 | .selector_map = c400_selectors, |
532 | }, |
533 | { |
534 | .id = USB_ID(0x0763, 0x2031), |
535 | .selector_map = c400_selectors, |
536 | }, |
537 | { |
538 | .id = USB_ID(0x08bb, 0x2702), |
539 | .map = linex_map, |
540 | }, |
541 | { |
542 | .id = USB_ID(0x0a92, 0x0091), |
543 | .map = maya44_map, |
544 | }, |
545 | { |
546 | .id = USB_ID(0x0c45, 0x1158), |
547 | .map = justlink_map, |
548 | }, |
549 | { |
550 | .id = USB_ID(0x0ccd, 0x0028), |
551 | .map = aureon_51_2_map, |
552 | }, |
553 | { |
554 | .id = USB_ID(0x0bda, 0x4014), |
555 | .map = dell_alc4020_map, |
556 | }, |
557 | { |
558 | .id = USB_ID(0x0dba, 0x1000), |
559 | .map = mbox1_map, |
560 | }, |
561 | { |
562 | .id = USB_ID(0x13e5, 0x0001), |
563 | .map = scratch_live_map, |
564 | }, |
565 | { |
566 | .id = USB_ID(0x200c, 0x1018), |
567 | .map = ebox44_map, |
568 | }, |
569 | { |
570 | /* MAYA44 USB+ */ |
571 | .id = USB_ID(0x2573, 0x0008), |
572 | .map = maya44_map, |
573 | }, |
574 | { |
575 | /* KEF X300A */ |
576 | .id = USB_ID(0x27ac, 0x1000), |
577 | .map = scms_usb3318_map, |
578 | }, |
579 | { |
580 | /* Arcam rPAC */ |
581 | .id = USB_ID(0x25c4, 0x0003), |
582 | .map = scms_usb3318_map, |
583 | }, |
584 | { |
585 | /* Bose Companion 5 */ |
586 | .id = USB_ID(0x05a7, 0x1020), |
587 | .map = bose_companion5_map, |
588 | }, |
589 | { |
590 | /* Bose Revolve+ SoundLink */ |
591 | .id = USB_ID(0x05a7, 0x40fa), |
592 | .map = bose_soundlink_map, |
593 | }, |
594 | { |
595 | /* Corsair Virtuoso SE Latest (wired mode) */ |
596 | .id = USB_ID(0x1b1c, 0x0a3f), |
597 | .map = corsair_virtuoso_map, |
598 | }, |
599 | { |
600 | /* Corsair Virtuoso SE Latest (wireless mode) */ |
601 | .id = USB_ID(0x1b1c, 0x0a40), |
602 | .map = corsair_virtuoso_map, |
603 | }, |
604 | { |
605 | /* Corsair Virtuoso SE (wired mode) */ |
606 | .id = USB_ID(0x1b1c, 0x0a3d), |
607 | .map = corsair_virtuoso_map, |
608 | }, |
609 | { |
610 | /* Corsair Virtuoso SE (wireless mode) */ |
611 | .id = USB_ID(0x1b1c, 0x0a3e), |
612 | .map = corsair_virtuoso_map, |
613 | }, |
614 | { |
615 | /* Corsair Virtuoso (wired mode) */ |
616 | .id = USB_ID(0x1b1c, 0x0a41), |
617 | .map = corsair_virtuoso_map, |
618 | }, |
619 | { |
620 | /* Corsair Virtuoso (wireless mode) */ |
621 | .id = USB_ID(0x1b1c, 0x0a42), |
622 | .map = corsair_virtuoso_map, |
623 | }, |
624 | { /* Gigabyte TRX40 Aorus Master (rear panel + front mic) */ |
625 | .id = USB_ID(0x0414, 0xa001), |
626 | .map = aorus_master_alc1220vb_map, |
627 | }, |
628 | { /* Gigabyte TRX40 Aorus Pro WiFi */ |
629 | .id = USB_ID(0x0414, 0xa002), |
630 | .map = trx40_mobo_map, |
631 | .connector_map = trx40_mobo_connector_map, |
632 | }, |
633 | { /* Gigabyte B450/550 Mobo */ |
634 | .id = USB_ID(0x0414, 0xa00d), |
635 | .map = gigabyte_b450_map, |
636 | .connector_map = gigabyte_b450_connector_map, |
637 | }, |
638 | { /* ASUS ROG Zenith II (main audio) */ |
639 | .id = USB_ID(0x0b05, 0x1916), |
640 | .map = asus_zenith_ii_map, |
641 | .connector_map = asus_zenith_ii_connector_map, |
642 | }, |
643 | { /* ASUS ROG Strix */ |
644 | .id = USB_ID(0x0b05, 0x1917), |
645 | .map = trx40_mobo_map, |
646 | .connector_map = trx40_mobo_connector_map, |
647 | }, |
648 | { /* MSI TRX40 Creator */ |
649 | .id = USB_ID(0x0db0, 0x0d64), |
650 | .map = trx40_mobo_map, |
651 | .connector_map = trx40_mobo_connector_map, |
652 | }, |
653 | { /* MSI MPG X570S Carbon Max Wifi */ |
654 | .id = USB_ID(0x0db0, 0x419c), |
655 | .map = msi_mpg_x570s_carbon_max_wifi_alc4080_map, |
656 | }, |
657 | { /* MSI MAG X570S Torpedo Max */ |
658 | .id = USB_ID(0x0db0, 0xa073), |
659 | .map = msi_mpg_x570s_carbon_max_wifi_alc4080_map, |
660 | }, |
661 | { /* MSI TRX40 */ |
662 | .id = USB_ID(0x0db0, 0x543d), |
663 | .map = trx40_mobo_map, |
664 | .connector_map = trx40_mobo_connector_map, |
665 | }, |
666 | { /* Asrock TRX40 Creator */ |
667 | .id = USB_ID(0x26ce, 0x0a01), |
668 | .map = trx40_mobo_map, |
669 | .connector_map = trx40_mobo_connector_map, |
670 | }, |
671 | { /* Lenovo ThinkStation P620 Rear */ |
672 | .id = USB_ID(0x17aa, 0x1046), |
673 | .map = lenovo_p620_rear_map, |
674 | }, |
675 | { |
676 | /* Sennheiser Communications Headset [PC 8] */ |
677 | .id = USB_ID(0x1395, 0x0025), |
678 | .map = sennheiser_pc8_map, |
679 | }, |
680 | { |
681 | /* Microsoft USB Link headset */ |
682 | .id = USB_ID(0x045e, 0x083c), |
683 | .map = ms_usb_link_map, |
684 | }, |
685 | { 0 } /* terminator */ |
686 | }; |
687 | |
688 | /* |
689 | * Control map entries for UAC3 BADD profiles |
690 | */ |
691 | |
692 | static const struct usbmix_name_map uac3_badd_generic_io_map[] = { |
693 | { UAC3_BADD_FU_ID2, "Generic Out Playback" }, |
694 | { UAC3_BADD_FU_ID5, "Generic In Capture" }, |
695 | { 0 } /* terminator */ |
696 | }; |
697 | static const struct usbmix_name_map uac3_badd_headphone_map[] = { |
698 | { UAC3_BADD_FU_ID2, "Headphone Playback" }, |
699 | { 0 } /* terminator */ |
700 | }; |
701 | static const struct usbmix_name_map uac3_badd_speaker_map[] = { |
702 | { UAC3_BADD_FU_ID2, "Speaker Playback" }, |
703 | { 0 } /* terminator */ |
704 | }; |
705 | static const struct usbmix_name_map uac3_badd_microphone_map[] = { |
706 | { UAC3_BADD_FU_ID5, "Mic Capture" }, |
707 | { 0 } /* terminator */ |
708 | }; |
709 | /* Covers also 'headset adapter' profile */ |
710 | static const struct usbmix_name_map uac3_badd_headset_map[] = { |
711 | { UAC3_BADD_FU_ID2, "Headset Playback" }, |
712 | { UAC3_BADD_FU_ID5, "Headset Capture" }, |
713 | { UAC3_BADD_FU_ID7, "Sidetone Mixing" }, |
714 | { 0 } /* terminator */ |
715 | }; |
716 | static const struct usbmix_name_map uac3_badd_speakerphone_map[] = { |
717 | { UAC3_BADD_FU_ID2, "Speaker Playback" }, |
718 | { UAC3_BADD_FU_ID5, "Mic Capture" }, |
719 | { 0 } /* terminator */ |
720 | }; |
721 | |
722 | static const struct usbmix_ctl_map uac3_badd_usbmix_ctl_maps[] = { |
723 | { |
724 | .id = UAC3_FUNCTION_SUBCLASS_GENERIC_IO, |
725 | .map = uac3_badd_generic_io_map, |
726 | }, |
727 | { |
728 | .id = UAC3_FUNCTION_SUBCLASS_HEADPHONE, |
729 | .map = uac3_badd_headphone_map, |
730 | }, |
731 | { |
732 | .id = UAC3_FUNCTION_SUBCLASS_SPEAKER, |
733 | .map = uac3_badd_speaker_map, |
734 | }, |
735 | { |
736 | .id = UAC3_FUNCTION_SUBCLASS_MICROPHONE, |
737 | .map = uac3_badd_microphone_map, |
738 | }, |
739 | { |
740 | .id = UAC3_FUNCTION_SUBCLASS_HEADSET, |
741 | .map = uac3_badd_headset_map, |
742 | }, |
743 | { |
744 | .id = UAC3_FUNCTION_SUBCLASS_HEADSET_ADAPTER, |
745 | .map = uac3_badd_headset_map, |
746 | }, |
747 | { |
748 | .id = UAC3_FUNCTION_SUBCLASS_SPEAKERPHONE, |
749 | .map = uac3_badd_speakerphone_map, |
750 | }, |
751 | { 0 } /* terminator */ |
752 | }; |
753 | |