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_am824_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()
92 stop_stream(efw, stream); in start_stream()
98 stop_stream(efw, stream); in start_stream()
110 destroy_stream(struct snd_efw *efw, struct amdtp_stream *stream) in destroy_stream() argument
114 if (stream == &efw->tx_stream) in destroy_stream()
115 conn = &efw->out_conn; in destroy_stream()
117 conn = &efw->in_conn; in destroy_stream()
120 cmp_connection_destroy(&efw->out_conn); in destroy_stream()
124 get_sync_mode(struct snd_efw *efw, enum cip_flags *sync_mode) in get_sync_mode() argument
129 err = snd_efw_command_get_clock_source(efw, &clock_source); in get_sync_mode()
141 check_connection_used_by_others(struct snd_efw *efw, struct amdtp_stream *s) in check_connection_used_by_others() argument
147 if (s == &efw->tx_stream) in check_connection_used_by_others()
148 conn = &efw->out_conn; in check_connection_used_by_others()
150 conn = &efw->in_conn; in check_connection_used_by_others()
154 dev_err(&efw->unit->device, in check_connection_used_by_others()
164 int snd_efw_stream_init_duplex(struct snd_efw *efw) in snd_efw_stream_init_duplex() argument
168 err = init_stream(efw, &efw->tx_stream); in snd_efw_stream_init_duplex()
172 efw->tx_stream.flags |= CIP_EMPTY_WITH_TAG0; in snd_efw_stream_init_duplex()
174 efw->tx_stream.flags |= CIP_DBC_IS_END_EVENT; in snd_efw_stream_init_duplex()
176 efw->tx_stream.flags |= CIP_SKIP_DBC_ZERO_CHECK; in snd_efw_stream_init_duplex()
181 if (efw->is_fireworks3 && in snd_efw_stream_init_duplex()
182 (efw->firmware_version == 0x5070000 || in snd_efw_stream_init_duplex()
183 efw->firmware_version == 0x5070300 || in snd_efw_stream_init_duplex()
184 efw->firmware_version == 0x5080000)) in snd_efw_stream_init_duplex()
185 efw->tx_stream.tx_first_dbc = 0x02; in snd_efw_stream_init_duplex()
187 if (efw->is_af9) in snd_efw_stream_init_duplex()
188 efw->tx_stream.flags |= CIP_WRONG_DBS; in snd_efw_stream_init_duplex()
190 if (efw->firmware_version == 0x5050000) in snd_efw_stream_init_duplex()
191 efw->tx_stream.tx_dbc_interval = 8; in snd_efw_stream_init_duplex()
193 err = init_stream(efw, &efw->rx_stream); in snd_efw_stream_init_duplex()
195 destroy_stream(efw, &efw->tx_stream); in snd_efw_stream_init_duplex()
200 err = snd_efw_command_set_tx_mode(efw, SND_EFW_TRANSPORT_MODE_IEC61883); in snd_efw_stream_init_duplex()
202 destroy_stream(efw, &efw->tx_stream); in snd_efw_stream_init_duplex()
203 destroy_stream(efw, &efw->rx_stream); in snd_efw_stream_init_duplex()
209 int snd_efw_stream_start_duplex(struct snd_efw *efw, unsigned int rate) in snd_efw_stream_start_duplex() argument
217 mutex_lock(&efw->mutex); in snd_efw_stream_start_duplex()
220 if ((atomic_read(&efw->playback_substreams) == 0) && in snd_efw_stream_start_duplex()
221 (atomic_read(&efw->capture_substreams) == 0)) in snd_efw_stream_start_duplex()
224 err = get_sync_mode(efw, &sync_mode); in snd_efw_stream_start_duplex()
228 master = &efw->tx_stream; in snd_efw_stream_start_duplex()
229 slave = &efw->rx_stream; in snd_efw_stream_start_duplex()
230 slave_substreams = &efw->playback_substreams; in snd_efw_stream_start_duplex()
232 master = &efw->rx_stream; in snd_efw_stream_start_duplex()
233 slave = &efw->tx_stream; in snd_efw_stream_start_duplex()
234 slave_substreams = &efw->capture_substreams; in snd_efw_stream_start_duplex()
241 err = check_connection_used_by_others(efw, master); in snd_efw_stream_start_duplex()
247 stop_stream(efw, slave); in snd_efw_stream_start_duplex()
249 stop_stream(efw, master); in snd_efw_stream_start_duplex()
252 err = snd_efw_command_get_sampling_rate(efw, &curr_rate); in snd_efw_stream_start_duplex()
258 stop_stream(efw, slave); in snd_efw_stream_start_duplex()
259 stop_stream(efw, master); in snd_efw_stream_start_duplex()
265 efw->master = master; in snd_efw_stream_start_duplex()
267 err = snd_efw_command_set_sampling_rate(efw, rate); in snd_efw_stream_start_duplex()
271 err = start_stream(efw, master, rate); in snd_efw_stream_start_duplex()
273 dev_err(&efw->unit->device, in snd_efw_stream_start_duplex()
281 err = start_stream(efw, slave, rate); in snd_efw_stream_start_duplex()
283 dev_err(&efw->unit->device, in snd_efw_stream_start_duplex()
285 stop_stream(efw, master); in snd_efw_stream_start_duplex()
289 mutex_unlock(&efw->mutex); in snd_efw_stream_start_duplex()
293 void snd_efw_stream_stop_duplex(struct snd_efw *efw) in snd_efw_stream_stop_duplex() argument
298 if (efw->master == &efw->rx_stream) { in snd_efw_stream_stop_duplex()
299 slave = &efw->tx_stream; in snd_efw_stream_stop_duplex()
300 master = &efw->rx_stream; in snd_efw_stream_stop_duplex()
301 slave_substreams = &efw->capture_substreams; in snd_efw_stream_stop_duplex()
302 master_substreams = &efw->playback_substreams; in snd_efw_stream_stop_duplex()
304 slave = &efw->rx_stream; in snd_efw_stream_stop_duplex()
305 master = &efw->tx_stream; in snd_efw_stream_stop_duplex()
306 slave_substreams = &efw->playback_substreams; in snd_efw_stream_stop_duplex()
307 master_substreams = &efw->capture_substreams; in snd_efw_stream_stop_duplex()
310 mutex_lock(&efw->mutex); in snd_efw_stream_stop_duplex()
313 stop_stream(efw, slave); in snd_efw_stream_stop_duplex()
316 stop_stream(efw, master); in snd_efw_stream_stop_duplex()
319 mutex_unlock(&efw->mutex); in snd_efw_stream_stop_duplex()
322 void snd_efw_stream_update_duplex(struct snd_efw *efw) in snd_efw_stream_update_duplex() argument
324 if ((cmp_connection_update(&efw->out_conn) < 0) || in snd_efw_stream_update_duplex()
325 (cmp_connection_update(&efw->in_conn) < 0)) { in snd_efw_stream_update_duplex()
326 mutex_lock(&efw->mutex); in snd_efw_stream_update_duplex()
327 stop_stream(efw, &efw->rx_stream); in snd_efw_stream_update_duplex()
328 stop_stream(efw, &efw->tx_stream); in snd_efw_stream_update_duplex()
329 mutex_unlock(&efw->mutex); in snd_efw_stream_update_duplex()
331 amdtp_stream_update(&efw->rx_stream); in snd_efw_stream_update_duplex()
332 amdtp_stream_update(&efw->tx_stream); in snd_efw_stream_update_duplex()
336 void snd_efw_stream_destroy_duplex(struct snd_efw *efw) in snd_efw_stream_destroy_duplex() argument
338 destroy_stream(efw, &efw->rx_stream); in snd_efw_stream_destroy_duplex()
339 destroy_stream(efw, &efw->tx_stream); in snd_efw_stream_destroy_duplex()
342 void snd_efw_stream_lock_changed(struct snd_efw *efw) in snd_efw_stream_lock_changed() argument
344 efw->dev_lock_changed = true; in snd_efw_stream_lock_changed()
345 wake_up(&efw->hwdep_wait); in snd_efw_stream_lock_changed()
348 int snd_efw_stream_lock_try(struct snd_efw *efw) in snd_efw_stream_lock_try() argument
352 spin_lock_irq(&efw->lock); in snd_efw_stream_lock_try()
355 if (efw->dev_lock_count < 0) { in snd_efw_stream_lock_try()
361 if (efw->dev_lock_count++ == 0) in snd_efw_stream_lock_try()
362 snd_efw_stream_lock_changed(efw); in snd_efw_stream_lock_try()
365 spin_unlock_irq(&efw->lock); in snd_efw_stream_lock_try()
369 void snd_efw_stream_lock_release(struct snd_efw *efw) in snd_efw_stream_lock_release() argument
371 spin_lock_irq(&efw->lock); in snd_efw_stream_lock_release()
373 if (WARN_ON(efw->dev_lock_count <= 0)) in snd_efw_stream_lock_release()
375 if (--efw->dev_lock_count == 0) in snd_efw_stream_lock_release()
376 snd_efw_stream_lock_changed(efw); in snd_efw_stream_lock_release()
378 spin_unlock_irq(&efw->lock); in snd_efw_stream_lock_release()