Message ID | 20200804164040.11064-2-kai.heng.feng@canonical.com |
---|---|
State | New |
Headers | show |
Series | [F/OEM-5.6] ALSA: usb-audio: Add support for Lenovo ThinkStation P620 | expand |
On 04.08.20 18:40, Kai-Heng Feng wrote: > BugLink: https://bugs.launchpad.net/bugs/1890317 > > 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: Kai-Heng Feng <kai.heng.feng@canonical.com> > Link: https://lore.kernel.org/r/20200803142612.17156-1-kai.heng.feng@canonical.com > Signed-off-by: Takashi Iwai <tiwai@suse.de> > (backported from commit f8c11eb7da4a99f7777d5afd7ed80dec8a593064 linux-next) > Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com> > --- This would be a case where the goal is to add support for new HW and in doing that seems to modify (admittedly a very small portion) common code. For that reason I would give it some time in oem-5.6 and unstable/groovy before proceeding with focal. Also regression Potential (https://wiki.ubuntu.com/StableReleaseUpdates/#SRU_Bug_Template): Most changes are limited to specific hardware and were successfully verified to work in advance. There is a small change in common code which assumes speakers are always connected. if connection state cannot be obtained. This assumption might be incorrect for other hardware. The result would be a missing error message only. -Stefan > sound/usb/mixer.c | 4 ++++ > sound/usb/mixer_maps.c | 9 +++++++++ > sound/usb/quirks-table.h | 21 +++++++++++++++++++++ > 3 files changed, 34 insertions(+) > > diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c > index 68fefe55e5c0..f29a134ec600 100644 > --- a/sound/usb/mixer.c > +++ b/sound/usb/mixer.c > @@ -1450,6 +1450,10 @@ static int mixer_ctl_connector_get(struct snd_kcontrol *kcontrol, > snd_usb_unlock_shutdown(chip); > > if (ret < 0) { > + if (strstr(kcontrol->id.name, "Speaker")) { > + ucontrol->value.integer.value[0] = 1; > + return 0; > + } > error: > usb_audio_err(chip, > "cannot get connectors status: req = %#x, wValue = %#x, wIndex = %#x, type = %d\n", > diff --git a/sound/usb/mixer_maps.c b/sound/usb/mixer_maps.c > index 9af7aa93f6fa..08eb230e2bff 100644 > --- a/sound/usb/mixer_maps.c > +++ b/sound/usb/mixer_maps.c > @@ -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 */ > static const struct usbmix_name_map trx40_mobo_map[] = { > { 18, NULL }, /* OT, IEC958 - broken response, disabled */ > @@ -573,6 +578,10 @@ static const struct usbmix_ctl_map usbmix_ctl_maps[] = { > .map = trx40_mobo_map, > .connector_map = trx40_mobo_connector_map, > }, > + { /* Lenovo ThinkStation P620 Rear */ > + .id = USB_ID(0x17aa, 0x1046), > + .map = lenovo_p620_rear_map, > + }, > { 0 } /* terminator */ > }; > > diff --git a/sound/usb/quirks-table.h b/sound/usb/quirks-table.h > index 042a5e8eb79d..cb57b0bdafe8 100644 > --- a/sound/usb/quirks-table.h > +++ b/sound/usb/quirks-table.h > @@ -2899,6 +2899,27 @@ YAMAHA_DEVICE(0x7010, "UB99"), > } > }, > > +/* Lenovo ThinkStation P620 Rear Line-in, Line-out and Microphone */ > +{ > + USB_DEVICE(0x17aa, 0x1046), > + .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { > + .vendor_name = "Lenovo", > + .product_name = "ThinkStation P620 Rear", > + .profile_name = "Lenovo-ThinkStation-P620-Rear", > + .ifnum = QUIRK_NO_INTERFACE > + } > +}, > +/* Lenovo ThinkStation P620 Internal Speaker + Front Headset */ > +{ > + USB_DEVICE(0x17aa, 0x104d), > + .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { > + .vendor_name = "Lenovo", > + .product_name = "ThinkStation P620 Main", > + .profile_name = "Lenovo-ThinkStation-P620-Main", > + .ifnum = QUIRK_NO_INTERFACE > + } > +}, > + > /* Native Instruments MK2 series */ > { > /* Komplete Audio 6 */ >
diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c index 68fefe55e5c0..f29a134ec600 100644 --- a/sound/usb/mixer.c +++ b/sound/usb/mixer.c @@ -1450,6 +1450,10 @@ static int mixer_ctl_connector_get(struct snd_kcontrol *kcontrol, snd_usb_unlock_shutdown(chip); if (ret < 0) { + if (strstr(kcontrol->id.name, "Speaker")) { + ucontrol->value.integer.value[0] = 1; + return 0; + } error: usb_audio_err(chip, "cannot get connectors status: req = %#x, wValue = %#x, wIndex = %#x, type = %d\n", diff --git a/sound/usb/mixer_maps.c b/sound/usb/mixer_maps.c index 9af7aa93f6fa..08eb230e2bff 100644 --- a/sound/usb/mixer_maps.c +++ b/sound/usb/mixer_maps.c @@ -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 */ static const struct usbmix_name_map trx40_mobo_map[] = { { 18, NULL }, /* OT, IEC958 - broken response, disabled */ @@ -573,6 +578,10 @@ static const struct usbmix_ctl_map usbmix_ctl_maps[] = { .map = trx40_mobo_map, .connector_map = trx40_mobo_connector_map, }, + { /* Lenovo ThinkStation P620 Rear */ + .id = USB_ID(0x17aa, 0x1046), + .map = lenovo_p620_rear_map, + }, { 0 } /* terminator */ }; diff --git a/sound/usb/quirks-table.h b/sound/usb/quirks-table.h index 042a5e8eb79d..cb57b0bdafe8 100644 --- a/sound/usb/quirks-table.h +++ b/sound/usb/quirks-table.h @@ -2899,6 +2899,27 @@ YAMAHA_DEVICE(0x7010, "UB99"), } }, +/* Lenovo ThinkStation P620 Rear Line-in, Line-out and Microphone */ +{ + USB_DEVICE(0x17aa, 0x1046), + .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { + .vendor_name = "Lenovo", + .product_name = "ThinkStation P620 Rear", + .profile_name = "Lenovo-ThinkStation-P620-Rear", + .ifnum = QUIRK_NO_INTERFACE + } +}, +/* Lenovo ThinkStation P620 Internal Speaker + Front Headset */ +{ + USB_DEVICE(0x17aa, 0x104d), + .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { + .vendor_name = "Lenovo", + .product_name = "ThinkStation P620 Main", + .profile_name = "Lenovo-ThinkStation-P620-Main", + .ifnum = QUIRK_NO_INTERFACE + } +}, + /* Native Instruments MK2 series */ { /* Komplete Audio 6 */