ALSA: usb-audio: Avoid superfluous endpoint setup
authorTakashi Iwai <tiwai@suse.de>
Sun, 9 Oct 2022 10:42:12 +0000 (12:42 +0200)
committerTakashi Iwai <tiwai@suse.de>
Sun, 9 Oct 2022 10:43:26 +0000 (12:43 +0200)
After splitting to snd_usb_endpoint_set_params() and *_prepare(), the
skip of each function should be checked with different flags, while we
still use ep->need_setup as the single one.  Introduce
ep->need_prepare for indicating the need of prepare, and also add the
missing check of ep->need_setup at the set_params.

Fixes: 2be79d586454 ("ALSA: usb-audio: Split endpoint setups for hw_params and prepare (take#2)")
Link: https://lore.kernel.org/r/20221009104212.18877-5-tiwai@suse.de
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/usb/card.h
sound/usb/endpoint.c

index ca75f22..4006155 100644 (file)
@@ -129,7 +129,8 @@ struct snd_usb_endpoint {
                                           in a stream */
        bool implicit_fb_sync;          /* syncs with implicit feedback */
        bool lowlatency_playback;       /* low-latency playback mode */
-       bool need_setup;                /* (re-)need for configure? */
+       bool need_setup;                /* (re-)need for hw_params? */
+       bool need_prepare;              /* (re-)need for prepare? */
 
        /* for hw constraints */
        const struct audioformat *cur_audiofmt;
index 44cce6c..d0b8d61 100644 (file)
@@ -824,6 +824,7 @@ snd_usb_endpoint_open(struct snd_usb_audio *chip,
 
                ep->implicit_fb_sync = fp->implicit_fb;
                ep->need_setup = true;
+               ep->need_prepare = true;
 
                usb_audio_dbg(chip, "  channels=%d, rate=%d, format=%s, period_bytes=%d, periods=%d, implicit_fb=%d\n",
                              ep->cur_channels, ep->cur_rate,
@@ -952,7 +953,7 @@ void snd_usb_endpoint_close(struct snd_usb_audio *chip,
 /* Prepare for suspening EP, called from the main suspend handler */
 void snd_usb_endpoint_suspend(struct snd_usb_endpoint *ep)
 {
-       ep->need_setup = true;
+       ep->need_prepare = true;
        if (ep->iface_ref)
                ep->iface_ref->need_setup = true;
        if (ep->clock_ref)
@@ -1335,9 +1336,12 @@ int snd_usb_endpoint_set_params(struct snd_usb_audio *chip,
                                struct snd_usb_endpoint *ep)
 {
        const struct audioformat *fmt = ep->cur_audiofmt;
-       int err;
+       int err = 0;
 
        mutex_lock(&chip->mutex);
+       if (!ep->need_setup)
+               goto unlock;
+
        /* release old buffers, if any */
        err = release_urbs(ep, false);
        if (err < 0)
@@ -1386,8 +1390,11 @@ int snd_usb_endpoint_set_params(struct snd_usb_audio *chip,
        ep->curframesize = ep->curpacksize / ep->cur_frame_bytes;
 
        err = update_clock_ref_rate(chip, ep);
-       if (err >= 0)
+       if (err >= 0) {
+               ep->need_setup = false;
                err = 0;
+       }
+
  unlock:
        mutex_unlock(&chip->mutex);
        return err;
@@ -1437,7 +1444,7 @@ int snd_usb_endpoint_prepare(struct snd_usb_audio *chip,
        mutex_lock(&chip->mutex);
        if (WARN_ON(!ep->iface_ref))
                goto unlock;
-       if (!ep->need_setup)
+       if (!ep->need_prepare)
                goto unlock;
 
        /* If the interface has been already set up, just set EP parameters */
@@ -1491,7 +1498,7 @@ int snd_usb_endpoint_prepare(struct snd_usb_audio *chip,
        ep->iface_ref->need_setup = false;
 
  done:
-       ep->need_setup = false;
+       ep->need_prepare = false;
        err = 1;
 
 unlock: