Lines Matching refs:tscm
17 static int get_clock(struct snd_tscm *tscm, u32 *data) in get_clock() argument
24 err = snd_fw_transaction(tscm->unit, TCODE_READ_QUADLET_REQUEST, in get_clock()
45 static int set_clock(struct snd_tscm *tscm, unsigned int rate, in set_clock() argument
52 err = get_clock(tscm, &data); in set_clock()
82 err = snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST, in set_clock()
93 return snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST, in set_clock()
98 int snd_tscm_stream_get_rate(struct snd_tscm *tscm, unsigned int *rate) in snd_tscm_stream_get_rate() argument
103 err = get_clock(tscm, &data); in snd_tscm_stream_get_rate()
126 int snd_tscm_stream_get_clock(struct snd_tscm *tscm, enum snd_tscm_clock *clock) in snd_tscm_stream_get_clock() argument
131 err = get_clock(tscm, &data); in snd_tscm_stream_get_clock()
142 static int enable_data_channels(struct snd_tscm *tscm) in enable_data_channels() argument
150 for (i = 0; i < tscm->spec->pcm_capture_analog_channels; ++i) in enable_data_channels()
152 if (tscm->spec->has_adat) in enable_data_channels()
154 if (tscm->spec->has_spdif) in enable_data_channels()
158 err = snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST, in enable_data_channels()
165 for (i = 0; i < tscm->spec->pcm_playback_analog_channels; ++i) in enable_data_channels()
167 if (tscm->spec->has_adat) in enable_data_channels()
169 if (tscm->spec->has_spdif) in enable_data_channels()
173 return snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST, in enable_data_channels()
178 static int set_stream_formats(struct snd_tscm *tscm, unsigned int rate) in set_stream_formats() argument
185 err = snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST, in set_stream_formats()
191 err = enable_data_channels(tscm); in set_stream_formats()
195 return set_clock(tscm, rate, INT_MAX); in set_stream_formats()
198 static void finish_session(struct snd_tscm *tscm) in finish_session() argument
203 snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST, in finish_session()
208 snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST, in finish_session()
214 static int begin_session(struct snd_tscm *tscm) in begin_session() argument
220 err = snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST, in begin_session()
227 err = snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST, in begin_session()
235 err = snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST, in begin_session()
243 return snd_fw_transaction(tscm->unit, in begin_session()
249 static void release_resources(struct snd_tscm *tscm) in release_resources() argument
255 snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST, in release_resources()
259 snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST, in release_resources()
263 snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST, in release_resources()
268 fw_iso_resources_free(&tscm->tx_resources); in release_resources()
269 fw_iso_resources_free(&tscm->rx_resources); in release_resources()
272 static int keep_resources(struct snd_tscm *tscm, unsigned int rate) in keep_resources() argument
278 err = amdtp_tscm_set_parameters(&tscm->tx_stream, rate); in keep_resources()
281 err = fw_iso_resources_allocate(&tscm->tx_resources, in keep_resources()
282 amdtp_stream_get_max_payload(&tscm->tx_stream), in keep_resources()
283 fw_parent_device(tscm->unit)->max_speed); in keep_resources()
288 err = amdtp_tscm_set_parameters(&tscm->rx_stream, rate); in keep_resources()
291 err = fw_iso_resources_allocate(&tscm->rx_resources, in keep_resources()
292 amdtp_stream_get_max_payload(&tscm->rx_stream), in keep_resources()
293 fw_parent_device(tscm->unit)->max_speed); in keep_resources()
298 reg = cpu_to_be32(tscm->tx_resources.channel); in keep_resources()
299 err = snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST, in keep_resources()
307 err = snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST, in keep_resources()
314 reg = cpu_to_be32(tscm->rx_resources.channel); in keep_resources()
315 err = snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST, in keep_resources()
323 release_resources(tscm); in keep_resources()
327 int snd_tscm_stream_init_duplex(struct snd_tscm *tscm) in snd_tscm_stream_init_duplex() argument
333 err = fw_iso_resources_init(&tscm->rx_resources, tscm->unit); in snd_tscm_stream_init_duplex()
336 pcm_channels = tscm->spec->pcm_playback_analog_channels; in snd_tscm_stream_init_duplex()
337 if (tscm->spec->has_adat) in snd_tscm_stream_init_duplex()
339 if (tscm->spec->has_spdif) in snd_tscm_stream_init_duplex()
341 err = amdtp_tscm_init(&tscm->rx_stream, tscm->unit, AMDTP_OUT_STREAM, in snd_tscm_stream_init_duplex()
347 err = fw_iso_resources_init(&tscm->tx_resources, tscm->unit); in snd_tscm_stream_init_duplex()
350 pcm_channels = tscm->spec->pcm_capture_analog_channels; in snd_tscm_stream_init_duplex()
351 if (tscm->spec->has_adat) in snd_tscm_stream_init_duplex()
353 if (tscm->spec->has_spdif) in snd_tscm_stream_init_duplex()
355 err = amdtp_tscm_init(&tscm->tx_stream, tscm->unit, AMDTP_IN_STREAM, in snd_tscm_stream_init_duplex()
358 amdtp_stream_destroy(&tscm->rx_stream); in snd_tscm_stream_init_duplex()
364 void snd_tscm_stream_update_duplex(struct snd_tscm *tscm) in snd_tscm_stream_update_duplex() argument
366 amdtp_stream_pcm_abort(&tscm->tx_stream); in snd_tscm_stream_update_duplex()
367 amdtp_stream_stop(&tscm->tx_stream); in snd_tscm_stream_update_duplex()
369 amdtp_stream_pcm_abort(&tscm->rx_stream); in snd_tscm_stream_update_duplex()
370 amdtp_stream_stop(&tscm->rx_stream); in snd_tscm_stream_update_duplex()
377 void snd_tscm_stream_destroy_duplex(struct snd_tscm *tscm) in snd_tscm_stream_destroy_duplex() argument
379 amdtp_stream_destroy(&tscm->rx_stream); in snd_tscm_stream_destroy_duplex()
380 amdtp_stream_destroy(&tscm->tx_stream); in snd_tscm_stream_destroy_duplex()
382 fw_iso_resources_destroy(&tscm->rx_resources); in snd_tscm_stream_destroy_duplex()
383 fw_iso_resources_destroy(&tscm->tx_resources); in snd_tscm_stream_destroy_duplex()
386 int snd_tscm_stream_start_duplex(struct snd_tscm *tscm, unsigned int rate) in snd_tscm_stream_start_duplex() argument
391 if (tscm->substreams_counter == 0) in snd_tscm_stream_start_duplex()
394 err = snd_tscm_stream_get_rate(tscm, &curr_rate); in snd_tscm_stream_start_duplex()
398 amdtp_streaming_error(&tscm->tx_stream) || in snd_tscm_stream_start_duplex()
399 amdtp_streaming_error(&tscm->rx_stream)) { in snd_tscm_stream_start_duplex()
400 finish_session(tscm); in snd_tscm_stream_start_duplex()
402 amdtp_stream_stop(&tscm->tx_stream); in snd_tscm_stream_start_duplex()
403 amdtp_stream_stop(&tscm->rx_stream); in snd_tscm_stream_start_duplex()
405 release_resources(tscm); in snd_tscm_stream_start_duplex()
408 if (!amdtp_stream_running(&tscm->tx_stream)) { in snd_tscm_stream_start_duplex()
410 &tscm->tx_stream, &tscm->rx_stream); in snd_tscm_stream_start_duplex()
411 err = keep_resources(tscm, rate); in snd_tscm_stream_start_duplex()
415 err = set_stream_formats(tscm, rate); in snd_tscm_stream_start_duplex()
419 err = begin_session(tscm); in snd_tscm_stream_start_duplex()
423 err = amdtp_stream_start(&tscm->tx_stream, in snd_tscm_stream_start_duplex()
424 tscm->tx_resources.channel, in snd_tscm_stream_start_duplex()
425 fw_parent_device(tscm->unit)->max_speed); in snd_tscm_stream_start_duplex()
429 if (!amdtp_stream_wait_callback(&tscm->tx_stream, in snd_tscm_stream_start_duplex()
436 if (!amdtp_stream_running(&tscm->rx_stream)) { in snd_tscm_stream_start_duplex()
437 err = amdtp_stream_start(&tscm->rx_stream, in snd_tscm_stream_start_duplex()
438 tscm->rx_resources.channel, in snd_tscm_stream_start_duplex()
439 fw_parent_device(tscm->unit)->max_speed); in snd_tscm_stream_start_duplex()
443 if (!amdtp_stream_wait_callback(&tscm->rx_stream, in snd_tscm_stream_start_duplex()
452 amdtp_stream_stop(&tscm->tx_stream); in snd_tscm_stream_start_duplex()
453 amdtp_stream_stop(&tscm->rx_stream); in snd_tscm_stream_start_duplex()
455 finish_session(tscm); in snd_tscm_stream_start_duplex()
456 release_resources(tscm); in snd_tscm_stream_start_duplex()
461 void snd_tscm_stream_stop_duplex(struct snd_tscm *tscm) in snd_tscm_stream_stop_duplex() argument
463 if (tscm->substreams_counter > 0) in snd_tscm_stream_stop_duplex()
466 amdtp_stream_stop(&tscm->tx_stream); in snd_tscm_stream_stop_duplex()
467 amdtp_stream_stop(&tscm->rx_stream); in snd_tscm_stream_stop_duplex()
469 finish_session(tscm); in snd_tscm_stream_stop_duplex()
470 release_resources(tscm); in snd_tscm_stream_stop_duplex()
473 void snd_tscm_stream_lock_changed(struct snd_tscm *tscm) in snd_tscm_stream_lock_changed() argument
475 tscm->dev_lock_changed = true; in snd_tscm_stream_lock_changed()
476 wake_up(&tscm->hwdep_wait); in snd_tscm_stream_lock_changed()
479 int snd_tscm_stream_lock_try(struct snd_tscm *tscm) in snd_tscm_stream_lock_try() argument
483 spin_lock_irq(&tscm->lock); in snd_tscm_stream_lock_try()
486 if (tscm->dev_lock_count < 0) { in snd_tscm_stream_lock_try()
492 if (tscm->dev_lock_count++ == 0) in snd_tscm_stream_lock_try()
493 snd_tscm_stream_lock_changed(tscm); in snd_tscm_stream_lock_try()
496 spin_unlock_irq(&tscm->lock); in snd_tscm_stream_lock_try()
500 void snd_tscm_stream_lock_release(struct snd_tscm *tscm) in snd_tscm_stream_lock_release() argument
502 spin_lock_irq(&tscm->lock); in snd_tscm_stream_lock_release()
504 if (WARN_ON(tscm->dev_lock_count <= 0)) in snd_tscm_stream_lock_release()
506 if (--tscm->dev_lock_count == 0) in snd_tscm_stream_lock_release()
507 snd_tscm_stream_lock_changed(tscm); in snd_tscm_stream_lock_release()
509 spin_unlock_irq(&tscm->lock); in snd_tscm_stream_lock_release()