aboutsummaryrefslogtreecommitdiffstats
path: root/sound
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2012-11-21 02:30:48 -0500
committerTakashi Iwai <tiwai@suse.de>2012-11-21 05:43:56 -0500
commitb2eb950de2f09435d5156f4dc6d5dbf284cd97f3 (patch)
tree7d5724114c4f57503502a7dd4a86bc9573774669 /sound
parentccc1696d527d64deb417bfa1ef9e479d10ad4f6b (diff)
ALSA: usb-audio: stop both data and sync endpoints asynchronously
As we are stopping the endpoints asynchronously now, it's better to trigger the stop of both data and sync endpoints and wait for pending stopping operations, instead of the sequential trigger-and-wait procedure. So the wait argument in snd_usb_endpoint_stop() is dropped, and it's expected that the caller synchronizes explicitly by calling snd_usb_endpoint_sync_pending_stop(). (Actually there is only one place calling this, so it was safe to change.) Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound')
-rw-r--r--sound/usb/endpoint.c11
-rw-r--r--sound/usb/endpoint.h2
-rw-r--r--sound/usb/pcm.c9
3 files changed, 13 insertions, 9 deletions
diff --git a/sound/usb/endpoint.c b/sound/usb/endpoint.c
index 6db2143350d3..f487d26f8d40 100644
--- a/sound/usb/endpoint.c
+++ b/sound/usb/endpoint.c
@@ -896,8 +896,11 @@ __error:
896 * actually be deactivated. 896 * actually be deactivated.
897 * 897 *
898 * Must be balanced to calls of snd_usb_endpoint_start(). 898 * Must be balanced to calls of snd_usb_endpoint_start().
899 *
900 * The caller needs to synchronize the pending stop operation via
901 * snd_usb_endpoint_sync_pending_stop().
899 */ 902 */
900void snd_usb_endpoint_stop(struct snd_usb_endpoint *ep, bool wait) 903void snd_usb_endpoint_stop(struct snd_usb_endpoint *ep)
901{ 904{
902 if (!ep) 905 if (!ep)
903 return; 906 return;
@@ -911,11 +914,7 @@ void snd_usb_endpoint_stop(struct snd_usb_endpoint *ep, bool wait)
911 ep->sync_slave = NULL; 914 ep->sync_slave = NULL;
912 ep->retire_data_urb = NULL; 915 ep->retire_data_urb = NULL;
913 ep->prepare_data_urb = NULL; 916 ep->prepare_data_urb = NULL;
914 917 set_bit(EP_FLAG_STOPPING, &ep->flags);
915 if (wait)
916 wait_clear_urbs(ep);
917 else
918 set_bit(EP_FLAG_STOPPING, &ep->flags);
919 } 918 }
920} 919}
921 920
diff --git a/sound/usb/endpoint.h b/sound/usb/endpoint.h
index f1e451da9a67..447902dd8a4a 100644
--- a/sound/usb/endpoint.h
+++ b/sound/usb/endpoint.h
@@ -17,7 +17,7 @@ int snd_usb_endpoint_set_params(struct snd_usb_endpoint *ep,
17 struct snd_usb_endpoint *sync_ep); 17 struct snd_usb_endpoint *sync_ep);
18 18
19int snd_usb_endpoint_start(struct snd_usb_endpoint *ep, bool can_sleep); 19int snd_usb_endpoint_start(struct snd_usb_endpoint *ep, bool can_sleep);
20void snd_usb_endpoint_stop(struct snd_usb_endpoint *ep, bool wait); 20void snd_usb_endpoint_stop(struct snd_usb_endpoint *ep);
21void snd_usb_endpoint_sync_pending_stop(struct snd_usb_endpoint *ep); 21void snd_usb_endpoint_sync_pending_stop(struct snd_usb_endpoint *ep);
22int snd_usb_endpoint_activate(struct snd_usb_endpoint *ep); 22int snd_usb_endpoint_activate(struct snd_usb_endpoint *ep);
23int snd_usb_endpoint_deactivate(struct snd_usb_endpoint *ep); 23int snd_usb_endpoint_deactivate(struct snd_usb_endpoint *ep);
diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c
index d90604aa5137..4750d3d5c0cc 100644
--- a/sound/usb/pcm.c
+++ b/sound/usb/pcm.c
@@ -266,10 +266,15 @@ static int start_endpoints(struct snd_usb_substream *subs, bool can_sleep)
266static void stop_endpoints(struct snd_usb_substream *subs, bool wait) 266static void stop_endpoints(struct snd_usb_substream *subs, bool wait)
267{ 267{
268 if (test_and_clear_bit(SUBSTREAM_FLAG_SYNC_EP_STARTED, &subs->flags)) 268 if (test_and_clear_bit(SUBSTREAM_FLAG_SYNC_EP_STARTED, &subs->flags))
269 snd_usb_endpoint_stop(subs->sync_endpoint, wait); 269 snd_usb_endpoint_stop(subs->sync_endpoint);
270 270
271 if (test_and_clear_bit(SUBSTREAM_FLAG_DATA_EP_STARTED, &subs->flags)) 271 if (test_and_clear_bit(SUBSTREAM_FLAG_DATA_EP_STARTED, &subs->flags))
272 snd_usb_endpoint_stop(subs->data_endpoint, wait); 272 snd_usb_endpoint_stop(subs->data_endpoint);
273
274 if (wait) {
275 snd_usb_endpoint_sync_pending_stop(subs->sync_endpoint);
276 snd_usb_endpoint_sync_pending_stop(subs->data_endpoint);
277 }
273} 278}
274 279
275static int deactivate_endpoints(struct snd_usb_substream *subs) 280static int deactivate_endpoints(struct snd_usb_substream *subs)