Lines Matching defs:dice
9 #include "dice.h"
32 int snd_dice_stream_get_rate_mode(struct snd_dice *dice, unsigned int rate,
48 if (!(dice->clock_caps & BIT(i)))
64 static int ensure_phase_lock(struct snd_dice *dice, unsigned int rate)
71 err = snd_dice_transaction_read_global(dice, GLOBAL_CLOCK_SELECT,
87 if (completion_done(&dice->clock_accepted))
88 reinit_completion(&dice->clock_accepted);
91 err = snd_dice_transaction_write_global(dice, GLOBAL_CLOCK_SELECT,
96 if (wait_for_completion_timeout(&dice->clock_accepted,
103 err = snd_dice_transaction_read_global(dice, GLOBAL_STATUS,
114 static int get_register_params(struct snd_dice *dice,
121 err = snd_dice_transaction_read_tx(dice, TX_NUMBER, reg, sizeof(reg));
128 err = snd_dice_transaction_read_rx(dice, RX_NUMBER, reg, sizeof(reg));
138 static void release_resources(struct snd_dice *dice)
143 fw_iso_resources_free(&dice->tx_resources[i]);
144 fw_iso_resources_free(&dice->rx_resources[i]);
148 static void stop_streams(struct snd_dice *dice, enum amdtp_stream_direction dir,
157 snd_dice_transaction_write_tx(dice,
161 snd_dice_transaction_write_rx(dice,
168 static int keep_resources(struct snd_dice *dice, struct amdtp_stream *stream,
207 fw_parent_device(dice->unit)->max_speed);
210 static int keep_dual_resources(struct snd_dice *dice, unsigned int rate,
218 err = snd_dice_stream_get_rate_mode(dice, rate, &mode);
231 stream = &dice->tx_stream[i];
232 resources = &dice->tx_resources[i];
234 pcm_cache = dice->tx_pcm_chs[i][mode];
235 err = snd_dice_transaction_read_tx(dice,
239 stream = &dice->rx_stream[i];
240 resources = &dice->rx_resources[i];
242 pcm_cache = dice->rx_pcm_chs[i][mode];
243 err = snd_dice_transaction_read_rx(dice,
254 dev_info(&dice->unit->device,
260 err = keep_resources(dice, stream, resources, rate, pcm_chs,
269 static void finish_session(struct snd_dice *dice, struct reg_params *tx_params,
272 stop_streams(dice, AMDTP_IN_STREAM, tx_params);
273 stop_streams(dice, AMDTP_OUT_STREAM, rx_params);
275 snd_dice_transaction_clear_enable(dice);
278 int snd_dice_stream_reserve_duplex(struct snd_dice *dice, unsigned int rate,
286 err = snd_dice_transaction_get_rate(dice, &curr_rate);
292 if (dice->substreams_counter == 0 || curr_rate != rate) {
295 amdtp_domain_stop(&dice->domain);
297 err = get_register_params(dice, &tx_params, &rx_params);
300 finish_session(dice, &tx_params, &rx_params);
302 release_resources(dice);
307 err = ensure_phase_lock(dice, rate);
313 err = get_register_params(dice, &tx_params, &rx_params);
317 err = keep_dual_resources(dice, rate, AMDTP_IN_STREAM,
322 err = keep_dual_resources(dice, rate, AMDTP_OUT_STREAM,
327 err = amdtp_domain_set_events_per_period(&dice->domain,
335 release_resources(dice);
339 static int start_streams(struct snd_dice *dice, enum amdtp_stream_direction dir,
342 unsigned int max_speed = fw_parent_device(dice->unit)->max_speed;
352 stream = dice->tx_stream + i;
353 resources = dice->tx_resources + i;
355 stream = dice->rx_stream + i;
356 resources = dice->rx_resources + i;
361 err = snd_dice_transaction_write_tx(dice,
365 err = snd_dice_transaction_write_rx(dice,
374 err = snd_dice_transaction_write_tx(dice,
381 err = amdtp_domain_add_stream(&dice->domain, stream,
395 int snd_dice_stream_start_duplex(struct snd_dice *dice)
397 unsigned int generation = dice->rx_resources[0].generation;
404 if (dice->substreams_counter == 0)
407 err = get_register_params(dice, &tx_params, &rx_params);
413 if (amdtp_streaming_error(&dice->tx_stream[i]) ||
414 amdtp_streaming_error(&dice->rx_stream[i])) {
415 amdtp_domain_stop(&dice->domain);
416 finish_session(dice, &tx_params, &rx_params);
421 if (generation != fw_parent_device(dice->unit)->card->generation) {
424 fw_iso_resources_update(dice->tx_resources + i);
426 fw_iso_resources_update(dice->rx_resources + i);
431 err = snd_dice_transaction_get_rate(dice, &rate);
434 err = snd_dice_stream_get_rate_mode(dice, rate, &mode);
438 if (dice->tx_pcm_chs[i][mode] > 0 &&
439 !amdtp_stream_running(&dice->tx_stream[i]))
441 if (dice->rx_pcm_chs[i][mode] > 0 &&
442 !amdtp_stream_running(&dice->rx_stream[i]))
447 err = start_streams(dice, AMDTP_IN_STREAM, rate, &tx_params);
451 err = start_streams(dice, AMDTP_OUT_STREAM, rate, &rx_params);
455 err = snd_dice_transaction_set_enable(dice);
457 dev_err(&dice->unit->device,
462 err = amdtp_domain_start(&dice->domain, 0);
468 !amdtp_stream_wait_callback(&dice->tx_stream[i],
471 !amdtp_stream_wait_callback(&dice->rx_stream[i],
481 amdtp_domain_stop(&dice->domain);
482 finish_session(dice, &tx_params, &rx_params);
491 void snd_dice_stream_stop_duplex(struct snd_dice *dice)
495 if (dice->substreams_counter == 0) {
496 if (get_register_params(dice, &tx_params, &rx_params) >= 0)
497 finish_session(dice, &tx_params, &rx_params);
499 amdtp_domain_stop(&dice->domain);
500 release_resources(dice);
504 static int init_stream(struct snd_dice *dice, enum amdtp_stream_direction dir,
512 stream = &dice->tx_stream[index];
513 resources = &dice->tx_resources[index];
515 stream = &dice->rx_stream[index];
516 resources = &dice->rx_resources[index];
519 err = fw_iso_resources_init(resources, dice->unit);
524 err = amdtp_am824_init(stream, dice->unit, dir, CIP_BLOCKING);
537 static void destroy_stream(struct snd_dice *dice,
545 stream = &dice->tx_stream[index];
546 resources = &dice->tx_resources[index];
548 stream = &dice->rx_stream[index];
549 resources = &dice->rx_resources[index];
556 int snd_dice_stream_init_duplex(struct snd_dice *dice)
561 err = init_stream(dice, AMDTP_IN_STREAM, i);
564 destroy_stream(dice, AMDTP_IN_STREAM, i);
570 err = init_stream(dice, AMDTP_OUT_STREAM, i);
573 destroy_stream(dice, AMDTP_OUT_STREAM, i);
575 destroy_stream(dice, AMDTP_IN_STREAM, i);
580 err = amdtp_domain_init(&dice->domain);
583 destroy_stream(dice, AMDTP_OUT_STREAM, i);
584 destroy_stream(dice, AMDTP_IN_STREAM, i);
591 void snd_dice_stream_destroy_duplex(struct snd_dice *dice)
596 destroy_stream(dice, AMDTP_IN_STREAM, i);
597 destroy_stream(dice, AMDTP_OUT_STREAM, i);
600 amdtp_domain_destroy(&dice->domain);
603 void snd_dice_stream_update_duplex(struct snd_dice *dice)
615 dice->global_enabled = false;
617 if (get_register_params(dice, &tx_params, &rx_params) == 0) {
618 amdtp_domain_stop(&dice->domain);
620 stop_streams(dice, AMDTP_IN_STREAM, &tx_params);
621 stop_streams(dice, AMDTP_OUT_STREAM, &rx_params);
625 int snd_dice_stream_detect_current_formats(struct snd_dice *dice)
635 err = snd_dice_detect_extension_formats(dice);
643 err = snd_dice_transaction_get_rate(dice, &rate);
647 err = snd_dice_stream_get_rate_mode(dice, rate, &mode);
656 err = ensure_phase_lock(dice, rate);
660 err = get_register_params(dice, &tx_params, &rx_params);
665 err = snd_dice_transaction_read_tx(dice,
670 dice->tx_pcm_chs[i][mode] = be32_to_cpu(reg[0]);
671 dice->tx_midi_ports[i] = max_t(unsigned int,
672 be32_to_cpu(reg[1]), dice->tx_midi_ports[i]);
675 err = snd_dice_transaction_read_rx(dice,
680 dice->rx_pcm_chs[i][mode] = be32_to_cpu(reg[0]);
681 dice->rx_midi_ports[i] = max_t(unsigned int,
682 be32_to_cpu(reg[1]), dice->rx_midi_ports[i]);
688 static void dice_lock_changed(struct snd_dice *dice)
690 dice->dev_lock_changed = true;
691 wake_up(&dice->hwdep_wait);
694 int snd_dice_stream_lock_try(struct snd_dice *dice)
698 spin_lock_irq(&dice->lock);
700 if (dice->dev_lock_count < 0) {
705 if (dice->dev_lock_count++ == 0)
706 dice_lock_changed(dice);
709 spin_unlock_irq(&dice->lock);
713 void snd_dice_stream_lock_release(struct snd_dice *dice)
715 spin_lock_irq(&dice->lock);
717 if (WARN_ON(dice->dev_lock_count <= 0))
720 if (--dice->dev_lock_count == 0)
721 dice_lock_changed(dice);
723 spin_unlock_irq(&dice->lock);