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)))
60 static int select_clock(struct snd_dice *dice, unsigned int rate)
67 err = snd_dice_transaction_read_global(dice, GLOBAL_CLOCK_SELECT,
83 if (completion_done(&dice->clock_accepted))
84 reinit_completion(&dice->clock_accepted);
87 err = snd_dice_transaction_write_global(dice, GLOBAL_CLOCK_SELECT,
92 if (wait_for_completion_timeout(&dice->clock_accepted,
101 static int get_register_params(struct snd_dice *dice,
108 err = snd_dice_transaction_read_tx(dice, TX_NUMBER, reg, sizeof(reg));
115 err = snd_dice_transaction_read_rx(dice, RX_NUMBER, reg, sizeof(reg));
125 static void release_resources(struct snd_dice *dice)
130 fw_iso_resources_free(&dice->tx_resources[i]);
131 fw_iso_resources_free(&dice->rx_resources[i]);
135 static void stop_streams(struct snd_dice *dice, enum amdtp_stream_direction dir,
144 snd_dice_transaction_write_tx(dice,
148 snd_dice_transaction_write_rx(dice,
155 static int keep_resources(struct snd_dice *dice, struct amdtp_stream *stream,
171 double_pcm_frames = (rate > 96000 && !dice->disable_double_pcm_frames);
194 fw_parent_device(dice->unit)->max_speed);
197 static int keep_dual_resources(struct snd_dice *dice, unsigned int rate,
205 err = snd_dice_stream_get_rate_mode(dice, rate, &mode);
218 stream = &dice->tx_stream[i];
219 resources = &dice->tx_resources[i];
221 pcm_cache = dice->tx_pcm_chs[i][mode];
222 err = snd_dice_transaction_read_tx(dice,
226 stream = &dice->rx_stream[i];
227 resources = &dice->rx_resources[i];
229 pcm_cache = dice->rx_pcm_chs[i][mode];
230 err = snd_dice_transaction_read_rx(dice,
241 dev_info(&dice->unit->device,
247 err = keep_resources(dice, stream, resources, rate, pcm_chs,
256 static void finish_session(struct snd_dice *dice, struct reg_params *tx_params,
259 stop_streams(dice, AMDTP_IN_STREAM, tx_params);
260 stop_streams(dice, AMDTP_OUT_STREAM, rx_params);
262 snd_dice_transaction_clear_enable(dice);
265 int snd_dice_stream_reserve_duplex(struct snd_dice *dice, unsigned int rate,
273 err = snd_dice_transaction_get_rate(dice, &curr_rate);
279 if (dice->substreams_counter == 0 || curr_rate != rate) {
282 amdtp_domain_stop(&dice->domain);
284 err = get_register_params(dice, &tx_params, &rx_params);
287 finish_session(dice, &tx_params, &rx_params);
289 release_resources(dice);
294 err = select_clock(dice, rate);
300 err = get_register_params(dice, &tx_params, &rx_params);
304 err = keep_dual_resources(dice, rate, AMDTP_IN_STREAM,
309 err = keep_dual_resources(dice, rate, AMDTP_OUT_STREAM,
314 err = amdtp_domain_set_events_per_period(&dice->domain,
322 release_resources(dice);
326 static int start_streams(struct snd_dice *dice, enum amdtp_stream_direction dir,
329 unsigned int max_speed = fw_parent_device(dice->unit)->max_speed;
339 stream = dice->tx_stream + i;
340 resources = dice->tx_resources + i;
342 stream = dice->rx_stream + i;
343 resources = dice->rx_resources + i;
348 err = snd_dice_transaction_write_tx(dice,
352 err = snd_dice_transaction_write_rx(dice,
361 err = snd_dice_transaction_write_tx(dice,
368 err = amdtp_domain_add_stream(&dice->domain, stream,
382 int snd_dice_stream_start_duplex(struct snd_dice *dice)
384 unsigned int generation = dice->rx_resources[0].generation;
391 if (dice->substreams_counter == 0)
394 err = get_register_params(dice, &tx_params, &rx_params);
400 if (amdtp_streaming_error(&dice->tx_stream[i]) ||
401 amdtp_streaming_error(&dice->rx_stream[i])) {
402 amdtp_domain_stop(&dice->domain);
403 finish_session(dice, &tx_params, &rx_params);
408 if (generation != fw_parent_device(dice->unit)->card->generation) {
411 fw_iso_resources_update(dice->tx_resources + i);
413 fw_iso_resources_update(dice->rx_resources + i);
418 err = snd_dice_transaction_get_rate(dice, &rate);
421 err = snd_dice_stream_get_rate_mode(dice, rate, &mode);
425 if (dice->tx_pcm_chs[i][mode] > 0 &&
426 !amdtp_stream_running(&dice->tx_stream[i]))
428 if (dice->rx_pcm_chs[i][mode] > 0 &&
429 !amdtp_stream_running(&dice->rx_stream[i]))
434 err = start_streams(dice, AMDTP_IN_STREAM, rate, &tx_params);
438 err = start_streams(dice, AMDTP_OUT_STREAM, rate, &rx_params);
442 err = snd_dice_transaction_set_enable(dice);
444 dev_err(&dice->unit->device,
453 err = amdtp_domain_start(&dice->domain, 0, true, false);
457 if (!amdtp_domain_wait_ready(&dice->domain, READY_TIMEOUT_MS)) {
465 amdtp_domain_stop(&dice->domain);
466 finish_session(dice, &tx_params, &rx_params);
475 void snd_dice_stream_stop_duplex(struct snd_dice *dice)
479 if (dice->substreams_counter == 0) {
480 if (get_register_params(dice, &tx_params, &rx_params) >= 0)
481 finish_session(dice, &tx_params, &rx_params);
483 amdtp_domain_stop(&dice->domain);
484 release_resources(dice);
488 static int init_stream(struct snd_dice *dice, enum amdtp_stream_direction dir,
496 stream = &dice->tx_stream[index];
497 resources = &dice->tx_resources[index];
499 stream = &dice->rx_stream[index];
500 resources = &dice->rx_resources[index];
503 err = fw_iso_resources_init(resources, dice->unit);
508 err = amdtp_am824_init(stream, dice->unit, dir, CIP_BLOCKING);
521 static void destroy_stream(struct snd_dice *dice,
529 stream = &dice->tx_stream[index];
530 resources = &dice->tx_resources[index];
532 stream = &dice->rx_stream[index];
533 resources = &dice->rx_resources[index];
540 int snd_dice_stream_init_duplex(struct snd_dice *dice)
545 err = init_stream(dice, AMDTP_IN_STREAM, i);
548 destroy_stream(dice, AMDTP_IN_STREAM, i);
554 err = init_stream(dice, AMDTP_OUT_STREAM, i);
557 destroy_stream(dice, AMDTP_OUT_STREAM, i);
559 destroy_stream(dice, AMDTP_IN_STREAM, i);
564 err = amdtp_domain_init(&dice->domain);
567 destroy_stream(dice, AMDTP_OUT_STREAM, i);
568 destroy_stream(dice, AMDTP_IN_STREAM, i);
575 void snd_dice_stream_destroy_duplex(struct snd_dice *dice)
580 destroy_stream(dice, AMDTP_IN_STREAM, i);
581 destroy_stream(dice, AMDTP_OUT_STREAM, i);
584 amdtp_domain_destroy(&dice->domain);
587 void snd_dice_stream_update_duplex(struct snd_dice *dice)
599 dice->global_enabled = false;
601 if (get_register_params(dice, &tx_params, &rx_params) == 0) {
602 amdtp_domain_stop(&dice->domain);
604 stop_streams(dice, AMDTP_IN_STREAM, &tx_params);
605 stop_streams(dice, AMDTP_OUT_STREAM, &rx_params);
609 int snd_dice_stream_detect_current_formats(struct snd_dice *dice)
619 err = snd_dice_detect_extension_formats(dice);
627 err = snd_dice_transaction_get_rate(dice, &rate);
631 err = snd_dice_stream_get_rate_mode(dice, rate, &mode);
640 err = select_clock(dice, rate);
644 err = get_register_params(dice, &tx_params, &rx_params);
649 err = snd_dice_transaction_read_tx(dice,
654 dice->tx_pcm_chs[i][mode] = be32_to_cpu(reg[0]);
655 dice->tx_midi_ports[i] = max_t(unsigned int,
656 be32_to_cpu(reg[1]), dice->tx_midi_ports[i]);
659 err = snd_dice_transaction_read_rx(dice,
664 dice->rx_pcm_chs[i][mode] = be32_to_cpu(reg[0]);
665 dice->rx_midi_ports[i] = max_t(unsigned int,
666 be32_to_cpu(reg[1]), dice->rx_midi_ports[i]);
672 static void dice_lock_changed(struct snd_dice *dice)
674 dice->dev_lock_changed = true;
675 wake_up(&dice->hwdep_wait);
678 int snd_dice_stream_lock_try(struct snd_dice *dice)
682 spin_lock_irq(&dice->lock);
684 if (dice->dev_lock_count < 0) {
689 if (dice->dev_lock_count++ == 0)
690 dice_lock_changed(dice);
693 spin_unlock_irq(&dice->lock);
697 void snd_dice_stream_lock_release(struct snd_dice *dice)
699 spin_lock_irq(&dice->lock);
701 if (WARN_ON(dice->dev_lock_count <= 0))
704 if (--dice->dev_lock_count == 0)
705 dice_lock_changed(dice);
707 spin_unlock_irq(&dice->lock);