diff options
Diffstat (limited to 'sound/usb/endpoint.c')
| -rw-r--r-- | sound/usb/endpoint.c | 24 | 
1 files changed, 8 insertions, 16 deletions
diff --git a/sound/usb/endpoint.c b/sound/usb/endpoint.c index 0f647d22cb4..d6e2bb49c59 100644 --- a/sound/usb/endpoint.c +++ b/sound/usb/endpoint.c @@ -141,7 +141,7 @@ int snd_usb_endpoint_implict_feedback_sink(struct snd_usb_endpoint *ep)   *   * For implicit feedback, next_packet_size() is unused.   */ -static int next_packet_size(struct snd_usb_endpoint *ep) +int snd_usb_endpoint_next_packet_size(struct snd_usb_endpoint *ep)  {  	unsigned long flags;  	int ret; @@ -177,15 +177,6 @@ static void retire_inbound_urb(struct snd_usb_endpoint *ep,  		ep->retire_data_urb(ep->data_subs, urb);  } -static void prepare_outbound_urb_sizes(struct snd_usb_endpoint *ep, -				       struct snd_urb_ctx *ctx) -{ -	int i; - -	for (i = 0; i < ctx->packets; ++i) -		ctx->packet_size[i] = next_packet_size(ep); -} -  /*   * Prepare a PLAYBACK urb for submission to the bus.   */ @@ -370,7 +361,6 @@ static void snd_complete_urb(struct urb *urb)  			goto exit_clear;  		} -		prepare_outbound_urb_sizes(ep, ctx);  		prepare_outbound_urb(ep, ctx);  	} else {  		retire_inbound_urb(ep, ctx); @@ -799,7 +789,9 @@ int snd_usb_endpoint_set_params(struct snd_usb_endpoint *ep,  /**   * snd_usb_endpoint_start: start an snd_usb_endpoint   * - * @ep: the endpoint to start + * @ep:		the endpoint to start + * @can_sleep:	flag indicating whether the operation is executed in + * 		non-atomic context   *   * A call to this function will increment the use count of the endpoint.   * In case it is not already running, the URBs for this endpoint will be @@ -809,7 +801,7 @@ int snd_usb_endpoint_set_params(struct snd_usb_endpoint *ep,   *   * Returns an error if the URB submission failed, 0 in all other cases.   */ -int snd_usb_endpoint_start(struct snd_usb_endpoint *ep) +int snd_usb_endpoint_start(struct snd_usb_endpoint *ep, int can_sleep)  {  	int err;  	unsigned int i; @@ -822,8 +814,9 @@ int snd_usb_endpoint_start(struct snd_usb_endpoint *ep)  		return 0;  	/* just to be sure */ -	deactivate_urbs(ep, 0, 1); -	wait_clear_urbs(ep); +	deactivate_urbs(ep, 0, can_sleep); +	if (can_sleep) +		wait_clear_urbs(ep);  	ep->active_mask = 0;  	ep->unlink_mask = 0; @@ -854,7 +847,6 @@ int snd_usb_endpoint_start(struct snd_usb_endpoint *ep)  			goto __error;  		if (usb_pipeout(ep->pipe)) { -			prepare_outbound_urb_sizes(ep, urb->context);  			prepare_outbound_urb(ep, urb->context);  		} else {  			prepare_inbound_urb(ep, urb->context);  |