diff options
| author | Eldad Zack <eldad@fogrefinery.com> | 2013-08-03 10:50:17 +0200 | 
|---|---|---|
| committer | Takashi Iwai <tiwai@suse.de> | 2013-08-06 10:48:34 +0200 | 
| commit | 71bb64c56d787a221752b1de034fe8c07c737f5c (patch) | |
| tree | 6af50222ade08ed53c6245e1d18091ecc6397503 | |
| parent | d133f2c22e9cb7b6afd170437cf0ef1e8a1571b6 (diff) | |
ALSA: usb-audio: separate sync endpoint setting from set_format
Setting the sync endpoint currently takes up about half of set_format().
Move it to a dedicated function.
No functional change.
Signed-off-by: Eldad Zack <eldad@fogrefinery.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
| -rw-r--r-- | sound/usb/pcm.c | 128 | 
1 files changed, 73 insertions, 55 deletions
| diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c index be5c7c2219ea..e24ce7d58d83 100644 --- a/sound/usb/pcm.c +++ b/sound/usb/pcm.c @@ -327,64 +327,17 @@ static int search_roland_implicit_fb(struct usb_device *dev, int ifnum,  	return 0;  } -/* - * find a matching format and set up the interface - */ -static int set_format(struct snd_usb_substream *subs, struct audioformat *fmt) + +static int set_sync_endpoint(struct snd_usb_substream *subs, +			     struct audioformat *fmt, +			     struct usb_device *dev, +			     struct usb_host_interface *alts, +			     struct usb_interface_descriptor *altsd)  { -	struct usb_device *dev = subs->dev; -	struct usb_host_interface *alts; -	struct usb_interface_descriptor *altsd;  	struct usb_interface *iface; -	unsigned int ep, attr;  	int is_playback = subs->direction == SNDRV_PCM_STREAM_PLAYBACK; -	int err, implicit_fb = 0; - -	iface = usb_ifnum_to_if(dev, fmt->iface); -	if (WARN_ON(!iface)) -		return -EINVAL; -	alts = &iface->altsetting[fmt->altset_idx]; -	altsd = get_iface_desc(alts); -	if (WARN_ON(altsd->bAlternateSetting != fmt->altsetting)) -		return -EINVAL; - -	if (fmt == subs->cur_audiofmt) -		return 0; - -	/* close the old interface */ -	if (subs->interface >= 0 && subs->interface != fmt->iface) { -		err = usb_set_interface(subs->dev, subs->interface, 0); -		if (err < 0) { -			snd_printk(KERN_ERR "%d:%d:%d: return to setting 0 failed (%d)\n", -				dev->devnum, fmt->iface, fmt->altsetting, err); -			return -EIO; -		} -		subs->interface = -1; -		subs->altset_idx = 0; -	} - -	/* set interface */ -	if (subs->interface != fmt->iface || -	    subs->altset_idx != fmt->altset_idx) { -		err = usb_set_interface(dev, fmt->iface, fmt->altsetting); -		if (err < 0) { -			snd_printk(KERN_ERR "%d:%d:%d: usb_set_interface failed (%d)\n", -				   dev->devnum, fmt->iface, fmt->altsetting, err); -			return -EIO; -		} -		snd_printdd(KERN_INFO "setting usb interface %d:%d\n", -				fmt->iface, fmt->altsetting); -		subs->interface = fmt->iface; -		subs->altset_idx = fmt->altset_idx; - -		snd_usb_set_interface_quirk(dev); -	} - -	subs->data_endpoint = snd_usb_add_endpoint(subs->stream->chip, -						   alts, fmt->endpoint, subs->direction, -						   SND_USB_ENDPOINT_TYPE_DATA); -	if (!subs->data_endpoint) -		return -EINVAL; +	unsigned int ep, attr; +	int implicit_fb = 0;  	/* we need a sync pipe in async OUT or adaptive IN mode */  	/* check the number of EP, since some devices have broken @@ -479,6 +432,71 @@ add_sync_ep:  		subs->data_endpoint->sync_master = subs->sync_endpoint;  	} +	return 0; +} + +/* + * find a matching format and set up the interface + */ +static int set_format(struct snd_usb_substream *subs, struct audioformat *fmt) +{ +	struct usb_device *dev = subs->dev; +	struct usb_host_interface *alts; +	struct usb_interface_descriptor *altsd; +	struct usb_interface *iface; +	int err; + +	iface = usb_ifnum_to_if(dev, fmt->iface); +	if (WARN_ON(!iface)) +		return -EINVAL; +	alts = &iface->altsetting[fmt->altset_idx]; +	altsd = get_iface_desc(alts); +	if (WARN_ON(altsd->bAlternateSetting != fmt->altsetting)) +		return -EINVAL; + +	if (fmt == subs->cur_audiofmt) +		return 0; + +	/* close the old interface */ +	if (subs->interface >= 0 && subs->interface != fmt->iface) { +		err = usb_set_interface(subs->dev, subs->interface, 0); +		if (err < 0) { +			snd_printk(KERN_ERR "%d:%d:%d: return to setting 0 failed (%d)\n", +				dev->devnum, fmt->iface, fmt->altsetting, err); +			return -EIO; +		} +		subs->interface = -1; +		subs->altset_idx = 0; +	} + +	/* set interface */ +	if (subs->interface != fmt->iface || +	    subs->altset_idx != fmt->altset_idx) { +		err = usb_set_interface(dev, fmt->iface, fmt->altsetting); +		if (err < 0) { +			snd_printk(KERN_ERR "%d:%d:%d: usb_set_interface failed (%d)\n", +				   dev->devnum, fmt->iface, fmt->altsetting, err); +			return -EIO; +		} +		snd_printdd(KERN_INFO "setting usb interface %d:%d\n", +				fmt->iface, fmt->altsetting); +		subs->interface = fmt->iface; +		subs->altset_idx = fmt->altset_idx; + +		snd_usb_set_interface_quirk(dev); +	} + +	subs->data_endpoint = snd_usb_add_endpoint(subs->stream->chip, +						   alts, fmt->endpoint, subs->direction, +						   SND_USB_ENDPOINT_TYPE_DATA); + +	if (!subs->data_endpoint) +		return -EINVAL; + +	err = set_sync_endpoint(subs, fmt, dev, alts, altsd); +	if (err < 0) +		return err; +  	err = snd_usb_init_pitch(subs->stream->chip, fmt->iface, alts, fmt);  	if (err < 0)  		return err; | 
