Lines Matching refs:subs

34 snd_pcm_uframes_t snd_usb_pcm_delay(struct snd_usb_substream *subs,  in snd_usb_pcm_delay()  argument
41 if (!subs->last_delay) in snd_usb_pcm_delay()
44 current_frame_number = usb_get_current_frame_number(subs->dev); in snd_usb_pcm_delay()
50 frame_diff = (current_frame_number - subs->last_frame_number) & 0xff; in snd_usb_pcm_delay()
55 if (subs->direction == SNDRV_PCM_STREAM_PLAYBACK) in snd_usb_pcm_delay()
56 est_delay = subs->last_delay - est_delay; in snd_usb_pcm_delay()
58 est_delay = subs->last_delay + est_delay; in snd_usb_pcm_delay()
70 struct snd_usb_substream *subs = substream->runtime->private_data; in snd_usb_pcm_pointer() local
73 if (atomic_read(&subs->stream->chip->shutdown)) in snd_usb_pcm_pointer()
75 spin_lock(&subs->lock); in snd_usb_pcm_pointer()
76 hwptr_done = subs->hwptr_done; in snd_usb_pcm_pointer()
77 substream->runtime->delay = snd_usb_pcm_delay(subs, in snd_usb_pcm_pointer()
79 spin_unlock(&subs->lock); in snd_usb_pcm_pointer()
86 static struct audioformat *find_format(struct snd_usb_substream *subs) in find_format() argument
92 list_for_each_entry(fp, &subs->fmt_list, list) { in find_format()
93 if (!(fp->formats & pcm_format_to_bits(subs->pcm_format))) in find_format()
95 if (fp->channels != subs->channels) in find_format()
97 if (subs->cur_rate < fp->rate_min || in find_format()
98 subs->cur_rate > fp->rate_max) in find_format()
103 if (fp->rate_table[i] == subs->cur_rate) in find_format()
121 subs->direction == SNDRV_PCM_STREAM_PLAYBACK) || in find_format()
123 subs->direction == SNDRV_PCM_STREAM_CAPTURE)) in find_format()
126 subs->direction == SNDRV_PCM_STREAM_PLAYBACK) || in find_format()
128 subs->direction == SNDRV_PCM_STREAM_CAPTURE)) { in find_format()
148 static struct audioformat *find_format_and_si(struct snd_usb_substream *subs, in find_format_and_si() argument
156 list_for_each_entry(fp, &subs->fmt_list, list) { in find_format_and_si()
159 if (!(fp->formats & pcm_format_to_bits(subs->pcm_format))) in find_format_and_si()
161 if (fp->channels != subs->channels) in find_format_and_si()
163 if (subs->cur_rate < fp->rate_min || in find_format_and_si()
164 subs->cur_rate > fp->rate_max) in find_format_and_si()
168 if (fp->rate_table[i] == subs->cur_rate) in find_format_and_si()
186 subs->direction == SNDRV_PCM_STREAM_PLAYBACK) || in find_format_and_si()
188 subs->direction == SNDRV_PCM_STREAM_CAPTURE)) in find_format_and_si()
191 subs->direction == SNDRV_PCM_STREAM_PLAYBACK) || in find_format_and_si()
193 subs->direction == SNDRV_PCM_STREAM_CAPTURE)) { in find_format_and_si()
278 static int start_endpoints(struct snd_usb_substream *subs) in start_endpoints() argument
282 if (!subs->data_endpoint) in start_endpoints()
285 if (!test_and_set_bit(SUBSTREAM_FLAG_DATA_EP_STARTED, &subs->flags)) { in start_endpoints()
286 struct snd_usb_endpoint *ep = subs->data_endpoint; in start_endpoints()
288 dev_dbg(&subs->dev->dev, "Starting data EP @%p\n", ep); in start_endpoints()
290 ep->data_subs = subs; in start_endpoints()
293 clear_bit(SUBSTREAM_FLAG_DATA_EP_STARTED, &subs->flags); in start_endpoints()
298 if (subs->sync_endpoint && in start_endpoints()
299 !test_and_set_bit(SUBSTREAM_FLAG_SYNC_EP_STARTED, &subs->flags)) { in start_endpoints()
300 struct snd_usb_endpoint *ep = subs->sync_endpoint; in start_endpoints()
302 if (subs->data_endpoint->iface != subs->sync_endpoint->iface || in start_endpoints()
303 subs->data_endpoint->altsetting != subs->sync_endpoint->altsetting) { in start_endpoints()
304 err = usb_set_interface(subs->dev, in start_endpoints()
305 subs->sync_endpoint->iface, in start_endpoints()
306 subs->sync_endpoint->altsetting); in start_endpoints()
308 clear_bit(SUBSTREAM_FLAG_SYNC_EP_STARTED, &subs->flags); in start_endpoints()
309 dev_err(&subs->dev->dev, in start_endpoints()
311 subs->sync_endpoint->iface, in start_endpoints()
312 subs->sync_endpoint->altsetting, err); in start_endpoints()
317 dev_dbg(&subs->dev->dev, "Starting sync EP @%p\n", ep); in start_endpoints()
319 ep->sync_slave = subs->data_endpoint; in start_endpoints()
322 clear_bit(SUBSTREAM_FLAG_SYNC_EP_STARTED, &subs->flags); in start_endpoints()
330 static void sync_pending_stops(struct snd_usb_substream *subs) in sync_pending_stops() argument
332 snd_usb_endpoint_sync_pending_stop(subs->sync_endpoint); in sync_pending_stops()
333 snd_usb_endpoint_sync_pending_stop(subs->data_endpoint); in sync_pending_stops()
336 static void stop_endpoints(struct snd_usb_substream *subs) in stop_endpoints() argument
338 if (test_and_clear_bit(SUBSTREAM_FLAG_SYNC_EP_STARTED, &subs->flags)) in stop_endpoints()
339 snd_usb_endpoint_stop(subs->sync_endpoint); in stop_endpoints()
341 if (test_and_clear_bit(SUBSTREAM_FLAG_DATA_EP_STARTED, &subs->flags)) in stop_endpoints()
342 snd_usb_endpoint_stop(subs->data_endpoint); in stop_endpoints()
348 struct snd_usb_substream *subs = substream->runtime->private_data; in snd_usb_pcm_sync_stop() local
350 sync_pending_stops(subs); in snd_usb_pcm_sync_stop()
386 static int set_sync_ep_implicit_fb_quirk(struct snd_usb_substream *subs, in set_sync_ep_implicit_fb_quirk() argument
397 if (subs->direction != SNDRV_PCM_STREAM_PLAYBACK) in set_sync_ep_implicit_fb_quirk()
400 switch (subs->stream->chip->usb_id) { in set_sync_ep_implicit_fb_quirk()
461 USB_ID_VENDOR(subs->stream->chip->usb_id) == 0x0582 /* Roland */ && in set_sync_ep_implicit_fb_quirk()
480 subs->sync_endpoint = snd_usb_add_endpoint(subs->stream->chip, in set_sync_ep_implicit_fb_quirk()
481 alts, ep, !subs->direction, in set_sync_ep_implicit_fb_quirk()
483 if (!subs->sync_endpoint) in set_sync_ep_implicit_fb_quirk()
486 subs->sync_endpoint->is_implicit_feedback = 1; in set_sync_ep_implicit_fb_quirk()
488 subs->data_endpoint->sync_master = subs->sync_endpoint; in set_sync_ep_implicit_fb_quirk()
493 static int set_sync_endpoint(struct snd_usb_substream *subs, in set_sync_endpoint() argument
499 int is_playback = subs->direction == SNDRV_PCM_STREAM_PLAYBACK; in set_sync_endpoint()
521 subs->sync_endpoint = NULL; in set_sync_endpoint()
522 subs->data_endpoint->sync_master = NULL; in set_sync_endpoint()
525 err = set_sync_ep_implicit_fb_quirk(subs, dev, altsd, attr); in set_sync_endpoint()
581 subs->sync_endpoint = snd_usb_add_endpoint(subs->stream->chip, in set_sync_endpoint()
582 alts, ep, !subs->direction, in set_sync_endpoint()
587 if (!subs->sync_endpoint) { in set_sync_endpoint()
593 subs->sync_endpoint->is_implicit_feedback = implicit_fb; in set_sync_endpoint()
595 subs->data_endpoint->sync_master = subs->sync_endpoint; in set_sync_endpoint()
603 static int set_format(struct snd_usb_substream *subs, struct audioformat *fmt) in set_format() argument
605 struct usb_device *dev = subs->dev; in set_format()
619 if (fmt == subs->cur_audiofmt && !subs->need_setup_fmt) in set_format()
623 if (subs->interface >= 0 && (subs->interface != fmt->iface || subs->need_setup_fmt)) { in set_format()
624 if (!subs->stream->chip->keep_iface) { in set_format()
625 err = usb_set_interface(subs->dev, subs->interface, 0); in set_format()
633 subs->interface = -1; in set_format()
634 subs->altset_idx = 0; in set_format()
637 if (subs->need_setup_fmt) in set_format()
638 subs->need_setup_fmt = false; in set_format()
642 err = snd_usb_select_mode_quirk(subs, fmt); in set_format()
656 fmt->altsetting, subs->direction); in set_format()
662 subs->interface = fmt->iface; in set_format()
663 subs->altset_idx = fmt->altset_idx; in set_format()
664 subs->data_endpoint = snd_usb_add_endpoint(subs->stream->chip, in set_format()
665 alts, fmt->endpoint, subs->direction, in set_format()
668 if (!subs->data_endpoint) in set_format()
671 err = set_sync_endpoint(subs, fmt, dev, alts, altsd); in set_format()
675 err = snd_usb_init_pitch(subs->stream->chip, fmt->iface, alts, fmt); in set_format()
679 subs->cur_audiofmt = fmt; in set_format()
681 snd_usb_set_format_quirk(subs, fmt); in set_format()
686 static int snd_usb_pcm_change_state(struct snd_usb_substream *subs, int state);
688 int snd_usb_enable_audio_stream(struct snd_usb_substream *subs, in snd_usb_enable_audio_stream() argument
697 if (subs->interface >= 0) { in snd_usb_enable_audio_stream()
698 usb_set_interface(subs->dev, subs->interface, 0); in snd_usb_enable_audio_stream()
699 subs->altset_idx = 0; in snd_usb_enable_audio_stream()
700 subs->interface = -1; in snd_usb_enable_audio_stream()
701 subs->cur_audiofmt = NULL; in snd_usb_enable_audio_stream()
704 snd_usb_autosuspend(subs->stream->chip); in snd_usb_enable_audio_stream()
708 snd_usb_autoresume(subs->stream->chip); in snd_usb_enable_audio_stream()
710 ret = snd_usb_pcm_change_state(subs, UAC3_PD_STATE_D0); in snd_usb_enable_audio_stream()
715 fmt = find_format_and_si(subs, datainterval); in snd_usb_enable_audio_stream()
717 fmt = find_format(subs); in snd_usb_enable_audio_stream()
719 dev_err(&subs->dev->dev, in snd_usb_enable_audio_stream()
721 subs->pcm_format, subs->cur_rate, subs->channels); in snd_usb_enable_audio_stream()
725 subs->altset_idx = 0; in snd_usb_enable_audio_stream()
726 subs->interface = -1; in snd_usb_enable_audio_stream()
727 if (atomic_read(&subs->stream->chip->shutdown)) { in snd_usb_enable_audio_stream()
730 ret = set_format(subs, fmt); in snd_usb_enable_audio_stream()
734 iface = usb_ifnum_to_if(subs->dev, subs->cur_audiofmt->iface); in snd_usb_enable_audio_stream()
736 dev_err(&subs->dev->dev, "Could not get iface %d\n", in snd_usb_enable_audio_stream()
737 subs->cur_audiofmt->iface); in snd_usb_enable_audio_stream()
741 alts = &iface->altsetting[subs->cur_audiofmt->altset_idx]; in snd_usb_enable_audio_stream()
742 ret = snd_usb_init_sample_rate(subs->stream->chip, in snd_usb_enable_audio_stream()
743 subs->cur_audiofmt->iface, in snd_usb_enable_audio_stream()
745 subs->cur_audiofmt, in snd_usb_enable_audio_stream()
746 subs->cur_rate); in snd_usb_enable_audio_stream()
748 dev_err(&subs->dev->dev, "failed to set rate %d\n", in snd_usb_enable_audio_stream()
749 subs->cur_rate); in snd_usb_enable_audio_stream()
754 subs->interface = fmt->iface; in snd_usb_enable_audio_stream()
755 subs->altset_idx = fmt->altset_idx; in snd_usb_enable_audio_stream()
768 static int match_endpoint_audioformats(struct snd_usb_substream *subs, in match_endpoint_audioformats() argument
777 dev_dbg(&subs->dev->dev, in match_endpoint_audioformats()
783 dev_dbg(&subs->dev->dev, in match_endpoint_audioformats()
796 dev_dbg(&subs->dev->dev, in match_endpoint_audioformats()
805 dev_dbg(&subs->dev->dev, in match_endpoint_audioformats()
814 static int configure_sync_endpoint(struct snd_usb_substream *subs) in configure_sync_endpoint() argument
820 int sync_period_bytes = subs->period_bytes; in configure_sync_endpoint()
822 &subs->stream->substream[subs->direction ^ 1]; in configure_sync_endpoint()
824 if (subs->sync_endpoint->type != SND_USB_ENDPOINT_TYPE_DATA || in configure_sync_endpoint()
825 !subs->stream) in configure_sync_endpoint()
826 return snd_usb_endpoint_set_params(subs->sync_endpoint, in configure_sync_endpoint()
827 subs->pcm_format, in configure_sync_endpoint()
828 subs->channels, in configure_sync_endpoint()
829 subs->period_bytes, in configure_sync_endpoint()
831 subs->cur_rate, in configure_sync_endpoint()
832 subs->cur_audiofmt, in configure_sync_endpoint()
837 int score = match_endpoint_audioformats(subs, in configure_sync_endpoint()
838 fp, subs->cur_audiofmt, in configure_sync_endpoint()
839 subs->cur_rate, subs->pcm_format); in configure_sync_endpoint()
848 dev_err(&subs->dev->dev, in configure_sync_endpoint()
858 if (sync_fp->channels != subs->channels) { in configure_sync_endpoint()
859 sync_period_bytes = (subs->period_bytes / subs->channels) * in configure_sync_endpoint()
861 dev_dbg(&subs->dev->dev, in configure_sync_endpoint()
863 __func__, subs->period_bytes, sync_period_bytes); in configure_sync_endpoint()
866 ret = snd_usb_endpoint_set_params(subs->sync_endpoint, in configure_sync_endpoint()
867 subs->pcm_format, in configure_sync_endpoint()
871 subs->cur_rate, in configure_sync_endpoint()
883 static int configure_endpoint(struct snd_usb_substream *subs) in configure_endpoint() argument
888 stop_endpoints(subs); in configure_endpoint()
889 sync_pending_stops(subs); in configure_endpoint()
890 ret = snd_usb_endpoint_set_params(subs->data_endpoint, in configure_endpoint()
891 subs->pcm_format, in configure_endpoint()
892 subs->channels, in configure_endpoint()
893 subs->period_bytes, in configure_endpoint()
894 subs->period_frames, in configure_endpoint()
895 subs->buffer_periods, in configure_endpoint()
896 subs->cur_rate, in configure_endpoint()
897 subs->cur_audiofmt, in configure_endpoint()
898 subs->sync_endpoint); in configure_endpoint()
902 if (subs->sync_endpoint) in configure_endpoint()
903 ret = configure_sync_endpoint(subs); in configure_endpoint()
908 static int snd_usb_pcm_change_state(struct snd_usb_substream *subs, int state) in snd_usb_pcm_change_state() argument
912 if (!subs->str_pd) in snd_usb_pcm_change_state()
915 ret = snd_usb_power_domain_set(subs->stream->chip, subs->str_pd, state); in snd_usb_pcm_change_state()
917 dev_err(&subs->dev->dev, in snd_usb_pcm_change_state()
919 subs->str_pd->pd_id, state, ret); in snd_usb_pcm_change_state()
969 struct snd_usb_substream *subs = substream->runtime->private_data; in snd_usb_hw_params() local
973 ret = snd_media_start_pipeline(subs); in snd_usb_hw_params()
977 subs->pcm_format = params_format(hw_params); in snd_usb_hw_params()
978 subs->period_bytes = params_period_bytes(hw_params); in snd_usb_hw_params()
979 subs->period_frames = params_period_size(hw_params); in snd_usb_hw_params()
980 subs->buffer_periods = params_periods(hw_params); in snd_usb_hw_params()
981 subs->channels = params_channels(hw_params); in snd_usb_hw_params()
982 subs->cur_rate = params_rate(hw_params); in snd_usb_hw_params()
984 fmt = find_format(subs); in snd_usb_hw_params()
986 dev_dbg(&subs->dev->dev, in snd_usb_hw_params()
988 subs->pcm_format, subs->cur_rate, subs->channels); in snd_usb_hw_params()
993 ret = snd_usb_lock_shutdown(subs->stream->chip); in snd_usb_hw_params()
997 ret = snd_usb_pcm_change_state(subs, UAC3_PD_STATE_D0); in snd_usb_hw_params()
1001 ret = set_format(subs, fmt); in snd_usb_hw_params()
1005 subs->interface = fmt->iface; in snd_usb_hw_params()
1006 subs->altset_idx = fmt->altset_idx; in snd_usb_hw_params()
1007 subs->need_setup_ep = true; in snd_usb_hw_params()
1010 snd_usb_unlock_shutdown(subs->stream->chip); in snd_usb_hw_params()
1016 snd_media_stop_pipeline(subs); in snd_usb_hw_params()
1027 struct snd_usb_substream *subs = substream->runtime->private_data; in snd_usb_hw_free() local
1029 snd_media_stop_pipeline(subs); in snd_usb_hw_free()
1030 subs->cur_audiofmt = NULL; in snd_usb_hw_free()
1031 subs->cur_rate = 0; in snd_usb_hw_free()
1032 subs->period_bytes = 0; in snd_usb_hw_free()
1033 if (!snd_usb_lock_shutdown(subs->stream->chip)) { in snd_usb_hw_free()
1034 stop_endpoints(subs); in snd_usb_hw_free()
1035 sync_pending_stops(subs); in snd_usb_hw_free()
1036 snd_usb_endpoint_deactivate(subs->sync_endpoint); in snd_usb_hw_free()
1037 snd_usb_endpoint_deactivate(subs->data_endpoint); in snd_usb_hw_free()
1038 snd_usb_unlock_shutdown(subs->stream->chip); in snd_usb_hw_free()
1052 struct snd_usb_substream *subs = runtime->private_data; in snd_usb_pcm_prepare() local
1057 ret = snd_vendor_set_pcm_buf(subs->dev, subs->cur_audiofmt->iface); in snd_usb_pcm_prepare()
1061 if (! subs->cur_audiofmt) { in snd_usb_pcm_prepare()
1062 dev_err(&subs->dev->dev, "no format is specified!\n"); in snd_usb_pcm_prepare()
1066 ret = snd_usb_lock_shutdown(subs->stream->chip); in snd_usb_pcm_prepare()
1069 if (snd_BUG_ON(!subs->data_endpoint)) { in snd_usb_pcm_prepare()
1074 ret = snd_usb_pcm_change_state(subs, UAC3_PD_STATE_D0); in snd_usb_pcm_prepare()
1078 ret = set_format(subs, subs->cur_audiofmt); in snd_usb_pcm_prepare()
1082 if (subs->need_setup_ep) { in snd_usb_pcm_prepare()
1084 iface = usb_ifnum_to_if(subs->dev, subs->cur_audiofmt->iface); in snd_usb_pcm_prepare()
1085 alts = &iface->altsetting[subs->cur_audiofmt->altset_idx]; in snd_usb_pcm_prepare()
1086 ret = snd_usb_init_sample_rate(subs->stream->chip, in snd_usb_pcm_prepare()
1087 subs->cur_audiofmt->iface, in snd_usb_pcm_prepare()
1089 subs->cur_audiofmt, in snd_usb_pcm_prepare()
1090 subs->cur_rate); in snd_usb_pcm_prepare()
1096 subs->cur_audiofmt->iface, in snd_usb_pcm_prepare()
1097 subs->cur_rate, in snd_usb_pcm_prepare()
1098 subs->cur_audiofmt->altsetting); in snd_usb_pcm_prepare()
1100 subs->need_setup_ep = false; in snd_usb_pcm_prepare()
1105 ret = configure_endpoint(subs); in snd_usb_pcm_prepare()
1108 subs->need_setup_ep = false; in snd_usb_pcm_prepare()
1112 subs->data_endpoint->maxframesize = in snd_usb_pcm_prepare()
1113 bytes_to_frames(runtime, subs->data_endpoint->maxpacksize); in snd_usb_pcm_prepare()
1114 subs->data_endpoint->curframesize = in snd_usb_pcm_prepare()
1115 bytes_to_frames(runtime, subs->data_endpoint->curpacksize); in snd_usb_pcm_prepare()
1118 subs->hwptr_done = 0; in snd_usb_pcm_prepare()
1119 subs->transfer_done = 0; in snd_usb_pcm_prepare()
1120 subs->last_delay = 0; in snd_usb_pcm_prepare()
1121 subs->last_frame_number = 0; in snd_usb_pcm_prepare()
1126 if (subs->direction == SNDRV_PCM_STREAM_PLAYBACK) in snd_usb_pcm_prepare()
1127 ret = start_endpoints(subs); in snd_usb_pcm_prepare()
1130 snd_usb_unlock_shutdown(subs->stream->chip); in snd_usb_pcm_prepare()
1149 static int hw_check_valid_format(struct snd_usb_substream *subs, in hw_check_valid_format() argument
1184 if (subs->speed != USB_SPEED_FULL) { in hw_check_valid_format()
1197 struct snd_usb_substream *subs = rule->private; in hw_rule_rate() local
1206 list_for_each_entry(fp, &subs->fmt_list, list) { in hw_rule_rate()
1207 if (!hw_check_valid_format(subs, params, fp)) in hw_rule_rate()
1249 struct snd_usb_substream *subs = rule->private; in hw_rule_channels() local
1258 list_for_each_entry(fp, &subs->fmt_list, list) { in hw_rule_channels()
1259 if (!hw_check_valid_format(subs, params, fp)) in hw_rule_channels()
1300 struct snd_usb_substream *subs = rule->private; in hw_rule_format() local
1309 list_for_each_entry(fp, &subs->fmt_list, list) { in hw_rule_format()
1310 if (!hw_check_valid_format(subs, params, fp)) in hw_rule_format()
1331 struct snd_usb_substream *subs = rule->private; in hw_rule_period_time() local
1341 list_for_each_entry(fp, &subs->fmt_list, list) { in hw_rule_period_time()
1342 if (!hw_check_valid_format(subs, params, fp)) in hw_rule_period_time()
1370 struct snd_usb_substream *subs) in snd_usb_pcm_check_knot() argument
1377 kfree(subs->rate_list.list); in snd_usb_pcm_check_knot()
1378 subs->rate_list.list = NULL; in snd_usb_pcm_check_knot()
1380 list_for_each_entry(fp, &subs->fmt_list, list) { in snd_usb_pcm_check_knot()
1390 subs->rate_list.list = rate_list = in snd_usb_pcm_check_knot()
1392 if (!subs->rate_list.list) in snd_usb_pcm_check_knot()
1394 subs->rate_list.count = count; in snd_usb_pcm_check_knot()
1395 subs->rate_list.mask = 0; in snd_usb_pcm_check_knot()
1397 list_for_each_entry(fp, &subs->fmt_list, list) { in snd_usb_pcm_check_knot()
1403 &subs->rate_list); in snd_usb_pcm_check_knot()
1415 static int setup_hw_info(struct snd_pcm_runtime *runtime, struct snd_usb_substream *subs) in setup_hw_info() argument
1422 runtime->hw.formats = subs->formats; in setup_hw_info()
1431 list_for_each_entry(fp, &subs->fmt_list, list) { in setup_hw_info()
1451 if (subs->speed == USB_SPEED_FULL) in setup_hw_info()
1465 hw_rule_rate, subs, in setup_hw_info()
1473 hw_rule_channels, subs, in setup_hw_info()
1481 hw_rule_format, subs, in setup_hw_info()
1491 hw_rule_period_time, subs, in setup_hw_info()
1499 err = snd_usb_pcm_check_knot(runtime, subs); in setup_hw_info()
1503 return snd_usb_autoresume(subs->stream->chip); in setup_hw_info()
1511 struct snd_usb_substream *subs = &as->substream[direction]; in snd_usb_pcm_open() local
1515 ret = snd_vendor_set_pcm_connection(subs->dev, SOUND_PCM_OPEN, in snd_usb_pcm_open()
1520 subs->interface = -1; in snd_usb_pcm_open()
1521 subs->altset_idx = 0; in snd_usb_pcm_open()
1523 runtime->private_data = subs; in snd_usb_pcm_open()
1524 subs->pcm_substream = substream; in snd_usb_pcm_open()
1528 subs->dsd_dop.byte_idx = 0; in snd_usb_pcm_open()
1529 subs->dsd_dop.channel = 0; in snd_usb_pcm_open()
1530 subs->dsd_dop.marker = 1; in snd_usb_pcm_open()
1532 ret = setup_hw_info(runtime, subs); in snd_usb_pcm_open()
1534 ret = snd_media_stream_init(subs, as->pcm, direction); in snd_usb_pcm_open()
1536 snd_usb_autosuspend(subs->stream->chip); in snd_usb_pcm_open()
1539 trace_android_vh_sound_usb_support_cpu_suspend(subs->dev, direction, &is_support); in snd_usb_pcm_open()
1541 snd_usb_autosuspend(subs->stream->chip); in snd_usb_pcm_open()
1550 struct snd_usb_substream *subs = &as->substream[direction]; in snd_usb_pcm_close() local
1554 ret = snd_vendor_set_pcm_connection(subs->dev, SOUND_PCM_CLOSE, in snd_usb_pcm_close()
1559 trace_android_vh_sound_usb_support_cpu_suspend(subs->dev, direction, &is_support); in snd_usb_pcm_close()
1561 snd_usb_autoresume(subs->stream->chip); in snd_usb_pcm_close()
1563 snd_media_stop_pipeline(subs); in snd_usb_pcm_close()
1566 subs->interface >= 0 && in snd_usb_pcm_close()
1567 !snd_usb_lock_shutdown(subs->stream->chip)) { in snd_usb_pcm_close()
1568 usb_set_interface(subs->dev, subs->interface, 0); in snd_usb_pcm_close()
1569 ret = snd_vendor_set_pcm_intf(usb_ifnum_to_if(subs->dev, in snd_usb_pcm_close()
1570 subs->interface), in snd_usb_pcm_close()
1571 subs->interface, 0, in snd_usb_pcm_close()
1575 subs->interface = -1; in snd_usb_pcm_close()
1576 ret = snd_usb_pcm_change_state(subs, UAC3_PD_STATE_D1); in snd_usb_pcm_close()
1577 snd_usb_unlock_shutdown(subs->stream->chip); in snd_usb_pcm_close()
1582 subs->pcm_substream = NULL; in snd_usb_pcm_close()
1583 snd_usb_autosuspend(subs->stream->chip); in snd_usb_pcm_close()
1593 static void retire_capture_urb(struct snd_usb_substream *subs, in retire_capture_urb() argument
1596 struct snd_pcm_runtime *runtime = subs->pcm_substream->runtime; in retire_capture_urb()
1604 current_frame_number = usb_get_current_frame_number(subs->dev); in retire_capture_urb()
1609 cp = (unsigned char *)urb->transfer_buffer + urb->iso_frame_desc[i].offset + subs->pkt_offset_adj; in retire_capture_urb()
1611 dev_dbg(&subs->dev->dev, "frame %d active: %d\n", in retire_capture_urb()
1616 if (subs->stream_offset_adj > 0) { in retire_capture_urb()
1617 unsigned int adj = min(subs->stream_offset_adj, bytes); in retire_capture_urb()
1620 subs->stream_offset_adj -= adj; in retire_capture_urb()
1623 if (!subs->txfr_quirk) in retire_capture_urb()
1628 dev_warn_ratelimited(&subs->dev->dev, in retire_capture_urb()
1633 spin_lock_irqsave(&subs->lock, flags); in retire_capture_urb()
1634 oldptr = subs->hwptr_done; in retire_capture_urb()
1635 subs->hwptr_done += bytes; in retire_capture_urb()
1636 if (subs->hwptr_done >= runtime->buffer_size * stride) in retire_capture_urb()
1637 subs->hwptr_done -= runtime->buffer_size * stride; in retire_capture_urb()
1639 subs->transfer_done += frames; in retire_capture_urb()
1640 if (subs->transfer_done >= runtime->period_size) { in retire_capture_urb()
1641 subs->transfer_done -= runtime->period_size; in retire_capture_urb()
1647 runtime->delay = subs->last_delay = 0; in retire_capture_urb()
1650 subs->last_frame_number = current_frame_number; in retire_capture_urb()
1651 subs->last_frame_number &= 0xFF; /* keep 8 LSBs */ in retire_capture_urb()
1653 spin_unlock_irqrestore(&subs->lock, flags); in retire_capture_urb()
1666 snd_pcm_period_elapsed(subs->pcm_substream); in retire_capture_urb()
1669 static inline void fill_playback_urb_dsd_dop(struct snd_usb_substream *subs, in fill_playback_urb_dsd_dop() argument
1672 struct snd_pcm_runtime *runtime = subs->pcm_substream->runtime; in fill_playback_urb_dsd_dop()
1675 unsigned int src_idx = subs->hwptr_done; in fill_playback_urb_dsd_dop()
1698 if (++subs->dsd_dop.byte_idx == 3) { in fill_playback_urb_dsd_dop()
1700 dst[dst_idx++] = marker[subs->dsd_dop.marker]; in fill_playback_urb_dsd_dop()
1702 subs->dsd_dop.byte_idx = 0; in fill_playback_urb_dsd_dop()
1704 if (++subs->dsd_dop.channel % runtime->channels == 0) { in fill_playback_urb_dsd_dop()
1706 subs->dsd_dop.marker++; in fill_playback_urb_dsd_dop()
1707 subs->dsd_dop.marker %= ARRAY_SIZE(marker); in fill_playback_urb_dsd_dop()
1708 subs->dsd_dop.channel = 0; in fill_playback_urb_dsd_dop()
1712 int idx = (src_idx + subs->dsd_dop.byte_idx - 1) % wrap; in fill_playback_urb_dsd_dop()
1714 if (subs->cur_audiofmt->dsd_bitrev) in fill_playback_urb_dsd_dop()
1719 subs->hwptr_done++; in fill_playback_urb_dsd_dop()
1722 if (subs->hwptr_done >= runtime->buffer_size * stride) in fill_playback_urb_dsd_dop()
1723 subs->hwptr_done -= runtime->buffer_size * stride; in fill_playback_urb_dsd_dop()
1726 static void copy_to_urb(struct snd_usb_substream *subs, struct urb *urb, in copy_to_urb() argument
1729 struct snd_pcm_runtime *runtime = subs->pcm_substream->runtime; in copy_to_urb()
1731 if (subs->hwptr_done + bytes > runtime->buffer_size * stride) { in copy_to_urb()
1734 runtime->buffer_size * stride - subs->hwptr_done; in copy_to_urb()
1736 runtime->dma_area + subs->hwptr_done, bytes1); in copy_to_urb()
1741 runtime->dma_area + subs->hwptr_done, bytes); in copy_to_urb()
1743 subs->hwptr_done += bytes; in copy_to_urb()
1744 if (subs->hwptr_done >= runtime->buffer_size * stride) in copy_to_urb()
1745 subs->hwptr_done -= runtime->buffer_size * stride; in copy_to_urb()
1748 static unsigned int copy_to_urb_quirk(struct snd_usb_substream *subs, in copy_to_urb_quirk() argument
1766 copy_to_urb(subs, urb, offset + sizeof(packet_length), in copy_to_urb_quirk()
1774 static void prepare_playback_urb(struct snd_usb_substream *subs, in prepare_playback_urb() argument
1777 struct snd_pcm_runtime *runtime = subs->pcm_substream->runtime; in prepare_playback_urb()
1778 struct snd_usb_endpoint *ep = subs->data_endpoint; in prepare_playback_urb()
1788 spin_lock_irqsave(&subs->lock, flags); in prepare_playback_urb()
1789 subs->frame_limit += ep->max_urb_frames; in prepare_playback_urb()
1803 subs->transfer_done += counts; in prepare_playback_urb()
1804 if (subs->transfer_done >= runtime->period_size) { in prepare_playback_urb()
1805 subs->transfer_done -= runtime->period_size; in prepare_playback_urb()
1806 subs->frame_limit = 0; in prepare_playback_urb()
1808 if (subs->fmt_type == UAC_FORMAT_TYPE_II) { in prepare_playback_urb()
1809 if (subs->transfer_done > 0) { in prepare_playback_urb()
1812 frames -= subs->transfer_done; in prepare_playback_urb()
1813 counts -= subs->transfer_done; in prepare_playback_urb()
1816 subs->transfer_done = 0; in prepare_playback_urb()
1831 subs->transfer_done >= subs->frame_limit) && in prepare_playback_urb()
1837 if (unlikely(subs->pcm_format == SNDRV_PCM_FORMAT_DSD_U16_LE && in prepare_playback_urb()
1838 subs->cur_audiofmt->dsd_dop)) { in prepare_playback_urb()
1839 fill_playback_urb_dsd_dop(subs, urb, bytes); in prepare_playback_urb()
1840 } else if (unlikely(subs->pcm_format == SNDRV_PCM_FORMAT_DSD_U8 && in prepare_playback_urb()
1841 subs->cur_audiofmt->dsd_bitrev)) { in prepare_playback_urb()
1845 int idx = (subs->hwptr_done + i) in prepare_playback_urb()
1850 subs->hwptr_done += bytes; in prepare_playback_urb()
1851 if (subs->hwptr_done >= runtime->buffer_size * stride) in prepare_playback_urb()
1852 subs->hwptr_done -= runtime->buffer_size * stride; in prepare_playback_urb()
1855 if (!subs->tx_length_quirk) in prepare_playback_urb()
1856 copy_to_urb(subs, urb, 0, stride, bytes); in prepare_playback_urb()
1858 bytes = copy_to_urb_quirk(subs, urb, stride, bytes); in prepare_playback_urb()
1863 runtime->delay = subs->last_delay; in prepare_playback_urb()
1865 subs->last_delay = runtime->delay; in prepare_playback_urb()
1868 subs->last_frame_number = usb_get_current_frame_number(subs->dev); in prepare_playback_urb()
1869 subs->last_frame_number &= 0xFF; /* keep 8 LSBs */ in prepare_playback_urb()
1871 if (subs->trigger_tstamp_pending_update) { in prepare_playback_urb()
1876 subs->trigger_tstamp_pending_update = false; in prepare_playback_urb()
1879 spin_unlock_irqrestore(&subs->lock, flags); in prepare_playback_urb()
1882 snd_pcm_period_elapsed(subs->pcm_substream); in prepare_playback_urb()
1889 static void retire_playback_urb(struct snd_usb_substream *subs, in retire_playback_urb() argument
1893 struct snd_pcm_runtime *runtime = subs->pcm_substream->runtime; in retire_playback_urb()
1894 struct snd_usb_endpoint *ep = subs->data_endpoint; in retire_playback_urb()
1904 spin_lock_irqsave(&subs->lock, flags); in retire_playback_urb()
1905 if (!subs->last_delay) in retire_playback_urb()
1908 est_delay = snd_usb_pcm_delay(subs, runtime->rate); in retire_playback_urb()
1910 if (processed > subs->last_delay) in retire_playback_urb()
1911 subs->last_delay = 0; in retire_playback_urb()
1913 subs->last_delay -= processed; in retire_playback_urb()
1914 runtime->delay = subs->last_delay; in retire_playback_urb()
1921 if (abs(est_delay - subs->last_delay) * 1000 > runtime->rate * 2) in retire_playback_urb()
1922 dev_dbg_ratelimited(&subs->dev->dev, in retire_playback_urb()
1924 est_delay, subs->last_delay); in retire_playback_urb()
1926 if (!subs->running) { in retire_playback_urb()
1930 subs->last_frame_number = in retire_playback_urb()
1931 usb_get_current_frame_number(subs->dev) & 0xff; in retire_playback_urb()
1935 spin_unlock_irqrestore(&subs->lock, flags); in retire_playback_urb()
1941 struct snd_usb_substream *subs = substream->runtime->private_data; in snd_usb_substream_playback_trigger() local
1945 subs->trigger_tstamp_pending_update = true; in snd_usb_substream_playback_trigger()
1948 subs->data_endpoint->prepare_data_urb = prepare_playback_urb; in snd_usb_substream_playback_trigger()
1949 subs->data_endpoint->retire_data_urb = retire_playback_urb; in snd_usb_substream_playback_trigger()
1950 subs->running = 1; in snd_usb_substream_playback_trigger()
1953 stop_endpoints(subs); in snd_usb_substream_playback_trigger()
1954 subs->running = 0; in snd_usb_substream_playback_trigger()
1957 subs->data_endpoint->prepare_data_urb = NULL; in snd_usb_substream_playback_trigger()
1959 subs->data_endpoint->retire_data_urb = retire_playback_urb; in snd_usb_substream_playback_trigger()
1960 subs->running = 0; in snd_usb_substream_playback_trigger()
1963 if (subs->stream->chip->setup_fmt_after_resume_quirk) { in snd_usb_substream_playback_trigger()
1964 stop_endpoints(subs); in snd_usb_substream_playback_trigger()
1965 subs->need_setup_fmt = true; in snd_usb_substream_playback_trigger()
1978 struct snd_usb_substream *subs = substream->runtime->private_data; in snd_usb_substream_capture_trigger() local
1982 err = start_endpoints(subs); in snd_usb_substream_capture_trigger()
1986 subs->data_endpoint->retire_data_urb = retire_capture_urb; in snd_usb_substream_capture_trigger()
1987 subs->running = 1; in snd_usb_substream_capture_trigger()
1990 stop_endpoints(subs); in snd_usb_substream_capture_trigger()
1991 subs->data_endpoint->retire_data_urb = NULL; in snd_usb_substream_capture_trigger()
1992 subs->running = 0; in snd_usb_substream_capture_trigger()
1995 subs->data_endpoint->retire_data_urb = NULL; in snd_usb_substream_capture_trigger()
1996 subs->running = 0; in snd_usb_substream_capture_trigger()
1999 subs->data_endpoint->retire_data_urb = retire_capture_urb; in snd_usb_substream_capture_trigger()
2000 subs->running = 1; in snd_usb_substream_capture_trigger()
2003 if (subs->stream->chip->setup_fmt_after_resume_quirk) { in snd_usb_substream_capture_trigger()
2004 stop_endpoints(subs); in snd_usb_substream_capture_trigger()
2005 subs->need_setup_fmt = true; in snd_usb_substream_capture_trigger()
2045 void snd_usb_preallocate_buffer(struct snd_usb_substream *subs) in snd_usb_preallocate_buffer() argument
2047 struct snd_pcm *pcm = subs->stream->pcm; in snd_usb_preallocate_buffer()
2048 struct snd_pcm_substream *s = pcm->streams[subs->direction].substream; in snd_usb_preallocate_buffer()
2049 struct device *dev = subs->dev->bus->sysdev; in snd_usb_preallocate_buffer()