Commit f8c11eb7 authored by Kai-Heng Feng's avatar Kai-Heng Feng Committed by Takashi Iwai

ALSA: usb-audio: Add support for Lenovo ThinkStation P620

Lenovo ThinkStation P620 is like other TRX40 boards, is equipped with
two USB audio cards.

USB device (17aa:104d) provides functionality for Internal Speaker and
Front Headset. It's UAC v2, so it supports insertion control (jack
detection). However, when trying to get the connector status of the
speaker, an error occurs:
[    5.787405] usb 3-1: cannot get connectors status: req = 0x81, wValue = 0x200, wIndex = 0x1000, type = 0

Since the insertion control works perfectly for the headset, the error
for speaker is probably casued by connecting internally. So let's relax
the error for a bit if it's a speaker, and always reports it's connected.

USB device (17aa:1046) is for rear Line-in, Line-out and Microphone.
The insertion control works for all three jacks. However, there's an
Function Unit that doesn't work:
[    5.905415] usb 3-6: cannot get ctl value: req = 0x83, wValue = 0xc00, wIndex = 0x1300, type = 4
[    5.905418] usb 3-6: 19:0: cannot get min/max values for control 12 (id 19)

So turn off the FU to avoid the error.

Also, add specific card name for both devices, so userspace can easily
indentify both cards.
Signed-off-by: default avatarKai-Heng Feng <kai.heng.feng@canonical.com>
Link: https://lore.kernel.org/r/20200803142612.17156-1-kai.heng.feng@canonical.comSigned-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 103f528d
...@@ -1463,6 +1463,10 @@ static int mixer_ctl_connector_get(struct snd_kcontrol *kcontrol, ...@@ -1463,6 +1463,10 @@ static int mixer_ctl_connector_get(struct snd_kcontrol *kcontrol,
snd_usb_unlock_shutdown(chip); snd_usb_unlock_shutdown(chip);
if (ret < 0) { if (ret < 0) {
if (strstr(kcontrol->id.name, "Speaker")) {
ucontrol->value.integer.value[0] = 1;
return 0;
}
error: error:
usb_audio_err(chip, usb_audio_err(chip,
"cannot get connectors status: req = %#x, wValue = %#x, wIndex = %#x, type = %d\n", "cannot get connectors status: req = %#x, wValue = %#x, wIndex = %#x, type = %d\n",
......
...@@ -370,6 +370,11 @@ static const struct usbmix_name_map asus_rog_map[] = { ...@@ -370,6 +370,11 @@ static const struct usbmix_name_map asus_rog_map[] = {
{} {}
}; };
static const struct usbmix_name_map lenovo_p620_rear_map[] = {
{ 19, NULL, 12 }, /* FU, Input Gain Pad */
{}
};
/* TRX40 mobos with Realtek ALC1220-VB */ /* TRX40 mobos with Realtek ALC1220-VB */
static const struct usbmix_name_map trx40_mobo_map[] = { static const struct usbmix_name_map trx40_mobo_map[] = {
{ 18, NULL }, /* OT, IEC958 - broken response, disabled */ { 18, NULL }, /* OT, IEC958 - broken response, disabled */
...@@ -573,6 +578,10 @@ static const struct usbmix_ctl_map usbmix_ctl_maps[] = { ...@@ -573,6 +578,10 @@ static const struct usbmix_ctl_map usbmix_ctl_maps[] = {
.map = trx40_mobo_map, .map = trx40_mobo_map,
.connector_map = trx40_mobo_connector_map, .connector_map = trx40_mobo_connector_map,
}, },
{ /* Lenovo ThinkStation P620 Rear */
.id = USB_ID(0x17aa, 0x1046),
.map = lenovo_p620_rear_map,
},
{ 0 } /* terminator */ { 0 } /* terminator */
}; };
......
...@@ -2794,6 +2794,19 @@ YAMAHA_DEVICE(0x7010, "UB99"), ...@@ -2794,6 +2794,19 @@ YAMAHA_DEVICE(0x7010, "UB99"),
QUIRK_RENAME_DEVICE("Rane", "SL-1") QUIRK_RENAME_DEVICE("Rane", "SL-1")
}, },
/* Lenovo ThinkStation P620 Rear Line-in, Line-out and Microphone */
{
USB_DEVICE(0x17aa, 0x1046),
QUIRK_DEVICE_PROFILE("Lenovo", "ThinkStation P620 Rear",
"Lenovo-ThinkStation-P620-Rear"),
},
/* Lenovo ThinkStation P620 Internal Speaker + Front Headset */
{
USB_DEVICE(0x17aa, 0x104d),
QUIRK_DEVICE_PROFILE("Lenovo", "ThinkStation P620 Main",
"Lenovo-ThinkStation-P620-Main"),
},
/* Native Instruments MK2 series */ /* Native Instruments MK2 series */
{ {
/* Komplete Audio 6 */ /* Komplete Audio 6 */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment