ALSA: usb-audio: Avoid unnecessary interface change at EP close
authorTakashi Iwai <tiwai@suse.de>
Sun, 9 Oct 2022 10:42:09 +0000 (12:42 +0200)
committerTakashi Iwai <tiwai@suse.de>
Sun, 9 Oct 2022 10:43:24 +0000 (12:43 +0200)
We toggle USB interface at PCM prepare and reset at close.  When the
PCM isn't prepared, resetting again makes little sense.
Check the current altset and avoid unnecessary interface reset at EP
close.

Link: https://lore.kernel.org/r/20221009104212.18877-2-tiwai@suse.de
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/usb/endpoint.c

index 48a3843a08f11ff23617e8ac6a0e5291222e7982..f21acbc9f4f40f8e75ff62c9a136689ae13fad31 100644 (file)
@@ -32,6 +32,7 @@ struct snd_usb_iface_ref {
        unsigned char iface;
        bool need_setup;
        int opened;
+       int altset;
        struct list_head list;
 };
 
@@ -899,6 +900,9 @@ static int endpoint_set_interface(struct snd_usb_audio *chip,
        int altset = set ? ep->altsetting : 0;
        int err;
 
+       if (ep->iface_ref->altset == altset)
+               return 0;
+
        usb_audio_dbg(chip, "Setting usb interface %d:%d for EP 0x%x\n",
                      ep->iface, altset, ep->ep_num);
        err = usb_set_interface(chip->dev, ep->iface, altset);
@@ -910,6 +914,7 @@ static int endpoint_set_interface(struct snd_usb_audio *chip,
 
        if (chip->quirk_flags & QUIRK_FLAG_IFACE_DELAY)
                msleep(50);
+       ep->iface_ref->altset = altset;
        return 0;
 }