Lines Matching refs:dice
33 int snd_dice_stream_get_rate_mode(struct snd_dice *dice, unsigned int rate, in snd_dice_stream_get_rate_mode() argument
49 if (!(dice->clock_caps & BIT(i))) in snd_dice_stream_get_rate_mode()
65 static int ensure_phase_lock(struct snd_dice *dice, unsigned int rate) in ensure_phase_lock() argument
72 err = snd_dice_transaction_read_global(dice, GLOBAL_CLOCK_SELECT, in ensure_phase_lock()
88 if (completion_done(&dice->clock_accepted)) in ensure_phase_lock()
89 reinit_completion(&dice->clock_accepted); in ensure_phase_lock()
92 err = snd_dice_transaction_write_global(dice, GLOBAL_CLOCK_SELECT, in ensure_phase_lock()
97 if (wait_for_completion_timeout(&dice->clock_accepted, in ensure_phase_lock()
104 err = snd_dice_transaction_read_global(dice, GLOBAL_STATUS, in ensure_phase_lock()
115 static int get_register_params(struct snd_dice *dice, in get_register_params() argument
122 err = snd_dice_transaction_read_tx(dice, TX_NUMBER, reg, sizeof(reg)); in get_register_params()
129 err = snd_dice_transaction_read_rx(dice, RX_NUMBER, reg, sizeof(reg)); in get_register_params()
139 static void release_resources(struct snd_dice *dice) in release_resources() argument
144 if (amdtp_stream_running(&dice->tx_stream[i])) { in release_resources()
145 amdtp_stream_pcm_abort(&dice->tx_stream[i]); in release_resources()
146 amdtp_stream_stop(&dice->tx_stream[i]); in release_resources()
148 if (amdtp_stream_running(&dice->rx_stream[i])) { in release_resources()
149 amdtp_stream_pcm_abort(&dice->rx_stream[i]); in release_resources()
150 amdtp_stream_stop(&dice->rx_stream[i]); in release_resources()
153 fw_iso_resources_free(&dice->tx_resources[i]); in release_resources()
154 fw_iso_resources_free(&dice->rx_resources[i]); in release_resources()
158 static void stop_streams(struct snd_dice *dice, enum amdtp_stream_direction dir, in stop_streams() argument
167 snd_dice_transaction_write_tx(dice, in stop_streams()
171 snd_dice_transaction_write_rx(dice, in stop_streams()
178 static int keep_resources(struct snd_dice *dice, in keep_resources() argument
190 stream = &dice->tx_stream[index]; in keep_resources()
191 resources = &dice->tx_resources[index]; in keep_resources()
193 stream = &dice->rx_stream[index]; in keep_resources()
194 resources = &dice->rx_resources[index]; in keep_resources()
230 fw_parent_device(dice->unit)->max_speed); in keep_resources()
233 static int start_streams(struct snd_dice *dice, enum amdtp_stream_direction dir, in start_streams() argument
241 struct fw_device *fw_dev = fw_parent_device(dice->unit); in start_streams()
245 streams = dice->tx_stream; in start_streams()
246 resources = dice->tx_resources; in start_streams()
248 streams = dice->rx_stream; in start_streams()
249 resources = dice->rx_resources; in start_streams()
252 err = snd_dice_stream_get_rate_mode(dice, rate, &mode); in start_streams()
261 pcm_cache = dice->tx_pcm_chs[i][mode]; in start_streams()
262 midi_cache = dice->tx_midi_ports[i]; in start_streams()
263 err = snd_dice_transaction_read_tx(dice, in start_streams()
267 pcm_cache = dice->rx_pcm_chs[i][mode]; in start_streams()
268 midi_cache = dice->rx_midi_ports[i]; in start_streams()
269 err = snd_dice_transaction_read_rx(dice, in start_streams()
280 dev_info(&dice->unit->device, in start_streams()
286 err = keep_resources(dice, dir, i, rate, pcm_chs, midi_ports); in start_streams()
292 err = snd_dice_transaction_write_tx(dice, in start_streams()
296 err = snd_dice_transaction_write_rx(dice, in start_streams()
305 err = snd_dice_transaction_write_tx(dice, in start_streams()
321 static int start_duplex_streams(struct snd_dice *dice, unsigned int rate) in start_duplex_streams() argument
327 err = get_register_params(dice, &tx_params, &rx_params); in start_duplex_streams()
332 stop_streams(dice, AMDTP_IN_STREAM, &tx_params); in start_duplex_streams()
333 stop_streams(dice, AMDTP_OUT_STREAM, &rx_params); in start_duplex_streams()
334 snd_dice_transaction_clear_enable(dice); in start_duplex_streams()
335 release_resources(dice); in start_duplex_streams()
337 err = ensure_phase_lock(dice, rate); in start_duplex_streams()
339 dev_err(&dice->unit->device, "fail to ensure phase lock\n"); in start_duplex_streams()
344 err = get_register_params(dice, &tx_params, &rx_params); in start_duplex_streams()
349 err = start_streams(dice, AMDTP_IN_STREAM, rate, &tx_params); in start_duplex_streams()
352 err = start_streams(dice, AMDTP_OUT_STREAM, rate, &rx_params); in start_duplex_streams()
356 err = snd_dice_transaction_set_enable(dice); in start_duplex_streams()
358 dev_err(&dice->unit->device, "fail to enable interface\n"); in start_duplex_streams()
364 !amdtp_stream_wait_callback(&dice->tx_stream[i], in start_duplex_streams()
367 !amdtp_stream_wait_callback(&dice->rx_stream[i], in start_duplex_streams()
376 stop_streams(dice, AMDTP_IN_STREAM, &tx_params); in start_duplex_streams()
377 stop_streams(dice, AMDTP_OUT_STREAM, &rx_params); in start_duplex_streams()
378 snd_dice_transaction_clear_enable(dice); in start_duplex_streams()
379 release_resources(dice); in start_duplex_streams()
388 int snd_dice_stream_start_duplex(struct snd_dice *dice, unsigned int rate) in snd_dice_stream_start_duplex() argument
395 if (dice->substreams_counter == 0) in snd_dice_stream_start_duplex()
399 err = snd_dice_transaction_get_rate(dice, &curr_rate); in snd_dice_stream_start_duplex()
401 dev_err(&dice->unit->device, in snd_dice_stream_start_duplex()
412 if (amdtp_streaming_error(&dice->tx_stream[i])) in snd_dice_stream_start_duplex()
414 if (amdtp_streaming_error(&dice->rx_stream[i])) in snd_dice_stream_start_duplex()
421 err = snd_dice_stream_get_rate_mode(dice, rate, &mode); in snd_dice_stream_start_duplex()
425 if (dice->tx_pcm_chs[i][mode] > 0 && in snd_dice_stream_start_duplex()
426 !amdtp_stream_running(&dice->tx_stream[i])) in snd_dice_stream_start_duplex()
428 if (dice->rx_pcm_chs[i][mode] > 0 && in snd_dice_stream_start_duplex()
429 !amdtp_stream_running(&dice->rx_stream[i])) in snd_dice_stream_start_duplex()
437 return start_duplex_streams(dice, rate); in snd_dice_stream_start_duplex()
445 void snd_dice_stream_stop_duplex(struct snd_dice *dice) in snd_dice_stream_stop_duplex() argument
449 if (dice->substreams_counter > 0) in snd_dice_stream_stop_duplex()
452 snd_dice_transaction_clear_enable(dice); in snd_dice_stream_stop_duplex()
454 if (get_register_params(dice, &tx_params, &rx_params) == 0) { in snd_dice_stream_stop_duplex()
455 stop_streams(dice, AMDTP_IN_STREAM, &tx_params); in snd_dice_stream_stop_duplex()
456 stop_streams(dice, AMDTP_OUT_STREAM, &rx_params); in snd_dice_stream_stop_duplex()
459 release_resources(dice); in snd_dice_stream_stop_duplex()
462 static int init_stream(struct snd_dice *dice, enum amdtp_stream_direction dir, in init_stream() argument
470 stream = &dice->tx_stream[index]; in init_stream()
471 resources = &dice->tx_resources[index]; in init_stream()
473 stream = &dice->rx_stream[index]; in init_stream()
474 resources = &dice->rx_resources[index]; in init_stream()
477 err = fw_iso_resources_init(resources, dice->unit); in init_stream()
482 err = amdtp_am824_init(stream, dice->unit, dir, CIP_BLOCKING); in init_stream()
495 static void destroy_stream(struct snd_dice *dice, in destroy_stream() argument
503 stream = &dice->tx_stream[index]; in destroy_stream()
504 resources = &dice->tx_resources[index]; in destroy_stream()
506 stream = &dice->rx_stream[index]; in destroy_stream()
507 resources = &dice->rx_resources[index]; in destroy_stream()
514 int snd_dice_stream_init_duplex(struct snd_dice *dice) in snd_dice_stream_init_duplex() argument
519 err = init_stream(dice, AMDTP_IN_STREAM, i); in snd_dice_stream_init_duplex()
522 destroy_stream(dice, AMDTP_IN_STREAM, i); in snd_dice_stream_init_duplex()
528 err = init_stream(dice, AMDTP_OUT_STREAM, i); in snd_dice_stream_init_duplex()
531 destroy_stream(dice, AMDTP_OUT_STREAM, i); in snd_dice_stream_init_duplex()
533 destroy_stream(dice, AMDTP_IN_STREAM, i); in snd_dice_stream_init_duplex()
541 void snd_dice_stream_destroy_duplex(struct snd_dice *dice) in snd_dice_stream_destroy_duplex() argument
546 destroy_stream(dice, AMDTP_IN_STREAM, i); in snd_dice_stream_destroy_duplex()
547 destroy_stream(dice, AMDTP_OUT_STREAM, i); in snd_dice_stream_destroy_duplex()
551 void snd_dice_stream_update_duplex(struct snd_dice *dice) in snd_dice_stream_update_duplex() argument
563 dice->global_enabled = false; in snd_dice_stream_update_duplex()
565 if (get_register_params(dice, &tx_params, &rx_params) == 0) { in snd_dice_stream_update_duplex()
566 stop_streams(dice, AMDTP_IN_STREAM, &tx_params); in snd_dice_stream_update_duplex()
567 stop_streams(dice, AMDTP_OUT_STREAM, &rx_params); in snd_dice_stream_update_duplex()
571 int snd_dice_stream_detect_current_formats(struct snd_dice *dice) in snd_dice_stream_detect_current_formats() argument
581 err = snd_dice_detect_extension_formats(dice); in snd_dice_stream_detect_current_formats()
589 err = snd_dice_transaction_get_rate(dice, &rate); in snd_dice_stream_detect_current_formats()
593 err = snd_dice_stream_get_rate_mode(dice, rate, &mode); in snd_dice_stream_detect_current_formats()
602 err = ensure_phase_lock(dice, rate); in snd_dice_stream_detect_current_formats()
606 err = get_register_params(dice, &tx_params, &rx_params); in snd_dice_stream_detect_current_formats()
611 err = snd_dice_transaction_read_tx(dice, in snd_dice_stream_detect_current_formats()
616 dice->tx_pcm_chs[i][mode] = be32_to_cpu(reg[0]); in snd_dice_stream_detect_current_formats()
617 dice->tx_midi_ports[i] = max_t(unsigned int, in snd_dice_stream_detect_current_formats()
618 be32_to_cpu(reg[1]), dice->tx_midi_ports[i]); in snd_dice_stream_detect_current_formats()
621 err = snd_dice_transaction_read_rx(dice, in snd_dice_stream_detect_current_formats()
626 dice->rx_pcm_chs[i][mode] = be32_to_cpu(reg[0]); in snd_dice_stream_detect_current_formats()
627 dice->rx_midi_ports[i] = max_t(unsigned int, in snd_dice_stream_detect_current_formats()
628 be32_to_cpu(reg[1]), dice->rx_midi_ports[i]); in snd_dice_stream_detect_current_formats()
634 static void dice_lock_changed(struct snd_dice *dice) in dice_lock_changed() argument
636 dice->dev_lock_changed = true; in dice_lock_changed()
637 wake_up(&dice->hwdep_wait); in dice_lock_changed()
640 int snd_dice_stream_lock_try(struct snd_dice *dice) in snd_dice_stream_lock_try() argument
644 spin_lock_irq(&dice->lock); in snd_dice_stream_lock_try()
646 if (dice->dev_lock_count < 0) { in snd_dice_stream_lock_try()
651 if (dice->dev_lock_count++ == 0) in snd_dice_stream_lock_try()
652 dice_lock_changed(dice); in snd_dice_stream_lock_try()
655 spin_unlock_irq(&dice->lock); in snd_dice_stream_lock_try()
659 void snd_dice_stream_lock_release(struct snd_dice *dice) in snd_dice_stream_lock_release() argument
661 spin_lock_irq(&dice->lock); in snd_dice_stream_lock_release()
663 if (WARN_ON(dice->dev_lock_count <= 0)) in snd_dice_stream_lock_release()
666 if (--dice->dev_lock_count == 0) in snd_dice_stream_lock_release()
667 dice_lock_changed(dice); in snd_dice_stream_lock_release()
669 spin_unlock_irq(&dice->lock); in snd_dice_stream_lock_release()