Commit 1045f5f1 authored by Takashi Iwai's avatar Takashi Iwai

ALSA: usb-audio: Avoid superfluous endpoint setup

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: 2be79d58 ("ALSA: usb-audio: Split endpoint setups for hw_params and prepare (take#2)")
Link: https://lore.kernel.org/r/20221009104212.18877-5-tiwai@suse.deSigned-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 9355b60e
...@@ -129,7 +129,8 @@ struct snd_usb_endpoint { ...@@ -129,7 +129,8 @@ struct snd_usb_endpoint {
in a stream */ in a stream */
bool implicit_fb_sync; /* syncs with implicit feedback */ bool implicit_fb_sync; /* syncs with implicit feedback */
bool lowlatency_playback; /* low-latency playback mode */ 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 */ /* for hw constraints */
const struct audioformat *cur_audiofmt; const struct audioformat *cur_audiofmt;
......
...@@ -824,6 +824,7 @@ snd_usb_endpoint_open(struct snd_usb_audio *chip, ...@@ -824,6 +824,7 @@ snd_usb_endpoint_open(struct snd_usb_audio *chip,
ep->implicit_fb_sync = fp->implicit_fb; ep->implicit_fb_sync = fp->implicit_fb;
ep->need_setup = true; 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", 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, ep->cur_channels, ep->cur_rate,
...@@ -952,7 +953,7 @@ void snd_usb_endpoint_close(struct snd_usb_audio *chip, ...@@ -952,7 +953,7 @@ void snd_usb_endpoint_close(struct snd_usb_audio *chip,
/* Prepare for suspening EP, called from the main suspend handler */ /* Prepare for suspening EP, called from the main suspend handler */
void snd_usb_endpoint_suspend(struct snd_usb_endpoint *ep) void snd_usb_endpoint_suspend(struct snd_usb_endpoint *ep)
{ {
ep->need_setup = true; ep->need_prepare = true;
if (ep->iface_ref) if (ep->iface_ref)
ep->iface_ref->need_setup = true; ep->iface_ref->need_setup = true;
if (ep->clock_ref) if (ep->clock_ref)
...@@ -1335,9 +1336,12 @@ int snd_usb_endpoint_set_params(struct snd_usb_audio *chip, ...@@ -1335,9 +1336,12 @@ int snd_usb_endpoint_set_params(struct snd_usb_audio *chip,
struct snd_usb_endpoint *ep) struct snd_usb_endpoint *ep)
{ {
const struct audioformat *fmt = ep->cur_audiofmt; const struct audioformat *fmt = ep->cur_audiofmt;
int err; int err = 0;
mutex_lock(&chip->mutex); mutex_lock(&chip->mutex);
if (!ep->need_setup)
goto unlock;
/* release old buffers, if any */ /* release old buffers, if any */
err = release_urbs(ep, false); err = release_urbs(ep, false);
if (err < 0) if (err < 0)
...@@ -1386,8 +1390,11 @@ int snd_usb_endpoint_set_params(struct snd_usb_audio *chip, ...@@ -1386,8 +1390,11 @@ int snd_usb_endpoint_set_params(struct snd_usb_audio *chip,
ep->curframesize = ep->curpacksize / ep->cur_frame_bytes; ep->curframesize = ep->curpacksize / ep->cur_frame_bytes;
err = update_clock_ref_rate(chip, ep); err = update_clock_ref_rate(chip, ep);
if (err >= 0) if (err >= 0) {
ep->need_setup = false;
err = 0; err = 0;
}
unlock: unlock:
mutex_unlock(&chip->mutex); mutex_unlock(&chip->mutex);
return err; return err;
...@@ -1437,7 +1444,7 @@ int snd_usb_endpoint_prepare(struct snd_usb_audio *chip, ...@@ -1437,7 +1444,7 @@ int snd_usb_endpoint_prepare(struct snd_usb_audio *chip,
mutex_lock(&chip->mutex); mutex_lock(&chip->mutex);
if (WARN_ON(!ep->iface_ref)) if (WARN_ON(!ep->iface_ref))
goto unlock; goto unlock;
if (!ep->need_setup) if (!ep->need_prepare)
goto unlock; goto unlock;
/* If the interface has been already set up, just set EP parameters */ /* 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, ...@@ -1491,7 +1498,7 @@ int snd_usb_endpoint_prepare(struct snd_usb_audio *chip,
ep->iface_ref->need_setup = false; ep->iface_ref->need_setup = false;
done: done:
ep->need_setup = false; ep->need_prepare = false;
err = 1; err = 1;
unlock: unlock:
......
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