Lines Matching refs:subs

43 snd_pcm_uframes_t snd_usb_pcm_delay(struct snd_usb_substream *subs,  in snd_usb_pcm_delay()  argument
50 if (!subs->last_delay) in snd_usb_pcm_delay()
53 current_frame_number = usb_get_current_frame_number(subs->dev); in snd_usb_pcm_delay()
59 frame_diff = (current_frame_number - subs->last_frame_number) & 0xff; in snd_usb_pcm_delay()
64 if (subs->direction == SNDRV_PCM_STREAM_PLAYBACK) in snd_usb_pcm_delay()
65 est_delay = subs->last_delay - est_delay; in snd_usb_pcm_delay()
67 est_delay = subs->last_delay + est_delay; in snd_usb_pcm_delay()
79 struct snd_usb_substream *subs; in snd_usb_pcm_pointer() local
82 subs = (struct snd_usb_substream *)substream->runtime->private_data; in snd_usb_pcm_pointer()
83 if (atomic_read(&subs->stream->chip->shutdown)) in snd_usb_pcm_pointer()
85 spin_lock(&subs->lock); in snd_usb_pcm_pointer()
86 hwptr_done = subs->hwptr_done; in snd_usb_pcm_pointer()
87 substream->runtime->delay = snd_usb_pcm_delay(subs, in snd_usb_pcm_pointer()
89 spin_unlock(&subs->lock); in snd_usb_pcm_pointer()
96 static struct audioformat *find_format(struct snd_usb_substream *subs) in find_format() argument
102 list_for_each_entry(fp, &subs->fmt_list, list) { in find_format()
103 if (!(fp->formats & pcm_format_to_bits(subs->pcm_format))) in find_format()
105 if (fp->channels != subs->channels) in find_format()
107 if (subs->cur_rate < fp->rate_min || in find_format()
108 subs->cur_rate > fp->rate_max) in find_format()
113 if (fp->rate_table[i] == subs->cur_rate) in find_format()
131 subs->direction == SNDRV_PCM_STREAM_PLAYBACK) || in find_format()
133 subs->direction == SNDRV_PCM_STREAM_CAPTURE)) in find_format()
136 subs->direction == SNDRV_PCM_STREAM_PLAYBACK) || in find_format()
138 subs->direction == SNDRV_PCM_STREAM_CAPTURE)) { in find_format()
221 static int start_endpoints(struct snd_usb_substream *subs, bool can_sleep) in start_endpoints() argument
225 if (!subs->data_endpoint) in start_endpoints()
228 if (!test_and_set_bit(SUBSTREAM_FLAG_DATA_EP_STARTED, &subs->flags)) { in start_endpoints()
229 struct snd_usb_endpoint *ep = subs->data_endpoint; in start_endpoints()
231 dev_dbg(&subs->dev->dev, "Starting data EP @%p\n", ep); in start_endpoints()
233 ep->data_subs = subs; in start_endpoints()
236 clear_bit(SUBSTREAM_FLAG_DATA_EP_STARTED, &subs->flags); in start_endpoints()
241 if (subs->sync_endpoint && in start_endpoints()
242 !test_and_set_bit(SUBSTREAM_FLAG_SYNC_EP_STARTED, &subs->flags)) { in start_endpoints()
243 struct snd_usb_endpoint *ep = subs->sync_endpoint; in start_endpoints()
245 if (subs->data_endpoint->iface != subs->sync_endpoint->iface || in start_endpoints()
246 subs->data_endpoint->altsetting != subs->sync_endpoint->altsetting) { in start_endpoints()
247 err = usb_set_interface(subs->dev, in start_endpoints()
248 subs->sync_endpoint->iface, in start_endpoints()
249 subs->sync_endpoint->altsetting); in start_endpoints()
251 clear_bit(SUBSTREAM_FLAG_SYNC_EP_STARTED, &subs->flags); in start_endpoints()
252 dev_err(&subs->dev->dev, in start_endpoints()
254 subs->sync_endpoint->iface, in start_endpoints()
255 subs->sync_endpoint->altsetting, err); in start_endpoints()
260 dev_dbg(&subs->dev->dev, "Starting sync EP @%p\n", ep); in start_endpoints()
262 ep->sync_slave = subs->data_endpoint; in start_endpoints()
265 clear_bit(SUBSTREAM_FLAG_SYNC_EP_STARTED, &subs->flags); in start_endpoints()
273 static void stop_endpoints(struct snd_usb_substream *subs, bool wait) in stop_endpoints() argument
275 if (test_and_clear_bit(SUBSTREAM_FLAG_SYNC_EP_STARTED, &subs->flags)) in stop_endpoints()
276 snd_usb_endpoint_stop(subs->sync_endpoint); in stop_endpoints()
278 if (test_and_clear_bit(SUBSTREAM_FLAG_DATA_EP_STARTED, &subs->flags)) in stop_endpoints()
279 snd_usb_endpoint_stop(subs->data_endpoint); in stop_endpoints()
282 snd_usb_endpoint_sync_pending_stop(subs->sync_endpoint); in stop_endpoints()
283 snd_usb_endpoint_sync_pending_stop(subs->data_endpoint); in stop_endpoints()
316 static int set_sync_ep_implicit_fb_quirk(struct snd_usb_substream *subs, in set_sync_ep_implicit_fb_quirk() argument
326 if (subs->direction != SNDRV_PCM_STREAM_PLAYBACK) in set_sync_ep_implicit_fb_quirk()
329 switch (subs->stream->chip->usb_id) { in set_sync_ep_implicit_fb_quirk()
356 USB_ID_VENDOR(subs->stream->chip->usb_id) == 0x0582 /* Roland */ && in set_sync_ep_implicit_fb_quirk()
367 subs->sync_endpoint = snd_usb_add_endpoint(subs->stream->chip, in set_sync_ep_implicit_fb_quirk()
368 alts, ep, !subs->direction, in set_sync_ep_implicit_fb_quirk()
370 if (!subs->sync_endpoint) in set_sync_ep_implicit_fb_quirk()
373 subs->data_endpoint->sync_master = subs->sync_endpoint; in set_sync_ep_implicit_fb_quirk()
378 static int set_sync_endpoint(struct snd_usb_substream *subs, in set_sync_endpoint() argument
384 int is_playback = subs->direction == SNDRV_PCM_STREAM_PLAYBACK; in set_sync_endpoint()
396 err = set_sync_ep_implicit_fb_quirk(subs, dev, altsd, attr); in set_sync_endpoint()
436 subs->sync_endpoint = snd_usb_add_endpoint(subs->stream->chip, in set_sync_endpoint()
437 alts, ep, !subs->direction, in set_sync_endpoint()
441 if (!subs->sync_endpoint) in set_sync_endpoint()
444 subs->data_endpoint->sync_master = subs->sync_endpoint; in set_sync_endpoint()
452 static int set_format(struct snd_usb_substream *subs, struct audioformat *fmt) in set_format() argument
454 struct usb_device *dev = subs->dev; in set_format()
468 if (fmt == subs->cur_audiofmt) in set_format()
472 if (subs->interface >= 0 && subs->interface != fmt->iface) { in set_format()
473 err = usb_set_interface(subs->dev, subs->interface, 0); in set_format()
480 subs->interface = -1; in set_format()
481 subs->altset_idx = 0; in set_format()
485 if (subs->interface != fmt->iface || in set_format()
486 subs->altset_idx != fmt->altset_idx) { in set_format()
488 err = snd_usb_select_mode_quirk(subs, fmt); in set_format()
501 subs->interface = fmt->iface; in set_format()
502 subs->altset_idx = fmt->altset_idx; in set_format()
507 subs->data_endpoint = snd_usb_add_endpoint(subs->stream->chip, in set_format()
508 alts, fmt->endpoint, subs->direction, in set_format()
511 if (!subs->data_endpoint) in set_format()
514 err = set_sync_endpoint(subs, fmt, dev, alts, altsd); in set_format()
518 err = snd_usb_init_pitch(subs->stream->chip, fmt->iface, alts, fmt); in set_format()
522 subs->cur_audiofmt = fmt; in set_format()
524 snd_usb_set_format_quirk(subs, fmt); in set_format()
536 static int match_endpoint_audioformats(struct snd_usb_substream *subs, in match_endpoint_audioformats() argument
545 dev_dbg(&subs->dev->dev, in match_endpoint_audioformats()
551 dev_dbg(&subs->dev->dev, in match_endpoint_audioformats()
564 dev_dbg(&subs->dev->dev, in match_endpoint_audioformats()
573 dev_dbg(&subs->dev->dev, in match_endpoint_audioformats()
582 static int configure_sync_endpoint(struct snd_usb_substream *subs) in configure_sync_endpoint() argument
588 int sync_period_bytes = subs->period_bytes; in configure_sync_endpoint()
590 &subs->stream->substream[subs->direction ^ 1]; in configure_sync_endpoint()
592 if (subs->sync_endpoint->type != SND_USB_ENDPOINT_TYPE_DATA || in configure_sync_endpoint()
593 !subs->stream) in configure_sync_endpoint()
594 return snd_usb_endpoint_set_params(subs->sync_endpoint, in configure_sync_endpoint()
595 subs->pcm_format, in configure_sync_endpoint()
596 subs->channels, in configure_sync_endpoint()
597 subs->period_bytes, in configure_sync_endpoint()
599 subs->cur_rate, in configure_sync_endpoint()
600 subs->cur_audiofmt, in configure_sync_endpoint()
605 int score = match_endpoint_audioformats(subs, in configure_sync_endpoint()
606 fp, subs->cur_audiofmt, in configure_sync_endpoint()
607 subs->cur_rate, subs->pcm_format); in configure_sync_endpoint()
616 dev_err(&subs->dev->dev, in configure_sync_endpoint()
626 if (sync_fp->channels != subs->channels) { in configure_sync_endpoint()
627 sync_period_bytes = (subs->period_bytes / subs->channels) * in configure_sync_endpoint()
629 dev_dbg(&subs->dev->dev, in configure_sync_endpoint()
631 __func__, subs->period_bytes, sync_period_bytes); in configure_sync_endpoint()
634 ret = snd_usb_endpoint_set_params(subs->sync_endpoint, in configure_sync_endpoint()
635 subs->pcm_format, in configure_sync_endpoint()
639 subs->cur_rate, in configure_sync_endpoint()
651 static int configure_endpoint(struct snd_usb_substream *subs) in configure_endpoint() argument
656 stop_endpoints(subs, true); in configure_endpoint()
657 ret = snd_usb_endpoint_set_params(subs->data_endpoint, in configure_endpoint()
658 subs->pcm_format, in configure_endpoint()
659 subs->channels, in configure_endpoint()
660 subs->period_bytes, in configure_endpoint()
661 subs->period_frames, in configure_endpoint()
662 subs->buffer_periods, in configure_endpoint()
663 subs->cur_rate, in configure_endpoint()
664 subs->cur_audiofmt, in configure_endpoint()
665 subs->sync_endpoint); in configure_endpoint()
669 if (subs->sync_endpoint) in configure_endpoint()
670 ret = configure_sync_endpoint(subs); in configure_endpoint()
688 struct snd_usb_substream *subs = substream->runtime->private_data; in snd_usb_hw_params() local
697 subs->pcm_format = params_format(hw_params); in snd_usb_hw_params()
698 subs->period_bytes = params_period_bytes(hw_params); in snd_usb_hw_params()
699 subs->period_frames = params_period_size(hw_params); in snd_usb_hw_params()
700 subs->buffer_periods = params_periods(hw_params); in snd_usb_hw_params()
701 subs->channels = params_channels(hw_params); in snd_usb_hw_params()
702 subs->cur_rate = params_rate(hw_params); in snd_usb_hw_params()
704 fmt = find_format(subs); in snd_usb_hw_params()
706 dev_dbg(&subs->dev->dev, in snd_usb_hw_params()
708 subs->pcm_format, subs->cur_rate, subs->channels); in snd_usb_hw_params()
712 ret = snd_usb_lock_shutdown(subs->stream->chip); in snd_usb_hw_params()
715 ret = set_format(subs, fmt); in snd_usb_hw_params()
716 snd_usb_unlock_shutdown(subs->stream->chip); in snd_usb_hw_params()
720 subs->interface = fmt->iface; in snd_usb_hw_params()
721 subs->altset_idx = fmt->altset_idx; in snd_usb_hw_params()
722 subs->need_setup_ep = true; in snd_usb_hw_params()
734 struct snd_usb_substream *subs = substream->runtime->private_data; in snd_usb_hw_free() local
736 subs->cur_audiofmt = NULL; in snd_usb_hw_free()
737 subs->cur_rate = 0; in snd_usb_hw_free()
738 subs->period_bytes = 0; in snd_usb_hw_free()
739 if (!snd_usb_lock_shutdown(subs->stream->chip)) { in snd_usb_hw_free()
740 stop_endpoints(subs, true); in snd_usb_hw_free()
741 snd_usb_endpoint_deactivate(subs->sync_endpoint); in snd_usb_hw_free()
742 snd_usb_endpoint_deactivate(subs->data_endpoint); in snd_usb_hw_free()
743 snd_usb_unlock_shutdown(subs->stream->chip); in snd_usb_hw_free()
756 struct snd_usb_substream *subs = runtime->private_data; in snd_usb_pcm_prepare() local
761 if (! subs->cur_audiofmt) { in snd_usb_pcm_prepare()
762 dev_err(&subs->dev->dev, "no format is specified!\n"); in snd_usb_pcm_prepare()
766 ret = snd_usb_lock_shutdown(subs->stream->chip); in snd_usb_pcm_prepare()
769 if (snd_BUG_ON(!subs->data_endpoint)) { in snd_usb_pcm_prepare()
774 snd_usb_endpoint_sync_pending_stop(subs->sync_endpoint); in snd_usb_pcm_prepare()
775 snd_usb_endpoint_sync_pending_stop(subs->data_endpoint); in snd_usb_pcm_prepare()
777 ret = set_format(subs, subs->cur_audiofmt); in snd_usb_pcm_prepare()
781 iface = usb_ifnum_to_if(subs->dev, subs->cur_audiofmt->iface); in snd_usb_pcm_prepare()
782 alts = &iface->altsetting[subs->cur_audiofmt->altset_idx]; in snd_usb_pcm_prepare()
783 ret = snd_usb_init_sample_rate(subs->stream->chip, in snd_usb_pcm_prepare()
784 subs->cur_audiofmt->iface, in snd_usb_pcm_prepare()
786 subs->cur_audiofmt, in snd_usb_pcm_prepare()
787 subs->cur_rate); in snd_usb_pcm_prepare()
791 if (subs->need_setup_ep) { in snd_usb_pcm_prepare()
792 ret = configure_endpoint(subs); in snd_usb_pcm_prepare()
795 subs->need_setup_ep = false; in snd_usb_pcm_prepare()
799 subs->data_endpoint->maxframesize = in snd_usb_pcm_prepare()
800 bytes_to_frames(runtime, subs->data_endpoint->maxpacksize); in snd_usb_pcm_prepare()
801 subs->data_endpoint->curframesize = in snd_usb_pcm_prepare()
802 bytes_to_frames(runtime, subs->data_endpoint->curpacksize); in snd_usb_pcm_prepare()
805 subs->hwptr_done = 0; in snd_usb_pcm_prepare()
806 subs->transfer_done = 0; in snd_usb_pcm_prepare()
807 subs->last_delay = 0; in snd_usb_pcm_prepare()
808 subs->last_frame_number = 0; in snd_usb_pcm_prepare()
813 if (subs->direction == SNDRV_PCM_STREAM_PLAYBACK) in snd_usb_pcm_prepare()
814 ret = start_endpoints(subs, true); in snd_usb_pcm_prepare()
817 snd_usb_unlock_shutdown(subs->stream->chip); in snd_usb_pcm_prepare()
836 static int hw_check_valid_format(struct snd_usb_substream *subs, in hw_check_valid_format() argument
871 if (subs->speed != USB_SPEED_FULL) { in hw_check_valid_format()
884 struct snd_usb_substream *subs = rule->private; in hw_rule_rate() local
893 list_for_each_entry(fp, &subs->fmt_list, list) { in hw_rule_rate()
894 if (!hw_check_valid_format(subs, params, fp)) in hw_rule_rate()
936 struct snd_usb_substream *subs = rule->private; in hw_rule_channels() local
945 list_for_each_entry(fp, &subs->fmt_list, list) { in hw_rule_channels()
946 if (!hw_check_valid_format(subs, params, fp)) in hw_rule_channels()
987 struct snd_usb_substream *subs = rule->private; in hw_rule_format() local
996 list_for_each_entry(fp, &subs->fmt_list, list) { in hw_rule_format()
997 if (!hw_check_valid_format(subs, params, fp)) in hw_rule_format()
1018 struct snd_usb_substream *subs = rule->private; in hw_rule_period_time() local
1028 list_for_each_entry(fp, &subs->fmt_list, list) { in hw_rule_period_time()
1029 if (!hw_check_valid_format(subs, params, fp)) in hw_rule_period_time()
1057 struct snd_usb_substream *subs) in snd_usb_pcm_check_knot() argument
1064 kfree(subs->rate_list.list); in snd_usb_pcm_check_knot()
1065 subs->rate_list.list = NULL; in snd_usb_pcm_check_knot()
1067 list_for_each_entry(fp, &subs->fmt_list, list) { in snd_usb_pcm_check_knot()
1077 subs->rate_list.list = rate_list = in snd_usb_pcm_check_knot()
1079 if (!subs->rate_list.list) in snd_usb_pcm_check_knot()
1081 subs->rate_list.count = count; in snd_usb_pcm_check_knot()
1082 subs->rate_list.mask = 0; in snd_usb_pcm_check_knot()
1084 list_for_each_entry(fp, &subs->fmt_list, list) { in snd_usb_pcm_check_knot()
1090 &subs->rate_list); in snd_usb_pcm_check_knot()
1102 static int setup_hw_info(struct snd_pcm_runtime *runtime, struct snd_usb_substream *subs) in setup_hw_info() argument
1109 runtime->hw.formats = subs->formats; in setup_hw_info()
1118 list_for_each_entry(fp, &subs->fmt_list, list) { in setup_hw_info()
1136 err = snd_usb_autoresume(subs->stream->chip); in setup_hw_info()
1141 if (subs->speed == USB_SPEED_FULL) in setup_hw_info()
1151 hw_rule_rate, subs, in setup_hw_info()
1158 hw_rule_channels, subs, in setup_hw_info()
1165 hw_rule_format, subs, in setup_hw_info()
1174 hw_rule_period_time, subs, in setup_hw_info()
1182 if ((err = snd_usb_pcm_check_knot(runtime, subs)) < 0) in setup_hw_info()
1187 snd_usb_autosuspend(subs->stream->chip); in setup_hw_info()
1195 struct snd_usb_substream *subs = &as->substream[direction]; in snd_usb_pcm_open() local
1197 subs->interface = -1; in snd_usb_pcm_open()
1198 subs->altset_idx = 0; in snd_usb_pcm_open()
1200 runtime->private_data = subs; in snd_usb_pcm_open()
1201 subs->pcm_substream = substream; in snd_usb_pcm_open()
1205 subs->dsd_dop.byte_idx = 0; in snd_usb_pcm_open()
1206 subs->dsd_dop.channel = 0; in snd_usb_pcm_open()
1207 subs->dsd_dop.marker = 1; in snd_usb_pcm_open()
1209 return setup_hw_info(runtime, subs); in snd_usb_pcm_open()
1215 struct snd_usb_substream *subs = &as->substream[direction]; in snd_usb_pcm_close() local
1217 stop_endpoints(subs, true); in snd_usb_pcm_close()
1219 if (subs->interface >= 0 && in snd_usb_pcm_close()
1220 !snd_usb_lock_shutdown(subs->stream->chip)) { in snd_usb_pcm_close()
1221 usb_set_interface(subs->dev, subs->interface, 0); in snd_usb_pcm_close()
1222 subs->interface = -1; in snd_usb_pcm_close()
1223 snd_usb_unlock_shutdown(subs->stream->chip); in snd_usb_pcm_close()
1226 subs->pcm_substream = NULL; in snd_usb_pcm_close()
1227 snd_usb_autosuspend(subs->stream->chip); in snd_usb_pcm_close()
1237 static void retire_capture_urb(struct snd_usb_substream *subs, in retire_capture_urb() argument
1240 struct snd_pcm_runtime *runtime = subs->pcm_substream->runtime; in retire_capture_urb()
1248 current_frame_number = usb_get_current_frame_number(subs->dev); in retire_capture_urb()
1253 cp = (unsigned char *)urb->transfer_buffer + urb->iso_frame_desc[i].offset + subs->pkt_offset_adj; in retire_capture_urb()
1255 dev_dbg(&subs->dev->dev, "frame %d active: %d\n", in retire_capture_urb()
1261 if (!subs->txfr_quirk) in retire_capture_urb()
1266 dev_warn(&subs->dev->dev, in retire_capture_urb()
1271 spin_lock_irqsave(&subs->lock, flags); in retire_capture_urb()
1272 oldptr = subs->hwptr_done; in retire_capture_urb()
1273 subs->hwptr_done += bytes; in retire_capture_urb()
1274 if (subs->hwptr_done >= runtime->buffer_size * stride) in retire_capture_urb()
1275 subs->hwptr_done -= runtime->buffer_size * stride; in retire_capture_urb()
1277 subs->transfer_done += frames; in retire_capture_urb()
1278 if (subs->transfer_done >= runtime->period_size) { in retire_capture_urb()
1279 subs->transfer_done -= runtime->period_size; in retire_capture_urb()
1285 runtime->delay = subs->last_delay = 0; in retire_capture_urb()
1288 subs->last_frame_number = current_frame_number; in retire_capture_urb()
1289 subs->last_frame_number &= 0xFF; /* keep 8 LSBs */ in retire_capture_urb()
1291 spin_unlock_irqrestore(&subs->lock, flags); in retire_capture_urb()
1304 snd_pcm_period_elapsed(subs->pcm_substream); in retire_capture_urb()
1307 static inline void fill_playback_urb_dsd_dop(struct snd_usb_substream *subs, in fill_playback_urb_dsd_dop() argument
1310 struct snd_pcm_runtime *runtime = subs->pcm_substream->runtime; in fill_playback_urb_dsd_dop()
1313 unsigned int src_idx = subs->hwptr_done; in fill_playback_urb_dsd_dop()
1336 if (++subs->dsd_dop.byte_idx == 3) { in fill_playback_urb_dsd_dop()
1338 dst[dst_idx++] = marker[subs->dsd_dop.marker]; in fill_playback_urb_dsd_dop()
1340 subs->dsd_dop.byte_idx = 0; in fill_playback_urb_dsd_dop()
1342 if (++subs->dsd_dop.channel % runtime->channels == 0) { in fill_playback_urb_dsd_dop()
1344 subs->dsd_dop.marker++; in fill_playback_urb_dsd_dop()
1345 subs->dsd_dop.marker %= ARRAY_SIZE(marker); in fill_playback_urb_dsd_dop()
1346 subs->dsd_dop.channel = 0; in fill_playback_urb_dsd_dop()
1350 int idx = (src_idx + subs->dsd_dop.byte_idx - 1) % wrap; in fill_playback_urb_dsd_dop()
1352 if (subs->cur_audiofmt->dsd_bitrev) in fill_playback_urb_dsd_dop()
1357 subs->hwptr_done++; in fill_playback_urb_dsd_dop()
1362 static void prepare_playback_urb(struct snd_usb_substream *subs, in prepare_playback_urb() argument
1365 struct snd_pcm_runtime *runtime = subs->pcm_substream->runtime; in prepare_playback_urb()
1366 struct snd_usb_endpoint *ep = subs->data_endpoint; in prepare_playback_urb()
1376 spin_lock_irqsave(&subs->lock, flags); in prepare_playback_urb()
1377 subs->frame_limit += ep->max_urb_frames; in prepare_playback_urb()
1389 subs->transfer_done += counts; in prepare_playback_urb()
1390 if (subs->transfer_done >= runtime->period_size) { in prepare_playback_urb()
1391 subs->transfer_done -= runtime->period_size; in prepare_playback_urb()
1392 subs->frame_limit = 0; in prepare_playback_urb()
1394 if (subs->fmt_type == UAC_FORMAT_TYPE_II) { in prepare_playback_urb()
1395 if (subs->transfer_done > 0) { in prepare_playback_urb()
1398 frames -= subs->transfer_done; in prepare_playback_urb()
1399 counts -= subs->transfer_done; in prepare_playback_urb()
1402 subs->transfer_done = 0; in prepare_playback_urb()
1417 subs->transfer_done >= subs->frame_limit) && in prepare_playback_urb()
1423 if (unlikely(subs->pcm_format == SNDRV_PCM_FORMAT_DSD_U16_LE && in prepare_playback_urb()
1424 subs->cur_audiofmt->dsd_dop)) { in prepare_playback_urb()
1425 fill_playback_urb_dsd_dop(subs, urb, bytes); in prepare_playback_urb()
1426 } else if (unlikely(subs->pcm_format == SNDRV_PCM_FORMAT_DSD_U8 && in prepare_playback_urb()
1427 subs->cur_audiofmt->dsd_bitrev)) { in prepare_playback_urb()
1431 int idx = (subs->hwptr_done + i) in prepare_playback_urb()
1436 subs->hwptr_done += bytes; in prepare_playback_urb()
1439 if (subs->hwptr_done + bytes > runtime->buffer_size * stride) { in prepare_playback_urb()
1442 runtime->buffer_size * stride - subs->hwptr_done; in prepare_playback_urb()
1444 runtime->dma_area + subs->hwptr_done, bytes1); in prepare_playback_urb()
1449 runtime->dma_area + subs->hwptr_done, bytes); in prepare_playback_urb()
1452 subs->hwptr_done += bytes; in prepare_playback_urb()
1455 if (subs->hwptr_done >= runtime->buffer_size * stride) in prepare_playback_urb()
1456 subs->hwptr_done -= runtime->buffer_size * stride; in prepare_playback_urb()
1459 runtime->delay = subs->last_delay; in prepare_playback_urb()
1461 subs->last_delay = runtime->delay; in prepare_playback_urb()
1464 subs->last_frame_number = usb_get_current_frame_number(subs->dev); in prepare_playback_urb()
1465 subs->last_frame_number &= 0xFF; /* keep 8 LSBs */ in prepare_playback_urb()
1467 if (subs->trigger_tstamp_pending_update) { in prepare_playback_urb()
1472 subs->trigger_tstamp_pending_update = false; in prepare_playback_urb()
1475 spin_unlock_irqrestore(&subs->lock, flags); in prepare_playback_urb()
1478 snd_pcm_period_elapsed(subs->pcm_substream); in prepare_playback_urb()
1485 static void retire_playback_urb(struct snd_usb_substream *subs, in retire_playback_urb() argument
1489 struct snd_pcm_runtime *runtime = subs->pcm_substream->runtime; in retire_playback_urb()
1490 struct snd_usb_endpoint *ep = subs->data_endpoint; in retire_playback_urb()
1500 spin_lock_irqsave(&subs->lock, flags); in retire_playback_urb()
1501 if (!subs->last_delay) in retire_playback_urb()
1504 est_delay = snd_usb_pcm_delay(subs, runtime->rate); in retire_playback_urb()
1506 if (processed > subs->last_delay) in retire_playback_urb()
1507 subs->last_delay = 0; in retire_playback_urb()
1509 subs->last_delay -= processed; in retire_playback_urb()
1510 runtime->delay = subs->last_delay; in retire_playback_urb()
1517 if (abs(est_delay - subs->last_delay) * 1000 > runtime->rate * 2) in retire_playback_urb()
1518 dev_dbg_ratelimited(&subs->dev->dev, in retire_playback_urb()
1520 est_delay, subs->last_delay); in retire_playback_urb()
1522 if (!subs->running) { in retire_playback_urb()
1526 subs->last_frame_number = in retire_playback_urb()
1527 usb_get_current_frame_number(subs->dev) & 0xff; in retire_playback_urb()
1531 spin_unlock_irqrestore(&subs->lock, flags); in retire_playback_urb()
1557 struct snd_usb_substream *subs = substream->runtime->private_data; in snd_usb_substream_playback_trigger() local
1561 subs->trigger_tstamp_pending_update = true; in snd_usb_substream_playback_trigger()
1563 subs->data_endpoint->prepare_data_urb = prepare_playback_urb; in snd_usb_substream_playback_trigger()
1564 subs->data_endpoint->retire_data_urb = retire_playback_urb; in snd_usb_substream_playback_trigger()
1565 subs->running = 1; in snd_usb_substream_playback_trigger()
1568 stop_endpoints(subs, false); in snd_usb_substream_playback_trigger()
1569 subs->running = 0; in snd_usb_substream_playback_trigger()
1572 subs->data_endpoint->prepare_data_urb = NULL; in snd_usb_substream_playback_trigger()
1574 subs->data_endpoint->retire_data_urb = retire_playback_urb; in snd_usb_substream_playback_trigger()
1575 subs->running = 0; in snd_usb_substream_playback_trigger()
1586 struct snd_usb_substream *subs = substream->runtime->private_data; in snd_usb_substream_capture_trigger() local
1590 err = start_endpoints(subs, false); in snd_usb_substream_capture_trigger()
1594 subs->data_endpoint->retire_data_urb = retire_capture_urb; in snd_usb_substream_capture_trigger()
1595 subs->running = 1; in snd_usb_substream_capture_trigger()
1598 stop_endpoints(subs, false); in snd_usb_substream_capture_trigger()
1599 subs->running = 0; in snd_usb_substream_capture_trigger()
1602 subs->data_endpoint->retire_data_urb = NULL; in snd_usb_substream_capture_trigger()
1603 subs->running = 0; in snd_usb_substream_capture_trigger()
1606 subs->data_endpoint->retire_data_urb = retire_capture_urb; in snd_usb_substream_capture_trigger()
1607 subs->running = 1; in snd_usb_substream_capture_trigger()