Commit 8e3392d3 authored by Takashi Iwai's avatar Takashi Iwai
Browse files

Merge branch 'for-linus' into for-next

parents 01a72aef 79764ec7
Loading
Loading
Loading
Loading
+5 −5
Original line number Diff line number Diff line
@@ -178,10 +178,8 @@ int snd_card_new(struct device *parent, int idx, const char *xid,
		return -ENOMEM;

	err = snd_card_init(card, parent, idx, xid, module, extra_size);
	if (err < 0) {
		kfree(card);
		return err;
	}
	if (err < 0)
		return err; /* card is freed by error handler */

	*card_ret = card;
	return 0;
@@ -233,7 +231,7 @@ int snd_devm_card_new(struct device *parent, int idx, const char *xid,
	card->managed = true;
	err = snd_card_init(card, parent, idx, xid, module, extra_size);
	if (err < 0) {
		devres_free(card);
		devres_free(card); /* in managed mode, we need to free manually */
		return err;
	}

@@ -297,6 +295,8 @@ static int snd_card_init(struct snd_card *card, struct device *parent,
		mutex_unlock(&snd_card_mutex);
		dev_err(parent, "cannot find the slot for index %d (range 0-%i), error: %d\n",
			 idx, snd_ecards_limit - 1, err);
		if (!card->managed)
			kfree(card); /* manually free here, as no destructor called */
		return err;
	}
	set_bit(idx, snd_cards_lock);		/* lock it */
+14 −9
Original line number Diff line number Diff line
@@ -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,12 +1292,11 @@ 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,
static int snd_usb_endpoint_set_params(struct snd_usb_audio *chip,
				       struct snd_usb_endpoint *ep)
{
	const struct audioformat *fmt = ep->cur_audiofmt;
@@ -1382,17 +1380,17 @@ 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,
int snd_usb_endpoint_configure(struct snd_usb_audio *chip,
			       struct snd_usb_endpoint *ep)
{
	bool iface_first;
@@ -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;
+2 −4
Original line number Diff line number Diff line
@@ -17,9 +17,7 @@ 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,
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);

+4 −10
Original line number Diff line number Diff line
@@ -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)