1 // SPDX-License-Identifier: GPL-2.0-only
3 * bebob_stream.c - a part of driver for BeBoB based devices
5 * Copyright (c) 2013-2014 Takashi Sakamoto
10 #define CALLBACK_TIMEOUT 2500
11 #define FW_ISO_RESOURCE_DELAY 1000
15 * For BeBoB streams, Both of input and output CMP connection are important.
17 * For most devices, each CMP connection starts to transmit/receive a
18 * corresponding stream. But for a few devices, both of CMP connection needs
19 * to start transmitting stream. An example is 'M-Audio Firewire 410'.
22 /* 128 is an arbitrary length but it seems to be enough */
23 #define FORMAT_MAXIMUM_LENGTH 128
25 const unsigned int snd_bebob_rate_table
[SND_BEBOB_STRM_FMT_ENTRIES
] = {
36 * See: Table 51: Extended Stream Format Info ‘Sampling Frequency’
37 * in Additional AVC commands (Nov 2003, BridgeCo)
39 static const unsigned int bridgeco_freq_table
[] = {
50 get_formation_index(unsigned int rate
, unsigned int *index
)
54 for (i
= 0; i
< ARRAY_SIZE(snd_bebob_rate_table
); i
++) {
55 if (snd_bebob_rate_table
[i
] == rate
) {
64 snd_bebob_stream_get_rate(struct snd_bebob
*bebob
, unsigned int *curr_rate
)
66 unsigned int tx_rate
, rx_rate
, trials
;
71 err
= avc_general_get_sig_fmt(bebob
->unit
, &tx_rate
,
72 AVC_GENERAL_PLUG_DIR_OUT
, 0);
73 } while (err
== -EAGAIN
&& ++trials
< 3);
79 err
= avc_general_get_sig_fmt(bebob
->unit
, &rx_rate
,
80 AVC_GENERAL_PLUG_DIR_IN
, 0);
81 } while (err
== -EAGAIN
&& ++trials
< 3);
86 if (rx_rate
== tx_rate
)
89 /* synchronize receive stream rate to transmit stream rate */
90 err
= avc_general_set_sig_fmt(bebob
->unit
, rx_rate
,
91 AVC_GENERAL_PLUG_DIR_IN
, 0);
97 snd_bebob_stream_set_rate(struct snd_bebob
*bebob
, unsigned int rate
)
101 err
= avc_general_set_sig_fmt(bebob
->unit
, rate
,
102 AVC_GENERAL_PLUG_DIR_OUT
, 0);
106 err
= avc_general_set_sig_fmt(bebob
->unit
, rate
,
107 AVC_GENERAL_PLUG_DIR_IN
, 0);
112 * Some devices need a bit time for transition.
113 * 300msec is got by some experiments.
120 int snd_bebob_stream_get_clock_src(struct snd_bebob
*bebob
,
121 enum snd_bebob_clock_type
*src
)
123 const struct snd_bebob_clock_spec
*clk_spec
= bebob
->spec
->clock
;
124 u8 addr
[AVC_BRIDGECO_ADDR_BYTES
], input
[7];
126 enum avc_bridgeco_plug_type type
;
129 /* 1.The device has its own operation to switch source of clock */
131 err
= clk_spec
->get(bebob
, &id
);
133 dev_err(&bebob
->unit
->device
,
134 "fail to get clock source: %d\n", err
);
138 if (id
>= clk_spec
->num
) {
139 dev_err(&bebob
->unit
->device
,
140 "clock source %d out of range 0..%d\n",
141 id
, clk_spec
->num
- 1);
146 *src
= clk_spec
->types
[id
];
151 * 2.The device don't support to switch source of clock then assumed
152 * to use internal clock always
154 if (bebob
->sync_input_plug
< 0) {
155 *src
= SND_BEBOB_CLOCK_TYPE_INTERNAL
;
160 * 3.The device supports to switch source of clock by an usual way.
161 * Let's check input for 'Music Sub Unit Sync Input' plug.
163 avc_bridgeco_fill_msu_addr(addr
, AVC_BRIDGECO_PLUG_DIR_IN
,
164 bebob
->sync_input_plug
);
165 err
= avc_bridgeco_get_plug_input(bebob
->unit
, addr
, input
);
167 dev_err(&bebob
->unit
->device
,
168 "fail to get an input for MSU in plug %d: %d\n",
169 bebob
->sync_input_plug
, err
);
174 * If there are no input plugs, all of fields are 0xff.
175 * Here check the first field. This field is used for direction.
177 if (input
[0] == 0xff) {
178 *src
= SND_BEBOB_CLOCK_TYPE_INTERNAL
;
182 /* The source from any output plugs is for one purpose only. */
183 if (input
[0] == AVC_BRIDGECO_PLUG_DIR_OUT
) {
185 * In BeBoB architecture, the source from music subunit may
186 * bypass from oPCR[0]. This means that this source gives
187 * synchronization to IEEE 1394 cycle start packet.
189 if (input
[1] == AVC_BRIDGECO_PLUG_MODE_SUBUNIT
&&
191 *src
= SND_BEBOB_CLOCK_TYPE_INTERNAL
;
194 /* The source from any input units is for several purposes. */
195 } else if (input
[1] == AVC_BRIDGECO_PLUG_MODE_UNIT
) {
196 if (input
[2] == AVC_BRIDGECO_PLUG_UNIT_ISOC
) {
197 if (input
[3] == 0x00) {
199 * This source comes from iPCR[0]. This means
200 * that presentation timestamp calculated by
201 * SYT series of the received packets. In
202 * short, this driver is the master of
205 *src
= SND_BEBOB_CLOCK_TYPE_SYT
;
209 * This source comes from iPCR[1-29]. This
210 * means that the synchronization stream is not
211 * the Audio/MIDI compound stream.
213 *src
= SND_BEBOB_CLOCK_TYPE_EXTERNAL
;
216 } else if (input
[2] == AVC_BRIDGECO_PLUG_UNIT_EXT
) {
217 /* Check type of this plug. */
218 avc_bridgeco_fill_unit_addr(addr
,
219 AVC_BRIDGECO_PLUG_DIR_IN
,
220 AVC_BRIDGECO_PLUG_UNIT_EXT
,
222 err
= avc_bridgeco_get_plug_type(bebob
->unit
, addr
,
227 if (type
== AVC_BRIDGECO_PLUG_TYPE_DIG
) {
229 * SPDIF/ADAT or sometimes (not always) word
232 *src
= SND_BEBOB_CLOCK_TYPE_EXTERNAL
;
234 } else if (type
== AVC_BRIDGECO_PLUG_TYPE_SYNC
) {
235 /* Often word clock. */
236 *src
= SND_BEBOB_CLOCK_TYPE_EXTERNAL
;
238 } else if (type
== AVC_BRIDGECO_PLUG_TYPE_ADDITION
) {
241 * Mostly, additional internal clock.
243 *src
= SND_BEBOB_CLOCK_TYPE_INTERNAL
;
255 static int map_data_channels(struct snd_bebob
*bebob
, struct amdtp_stream
*s
)
257 unsigned int sec
, sections
, ch
, channels
;
258 unsigned int pcm
, midi
, location
;
259 unsigned int stm_pos
, sec_loc
, pos
;
260 u8
*buf
, addr
[AVC_BRIDGECO_ADDR_BYTES
], type
;
261 enum avc_bridgeco_plug_dir dir
;
265 * The length of return value of this command cannot be expected. Here
266 * use the maximum length of FCP.
268 buf
= kzalloc(256, GFP_KERNEL
);
272 if (s
== &bebob
->tx_stream
)
273 dir
= AVC_BRIDGECO_PLUG_DIR_OUT
;
275 dir
= AVC_BRIDGECO_PLUG_DIR_IN
;
277 avc_bridgeco_fill_unit_addr(addr
, dir
, AVC_BRIDGECO_PLUG_UNIT_ISOC
, 0);
278 err
= avc_bridgeco_get_plug_ch_pos(bebob
->unit
, addr
, buf
, 256);
280 dev_err(&bebob
->unit
->device
,
281 "fail to get channel position for isoc %s plug 0: %d\n",
282 (dir
== AVC_BRIDGECO_PLUG_DIR_IN
) ? "in" : "out",
288 /* positions in I/O buffer */
292 /* the number of sections in AMDTP packet */
293 sections
= buf
[pos
++];
295 for (sec
= 0; sec
< sections
; sec
++) {
296 /* type of this section */
297 avc_bridgeco_fill_unit_addr(addr
, dir
,
298 AVC_BRIDGECO_PLUG_UNIT_ISOC
, 0);
299 err
= avc_bridgeco_get_plug_section_type(bebob
->unit
, addr
,
302 dev_err(&bebob
->unit
->device
,
303 "fail to get section type for isoc %s plug 0: %d\n",
304 (dir
== AVC_BRIDGECO_PLUG_DIR_IN
) ? "in" :
315 /* the number of channels in this section */
316 channels
= buf
[pos
++];
318 for (ch
= 0; ch
< channels
; ch
++) {
319 /* position of this channel in AMDTP packet */
320 stm_pos
= buf
[pos
++] - 1;
321 /* location of this channel in this section */
322 sec_loc
= buf
[pos
++] - 1;
325 * Basically the number of location is within the
326 * number of channels in this section. But some models
327 * of M-Audio don't follow this. Its location for MIDI
328 * is the position of MIDI channels in AMDTP packet.
330 if (sec_loc
>= channels
)
334 /* for MIDI conformant data channel */
336 /* AMDTP_MAX_CHANNELS_FOR_MIDI is 1. */
337 if ((midi
> 0) && (stm_pos
!= midi
)) {
341 amdtp_am824_set_midi_position(s
, stm_pos
);
344 /* for PCM data channel */
345 case 0x01: /* Headphone */
346 case 0x02: /* Microphone */
347 case 0x03: /* Line */
348 case 0x04: /* SPDIF */
349 case 0x05: /* ADAT */
350 case 0x06: /* TDIF */
351 case 0x07: /* MADI */
352 /* for undefined/changeable signal */
353 case 0x08: /* Analog */
354 case 0x09: /* Digital */
356 location
= pcm
+ sec_loc
;
357 if (location
>= AM824_MAX_CHANNELS_FOR_PCM
) {
361 amdtp_am824_set_pcm_position(s
, location
,
378 check_connection_used_by_others(struct snd_bebob
*bebob
, struct amdtp_stream
*s
)
380 struct cmp_connection
*conn
;
384 if (s
== &bebob
->tx_stream
)
385 conn
= &bebob
->out_conn
;
387 conn
= &bebob
->in_conn
;
389 err
= cmp_connection_check_used(conn
, &used
);
390 if ((err
>= 0) && used
&& !amdtp_stream_running(s
)) {
391 dev_err(&bebob
->unit
->device
,
392 "Connection established by others: %cPCR[%d]\n",
393 (conn
->direction
== CMP_OUTPUT
) ? 'o' : 'i',
401 static void break_both_connections(struct snd_bebob
*bebob
)
403 cmp_connection_break(&bebob
->in_conn
);
404 cmp_connection_break(&bebob
->out_conn
);
406 // These models seem to be in transition state for a longer time. When
407 // accessing in the state, any transactions is corrupted. In the worst
408 // case, the device is going to reboot.
409 if (bebob
->version
< 2)
413 static int start_stream(struct snd_bebob
*bebob
, struct amdtp_stream
*stream
)
415 struct cmp_connection
*conn
;
418 if (stream
== &bebob
->rx_stream
)
419 conn
= &bebob
->in_conn
;
421 conn
= &bebob
->out_conn
;
424 if (bebob
->maudio_special_quirk
== NULL
) {
425 err
= map_data_channels(bebob
, stream
);
430 err
= cmp_connection_establish(conn
);
434 return amdtp_domain_add_stream(&bebob
->domain
, stream
,
435 conn
->resources
.channel
, conn
->speed
);
438 static int init_stream(struct snd_bebob
*bebob
, struct amdtp_stream
*stream
)
440 enum amdtp_stream_direction dir_stream
;
441 struct cmp_connection
*conn
;
442 enum cmp_direction dir_conn
;
445 if (stream
== &bebob
->tx_stream
) {
446 dir_stream
= AMDTP_IN_STREAM
;
447 conn
= &bebob
->out_conn
;
448 dir_conn
= CMP_OUTPUT
;
450 dir_stream
= AMDTP_OUT_STREAM
;
451 conn
= &bebob
->in_conn
;
452 dir_conn
= CMP_INPUT
;
455 err
= cmp_connection_init(conn
, bebob
->unit
, dir_conn
, 0);
459 err
= amdtp_am824_init(stream
, bebob
->unit
, dir_stream
, CIP_BLOCKING
);
461 cmp_connection_destroy(conn
);
465 if (stream
== &bebob
->tx_stream
) {
466 // BeBoB v3 transfers packets with these qurks:
467 // - In the beginning of streaming, the value of dbc is
468 // incremented even if no data blocks are transferred.
469 // - The value of dbc is reset suddenly.
470 if (bebob
->version
> 2)
471 bebob
->tx_stream
.flags
|= CIP_EMPTY_HAS_WRONG_DBC
|
472 CIP_SKIP_DBC_ZERO_CHECK
;
474 // At high sampling rate, M-Audio special firmware transmits
475 // empty packet with the value of dbc incremented by 8 but the
476 // others are valid to IEC 61883-1.
477 if (bebob
->maudio_special_quirk
)
478 bebob
->tx_stream
.flags
|= CIP_EMPTY_HAS_WRONG_DBC
;
484 static void destroy_stream(struct snd_bebob
*bebob
, struct amdtp_stream
*stream
)
486 amdtp_stream_destroy(stream
);
488 if (stream
== &bebob
->tx_stream
)
489 cmp_connection_destroy(&bebob
->out_conn
);
491 cmp_connection_destroy(&bebob
->in_conn
);
494 int snd_bebob_stream_init_duplex(struct snd_bebob
*bebob
)
498 err
= init_stream(bebob
, &bebob
->tx_stream
);
502 err
= init_stream(bebob
, &bebob
->rx_stream
);
504 destroy_stream(bebob
, &bebob
->tx_stream
);
508 err
= amdtp_domain_init(&bebob
->domain
);
510 destroy_stream(bebob
, &bebob
->tx_stream
);
511 destroy_stream(bebob
, &bebob
->rx_stream
);
517 static int keep_resources(struct snd_bebob
*bebob
, struct amdtp_stream
*stream
,
518 unsigned int rate
, unsigned int index
)
520 struct snd_bebob_stream_formation
*formation
;
521 struct cmp_connection
*conn
;
524 if (stream
== &bebob
->tx_stream
) {
525 formation
= bebob
->tx_stream_formations
+ index
;
526 conn
= &bebob
->out_conn
;
528 formation
= bebob
->rx_stream_formations
+ index
;
529 conn
= &bebob
->in_conn
;
532 err
= amdtp_am824_set_parameters(stream
, rate
, formation
->pcm
,
533 formation
->midi
, false);
537 return cmp_connection_reserve(conn
, amdtp_stream_get_max_payload(stream
));
540 int snd_bebob_stream_reserve_duplex(struct snd_bebob
*bebob
, unsigned int rate
,
541 unsigned int frames_per_period
,
542 unsigned int frames_per_buffer
)
544 unsigned int curr_rate
;
547 // Considering JACK/FFADO streaming:
548 // TODO: This can be removed hwdep functionality becomes popular.
549 err
= check_connection_used_by_others(bebob
, &bebob
->rx_stream
);
553 err
= bebob
->spec
->rate
->get(bebob
, &curr_rate
);
558 if (curr_rate
!= rate
) {
559 amdtp_domain_stop(&bebob
->domain
);
560 break_both_connections(bebob
);
562 cmp_connection_release(&bebob
->out_conn
);
563 cmp_connection_release(&bebob
->in_conn
);
566 if (bebob
->substreams_counter
== 0 || curr_rate
!= rate
) {
570 // If establishing connections at first, Yamaha GO46
571 // (and maybe Terratec X24) don't generate sound.
573 // For firmware customized by M-Audio, refer to next NOTE.
574 err
= bebob
->spec
->rate
->set(bebob
, rate
);
576 dev_err(&bebob
->unit
->device
,
577 "fail to set sampling rate: %d\n",
582 err
= get_formation_index(rate
, &index
);
586 err
= keep_resources(bebob
, &bebob
->tx_stream
, rate
, index
);
590 err
= keep_resources(bebob
, &bebob
->rx_stream
, rate
, index
);
592 cmp_connection_release(&bebob
->out_conn
);
596 err
= amdtp_domain_set_events_per_period(&bebob
->domain
,
597 frames_per_period
, frames_per_buffer
);
599 cmp_connection_release(&bebob
->out_conn
);
600 cmp_connection_release(&bebob
->in_conn
);
608 int snd_bebob_stream_start_duplex(struct snd_bebob
*bebob
)
612 // Need no substreams.
613 if (bebob
->substreams_counter
== 0)
616 // packet queueing error or detecting discontinuity
617 if (amdtp_streaming_error(&bebob
->rx_stream
) ||
618 amdtp_streaming_error(&bebob
->tx_stream
)) {
619 amdtp_domain_stop(&bebob
->domain
);
620 break_both_connections(bebob
);
623 if (!amdtp_stream_running(&bebob
->rx_stream
)) {
624 enum snd_bebob_clock_type src
;
625 struct amdtp_stream
*master
, *slave
;
626 unsigned int curr_rate
;
627 unsigned int ir_delay_cycle
;
629 if (bebob
->maudio_special_quirk
) {
630 err
= bebob
->spec
->rate
->get(bebob
, &curr_rate
);
635 err
= snd_bebob_stream_get_clock_src(bebob
, &src
);
639 if (src
!= SND_BEBOB_CLOCK_TYPE_SYT
) {
640 master
= &bebob
->tx_stream
;
641 slave
= &bebob
->rx_stream
;
643 master
= &bebob
->rx_stream
;
644 slave
= &bebob
->tx_stream
;
647 err
= start_stream(bebob
, master
);
651 err
= start_stream(bebob
, slave
);
655 // The device postpones start of transmission mostly for 1 sec
656 // after receives packets firstly. For safe, IR context starts
657 // 0.4 sec (=3200 cycles) later to version 1 or 2 firmware,
658 // 2.0 sec (=16000 cycles) for version 3 firmware. This is
659 // within 2.5 sec (=CALLBACK_TIMEOUT).
660 // Furthermore, some devices transfer isoc packets with
661 // discontinuous counter in the beginning of packet streaming.
662 // The delay has an effect to avoid detection of this
664 if (bebob
->version
< 2)
665 ir_delay_cycle
= 3200;
667 ir_delay_cycle
= 16000;
668 err
= amdtp_domain_start(&bebob
->domain
, ir_delay_cycle
);
673 // The firmware customized by M-Audio uses these commands to
674 // start transmitting stream. This is not usual way.
675 if (bebob
->maudio_special_quirk
) {
676 err
= bebob
->spec
->rate
->set(bebob
, curr_rate
);
678 dev_err(&bebob
->unit
->device
,
679 "fail to ensure sampling rate: %d\n",
685 if (!amdtp_stream_wait_callback(&bebob
->rx_stream
,
687 !amdtp_stream_wait_callback(&bebob
->tx_stream
,
696 amdtp_domain_stop(&bebob
->domain
);
697 break_both_connections(bebob
);
701 void snd_bebob_stream_stop_duplex(struct snd_bebob
*bebob
)
703 if (bebob
->substreams_counter
== 0) {
704 amdtp_domain_stop(&bebob
->domain
);
705 break_both_connections(bebob
);
707 cmp_connection_release(&bebob
->out_conn
);
708 cmp_connection_release(&bebob
->in_conn
);
713 * This function should be called before starting streams or after stopping
716 void snd_bebob_stream_destroy_duplex(struct snd_bebob
*bebob
)
718 amdtp_domain_destroy(&bebob
->domain
);
720 destroy_stream(bebob
, &bebob
->tx_stream
);
721 destroy_stream(bebob
, &bebob
->rx_stream
);
725 * See: Table 50: Extended Stream Format Info Format Hierarchy Level 2’
726 * in Additional AVC commands (Nov 2003, BridgeCo)
727 * Also 'Clause 12 AM824 sequence adaption layers' in IEC 61883-6:2005
730 parse_stream_formation(u8
*buf
, unsigned int len
,
731 struct snd_bebob_stream_formation
*formation
)
733 unsigned int i
, e
, channels
, format
;
736 * this module can support a hierarchy combination that:
737 * Root: Audio and Music (0x90)
738 * Level 1: AM824 Compound (0x40)
740 if ((buf
[0] != 0x90) || (buf
[1] != 0x40))
743 /* check sampling rate */
744 for (i
= 0; i
< ARRAY_SIZE(bridgeco_freq_table
); i
++) {
745 if (buf
[2] == bridgeco_freq_table
[i
])
748 if (i
== ARRAY_SIZE(bridgeco_freq_table
))
751 /* Avoid double count by different entries for the same rate. */
752 memset(&formation
[i
], 0, sizeof(struct snd_bebob_stream_formation
));
754 for (e
= 0; e
< buf
[4]; e
++) {
755 channels
= buf
[5 + e
* 2];
756 format
= buf
[6 + e
* 2];
759 /* IEC 60958 Conformant, currently handled as MBLA */
761 /* Multi bit linear audio */
763 formation
[i
].pcm
+= channels
;
765 /* MIDI Conformant */
767 formation
[i
].midi
+= channels
;
769 /* IEC 61937-3 to 7 */
775 /* Multi bit linear audio */
776 case 0x07: /* DVD-Audio */
777 case 0x0c: /* High Precision */
779 case 0x08: /* (Plain) Raw */
780 case 0x09: /* (Plain) SACD */
781 case 0x0a: /* (Encoded) Raw */
782 case 0x0b: /* (Encoded) SACD */
783 /* Synchronization Stream (Stereo Raw audio) */
788 return -ENOSYS
; /* not supported */
792 if (formation
[i
].pcm
> AM824_MAX_CHANNELS_FOR_PCM
||
793 formation
[i
].midi
> AM824_MAX_CHANNELS_FOR_MIDI
)
800 fill_stream_formations(struct snd_bebob
*bebob
, enum avc_bridgeco_plug_dir dir
,
804 struct snd_bebob_stream_formation
*formations
;
805 unsigned int len
, eid
;
806 u8 addr
[AVC_BRIDGECO_ADDR_BYTES
];
809 buf
= kmalloc(FORMAT_MAXIMUM_LENGTH
, GFP_KERNEL
);
813 if (dir
== AVC_BRIDGECO_PLUG_DIR_IN
)
814 formations
= bebob
->rx_stream_formations
;
816 formations
= bebob
->tx_stream_formations
;
818 for (eid
= 0; eid
< SND_BEBOB_STRM_FMT_ENTRIES
; eid
++) {
819 len
= FORMAT_MAXIMUM_LENGTH
;
820 avc_bridgeco_fill_unit_addr(addr
, dir
,
821 AVC_BRIDGECO_PLUG_UNIT_ISOC
, pid
);
822 err
= avc_bridgeco_get_plug_strm_fmt(bebob
->unit
, addr
, buf
,
824 /* No entries remained. */
825 if (err
== -EINVAL
&& eid
> 0) {
828 } else if (err
< 0) {
829 dev_err(&bebob
->unit
->device
,
830 "fail to get stream format %d for isoc %s plug %d:%d\n",
832 (dir
== AVC_BRIDGECO_PLUG_DIR_IN
) ? "in" :
838 err
= parse_stream_formation(buf
, len
, formations
);
848 seek_msu_sync_input_plug(struct snd_bebob
*bebob
)
850 u8 plugs
[AVC_PLUG_INFO_BUF_BYTES
], addr
[AVC_BRIDGECO_ADDR_BYTES
];
852 enum avc_bridgeco_plug_type type
;
855 /* Get the number of Music Sub Unit for both direction. */
856 err
= avc_general_get_plug_info(bebob
->unit
, 0x0c, 0x00, 0x00, plugs
);
858 dev_err(&bebob
->unit
->device
,
859 "fail to get info for MSU in/out plugs: %d\n",
864 /* seek destination plugs for 'MSU sync input' */
865 bebob
->sync_input_plug
= -1;
866 for (i
= 0; i
< plugs
[0]; i
++) {
867 avc_bridgeco_fill_msu_addr(addr
, AVC_BRIDGECO_PLUG_DIR_IN
, i
);
868 err
= avc_bridgeco_get_plug_type(bebob
->unit
, addr
, &type
);
870 dev_err(&bebob
->unit
->device
,
871 "fail to get type for MSU in plug %d: %d\n",
876 if (type
== AVC_BRIDGECO_PLUG_TYPE_SYNC
) {
877 bebob
->sync_input_plug
= i
;
885 int snd_bebob_stream_discover(struct snd_bebob
*bebob
)
887 const struct snd_bebob_clock_spec
*clk_spec
= bebob
->spec
->clock
;
888 u8 plugs
[AVC_PLUG_INFO_BUF_BYTES
], addr
[AVC_BRIDGECO_ADDR_BYTES
];
889 enum avc_bridgeco_plug_type type
;
893 /* the number of plugs for isoc in/out, ext in/out */
894 err
= avc_general_get_plug_info(bebob
->unit
, 0x1f, 0x07, 0x00, plugs
);
896 dev_err(&bebob
->unit
->device
,
897 "fail to get info for isoc/external in/out plugs: %d\n",
903 * This module supports at least one isoc input plug and one isoc
906 if ((plugs
[0] == 0) || (plugs
[1] == 0)) {
911 avc_bridgeco_fill_unit_addr(addr
, AVC_BRIDGECO_PLUG_DIR_IN
,
912 AVC_BRIDGECO_PLUG_UNIT_ISOC
, 0);
913 err
= avc_bridgeco_get_plug_type(bebob
->unit
, addr
, &type
);
915 dev_err(&bebob
->unit
->device
,
916 "fail to get type for isoc in plug 0: %d\n", err
);
918 } else if (type
!= AVC_BRIDGECO_PLUG_TYPE_ISOC
) {
922 err
= fill_stream_formations(bebob
, AVC_BRIDGECO_PLUG_DIR_IN
, 0);
926 avc_bridgeco_fill_unit_addr(addr
, AVC_BRIDGECO_PLUG_DIR_OUT
,
927 AVC_BRIDGECO_PLUG_UNIT_ISOC
, 0);
928 err
= avc_bridgeco_get_plug_type(bebob
->unit
, addr
, &type
);
930 dev_err(&bebob
->unit
->device
,
931 "fail to get type for isoc out plug 0: %d\n", err
);
933 } else if (type
!= AVC_BRIDGECO_PLUG_TYPE_ISOC
) {
937 err
= fill_stream_formations(bebob
, AVC_BRIDGECO_PLUG_DIR_OUT
, 0);
941 /* count external input plugs for MIDI */
942 bebob
->midi_input_ports
= 0;
943 for (i
= 0; i
< plugs
[2]; i
++) {
944 avc_bridgeco_fill_unit_addr(addr
, AVC_BRIDGECO_PLUG_DIR_IN
,
945 AVC_BRIDGECO_PLUG_UNIT_EXT
, i
);
946 err
= avc_bridgeco_get_plug_type(bebob
->unit
, addr
, &type
);
948 dev_err(&bebob
->unit
->device
,
949 "fail to get type for external in plug %d: %d\n",
952 } else if (type
== AVC_BRIDGECO_PLUG_TYPE_MIDI
) {
953 bebob
->midi_input_ports
++;
957 /* count external output plugs for MIDI */
958 bebob
->midi_output_ports
= 0;
959 for (i
= 0; i
< plugs
[3]; i
++) {
960 avc_bridgeco_fill_unit_addr(addr
, AVC_BRIDGECO_PLUG_DIR_OUT
,
961 AVC_BRIDGECO_PLUG_UNIT_EXT
, i
);
962 err
= avc_bridgeco_get_plug_type(bebob
->unit
, addr
, &type
);
964 dev_err(&bebob
->unit
->device
,
965 "fail to get type for external out plug %d: %d\n",
968 } else if (type
== AVC_BRIDGECO_PLUG_TYPE_MIDI
) {
969 bebob
->midi_output_ports
++;
973 /* for check source of clock later */
975 err
= seek_msu_sync_input_plug(bebob
);
980 void snd_bebob_stream_lock_changed(struct snd_bebob
*bebob
)
982 bebob
->dev_lock_changed
= true;
983 wake_up(&bebob
->hwdep_wait
);
986 int snd_bebob_stream_lock_try(struct snd_bebob
*bebob
)
990 spin_lock_irq(&bebob
->lock
);
992 /* user land lock this */
993 if (bebob
->dev_lock_count
< 0) {
998 /* this is the first time */
999 if (bebob
->dev_lock_count
++ == 0)
1000 snd_bebob_stream_lock_changed(bebob
);
1003 spin_unlock_irq(&bebob
->lock
);
1007 void snd_bebob_stream_lock_release(struct snd_bebob
*bebob
)
1009 spin_lock_irq(&bebob
->lock
);
1011 if (WARN_ON(bebob
->dev_lock_count
<= 0))
1013 if (--bebob
->dev_lock_count
== 0)
1014 snd_bebob_stream_lock_changed(bebob
);
1016 spin_unlock_irq(&bebob
->lock
);