Commit 79764ec7 authored by Takashi Iwai's avatar Takashi Iwai

Revert "ALSA: usb-audio: Split endpoint setups for hw_params and prepare"

This reverts commit ff878b40.

Unfortunately the recent fix seems bringing another regressions with
PulseAudio / pipewire, at least for Steinberg and MOTU devices.

As a temporary solution, do a straight revert.  The issue for Android
will be revisited again later by another different fix (if any).

Fixes: ff878b40 ("ALSA: usb-audio: Split endpoint setups for hw_params and prepare")
Cc: <stable@vger.kernel.org>
BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=216500
Link: https://lore.kernel.org/r/20220920113929.25162-1-tiwai@suse.deSigned-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent c3afa2a4
...@@ -758,8 +758,7 @@ bool snd_usb_endpoint_compatible(struct snd_usb_audio *chip, ...@@ -758,8 +758,7 @@ bool snd_usb_endpoint_compatible(struct snd_usb_audio *chip,
* The endpoint needs to be closed via snd_usb_endpoint_close() later. * The endpoint needs to be closed via snd_usb_endpoint_close() later.
* *
* Note that this function doesn't configure the endpoint. The substream * Note that this function doesn't configure the endpoint. The substream
* needs to set it up later via snd_usb_endpoint_set_params() and * needs to set it up later via snd_usb_endpoint_configure().
* snd_usb_endpoint_prepare().
*/ */
struct snd_usb_endpoint * struct snd_usb_endpoint *
snd_usb_endpoint_open(struct snd_usb_audio *chip, snd_usb_endpoint_open(struct snd_usb_audio *chip,
...@@ -1293,13 +1292,12 @@ static int sync_ep_set_params(struct snd_usb_endpoint *ep) ...@@ -1293,13 +1292,12 @@ static int sync_ep_set_params(struct snd_usb_endpoint *ep)
/* /*
* snd_usb_endpoint_set_params: configure an snd_usb_endpoint * snd_usb_endpoint_set_params: configure an snd_usb_endpoint
* *
* It's called either from hw_params callback.
* Determine the number of URBs to be used on this endpoint. * Determine the number of URBs to be used on this endpoint.
* An endpoint must be configured before it can be started. * An endpoint must be configured before it can be started.
* An endpoint that is already running can not be reconfigured. * An endpoint that is already running can not be reconfigured.
*/ */
int snd_usb_endpoint_set_params(struct snd_usb_audio *chip, static 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;
...@@ -1382,18 +1380,18 @@ static int init_sample_rate(struct snd_usb_audio *chip, ...@@ -1382,18 +1380,18 @@ static int init_sample_rate(struct snd_usb_audio *chip,
} }
/* /*
* snd_usb_endpoint_prepare: Prepare the endpoint * snd_usb_endpoint_configure: Configure the endpoint
* *
* This function sets up the EP to be fully usable state. * This function sets up the EP to be fully usable state.
* It's called either from prepare callback. * It's called either from hw_params or prepare callback.
* The function checks need_setup flag, and performs nothing unless needed, * The function checks need_setup flag, and performs nothing unless needed,
* so it's safe to call this multiple times. * so it's safe to call this multiple times.
* *
* This returns zero if unchanged, 1 if the configuration has changed, * This returns zero if unchanged, 1 if the configuration has changed,
* or a negative error code. * or a negative error code.
*/ */
int snd_usb_endpoint_prepare(struct snd_usb_audio *chip, int snd_usb_endpoint_configure(struct snd_usb_audio *chip,
struct snd_usb_endpoint *ep) struct snd_usb_endpoint *ep)
{ {
bool iface_first; bool iface_first;
int err = 0; int err = 0;
...@@ -1414,6 +1412,9 @@ int snd_usb_endpoint_prepare(struct snd_usb_audio *chip, ...@@ -1414,6 +1412,9 @@ int snd_usb_endpoint_prepare(struct snd_usb_audio *chip,
if (err < 0) if (err < 0)
goto unlock; goto unlock;
} }
err = snd_usb_endpoint_set_params(chip, ep);
if (err < 0)
goto unlock;
goto done; goto done;
} }
...@@ -1441,6 +1442,10 @@ int snd_usb_endpoint_prepare(struct snd_usb_audio *chip, ...@@ -1441,6 +1442,10 @@ int snd_usb_endpoint_prepare(struct snd_usb_audio *chip,
if (err < 0) if (err < 0)
goto unlock; goto unlock;
err = snd_usb_endpoint_set_params(chip, ep);
if (err < 0)
goto unlock;
err = snd_usb_select_mode_quirk(chip, ep->cur_audiofmt); err = snd_usb_select_mode_quirk(chip, ep->cur_audiofmt);
if (err < 0) if (err < 0)
goto unlock; goto unlock;
......
...@@ -17,10 +17,8 @@ snd_usb_endpoint_open(struct snd_usb_audio *chip, ...@@ -17,10 +17,8 @@ snd_usb_endpoint_open(struct snd_usb_audio *chip,
bool is_sync_ep); bool is_sync_ep);
void snd_usb_endpoint_close(struct snd_usb_audio *chip, void snd_usb_endpoint_close(struct snd_usb_audio *chip,
struct snd_usb_endpoint *ep); struct snd_usb_endpoint *ep);
int snd_usb_endpoint_set_params(struct snd_usb_audio *chip, int snd_usb_endpoint_configure(struct snd_usb_audio *chip,
struct snd_usb_endpoint *ep); struct snd_usb_endpoint *ep);
int snd_usb_endpoint_prepare(struct snd_usb_audio *chip,
struct snd_usb_endpoint *ep);
int snd_usb_endpoint_get_clock_rate(struct snd_usb_audio *chip, int clock); int snd_usb_endpoint_get_clock_rate(struct snd_usb_audio *chip, int clock);
bool snd_usb_endpoint_compatible(struct snd_usb_audio *chip, bool snd_usb_endpoint_compatible(struct snd_usb_audio *chip,
......
...@@ -443,17 +443,17 @@ static int configure_endpoints(struct snd_usb_audio *chip, ...@@ -443,17 +443,17 @@ static int configure_endpoints(struct snd_usb_audio *chip,
if (stop_endpoints(subs, false)) if (stop_endpoints(subs, false))
sync_pending_stops(subs); sync_pending_stops(subs);
if (subs->sync_endpoint) { if (subs->sync_endpoint) {
err = snd_usb_endpoint_prepare(chip, subs->sync_endpoint); err = snd_usb_endpoint_configure(chip, subs->sync_endpoint);
if (err < 0) if (err < 0)
return err; return err;
} }
err = snd_usb_endpoint_prepare(chip, subs->data_endpoint); err = snd_usb_endpoint_configure(chip, subs->data_endpoint);
if (err < 0) if (err < 0)
return err; return err;
snd_usb_set_format_quirk(subs, subs->cur_audiofmt); snd_usb_set_format_quirk(subs, subs->cur_audiofmt);
} else { } else {
if (subs->sync_endpoint) { if (subs->sync_endpoint) {
err = snd_usb_endpoint_prepare(chip, subs->sync_endpoint); err = snd_usb_endpoint_configure(chip, subs->sync_endpoint);
if (err < 0) if (err < 0)
return err; return err;
} }
...@@ -551,13 +551,7 @@ static int snd_usb_hw_params(struct snd_pcm_substream *substream, ...@@ -551,13 +551,7 @@ static int snd_usb_hw_params(struct snd_pcm_substream *substream,
subs->cur_audiofmt = fmt; subs->cur_audiofmt = fmt;
mutex_unlock(&chip->mutex); mutex_unlock(&chip->mutex);
if (subs->sync_endpoint) { ret = configure_endpoints(chip, subs);
ret = snd_usb_endpoint_set_params(chip, subs->sync_endpoint);
if (ret < 0)
goto unlock;
}
ret = snd_usb_endpoint_set_params(chip, subs->data_endpoint);
unlock: unlock:
if (ret < 0) if (ret < 0)
......
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