Lines Matching refs:ep

89 		usb_free_coherent(u->ep->chip->dev, u->buffer_size,  in release_urb_ctx()
121 static inline bool ep_state_running(struct snd_usb_endpoint *ep) in ep_state_running() argument
123 return atomic_read(&ep->state) == EP_STATE_RUNNING; in ep_state_running()
126 static inline bool ep_state_update(struct snd_usb_endpoint *ep, int old, int new) in ep_state_update() argument
128 return atomic_cmpxchg(&ep->state, old, new) == old; in ep_state_update()
139 int snd_usb_endpoint_implicit_feedback_sink(struct snd_usb_endpoint *ep) in snd_usb_endpoint_implicit_feedback_sink() argument
141 return ep->implicit_fb_sync && usb_pipeout(ep->pipe); in snd_usb_endpoint_implicit_feedback_sink()
151 static int slave_next_packet_size(struct snd_usb_endpoint *ep) in slave_next_packet_size() argument
156 if (ep->fill_max) in slave_next_packet_size()
157 return ep->maxframesize; in slave_next_packet_size()
159 spin_lock_irqsave(&ep->lock, flags); in slave_next_packet_size()
160 ep->phase = (ep->phase & 0xffff) in slave_next_packet_size()
161 + (ep->freqm << ep->datainterval); in slave_next_packet_size()
162 ret = min(ep->phase >> 16, ep->maxframesize); in slave_next_packet_size()
163 spin_unlock_irqrestore(&ep->lock, flags); in slave_next_packet_size()
172 static int next_packet_size(struct snd_usb_endpoint *ep) in next_packet_size() argument
176 if (ep->fill_max) in next_packet_size()
177 return ep->maxframesize; in next_packet_size()
179 ep->sample_accum += ep->sample_rem; in next_packet_size()
180 if (ep->sample_accum >= ep->pps) { in next_packet_size()
181 ep->sample_accum -= ep->pps; in next_packet_size()
182 ret = ep->packsize[1]; in next_packet_size()
184 ret = ep->packsize[0]; in next_packet_size()
194 int snd_usb_endpoint_next_packet_size(struct snd_usb_endpoint *ep, in snd_usb_endpoint_next_packet_size() argument
199 else if (ep->sync_source) in snd_usb_endpoint_next_packet_size()
200 return slave_next_packet_size(ep); in snd_usb_endpoint_next_packet_size()
202 return next_packet_size(ep); in snd_usb_endpoint_next_packet_size()
205 static void call_retire_callback(struct snd_usb_endpoint *ep, in call_retire_callback() argument
210 data_subs = READ_ONCE(ep->data_subs); in call_retire_callback()
211 if (data_subs && ep->retire_data_urb) in call_retire_callback()
212 ep->retire_data_urb(data_subs, urb); in call_retire_callback()
215 static void retire_outbound_urb(struct snd_usb_endpoint *ep, in retire_outbound_urb() argument
218 call_retire_callback(ep, urb_ctx->urb); in retire_outbound_urb()
221 static void snd_usb_handle_sync_urb(struct snd_usb_endpoint *ep,
225 static void retire_inbound_urb(struct snd_usb_endpoint *ep, in retire_inbound_urb() argument
231 if (unlikely(ep->skip_packets > 0)) { in retire_inbound_urb()
232 ep->skip_packets--; in retire_inbound_urb()
236 sync_sink = READ_ONCE(ep->sync_sink); in retire_inbound_urb()
238 snd_usb_handle_sync_urb(sync_sink, ep, urb); in retire_inbound_urb()
240 call_retire_callback(ep, urb); in retire_inbound_urb()
248 static void prepare_silent_urb(struct snd_usb_endpoint *ep, in prepare_silent_urb() argument
258 if (has_tx_length_quirk(ep->chip)) in prepare_silent_urb()
266 counts = snd_usb_endpoint_next_packet_size(ep, ctx, i); in prepare_silent_urb()
267 length = counts * ep->stride; /* number of silent bytes */ in prepare_silent_urb()
268 offset = offs * ep->stride + extra * i; in prepare_silent_urb()
277 ep->silence_value, length); in prepare_silent_urb()
282 urb->transfer_buffer_length = offs * ep->stride + ctx->packets * extra; in prepare_silent_urb()
289 static void prepare_outbound_urb(struct snd_usb_endpoint *ep, in prepare_outbound_urb() argument
296 urb->dev = ep->chip->dev; /* we need to set this at each time */ in prepare_outbound_urb()
298 switch (ep->type) { in prepare_outbound_urb()
300 data_subs = READ_ONCE(ep->data_subs); in prepare_outbound_urb()
301 if (data_subs && ep->prepare_data_urb) in prepare_outbound_urb()
302 ep->prepare_data_urb(data_subs, urb); in prepare_outbound_urb()
304 prepare_silent_urb(ep, ctx); in prepare_outbound_urb()
308 if (snd_usb_get_speed(ep->chip->dev) >= USB_SPEED_HIGH) { in prepare_outbound_urb()
315 cp[0] = ep->freqn; in prepare_outbound_urb()
316 cp[1] = ep->freqn >> 8; in prepare_outbound_urb()
317 cp[2] = ep->freqn >> 16; in prepare_outbound_urb()
318 cp[3] = ep->freqn >> 24; in prepare_outbound_urb()
326 cp[0] = ep->freqn >> 2; in prepare_outbound_urb()
327 cp[1] = ep->freqn >> 10; in prepare_outbound_urb()
328 cp[2] = ep->freqn >> 18; in prepare_outbound_urb()
338 static inline void prepare_inbound_urb(struct snd_usb_endpoint *ep, in prepare_inbound_urb() argument
344 urb->dev = ep->chip->dev; /* we need to set this at each time */ in prepare_inbound_urb()
346 switch (ep->type) { in prepare_inbound_urb()
351 urb->iso_frame_desc[i].length = ep->curpacksize; in prepare_inbound_urb()
352 offs += ep->curpacksize; in prepare_inbound_urb()
360 urb->iso_frame_desc[0].length = min(4u, ep->syncmaxsize); in prepare_inbound_urb()
367 static void notify_xrun(struct snd_usb_endpoint *ep) in notify_xrun() argument
371 data_subs = READ_ONCE(ep->data_subs); in notify_xrun()
377 next_packet_fifo_enqueue(struct snd_usb_endpoint *ep) in next_packet_fifo_enqueue() argument
381 p = ep->next_packet + (ep->next_packet_head + ep->next_packet_queued) % in next_packet_fifo_enqueue()
382 ARRAY_SIZE(ep->next_packet); in next_packet_fifo_enqueue()
383 ep->next_packet_queued++; in next_packet_fifo_enqueue()
388 next_packet_fifo_dequeue(struct snd_usb_endpoint *ep) in next_packet_fifo_dequeue() argument
392 p = ep->next_packet + ep->next_packet_head; in next_packet_fifo_dequeue()
393 ep->next_packet_head++; in next_packet_fifo_dequeue()
394 ep->next_packet_head %= ARRAY_SIZE(ep->next_packet); in next_packet_fifo_dequeue()
395 ep->next_packet_queued--; in next_packet_fifo_dequeue()
413 static void queue_pending_output_urbs(struct snd_usb_endpoint *ep) in queue_pending_output_urbs() argument
415 while (ep_state_running(ep)) { in queue_pending_output_urbs()
422 spin_lock_irqsave(&ep->lock, flags); in queue_pending_output_urbs()
423 if (ep->next_packet_queued > 0 && in queue_pending_output_urbs()
424 !list_empty(&ep->ready_playback_urbs)) { in queue_pending_output_urbs()
426 ctx = list_first_entry(&ep->ready_playback_urbs, in queue_pending_output_urbs()
430 packet = next_packet_fifo_dequeue(ep); in queue_pending_output_urbs()
432 spin_unlock_irqrestore(&ep->lock, flags); in queue_pending_output_urbs()
442 prepare_outbound_urb(ep, ctx); in queue_pending_output_urbs()
446 usb_audio_err(ep->chip, in queue_pending_output_urbs()
449 notify_xrun(ep); in queue_pending_output_urbs()
453 set_bit(ctx->index, &ep->active_mask); in queue_pending_output_urbs()
463 struct snd_usb_endpoint *ep = ctx->ep; in snd_complete_urb() local
473 if (unlikely(atomic_read(&ep->chip->shutdown))) in snd_complete_urb()
476 if (unlikely(!ep_state_running(ep))) in snd_complete_urb()
479 if (usb_pipeout(ep->pipe)) { in snd_complete_urb()
480 retire_outbound_urb(ep, ctx); in snd_complete_urb()
482 if (unlikely(!ep_state_running(ep))) in snd_complete_urb()
485 if (snd_usb_endpoint_implicit_feedback_sink(ep)) { in snd_complete_urb()
486 spin_lock_irqsave(&ep->lock, flags); in snd_complete_urb()
487 list_add_tail(&ctx->ready_list, &ep->ready_playback_urbs); in snd_complete_urb()
488 clear_bit(ctx->index, &ep->active_mask); in snd_complete_urb()
489 spin_unlock_irqrestore(&ep->lock, flags); in snd_complete_urb()
490 queue_pending_output_urbs(ep); in snd_complete_urb()
494 prepare_outbound_urb(ep, ctx); in snd_complete_urb()
496 if (unlikely(!ep_state_running(ep))) in snd_complete_urb()
499 retire_inbound_urb(ep, ctx); in snd_complete_urb()
501 if (unlikely(!ep_state_running(ep))) in snd_complete_urb()
504 prepare_inbound_urb(ep, ctx); in snd_complete_urb()
511 usb_audio_err(ep->chip, "cannot submit urb (err = %d)\n", err); in snd_complete_urb()
512 notify_xrun(ep); in snd_complete_urb()
515 clear_bit(ctx->index, &ep->active_mask); in snd_complete_urb()
547 struct snd_usb_endpoint *ep; in snd_usb_get_endpoint() local
549 list_for_each_entry(ep, &chip->ep_list, list) { in snd_usb_get_endpoint()
550 if (ep->ep_num == ep_num) in snd_usb_get_endpoint()
551 return ep; in snd_usb_get_endpoint()
580 struct snd_usb_endpoint *ep; in snd_usb_add_endpoint() local
583 ep = snd_usb_get_endpoint(chip, ep_num); in snd_usb_add_endpoint()
584 if (ep) in snd_usb_add_endpoint()
590 ep = kzalloc(sizeof(*ep), GFP_KERNEL); in snd_usb_add_endpoint()
591 if (!ep) in snd_usb_add_endpoint()
594 ep->chip = chip; in snd_usb_add_endpoint()
595 spin_lock_init(&ep->lock); in snd_usb_add_endpoint()
596 ep->type = type; in snd_usb_add_endpoint()
597 ep->ep_num = ep_num; in snd_usb_add_endpoint()
598 INIT_LIST_HEAD(&ep->ready_playback_urbs); in snd_usb_add_endpoint()
603 ep->pipe = usb_sndisocpipe(chip->dev, ep_num); in snd_usb_add_endpoint()
605 ep->pipe = usb_rcvisocpipe(chip->dev, ep_num); in snd_usb_add_endpoint()
607 list_add_tail(&ep->list, &chip->ep_list); in snd_usb_add_endpoint()
613 struct snd_usb_endpoint *ep) in endpoint_set_syncinterval() argument
618 alts = snd_usb_get_host_interface(chip, ep->iface, ep->altsetting); in endpoint_set_syncinterval()
622 desc = get_endpoint(alts, ep->ep_idx); in endpoint_set_syncinterval()
625 ep->syncinterval = desc->bRefresh; in endpoint_set_syncinterval()
627 ep->syncinterval = 1; in endpoint_set_syncinterval()
629 ep->syncinterval = desc->bInterval - 1; in endpoint_set_syncinterval()
631 ep->syncinterval = 3; in endpoint_set_syncinterval()
633 ep->syncmaxsize = le16_to_cpu(desc->wMaxPacketSize); in endpoint_set_syncinterval()
636 static bool endpoint_compatible(struct snd_usb_endpoint *ep, in endpoint_compatible() argument
640 if (!ep->opened) in endpoint_compatible()
642 if (ep->cur_audiofmt != fp) in endpoint_compatible()
644 if (ep->cur_rate != params_rate(params) || in endpoint_compatible()
645 ep->cur_format != params_format(params) || in endpoint_compatible()
646 ep->cur_period_frames != params_period_size(params) || in endpoint_compatible()
647 ep->cur_buffer_periods != params_periods(params)) in endpoint_compatible()
657 struct snd_usb_endpoint *ep, in snd_usb_endpoint_compatible() argument
664 ret = endpoint_compatible(ep, fp, params); in snd_usb_endpoint_compatible()
687 struct snd_usb_endpoint *ep; in snd_usb_endpoint_open() local
691 ep = snd_usb_get_endpoint(chip, ep_num); in snd_usb_endpoint_open()
692 if (!ep) { in snd_usb_endpoint_open()
697 if (!ep->opened) { in snd_usb_endpoint_open()
699 ep->iface = fp->sync_iface; in snd_usb_endpoint_open()
700 ep->altsetting = fp->sync_altsetting; in snd_usb_endpoint_open()
701 ep->ep_idx = fp->sync_ep_idx; in snd_usb_endpoint_open()
703 ep->iface = fp->iface; in snd_usb_endpoint_open()
704 ep->altsetting = fp->altsetting; in snd_usb_endpoint_open()
705 ep->ep_idx = fp->ep_idx; in snd_usb_endpoint_open()
708 ep_num, ep->iface, ep->altsetting, ep->ep_idx); in snd_usb_endpoint_open()
710 ep->iface_ref = iface_ref_find(chip, ep->iface); in snd_usb_endpoint_open()
711 if (!ep->iface_ref) { in snd_usb_endpoint_open()
712 ep = NULL; in snd_usb_endpoint_open()
716 ep->cur_audiofmt = fp; in snd_usb_endpoint_open()
717 ep->cur_channels = fp->channels; in snd_usb_endpoint_open()
718 ep->cur_rate = params_rate(params); in snd_usb_endpoint_open()
719 ep->cur_format = params_format(params); in snd_usb_endpoint_open()
720 ep->cur_frame_bytes = snd_pcm_format_physical_width(ep->cur_format) * in snd_usb_endpoint_open()
721 ep->cur_channels / 8; in snd_usb_endpoint_open()
722 ep->cur_period_frames = params_period_size(params); in snd_usb_endpoint_open()
723 ep->cur_period_bytes = ep->cur_period_frames * ep->cur_frame_bytes; in snd_usb_endpoint_open()
724 ep->cur_buffer_periods = params_periods(params); in snd_usb_endpoint_open()
726 if (ep->type == SND_USB_ENDPOINT_TYPE_SYNC) in snd_usb_endpoint_open()
727 endpoint_set_syncinterval(chip, ep); in snd_usb_endpoint_open()
729 ep->implicit_fb_sync = fp->implicit_fb; in snd_usb_endpoint_open()
730 ep->need_setup = true; in snd_usb_endpoint_open()
733 ep->cur_channels, ep->cur_rate, in snd_usb_endpoint_open()
734 snd_pcm_format_name(ep->cur_format), in snd_usb_endpoint_open()
735 ep->cur_period_bytes, ep->cur_buffer_periods, in snd_usb_endpoint_open()
736 ep->implicit_fb_sync); in snd_usb_endpoint_open()
739 if (WARN_ON(!ep->iface_ref)) { in snd_usb_endpoint_open()
740 ep = NULL; in snd_usb_endpoint_open()
744 if (!endpoint_compatible(ep, fp, params)) { in snd_usb_endpoint_open()
747 ep = NULL; in snd_usb_endpoint_open()
752 ep_num, ep->opened); in snd_usb_endpoint_open()
755 if (!ep->iface_ref->opened++) in snd_usb_endpoint_open()
756 ep->iface_ref->need_setup = true; in snd_usb_endpoint_open()
758 ep->opened++; in snd_usb_endpoint_open()
762 return ep; in snd_usb_endpoint_open()
783 void snd_usb_endpoint_set_callback(struct snd_usb_endpoint *ep, in snd_usb_endpoint_set_callback() argument
790 ep->prepare_data_urb = prepare; in snd_usb_endpoint_set_callback()
791 ep->retire_data_urb = retire; in snd_usb_endpoint_set_callback()
792 WRITE_ONCE(ep->data_subs, data_subs); in snd_usb_endpoint_set_callback()
796 struct snd_usb_endpoint *ep, in endpoint_set_interface() argument
799 int altset = set ? ep->altsetting : 0; in endpoint_set_interface()
803 ep->iface, altset, ep->ep_num); in endpoint_set_interface()
804 err = usb_set_interface(chip->dev, ep->iface, altset); in endpoint_set_interface()
807 ep->iface, altset, err); in endpoint_set_interface()
822 struct snd_usb_endpoint *ep) in snd_usb_endpoint_close() argument
826 ep->ep_num, ep->opened); in snd_usb_endpoint_close()
828 if (!--ep->iface_ref->opened) in snd_usb_endpoint_close()
829 endpoint_set_interface(chip, ep, false); in snd_usb_endpoint_close()
831 if (!--ep->opened) { in snd_usb_endpoint_close()
832 ep->iface = 0; in snd_usb_endpoint_close()
833 ep->altsetting = 0; in snd_usb_endpoint_close()
834 ep->cur_audiofmt = NULL; in snd_usb_endpoint_close()
835 ep->cur_rate = 0; in snd_usb_endpoint_close()
836 ep->iface_ref = NULL; in snd_usb_endpoint_close()
837 usb_audio_dbg(chip, "EP 0x%x closed\n", ep->ep_num); in snd_usb_endpoint_close()
843 void snd_usb_endpoint_suspend(struct snd_usb_endpoint *ep) in snd_usb_endpoint_suspend() argument
845 ep->need_setup = true; in snd_usb_endpoint_suspend()
846 if (ep->iface_ref) in snd_usb_endpoint_suspend()
847 ep->iface_ref->need_setup = true; in snd_usb_endpoint_suspend()
853 static int wait_clear_urbs(struct snd_usb_endpoint *ep) in wait_clear_urbs() argument
858 if (atomic_read(&ep->state) != EP_STATE_STOPPING) in wait_clear_urbs()
862 alive = bitmap_weight(&ep->active_mask, ep->nurbs); in wait_clear_urbs()
870 usb_audio_err(ep->chip, in wait_clear_urbs()
872 alive, ep->ep_num); in wait_clear_urbs()
874 if (ep_state_update(ep, EP_STATE_STOPPING, EP_STATE_STOPPED)) { in wait_clear_urbs()
875 ep->sync_sink = NULL; in wait_clear_urbs()
876 snd_usb_endpoint_set_callback(ep, NULL, NULL, NULL); in wait_clear_urbs()
885 void snd_usb_endpoint_sync_pending_stop(struct snd_usb_endpoint *ep) in snd_usb_endpoint_sync_pending_stop() argument
887 if (ep) in snd_usb_endpoint_sync_pending_stop()
888 wait_clear_urbs(ep); in snd_usb_endpoint_sync_pending_stop()
896 static int stop_urbs(struct snd_usb_endpoint *ep, bool force) in stop_urbs() argument
900 if (!force && atomic_read(&ep->running)) in stop_urbs()
903 if (!ep_state_update(ep, EP_STATE_RUNNING, EP_STATE_STOPPING)) in stop_urbs()
906 INIT_LIST_HEAD(&ep->ready_playback_urbs); in stop_urbs()
907 ep->next_packet_head = 0; in stop_urbs()
908 ep->next_packet_queued = 0; in stop_urbs()
910 for (i = 0; i < ep->nurbs; i++) { in stop_urbs()
911 if (test_bit(i, &ep->active_mask)) { in stop_urbs()
912 if (!test_and_set_bit(i, &ep->unlink_mask)) { in stop_urbs()
913 struct urb *u = ep->urb[i].urb; in stop_urbs()
925 static int release_urbs(struct snd_usb_endpoint *ep, bool force) in release_urbs() argument
930 snd_usb_endpoint_set_callback(ep, NULL, NULL, NULL); in release_urbs()
933 err = stop_urbs(ep, force); in release_urbs()
937 wait_clear_urbs(ep); in release_urbs()
939 for (i = 0; i < ep->nurbs; i++) in release_urbs()
940 release_urb_ctx(&ep->urb[i]); in release_urbs()
942 usb_free_coherent(ep->chip->dev, SYNC_URBS * 4, in release_urbs()
943 ep->syncbuf, ep->sync_dma); in release_urbs()
945 ep->syncbuf = NULL; in release_urbs()
946 ep->nurbs = 0; in release_urbs()
953 static int data_ep_set_params(struct snd_usb_endpoint *ep) in data_ep_set_params() argument
955 struct snd_usb_audio *chip = ep->chip; in data_ep_set_params()
959 const struct audioformat *fmt = ep->cur_audiofmt; in data_ep_set_params()
960 int frame_bits = ep->cur_frame_bytes * 8; in data_ep_set_params()
962 usb_pipeout(ep->pipe)); in data_ep_set_params()
965 ep->ep_num, ep->pipe); in data_ep_set_params()
967 if (ep->cur_format == SNDRV_PCM_FORMAT_DSD_U16_LE && fmt->dsd_dop) { in data_ep_set_params()
973 frame_bits += ep->cur_channels << 3; in data_ep_set_params()
976 ep->datainterval = fmt->datainterval; in data_ep_set_params()
977 ep->stride = frame_bits >> 3; in data_ep_set_params()
979 switch (ep->cur_format) { in data_ep_set_params()
981 ep->silence_value = 0x80; in data_ep_set_params()
988 ep->silence_value = 0x69; in data_ep_set_params()
991 ep->silence_value = 0; in data_ep_set_params()
995 ep->freqmax = ep->freqn + (ep->freqn >> 1); in data_ep_set_params()
1011 maxsize = (((ep->freqmax << ep->datainterval) + 0xffff) >> 16) * in data_ep_set_params()
1016 if (ep->maxpacksize && ep->maxpacksize < maxsize) { in data_ep_set_params()
1018 unsigned int data_maxsize = maxsize = ep->maxpacksize; in data_ep_set_params()
1023 ep->freqmax = (data_maxsize / (frame_bits >> 3)) in data_ep_set_params()
1024 << (16 - ep->datainterval); in data_ep_set_params()
1027 if (ep->fill_max) in data_ep_set_params()
1028 ep->curpacksize = ep->maxpacksize; in data_ep_set_params()
1030 ep->curpacksize = maxsize; in data_ep_set_params()
1033 packs_per_ms = 8 >> ep->datainterval; in data_ep_set_params()
1039 if (ep->sync_source && !ep->implicit_fb_sync) in data_ep_set_params()
1041 1U << ep->sync_source->syncinterval); in data_ep_set_params()
1042 max_packs_per_urb = max(1u, max_packs_per_urb >> ep->datainterval); in data_ep_set_params()
1052 if (usb_pipein(ep->pipe) || ep->implicit_fb_sync) { in data_ep_set_params()
1062 int interval = ep->datainterval; in data_ep_set_params()
1070 while (urb_packs > 1 && urb_packs * maxsize >= ep->cur_period_bytes) in data_ep_set_params()
1072 ep->nurbs = MAX_URBS; in data_ep_set_params()
1082 minsize = (ep->freqn >> (16 - ep->datainterval)) * in data_ep_set_params()
1085 if (ep->sync_source) in data_ep_set_params()
1090 max_packs_per_period = DIV_ROUND_UP(ep->cur_period_bytes, minsize); in data_ep_set_params()
1099 ep->max_urb_frames = DIV_ROUND_UP(ep->cur_period_frames, in data_ep_set_params()
1105 ep->nurbs = min(max_urbs, urbs_per_period * ep->cur_buffer_periods); in data_ep_set_params()
1109 for (i = 0; i < ep->nurbs; i++) { in data_ep_set_params()
1110 struct snd_urb_ctx *u = &ep->urb[i]; in data_ep_set_params()
1112 u->ep = ep; in data_ep_set_params()
1127 u->urb->pipe = ep->pipe; in data_ep_set_params()
1129 u->urb->interval = 1 << ep->datainterval; in data_ep_set_params()
1138 ep->nominal_queue_size = maxsize * urb_packs * (ep->nurbs + 1); in data_ep_set_params()
1142 release_urbs(ep, false); in data_ep_set_params()
1149 static int sync_ep_set_params(struct snd_usb_endpoint *ep) in sync_ep_set_params() argument
1151 struct snd_usb_audio *chip = ep->chip; in sync_ep_set_params()
1155 ep->ep_num, ep->pipe); in sync_ep_set_params()
1157 ep->syncbuf = usb_alloc_coherent(chip->dev, SYNC_URBS * 4, in sync_ep_set_params()
1158 GFP_KERNEL, &ep->sync_dma); in sync_ep_set_params()
1159 if (!ep->syncbuf) in sync_ep_set_params()
1163 struct snd_urb_ctx *u = &ep->urb[i]; in sync_ep_set_params()
1165 u->ep = ep; in sync_ep_set_params()
1170 u->urb->transfer_buffer = ep->syncbuf + i * 4; in sync_ep_set_params()
1171 u->urb->transfer_dma = ep->sync_dma + i * 4; in sync_ep_set_params()
1173 u->urb->pipe = ep->pipe; in sync_ep_set_params()
1176 u->urb->interval = 1 << ep->syncinterval; in sync_ep_set_params()
1181 ep->nurbs = SYNC_URBS; in sync_ep_set_params()
1186 release_urbs(ep, false); in sync_ep_set_params()
1198 struct snd_usb_endpoint *ep) in snd_usb_endpoint_set_params() argument
1200 const struct audioformat *fmt = ep->cur_audiofmt; in snd_usb_endpoint_set_params()
1204 err = release_urbs(ep, false); in snd_usb_endpoint_set_params()
1208 ep->datainterval = fmt->datainterval; in snd_usb_endpoint_set_params()
1209 ep->maxpacksize = fmt->maxpacksize; in snd_usb_endpoint_set_params()
1210 ep->fill_max = !!(fmt->attributes & UAC_EP_CS_ATTR_FILL_MAX); in snd_usb_endpoint_set_params()
1213 ep->freqn = get_usb_full_speed_rate(ep->cur_rate); in snd_usb_endpoint_set_params()
1214 ep->pps = 1000 >> ep->datainterval; in snd_usb_endpoint_set_params()
1216 ep->freqn = get_usb_high_speed_rate(ep->cur_rate); in snd_usb_endpoint_set_params()
1217 ep->pps = 8000 >> ep->datainterval; in snd_usb_endpoint_set_params()
1220 ep->sample_rem = ep->cur_rate % ep->pps; in snd_usb_endpoint_set_params()
1221 ep->packsize[0] = ep->cur_rate / ep->pps; in snd_usb_endpoint_set_params()
1222 ep->packsize[1] = (ep->cur_rate + (ep->pps - 1)) / ep->pps; in snd_usb_endpoint_set_params()
1225 ep->freqm = ep->freqn; in snd_usb_endpoint_set_params()
1226 ep->freqshift = INT_MIN; in snd_usb_endpoint_set_params()
1228 ep->phase = 0; in snd_usb_endpoint_set_params()
1230 switch (ep->type) { in snd_usb_endpoint_set_params()
1232 err = data_ep_set_params(ep); in snd_usb_endpoint_set_params()
1235 err = sync_ep_set_params(ep); in snd_usb_endpoint_set_params()
1241 usb_audio_dbg(chip, "Set up %d URBS, ret=%d\n", ep->nurbs, err); in snd_usb_endpoint_set_params()
1247 ep->maxframesize = ep->maxpacksize / ep->cur_frame_bytes; in snd_usb_endpoint_set_params()
1248 ep->curframesize = ep->curpacksize / ep->cur_frame_bytes; in snd_usb_endpoint_set_params()
1265 struct snd_usb_endpoint *ep) in snd_usb_endpoint_configure() argument
1271 if (WARN_ON(!ep->iface_ref)) in snd_usb_endpoint_configure()
1273 if (!ep->need_setup) in snd_usb_endpoint_configure()
1277 if (!ep->iface_ref->need_setup) { in snd_usb_endpoint_configure()
1281 if (ep->cur_audiofmt->protocol == UAC_VERSION_1) { in snd_usb_endpoint_configure()
1282 err = snd_usb_init_sample_rate(chip, ep->cur_audiofmt, in snd_usb_endpoint_configure()
1283 ep->cur_rate); in snd_usb_endpoint_configure()
1287 err = snd_usb_endpoint_set_params(chip, ep); in snd_usb_endpoint_configure()
1294 endpoint_set_interface(chip, ep, false); in snd_usb_endpoint_configure()
1299 iface_first = ep->cur_audiofmt->protocol == UAC_VERSION_1; in snd_usb_endpoint_configure()
1304 err = endpoint_set_interface(chip, ep, true); in snd_usb_endpoint_configure()
1309 err = snd_usb_init_pitch(chip, ep->cur_audiofmt); in snd_usb_endpoint_configure()
1313 err = snd_usb_init_sample_rate(chip, ep->cur_audiofmt, ep->cur_rate); in snd_usb_endpoint_configure()
1317 err = snd_usb_endpoint_set_params(chip, ep); in snd_usb_endpoint_configure()
1321 err = snd_usb_select_mode_quirk(chip, ep->cur_audiofmt); in snd_usb_endpoint_configure()
1327 err = endpoint_set_interface(chip, ep, true); in snd_usb_endpoint_configure()
1332 ep->iface_ref->need_setup = false; in snd_usb_endpoint_configure()
1335 ep->need_setup = false; in snd_usb_endpoint_configure()
1356 int snd_usb_endpoint_start(struct snd_usb_endpoint *ep) in snd_usb_endpoint_start() argument
1361 if (atomic_read(&ep->chip->shutdown)) in snd_usb_endpoint_start()
1364 if (ep->sync_source) in snd_usb_endpoint_start()
1365 WRITE_ONCE(ep->sync_source->sync_sink, ep); in snd_usb_endpoint_start()
1367 usb_audio_dbg(ep->chip, "Starting %s EP 0x%x (running %d)\n", in snd_usb_endpoint_start()
1368 ep_type_name(ep->type), ep->ep_num, in snd_usb_endpoint_start()
1369 atomic_read(&ep->running)); in snd_usb_endpoint_start()
1372 if (atomic_inc_return(&ep->running) != 1) in snd_usb_endpoint_start()
1375 ep->active_mask = 0; in snd_usb_endpoint_start()
1376 ep->unlink_mask = 0; in snd_usb_endpoint_start()
1377 ep->phase = 0; in snd_usb_endpoint_start()
1378 ep->sample_accum = 0; in snd_usb_endpoint_start()
1380 snd_usb_endpoint_start_quirk(ep); in snd_usb_endpoint_start()
1389 if (!ep_state_update(ep, EP_STATE_STOPPED, EP_STATE_RUNNING)) in snd_usb_endpoint_start()
1392 if (snd_usb_endpoint_implicit_feedback_sink(ep) && in snd_usb_endpoint_start()
1393 !(ep->chip->quirk_flags & QUIRK_FLAG_PLAYBACK_FIRST)) { in snd_usb_endpoint_start()
1394 for (i = 0; i < ep->nurbs; i++) { in snd_usb_endpoint_start()
1395 struct snd_urb_ctx *ctx = ep->urb + i; in snd_usb_endpoint_start()
1396 list_add_tail(&ctx->ready_list, &ep->ready_playback_urbs); in snd_usb_endpoint_start()
1399 usb_audio_dbg(ep->chip, "No URB submission due to implicit fb sync\n"); in snd_usb_endpoint_start()
1403 for (i = 0; i < ep->nurbs; i++) { in snd_usb_endpoint_start()
1404 struct urb *urb = ep->urb[i].urb; in snd_usb_endpoint_start()
1409 if (usb_pipeout(ep->pipe)) { in snd_usb_endpoint_start()
1410 prepare_outbound_urb(ep, urb->context); in snd_usb_endpoint_start()
1412 prepare_inbound_urb(ep, urb->context); in snd_usb_endpoint_start()
1417 usb_audio_err(ep->chip, in snd_usb_endpoint_start()
1422 set_bit(i, &ep->active_mask); in snd_usb_endpoint_start()
1425 usb_audio_dbg(ep->chip, "%d URBs submitted for EP 0x%x\n", in snd_usb_endpoint_start()
1426 ep->nurbs, ep->ep_num); in snd_usb_endpoint_start()
1430 snd_usb_endpoint_stop(ep); in snd_usb_endpoint_start()
1448 void snd_usb_endpoint_stop(struct snd_usb_endpoint *ep) in snd_usb_endpoint_stop() argument
1450 if (!ep) in snd_usb_endpoint_stop()
1453 usb_audio_dbg(ep->chip, "Stopping %s EP 0x%x (running %d)\n", in snd_usb_endpoint_stop()
1454 ep_type_name(ep->type), ep->ep_num, in snd_usb_endpoint_stop()
1455 atomic_read(&ep->running)); in snd_usb_endpoint_stop()
1457 if (snd_BUG_ON(!atomic_read(&ep->running))) in snd_usb_endpoint_stop()
1460 if (!atomic_dec_return(&ep->running)) { in snd_usb_endpoint_stop()
1461 if (ep->sync_source) in snd_usb_endpoint_stop()
1462 WRITE_ONCE(ep->sync_source->sync_sink, NULL); in snd_usb_endpoint_stop()
1463 stop_urbs(ep, false); in snd_usb_endpoint_stop()
1475 void snd_usb_endpoint_release(struct snd_usb_endpoint *ep) in snd_usb_endpoint_release() argument
1477 release_urbs(ep, true); in snd_usb_endpoint_release()
1488 struct snd_usb_endpoint *ep, *en; in snd_usb_endpoint_free_all() local
1491 list_for_each_entry_safe(ep, en, &chip->ep_list, list) in snd_usb_endpoint_free_all()
1492 kfree(ep); in snd_usb_endpoint_free_all()
1508 static void snd_usb_handle_sync_urb(struct snd_usb_endpoint *ep, in snd_usb_handle_sync_urb() argument
1516 snd_BUG_ON(ep == sender); in snd_usb_handle_sync_urb()
1524 if (snd_usb_endpoint_implicit_feedback_sink(ep) && in snd_usb_handle_sync_urb()
1525 atomic_read(&ep->running)) { in snd_usb_handle_sync_urb()
1546 spin_lock_irqsave(&ep->lock, flags); in snd_usb_handle_sync_urb()
1547 if (ep->next_packet_queued >= ARRAY_SIZE(ep->next_packet)) { in snd_usb_handle_sync_urb()
1548 spin_unlock_irqrestore(&ep->lock, flags); in snd_usb_handle_sync_urb()
1549 usb_audio_err(ep->chip, in snd_usb_handle_sync_urb()
1551 ep->ep_num); in snd_usb_handle_sync_urb()
1552 notify_xrun(ep); in snd_usb_handle_sync_urb()
1556 out_packet = next_packet_fifo_enqueue(ep); in snd_usb_handle_sync_urb()
1577 spin_unlock_irqrestore(&ep->lock, flags); in snd_usb_handle_sync_urb()
1578 queue_pending_output_urbs(ep); in snd_usb_handle_sync_urb()
1617 if (f < ep->freqn - 0x8000) in snd_usb_handle_sync_urb()
1619 else if (f > ep->freqn + 0x8000) in snd_usb_handle_sync_urb()
1621 } else if (unlikely(ep->freqshift == INT_MIN)) { in snd_usb_handle_sync_urb()
1629 while (f < ep->freqn - ep->freqn / 4) { in snd_usb_handle_sync_urb()
1633 while (f > ep->freqn + ep->freqn / 2) { in snd_usb_handle_sync_urb()
1637 ep->freqshift = shift; in snd_usb_handle_sync_urb()
1638 } else if (ep->freqshift >= 0) in snd_usb_handle_sync_urb()
1639 f <<= ep->freqshift; in snd_usb_handle_sync_urb()
1641 f >>= -ep->freqshift; in snd_usb_handle_sync_urb()
1643 if (likely(f >= ep->freqn - ep->freqn / 8 && f <= ep->freqmax)) { in snd_usb_handle_sync_urb()
1648 spin_lock_irqsave(&ep->lock, flags); in snd_usb_handle_sync_urb()
1649 ep->freqm = f; in snd_usb_handle_sync_urb()
1650 spin_unlock_irqrestore(&ep->lock, flags); in snd_usb_handle_sync_urb()
1656 ep->freqshift = INT_MIN; in snd_usb_handle_sync_urb()