Commit 1965c436 authored by Kai-Heng Feng's avatar Kai-Heng Feng Committed by Takashi Iwai
Browse files

ALSA: usb-audio: Disable autosuspend for Lenovo ThinkStation P620



If USB autosuspend is enabled, both front and rear panel can no longer
detect jack insertion.

Enable USB remote wakeup, i.e. needs_remote_wakeup = 1, doesn't help
either.

So disable USB autosuspend to prevent missing jack detection event.

Signed-off-by: default avatarKai-Heng Feng <kai.heng.feng@canonical.com>
Link: https://lore.kernel.org/r/20200823105854.26950-1-kai.heng.feng@canonical.com


Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent acd46a6b
Loading
Loading
Loading
Loading
+14 −4
Original line number Diff line number Diff line
@@ -2827,14 +2827,24 @@ YAMAHA_DEVICE(0x7010, "UB99"),
/* 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"),
	.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_ANY_INTERFACE,
		.type = QUIRK_SETUP_DISABLE_AUTOSUSPEND
	}
},
/* Lenovo ThinkStation P620 Internal Speaker + Front Headset */
{
	USB_DEVICE(0x17aa, 0x104d),
	QUIRK_DEVICE_PROFILE("Lenovo", "ThinkStation P620 Main",
			     "Lenovo-ThinkStation-P620-Main"),
	.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_ANY_INTERFACE,
		.type = QUIRK_SETUP_DISABLE_AUTOSUSPEND
	}
},

/* Native Instruments MK2 series */
+10 −0
Original line number Diff line number Diff line
@@ -518,6 +518,15 @@ static int setup_fmt_after_resume_quirk(struct snd_usb_audio *chip,
	return 1;	/* Continue with creating streams and mixer */
}

static int setup_disable_autosuspend(struct snd_usb_audio *chip,
				       struct usb_interface *iface,
				       struct usb_driver *driver,
				       const struct snd_usb_audio_quirk *quirk)
{
	driver->supports_autosuspend = 0;
	return 1;	/* Continue with creating streams and mixer */
}

/*
 * audio-interface quirks
 *
@@ -557,6 +566,7 @@ int snd_usb_create_quirk(struct snd_usb_audio *chip,
		[QUIRK_AUDIO_ALIGN_TRANSFER] = create_align_transfer_quirk,
		[QUIRK_AUDIO_STANDARD_MIXER] = create_standard_mixer_quirk,
		[QUIRK_SETUP_FMT_AFTER_RESUME] = setup_fmt_after_resume_quirk,
		[QUIRK_SETUP_DISABLE_AUTOSUSPEND] = setup_disable_autosuspend,
	};

	if (quirk->type < QUIRK_TYPE_COUNT) {
+1 −0
Original line number Diff line number Diff line
@@ -102,6 +102,7 @@ enum quirk_type {
	QUIRK_AUDIO_ALIGN_TRANSFER,
	QUIRK_AUDIO_STANDARD_MIXER,
	QUIRK_SETUP_FMT_AFTER_RESUME,
	QUIRK_SETUP_DISABLE_AUTOSUSPEND,

	QUIRK_TYPE_COUNT
};