Lines Matching refs:efw

13 init_stream(struct snd_efw *efw, struct amdtp_stream *stream)  in init_stream()  argument
20 if (stream == &efw->tx_stream) { in init_stream()
21 conn = &efw->out_conn; in init_stream()
25 conn = &efw->in_conn; in init_stream()
30 err = cmp_connection_init(conn, efw->unit, c_dir, 0); in init_stream()
34 err = amdtp_stream_init(stream, efw->unit, s_dir, CIP_BLOCKING); in init_stream()
44 stop_stream(struct snd_efw *efw, struct amdtp_stream *stream) in stop_stream() argument
49 if (stream == &efw->tx_stream) in stop_stream()
50 cmp_connection_break(&efw->out_conn); in stop_stream()
52 cmp_connection_break(&efw->in_conn); in stop_stream()
56 start_stream(struct snd_efw *efw, struct amdtp_stream *stream, in start_stream() argument
66 if (stream == &efw->tx_stream) { in start_stream()
67 conn = &efw->out_conn; in start_stream()
68 pcm_channels = efw->pcm_capture_channels[mode]; in start_stream()
69 midi_ports = efw->midi_out_ports; in start_stream()
71 conn = &efw->in_conn; in start_stream()
72 pcm_channels = efw->pcm_playback_channels[mode]; in start_stream()
73 midi_ports = efw->midi_in_ports; in start_stream()
90 stop_stream(efw, stream); in start_stream()
96 stop_stream(efw, stream); in start_stream()
108 destroy_stream(struct snd_efw *efw, struct amdtp_stream *stream) in destroy_stream() argument
112 if (stream == &efw->tx_stream) in destroy_stream()
113 conn = &efw->out_conn; in destroy_stream()
115 conn = &efw->in_conn; in destroy_stream()
118 cmp_connection_destroy(&efw->out_conn); in destroy_stream()
122 get_sync_mode(struct snd_efw *efw, enum cip_flags *sync_mode) in get_sync_mode() argument
127 err = snd_efw_command_get_clock_source(efw, &clock_source); in get_sync_mode()
139 check_connection_used_by_others(struct snd_efw *efw, struct amdtp_stream *s) in check_connection_used_by_others() argument
145 if (s == &efw->tx_stream) in check_connection_used_by_others()
146 conn = &efw->out_conn; in check_connection_used_by_others()
148 conn = &efw->in_conn; in check_connection_used_by_others()
152 dev_err(&efw->unit->device, in check_connection_used_by_others()
162 int snd_efw_stream_init_duplex(struct snd_efw *efw) in snd_efw_stream_init_duplex() argument
166 err = init_stream(efw, &efw->tx_stream); in snd_efw_stream_init_duplex()
170 efw->tx_stream.flags |= CIP_EMPTY_WITH_TAG0; in snd_efw_stream_init_duplex()
172 efw->tx_stream.flags |= CIP_DBC_IS_END_EVENT; in snd_efw_stream_init_duplex()
174 efw->tx_stream.flags |= CIP_SKIP_DBC_ZERO_CHECK; in snd_efw_stream_init_duplex()
179 if (efw->is_fireworks3 && in snd_efw_stream_init_duplex()
180 (efw->firmware_version == 0x5070000 || in snd_efw_stream_init_duplex()
181 efw->firmware_version == 0x5070300 || in snd_efw_stream_init_duplex()
182 efw->firmware_version == 0x5080000)) in snd_efw_stream_init_duplex()
183 efw->tx_stream.tx_first_dbc = 0x02; in snd_efw_stream_init_duplex()
185 if (efw->is_af9) in snd_efw_stream_init_duplex()
186 efw->tx_stream.flags |= CIP_WRONG_DBS; in snd_efw_stream_init_duplex()
188 if (efw->firmware_version == 0x5050000) in snd_efw_stream_init_duplex()
189 efw->tx_stream.tx_dbc_interval = 8; in snd_efw_stream_init_duplex()
191 err = init_stream(efw, &efw->rx_stream); in snd_efw_stream_init_duplex()
193 destroy_stream(efw, &efw->tx_stream); in snd_efw_stream_init_duplex()
198 err = snd_efw_command_set_tx_mode(efw, SND_EFW_TRANSPORT_MODE_IEC61883); in snd_efw_stream_init_duplex()
200 destroy_stream(efw, &efw->tx_stream); in snd_efw_stream_init_duplex()
201 destroy_stream(efw, &efw->rx_stream); in snd_efw_stream_init_duplex()
207 int snd_efw_stream_start_duplex(struct snd_efw *efw, unsigned int rate) in snd_efw_stream_start_duplex() argument
215 mutex_lock(&efw->mutex); in snd_efw_stream_start_duplex()
218 if ((atomic_read(&efw->playback_substreams) == 0) && in snd_efw_stream_start_duplex()
219 (atomic_read(&efw->capture_substreams) == 0)) in snd_efw_stream_start_duplex()
222 err = get_sync_mode(efw, &sync_mode); in snd_efw_stream_start_duplex()
226 master = &efw->tx_stream; in snd_efw_stream_start_duplex()
227 slave = &efw->rx_stream; in snd_efw_stream_start_duplex()
228 slave_substreams = &efw->playback_substreams; in snd_efw_stream_start_duplex()
230 master = &efw->rx_stream; in snd_efw_stream_start_duplex()
231 slave = &efw->tx_stream; in snd_efw_stream_start_duplex()
232 slave_substreams = &efw->capture_substreams; in snd_efw_stream_start_duplex()
239 err = check_connection_used_by_others(efw, master); in snd_efw_stream_start_duplex()
245 stop_stream(efw, slave); in snd_efw_stream_start_duplex()
247 stop_stream(efw, master); in snd_efw_stream_start_duplex()
250 err = snd_efw_command_get_sampling_rate(efw, &curr_rate); in snd_efw_stream_start_duplex()
256 stop_stream(efw, slave); in snd_efw_stream_start_duplex()
257 stop_stream(efw, master); in snd_efw_stream_start_duplex()
263 efw->master = master; in snd_efw_stream_start_duplex()
265 err = snd_efw_command_set_sampling_rate(efw, rate); in snd_efw_stream_start_duplex()
269 err = start_stream(efw, master, rate); in snd_efw_stream_start_duplex()
271 dev_err(&efw->unit->device, in snd_efw_stream_start_duplex()
279 err = start_stream(efw, slave, rate); in snd_efw_stream_start_duplex()
281 dev_err(&efw->unit->device, in snd_efw_stream_start_duplex()
283 stop_stream(efw, master); in snd_efw_stream_start_duplex()
287 mutex_unlock(&efw->mutex); in snd_efw_stream_start_duplex()
291 void snd_efw_stream_stop_duplex(struct snd_efw *efw) in snd_efw_stream_stop_duplex() argument
296 if (efw->master == &efw->rx_stream) { in snd_efw_stream_stop_duplex()
297 slave = &efw->tx_stream; in snd_efw_stream_stop_duplex()
298 master = &efw->rx_stream; in snd_efw_stream_stop_duplex()
299 slave_substreams = &efw->capture_substreams; in snd_efw_stream_stop_duplex()
300 master_substreams = &efw->playback_substreams; in snd_efw_stream_stop_duplex()
302 slave = &efw->rx_stream; in snd_efw_stream_stop_duplex()
303 master = &efw->tx_stream; in snd_efw_stream_stop_duplex()
304 slave_substreams = &efw->playback_substreams; in snd_efw_stream_stop_duplex()
305 master_substreams = &efw->capture_substreams; in snd_efw_stream_stop_duplex()
308 mutex_lock(&efw->mutex); in snd_efw_stream_stop_duplex()
311 stop_stream(efw, slave); in snd_efw_stream_stop_duplex()
314 stop_stream(efw, master); in snd_efw_stream_stop_duplex()
317 mutex_unlock(&efw->mutex); in snd_efw_stream_stop_duplex()
320 void snd_efw_stream_update_duplex(struct snd_efw *efw) in snd_efw_stream_update_duplex() argument
322 if ((cmp_connection_update(&efw->out_conn) < 0) || in snd_efw_stream_update_duplex()
323 (cmp_connection_update(&efw->in_conn) < 0)) { in snd_efw_stream_update_duplex()
324 mutex_lock(&efw->mutex); in snd_efw_stream_update_duplex()
325 stop_stream(efw, &efw->rx_stream); in snd_efw_stream_update_duplex()
326 stop_stream(efw, &efw->tx_stream); in snd_efw_stream_update_duplex()
327 mutex_unlock(&efw->mutex); in snd_efw_stream_update_duplex()
329 amdtp_stream_update(&efw->rx_stream); in snd_efw_stream_update_duplex()
330 amdtp_stream_update(&efw->tx_stream); in snd_efw_stream_update_duplex()
334 void snd_efw_stream_destroy_duplex(struct snd_efw *efw) in snd_efw_stream_destroy_duplex() argument
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()