mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	Revert "ALSA: usb-audio: Split endpoint setups for hw_params and prepare"
This reverts commitff878b408a. 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:ff878b408a("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.de Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
		
							parent
							
								
									c3afa2a402
								
							
						
					
					
						commit
						79764ec772
					
				
					 3 changed files with 20 additions and 23 deletions
				
			
		| 
						 | 
				
			
			@ -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.
 | 
			
		||||
 *
 | 
			
		||||
 * Note that this function doesn't configure the endpoint.  The substream
 | 
			
		||||
 * needs to set it up later via snd_usb_endpoint_set_params() and
 | 
			
		||||
 * snd_usb_endpoint_prepare().
 | 
			
		||||
 * needs to set it up later via snd_usb_endpoint_configure().
 | 
			
		||||
 */
 | 
			
		||||
struct snd_usb_endpoint *
 | 
			
		||||
snd_usb_endpoint_open(struct snd_usb_audio *chip,
 | 
			
		||||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
 *
 | 
			
		||||
 * It's called either from hw_params callback.
 | 
			
		||||
 * Determine the number of URBs to be used on this endpoint.
 | 
			
		||||
 * An endpoint must be configured before it can be started.
 | 
			
		||||
 * An endpoint that is already running can not be reconfigured.
 | 
			
		||||
 */
 | 
			
		||||
int snd_usb_endpoint_set_params(struct snd_usb_audio *chip,
 | 
			
		||||
				struct snd_usb_endpoint *ep)
 | 
			
		||||
static 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;
 | 
			
		||||
| 
						 | 
				
			
			@ -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.
 | 
			
		||||
 * 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,
 | 
			
		||||
 * so it's safe to call this multiple times.
 | 
			
		||||
 *
 | 
			
		||||
 * This returns zero if unchanged, 1 if the configuration has changed,
 | 
			
		||||
 * or a negative error code.
 | 
			
		||||
 */
 | 
			
		||||
int snd_usb_endpoint_prepare(struct snd_usb_audio *chip,
 | 
			
		||||
			     struct snd_usb_endpoint *ep)
 | 
			
		||||
int snd_usb_endpoint_configure(struct snd_usb_audio *chip,
 | 
			
		||||
			       struct snd_usb_endpoint *ep)
 | 
			
		||||
{
 | 
			
		||||
	bool iface_first;
 | 
			
		||||
	int err = 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -1414,6 +1412,9 @@ int snd_usb_endpoint_prepare(struct snd_usb_audio *chip,
 | 
			
		|||
			if (err < 0)
 | 
			
		||||
				goto unlock;
 | 
			
		||||
		}
 | 
			
		||||
		err = snd_usb_endpoint_set_params(chip, ep);
 | 
			
		||||
		if (err < 0)
 | 
			
		||||
			goto unlock;
 | 
			
		||||
		goto done;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1441,6 +1442,10 @@ int snd_usb_endpoint_prepare(struct snd_usb_audio *chip,
 | 
			
		|||
	if (err < 0)
 | 
			
		||||
		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);
 | 
			
		||||
	if (err < 0)
 | 
			
		||||
		goto unlock;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -17,10 +17,8 @@ snd_usb_endpoint_open(struct snd_usb_audio *chip,
 | 
			
		|||
		      bool is_sync_ep);
 | 
			
		||||
void snd_usb_endpoint_close(struct snd_usb_audio *chip,
 | 
			
		||||
			    struct snd_usb_endpoint *ep);
 | 
			
		||||
int snd_usb_endpoint_set_params(struct snd_usb_audio *chip,
 | 
			
		||||
				struct snd_usb_endpoint *ep);
 | 
			
		||||
int snd_usb_endpoint_prepare(struct snd_usb_audio *chip,
 | 
			
		||||
			     struct snd_usb_endpoint *ep);
 | 
			
		||||
int snd_usb_endpoint_configure(struct snd_usb_audio *chip,
 | 
			
		||||
			       struct snd_usb_endpoint *ep);
 | 
			
		||||
int snd_usb_endpoint_get_clock_rate(struct snd_usb_audio *chip, int clock);
 | 
			
		||||
 | 
			
		||||
bool snd_usb_endpoint_compatible(struct snd_usb_audio *chip,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -443,17 +443,17 @@ static int configure_endpoints(struct snd_usb_audio *chip,
 | 
			
		|||
		if (stop_endpoints(subs, false))
 | 
			
		||||
			sync_pending_stops(subs);
 | 
			
		||||
		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)
 | 
			
		||||
				return err;
 | 
			
		||||
		}
 | 
			
		||||
		err = snd_usb_endpoint_prepare(chip, subs->data_endpoint);
 | 
			
		||||
		err = snd_usb_endpoint_configure(chip, subs->data_endpoint);
 | 
			
		||||
		if (err < 0)
 | 
			
		||||
			return err;
 | 
			
		||||
		snd_usb_set_format_quirk(subs, subs->cur_audiofmt);
 | 
			
		||||
	} else {
 | 
			
		||||
		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)
 | 
			
		||||
				return err;
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -551,13 +551,7 @@ static int snd_usb_hw_params(struct snd_pcm_substream *substream,
 | 
			
		|||
	subs->cur_audiofmt = fmt;
 | 
			
		||||
	mutex_unlock(&chip->mutex);
 | 
			
		||||
 | 
			
		||||
	if (subs->sync_endpoint) {
 | 
			
		||||
		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);
 | 
			
		||||
	ret = configure_endpoints(chip, subs);
 | 
			
		||||
 | 
			
		||||
 unlock:
 | 
			
		||||
	if (ret < 0)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue