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
106 err = snd_dice_stream_get_rate_mode(dice, rate, &mode); in start_stream()
109 if (stream == &dice->tx_stream) { in start_stream()
110 resources = &dice->tx_resources; in start_stream()
111 pcm_chs = dice->tx_channels[mode]; in start_stream()
112 midi_ports = dice->tx_midi_ports[mode]; in start_stream()
114 resources = &dice->rx_resources; in start_stream()
115 pcm_chs = dice->rx_channels[mode]; in start_stream()
116 midi_ports = dice->rx_midi_ports[mode]; in start_stream()
150 err = keep_resources(dice, resources, in start_stream()
153 dev_err(&dice->unit->device, in start_stream()
159 fw_parent_device(dice->unit)->max_speed); in start_stream()
161 release_resources(dice, resources); in start_stream()
166 static int get_sync_mode(struct snd_dice *dice, enum cip_flags *sync_mode) in get_sync_mode() argument
171 err = snd_dice_transaction_get_clock_source(dice, &source); in get_sync_mode()
193 int snd_dice_stream_start_duplex(struct snd_dice *dice, unsigned int rate) in snd_dice_stream_start_duplex() argument
200 if (dice->substreams_counter == 0) in snd_dice_stream_start_duplex()
203 err = get_sync_mode(dice, &sync_mode); in snd_dice_stream_start_duplex()
207 master = &dice->tx_stream; in snd_dice_stream_start_duplex()
208 slave = &dice->rx_stream; in snd_dice_stream_start_duplex()
210 master = &dice->rx_stream; in snd_dice_stream_start_duplex()
211 slave = &dice->tx_stream; in snd_dice_stream_start_duplex()
216 stop_stream(dice, master); in snd_dice_stream_start_duplex()
219 err = snd_dice_transaction_get_rate(dice, &curr_rate); in snd_dice_stream_start_duplex()
221 dev_err(&dice->unit->device, in snd_dice_stream_start_duplex()
228 stop_stream(dice, master); in snd_dice_stream_start_duplex()
231 stop_stream(dice, slave); in snd_dice_stream_start_duplex()
232 snd_dice_transaction_clear_enable(dice); in snd_dice_stream_start_duplex()
236 err = snd_dice_transaction_set_rate(dice, rate); in snd_dice_stream_start_duplex()
238 dev_err(&dice->unit->device, in snd_dice_stream_start_duplex()
244 err = start_stream(dice, master, rate); in snd_dice_stream_start_duplex()
246 dev_err(&dice->unit->device, in snd_dice_stream_start_duplex()
250 err = start_stream(dice, slave, rate); in snd_dice_stream_start_duplex()
252 dev_err(&dice->unit->device, in snd_dice_stream_start_duplex()
254 stop_stream(dice, master); in snd_dice_stream_start_duplex()
257 err = snd_dice_transaction_set_enable(dice); in snd_dice_stream_start_duplex()
259 dev_err(&dice->unit->device, in snd_dice_stream_start_duplex()
261 stop_stream(dice, master); in snd_dice_stream_start_duplex()
262 stop_stream(dice, slave); in snd_dice_stream_start_duplex()
269 snd_dice_transaction_clear_enable(dice); in snd_dice_stream_start_duplex()
270 stop_stream(dice, master); in snd_dice_stream_start_duplex()
271 stop_stream(dice, slave); in snd_dice_stream_start_duplex()
279 void snd_dice_stream_stop_duplex(struct snd_dice *dice) in snd_dice_stream_stop_duplex() argument
281 if (dice->substreams_counter > 0) in snd_dice_stream_stop_duplex()
284 snd_dice_transaction_clear_enable(dice); in snd_dice_stream_stop_duplex()
286 stop_stream(dice, &dice->tx_stream); in snd_dice_stream_stop_duplex()
287 stop_stream(dice, &dice->rx_stream); in snd_dice_stream_stop_duplex()
290 static int init_stream(struct snd_dice *dice, struct amdtp_stream *stream) in init_stream() argument
296 if (stream == &dice->tx_stream) { in init_stream()
297 resources = &dice->tx_resources; in init_stream()
300 resources = &dice->rx_resources; in init_stream()
304 err = fw_iso_resources_init(resources, dice->unit); in init_stream()
309 err = amdtp_am824_init(stream, dice->unit, dir, CIP_BLOCKING); in init_stream()
322 static void destroy_stream(struct snd_dice *dice, struct amdtp_stream *stream) in destroy_stream() argument
326 if (stream == &dice->tx_stream) in destroy_stream()
327 resources = &dice->tx_resources; in destroy_stream()
329 resources = &dice->rx_resources; in destroy_stream()
335 int snd_dice_stream_init_duplex(struct snd_dice *dice) in snd_dice_stream_init_duplex() argument
339 dice->substreams_counter = 0; in snd_dice_stream_init_duplex()
341 err = init_stream(dice, &dice->tx_stream); in snd_dice_stream_init_duplex()
345 err = init_stream(dice, &dice->rx_stream); in snd_dice_stream_init_duplex()
347 destroy_stream(dice, &dice->tx_stream); in snd_dice_stream_init_duplex()
352 void snd_dice_stream_destroy_duplex(struct snd_dice *dice) in snd_dice_stream_destroy_duplex() argument
354 snd_dice_transaction_clear_enable(dice); in snd_dice_stream_destroy_duplex()
356 destroy_stream(dice, &dice->tx_stream); in snd_dice_stream_destroy_duplex()
357 destroy_stream(dice, &dice->rx_stream); in snd_dice_stream_destroy_duplex()
359 dice->substreams_counter = 0; in snd_dice_stream_destroy_duplex()
362 void snd_dice_stream_update_duplex(struct snd_dice *dice) in snd_dice_stream_update_duplex() argument
372 dice->global_enabled = false; in snd_dice_stream_update_duplex()
374 stop_stream(dice, &dice->rx_stream); in snd_dice_stream_update_duplex()
375 stop_stream(dice, &dice->tx_stream); in snd_dice_stream_update_duplex()
377 fw_iso_resources_update(&dice->rx_resources); in snd_dice_stream_update_duplex()
378 fw_iso_resources_update(&dice->tx_resources); in snd_dice_stream_update_duplex()
381 static void dice_lock_changed(struct snd_dice *dice) in dice_lock_changed() argument
383 dice->dev_lock_changed = true; in dice_lock_changed()
384 wake_up(&dice->hwdep_wait); in dice_lock_changed()
387 int snd_dice_stream_lock_try(struct snd_dice *dice) in snd_dice_stream_lock_try() argument
391 spin_lock_irq(&dice->lock); in snd_dice_stream_lock_try()
393 if (dice->dev_lock_count < 0) { in snd_dice_stream_lock_try()
398 if (dice->dev_lock_count++ == 0) in snd_dice_stream_lock_try()
399 dice_lock_changed(dice); in snd_dice_stream_lock_try()
402 spin_unlock_irq(&dice->lock); in snd_dice_stream_lock_try()
406 void snd_dice_stream_lock_release(struct snd_dice *dice) in snd_dice_stream_lock_release() argument
408 spin_lock_irq(&dice->lock); in snd_dice_stream_lock_release()
410 if (WARN_ON(dice->dev_lock_count <= 0)) in snd_dice_stream_lock_release()
413 if (--dice->dev_lock_count == 0) in snd_dice_stream_lock_release()
414 dice_lock_changed(dice); in snd_dice_stream_lock_release()
416 spin_unlock_irq(&dice->lock); in snd_dice_stream_lock_release()