aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>2016-03-07 08:35:42 -0500
committerTakashi Iwai <tiwai@suse.de>2016-03-09 10:20:56 -0500
commit8ae25b760ade9856e5a217ca4f7c3d531b312ca4 (patch)
tree5300762206afff16db7573d37996c1784808c348
parenta1ce94d03bfdfaa1ef31c1a84383105888ac5f3b (diff)
ALSA: dice: have two sets of isochronous resources/streams
Currently ALSA dice driver handles a pair of isochronous resources for IEC 61883-1/6 packet streaming. While, according to some documents about ASICs named as 'Dice', several isochronous streams are available. Here, I start to describe ASICs produced under 'Dice' name. * Dice II (designed by wavefront semiconductor, including TCAT's IP) * STD (with limited functionality of DTCP) * CP (with full functionality of DTCP) * TCD2210/2210-E (so-called 'Dice Mini') * TCD2220/2220-E (so-called 'Dice Jr.') * TCD3070-CH (so-called 'Dice III') Some documents are public and we can see hardware design of them. We can find some articles about hardware internal register definitions (not registers exported to IEEE 1394 bus). * DICE II User Guide * http://www.tctechnologies.tc/archive/downloads/dice_ii_user_guide.pdf * 6.1 AVS Audio Receivers * Table 6.1: AVS Audio Receiver Memory Map * ARX1-ARX4 * 6.2 AVS Audio Transmitters * Table 6.2: AVS Audio Transmitter Memory Map * ATX1, ATX2 * TCD22xx User Guide * http://www.tctechnologies.tc/downloads/tcd22xx_user_guide.pdf * 6.1 AVS Audio Receivers * Table 66: AVS Audio Receiver Memory Map * ARX1, ARX2 * 6/2 AVS Audio Transmitters * Table 67: AVS Audio Transmitter Memory Map * ATX1, ATX2 * DICE III * http://www.tctechnologies.tc/downloads/TCD3070-CH.pdf * Dual stream 63 channel transmitter/receiver For Dice II and TCD22xx series, maximum 16 data channels are transferred in an AMDTP packet, while for Dice III, maximum 32 data channels are transferred. According to the design of the series of these ASICs, this commit allows this driver to handle additional set of isochronous resources. For practical reason, two pair of isochronous resources are added. As of this commit, this driver still use a pair of the first isochronous resources. Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp> Signed-off-by: Takashi Iwai <tiwai@suse.de>
-rw-r--r--sound/firewire/dice/dice-midi.c8
-rw-r--r--sound/firewire/dice/dice-pcm.c34
-rw-r--r--sound/firewire/dice/dice-stream.c54
-rw-r--r--sound/firewire/dice/dice.h31
4 files changed, 79 insertions, 48 deletions
diff --git a/sound/firewire/dice/dice-midi.c b/sound/firewire/dice/dice-midi.c
index 2461311e695a..a040617505a7 100644
--- a/sound/firewire/dice/dice-midi.c
+++ b/sound/firewire/dice/dice-midi.c
@@ -52,10 +52,10 @@ static void midi_capture_trigger(struct snd_rawmidi_substream *substrm, int up)
52 spin_lock_irqsave(&dice->lock, flags); 52 spin_lock_irqsave(&dice->lock, flags);
53 53
54 if (up) 54 if (up)
55 amdtp_am824_midi_trigger(&dice->tx_stream, 55 amdtp_am824_midi_trigger(&dice->tx_stream[0],
56 substrm->number, substrm); 56 substrm->number, substrm);
57 else 57 else
58 amdtp_am824_midi_trigger(&dice->tx_stream, 58 amdtp_am824_midi_trigger(&dice->tx_stream[0],
59 substrm->number, NULL); 59 substrm->number, NULL);
60 60
61 spin_unlock_irqrestore(&dice->lock, flags); 61 spin_unlock_irqrestore(&dice->lock, flags);
@@ -69,10 +69,10 @@ static void midi_playback_trigger(struct snd_rawmidi_substream *substrm, int up)
69 spin_lock_irqsave(&dice->lock, flags); 69 spin_lock_irqsave(&dice->lock, flags);
70 70
71 if (up) 71 if (up)
72 amdtp_am824_midi_trigger(&dice->rx_stream, 72 amdtp_am824_midi_trigger(&dice->rx_stream[0],
73 substrm->number, substrm); 73 substrm->number, substrm);
74 else 74 else
75 amdtp_am824_midi_trigger(&dice->rx_stream, 75 amdtp_am824_midi_trigger(&dice->rx_stream[0],
76 substrm->number, NULL); 76 substrm->number, NULL);
77 77
78 spin_unlock_irqrestore(&dice->lock, flags); 78 spin_unlock_irqrestore(&dice->lock, flags);
diff --git a/sound/firewire/dice/dice-pcm.c b/sound/firewire/dice/dice-pcm.c
index a5c9b58655ef..e25294910736 100644
--- a/sound/firewire/dice/dice-pcm.c
+++ b/sound/firewire/dice/dice-pcm.c
@@ -22,7 +22,7 @@ static int limit_channels_and_rates(struct snd_dice *dice,
22 * Retrieve current Multi Bit Linear Audio data channel and limit to 22 * Retrieve current Multi Bit Linear Audio data channel and limit to
23 * it. 23 * it.
24 */ 24 */
25 if (stream == &dice->tx_stream) { 25 if (stream == &dice->tx_stream[0]) {
26 err = snd_dice_transaction_read_tx(dice, TX_NUMBER_AUDIO, 26 err = snd_dice_transaction_read_tx(dice, TX_NUMBER_AUDIO,
27 reg, sizeof(reg)); 27 reg, sizeof(reg));
28 } else { 28 } else {
@@ -74,10 +74,10 @@ static int init_hw_info(struct snd_dice *dice,
74 74
75 if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { 75 if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) {
76 hw->formats = AM824_IN_PCM_FORMAT_BITS; 76 hw->formats = AM824_IN_PCM_FORMAT_BITS;
77 stream = &dice->tx_stream; 77 stream = &dice->tx_stream[0];
78 } else { 78 } else {
79 hw->formats = AM824_OUT_PCM_FORMAT_BITS; 79 hw->formats = AM824_OUT_PCM_FORMAT_BITS;
80 stream = &dice->rx_stream; 80 stream = &dice->rx_stream[0];
81 } 81 }
82 82
83 err = limit_channels_and_rates(dice, runtime, stream); 83 err = limit_channels_and_rates(dice, runtime, stream);
@@ -122,6 +122,7 @@ static int capture_hw_params(struct snd_pcm_substream *substream,
122 struct snd_pcm_hw_params *hw_params) 122 struct snd_pcm_hw_params *hw_params)
123{ 123{
124 struct snd_dice *dice = substream->private_data; 124 struct snd_dice *dice = substream->private_data;
125 struct amdtp_stream *stream = &dice->tx_stream[0];
125 int err; 126 int err;
126 127
127 err = snd_pcm_lib_alloc_vmalloc_buffer(substream, 128 err = snd_pcm_lib_alloc_vmalloc_buffer(substream,
@@ -135,7 +136,7 @@ static int capture_hw_params(struct snd_pcm_substream *substream,
135 mutex_unlock(&dice->mutex); 136 mutex_unlock(&dice->mutex);
136 } 137 }
137 138
138 amdtp_am824_set_pcm_format(&dice->tx_stream, params_format(hw_params)); 139 amdtp_am824_set_pcm_format(stream, params_format(hw_params));
139 140
140 return 0; 141 return 0;
141} 142}
@@ -143,6 +144,7 @@ static int playback_hw_params(struct snd_pcm_substream *substream,
143 struct snd_pcm_hw_params *hw_params) 144 struct snd_pcm_hw_params *hw_params)
144{ 145{
145 struct snd_dice *dice = substream->private_data; 146 struct snd_dice *dice = substream->private_data;
147 struct amdtp_stream *stream = &dice->rx_stream[0];
146 int err; 148 int err;
147 149
148 err = snd_pcm_lib_alloc_vmalloc_buffer(substream, 150 err = snd_pcm_lib_alloc_vmalloc_buffer(substream,
@@ -156,7 +158,7 @@ static int playback_hw_params(struct snd_pcm_substream *substream,
156 mutex_unlock(&dice->mutex); 158 mutex_unlock(&dice->mutex);
157 } 159 }
158 160
159 amdtp_am824_set_pcm_format(&dice->rx_stream, params_format(hw_params)); 161 amdtp_am824_set_pcm_format(stream, params_format(hw_params));
160 162
161 return 0; 163 return 0;
162} 164}
@@ -196,26 +198,28 @@ static int playback_hw_free(struct snd_pcm_substream *substream)
196static int capture_prepare(struct snd_pcm_substream *substream) 198static int capture_prepare(struct snd_pcm_substream *substream)
197{ 199{
198 struct snd_dice *dice = substream->private_data; 200 struct snd_dice *dice = substream->private_data;
201 struct amdtp_stream *stream = &dice->tx_stream[0];
199 int err; 202 int err;
200 203
201 mutex_lock(&dice->mutex); 204 mutex_lock(&dice->mutex);
202 err = snd_dice_stream_start_duplex(dice, substream->runtime->rate); 205 err = snd_dice_stream_start_duplex(dice, substream->runtime->rate);
203 mutex_unlock(&dice->mutex); 206 mutex_unlock(&dice->mutex);
204 if (err >= 0) 207 if (err >= 0)
205 amdtp_stream_pcm_prepare(&dice->tx_stream); 208 amdtp_stream_pcm_prepare(stream);
206 209
207 return 0; 210 return 0;
208} 211}
209static int playback_prepare(struct snd_pcm_substream *substream) 212static int playback_prepare(struct snd_pcm_substream *substream)
210{ 213{
211 struct snd_dice *dice = substream->private_data; 214 struct snd_dice *dice = substream->private_data;
215 struct amdtp_stream *stream = &dice->rx_stream[0];
212 int err; 216 int err;
213 217
214 mutex_lock(&dice->mutex); 218 mutex_lock(&dice->mutex);
215 err = snd_dice_stream_start_duplex(dice, substream->runtime->rate); 219 err = snd_dice_stream_start_duplex(dice, substream->runtime->rate);
216 mutex_unlock(&dice->mutex); 220 mutex_unlock(&dice->mutex);
217 if (err >= 0) 221 if (err >= 0)
218 amdtp_stream_pcm_prepare(&dice->rx_stream); 222 amdtp_stream_pcm_prepare(stream);
219 223
220 return err; 224 return err;
221} 225}
@@ -223,13 +227,14 @@ static int playback_prepare(struct snd_pcm_substream *substream)
223static int capture_trigger(struct snd_pcm_substream *substream, int cmd) 227static int capture_trigger(struct snd_pcm_substream *substream, int cmd)
224{ 228{
225 struct snd_dice *dice = substream->private_data; 229 struct snd_dice *dice = substream->private_data;
230 struct amdtp_stream *stream = &dice->tx_stream[0];
226 231
227 switch (cmd) { 232 switch (cmd) {
228 case SNDRV_PCM_TRIGGER_START: 233 case SNDRV_PCM_TRIGGER_START:
229 amdtp_stream_pcm_trigger(&dice->tx_stream, substream); 234 amdtp_stream_pcm_trigger(stream, substream);
230 break; 235 break;
231 case SNDRV_PCM_TRIGGER_STOP: 236 case SNDRV_PCM_TRIGGER_STOP:
232 amdtp_stream_pcm_trigger(&dice->tx_stream, NULL); 237 amdtp_stream_pcm_trigger(stream, NULL);
233 break; 238 break;
234 default: 239 default:
235 return -EINVAL; 240 return -EINVAL;
@@ -240,13 +245,14 @@ static int capture_trigger(struct snd_pcm_substream *substream, int cmd)
240static int playback_trigger(struct snd_pcm_substream *substream, int cmd) 245static int playback_trigger(struct snd_pcm_substream *substream, int cmd)
241{ 246{
242 struct snd_dice *dice = substream->private_data; 247 struct snd_dice *dice = substream->private_data;
248 struct amdtp_stream *stream = &dice->rx_stream[0];
243 249
244 switch (cmd) { 250 switch (cmd) {
245 case SNDRV_PCM_TRIGGER_START: 251 case SNDRV_PCM_TRIGGER_START:
246 amdtp_stream_pcm_trigger(&dice->rx_stream, substream); 252 amdtp_stream_pcm_trigger(stream, substream);
247 break; 253 break;
248 case SNDRV_PCM_TRIGGER_STOP: 254 case SNDRV_PCM_TRIGGER_STOP:
249 amdtp_stream_pcm_trigger(&dice->rx_stream, NULL); 255 amdtp_stream_pcm_trigger(stream, NULL);
250 break; 256 break;
251 default: 257 default:
252 return -EINVAL; 258 return -EINVAL;
@@ -258,14 +264,16 @@ static int playback_trigger(struct snd_pcm_substream *substream, int cmd)
258static snd_pcm_uframes_t capture_pointer(struct snd_pcm_substream *substream) 264static snd_pcm_uframes_t capture_pointer(struct snd_pcm_substream *substream)
259{ 265{
260 struct snd_dice *dice = substream->private_data; 266 struct snd_dice *dice = substream->private_data;
267 struct amdtp_stream *stream = &dice->tx_stream[0];
261 268
262 return amdtp_stream_pcm_pointer(&dice->tx_stream); 269 return amdtp_stream_pcm_pointer(stream);
263} 270}
264static snd_pcm_uframes_t playback_pointer(struct snd_pcm_substream *substream) 271static snd_pcm_uframes_t playback_pointer(struct snd_pcm_substream *substream)
265{ 272{
266 struct snd_dice *dice = substream->private_data; 273 struct snd_dice *dice = substream->private_data;
274 struct amdtp_stream *stream = &dice->rx_stream[0];
267 275
268 return amdtp_stream_pcm_pointer(&dice->rx_stream); 276 return amdtp_stream_pcm_pointer(stream);
269} 277}
270 278
271int snd_dice_create_pcm(struct snd_dice *dice) 279int snd_dice_create_pcm(struct snd_dice *dice)
diff --git a/sound/firewire/dice/dice-stream.c b/sound/firewire/dice/dice-stream.c
index df035b1dd44a..15d581de5cae 100644
--- a/sound/firewire/dice/dice-stream.c
+++ b/sound/firewire/dice/dice-stream.c
@@ -72,7 +72,7 @@ static void release_resources(struct snd_dice *dice,
72 72
73 /* Reset channel number */ 73 /* Reset channel number */
74 channel = cpu_to_be32((u32)-1); 74 channel = cpu_to_be32((u32)-1);
75 if (resources == &dice->tx_resources) 75 if (resources == &dice->tx_resources[0])
76 snd_dice_transaction_write_tx(dice, TX_ISOCHRONOUS, 76 snd_dice_transaction_write_tx(dice, TX_ISOCHRONOUS,
77 &channel, sizeof(channel)); 77 &channel, sizeof(channel));
78 else 78 else
@@ -96,7 +96,7 @@ static int keep_resources(struct snd_dice *dice,
96 96
97 /* Set channel number */ 97 /* Set channel number */
98 channel = cpu_to_be32(resources->channel); 98 channel = cpu_to_be32(resources->channel);
99 if (resources == &dice->tx_resources) 99 if (resources == &dice->tx_resources[0])
100 err = snd_dice_transaction_write_tx(dice, TX_ISOCHRONOUS, 100 err = snd_dice_transaction_write_tx(dice, TX_ISOCHRONOUS,
101 &channel, sizeof(channel)); 101 &channel, sizeof(channel));
102 else 102 else
@@ -113,10 +113,10 @@ static void stop_stream(struct snd_dice *dice, struct amdtp_stream *stream)
113 amdtp_stream_pcm_abort(stream); 113 amdtp_stream_pcm_abort(stream);
114 amdtp_stream_stop(stream); 114 amdtp_stream_stop(stream);
115 115
116 if (stream == &dice->tx_stream) 116 if (stream == &dice->tx_stream[0])
117 release_resources(dice, &dice->tx_resources); 117 release_resources(dice, &dice->tx_resources[0]);
118 else 118 else
119 release_resources(dice, &dice->rx_resources); 119 release_resources(dice, &dice->rx_resources[0]);
120} 120}
121 121
122static int start_stream(struct snd_dice *dice, struct amdtp_stream *stream, 122static int start_stream(struct snd_dice *dice, struct amdtp_stream *stream,
@@ -128,12 +128,12 @@ static int start_stream(struct snd_dice *dice, struct amdtp_stream *stream,
128 bool double_pcm_frames; 128 bool double_pcm_frames;
129 int err; 129 int err;
130 130
131 if (stream == &dice->tx_stream) { 131 if (stream == &dice->tx_stream[0]) {
132 resources = &dice->tx_resources; 132 resources = &dice->tx_resources[0];
133 err = snd_dice_transaction_read_tx(dice, TX_NUMBER_AUDIO, 133 err = snd_dice_transaction_read_tx(dice, TX_NUMBER_AUDIO,
134 reg, sizeof(reg)); 134 reg, sizeof(reg));
135 } else { 135 } else {
136 resources = &dice->rx_resources; 136 resources = &dice->rx_resources[0];
137 err = snd_dice_transaction_read_rx(dice, RX_NUMBER_AUDIO, 137 err = snd_dice_transaction_read_rx(dice, RX_NUMBER_AUDIO,
138 reg, sizeof(reg)); 138 reg, sizeof(reg));
139 } 139 }
@@ -200,8 +200,8 @@ int snd_dice_stream_start_duplex(struct snd_dice *dice, unsigned int rate)
200 if (dice->substreams_counter == 0) 200 if (dice->substreams_counter == 0)
201 goto end; 201 goto end;
202 202
203 master = &dice->rx_stream; 203 master = &dice->rx_stream[0];
204 slave = &dice->tx_stream; 204 slave = &dice->tx_stream[0];
205 205
206 /* Some packet queueing errors. */ 206 /* Some packet queueing errors. */
207 if (amdtp_streaming_error(master) || amdtp_streaming_error(slave)) 207 if (amdtp_streaming_error(master) || amdtp_streaming_error(slave))
@@ -275,8 +275,8 @@ void snd_dice_stream_stop_duplex(struct snd_dice *dice)
275 275
276 snd_dice_transaction_clear_enable(dice); 276 snd_dice_transaction_clear_enable(dice);
277 277
278 stop_stream(dice, &dice->tx_stream); 278 stop_stream(dice, &dice->tx_stream[0]);
279 stop_stream(dice, &dice->rx_stream); 279 stop_stream(dice, &dice->rx_stream[0]);
280} 280}
281 281
282static int init_stream(struct snd_dice *dice, struct amdtp_stream *stream) 282static int init_stream(struct snd_dice *dice, struct amdtp_stream *stream)
@@ -285,11 +285,11 @@ static int init_stream(struct snd_dice *dice, struct amdtp_stream *stream)
285 struct fw_iso_resources *resources; 285 struct fw_iso_resources *resources;
286 enum amdtp_stream_direction dir; 286 enum amdtp_stream_direction dir;
287 287
288 if (stream == &dice->tx_stream) { 288 if (stream == &dice->tx_stream[0]) {
289 resources = &dice->tx_resources; 289 resources = &dice->tx_resources[0];
290 dir = AMDTP_IN_STREAM; 290 dir = AMDTP_IN_STREAM;
291 } else { 291 } else {
292 resources = &dice->rx_resources; 292 resources = &dice->rx_resources[0];
293 dir = AMDTP_OUT_STREAM; 293 dir = AMDTP_OUT_STREAM;
294 } 294 }
295 295
@@ -315,10 +315,10 @@ static void destroy_stream(struct snd_dice *dice, struct amdtp_stream *stream)
315{ 315{
316 struct fw_iso_resources *resources; 316 struct fw_iso_resources *resources;
317 317
318 if (stream == &dice->tx_stream) 318 if (stream == &dice->tx_stream[0])
319 resources = &dice->tx_resources; 319 resources = &dice->tx_resources[0];
320 else 320 else
321 resources = &dice->rx_resources; 321 resources = &dice->rx_resources[0];
322 322
323 amdtp_stream_destroy(stream); 323 amdtp_stream_destroy(stream);
324 fw_iso_resources_destroy(resources); 324 fw_iso_resources_destroy(resources);
@@ -330,13 +330,13 @@ int snd_dice_stream_init_duplex(struct snd_dice *dice)
330 330
331 dice->substreams_counter = 0; 331 dice->substreams_counter = 0;
332 332
333 err = init_stream(dice, &dice->tx_stream); 333 err = init_stream(dice, &dice->tx_stream[0]);
334 if (err < 0) 334 if (err < 0)
335 goto end; 335 goto end;
336 336
337 err = init_stream(dice, &dice->rx_stream); 337 err = init_stream(dice, &dice->rx_stream[0]);
338 if (err < 0) 338 if (err < 0)
339 destroy_stream(dice, &dice->tx_stream); 339 destroy_stream(dice, &dice->tx_stream[0]);
340end: 340end:
341 return err; 341 return err;
342} 342}
@@ -345,8 +345,8 @@ void snd_dice_stream_destroy_duplex(struct snd_dice *dice)
345{ 345{
346 snd_dice_transaction_clear_enable(dice); 346 snd_dice_transaction_clear_enable(dice);
347 347
348 destroy_stream(dice, &dice->tx_stream); 348 destroy_stream(dice, &dice->tx_stream[0]);
349 destroy_stream(dice, &dice->rx_stream); 349 destroy_stream(dice, &dice->rx_stream[0]);
350 350
351 dice->substreams_counter = 0; 351 dice->substreams_counter = 0;
352} 352}
@@ -363,11 +363,11 @@ void snd_dice_stream_update_duplex(struct snd_dice *dice)
363 */ 363 */
364 dice->global_enabled = false; 364 dice->global_enabled = false;
365 365
366 stop_stream(dice, &dice->rx_stream); 366 stop_stream(dice, &dice->rx_stream[0]);
367 stop_stream(dice, &dice->tx_stream); 367 stop_stream(dice, &dice->tx_stream[0]);
368 368
369 fw_iso_resources_update(&dice->rx_resources); 369 fw_iso_resources_update(&dice->rx_resources[0]);
370 fw_iso_resources_update(&dice->tx_resources); 370 fw_iso_resources_update(&dice->tx_resources[0]);
371} 371}
372 372
373static void dice_lock_changed(struct snd_dice *dice) 373static void dice_lock_changed(struct snd_dice *dice)
diff --git a/sound/firewire/dice/dice.h b/sound/firewire/dice/dice.h
index 423cdba99726..8fba87d83810 100644
--- a/sound/firewire/dice/dice.h
+++ b/sound/firewire/dice/dice.h
@@ -39,6 +39,29 @@
39#include "../lib.h" 39#include "../lib.h"
40#include "dice-interface.h" 40#include "dice-interface.h"
41 41
42/*
43 * This module support maximum 2 pairs of tx/rx isochronous streams for
44 * our convinience.
45 *
46 * In documents for ASICs called with a name of 'DICE':
47 * - ASIC for DICE II:
48 * - Maximum 2 tx and 4 rx are supported.
49 * - A packet supports maximum 16 data channels.
50 * - TCD2210/2210-E (so-called 'Dice Mini'):
51 * - Maximum 2 tx and 2 rx are supported.
52 * - A packet supports maximum 16 data channels.
53 * - TCD2220/2220-E (so-called 'Dice Jr.')
54 * - 2 tx and 2 rx are supported.
55 * - A packet supports maximum 16 data channels.
56 * - TCD3070-CH (so-called 'Dice III')
57 * - Maximum 2 tx and 2 rx are supported.
58 * - A packet supports maximum 32 data channels.
59 *
60 * For the above, MIDI conformant data channel is just on the first isochronous
61 * stream.
62 */
63#define MAX_STREAMS 2
64
42struct snd_dice { 65struct snd_dice {
43 struct snd_card *card; 66 struct snd_card *card;
44 struct fw_unit *unit; 67 struct fw_unit *unit;
@@ -67,10 +90,10 @@ struct snd_dice {
67 wait_queue_head_t hwdep_wait; 90 wait_queue_head_t hwdep_wait;
68 91
69 /* For streaming */ 92 /* For streaming */
70 struct fw_iso_resources tx_resources; 93 struct fw_iso_resources tx_resources[MAX_STREAMS];
71 struct fw_iso_resources rx_resources; 94 struct fw_iso_resources rx_resources[MAX_STREAMS];
72 struct amdtp_stream tx_stream; 95 struct amdtp_stream tx_stream[MAX_STREAMS];
73 struct amdtp_stream rx_stream; 96 struct amdtp_stream rx_stream[MAX_STREAMS];
74 bool global_enabled; 97 bool global_enabled;
75 struct completion clock_accepted; 98 struct completion clock_accepted;
76 unsigned int substreams_counter; 99 unsigned int substreams_counter;