diff mbox series

[F/OEM-5.6] ALSA: usb-audio: Add support for Lenovo ThinkStation P620

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

Commit Message

Kai-Heng Feng Aug. 4, 2020, 4:40 p.m. UTC
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>
---
 sound/usb/mixer.c        |  4 ++++
 sound/usb/mixer_maps.c   |  9 +++++++++
 sound/usb/quirks-table.h | 21 +++++++++++++++++++++
 3 files changed, 34 insertions(+)

Comments

Stefan Bader Aug. 5, 2020, 6:47 a.m. UTC | #1
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 mbox series

Patch

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 */