Lines Matching refs:dice
27 int snd_dice_stream_get_rate_mode(struct snd_dice *dice, unsigned int rate, in snd_dice_stream_get_rate_mode() argument
33 if (!(dice->clock_caps & BIT(i))) in snd_dice_stream_get_rate_mode()
44 static void release_resources(struct snd_dice *dice, in release_resources() argument
51 if (resources == &dice->tx_resources) in release_resources()
52 snd_dice_transaction_write_tx(dice, TX_ISOCHRONOUS, in release_resources()
55 snd_dice_transaction_write_rx(dice, RX_ISOCHRONOUS, in release_resources()
61 static int keep_resources(struct snd_dice *dice, in keep_resources() argument
69 fw_parent_device(dice->unit)->max_speed); in keep_resources()
75 if (resources == &dice->tx_resources) in keep_resources()
76 err = snd_dice_transaction_write_tx(dice, TX_ISOCHRONOUS, in keep_resources()
79 err = snd_dice_transaction_write_rx(dice, RX_ISOCHRONOUS, in keep_resources()
82 release_resources(dice, resources); in keep_resources()
87 static void stop_stream(struct snd_dice *dice, struct amdtp_stream *stream) in stop_stream() argument
92 if (stream == &dice->tx_stream) in stop_stream()
93 release_resources(dice, &dice->tx_resources); in stop_stream()
95 release_resources(dice, &dice->rx_resources); in stop_stream()
98 static int start_stream(struct snd_dice *dice, struct amdtp_stream *stream, in start_stream() argument
105 err = snd_dice_stream_get_rate_mode(dice, rate, &mode); in start_stream()
108 if (stream == &dice->tx_stream) { in start_stream()
109 resources = &dice->tx_resources; in start_stream()
110 pcm_chs = dice->tx_channels[mode]; in start_stream()
111 midi_ports = dice->tx_midi_ports[mode]; in start_stream()
113 resources = &dice->rx_resources; in start_stream()
114 pcm_chs = dice->rx_channels[mode]; in start_stream()
115 midi_ports = dice->rx_midi_ports[mode]; in start_stream()
146 err = keep_resources(dice, resources, in start_stream()
149 dev_err(&dice->unit->device, in start_stream()
155 fw_parent_device(dice->unit)->max_speed); in start_stream()
157 release_resources(dice, resources); in start_stream()
162 static int get_sync_mode(struct snd_dice *dice, enum cip_flags *sync_mode) in get_sync_mode() argument
167 err = snd_dice_transaction_get_clock_source(dice, &source); in get_sync_mode()
189 int snd_dice_stream_start_duplex(struct snd_dice *dice, unsigned int rate) in snd_dice_stream_start_duplex() argument
196 if (dice->substreams_counter == 0) in snd_dice_stream_start_duplex()
199 err = get_sync_mode(dice, &sync_mode); in snd_dice_stream_start_duplex()
203 master = &dice->tx_stream; in snd_dice_stream_start_duplex()
204 slave = &dice->rx_stream; in snd_dice_stream_start_duplex()
206 master = &dice->rx_stream; in snd_dice_stream_start_duplex()
207 slave = &dice->tx_stream; in snd_dice_stream_start_duplex()
212 stop_stream(dice, master); in snd_dice_stream_start_duplex()
215 err = snd_dice_transaction_get_rate(dice, &curr_rate); in snd_dice_stream_start_duplex()
217 dev_err(&dice->unit->device, in snd_dice_stream_start_duplex()
224 stop_stream(dice, master); in snd_dice_stream_start_duplex()
227 stop_stream(dice, slave); in snd_dice_stream_start_duplex()
228 snd_dice_transaction_clear_enable(dice); in snd_dice_stream_start_duplex()
232 err = snd_dice_transaction_set_rate(dice, rate); in snd_dice_stream_start_duplex()
234 dev_err(&dice->unit->device, in snd_dice_stream_start_duplex()
240 err = start_stream(dice, master, rate); in snd_dice_stream_start_duplex()
242 dev_err(&dice->unit->device, in snd_dice_stream_start_duplex()
246 err = start_stream(dice, slave, rate); in snd_dice_stream_start_duplex()
248 dev_err(&dice->unit->device, in snd_dice_stream_start_duplex()
250 stop_stream(dice, master); in snd_dice_stream_start_duplex()
253 err = snd_dice_transaction_set_enable(dice); in snd_dice_stream_start_duplex()
255 dev_err(&dice->unit->device, in snd_dice_stream_start_duplex()
257 stop_stream(dice, master); in snd_dice_stream_start_duplex()
258 stop_stream(dice, slave); in snd_dice_stream_start_duplex()
265 snd_dice_transaction_clear_enable(dice); in snd_dice_stream_start_duplex()
266 stop_stream(dice, master); in snd_dice_stream_start_duplex()
267 stop_stream(dice, slave); in snd_dice_stream_start_duplex()
275 void snd_dice_stream_stop_duplex(struct snd_dice *dice) in snd_dice_stream_stop_duplex() argument
277 if (dice->substreams_counter > 0) in snd_dice_stream_stop_duplex()
280 snd_dice_transaction_clear_enable(dice); in snd_dice_stream_stop_duplex()
282 stop_stream(dice, &dice->tx_stream); in snd_dice_stream_stop_duplex()
283 stop_stream(dice, &dice->rx_stream); in snd_dice_stream_stop_duplex()
286 static int init_stream(struct snd_dice *dice, struct amdtp_stream *stream) in init_stream() argument
292 if (stream == &dice->tx_stream) { in init_stream()
293 resources = &dice->tx_resources; in init_stream()
296 resources = &dice->rx_resources; in init_stream()
300 err = fw_iso_resources_init(resources, dice->unit); in init_stream()
305 err = amdtp_stream_init(stream, dice->unit, dir, CIP_BLOCKING); in init_stream()
318 static void destroy_stream(struct snd_dice *dice, struct amdtp_stream *stream) in destroy_stream() argument
322 if (stream == &dice->tx_stream) in destroy_stream()
323 resources = &dice->tx_resources; in destroy_stream()
325 resources = &dice->rx_resources; in destroy_stream()
331 int snd_dice_stream_init_duplex(struct snd_dice *dice) in snd_dice_stream_init_duplex() argument
335 dice->substreams_counter = 0; in snd_dice_stream_init_duplex()
337 err = init_stream(dice, &dice->tx_stream); in snd_dice_stream_init_duplex()
341 err = init_stream(dice, &dice->rx_stream); in snd_dice_stream_init_duplex()
343 destroy_stream(dice, &dice->tx_stream); in snd_dice_stream_init_duplex()
348 void snd_dice_stream_destroy_duplex(struct snd_dice *dice) in snd_dice_stream_destroy_duplex() argument
350 snd_dice_transaction_clear_enable(dice); in snd_dice_stream_destroy_duplex()
352 destroy_stream(dice, &dice->tx_stream); in snd_dice_stream_destroy_duplex()
353 destroy_stream(dice, &dice->rx_stream); in snd_dice_stream_destroy_duplex()
355 dice->substreams_counter = 0; in snd_dice_stream_destroy_duplex()
358 void snd_dice_stream_update_duplex(struct snd_dice *dice) in snd_dice_stream_update_duplex() argument
368 dice->global_enabled = false; in snd_dice_stream_update_duplex()
370 stop_stream(dice, &dice->rx_stream); in snd_dice_stream_update_duplex()
371 stop_stream(dice, &dice->tx_stream); in snd_dice_stream_update_duplex()
373 fw_iso_resources_update(&dice->rx_resources); in snd_dice_stream_update_duplex()
374 fw_iso_resources_update(&dice->tx_resources); in snd_dice_stream_update_duplex()
377 static void dice_lock_changed(struct snd_dice *dice) in dice_lock_changed() argument
379 dice->dev_lock_changed = true; in dice_lock_changed()
380 wake_up(&dice->hwdep_wait); in dice_lock_changed()
383 int snd_dice_stream_lock_try(struct snd_dice *dice) in snd_dice_stream_lock_try() argument
387 spin_lock_irq(&dice->lock); in snd_dice_stream_lock_try()
389 if (dice->dev_lock_count < 0) { in snd_dice_stream_lock_try()
394 if (dice->dev_lock_count++ == 0) in snd_dice_stream_lock_try()
395 dice_lock_changed(dice); in snd_dice_stream_lock_try()
398 spin_unlock_irq(&dice->lock); in snd_dice_stream_lock_try()
402 void snd_dice_stream_lock_release(struct snd_dice *dice) in snd_dice_stream_lock_release() argument
404 spin_lock_irq(&dice->lock); in snd_dice_stream_lock_release()
406 if (WARN_ON(dice->dev_lock_count <= 0)) in snd_dice_stream_lock_release()
409 if (--dice->dev_lock_count == 0) in snd_dice_stream_lock_release()
410 dice_lock_changed(dice); in snd_dice_stream_lock_release()
412 spin_unlock_irq(&dice->lock); in snd_dice_stream_lock_release()