Lines Matching +full:max +full:- +full:adj
1 // SPDX-License-Identifier: GPL-2.0-or-later
11 #include <linux/usb/audio-v2.h>
40 if (subs->direction == SNDRV_PCM_STREAM_PLAYBACK) { in snd_usb_pcm_delay()
41 queued = bytes_to_frames(runtime, subs->inflight_bytes); in snd_usb_pcm_delay()
44 } else if (!subs->running) { in snd_usb_pcm_delay()
48 current_frame_number = usb_get_current_frame_number(subs->dev); in snd_usb_pcm_delay()
54 frame_diff = (current_frame_number - subs->last_frame_number) & 0xff; in snd_usb_pcm_delay()
58 est_delay = frame_diff * runtime->rate / 1000; in snd_usb_pcm_delay()
60 if (subs->direction == SNDRV_PCM_STREAM_PLAYBACK) { in snd_usb_pcm_delay()
61 est_delay = queued - est_delay; in snd_usb_pcm_delay()
74 struct snd_pcm_runtime *runtime = substream->runtime; in snd_usb_pcm_pointer()
75 struct snd_usb_substream *subs = runtime->private_data; in snd_usb_pcm_pointer()
78 if (atomic_read(&subs->stream->chip->shutdown)) in snd_usb_pcm_pointer()
80 spin_lock(&subs->lock); in snd_usb_pcm_pointer()
81 hwptr_done = subs->hwptr_done; in snd_usb_pcm_pointer()
82 runtime->delay = snd_usb_pcm_delay(subs, runtime); in snd_usb_pcm_pointer()
83 spin_unlock(&subs->lock); in snd_usb_pcm_pointer()
101 if (!(fp->formats & pcm_format_to_bits(format))) in find_format()
103 if (fp->channels != channels) in find_format()
106 if (rate < fp->rate_min || rate > fp->rate_max) in find_format()
108 if (!(fp->rates & SNDRV_PCM_RATE_CONTINUOUS)) { in find_format()
110 for (i = 0; i < fp->nr_rates; i++) in find_format()
111 if (fp->rate_table[i] == rate) in find_format()
113 if (i >= fp->nr_rates) in find_format()
116 attr = fp->ep_attr & USB_ENDPOINT_SYNCTYPE; in find_format()
125 * M-audio audiophile USB. in find_format()
129 subs->direction == SNDRV_PCM_STREAM_PLAYBACK) || in find_format()
131 subs->direction == SNDRV_PCM_STREAM_CAPTURE)) in find_format()
134 subs->direction == SNDRV_PCM_STREAM_PLAYBACK) || in find_format()
136 subs->direction == SNDRV_PCM_STREAM_CAPTURE)) { in find_format()
142 /* find the format with the largest max. packet size */ in find_format()
143 if (fp->maxpacksize > found->maxpacksize) { in find_format()
155 return find_format(&subs->fmt_list, params_format(params), in find_substream_format()
164 int rate = -1; in snd_usb_pcm_has_fixed_rate()
168 chip = subs->stream->chip; in snd_usb_pcm_has_fixed_rate()
169 if (!(chip->quirk_flags & QUIRK_FLAG_FIXED_RATE)) in snd_usb_pcm_has_fixed_rate()
171 list_for_each_entry(fp, &subs->fmt_list, list) { in snd_usb_pcm_has_fixed_rate()
172 if (fp->rates & SNDRV_PCM_RATE_CONTINUOUS) in snd_usb_pcm_has_fixed_rate()
174 if (fp->nr_rates < 1) in snd_usb_pcm_has_fixed_rate()
176 if (fp->nr_rates > 1) in snd_usb_pcm_has_fixed_rate()
179 rate = fp->rate_table[0]; in snd_usb_pcm_has_fixed_rate()
182 if (rate != fp->rate_table[0]) in snd_usb_pcm_has_fixed_rate()
190 struct usb_device *dev = chip->dev; in init_pitch_v1()
204 struct usb_device *dev = chip->dev; in init_pitch_v2()
225 if (!(fmt->attributes & UAC_EP_CS_ATTR_PITCH_CONTROL)) in snd_usb_init_pitch()
228 usb_audio_dbg(chip, "enable PITCH for EP 0x%x\n", fmt->endpoint); in snd_usb_init_pitch()
230 switch (fmt->protocol) { in snd_usb_init_pitch()
232 err = init_pitch_v1(chip, fmt->endpoint); in snd_usb_init_pitch()
235 err = init_pitch_v2(chip, fmt->endpoint); in snd_usb_init_pitch()
243 fmt->endpoint); in snd_usb_init_pitch()
254 if (test_and_clear_bit(SUBSTREAM_FLAG_SYNC_EP_STARTED, &subs->flags)) { in stop_endpoints()
255 snd_usb_endpoint_stop(subs->sync_endpoint, keep_pending); in stop_endpoints()
258 if (test_and_clear_bit(SUBSTREAM_FLAG_DATA_EP_STARTED, &subs->flags)) { in stop_endpoints()
259 snd_usb_endpoint_stop(subs->data_endpoint, keep_pending); in stop_endpoints()
269 if (!subs->data_endpoint) in start_endpoints()
270 return -EINVAL; in start_endpoints()
272 if (!test_and_set_bit(SUBSTREAM_FLAG_DATA_EP_STARTED, &subs->flags)) { in start_endpoints()
273 err = snd_usb_endpoint_start(subs->data_endpoint); in start_endpoints()
275 clear_bit(SUBSTREAM_FLAG_DATA_EP_STARTED, &subs->flags); in start_endpoints()
280 if (subs->sync_endpoint && in start_endpoints()
281 !test_and_set_bit(SUBSTREAM_FLAG_SYNC_EP_STARTED, &subs->flags)) { in start_endpoints()
282 err = snd_usb_endpoint_start(subs->sync_endpoint); in start_endpoints()
284 clear_bit(SUBSTREAM_FLAG_SYNC_EP_STARTED, &subs->flags); in start_endpoints()
298 snd_usb_endpoint_sync_pending_stop(subs->sync_endpoint); in sync_pending_stops()
299 snd_usb_endpoint_sync_pending_stop(subs->data_endpoint); in sync_pending_stops()
305 struct snd_usb_substream *subs = substream->runtime->private_data; in snd_usb_pcm_sync_stop()
315 struct usb_device *dev = chip->dev; in snd_usb_audioformat_set_sync_ep()
322 if (fmt->sync_ep) in snd_usb_audioformat_set_sync_ep()
325 alts = snd_usb_get_host_interface(chip, fmt->iface, fmt->altsetting); in snd_usb_audioformat_set_sync_ep()
338 if (fmt->ep_idx > 0 || altsd->bNumEndpoints < 2) in snd_usb_audioformat_set_sync_ep()
341 is_playback = !(get_endpoint(alts, 0)->bEndpointAddress & USB_DIR_IN); in snd_usb_audioformat_set_sync_ep()
342 attr = fmt->ep_attr & USB_ENDPOINT_SYNCTYPE; in snd_usb_audioformat_set_sync_ep()
348 sync_attr = get_endpoint(alts, 1)->bmAttributes; in snd_usb_audioformat_set_sync_ep()
352 * if we don't find a sync endpoint, as on M-Audio Transit. In case of in snd_usb_audioformat_set_sync_ep()
356 /* check sync-pipe endpoint */ in snd_usb_audioformat_set_sync_ep()
361 (get_endpoint(alts, 1)->bLength >= USB_DT_ENDPOINT_AUDIO_SIZE && in snd_usb_audioformat_set_sync_ep()
362 get_endpoint(alts, 1)->bSynchAddress != 0)) { in snd_usb_audioformat_set_sync_ep()
363 dev_err(&dev->dev, in snd_usb_audioformat_set_sync_ep()
365 fmt->iface, fmt->altsetting, in snd_usb_audioformat_set_sync_ep()
366 get_endpoint(alts, 1)->bmAttributes, in snd_usb_audioformat_set_sync_ep()
367 get_endpoint(alts, 1)->bLength, in snd_usb_audioformat_set_sync_ep()
368 get_endpoint(alts, 1)->bSynchAddress); in snd_usb_audioformat_set_sync_ep()
371 return -EINVAL; in snd_usb_audioformat_set_sync_ep()
373 ep = get_endpoint(alts, 1)->bEndpointAddress; in snd_usb_audioformat_set_sync_ep()
374 if (get_endpoint(alts, 0)->bLength >= USB_DT_ENDPOINT_AUDIO_SIZE && in snd_usb_audioformat_set_sync_ep()
375 get_endpoint(alts, 0)->bSynchAddress != 0 && in snd_usb_audioformat_set_sync_ep()
376 ((is_playback && ep != (unsigned int)(get_endpoint(alts, 0)->bSynchAddress | USB_DIR_IN)) || in snd_usb_audioformat_set_sync_ep()
377 (!is_playback && ep != (unsigned int)(get_endpoint(alts, 0)->bSynchAddress & ~USB_DIR_IN)))) { in snd_usb_audioformat_set_sync_ep()
378 dev_err(&dev->dev, in snd_usb_audioformat_set_sync_ep()
380 fmt->iface, fmt->altsetting, in snd_usb_audioformat_set_sync_ep()
381 is_playback, ep, get_endpoint(alts, 0)->bSynchAddress); in snd_usb_audioformat_set_sync_ep()
384 return -EINVAL; in snd_usb_audioformat_set_sync_ep()
387 fmt->sync_ep = ep; in snd_usb_audioformat_set_sync_ep()
388 fmt->sync_iface = altsd->bInterfaceNumber; in snd_usb_audioformat_set_sync_ep()
389 fmt->sync_altsetting = altsd->bAlternateSetting; in snd_usb_audioformat_set_sync_ep()
390 fmt->sync_ep_idx = 1; in snd_usb_audioformat_set_sync_ep()
392 fmt->implicit_fb = 1; in snd_usb_audioformat_set_sync_ep()
394 dev_dbg(&dev->dev, "%d:%d: found sync_ep=0x%x, iface=%d, alt=%d, implicit_fb=%d\n", in snd_usb_audioformat_set_sync_ep()
395 fmt->iface, fmt->altsetting, fmt->sync_ep, fmt->sync_iface, in snd_usb_audioformat_set_sync_ep()
396 fmt->sync_altsetting, fmt->implicit_fb); in snd_usb_audioformat_set_sync_ep()
405 if (!subs->str_pd) in snd_usb_pcm_change_state()
408 ret = snd_usb_power_domain_set(subs->stream->chip, subs->str_pd, state); in snd_usb_pcm_change_state()
410 dev_err(&subs->dev->dev, in snd_usb_pcm_change_state()
412 subs->str_pd->pd_id, state, ret); in snd_usb_pcm_change_state()
423 ret = snd_usb_pcm_change_state(&as->substream[0], UAC3_PD_STATE_D2); in snd_usb_pcm_suspend()
427 ret = snd_usb_pcm_change_state(&as->substream[1], UAC3_PD_STATE_D2); in snd_usb_pcm_suspend()
438 ret = snd_usb_pcm_change_state(&as->substream[0], UAC3_PD_STATE_D1); in snd_usb_pcm_resume()
442 ret = snd_usb_pcm_change_state(&as->substream[1], UAC3_PD_STATE_D1); in snd_usb_pcm_resume()
452 if (subs->data_endpoint) { in close_endpoints()
453 snd_usb_endpoint_set_sync(chip, subs->data_endpoint, NULL); in close_endpoints()
454 snd_usb_endpoint_close(chip, subs->data_endpoint); in close_endpoints()
455 subs->data_endpoint = NULL; in close_endpoints()
458 if (subs->sync_endpoint) { in close_endpoints()
459 snd_usb_endpoint_close(chip, subs->sync_endpoint); in close_endpoints()
460 subs->sync_endpoint = NULL; in close_endpoints()
477 struct snd_usb_substream *subs = substream->runtime->private_data; in snd_usb_hw_params()
478 struct snd_usb_audio *chip = subs->stream->chip; in snd_usb_hw_params()
495 ret = -EINVAL; in snd_usb_hw_params()
499 if (fmt->implicit_fb) { in snd_usb_hw_params()
502 !substream->stream, in snd_usb_hw_params()
507 fmt->sync_ep, fmt->sync_iface, in snd_usb_hw_params()
508 fmt->sync_altsetting, in snd_usb_hw_params()
511 ret = -EINVAL; in snd_usb_hw_params()
527 if (subs->data_endpoint) { in snd_usb_hw_params()
528 if (snd_usb_endpoint_compatible(chip, subs->data_endpoint, in snd_usb_hw_params()
536 subs->data_endpoint = snd_usb_endpoint_open(chip, fmt, hw_params, false, fixed_rate); in snd_usb_hw_params()
537 if (!subs->data_endpoint) { in snd_usb_hw_params()
538 ret = -EINVAL; in snd_usb_hw_params()
542 if (fmt->sync_ep) { in snd_usb_hw_params()
543 subs->sync_endpoint = snd_usb_endpoint_open(chip, sync_fmt, in snd_usb_hw_params()
547 if (!subs->sync_endpoint) { in snd_usb_hw_params()
548 ret = -EINVAL; in snd_usb_hw_params()
552 snd_usb_endpoint_set_sync(chip, subs->data_endpoint, in snd_usb_hw_params()
553 subs->sync_endpoint); in snd_usb_hw_params()
556 mutex_lock(&chip->mutex); in snd_usb_hw_params()
557 subs->cur_audiofmt = fmt; in snd_usb_hw_params()
558 mutex_unlock(&chip->mutex); in snd_usb_hw_params()
560 if (!subs->data_endpoint->need_setup) in snd_usb_hw_params()
563 if (subs->sync_endpoint) { in snd_usb_hw_params()
564 ret = snd_usb_endpoint_set_params(chip, subs->sync_endpoint); in snd_usb_hw_params()
569 ret = snd_usb_endpoint_set_params(chip, subs->data_endpoint); in snd_usb_hw_params()
590 struct snd_usb_substream *subs = substream->runtime->private_data; in snd_usb_hw_free()
591 struct snd_usb_audio *chip = subs->stream->chip; in snd_usb_hw_free()
594 mutex_lock(&chip->mutex); in snd_usb_hw_free()
595 subs->cur_audiofmt = NULL; in snd_usb_hw_free()
596 mutex_unlock(&chip->mutex); in snd_usb_hw_free()
607 /* free-wheeling mode? (e.g. dmix) */
610 return runtime->stop_threshold > runtime->buffer_size; in in_free_wheeling_mode()
617 struct snd_usb_audio *chip = subs->stream->chip; in lowlatency_playback_available()
619 if (subs->direction == SNDRV_PCM_STREAM_CAPTURE) in lowlatency_playback_available()
622 if (!chip->lowlatency) in lowlatency_playback_available()
627 if (snd_usb_endpoint_implicit_feedback_sink(subs->data_endpoint)) in lowlatency_playback_available()
639 struct snd_pcm_runtime *runtime = substream->runtime; in snd_usb_pcm_prepare()
640 struct snd_usb_substream *subs = runtime->private_data; in snd_usb_pcm_prepare()
641 struct snd_usb_audio *chip = subs->stream->chip; in snd_usb_pcm_prepare()
648 if (snd_BUG_ON(!subs->data_endpoint)) { in snd_usb_pcm_prepare()
649 ret = -EIO; in snd_usb_pcm_prepare()
658 if (subs->sync_endpoint) { in snd_usb_pcm_prepare()
659 ret = snd_usb_endpoint_prepare(chip, subs->sync_endpoint); in snd_usb_pcm_prepare()
664 ret = snd_usb_endpoint_prepare(chip, subs->data_endpoint); in snd_usb_pcm_prepare()
668 snd_usb_set_format_quirk(subs, subs->cur_audiofmt); in snd_usb_pcm_prepare()
672 subs->buffer_bytes = frames_to_bytes(runtime, runtime->buffer_size); in snd_usb_pcm_prepare()
673 subs->inflight_bytes = 0; in snd_usb_pcm_prepare()
674 subs->hwptr_done = 0; in snd_usb_pcm_prepare()
675 subs->transfer_done = 0; in snd_usb_pcm_prepare()
676 subs->last_frame_number = 0; in snd_usb_pcm_prepare()
677 subs->period_elapsed_pending = 0; in snd_usb_pcm_prepare()
678 runtime->delay = 0; in snd_usb_pcm_prepare()
680 subs->lowlatency_playback = lowlatency_playback_available(runtime, subs); in snd_usb_pcm_prepare()
681 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK && in snd_usb_pcm_prepare()
682 !subs->lowlatency_playback) { in snd_usb_pcm_prepare()
687 if (ret == -EPIPE && !retry++) { in snd_usb_pcm_prepare()
737 check_fmts.bits[0] = (u32)fp->formats; in hw_check_valid_format()
738 check_fmts.bits[1] = (u32)(fp->formats >> 32); in hw_check_valid_format()
741 hwc_debug(" > check: no supported format 0x%llx\n", fp->formats); in hw_check_valid_format()
745 if (fp->channels < ct->min || fp->channels > ct->max) { in hw_check_valid_format()
746 hwc_debug(" > check: no valid channels %d (%d/%d)\n", fp->channels, ct->min, ct->max); in hw_check_valid_format()
750 if (fp->rate_min > it->max || (fp->rate_min == it->max && it->openmax)) { in hw_check_valid_format()
751 hwc_debug(" > check: rate_min %d > max %d\n", fp->rate_min, it->max); in hw_check_valid_format()
754 if (fp->rate_max < it->min || (fp->rate_max == it->min && it->openmin)) { in hw_check_valid_format()
755 hwc_debug(" > check: rate_max %d < min %d\n", fp->rate_max, it->min); in hw_check_valid_format()
759 if (subs->speed != USB_SPEED_FULL) { in hw_check_valid_format()
760 ptime = 125 * (1 << fp->datainterval); in hw_check_valid_format()
761 if (ptime > pt->max || (ptime == pt->max && pt->openmax)) { in hw_check_valid_format()
762 hwc_debug(" > check: ptime %u > max %u\n", ptime, pt->max); in hw_check_valid_format()
775 hwc_debug(" --> get empty\n"); in apply_hw_params_minmax()
776 it->empty = 1; in apply_hw_params_minmax()
777 return -EINVAL; in apply_hw_params_minmax()
781 if (it->min < rmin) { in apply_hw_params_minmax()
782 it->min = rmin; in apply_hw_params_minmax()
783 it->openmin = 0; in apply_hw_params_minmax()
786 if (it->max > rmax) { in apply_hw_params_minmax()
787 it->max = rmax; in apply_hw_params_minmax()
788 it->openmax = 0; in apply_hw_params_minmax()
792 it->empty = 1; in apply_hw_params_minmax()
793 return -EINVAL; in apply_hw_params_minmax()
795 hwc_debug(" --> (%d, %d) (changed = %d)\n", it->min, it->max, changed); in apply_hw_params_minmax()
809 if (ep && ep->cur_audiofmt && (ep != ref_ep || ep->opened > 1)) in get_endpoint_in_use()
817 struct snd_usb_substream *subs = rule->private; in hw_rule_rate()
818 struct snd_usb_audio *chip = subs->stream->chip; in hw_rule_rate()
825 hwc_debug("hw_rule_rate: (%d,%d)\n", it->min, it->max); in hw_rule_rate()
828 list_for_each_entry(fp, &subs->fmt_list, list) { in hw_rule_rate()
832 ep = get_endpoint_in_use(chip, fp->endpoint, in hw_rule_rate()
833 subs->data_endpoint); in hw_rule_rate()
836 ep->cur_rate, fp->endpoint); in hw_rule_rate()
837 rmin = min(rmin, ep->cur_rate); in hw_rule_rate()
838 rmax = max(rmax, ep->cur_rate); in hw_rule_rate()
842 if (fp->implicit_fb) { in hw_rule_rate()
843 ep = get_endpoint_in_use(chip, fp->sync_ep, in hw_rule_rate()
844 subs->sync_endpoint); in hw_rule_rate()
847 ep->cur_rate, fp->sync_ep); in hw_rule_rate()
848 rmin = min(rmin, ep->cur_rate); in hw_rule_rate()
849 rmax = max(rmax, ep->cur_rate); in hw_rule_rate()
854 r = snd_usb_endpoint_get_clock_rate(chip, fp->clock); in hw_rule_rate()
859 rmax = max(rmax, r); in hw_rule_rate()
862 if (fp->rate_table && fp->nr_rates) { in hw_rule_rate()
863 for (i = 0; i < fp->nr_rates; i++) { in hw_rule_rate()
864 r = fp->rate_table[i]; in hw_rule_rate()
868 rmax = max(rmax, r); in hw_rule_rate()
871 rmin = min(rmin, fp->rate_min); in hw_rule_rate()
872 rmax = max(rmax, fp->rate_max); in hw_rule_rate()
883 struct snd_usb_substream *subs = rule->private; in hw_rule_channels()
888 hwc_debug("hw_rule_channels: (%d,%d)\n", it->min, it->max); in hw_rule_channels()
891 list_for_each_entry(fp, &subs->fmt_list, list) { in hw_rule_channels()
894 rmin = min(rmin, fp->channels); in hw_rule_channels()
895 rmax = max(rmax, fp->channels); in hw_rule_channels()
906 oldbits[0] = fmt->bits[0]; in apply_hw_params_format_bits()
907 oldbits[1] = fmt->bits[1]; in apply_hw_params_format_bits()
908 fmt->bits[0] &= (u32)fbits; in apply_hw_params_format_bits()
909 fmt->bits[1] &= (u32)(fbits >> 32); in apply_hw_params_format_bits()
910 if (!fmt->bits[0] && !fmt->bits[1]) { in apply_hw_params_format_bits()
911 hwc_debug(" --> get empty\n"); in apply_hw_params_format_bits()
912 return -EINVAL; in apply_hw_params_format_bits()
914 changed = (oldbits[0] != fmt->bits[0] || oldbits[1] != fmt->bits[1]); in apply_hw_params_format_bits()
915 hwc_debug(" --> %x:%x (changed = %d)\n", fmt->bits[0], fmt->bits[1], changed); in apply_hw_params_format_bits()
922 struct snd_usb_substream *subs = rule->private; in hw_rule_format()
923 struct snd_usb_audio *chip = subs->stream->chip; in hw_rule_format()
929 hwc_debug("hw_rule_format: %x:%x\n", fmt->bits[0], fmt->bits[1]); in hw_rule_format()
931 list_for_each_entry(fp, &subs->fmt_list, list) { in hw_rule_format()
935 ep = get_endpoint_in_use(chip, fp->endpoint, in hw_rule_format()
936 subs->data_endpoint); in hw_rule_format()
939 ep->cur_format, fp->endpoint); in hw_rule_format()
940 fbits |= pcm_format_to_bits(ep->cur_format); in hw_rule_format()
944 if (fp->implicit_fb) { in hw_rule_format()
945 ep = get_endpoint_in_use(chip, fp->sync_ep, in hw_rule_format()
946 subs->sync_endpoint); in hw_rule_format()
949 ep->cur_format, fp->sync_ep); in hw_rule_format()
950 fbits |= pcm_format_to_bits(ep->cur_format); in hw_rule_format()
955 fbits |= fp->formats; in hw_rule_format()
963 struct snd_usb_substream *subs = rule->private; in hw_rule_period_time()
970 hwc_debug("hw_rule_period_time: (%u,%u)\n", it->min, it->max); in hw_rule_period_time()
972 list_for_each_entry(fp, &subs->fmt_list, list) { in hw_rule_period_time()
975 min_datainterval = min(min_datainterval, fp->datainterval); in hw_rule_period_time()
978 hwc_debug(" --> get empty\n"); in hw_rule_period_time()
979 it->empty = 1; in hw_rule_period_time()
980 return -EINVAL; in hw_rule_period_time()
991 struct snd_usb_substream *subs = rule->private; in hw_rule_period_size_implicit_fb()
992 struct snd_usb_audio *chip = subs->stream->chip; in hw_rule_period_size_implicit_fb()
999 hwc_debug("hw_rule_period_size: (%u,%u)\n", it->min, it->max); in hw_rule_period_size_implicit_fb()
1002 list_for_each_entry(fp, &subs->fmt_list, list) { in hw_rule_period_size_implicit_fb()
1005 ep = get_endpoint_in_use(chip, fp->endpoint, in hw_rule_period_size_implicit_fb()
1006 subs->data_endpoint); in hw_rule_period_size_implicit_fb()
1009 ep->cur_period_frames, fp->endpoint); in hw_rule_period_size_implicit_fb()
1010 rmin = min(rmin, ep->cur_period_frames); in hw_rule_period_size_implicit_fb()
1011 rmax = max(rmax, ep->cur_period_frames); in hw_rule_period_size_implicit_fb()
1015 if (fp->implicit_fb) { in hw_rule_period_size_implicit_fb()
1016 ep = get_endpoint_in_use(chip, fp->sync_ep, in hw_rule_period_size_implicit_fb()
1017 subs->sync_endpoint); in hw_rule_period_size_implicit_fb()
1020 ep->cur_period_frames, fp->sync_ep); in hw_rule_period_size_implicit_fb()
1021 rmin = min(rmin, ep->cur_period_frames); in hw_rule_period_size_implicit_fb()
1022 rmax = max(rmax, ep->cur_period_frames); in hw_rule_period_size_implicit_fb()
1036 struct snd_usb_substream *subs = rule->private; in hw_rule_periods_implicit_fb()
1037 struct snd_usb_audio *chip = subs->stream->chip; in hw_rule_periods_implicit_fb()
1044 hwc_debug("hw_rule_periods: (%u,%u)\n", it->min, it->max); in hw_rule_periods_implicit_fb()
1047 list_for_each_entry(fp, &subs->fmt_list, list) { in hw_rule_periods_implicit_fb()
1050 ep = get_endpoint_in_use(chip, fp->endpoint, in hw_rule_periods_implicit_fb()
1051 subs->data_endpoint); in hw_rule_periods_implicit_fb()
1054 ep->cur_buffer_periods, fp->endpoint); in hw_rule_periods_implicit_fb()
1055 rmin = min(rmin, ep->cur_buffer_periods); in hw_rule_periods_implicit_fb()
1056 rmax = max(rmax, ep->cur_buffer_periods); in hw_rule_periods_implicit_fb()
1060 if (fp->implicit_fb) { in hw_rule_periods_implicit_fb()
1061 ep = get_endpoint_in_use(chip, fp->sync_ep, in hw_rule_periods_implicit_fb()
1062 subs->sync_endpoint); in hw_rule_periods_implicit_fb()
1065 ep->cur_buffer_periods, fp->sync_ep); in hw_rule_periods_implicit_fb()
1066 rmin = min(rmin, ep->cur_buffer_periods); in hw_rule_periods_implicit_fb()
1067 rmax = max(rmax, ep->cur_buffer_periods); in hw_rule_periods_implicit_fb()
1086 int param_period_time_if_needed = -1; in setup_hw_info()
1089 runtime->hw.formats = subs->formats; in setup_hw_info()
1091 runtime->hw.rate_min = 0x7fffffff; in setup_hw_info()
1092 runtime->hw.rate_max = 0; in setup_hw_info()
1093 runtime->hw.channels_min = 256; in setup_hw_info()
1094 runtime->hw.channels_max = 0; in setup_hw_info()
1095 runtime->hw.rates = 0; in setup_hw_info()
1097 /* check min/max rates and channels */ in setup_hw_info()
1098 list_for_each_entry(fp, &subs->fmt_list, list) { in setup_hw_info()
1099 runtime->hw.rates |= fp->rates; in setup_hw_info()
1100 if (runtime->hw.rate_min > fp->rate_min) in setup_hw_info()
1101 runtime->hw.rate_min = fp->rate_min; in setup_hw_info()
1102 if (runtime->hw.rate_max < fp->rate_max) in setup_hw_info()
1103 runtime->hw.rate_max = fp->rate_max; in setup_hw_info()
1104 if (runtime->hw.channels_min > fp->channels) in setup_hw_info()
1105 runtime->hw.channels_min = fp->channels; in setup_hw_info()
1106 if (runtime->hw.channels_max < fp->channels) in setup_hw_info()
1107 runtime->hw.channels_max = fp->channels; in setup_hw_info()
1108 if (fp->fmt_type == UAC_FORMAT_TYPE_II && fp->frame_size > 0) { in setup_hw_info()
1110 runtime->hw.period_bytes_min = runtime->hw.period_bytes_max = in setup_hw_info()
1111 fp->frame_size; in setup_hw_info()
1113 pt = 125 * (1 << fp->datainterval); in setup_hw_info()
1118 if (subs->speed == USB_SPEED_FULL) in setup_hw_info()
1123 param_period_time_if_needed = -1; in setup_hw_info()
1137 -1); in setup_hw_info()
1147 -1); in setup_hw_info()
1156 -1); in setup_hw_info()
1166 -1); in setup_hw_info()
1171 /* set max period and buffer sizes for 1 and 2 seconds, respectively */ in setup_hw_info()
1186 SNDRV_PCM_HW_PARAM_PERIOD_SIZE, -1); in setup_hw_info()
1191 SNDRV_PCM_HW_PARAM_PERIODS, -1); in setup_hw_info()
1195 list_for_each_entry(fp, &subs->fmt_list, list) { in setup_hw_info()
1196 if (fp->implicit_fb) { in setup_hw_info()
1197 runtime->hw.info |= SNDRV_PCM_INFO_JOINT_DUPLEX; in setup_hw_info()
1207 int direction = substream->stream; in snd_usb_pcm_open()
1209 struct snd_pcm_runtime *runtime = substream->runtime; in snd_usb_pcm_open()
1210 struct snd_usb_substream *subs = &as->substream[direction]; in snd_usb_pcm_open()
1213 runtime->hw = snd_usb_hardware; in snd_usb_pcm_open()
1214 /* need an explicit sync to catch applptr update in low-latency mode */ in snd_usb_pcm_open()
1216 as->chip->lowlatency) in snd_usb_pcm_open()
1217 runtime->hw.info |= SNDRV_PCM_INFO_SYNC_APPLPTR; in snd_usb_pcm_open()
1218 runtime->private_data = subs; in snd_usb_pcm_open()
1219 subs->pcm_substream = substream; in snd_usb_pcm_open()
1223 subs->dsd_dop.byte_idx = 0; in snd_usb_pcm_open()
1224 subs->dsd_dop.channel = 0; in snd_usb_pcm_open()
1225 subs->dsd_dop.marker = 1; in snd_usb_pcm_open()
1230 ret = snd_usb_autoresume(subs->stream->chip); in snd_usb_pcm_open()
1233 ret = snd_media_stream_init(subs, as->pcm, direction); in snd_usb_pcm_open()
1235 snd_usb_autosuspend(subs->stream->chip); in snd_usb_pcm_open()
1241 int direction = substream->stream; in snd_usb_pcm_close()
1243 struct snd_usb_substream *subs = &as->substream[direction]; in snd_usb_pcm_close()
1248 if (!snd_usb_lock_shutdown(subs->stream->chip)) { in snd_usb_pcm_close()
1250 snd_usb_unlock_shutdown(subs->stream->chip); in snd_usb_pcm_close()
1255 subs->pcm_substream = NULL; in snd_usb_pcm_close()
1256 snd_usb_autosuspend(subs->stream->chip); in snd_usb_pcm_close()
1269 struct snd_pcm_runtime *runtime = subs->pcm_substream->runtime; in retire_capture_urb()
1277 current_frame_number = usb_get_current_frame_number(subs->dev); in retire_capture_urb()
1279 stride = runtime->frame_bits >> 3; in retire_capture_urb()
1281 for (i = 0; i < urb->number_of_packets; i++) { in retire_capture_urb()
1282 cp = (unsigned char *)urb->transfer_buffer + urb->iso_frame_desc[i].offset + subs->pkt_offset_adj; in retire_capture_urb()
1283 if (urb->iso_frame_desc[i].status && printk_ratelimit()) { in retire_capture_urb()
1284 dev_dbg(&subs->dev->dev, "frame %d active: %d\n", in retire_capture_urb()
1285 i, urb->iso_frame_desc[i].status); in retire_capture_urb()
1288 bytes = urb->iso_frame_desc[i].actual_length; in retire_capture_urb()
1289 if (subs->stream_offset_adj > 0) { in retire_capture_urb()
1290 unsigned int adj = min(subs->stream_offset_adj, bytes); in retire_capture_urb() local
1291 cp += adj; in retire_capture_urb()
1292 bytes -= adj; in retire_capture_urb()
1293 subs->stream_offset_adj -= adj; in retire_capture_urb()
1296 if (!subs->txfr_quirk) in retire_capture_urb()
1298 if (bytes % (runtime->sample_bits >> 3) != 0) { in retire_capture_urb()
1301 dev_warn_ratelimited(&subs->dev->dev, in retire_capture_urb()
1302 "Corrected urb data len. %d->%d\n", in retire_capture_urb()
1306 spin_lock_irqsave(&subs->lock, flags); in retire_capture_urb()
1307 oldptr = subs->hwptr_done; in retire_capture_urb()
1308 subs->hwptr_done += bytes; in retire_capture_urb()
1309 if (subs->hwptr_done >= subs->buffer_bytes) in retire_capture_urb()
1310 subs->hwptr_done -= subs->buffer_bytes; in retire_capture_urb()
1312 subs->transfer_done += frames; in retire_capture_urb()
1313 if (subs->transfer_done >= runtime->period_size) { in retire_capture_urb()
1314 subs->transfer_done -= runtime->period_size; in retire_capture_urb()
1319 subs->last_frame_number = current_frame_number; in retire_capture_urb()
1321 spin_unlock_irqrestore(&subs->lock, flags); in retire_capture_urb()
1323 if (oldptr + bytes > subs->buffer_bytes) { in retire_capture_urb()
1324 unsigned int bytes1 = subs->buffer_bytes - oldptr; in retire_capture_urb()
1326 memcpy(runtime->dma_area + oldptr, cp, bytes1); in retire_capture_urb()
1327 memcpy(runtime->dma_area, cp + bytes1, bytes - bytes1); in retire_capture_urb()
1329 memcpy(runtime->dma_area + oldptr, cp, bytes); in retire_capture_urb()
1334 snd_pcm_period_elapsed(subs->pcm_substream); in retire_capture_urb()
1340 struct snd_urb_ctx *ctx = urb->context; in urb_ctx_queue_advance()
1342 ctx->queued += bytes; in urb_ctx_queue_advance()
1343 subs->inflight_bytes += bytes; in urb_ctx_queue_advance()
1344 subs->hwptr_done += bytes; in urb_ctx_queue_advance()
1345 if (subs->hwptr_done >= subs->buffer_bytes) in urb_ctx_queue_advance()
1346 subs->hwptr_done -= subs->buffer_bytes; in urb_ctx_queue_advance()
1352 struct snd_pcm_runtime *runtime = subs->pcm_substream->runtime; in fill_playback_urb_dsd_dop()
1354 unsigned int src_idx = subs->hwptr_done; in fill_playback_urb_dsd_dop()
1355 unsigned int wrap = subs->buffer_bytes; in fill_playback_urb_dsd_dop()
1356 u8 *dst = urb->transfer_buffer; in fill_playback_urb_dsd_dop()
1357 u8 *src = runtime->dma_area; in fill_playback_urb_dsd_dop()
1377 while (bytes--) { in fill_playback_urb_dsd_dop()
1378 if (++subs->dsd_dop.byte_idx == 3) { in fill_playback_urb_dsd_dop()
1380 dst[dst_idx++] = marker[subs->dsd_dop.marker]; in fill_playback_urb_dsd_dop()
1382 subs->dsd_dop.byte_idx = 0; in fill_playback_urb_dsd_dop()
1384 if (++subs->dsd_dop.channel % runtime->channels == 0) { in fill_playback_urb_dsd_dop()
1386 subs->dsd_dop.marker++; in fill_playback_urb_dsd_dop()
1387 subs->dsd_dop.marker %= ARRAY_SIZE(marker); in fill_playback_urb_dsd_dop()
1388 subs->dsd_dop.channel = 0; in fill_playback_urb_dsd_dop()
1392 int idx = (src_idx + subs->dsd_dop.byte_idx - 1) % wrap; in fill_playback_urb_dsd_dop()
1394 if (subs->cur_audiofmt->dsd_bitrev) in fill_playback_urb_dsd_dop()
1405 /* copy bit-reversed bytes onto transfer buffer */
1409 struct snd_pcm_runtime *runtime = subs->pcm_substream->runtime; in fill_playback_urb_dsd_bitrev()
1410 const u8 *src = runtime->dma_area; in fill_playback_urb_dsd_bitrev()
1411 u8 *buf = urb->transfer_buffer; in fill_playback_urb_dsd_bitrev()
1412 int i, ofs = subs->hwptr_done; in fill_playback_urb_dsd_bitrev()
1416 if (++ofs >= subs->buffer_bytes) in fill_playback_urb_dsd_bitrev()
1426 struct snd_pcm_runtime *runtime = subs->pcm_substream->runtime; in copy_to_urb()
1428 if (subs->hwptr_done + bytes > subs->buffer_bytes) { in copy_to_urb()
1430 unsigned int bytes1 = subs->buffer_bytes - subs->hwptr_done; in copy_to_urb()
1432 memcpy(urb->transfer_buffer + offset, in copy_to_urb()
1433 runtime->dma_area + subs->hwptr_done, bytes1); in copy_to_urb()
1434 memcpy(urb->transfer_buffer + offset + bytes1, in copy_to_urb()
1435 runtime->dma_area, bytes - bytes1); in copy_to_urb()
1437 memcpy(urb->transfer_buffer + offset, in copy_to_urb()
1438 runtime->dma_area + subs->hwptr_done, bytes); in copy_to_urb()
1452 for (i = 0; i < urb->number_of_packets; i++) { in copy_to_urb_quirk()
1453 unsigned int length = urb->iso_frame_desc[i].length; in copy_to_urb_quirk()
1454 unsigned int offset = urb->iso_frame_desc[i].offset; in copy_to_urb_quirk()
1458 urb->iso_frame_desc[i].offset = offset; in copy_to_urb_quirk()
1459 urb->iso_frame_desc[i].length += sizeof(packet_length); in copy_to_urb_quirk()
1460 memcpy(urb->transfer_buffer + offset, in copy_to_urb_quirk()
1466 bytes += urb->number_of_packets * sizeof(packet_length); in copy_to_urb_quirk()
1474 struct snd_pcm_runtime *runtime = subs->pcm_substream->runtime; in prepare_playback_urb()
1475 struct snd_usb_endpoint *ep = subs->data_endpoint; in prepare_playback_urb()
1476 struct snd_urb_ctx *ctx = urb->context; in prepare_playback_urb()
1484 stride = ep->stride; in prepare_playback_urb()
1487 ctx->queued = 0; in prepare_playback_urb()
1488 urb->number_of_packets = 0; in prepare_playback_urb()
1490 spin_lock_irqsave(&subs->lock, flags); in prepare_playback_urb()
1491 frame_limit = subs->frame_limit + ep->max_urb_frames; in prepare_playback_urb()
1492 transfer_done = subs->transfer_done; in prepare_playback_urb()
1494 if (subs->lowlatency_playback && in prepare_playback_urb()
1495 runtime->state != SNDRV_PCM_STATE_DRAINING) { in prepare_playback_urb()
1496 unsigned int hwptr = subs->hwptr_done / stride; in prepare_playback_urb()
1498 /* calculate the byte offset-in-buffer of the appl_ptr */ in prepare_playback_urb()
1499 avail = (runtime->control->appl_ptr - runtime->hw_ptr_base) in prepare_playback_urb()
1500 % runtime->buffer_size; in prepare_playback_urb()
1502 avail += runtime->buffer_size; in prepare_playback_urb()
1503 avail -= hwptr; in prepare_playback_urb()
1506 for (i = 0; i < ctx->packets; i++) { in prepare_playback_urb()
1511 urb->iso_frame_desc[i].offset = frames * stride; in prepare_playback_urb()
1512 urb->iso_frame_desc[i].length = counts * stride; in prepare_playback_urb()
1514 avail -= counts; in prepare_playback_urb()
1515 urb->number_of_packets++; in prepare_playback_urb()
1517 if (transfer_done >= runtime->period_size) { in prepare_playback_urb()
1518 transfer_done -= runtime->period_size; in prepare_playback_urb()
1521 if (subs->fmt_type == UAC_FORMAT_TYPE_II) { in prepare_playback_urb()
1523 /* FIXME: fill-max mode is not in prepare_playback_urb()
1525 frames -= transfer_done; in prepare_playback_urb()
1526 counts -= transfer_done; in prepare_playback_urb()
1527 urb->iso_frame_desc[i].length = in prepare_playback_urb()
1532 if (i < ctx->packets) { in prepare_playback_urb()
1534 urb->iso_frame_desc[i].offset = in prepare_playback_urb()
1536 urb->iso_frame_desc[i].length = 0; in prepare_playback_urb()
1537 urb->number_of_packets++; in prepare_playback_urb()
1549 err = -EAGAIN; in prepare_playback_urb()
1554 subs->transfer_done = transfer_done; in prepare_playback_urb()
1555 subs->frame_limit = frame_limit; in prepare_playback_urb()
1556 if (unlikely(ep->cur_format == SNDRV_PCM_FORMAT_DSD_U16_LE && in prepare_playback_urb()
1557 subs->cur_audiofmt->dsd_dop)) { in prepare_playback_urb()
1559 } else if (unlikely(ep->cur_format == SNDRV_PCM_FORMAT_DSD_U8 && in prepare_playback_urb()
1560 subs->cur_audiofmt->dsd_bitrev)) { in prepare_playback_urb()
1564 if (!subs->tx_length_quirk) in prepare_playback_urb()
1571 subs->last_frame_number = usb_get_current_frame_number(subs->dev); in prepare_playback_urb()
1573 if (subs->trigger_tstamp_pending_update) { in prepare_playback_urb()
1577 snd_pcm_gettime(runtime, &runtime->trigger_tstamp); in prepare_playback_urb()
1578 subs->trigger_tstamp_pending_update = false; in prepare_playback_urb()
1581 if (period_elapsed && !subs->running && subs->lowlatency_playback) { in prepare_playback_urb()
1582 subs->period_elapsed_pending = 1; in prepare_playback_urb()
1587 spin_unlock_irqrestore(&subs->lock, flags); in prepare_playback_urb()
1590 urb->transfer_buffer_length = bytes; in prepare_playback_urb()
1593 snd_pcm_period_elapsed_under_stream_lock(subs->pcm_substream); in prepare_playback_urb()
1595 snd_pcm_period_elapsed(subs->pcm_substream); in prepare_playback_urb()
1602 * - decrease the delay count again
1608 struct snd_urb_ctx *ctx = urb->context; in retire_playback_urb()
1611 spin_lock_irqsave(&subs->lock, flags); in retire_playback_urb()
1612 if (ctx->queued) { in retire_playback_urb()
1613 if (subs->inflight_bytes >= ctx->queued) in retire_playback_urb()
1614 subs->inflight_bytes -= ctx->queued; in retire_playback_urb()
1616 subs->inflight_bytes = 0; in retire_playback_urb()
1619 subs->last_frame_number = usb_get_current_frame_number(subs->dev); in retire_playback_urb()
1620 if (subs->running) { in retire_playback_urb()
1621 period_elapsed = subs->period_elapsed_pending; in retire_playback_urb()
1622 subs->period_elapsed_pending = 0; in retire_playback_urb()
1624 spin_unlock_irqrestore(&subs->lock, flags); in retire_playback_urb()
1626 snd_pcm_period_elapsed(subs->pcm_substream); in retire_playback_urb()
1630 * this plays a role only when the stream is running in low-latency mode.
1634 struct snd_usb_substream *subs = substream->runtime->private_data; in snd_usb_pcm_playback_ack()
1637 if (!subs->lowlatency_playback || !subs->running) in snd_usb_pcm_playback_ack()
1639 ep = subs->data_endpoint; in snd_usb_pcm_playback_ack()
1642 /* When no more in-flight URBs available, try to process the pending in snd_usb_pcm_playback_ack()
1645 if (!ep->active_mask) in snd_usb_pcm_playback_ack()
1653 struct snd_usb_substream *subs = substream->runtime->private_data; in snd_usb_substream_playback_trigger()
1658 subs->trigger_tstamp_pending_update = true; in snd_usb_substream_playback_trigger()
1661 snd_usb_endpoint_set_callback(subs->data_endpoint, in snd_usb_substream_playback_trigger()
1665 if (subs->lowlatency_playback && in snd_usb_substream_playback_trigger()
1667 if (in_free_wheeling_mode(substream->runtime)) in snd_usb_substream_playback_trigger()
1668 subs->lowlatency_playback = false; in snd_usb_substream_playback_trigger()
1671 snd_usb_endpoint_set_callback(subs->data_endpoint, in snd_usb_substream_playback_trigger()
1676 subs->running = 1; in snd_usb_substream_playback_trigger()
1677 dev_dbg(&subs->dev->dev, "%d:%d Start Playback PCM\n", in snd_usb_substream_playback_trigger()
1678 subs->cur_audiofmt->iface, in snd_usb_substream_playback_trigger()
1679 subs->cur_audiofmt->altsetting); in snd_usb_substream_playback_trigger()
1683 stop_endpoints(subs, substream->runtime->state == SNDRV_PCM_STATE_DRAINING); in snd_usb_substream_playback_trigger()
1684 snd_usb_endpoint_set_callback(subs->data_endpoint, in snd_usb_substream_playback_trigger()
1686 subs->running = 0; in snd_usb_substream_playback_trigger()
1687 dev_dbg(&subs->dev->dev, "%d:%d Stop Playback PCM\n", in snd_usb_substream_playback_trigger()
1688 subs->cur_audiofmt->iface, in snd_usb_substream_playback_trigger()
1689 subs->cur_audiofmt->altsetting); in snd_usb_substream_playback_trigger()
1693 snd_usb_endpoint_set_callback(subs->data_endpoint, in snd_usb_substream_playback_trigger()
1697 subs->running = 0; in snd_usb_substream_playback_trigger()
1698 dev_dbg(&subs->dev->dev, "%d:%d Pause Playback PCM\n", in snd_usb_substream_playback_trigger()
1699 subs->cur_audiofmt->iface, in snd_usb_substream_playback_trigger()
1700 subs->cur_audiofmt->altsetting); in snd_usb_substream_playback_trigger()
1704 return -EINVAL; in snd_usb_substream_playback_trigger()
1711 struct snd_usb_substream *subs = substream->runtime->private_data; in snd_usb_substream_capture_trigger()
1720 snd_usb_endpoint_set_callback(subs->data_endpoint, in snd_usb_substream_capture_trigger()
1723 subs->last_frame_number = usb_get_current_frame_number(subs->dev); in snd_usb_substream_capture_trigger()
1724 subs->running = 1; in snd_usb_substream_capture_trigger()
1725 dev_dbg(&subs->dev->dev, "%d:%d Start Capture PCM\n", in snd_usb_substream_capture_trigger()
1726 subs->cur_audiofmt->iface, in snd_usb_substream_capture_trigger()
1727 subs->cur_audiofmt->altsetting); in snd_usb_substream_capture_trigger()
1734 snd_usb_endpoint_set_callback(subs->data_endpoint, in snd_usb_substream_capture_trigger()
1736 subs->running = 0; in snd_usb_substream_capture_trigger()
1737 dev_dbg(&subs->dev->dev, "%d:%d Stop Capture PCM\n", in snd_usb_substream_capture_trigger()
1738 subs->cur_audiofmt->iface, in snd_usb_substream_capture_trigger()
1739 subs->cur_audiofmt->altsetting); in snd_usb_substream_capture_trigger()
1743 return -EINVAL; in snd_usb_substream_capture_trigger()
1780 struct snd_pcm *pcm = subs->stream->pcm; in snd_usb_preallocate_buffer()
1781 struct snd_pcm_substream *s = pcm->streams[subs->direction].substream; in snd_usb_preallocate_buffer()
1782 struct device *dev = subs->dev->bus->sysdev; in snd_usb_preallocate_buffer()