Lines Matching refs:tscm

14 static int get_clock(struct snd_tscm *tscm, u32 *data)  in get_clock()  argument
19 err = snd_fw_transaction(tscm->unit, TCODE_READ_QUADLET_REQUEST, in get_clock()
28 static int set_clock(struct snd_tscm *tscm, unsigned int rate, in set_clock() argument
35 err = get_clock(tscm, &data); in set_clock()
65 err = snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST, in set_clock()
76 return snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST, in set_clock()
81 int snd_tscm_stream_get_rate(struct snd_tscm *tscm, unsigned int *rate) in snd_tscm_stream_get_rate() argument
88 err = get_clock(tscm, &data); in snd_tscm_stream_get_rate()
112 int snd_tscm_stream_get_clock(struct snd_tscm *tscm, enum snd_tscm_clock *clock) in snd_tscm_stream_get_clock() argument
117 err = get_clock(tscm, &data); in snd_tscm_stream_get_clock()
128 static int enable_data_channels(struct snd_tscm *tscm) in enable_data_channels() argument
136 for (i = 0; i < tscm->spec->pcm_capture_analog_channels; ++i) in enable_data_channels()
138 if (tscm->spec->has_adat) in enable_data_channels()
140 if (tscm->spec->has_spdif) in enable_data_channels()
144 err = snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST, in enable_data_channels()
151 for (i = 0; i < tscm->spec->pcm_playback_analog_channels; ++i) in enable_data_channels()
153 if (tscm->spec->has_adat) in enable_data_channels()
155 if (tscm->spec->has_spdif) in enable_data_channels()
159 return snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST, in enable_data_channels()
164 static int set_stream_formats(struct snd_tscm *tscm, unsigned int rate) in set_stream_formats() argument
171 err = snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST, in set_stream_formats()
177 err = enable_data_channels(tscm); in set_stream_formats()
181 return set_clock(tscm, rate, INT_MAX); in set_stream_formats()
184 static void finish_session(struct snd_tscm *tscm) in finish_session() argument
189 snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST, in finish_session()
194 snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST, in finish_session()
200 static int begin_session(struct snd_tscm *tscm) in begin_session() argument
206 err = snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST, in begin_session()
213 err = snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST, in begin_session()
221 err = snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST, in begin_session()
229 return snd_fw_transaction(tscm->unit, in begin_session()
235 static void release_resources(struct snd_tscm *tscm) in release_resources() argument
241 snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST, in release_resources()
245 snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST, in release_resources()
249 snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST, in release_resources()
254 fw_iso_resources_free(&tscm->tx_resources); in release_resources()
255 fw_iso_resources_free(&tscm->rx_resources); in release_resources()
258 static int keep_resources(struct snd_tscm *tscm, unsigned int rate) in keep_resources() argument
264 err = amdtp_tscm_set_parameters(&tscm->tx_stream, rate); in keep_resources()
267 err = fw_iso_resources_allocate(&tscm->tx_resources, in keep_resources()
268 amdtp_stream_get_max_payload(&tscm->tx_stream), in keep_resources()
269 fw_parent_device(tscm->unit)->max_speed); in keep_resources()
274 err = amdtp_tscm_set_parameters(&tscm->rx_stream, rate); in keep_resources()
277 err = fw_iso_resources_allocate(&tscm->rx_resources, in keep_resources()
278 amdtp_stream_get_max_payload(&tscm->rx_stream), in keep_resources()
279 fw_parent_device(tscm->unit)->max_speed); in keep_resources()
284 reg = cpu_to_be32(tscm->tx_resources.channel); in keep_resources()
285 err = snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST, in keep_resources()
293 err = snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST, in keep_resources()
300 reg = cpu_to_be32(tscm->rx_resources.channel); in keep_resources()
301 err = snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST, in keep_resources()
309 release_resources(tscm); in keep_resources()
313 int snd_tscm_stream_init_duplex(struct snd_tscm *tscm) in snd_tscm_stream_init_duplex() argument
319 err = fw_iso_resources_init(&tscm->rx_resources, tscm->unit); in snd_tscm_stream_init_duplex()
322 pcm_channels = tscm->spec->pcm_playback_analog_channels; in snd_tscm_stream_init_duplex()
323 if (tscm->spec->has_adat) in snd_tscm_stream_init_duplex()
325 if (tscm->spec->has_spdif) in snd_tscm_stream_init_duplex()
327 err = amdtp_tscm_init(&tscm->rx_stream, tscm->unit, AMDTP_OUT_STREAM, in snd_tscm_stream_init_duplex()
333 err = fw_iso_resources_init(&tscm->tx_resources, tscm->unit); in snd_tscm_stream_init_duplex()
336 pcm_channels = tscm->spec->pcm_capture_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->tx_stream, tscm->unit, AMDTP_IN_STREAM, in snd_tscm_stream_init_duplex()
344 amdtp_stream_destroy(&tscm->rx_stream); in snd_tscm_stream_init_duplex()
350 void snd_tscm_stream_update_duplex(struct snd_tscm *tscm) in snd_tscm_stream_update_duplex() argument
352 amdtp_stream_pcm_abort(&tscm->tx_stream); in snd_tscm_stream_update_duplex()
353 amdtp_stream_stop(&tscm->tx_stream); in snd_tscm_stream_update_duplex()
355 amdtp_stream_pcm_abort(&tscm->rx_stream); in snd_tscm_stream_update_duplex()
356 amdtp_stream_stop(&tscm->rx_stream); in snd_tscm_stream_update_duplex()
363 void snd_tscm_stream_destroy_duplex(struct snd_tscm *tscm) in snd_tscm_stream_destroy_duplex() argument
365 amdtp_stream_destroy(&tscm->rx_stream); in snd_tscm_stream_destroy_duplex()
366 amdtp_stream_destroy(&tscm->tx_stream); in snd_tscm_stream_destroy_duplex()
368 fw_iso_resources_destroy(&tscm->rx_resources); in snd_tscm_stream_destroy_duplex()
369 fw_iso_resources_destroy(&tscm->tx_resources); in snd_tscm_stream_destroy_duplex()
372 int snd_tscm_stream_start_duplex(struct snd_tscm *tscm, unsigned int rate) in snd_tscm_stream_start_duplex() argument
377 if (tscm->substreams_counter == 0) in snd_tscm_stream_start_duplex()
380 err = snd_tscm_stream_get_rate(tscm, &curr_rate); in snd_tscm_stream_start_duplex()
384 amdtp_streaming_error(&tscm->tx_stream) || in snd_tscm_stream_start_duplex()
385 amdtp_streaming_error(&tscm->rx_stream)) { in snd_tscm_stream_start_duplex()
386 finish_session(tscm); in snd_tscm_stream_start_duplex()
388 amdtp_stream_stop(&tscm->tx_stream); in snd_tscm_stream_start_duplex()
389 amdtp_stream_stop(&tscm->rx_stream); in snd_tscm_stream_start_duplex()
391 release_resources(tscm); in snd_tscm_stream_start_duplex()
394 if (!amdtp_stream_running(&tscm->tx_stream)) { in snd_tscm_stream_start_duplex()
396 &tscm->tx_stream, &tscm->rx_stream); in snd_tscm_stream_start_duplex()
397 err = keep_resources(tscm, rate); in snd_tscm_stream_start_duplex()
401 err = set_stream_formats(tscm, rate); in snd_tscm_stream_start_duplex()
405 err = begin_session(tscm); in snd_tscm_stream_start_duplex()
409 err = amdtp_stream_start(&tscm->tx_stream, in snd_tscm_stream_start_duplex()
410 tscm->tx_resources.channel, in snd_tscm_stream_start_duplex()
411 fw_parent_device(tscm->unit)->max_speed); in snd_tscm_stream_start_duplex()
415 if (!amdtp_stream_wait_callback(&tscm->tx_stream, in snd_tscm_stream_start_duplex()
422 if (!amdtp_stream_running(&tscm->rx_stream)) { in snd_tscm_stream_start_duplex()
423 err = amdtp_stream_start(&tscm->rx_stream, in snd_tscm_stream_start_duplex()
424 tscm->rx_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->rx_stream, in snd_tscm_stream_start_duplex()
438 amdtp_stream_stop(&tscm->tx_stream); in snd_tscm_stream_start_duplex()
439 amdtp_stream_stop(&tscm->rx_stream); in snd_tscm_stream_start_duplex()
441 finish_session(tscm); in snd_tscm_stream_start_duplex()
442 release_resources(tscm); in snd_tscm_stream_start_duplex()
447 void snd_tscm_stream_stop_duplex(struct snd_tscm *tscm) in snd_tscm_stream_stop_duplex() argument
449 if (tscm->substreams_counter > 0) in snd_tscm_stream_stop_duplex()
452 amdtp_stream_stop(&tscm->tx_stream); in snd_tscm_stream_stop_duplex()
453 amdtp_stream_stop(&tscm->rx_stream); in snd_tscm_stream_stop_duplex()
455 finish_session(tscm); in snd_tscm_stream_stop_duplex()
456 release_resources(tscm); in snd_tscm_stream_stop_duplex()
459 void snd_tscm_stream_lock_changed(struct snd_tscm *tscm) in snd_tscm_stream_lock_changed() argument
461 tscm->dev_lock_changed = true; in snd_tscm_stream_lock_changed()
462 wake_up(&tscm->hwdep_wait); in snd_tscm_stream_lock_changed()
465 int snd_tscm_stream_lock_try(struct snd_tscm *tscm) in snd_tscm_stream_lock_try() argument
469 spin_lock_irq(&tscm->lock); in snd_tscm_stream_lock_try()
472 if (tscm->dev_lock_count < 0) { in snd_tscm_stream_lock_try()
478 if (tscm->dev_lock_count++ == 0) in snd_tscm_stream_lock_try()
479 snd_tscm_stream_lock_changed(tscm); in snd_tscm_stream_lock_try()
482 spin_unlock_irq(&tscm->lock); in snd_tscm_stream_lock_try()
486 void snd_tscm_stream_lock_release(struct snd_tscm *tscm) in snd_tscm_stream_lock_release() argument
488 spin_lock_irq(&tscm->lock); in snd_tscm_stream_lock_release()
490 if (WARN_ON(tscm->dev_lock_count <= 0)) in snd_tscm_stream_lock_release()
492 if (--tscm->dev_lock_count == 0) in snd_tscm_stream_lock_release()
493 snd_tscm_stream_lock_changed(tscm); in snd_tscm_stream_lock_release()
495 spin_unlock_irq(&tscm->lock); in snd_tscm_stream_lock_release()