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()
121 int snd_bebob_stream_get_clock_src(struct snd_bebob *bebob, in snd_bebob_stream_get_clock_src() argument
124 const struct snd_bebob_clock_spec *clk_spec = bebob->spec->clock; in snd_bebob_stream_get_clock_src()
132 err = clk_spec->get(bebob, &id); in snd_bebob_stream_get_clock_src()
134 dev_err(&bebob->unit->device, in snd_bebob_stream_get_clock_src()
140 dev_err(&bebob->unit->device, in snd_bebob_stream_get_clock_src()
155 if (bebob->sync_input_plug < 0) { in snd_bebob_stream_get_clock_src()
165 bebob->sync_input_plug); in snd_bebob_stream_get_clock_src()
166 err = avc_bridgeco_get_plug_input(bebob->unit, addr, input); in snd_bebob_stream_get_clock_src()
168 dev_err(&bebob->unit->device, in snd_bebob_stream_get_clock_src()
170 bebob->sync_input_plug, err); in snd_bebob_stream_get_clock_src()
223 err = avc_bridgeco_get_plug_type(bebob->unit, addr, in snd_bebob_stream_get_clock_src()
257 map_data_channels(struct snd_bebob *bebob, struct amdtp_stream *s) in map_data_channels() argument
274 if (s == &bebob->tx_stream) in map_data_channels()
280 err = avc_bridgeco_get_plug_ch_pos(bebob->unit, addr, buf, 256); in map_data_channels()
282 dev_err(&bebob->unit->device, in map_data_channels()
301 err = avc_bridgeco_get_plug_section_type(bebob->unit, addr, in map_data_channels()
304 dev_err(&bebob->unit->device, in map_data_channels()
380 init_both_connections(struct snd_bebob *bebob) in init_both_connections() argument
384 err = cmp_connection_init(&bebob->in_conn, in init_both_connections()
385 bebob->unit, CMP_INPUT, 0); in init_both_connections()
389 err = cmp_connection_init(&bebob->out_conn, in init_both_connections()
390 bebob->unit, CMP_OUTPUT, 0); in init_both_connections()
392 cmp_connection_destroy(&bebob->in_conn); in init_both_connections()
398 check_connection_used_by_others(struct snd_bebob *bebob, struct amdtp_stream *s) in check_connection_used_by_others() argument
404 if (s == &bebob->tx_stream) in check_connection_used_by_others()
405 conn = &bebob->out_conn; in check_connection_used_by_others()
407 conn = &bebob->in_conn; in check_connection_used_by_others()
411 dev_err(&bebob->unit->device, in check_connection_used_by_others()
422 make_both_connections(struct snd_bebob *bebob, unsigned int rate) in make_both_connections() argument
426 if (bebob->connected) in make_both_connections()
433 pcm_channels = bebob->tx_stream_formations[index].pcm; in make_both_connections()
434 midi_channels = bebob->tx_stream_formations[index].midi; in make_both_connections()
435 err = amdtp_am824_set_parameters(&bebob->tx_stream, rate, in make_both_connections()
441 pcm_channels = bebob->rx_stream_formations[index].pcm; in make_both_connections()
442 midi_channels = bebob->rx_stream_formations[index].midi; in make_both_connections()
443 err = amdtp_am824_set_parameters(&bebob->rx_stream, rate, in make_both_connections()
450 err = cmp_connection_establish(&bebob->out_conn, in make_both_connections()
451 amdtp_stream_get_max_payload(&bebob->tx_stream)); in make_both_connections()
454 err = cmp_connection_establish(&bebob->in_conn, in make_both_connections()
455 amdtp_stream_get_max_payload(&bebob->rx_stream)); in make_both_connections()
457 cmp_connection_break(&bebob->out_conn); in make_both_connections()
461 bebob->connected = true; in make_both_connections()
467 break_both_connections(struct snd_bebob *bebob) in break_both_connections() argument
469 cmp_connection_break(&bebob->in_conn); in break_both_connections()
470 cmp_connection_break(&bebob->out_conn); in break_both_connections()
472 bebob->connected = false; in break_both_connections()
475 if (bebob->maudio_special_quirk != NULL) in break_both_connections()
480 destroy_both_connections(struct snd_bebob *bebob) in destroy_both_connections() argument
482 cmp_connection_destroy(&bebob->in_conn); in destroy_both_connections()
483 cmp_connection_destroy(&bebob->out_conn); in destroy_both_connections()
487 get_sync_mode(struct snd_bebob *bebob, enum cip_flags *sync_mode) in get_sync_mode() argument
492 err = snd_bebob_stream_get_clock_src(bebob, &src); in get_sync_mode()
511 start_stream(struct snd_bebob *bebob, struct amdtp_stream *stream, in start_stream() argument
517 if (stream == &bebob->rx_stream) in start_stream()
518 conn = &bebob->in_conn; in start_stream()
520 conn = &bebob->out_conn; in start_stream()
523 if (bebob->maudio_special_quirk == NULL) { in start_stream()
524 err = map_data_channels(bebob, stream); in start_stream()
537 int snd_bebob_stream_init_duplex(struct snd_bebob *bebob) in snd_bebob_stream_init_duplex() argument
541 err = init_both_connections(bebob); in snd_bebob_stream_init_duplex()
545 err = amdtp_am824_init(&bebob->tx_stream, bebob->unit, in snd_bebob_stream_init_duplex()
548 amdtp_stream_destroy(&bebob->tx_stream); in snd_bebob_stream_init_duplex()
549 destroy_both_connections(bebob); in snd_bebob_stream_init_duplex()
553 init_completion(&bebob->bus_reset); in snd_bebob_stream_init_duplex()
554 bebob->tx_stream.flags |= CIP_SKIP_INIT_DBC_CHECK; in snd_bebob_stream_init_duplex()
562 if (bebob->version > 2) in snd_bebob_stream_init_duplex()
563 bebob->tx_stream.flags |= CIP_EMPTY_HAS_WRONG_DBC | in snd_bebob_stream_init_duplex()
571 if (bebob->maudio_special_quirk) in snd_bebob_stream_init_duplex()
572 bebob->tx_stream.flags |= CIP_EMPTY_HAS_WRONG_DBC; in snd_bebob_stream_init_duplex()
574 err = amdtp_am824_init(&bebob->rx_stream, bebob->unit, in snd_bebob_stream_init_duplex()
577 amdtp_stream_destroy(&bebob->tx_stream); in snd_bebob_stream_init_duplex()
578 amdtp_stream_destroy(&bebob->rx_stream); in snd_bebob_stream_init_duplex()
579 destroy_both_connections(bebob); in snd_bebob_stream_init_duplex()
585 int snd_bebob_stream_start_duplex(struct snd_bebob *bebob, unsigned int rate) in snd_bebob_stream_start_duplex() argument
587 const struct snd_bebob_rate_spec *rate_spec = bebob->spec->rate; in snd_bebob_stream_start_duplex()
601 if (amdtp_streaming_error(&bebob->tx_stream)) { in snd_bebob_stream_start_duplex()
602 if (completion_done(&bebob->bus_reset)) in snd_bebob_stream_start_duplex()
603 reinit_completion(&bebob->bus_reset); in snd_bebob_stream_start_duplex()
606 &bebob->bus_reset, in snd_bebob_stream_start_duplex()
610 mutex_lock(&bebob->mutex); in snd_bebob_stream_start_duplex()
613 if (atomic_read(&bebob->substreams_counter) == 0) in snd_bebob_stream_start_duplex()
616 err = get_sync_mode(bebob, &sync_mode); in snd_bebob_stream_start_duplex()
620 master = &bebob->tx_stream; in snd_bebob_stream_start_duplex()
621 slave = &bebob->rx_stream; in snd_bebob_stream_start_duplex()
623 master = &bebob->rx_stream; in snd_bebob_stream_start_duplex()
624 slave = &bebob->tx_stream; in snd_bebob_stream_start_duplex()
631 err = check_connection_used_by_others(bebob, master); in snd_bebob_stream_start_duplex()
647 break_both_connections(bebob); in snd_bebob_stream_start_duplex()
650 err = rate_spec->get(bebob, &curr_rate); in snd_bebob_stream_start_duplex()
652 dev_err(&bebob->unit->device, in snd_bebob_stream_start_duplex()
661 break_both_connections(bebob); in snd_bebob_stream_start_duplex()
667 bebob->master = master; in snd_bebob_stream_start_duplex()
676 if (bebob->maudio_special_quirk == NULL) { in snd_bebob_stream_start_duplex()
677 err = rate_spec->set(bebob, rate); in snd_bebob_stream_start_duplex()
679 dev_err(&bebob->unit->device, in snd_bebob_stream_start_duplex()
686 err = make_both_connections(bebob, rate); in snd_bebob_stream_start_duplex()
690 err = start_stream(bebob, master, rate); in snd_bebob_stream_start_duplex()
692 dev_err(&bebob->unit->device, in snd_bebob_stream_start_duplex()
694 break_both_connections(bebob); in snd_bebob_stream_start_duplex()
703 if (bebob->maudio_special_quirk != NULL) { in snd_bebob_stream_start_duplex()
704 err = rate_spec->set(bebob, rate); in snd_bebob_stream_start_duplex()
706 dev_err(&bebob->unit->device, in snd_bebob_stream_start_duplex()
710 break_both_connections(bebob); in snd_bebob_stream_start_duplex()
718 break_both_connections(bebob); in snd_bebob_stream_start_duplex()
726 err = start_stream(bebob, slave, rate); in snd_bebob_stream_start_duplex()
728 dev_err(&bebob->unit->device, in snd_bebob_stream_start_duplex()
731 break_both_connections(bebob); in snd_bebob_stream_start_duplex()
739 break_both_connections(bebob); in snd_bebob_stream_start_duplex()
744 mutex_unlock(&bebob->mutex); in snd_bebob_stream_start_duplex()
748 void snd_bebob_stream_stop_duplex(struct snd_bebob *bebob) in snd_bebob_stream_stop_duplex() argument
752 if (bebob->master == &bebob->rx_stream) { in snd_bebob_stream_stop_duplex()
753 slave = &bebob->tx_stream; in snd_bebob_stream_stop_duplex()
754 master = &bebob->rx_stream; in snd_bebob_stream_stop_duplex()
756 slave = &bebob->rx_stream; in snd_bebob_stream_stop_duplex()
757 master = &bebob->tx_stream; in snd_bebob_stream_stop_duplex()
760 mutex_lock(&bebob->mutex); in snd_bebob_stream_stop_duplex()
762 if (atomic_read(&bebob->substreams_counter) == 0) { in snd_bebob_stream_stop_duplex()
769 break_both_connections(bebob); in snd_bebob_stream_stop_duplex()
772 mutex_unlock(&bebob->mutex); in snd_bebob_stream_stop_duplex()
775 void snd_bebob_stream_update_duplex(struct snd_bebob *bebob) in snd_bebob_stream_update_duplex() argument
778 mutex_lock(&bebob->mutex); in snd_bebob_stream_update_duplex()
780 if ((cmp_connection_update(&bebob->in_conn) < 0) || in snd_bebob_stream_update_duplex()
781 (cmp_connection_update(&bebob->out_conn) < 0)) { in snd_bebob_stream_update_duplex()
782 amdtp_stream_pcm_abort(&bebob->rx_stream); in snd_bebob_stream_update_duplex()
783 amdtp_stream_pcm_abort(&bebob->tx_stream); in snd_bebob_stream_update_duplex()
784 amdtp_stream_stop(&bebob->rx_stream); in snd_bebob_stream_update_duplex()
785 amdtp_stream_stop(&bebob->tx_stream); in snd_bebob_stream_update_duplex()
786 break_both_connections(bebob); in snd_bebob_stream_update_duplex()
788 amdtp_stream_update(&bebob->rx_stream); in snd_bebob_stream_update_duplex()
789 amdtp_stream_update(&bebob->tx_stream); in snd_bebob_stream_update_duplex()
793 if (!completion_done(&bebob->bus_reset)) in snd_bebob_stream_update_duplex()
794 complete_all(&bebob->bus_reset); in snd_bebob_stream_update_duplex()
796 mutex_unlock(&bebob->mutex); in snd_bebob_stream_update_duplex()
803 void snd_bebob_stream_destroy_duplex(struct snd_bebob *bebob) in snd_bebob_stream_destroy_duplex() argument
805 amdtp_stream_destroy(&bebob->rx_stream); in snd_bebob_stream_destroy_duplex()
806 amdtp_stream_destroy(&bebob->tx_stream); in snd_bebob_stream_destroy_duplex()
808 destroy_both_connections(bebob); in snd_bebob_stream_destroy_duplex()
887 fill_stream_formations(struct snd_bebob *bebob, enum avc_bridgeco_plug_dir dir, in fill_stream_formations() argument
901 formations = bebob->rx_stream_formations; in fill_stream_formations()
903 formations = bebob->tx_stream_formations; in fill_stream_formations()
909 err = avc_bridgeco_get_plug_strm_fmt(bebob->unit, addr, buf, in fill_stream_formations()
916 dev_err(&bebob->unit->device, in fill_stream_formations()
935 seek_msu_sync_input_plug(struct snd_bebob *bebob) in seek_msu_sync_input_plug() argument
943 err = avc_general_get_plug_info(bebob->unit, 0x0c, 0x00, 0x00, plugs); in seek_msu_sync_input_plug()
945 dev_err(&bebob->unit->device, in seek_msu_sync_input_plug()
952 bebob->sync_input_plug = -1; in seek_msu_sync_input_plug()
955 err = avc_bridgeco_get_plug_type(bebob->unit, addr, &type); in seek_msu_sync_input_plug()
957 dev_err(&bebob->unit->device, in seek_msu_sync_input_plug()
964 bebob->sync_input_plug = i; in seek_msu_sync_input_plug()
972 int snd_bebob_stream_discover(struct snd_bebob *bebob) in snd_bebob_stream_discover() argument
974 const struct snd_bebob_clock_spec *clk_spec = bebob->spec->clock; in snd_bebob_stream_discover()
981 err = avc_general_get_plug_info(bebob->unit, 0x1f, 0x07, 0x00, plugs); in snd_bebob_stream_discover()
983 dev_err(&bebob->unit->device, in snd_bebob_stream_discover()
1000 err = avc_bridgeco_get_plug_type(bebob->unit, addr, &type); in snd_bebob_stream_discover()
1002 dev_err(&bebob->unit->device, in snd_bebob_stream_discover()
1009 err = fill_stream_formations(bebob, AVC_BRIDGECO_PLUG_DIR_IN, 0); in snd_bebob_stream_discover()
1015 err = avc_bridgeco_get_plug_type(bebob->unit, addr, &type); in snd_bebob_stream_discover()
1017 dev_err(&bebob->unit->device, in snd_bebob_stream_discover()
1024 err = fill_stream_formations(bebob, AVC_BRIDGECO_PLUG_DIR_OUT, 0); in snd_bebob_stream_discover()
1029 bebob->midi_input_ports = 0; in snd_bebob_stream_discover()
1033 err = avc_bridgeco_get_plug_type(bebob->unit, addr, &type); in snd_bebob_stream_discover()
1035 dev_err(&bebob->unit->device, in snd_bebob_stream_discover()
1040 bebob->midi_input_ports++; in snd_bebob_stream_discover()
1045 bebob->midi_output_ports = 0; in snd_bebob_stream_discover()
1049 err = avc_bridgeco_get_plug_type(bebob->unit, addr, &type); in snd_bebob_stream_discover()
1051 dev_err(&bebob->unit->device, in snd_bebob_stream_discover()
1056 bebob->midi_output_ports++; in snd_bebob_stream_discover()
1062 err = seek_msu_sync_input_plug(bebob); in snd_bebob_stream_discover()
1067 void snd_bebob_stream_lock_changed(struct snd_bebob *bebob) in snd_bebob_stream_lock_changed() argument
1069 bebob->dev_lock_changed = true; in snd_bebob_stream_lock_changed()
1070 wake_up(&bebob->hwdep_wait); in snd_bebob_stream_lock_changed()
1073 int snd_bebob_stream_lock_try(struct snd_bebob *bebob) in snd_bebob_stream_lock_try() argument
1077 spin_lock_irq(&bebob->lock); in snd_bebob_stream_lock_try()
1080 if (bebob->dev_lock_count < 0) { in snd_bebob_stream_lock_try()
1086 if (bebob->dev_lock_count++ == 0) in snd_bebob_stream_lock_try()
1087 snd_bebob_stream_lock_changed(bebob); in snd_bebob_stream_lock_try()
1090 spin_unlock_irq(&bebob->lock); in snd_bebob_stream_lock_try()
1094 void snd_bebob_stream_lock_release(struct snd_bebob *bebob) in snd_bebob_stream_lock_release() argument
1096 spin_lock_irq(&bebob->lock); in snd_bebob_stream_lock_release()
1098 if (WARN_ON(bebob->dev_lock_count <= 0)) in snd_bebob_stream_lock_release()
1100 if (--bebob->dev_lock_count == 0) in snd_bebob_stream_lock_release()
1101 snd_bebob_stream_lock_changed(bebob); in snd_bebob_stream_lock_release()
1103 spin_unlock_irq(&bebob->lock); in snd_bebob_stream_lock_release()