linux/sound/usb/mixer_maps.c
<<
>>
Prefs
   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
   8struct usbmix_dB_map {
   9        int min;
  10        int max;
  11        bool min_mute;
  12};
  13
  14struct usbmix_name_map {
  15        int id;
  16        const char *name;
  17        int control;
  18        const struct usbmix_dB_map *dB;
  19};
  20
  21struct usbmix_selector_map {
  22        int id;
  23        int count;
  24        const char **names;
  25};
  26
  27struct 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
  41USB_IN[1] --->FU[2]------------------------------+->MU[16]-->PU[17]-+->FU[18]--+->EU[27]--+->EU[21]-->FU[22]--+->FU[23] > Dig_OUT[24]
  42                                                 ^                  |          |          |                   |
  43USB_IN[3] -+->SU[5]-->FU[6]--+->MU[14] ->PU[15]->+                  |          |          |                   +->FU[25] > Dig_OUT[26]
  44           ^                 ^                   |                  |          |          |
  45Dig_IN[4] -+                 |                   |                  |          |          +->FU[28]---------------------> Spk_OUT[19]
  46                             |                   |                  |          |
  47Lin-IN[7] -+-->FU[8]---------+                   |                  |          +----------------------------------------> Hph_OUT[20]
  48           |                                     |                  |
  49Mic-IN[9] --+->FU[10]----------------------------+                  |
  50           ||                                                       |
  51           ||  +----------------------------------------------------+
  52           VV  V
  53           ++--+->SU[11]-->FU[12] --------------------------------------------------------------------------------------> USB_OUT[13]
  54*/
  55
  56static 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 */
  97static const struct usbmix_dB_map mp3plus_dB_1 = {.min = -4781, .max = 0};
  98                                                /* just guess */
  99static const struct usbmix_dB_map mp3plus_dB_2 = {.min = -1781, .max = 618};
 100                                                /* just guess */
 101
 102static 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          | |                                    ^
 133USB_IN[1]-+------------+              +->EU[17]->+->FU[11]-+
 134            |          v              |          v         |
 135Dig_IN[4]---+->FU[6]-->MU[16]->FU[18]-+->EU[21]->SU[31]----->FU[30]->Hph_OUT[20]
 136            |          ^              |                    |
 137Lin_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*/
 143static 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
 171static const struct usbmix_name_map mbox1_map[] = {
 172        { 1, "Clock" },
 173        { 0 } /* terminator */
 174};
 175
 176static 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
 185static 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 */
 205static 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 */
 212static 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
 219static 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
 242static 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 */
 259static 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
 278static 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
 294static 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 */
 309static 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 */
 320static 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 */
 328static 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 */
 334static const struct usbmix_dB_map bose_companion5_dB = {-5006, -6};
 335static 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 */
 341static const struct usbmix_dB_map bose_soundlink_dB = {-8283, -0, true};
 342static const struct usbmix_name_map bose_soundlink_map[] = {
 343        { 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  */
 348static const struct usbmix_dB_map sennheiser_pc8_dB = {-9500, 0};
 349static 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 */
 360static 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 */
 371static const struct usbmix_name_map corsair_virtuoso_map[] = {
 372        { 3, "Mic Capture" },
 373        { 6, "Sidetone Playback" },
 374        { 0 }
 375};
 376
 377/* Some mobos shipped with a dummy HD-audio show the invalid GET_MIN/GET_MAX
 378 * response for Input Gain Pad (id=19, control=12) and the connector status
 379 * for SPDIF terminal (id=18).  Skip them.
 380 */
 381static const struct usbmix_name_map asus_rog_map[] = {
 382        { 18, NULL }, /* OT, connector control */
 383        { 19, NULL, 12 }, /* FU, Input Gain Pad */
 384        {}
 385};
 386
 387static const struct usbmix_name_map lenovo_p620_rear_map[] = {
 388        { 19, NULL, 12 }, /* FU, Input Gain Pad */
 389        {}
 390};
 391
 392/* TRX40 mobos with Realtek ALC1220-VB */
 393static const struct usbmix_name_map trx40_mobo_map[] = {
 394        { 18, NULL }, /* OT, IEC958 - broken response, disabled */
 395        { 19, NULL, 12 }, /* FU, Input Gain Pad - broken response, disabled */
 396        { 16, "Speaker" },              /* OT */
 397        { 22, "Speaker Playback" },     /* FU */
 398        { 7, "Line" },                  /* IT */
 399        { 19, "Line Capture" },         /* FU */
 400        { 17, "Front Headphone" },      /* OT */
 401        { 23, "Front Headphone Playback" },     /* FU */
 402        { 8, "Mic" },                   /* IT */
 403        { 20, "Mic Capture" },          /* FU */
 404        { 9, "Front Mic" },             /* IT */
 405        { 21, "Front Mic Capture" },    /* FU */
 406        { 24, "IEC958 Playback" },      /* FU */
 407        {}
 408};
 409
 410static const struct usbmix_connector_map trx40_mobo_connector_map[] = {
 411        { 10, 16 },     /* (Back) Speaker */
 412        { 11, 17 },     /* Front Headphone */
 413        { 13, 7 },      /* Line */
 414        { 14, 8 },      /* Mic */
 415        { 15, 9 },      /* Front Mic */
 416        {}
 417};
 418
 419/* Rear panel + front mic on Gigabyte TRX40 Aorus Master with ALC1220-VB */
 420static const struct usbmix_name_map aorus_master_alc1220vb_map[] = {
 421        { 17, NULL },                   /* OT, IEC958?, disabled */
 422        { 19, NULL, 12 }, /* FU, Input Gain Pad - broken response, disabled */
 423        { 16, "Line Out" },             /* OT */
 424        { 22, "Line Out Playback" },    /* FU */
 425        { 7, "Line" },                  /* IT */
 426        { 19, "Line Capture" },         /* FU */
 427        { 8, "Mic" },                   /* IT */
 428        { 20, "Mic Capture" },          /* FU */
 429        { 9, "Front Mic" },             /* IT */
 430        { 21, "Front Mic Capture" },    /* FU */
 431        {}
 432};
 433
 434/* MSI MPG X570S Carbon Max Wifi with ALC4080  */
 435static const struct usbmix_name_map msi_mpg_x570s_carbon_max_wifi_alc4080_map[] = {
 436        { 29, "Speaker Playback" },
 437        { 30, "Front Headphone Playback" },
 438        { 32, "IEC958 Playback" },
 439        {}
 440};
 441
 442/* Gigabyte B450/550 Mobo */
 443static const struct usbmix_name_map gigabyte_b450_map[] = {
 444        { 24, NULL },                   /* OT, IEC958?, disabled */
 445        { 21, "Speaker" },              /* OT */
 446        { 29, "Speaker Playback" },     /* FU */
 447        { 22, "Headphone" },            /* OT */
 448        { 30, "Headphone Playback" },   /* FU */
 449        { 11, "Line" },                 /* IT */
 450        { 27, "Line Capture" },         /* FU */
 451        { 12, "Mic" },                  /* IT */
 452        { 28, "Mic Capture" },          /* FU */
 453        { 9, "Front Mic" },             /* IT */
 454        { 25, "Front Mic Capture" },    /* FU */
 455        {}
 456};
 457
 458static const struct usbmix_connector_map gigabyte_b450_connector_map[] = {
 459        { 13, 21 },     /* Speaker */
 460        { 14, 22 },     /* Headphone */
 461        { 19, 11 },     /* Line */
 462        { 20, 12 },     /* Mic */
 463        { 17, 9 },      /* Front Mic */
 464        {}
 465};
 466
 467/*
 468 * Control map entries
 469 */
 470
 471static const struct usbmix_ctl_map usbmix_ctl_maps[] = {
 472        {
 473                .id = USB_ID(0x041e, 0x3000),
 474                .map = extigy_map,
 475        },
 476        {
 477                .id = USB_ID(0x041e, 0x3010),
 478                .map = mp3plus_map,
 479        },
 480        {
 481                .id = USB_ID(0x041e, 0x3020),
 482                .map = audigy2nx_map,
 483                .selector_map = audigy2nx_selectors,
 484        },
 485        {
 486                .id = USB_ID(0x041e, 0x3040),
 487                .map = live24ext_map,
 488        },
 489        {
 490                .id = USB_ID(0x041e, 0x3048),
 491                .map = audigy2nx_map,
 492                .selector_map = audigy2nx_selectors,
 493        },
 494        {       /* Plantronics GameCom 780 */
 495                .id = USB_ID(0x047f, 0xc010),
 496                .map = gamecom780_map,
 497        },
 498        {
 499                /* Hercules Gamesurround Muse Pocket LT
 500                 * (USB 5.1 Channel Audio Adapter)
 501                 */
 502                .id = USB_ID(0x06f8, 0xc000),
 503                .map = hercules_usb51_map,
 504        },
 505        {
 506                .id = USB_ID(0x0763, 0x2030),
 507                .selector_map = c400_selectors,
 508        },
 509        {
 510                .id = USB_ID(0x0763, 0x2031),
 511                .selector_map = c400_selectors,
 512        },
 513        {
 514                .id = USB_ID(0x08bb, 0x2702),
 515                .map = linex_map,
 516        },
 517        {
 518                .id = USB_ID(0x0a92, 0x0091),
 519                .map = maya44_map,
 520        },
 521        {
 522                .id = USB_ID(0x0c45, 0x1158),
 523                .map = justlink_map,
 524        },
 525        {
 526                .id = USB_ID(0x0ccd, 0x0028),
 527                .map = aureon_51_2_map,
 528        },
 529        {
 530                .id = USB_ID(0x0bda, 0x4014),
 531                .map = dell_alc4020_map,
 532        },
 533        {
 534                .id = USB_ID(0x0dba, 0x1000),
 535                .map = mbox1_map,
 536        },
 537        {
 538                .id = USB_ID(0x13e5, 0x0001),
 539                .map = scratch_live_map,
 540        },
 541        {
 542                .id = USB_ID(0x200c, 0x1018),
 543                .map = ebox44_map,
 544        },
 545        {
 546                /* MAYA44 USB+ */
 547                .id = USB_ID(0x2573, 0x0008),
 548                .map = maya44_map,
 549        },
 550        {
 551                /* KEF X300A */
 552                .id = USB_ID(0x27ac, 0x1000),
 553                .map = scms_usb3318_map,
 554        },
 555        {
 556                /* Arcam rPAC */
 557                .id = USB_ID(0x25c4, 0x0003),
 558                .map = scms_usb3318_map,
 559        },
 560        {
 561                /* Bose Companion 5 */
 562                .id = USB_ID(0x05a7, 0x1020),
 563                .map = bose_companion5_map,
 564        },
 565        {
 566                /* Bose Revolve+ SoundLink */
 567                .id = USB_ID(0x05a7, 0x40fa),
 568                .map = bose_soundlink_map,
 569        },
 570        {
 571                /* Corsair Virtuoso SE Latest (wired mode) */
 572                .id = USB_ID(0x1b1c, 0x0a3f),
 573                .map = corsair_virtuoso_map,
 574        },
 575        {
 576                /* Corsair Virtuoso SE Latest (wireless mode) */
 577                .id = USB_ID(0x1b1c, 0x0a40),
 578                .map = corsair_virtuoso_map,
 579        },
 580        {
 581                /* Corsair Virtuoso SE (wired mode) */
 582                .id = USB_ID(0x1b1c, 0x0a3d),
 583                .map = corsair_virtuoso_map,
 584        },
 585        {
 586                /* Corsair Virtuoso SE (wireless mode) */
 587                .id = USB_ID(0x1b1c, 0x0a3e),
 588                .map = corsair_virtuoso_map,
 589        },
 590        {
 591                /* Corsair Virtuoso (wired mode) */
 592                .id = USB_ID(0x1b1c, 0x0a41),
 593                .map = corsair_virtuoso_map,
 594        },
 595        {
 596                /* Corsair Virtuoso (wireless mode) */
 597                .id = USB_ID(0x1b1c, 0x0a42),
 598                .map = corsair_virtuoso_map,
 599        },
 600        {       /* Gigabyte TRX40 Aorus Master (rear panel + front mic) */
 601                .id = USB_ID(0x0414, 0xa001),
 602                .map = aorus_master_alc1220vb_map,
 603        },
 604        {       /* Gigabyte TRX40 Aorus Pro WiFi */
 605                .id = USB_ID(0x0414, 0xa002),
 606                .map = trx40_mobo_map,
 607                .connector_map = trx40_mobo_connector_map,
 608        },
 609        {       /* Gigabyte B450/550 Mobo */
 610                .id = USB_ID(0x0414, 0xa00d),
 611                .map = gigabyte_b450_map,
 612                .connector_map = gigabyte_b450_connector_map,
 613        },
 614        {       /* ASUS ROG Zenith II */
 615                .id = USB_ID(0x0b05, 0x1916),
 616                .map = asus_rog_map,
 617        },
 618        {       /* ASUS ROG Strix */
 619                .id = USB_ID(0x0b05, 0x1917),
 620                .map = trx40_mobo_map,
 621                .connector_map = trx40_mobo_connector_map,
 622        },
 623        {       /* MSI TRX40 Creator */
 624                .id = USB_ID(0x0db0, 0x0d64),
 625                .map = trx40_mobo_map,
 626                .connector_map = trx40_mobo_connector_map,
 627        },
 628        {       /* MSI MPG X570S Carbon Max Wifi */
 629                .id = USB_ID(0x0db0, 0x419c),
 630                .map = msi_mpg_x570s_carbon_max_wifi_alc4080_map,
 631        },
 632        {       /* MSI MAG X570S Torpedo Max */
 633                .id = USB_ID(0x0db0, 0xa073),
 634                .map = msi_mpg_x570s_carbon_max_wifi_alc4080_map,
 635        },
 636        {       /* MSI TRX40 */
 637                .id = USB_ID(0x0db0, 0x543d),
 638                .map = trx40_mobo_map,
 639                .connector_map = trx40_mobo_connector_map,
 640        },
 641        {       /* Asrock TRX40 Creator */
 642                .id = USB_ID(0x26ce, 0x0a01),
 643                .map = trx40_mobo_map,
 644                .connector_map = trx40_mobo_connector_map,
 645        },
 646        {       /* Lenovo ThinkStation P620 Rear */
 647                .id = USB_ID(0x17aa, 0x1046),
 648                .map = lenovo_p620_rear_map,
 649        },
 650        {
 651                /* Sennheiser Communications Headset [PC 8] */
 652                .id = USB_ID(0x1395, 0x0025),
 653                .map = sennheiser_pc8_map,
 654        },
 655        { 0 } /* terminator */
 656};
 657
 658/*
 659 * Control map entries for UAC3 BADD profiles
 660 */
 661
 662static const struct usbmix_name_map uac3_badd_generic_io_map[] = {
 663        { UAC3_BADD_FU_ID2, "Generic Out Playback" },
 664        { UAC3_BADD_FU_ID5, "Generic In Capture" },
 665        { 0 }                                   /* terminator */
 666};
 667static const struct usbmix_name_map uac3_badd_headphone_map[] = {
 668        { UAC3_BADD_FU_ID2, "Headphone Playback" },
 669        { 0 }                                   /* terminator */
 670};
 671static const struct usbmix_name_map uac3_badd_speaker_map[] = {
 672        { UAC3_BADD_FU_ID2, "Speaker Playback" },
 673        { 0 }                                   /* terminator */
 674};
 675static const struct usbmix_name_map uac3_badd_microphone_map[] = {
 676        { UAC3_BADD_FU_ID5, "Mic Capture" },
 677        { 0 }                                   /* terminator */
 678};
 679/* Covers also 'headset adapter' profile */
 680static const struct usbmix_name_map uac3_badd_headset_map[] = {
 681        { UAC3_BADD_FU_ID2, "Headset Playback" },
 682        { UAC3_BADD_FU_ID5, "Headset Capture" },
 683        { UAC3_BADD_FU_ID7, "Sidetone Mixing" },
 684        { 0 }                                   /* terminator */
 685};
 686static const struct usbmix_name_map uac3_badd_speakerphone_map[] = {
 687        { UAC3_BADD_FU_ID2, "Speaker Playback" },
 688        { UAC3_BADD_FU_ID5, "Mic Capture" },
 689        { 0 }                                   /* terminator */
 690};
 691
 692static const struct usbmix_ctl_map uac3_badd_usbmix_ctl_maps[] = {
 693        {
 694                .id = UAC3_FUNCTION_SUBCLASS_GENERIC_IO,
 695                .map = uac3_badd_generic_io_map,
 696        },
 697        {
 698                .id = UAC3_FUNCTION_SUBCLASS_HEADPHONE,
 699                .map = uac3_badd_headphone_map,
 700        },
 701        {
 702                .id = UAC3_FUNCTION_SUBCLASS_SPEAKER,
 703                .map = uac3_badd_speaker_map,
 704        },
 705        {
 706                .id = UAC3_FUNCTION_SUBCLASS_MICROPHONE,
 707                .map = uac3_badd_microphone_map,
 708        },
 709        {
 710                .id = UAC3_FUNCTION_SUBCLASS_HEADSET,
 711                .map = uac3_badd_headset_map,
 712        },
 713        {
 714                .id = UAC3_FUNCTION_SUBCLASS_HEADSET_ADAPTER,
 715                .map = uac3_badd_headset_map,
 716        },
 717        {
 718                .id = UAC3_FUNCTION_SUBCLASS_SPEAKERPHONE,
 719                .map = uac3_badd_speakerphone_map,
 720        },
 721        { 0 } /* terminator */
 722};
 723