Lines Matching refs:bebob
65 snd_bebob_stream_get_rate(struct snd_bebob *bebob, unsigned int *curr_rate) in snd_bebob_stream_get_rate() argument
72 err = avc_general_get_sig_fmt(bebob->unit, &tx_rate, in snd_bebob_stream_get_rate()
80 err = avc_general_get_sig_fmt(bebob->unit, &rx_rate, in snd_bebob_stream_get_rate()
91 err = avc_general_set_sig_fmt(bebob->unit, rx_rate, in snd_bebob_stream_get_rate()
98 snd_bebob_stream_set_rate(struct snd_bebob *bebob, unsigned int rate) in snd_bebob_stream_set_rate() argument
102 err = avc_general_set_sig_fmt(bebob->unit, rate, in snd_bebob_stream_set_rate()
107 err = avc_general_set_sig_fmt(bebob->unit, rate, in snd_bebob_stream_set_rate()
122 snd_bebob_stream_check_internal_clock(struct snd_bebob *bebob, bool *internal) in snd_bebob_stream_check_internal_clock() argument
124 struct snd_bebob_clock_spec *clk_spec = bebob->spec->clock; in snd_bebob_stream_check_internal_clock()
133 err = clk_spec->get(bebob, &id); in snd_bebob_stream_check_internal_clock()
135 dev_err(&bebob->unit->device, in snd_bebob_stream_check_internal_clock()
141 dev_err(&bebob->unit->device, in snd_bebob_stream_check_internal_clock()
159 if (bebob->sync_input_plug < 0) { in snd_bebob_stream_check_internal_clock()
169 bebob->sync_input_plug); in snd_bebob_stream_check_internal_clock()
170 err = avc_bridgeco_get_plug_input(bebob->unit, addr, input); in snd_bebob_stream_check_internal_clock()
172 dev_err(&bebob->unit->device, in snd_bebob_stream_check_internal_clock()
174 bebob->sync_input_plug, err); in snd_bebob_stream_check_internal_clock()
200 map_data_channels(struct snd_bebob *bebob, struct amdtp_stream *s) in map_data_channels() argument
217 if (s == &bebob->tx_stream) in map_data_channels()
223 err = avc_bridgeco_get_plug_ch_pos(bebob->unit, addr, buf, 256); in map_data_channels()
225 dev_err(&bebob->unit->device, in map_data_channels()
244 err = avc_bridgeco_get_plug_section_type(bebob->unit, addr, in map_data_channels()
247 dev_err(&bebob->unit->device, in map_data_channels()
322 init_both_connections(struct snd_bebob *bebob) in init_both_connections() argument
326 err = cmp_connection_init(&bebob->in_conn, in init_both_connections()
327 bebob->unit, CMP_INPUT, 0); in init_both_connections()
331 err = cmp_connection_init(&bebob->out_conn, in init_both_connections()
332 bebob->unit, CMP_OUTPUT, 0); in init_both_connections()
334 cmp_connection_destroy(&bebob->in_conn); in init_both_connections()
340 check_connection_used_by_others(struct snd_bebob *bebob, struct amdtp_stream *s) in check_connection_used_by_others() argument
346 if (s == &bebob->tx_stream) in check_connection_used_by_others()
347 conn = &bebob->out_conn; in check_connection_used_by_others()
349 conn = &bebob->in_conn; in check_connection_used_by_others()
353 dev_err(&bebob->unit->device, in check_connection_used_by_others()
364 make_both_connections(struct snd_bebob *bebob, unsigned int rate) in make_both_connections() argument
368 if (bebob->connected) in make_both_connections()
375 pcm_channels = bebob->tx_stream_formations[index].pcm; in make_both_connections()
376 midi_channels = bebob->tx_stream_formations[index].midi; in make_both_connections()
377 amdtp_stream_set_parameters(&bebob->tx_stream, in make_both_connections()
379 pcm_channels = bebob->rx_stream_formations[index].pcm; in make_both_connections()
380 midi_channels = bebob->rx_stream_formations[index].midi; in make_both_connections()
381 amdtp_stream_set_parameters(&bebob->rx_stream, in make_both_connections()
385 err = cmp_connection_establish(&bebob->out_conn, in make_both_connections()
386 amdtp_stream_get_max_payload(&bebob->tx_stream)); in make_both_connections()
389 err = cmp_connection_establish(&bebob->in_conn, in make_both_connections()
390 amdtp_stream_get_max_payload(&bebob->rx_stream)); in make_both_connections()
392 cmp_connection_break(&bebob->out_conn); in make_both_connections()
396 bebob->connected = true; in make_both_connections()
402 break_both_connections(struct snd_bebob *bebob) in break_both_connections() argument
404 cmp_connection_break(&bebob->in_conn); in break_both_connections()
405 cmp_connection_break(&bebob->out_conn); in break_both_connections()
407 bebob->connected = false; in break_both_connections()
410 if (bebob->maudio_special_quirk != NULL) in break_both_connections()
415 destroy_both_connections(struct snd_bebob *bebob) in destroy_both_connections() argument
417 cmp_connection_destroy(&bebob->in_conn); in destroy_both_connections()
418 cmp_connection_destroy(&bebob->out_conn); in destroy_both_connections()
422 get_sync_mode(struct snd_bebob *bebob, enum cip_flags *sync_mode) in get_sync_mode() argument
430 start_stream(struct snd_bebob *bebob, struct amdtp_stream *stream, in start_stream() argument
436 if (stream == &bebob->rx_stream) in start_stream()
437 conn = &bebob->in_conn; in start_stream()
439 conn = &bebob->out_conn; in start_stream()
442 if (bebob->maudio_special_quirk == NULL) { in start_stream()
443 err = map_data_channels(bebob, stream); in start_stream()
456 int snd_bebob_stream_init_duplex(struct snd_bebob *bebob) in snd_bebob_stream_init_duplex() argument
460 err = init_both_connections(bebob); in snd_bebob_stream_init_duplex()
464 err = amdtp_stream_init(&bebob->tx_stream, bebob->unit, in snd_bebob_stream_init_duplex()
467 amdtp_stream_destroy(&bebob->tx_stream); in snd_bebob_stream_init_duplex()
468 destroy_both_connections(bebob); in snd_bebob_stream_init_duplex()
472 init_completion(&bebob->bus_reset); in snd_bebob_stream_init_duplex()
473 bebob->tx_stream.flags |= CIP_SKIP_INIT_DBC_CHECK; in snd_bebob_stream_init_duplex()
479 if (bebob->maudio_special_quirk) in snd_bebob_stream_init_duplex()
480 bebob->tx_stream.flags |= CIP_EMPTY_HAS_WRONG_DBC; in snd_bebob_stream_init_duplex()
482 err = amdtp_stream_init(&bebob->rx_stream, bebob->unit, in snd_bebob_stream_init_duplex()
485 amdtp_stream_destroy(&bebob->tx_stream); in snd_bebob_stream_init_duplex()
486 amdtp_stream_destroy(&bebob->rx_stream); in snd_bebob_stream_init_duplex()
487 destroy_both_connections(bebob); in snd_bebob_stream_init_duplex()
493 int snd_bebob_stream_start_duplex(struct snd_bebob *bebob, unsigned int rate) in snd_bebob_stream_start_duplex() argument
495 struct snd_bebob_rate_spec *rate_spec = bebob->spec->rate; in snd_bebob_stream_start_duplex()
510 if (amdtp_streaming_error(&bebob->tx_stream)) { in snd_bebob_stream_start_duplex()
511 if (completion_done(&bebob->bus_reset)) in snd_bebob_stream_start_duplex()
512 reinit_completion(&bebob->bus_reset); in snd_bebob_stream_start_duplex()
515 &bebob->bus_reset, in snd_bebob_stream_start_duplex()
519 mutex_lock(&bebob->mutex); in snd_bebob_stream_start_duplex()
522 if (atomic_read(&bebob->playback_substreams) == 0 && in snd_bebob_stream_start_duplex()
523 atomic_read(&bebob->capture_substreams) == 0) in snd_bebob_stream_start_duplex()
526 err = get_sync_mode(bebob, &sync_mode); in snd_bebob_stream_start_duplex()
530 master = &bebob->tx_stream; in snd_bebob_stream_start_duplex()
531 slave = &bebob->rx_stream; in snd_bebob_stream_start_duplex()
532 slave_substreams = &bebob->playback_substreams; in snd_bebob_stream_start_duplex()
534 master = &bebob->rx_stream; in snd_bebob_stream_start_duplex()
535 slave = &bebob->tx_stream; in snd_bebob_stream_start_duplex()
536 slave_substreams = &bebob->capture_substreams; in snd_bebob_stream_start_duplex()
543 err = check_connection_used_by_others(bebob, master); in snd_bebob_stream_start_duplex()
559 break_both_connections(bebob); in snd_bebob_stream_start_duplex()
562 err = rate_spec->get(bebob, &curr_rate); in snd_bebob_stream_start_duplex()
564 dev_err(&bebob->unit->device, in snd_bebob_stream_start_duplex()
573 break_both_connections(bebob); in snd_bebob_stream_start_duplex()
579 bebob->master = master; in snd_bebob_stream_start_duplex()
588 if (bebob->maudio_special_quirk == NULL) { in snd_bebob_stream_start_duplex()
589 err = rate_spec->set(bebob, rate); in snd_bebob_stream_start_duplex()
591 dev_err(&bebob->unit->device, in snd_bebob_stream_start_duplex()
598 err = make_both_connections(bebob, rate); in snd_bebob_stream_start_duplex()
602 err = start_stream(bebob, master, rate); in snd_bebob_stream_start_duplex()
604 dev_err(&bebob->unit->device, in snd_bebob_stream_start_duplex()
606 break_both_connections(bebob); in snd_bebob_stream_start_duplex()
615 if (bebob->maudio_special_quirk != NULL) { in snd_bebob_stream_start_duplex()
616 err = rate_spec->set(bebob, rate); in snd_bebob_stream_start_duplex()
618 dev_err(&bebob->unit->device, in snd_bebob_stream_start_duplex()
622 break_both_connections(bebob); in snd_bebob_stream_start_duplex()
630 break_both_connections(bebob); in snd_bebob_stream_start_duplex()
638 err = start_stream(bebob, slave, rate); in snd_bebob_stream_start_duplex()
640 dev_err(&bebob->unit->device, in snd_bebob_stream_start_duplex()
643 break_both_connections(bebob); in snd_bebob_stream_start_duplex()
651 break_both_connections(bebob); in snd_bebob_stream_start_duplex()
656 mutex_unlock(&bebob->mutex); in snd_bebob_stream_start_duplex()
660 void snd_bebob_stream_stop_duplex(struct snd_bebob *bebob) in snd_bebob_stream_stop_duplex() argument
665 if (bebob->master == &bebob->rx_stream) { in snd_bebob_stream_stop_duplex()
666 slave = &bebob->tx_stream; in snd_bebob_stream_stop_duplex()
667 master = &bebob->rx_stream; in snd_bebob_stream_stop_duplex()
668 slave_substreams = &bebob->capture_substreams; in snd_bebob_stream_stop_duplex()
669 master_substreams = &bebob->playback_substreams; in snd_bebob_stream_stop_duplex()
671 slave = &bebob->rx_stream; in snd_bebob_stream_stop_duplex()
672 master = &bebob->tx_stream; in snd_bebob_stream_stop_duplex()
673 slave_substreams = &bebob->playback_substreams; in snd_bebob_stream_stop_duplex()
674 master_substreams = &bebob->capture_substreams; in snd_bebob_stream_stop_duplex()
677 mutex_lock(&bebob->mutex); in snd_bebob_stream_stop_duplex()
686 break_both_connections(bebob); in snd_bebob_stream_stop_duplex()
690 mutex_unlock(&bebob->mutex); in snd_bebob_stream_stop_duplex()
693 void snd_bebob_stream_update_duplex(struct snd_bebob *bebob) in snd_bebob_stream_update_duplex() argument
696 mutex_lock(&bebob->mutex); in snd_bebob_stream_update_duplex()
698 if ((cmp_connection_update(&bebob->in_conn) < 0) || in snd_bebob_stream_update_duplex()
699 (cmp_connection_update(&bebob->out_conn) < 0)) { in snd_bebob_stream_update_duplex()
700 amdtp_stream_pcm_abort(&bebob->rx_stream); in snd_bebob_stream_update_duplex()
701 amdtp_stream_pcm_abort(&bebob->tx_stream); in snd_bebob_stream_update_duplex()
702 amdtp_stream_stop(&bebob->rx_stream); in snd_bebob_stream_update_duplex()
703 amdtp_stream_stop(&bebob->tx_stream); in snd_bebob_stream_update_duplex()
704 break_both_connections(bebob); in snd_bebob_stream_update_duplex()
706 amdtp_stream_update(&bebob->rx_stream); in snd_bebob_stream_update_duplex()
707 amdtp_stream_update(&bebob->tx_stream); in snd_bebob_stream_update_duplex()
711 if (!completion_done(&bebob->bus_reset)) in snd_bebob_stream_update_duplex()
712 complete_all(&bebob->bus_reset); in snd_bebob_stream_update_duplex()
714 mutex_unlock(&bebob->mutex); in snd_bebob_stream_update_duplex()
721 void snd_bebob_stream_destroy_duplex(struct snd_bebob *bebob) in snd_bebob_stream_destroy_duplex() argument
723 amdtp_stream_destroy(&bebob->rx_stream); in snd_bebob_stream_destroy_duplex()
724 amdtp_stream_destroy(&bebob->tx_stream); in snd_bebob_stream_destroy_duplex()
726 destroy_both_connections(bebob); in snd_bebob_stream_destroy_duplex()
805 fill_stream_formations(struct snd_bebob *bebob, enum avc_bridgeco_plug_dir dir, in fill_stream_formations() argument
819 formations = bebob->rx_stream_formations; in fill_stream_formations()
821 formations = bebob->tx_stream_formations; in fill_stream_formations()
827 err = avc_bridgeco_get_plug_strm_fmt(bebob->unit, addr, buf, in fill_stream_formations()
834 dev_err(&bebob->unit->device, in fill_stream_formations()
853 seek_msu_sync_input_plug(struct snd_bebob *bebob) in seek_msu_sync_input_plug() argument
861 err = avc_general_get_plug_info(bebob->unit, 0x0c, 0x00, 0x00, plugs); in seek_msu_sync_input_plug()
863 dev_err(&bebob->unit->device, in seek_msu_sync_input_plug()
870 bebob->sync_input_plug = -1; in seek_msu_sync_input_plug()
873 err = avc_bridgeco_get_plug_type(bebob->unit, addr, &type); in seek_msu_sync_input_plug()
875 dev_err(&bebob->unit->device, in seek_msu_sync_input_plug()
882 bebob->sync_input_plug = i; in seek_msu_sync_input_plug()
890 int snd_bebob_stream_discover(struct snd_bebob *bebob) in snd_bebob_stream_discover() argument
892 struct snd_bebob_clock_spec *clk_spec = bebob->spec->clock; in snd_bebob_stream_discover()
899 err = avc_general_get_plug_info(bebob->unit, 0x1f, 0x07, 0x00, plugs); in snd_bebob_stream_discover()
901 dev_err(&bebob->unit->device, in snd_bebob_stream_discover()
918 err = avc_bridgeco_get_plug_type(bebob->unit, addr, &type); in snd_bebob_stream_discover()
920 dev_err(&bebob->unit->device, in snd_bebob_stream_discover()
927 err = fill_stream_formations(bebob, AVC_BRIDGECO_PLUG_DIR_IN, 0); in snd_bebob_stream_discover()
933 err = avc_bridgeco_get_plug_type(bebob->unit, addr, &type); in snd_bebob_stream_discover()
935 dev_err(&bebob->unit->device, in snd_bebob_stream_discover()
942 err = fill_stream_formations(bebob, AVC_BRIDGECO_PLUG_DIR_OUT, 0); in snd_bebob_stream_discover()
947 bebob->midi_input_ports = 0; in snd_bebob_stream_discover()
951 err = avc_bridgeco_get_plug_type(bebob->unit, addr, &type); in snd_bebob_stream_discover()
953 dev_err(&bebob->unit->device, in snd_bebob_stream_discover()
958 bebob->midi_input_ports++; in snd_bebob_stream_discover()
963 bebob->midi_output_ports = 0; in snd_bebob_stream_discover()
967 err = avc_bridgeco_get_plug_type(bebob->unit, addr, &type); in snd_bebob_stream_discover()
969 dev_err(&bebob->unit->device, in snd_bebob_stream_discover()
974 bebob->midi_output_ports++; in snd_bebob_stream_discover()
980 err = seek_msu_sync_input_plug(bebob); in snd_bebob_stream_discover()
985 void snd_bebob_stream_lock_changed(struct snd_bebob *bebob) in snd_bebob_stream_lock_changed() argument
987 bebob->dev_lock_changed = true; in snd_bebob_stream_lock_changed()
988 wake_up(&bebob->hwdep_wait); in snd_bebob_stream_lock_changed()
991 int snd_bebob_stream_lock_try(struct snd_bebob *bebob) in snd_bebob_stream_lock_try() argument
995 spin_lock_irq(&bebob->lock); in snd_bebob_stream_lock_try()
998 if (bebob->dev_lock_count < 0) { in snd_bebob_stream_lock_try()
1004 if (bebob->dev_lock_count++ == 0) in snd_bebob_stream_lock_try()
1005 snd_bebob_stream_lock_changed(bebob); in snd_bebob_stream_lock_try()
1008 spin_unlock_irq(&bebob->lock); in snd_bebob_stream_lock_try()
1012 void snd_bebob_stream_lock_release(struct snd_bebob *bebob) in snd_bebob_stream_lock_release() argument
1014 spin_lock_irq(&bebob->lock); in snd_bebob_stream_lock_release()
1016 if (WARN_ON(bebob->dev_lock_count <= 0)) in snd_bebob_stream_lock_release()
1018 if (--bebob->dev_lock_count == 0) in snd_bebob_stream_lock_release()
1019 snd_bebob_stream_lock_changed(bebob); in snd_bebob_stream_lock_release()
1021 spin_unlock_irq(&bebob->lock); in snd_bebob_stream_lock_release()