aboutsummaryrefslogtreecommitdiffstats
path: root/sound/usb
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2012-09-18 08:49:31 -0400
committerTakashi Iwai <tiwai@suse.de>2012-09-19 02:08:16 -0400
commit384dc085c32285e6548511bf80c5d5a5b246ed24 (patch)
tree09d8c9b74426145ff754690d19a12ec2f8991ddb /sound/usb
parent61a709504b079110cd5b12ea9a4590ffea687a5c (diff)
ALSA: usb-audio: Avoid unnecessary EP setups in prepare
The recent fix for USB suspend breakage moved the code to set up EP from hw_params to prepare, but it means also the EP setup might be called multiple times unnecessarily because the prepare callback can be called multiple times without starting the stream (e.g. OSS emulation). This patch adds a new flag to struct snd_usb_substream indicating whether the setup of EP is required, and do it only when necessary, i.e. right after hw_params or suspend. Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/usb')
-rw-r--r--sound/usb/card.c2
-rw-r--r--sound/usb/card.h1
-rw-r--r--sound/usb/pcm.c10
3 files changed, 10 insertions, 3 deletions
diff --git a/sound/usb/card.c b/sound/usb/card.c
index 4a469f0cb6d4..561bb74fd364 100644
--- a/sound/usb/card.c
+++ b/sound/usb/card.c
@@ -646,6 +646,8 @@ static int usb_audio_suspend(struct usb_interface *intf, pm_message_t message)
646 list_for_each(p, &chip->pcm_list) { 646 list_for_each(p, &chip->pcm_list) {
647 as = list_entry(p, struct snd_usb_stream, list); 647 as = list_entry(p, struct snd_usb_stream, list);
648 snd_pcm_suspend_all(as->pcm); 648 snd_pcm_suspend_all(as->pcm);
649 as->substream[0].need_setup_ep =
650 as->substream[1].need_setup_ep = true;
649 } 651 }
650 } 652 }
651 } else { 653 } else {
diff --git a/sound/usb/card.h b/sound/usb/card.h
index 6cc883c3567d..afa4f9e9b27a 100644
--- a/sound/usb/card.h
+++ b/sound/usb/card.h
@@ -125,6 +125,7 @@ struct snd_usb_substream {
125 struct snd_usb_endpoint *data_endpoint; 125 struct snd_usb_endpoint *data_endpoint;
126 struct snd_usb_endpoint *sync_endpoint; 126 struct snd_usb_endpoint *sync_endpoint;
127 unsigned long flags; 127 unsigned long flags;
128 bool need_setup_ep; /* (re)configure EP at prepare? */
128 129
129 u64 formats; /* format bitmasks (all or'ed) */ 130 u64 formats; /* format bitmasks (all or'ed) */
130 unsigned int num_formats; /* number of supported audio formats (list) */ 131 unsigned int num_formats; /* number of supported audio formats (list) */
diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c
index ae783d40f55a..55e19e1b80ec 100644
--- a/sound/usb/pcm.c
+++ b/sound/usb/pcm.c
@@ -510,6 +510,7 @@ static int snd_usb_hw_params(struct snd_pcm_substream *substream,
510 510
511 subs->interface = fmt->iface; 511 subs->interface = fmt->iface;
512 subs->altset_idx = fmt->altset_idx; 512 subs->altset_idx = fmt->altset_idx;
513 subs->need_setup_ep = true;
513 514
514 return 0; 515 return 0;
515} 516}
@@ -568,9 +569,12 @@ static int snd_usb_pcm_prepare(struct snd_pcm_substream *substream)
568 if (ret < 0) 569 if (ret < 0)
569 return ret; 570 return ret;
570 571
571 ret = configure_endpoint(subs); 572 if (subs->need_setup_ep) {
572 if (ret < 0) 573 ret = configure_endpoint(subs);
573 return ret; 574 if (ret < 0)
575 return ret;
576 subs->need_setup_ep = false;
577 }
574 578
575 /* some unit conversions in runtime */ 579 /* some unit conversions in runtime */
576 subs->data_endpoint->maxframesize = 580 subs->data_endpoint->maxframesize =