Lines Matching refs:efw

11 static int init_stream(struct snd_efw *efw, struct amdtp_stream *stream)  in init_stream()  argument
18 if (stream == &efw->tx_stream) { in init_stream()
19 conn = &efw->out_conn; in init_stream()
23 conn = &efw->in_conn; in init_stream()
28 err = cmp_connection_init(conn, efw->unit, c_dir, 0); in init_stream()
32 err = amdtp_am824_init(stream, efw->unit, s_dir, CIP_BLOCKING | CIP_UNAWARE_SYT); in init_stream()
39 if (stream == &efw->tx_stream) { in init_stream()
41 efw->tx_stream.flags |= CIP_EMPTY_WITH_TAG0; in init_stream()
43 efw->tx_stream.flags |= CIP_DBC_IS_END_EVENT; in init_stream()
45 efw->tx_stream.flags |= CIP_SKIP_DBC_ZERO_CHECK; in init_stream()
48 if (efw->is_fireworks3 && in init_stream()
49 (efw->firmware_version == 0x5070000 || in init_stream()
50 efw->firmware_version == 0x5070300 || in init_stream()
51 efw->firmware_version == 0x5080000)) in init_stream()
52 efw->tx_stream.flags |= CIP_UNALIGHED_DBC; in init_stream()
55 if (efw->is_af9 || efw->firmware_version == 0x4060000) in init_stream()
56 efw->tx_stream.flags |= CIP_WRONG_DBS; in init_stream()
58 if (efw->firmware_version == 0x5050000) in init_stream()
59 efw->tx_stream.ctx_data.tx.dbc_interval = 8; in init_stream()
65 static int start_stream(struct snd_efw *efw, struct amdtp_stream *stream, in start_stream() argument
71 if (stream == &efw->tx_stream) in start_stream()
72 conn = &efw->out_conn; in start_stream()
74 conn = &efw->in_conn; in start_stream()
82 err = amdtp_domain_add_stream(&efw->domain, stream, in start_stream()
94 static void destroy_stream(struct snd_efw *efw, struct amdtp_stream *stream) in destroy_stream() argument
98 if (stream == &efw->tx_stream) in destroy_stream()
99 cmp_connection_destroy(&efw->out_conn); in destroy_stream()
101 cmp_connection_destroy(&efw->in_conn); in destroy_stream()
105 check_connection_used_by_others(struct snd_efw *efw, struct amdtp_stream *s) in check_connection_used_by_others() argument
111 if (s == &efw->tx_stream) in check_connection_used_by_others()
112 conn = &efw->out_conn; in check_connection_used_by_others()
114 conn = &efw->in_conn; in check_connection_used_by_others()
118 dev_err(&efw->unit->device, in check_connection_used_by_others()
128 int snd_efw_stream_init_duplex(struct snd_efw *efw) in snd_efw_stream_init_duplex() argument
132 err = init_stream(efw, &efw->tx_stream); in snd_efw_stream_init_duplex()
136 err = init_stream(efw, &efw->rx_stream); in snd_efw_stream_init_duplex()
138 destroy_stream(efw, &efw->tx_stream); in snd_efw_stream_init_duplex()
142 err = amdtp_domain_init(&efw->domain); in snd_efw_stream_init_duplex()
144 destroy_stream(efw, &efw->tx_stream); in snd_efw_stream_init_duplex()
145 destroy_stream(efw, &efw->rx_stream); in snd_efw_stream_init_duplex()
150 err = snd_efw_command_set_tx_mode(efw, SND_EFW_TRANSPORT_MODE_IEC61883); in snd_efw_stream_init_duplex()
152 destroy_stream(efw, &efw->tx_stream); in snd_efw_stream_init_duplex()
153 destroy_stream(efw, &efw->rx_stream); in snd_efw_stream_init_duplex()
159 static int keep_resources(struct snd_efw *efw, struct amdtp_stream *stream, in keep_resources() argument
167 if (stream == &efw->tx_stream) { in keep_resources()
168 pcm_channels = efw->pcm_capture_channels[mode]; in keep_resources()
169 midi_ports = efw->midi_out_ports; in keep_resources()
170 conn = &efw->out_conn; in keep_resources()
172 pcm_channels = efw->pcm_playback_channels[mode]; in keep_resources()
173 midi_ports = efw->midi_in_ports; in keep_resources()
174 conn = &efw->in_conn; in keep_resources()
185 int snd_efw_stream_reserve_duplex(struct snd_efw *efw, unsigned int rate, in snd_efw_stream_reserve_duplex() argument
194 err = check_connection_used_by_others(efw, &efw->rx_stream); in snd_efw_stream_reserve_duplex()
199 err = snd_efw_command_get_sampling_rate(efw, &curr_rate); in snd_efw_stream_reserve_duplex()
205 amdtp_domain_stop(&efw->domain); in snd_efw_stream_reserve_duplex()
207 cmp_connection_break(&efw->out_conn); in snd_efw_stream_reserve_duplex()
208 cmp_connection_break(&efw->in_conn); in snd_efw_stream_reserve_duplex()
210 cmp_connection_release(&efw->out_conn); in snd_efw_stream_reserve_duplex()
211 cmp_connection_release(&efw->in_conn); in snd_efw_stream_reserve_duplex()
214 if (efw->substreams_counter == 0 || rate != curr_rate) { in snd_efw_stream_reserve_duplex()
217 err = snd_efw_command_set_sampling_rate(efw, rate); in snd_efw_stream_reserve_duplex()
225 err = keep_resources(efw, &efw->tx_stream, rate, mode); in snd_efw_stream_reserve_duplex()
229 err = keep_resources(efw, &efw->rx_stream, rate, mode); in snd_efw_stream_reserve_duplex()
231 cmp_connection_release(&efw->in_conn); in snd_efw_stream_reserve_duplex()
235 err = amdtp_domain_set_events_per_period(&efw->domain, in snd_efw_stream_reserve_duplex()
238 cmp_connection_release(&efw->in_conn); in snd_efw_stream_reserve_duplex()
239 cmp_connection_release(&efw->out_conn); in snd_efw_stream_reserve_duplex()
247 int snd_efw_stream_start_duplex(struct snd_efw *efw) in snd_efw_stream_start_duplex() argument
253 if (efw->substreams_counter == 0) in snd_efw_stream_start_duplex()
256 if (amdtp_streaming_error(&efw->rx_stream) || in snd_efw_stream_start_duplex()
257 amdtp_streaming_error(&efw->tx_stream)) { in snd_efw_stream_start_duplex()
258 amdtp_domain_stop(&efw->domain); in snd_efw_stream_start_duplex()
259 cmp_connection_break(&efw->out_conn); in snd_efw_stream_start_duplex()
260 cmp_connection_break(&efw->in_conn); in snd_efw_stream_start_duplex()
263 err = snd_efw_command_get_sampling_rate(efw, &rate); in snd_efw_stream_start_duplex()
267 if (!amdtp_stream_running(&efw->rx_stream)) { in snd_efw_stream_start_duplex()
272 if (efw->is_fireworks3 && !efw->is_af9) in snd_efw_stream_start_duplex()
277 err = start_stream(efw, &efw->rx_stream, rate); in snd_efw_stream_start_duplex()
281 err = start_stream(efw, &efw->tx_stream, rate); in snd_efw_stream_start_duplex()
288 err = amdtp_domain_start(&efw->domain, tx_init_skip_cycles, true, false); in snd_efw_stream_start_duplex()
292 if (!amdtp_domain_wait_ready(&efw->domain, READY_TIMEOUT_MS)) { in snd_efw_stream_start_duplex()
300 amdtp_domain_stop(&efw->domain); in snd_efw_stream_start_duplex()
302 cmp_connection_break(&efw->out_conn); in snd_efw_stream_start_duplex()
303 cmp_connection_break(&efw->in_conn); in snd_efw_stream_start_duplex()
308 void snd_efw_stream_stop_duplex(struct snd_efw *efw) in snd_efw_stream_stop_duplex() argument
310 if (efw->substreams_counter == 0) { in snd_efw_stream_stop_duplex()
311 amdtp_domain_stop(&efw->domain); in snd_efw_stream_stop_duplex()
313 cmp_connection_break(&efw->out_conn); in snd_efw_stream_stop_duplex()
314 cmp_connection_break(&efw->in_conn); in snd_efw_stream_stop_duplex()
316 cmp_connection_release(&efw->out_conn); in snd_efw_stream_stop_duplex()
317 cmp_connection_release(&efw->in_conn); in snd_efw_stream_stop_duplex()
321 void snd_efw_stream_update_duplex(struct snd_efw *efw) in snd_efw_stream_update_duplex() argument
323 amdtp_domain_stop(&efw->domain); in snd_efw_stream_update_duplex()
325 cmp_connection_break(&efw->out_conn); in snd_efw_stream_update_duplex()
326 cmp_connection_break(&efw->in_conn); in snd_efw_stream_update_duplex()
328 amdtp_stream_pcm_abort(&efw->rx_stream); in snd_efw_stream_update_duplex()
329 amdtp_stream_pcm_abort(&efw->tx_stream); in snd_efw_stream_update_duplex()
332 void snd_efw_stream_destroy_duplex(struct snd_efw *efw) in snd_efw_stream_destroy_duplex() argument
334 amdtp_domain_destroy(&efw->domain); in snd_efw_stream_destroy_duplex()
336 destroy_stream(efw, &efw->rx_stream); in snd_efw_stream_destroy_duplex()
337 destroy_stream(efw, &efw->tx_stream); in snd_efw_stream_destroy_duplex()
340 void snd_efw_stream_lock_changed(struct snd_efw *efw) in snd_efw_stream_lock_changed() argument
342 efw->dev_lock_changed = true; in snd_efw_stream_lock_changed()
343 wake_up(&efw->hwdep_wait); in snd_efw_stream_lock_changed()
346 int snd_efw_stream_lock_try(struct snd_efw *efw) in snd_efw_stream_lock_try() argument
350 spin_lock_irq(&efw->lock); in snd_efw_stream_lock_try()
353 if (efw->dev_lock_count < 0) { in snd_efw_stream_lock_try()
359 if (efw->dev_lock_count++ == 0) in snd_efw_stream_lock_try()
360 snd_efw_stream_lock_changed(efw); in snd_efw_stream_lock_try()
363 spin_unlock_irq(&efw->lock); in snd_efw_stream_lock_try()
367 void snd_efw_stream_lock_release(struct snd_efw *efw) in snd_efw_stream_lock_release() argument
369 spin_lock_irq(&efw->lock); in snd_efw_stream_lock_release()
371 if (WARN_ON(efw->dev_lock_count <= 0)) in snd_efw_stream_lock_release()
373 if (--efw->dev_lock_count == 0) in snd_efw_stream_lock_release()
374 snd_efw_stream_lock_changed(efw); in snd_efw_stream_lock_release()
376 spin_unlock_irq(&efw->lock); in snd_efw_stream_lock_release()