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

ALSA: usb-audio: Disable USB autosuspend properly in setup_disable_autosuspend()

Rear audio on Lenovo ThinkStation P620 stops working after commit
1965c436 ("ALSA: usb-audio: Disable autosuspend for Lenovo
ThinkStation P620"):
[    6.013526] usbcore: registered new interface driver snd-usb-audio
[    6.023064] usb 3-6: cannot get ctl value: req = 0x81, wValue = 0x100, wIndex = 0x0, type = 1
[    6.023083] usb 3-6: cannot get ctl value: req = 0x81, wValue = 0x202, wIndex = 0x0, type = 4
[    6.023090] usb 3-6: cannot get ctl value: req = 0x81, wValue = 0x100, wIndex = 0x0, type = 1
[    6.023098] usb 3-6: cannot get ctl value: req = 0x81, wValue = 0x202, wIndex = 0x0, type = 4
[    6.023103] usb 3-6: cannot get ctl value: req = 0x81, wValue = 0x100, wIndex = 0x0, type = 1
[    6.023110] usb 3-6: cannot get ctl value: req = 0x81, wValue = 0x202, wIndex = 0x0, type = 4
[    6.045846] usb 3-6: cannot get ctl value: req = 0x81, wValue = 0x100, wIndex = 0x0, type = 1
[    6.045866] usb 3-6: cannot get ctl value: req = 0x81, wValue = 0x202, wIndex = 0x0, type = 4
[    6.045877] usb 3-6: cannot get ctl value: req = 0x81, wValue = 0x100, wIndex = 0x0, type = 1
[    6.045886] usb 3-6: cannot get ctl value: req = 0x81, wValue = 0x202, wIndex = 0x0, type = 4
[    6.045894] usb 3-6: cannot get ctl value: req = 0x81, wValue = 0x100, wIndex = 0x0, type = 1
[    6.045908] usb 3-6: cannot get ctl value: req = 0x81, wValue = 0x202, wIndex = 0x0, type = 4

I overlooked the issue because when I was working on the said commit,
only the front audio is tested. Apology for that.

Changing supports_autosuspend in driver is too late for disabling
autosuspend, because it was already used by USB probe routine, so it can
break the balance on the following code that depends on
supports_autosuspend.

Fix it by using usb_disable_autosuspend() helper, and balance the
suspend count in disconnect callback.

Fixes: 1965c436 ("ALSA: usb-audio: Disable autosuspend for Lenovo ThinkStation P620")
Signed-off-by: default avatarKai-Heng Feng <kai.heng.feng@canonical.com>
Cc: <stable@vger.kernel.org>
Link: https://lore.kernel.org/r/20210304043419.287191-1-kai.heng.feng@canonical.comSigned-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent fc7c5c20
...@@ -830,6 +830,8 @@ static int usb_audio_probe(struct usb_interface *intf, ...@@ -830,6 +830,8 @@ static int usb_audio_probe(struct usb_interface *intf,
snd_media_device_create(chip, intf); snd_media_device_create(chip, intf);
} }
chip->quirk_type = quirk->type;
usb_chip[chip->index] = chip; usb_chip[chip->index] = chip;
chip->intf[chip->num_interfaces] = intf; chip->intf[chip->num_interfaces] = intf;
chip->num_interfaces++; chip->num_interfaces++;
...@@ -912,6 +914,9 @@ static void usb_audio_disconnect(struct usb_interface *intf) ...@@ -912,6 +914,9 @@ static void usb_audio_disconnect(struct usb_interface *intf)
} else { } else {
mutex_unlock(&register_mutex); mutex_unlock(&register_mutex);
} }
if (chip->quirk_type & QUIRK_SETUP_DISABLE_AUTOSUSPEND)
usb_enable_autosuspend(interface_to_usbdev(intf));
} }
/* lock the shutdown (disconnect) task and autoresume */ /* lock the shutdown (disconnect) task and autoresume */
......
...@@ -547,7 +547,7 @@ static int setup_disable_autosuspend(struct snd_usb_audio *chip, ...@@ -547,7 +547,7 @@ static int setup_disable_autosuspend(struct snd_usb_audio *chip,
struct usb_driver *driver, struct usb_driver *driver,
const struct snd_usb_audio_quirk *quirk) const struct snd_usb_audio_quirk *quirk)
{ {
driver->supports_autosuspend = 0; usb_disable_autosuspend(interface_to_usbdev(iface));
return 1; /* Continue with creating streams and mixer */ return 1; /* Continue with creating streams and mixer */
} }
......
...@@ -27,6 +27,7 @@ struct snd_usb_audio { ...@@ -27,6 +27,7 @@ struct snd_usb_audio {
struct snd_card *card; struct snd_card *card;
struct usb_interface *intf[MAX_CARD_INTERFACES]; struct usb_interface *intf[MAX_CARD_INTERFACES];
u32 usb_id; u32 usb_id;
uint16_t quirk_type;
struct mutex mutex; struct mutex mutex;
unsigned int system_suspend; unsigned int system_suspend;
atomic_t active; atomic_t active;
......
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