• Home
  • Raw
  • Download

Lines Matching +full:clock +full:- +full:error +full:- +full:detect

2  * digi00x-stream.c - a part of driver for Digidesign Digi 002/003 family
4 * Copyright (c) 2014-2015 Takashi Sakamoto
37 err = snd_fw_transaction(dg00x->unit, TCODE_READ_QUADLET_REQUEST, in snd_dg00x_stream_get_local_rate()
47 err = -EIO; in snd_dg00x_stream_get_local_rate()
62 return -EINVAL; in snd_dg00x_stream_set_local_rate()
65 return snd_fw_transaction(dg00x->unit, TCODE_WRITE_QUADLET_REQUEST, in snd_dg00x_stream_set_local_rate()
71 enum snd_dg00x_clock *clock) in snd_dg00x_stream_get_clock() argument
76 err = snd_fw_transaction(dg00x->unit, TCODE_READ_QUADLET_REQUEST, in snd_dg00x_stream_get_clock()
82 *clock = be32_to_cpu(reg) & 0x0f; in snd_dg00x_stream_get_clock()
83 if (*clock >= SND_DG00X_CLOCK_COUNT) in snd_dg00x_stream_get_clock()
84 err = -EIO; in snd_dg00x_stream_get_clock()
89 int snd_dg00x_stream_check_external_clock(struct snd_dg00x *dg00x, bool *detect) in snd_dg00x_stream_check_external_clock() argument
94 err = snd_fw_transaction(dg00x->unit, TCODE_READ_QUADLET_REQUEST, in snd_dg00x_stream_check_external_clock()
98 *detect = be32_to_cpu(reg) > 0; in snd_dg00x_stream_check_external_clock()
110 err = snd_fw_transaction(dg00x->unit, TCODE_READ_QUADLET_REQUEST, in snd_dg00x_stream_get_external_rate()
121 err = -EBUSY; in snd_dg00x_stream_get_external_rate()
130 snd_fw_transaction(dg00x->unit, TCODE_WRITE_QUADLET_REQUEST, in finish_session()
141 err = snd_fw_transaction(dg00x->unit, TCODE_READ_QUADLET_REQUEST, in begin_session()
145 goto error; in begin_session()
151 curr--; in begin_session()
154 err = snd_fw_transaction(dg00x->unit, in begin_session()
160 goto error; in begin_session()
163 curr--; in begin_session()
167 error: in begin_session()
177 snd_fw_transaction(dg00x->unit, TCODE_WRITE_QUADLET_REQUEST, in release_resources()
182 fw_iso_resources_free(&dg00x->tx_resources); in release_resources()
183 fw_iso_resources_free(&dg00x->rx_resources); in release_resources()
198 return -EINVAL; in keep_resources()
200 /* Keep resources for out-stream. */ in keep_resources()
201 err = amdtp_dot_set_parameters(&dg00x->rx_stream, rate, in keep_resources()
205 err = fw_iso_resources_allocate(&dg00x->rx_resources, in keep_resources()
206 amdtp_stream_get_max_payload(&dg00x->rx_stream), in keep_resources()
207 fw_parent_device(dg00x->unit)->max_speed); in keep_resources()
211 /* Keep resources for in-stream. */ in keep_resources()
212 err = amdtp_dot_set_parameters(&dg00x->tx_stream, rate, in keep_resources()
216 err = fw_iso_resources_allocate(&dg00x->tx_resources, in keep_resources()
217 amdtp_stream_get_max_payload(&dg00x->tx_stream), in keep_resources()
218 fw_parent_device(dg00x->unit)->max_speed); in keep_resources()
220 goto error; in keep_resources()
223 data = cpu_to_be32((dg00x->tx_resources.channel << 16) | in keep_resources()
224 dg00x->rx_resources.channel); in keep_resources()
225 err = snd_fw_transaction(dg00x->unit, TCODE_WRITE_QUADLET_REQUEST, in keep_resources()
229 goto error; in keep_resources()
232 error: in keep_resources()
241 /* For out-stream. */ in snd_dg00x_stream_init_duplex()
242 err = fw_iso_resources_init(&dg00x->rx_resources, dg00x->unit); in snd_dg00x_stream_init_duplex()
244 goto error; in snd_dg00x_stream_init_duplex()
245 err = amdtp_dot_init(&dg00x->rx_stream, dg00x->unit, AMDTP_OUT_STREAM); in snd_dg00x_stream_init_duplex()
247 goto error; in snd_dg00x_stream_init_duplex()
249 /* For in-stream. */ in snd_dg00x_stream_init_duplex()
250 err = fw_iso_resources_init(&dg00x->tx_resources, dg00x->unit); in snd_dg00x_stream_init_duplex()
252 goto error; in snd_dg00x_stream_init_duplex()
253 err = amdtp_dot_init(&dg00x->tx_stream, dg00x->unit, AMDTP_IN_STREAM); in snd_dg00x_stream_init_duplex()
255 goto error; in snd_dg00x_stream_init_duplex()
258 error: in snd_dg00x_stream_init_duplex()
269 amdtp_stream_destroy(&dg00x->rx_stream); in snd_dg00x_stream_destroy_duplex()
270 fw_iso_resources_destroy(&dg00x->rx_resources); in snd_dg00x_stream_destroy_duplex()
272 amdtp_stream_destroy(&dg00x->tx_stream); in snd_dg00x_stream_destroy_duplex()
273 fw_iso_resources_destroy(&dg00x->tx_resources); in snd_dg00x_stream_destroy_duplex()
281 if (dg00x->substreams_counter == 0) in snd_dg00x_stream_start_duplex()
287 goto error; in snd_dg00x_stream_start_duplex()
291 amdtp_streaming_error(&dg00x->tx_stream) || in snd_dg00x_stream_start_duplex()
292 amdtp_streaming_error(&dg00x->rx_stream)) { in snd_dg00x_stream_start_duplex()
295 amdtp_stream_stop(&dg00x->tx_stream); in snd_dg00x_stream_start_duplex()
296 amdtp_stream_stop(&dg00x->rx_stream); in snd_dg00x_stream_start_duplex()
302 * which source of clock is used. in snd_dg00x_stream_start_duplex()
304 if (!amdtp_stream_running(&dg00x->rx_stream)) { in snd_dg00x_stream_start_duplex()
307 goto error; in snd_dg00x_stream_start_duplex()
311 goto error; in snd_dg00x_stream_start_duplex()
315 goto error; in snd_dg00x_stream_start_duplex()
317 err = amdtp_stream_start(&dg00x->rx_stream, in snd_dg00x_stream_start_duplex()
318 dg00x->rx_resources.channel, in snd_dg00x_stream_start_duplex()
319 fw_parent_device(dg00x->unit)->max_speed); in snd_dg00x_stream_start_duplex()
321 goto error; in snd_dg00x_stream_start_duplex()
323 if (!amdtp_stream_wait_callback(&dg00x->rx_stream, in snd_dg00x_stream_start_duplex()
325 err = -ETIMEDOUT; in snd_dg00x_stream_start_duplex()
326 goto error; in snd_dg00x_stream_start_duplex()
334 if (!amdtp_stream_running(&dg00x->tx_stream)) { in snd_dg00x_stream_start_duplex()
335 err = amdtp_stream_start(&dg00x->tx_stream, in snd_dg00x_stream_start_duplex()
336 dg00x->tx_resources.channel, in snd_dg00x_stream_start_duplex()
337 fw_parent_device(dg00x->unit)->max_speed); in snd_dg00x_stream_start_duplex()
339 goto error; in snd_dg00x_stream_start_duplex()
341 if (!amdtp_stream_wait_callback(&dg00x->tx_stream, in snd_dg00x_stream_start_duplex()
343 err = -ETIMEDOUT; in snd_dg00x_stream_start_duplex()
344 goto error; in snd_dg00x_stream_start_duplex()
349 error: in snd_dg00x_stream_start_duplex()
352 amdtp_stream_stop(&dg00x->tx_stream); in snd_dg00x_stream_start_duplex()
353 amdtp_stream_stop(&dg00x->rx_stream); in snd_dg00x_stream_start_duplex()
361 if (dg00x->substreams_counter > 0) in snd_dg00x_stream_stop_duplex()
364 amdtp_stream_stop(&dg00x->tx_stream); in snd_dg00x_stream_stop_duplex()
365 amdtp_stream_stop(&dg00x->rx_stream); in snd_dg00x_stream_stop_duplex()
378 fw_iso_resources_update(&dg00x->tx_resources); in snd_dg00x_stream_update_duplex()
379 fw_iso_resources_update(&dg00x->rx_resources); in snd_dg00x_stream_update_duplex()
381 amdtp_stream_update(&dg00x->tx_stream); in snd_dg00x_stream_update_duplex()
382 amdtp_stream_update(&dg00x->rx_stream); in snd_dg00x_stream_update_duplex()
387 dg00x->dev_lock_changed = true; in snd_dg00x_stream_lock_changed()
388 wake_up(&dg00x->hwdep_wait); in snd_dg00x_stream_lock_changed()
395 spin_lock_irq(&dg00x->lock); in snd_dg00x_stream_lock_try()
398 if (dg00x->dev_lock_count < 0) { in snd_dg00x_stream_lock_try()
399 err = -EBUSY; in snd_dg00x_stream_lock_try()
404 if (dg00x->dev_lock_count++ == 0) in snd_dg00x_stream_lock_try()
408 spin_unlock_irq(&dg00x->lock); in snd_dg00x_stream_lock_try()
414 spin_lock_irq(&dg00x->lock); in snd_dg00x_stream_lock_release()
416 if (WARN_ON(dg00x->dev_lock_count <= 0)) in snd_dg00x_stream_lock_release()
418 if (--dg00x->dev_lock_count == 0) in snd_dg00x_stream_lock_release()
421 spin_unlock_irq(&dg00x->lock); in snd_dg00x_stream_lock_release()