Lines Matching +full:re +full:- +full:sampling

1 // SPDX-License-Identifier: GPL-2.0-only
3 * dice_stream.c - a part of driver for DICE based devices
6 * Copyright (c) 2014 Takashi Sakamoto <o-takashi@sakamocchi.jp>
48 if (!(dice->clock_caps & BIT(i))) in snd_dice_stream_get_rate_mode()
57 return -EINVAL; in snd_dice_stream_get_rate_mode()
80 return -EINVAL; in select_clock()
83 if (completion_done(&dice->clock_accepted)) in select_clock()
84 reinit_completion(&dice->clock_accepted); in select_clock()
92 if (wait_for_completion_timeout(&dice->clock_accepted, in select_clock()
95 return -ETIMEDOUT; in select_clock()
111 tx_params->count = in get_register_params()
113 tx_params->size = be32_to_cpu(reg[1]) * 4; in get_register_params()
118 rx_params->count = in get_register_params()
120 rx_params->size = be32_to_cpu(reg[1]) * 4; in get_register_params()
130 fw_iso_resources_free(&dice->tx_resources[i]); in release_resources()
131 fw_iso_resources_free(&dice->rx_resources[i]); in release_resources()
141 for (i = 0; i < params->count; i++) { in stop_streams()
142 reg = cpu_to_be32((u32)-1); in stop_streams()
145 params->size * i + TX_ISOCHRONOUS, in stop_streams()
149 params->size * i + RX_ISOCHRONOUS, in stop_streams()
164 // one data block of AMDTP packet. Thus sampling transfer frequency is in keep_resources()
165 // a half of PCM sampling frequency, i.e. PCM frames at 192.0 kHz are in keep_resources()
171 double_pcm_frames = (rate > 96000 && !dice->disable_double_pcm_frames); in keep_resources()
194 fw_parent_device(dice->unit)->max_speed); in keep_resources()
209 for (i = 0; i < params->count; ++i) { in keep_dual_resources()
218 stream = &dice->tx_stream[i]; in keep_dual_resources()
219 resources = &dice->tx_resources[i]; in keep_dual_resources()
221 pcm_cache = dice->tx_pcm_chs[i][mode]; in keep_dual_resources()
223 params->size * i + TX_NUMBER_AUDIO, in keep_dual_resources()
226 stream = &dice->rx_stream[i]; in keep_dual_resources()
227 resources = &dice->rx_resources[i]; in keep_dual_resources()
229 pcm_cache = dice->rx_pcm_chs[i][mode]; in keep_dual_resources()
231 params->size * i + RX_NUMBER_AUDIO, in keep_dual_resources()
241 dev_info(&dice->unit->device, in keep_dual_resources()
244 return -EPROTO; in keep_dual_resources()
272 // Check sampling transmission frequency. in snd_dice_stream_reserve_duplex()
279 if (dice->substreams_counter == 0 || curr_rate != rate) { in snd_dice_stream_reserve_duplex()
282 amdtp_domain_stop(&dice->domain); in snd_dice_stream_reserve_duplex()
298 // After changing sampling transfer frequency, the value of in snd_dice_stream_reserve_duplex()
314 err = amdtp_domain_set_events_per_period(&dice->domain, in snd_dice_stream_reserve_duplex()
329 unsigned int max_speed = fw_parent_device(dice->unit)->max_speed; in start_streams()
333 for (i = 0; i < params->count; i++) { in start_streams()
339 stream = dice->tx_stream + i; in start_streams()
340 resources = dice->tx_resources + i; in start_streams()
342 stream = dice->rx_stream + i; in start_streams()
343 resources = dice->rx_resources + i; in start_streams()
346 reg = cpu_to_be32(resources->channel); in start_streams()
349 params->size * i + TX_ISOCHRONOUS, in start_streams()
353 params->size * i + RX_ISOCHRONOUS, in start_streams()
362 params->size * i + TX_SPEED, in start_streams()
368 err = amdtp_domain_add_stream(&dice->domain, stream, in start_streams()
369 resources->channel, max_speed); in start_streams()
378 * MEMO: After this function, there're two states of streams:
379 * - None streams are running.
380 * - All streams are running.
384 unsigned int generation = dice->rx_resources[0].generation; in snd_dice_stream_start_duplex()
391 if (dice->substreams_counter == 0) in snd_dice_stream_start_duplex()
392 return -EIO; in snd_dice_stream_start_duplex()
400 if (amdtp_streaming_error(&dice->tx_stream[i]) || in snd_dice_stream_start_duplex()
401 amdtp_streaming_error(&dice->rx_stream[i])) { in snd_dice_stream_start_duplex()
402 amdtp_domain_stop(&dice->domain); in snd_dice_stream_start_duplex()
408 if (generation != fw_parent_device(dice->unit)->card->generation) { in snd_dice_stream_start_duplex()
411 fw_iso_resources_update(dice->tx_resources + i); in snd_dice_stream_start_duplex()
413 fw_iso_resources_update(dice->rx_resources + i); 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()
444 dev_err(&dice->unit->device, in snd_dice_stream_start_duplex()
453 err = amdtp_domain_start(&dice->domain, 0, true, false); in snd_dice_stream_start_duplex()
457 if (!amdtp_domain_wait_ready(&dice->domain, READY_TIMEOUT_MS)) { in snd_dice_stream_start_duplex()
458 err = -ETIMEDOUT; in snd_dice_stream_start_duplex()
465 amdtp_domain_stop(&dice->domain); in snd_dice_stream_start_duplex()
471 * MEMO: After this function, there're two states of streams:
472 * - None streams are running.
473 * - All streams are running.
479 if (dice->substreams_counter == 0) { in snd_dice_stream_stop_duplex()
483 amdtp_domain_stop(&dice->domain); in snd_dice_stream_stop_duplex()
496 stream = &dice->tx_stream[index]; in init_stream()
497 resources = &dice->tx_resources[index]; in init_stream()
499 stream = &dice->rx_stream[index]; in init_stream()
500 resources = &dice->rx_resources[index]; in init_stream()
503 err = fw_iso_resources_init(resources, dice->unit); in init_stream()
506 resources->channels_mask = 0x00000000ffffffffuLL; in init_stream()
508 err = amdtp_am824_init(stream, dice->unit, dir, CIP_BLOCKING); in init_stream()
529 stream = &dice->tx_stream[index]; in destroy_stream()
530 resources = &dice->tx_resources[index]; in destroy_stream()
532 stream = &dice->rx_stream[index]; in destroy_stream()
533 resources = &dice->rx_resources[index]; in destroy_stream()
547 for (; i >= 0; i--) in snd_dice_stream_init_duplex()
556 for (; i >= 0; i--) in snd_dice_stream_init_duplex()
564 err = amdtp_domain_init(&dice->domain); in snd_dice_stream_init_duplex()
584 amdtp_domain_destroy(&dice->domain); in snd_dice_stream_destroy_duplex()
599 dice->global_enabled = false; in snd_dice_stream_update_duplex()
602 amdtp_domain_stop(&dice->domain); in snd_dice_stream_update_duplex()
624 * Available stream format is restricted at current mode of sampling in snd_dice_stream_detect_current_formats()
654 dice->tx_pcm_chs[i][mode] = be32_to_cpu(reg[0]); in snd_dice_stream_detect_current_formats()
655 dice->tx_midi_ports[i] = max_t(unsigned int, in snd_dice_stream_detect_current_formats()
656 be32_to_cpu(reg[1]), dice->tx_midi_ports[i]); in snd_dice_stream_detect_current_formats()
664 dice->rx_pcm_chs[i][mode] = be32_to_cpu(reg[0]); in snd_dice_stream_detect_current_formats()
665 dice->rx_midi_ports[i] = max_t(unsigned int, in snd_dice_stream_detect_current_formats()
666 be32_to_cpu(reg[1]), dice->rx_midi_ports[i]); in snd_dice_stream_detect_current_formats()
674 dice->dev_lock_changed = true; in dice_lock_changed()
675 wake_up(&dice->hwdep_wait); in dice_lock_changed()
682 spin_lock_irq(&dice->lock); in snd_dice_stream_lock_try()
684 if (dice->dev_lock_count < 0) { in snd_dice_stream_lock_try()
685 err = -EBUSY; in snd_dice_stream_lock_try()
689 if (dice->dev_lock_count++ == 0) in snd_dice_stream_lock_try()
693 spin_unlock_irq(&dice->lock); in snd_dice_stream_lock_try()
699 spin_lock_irq(&dice->lock); in snd_dice_stream_lock_release()
701 if (WARN_ON(dice->dev_lock_count <= 0)) in snd_dice_stream_lock_release()
704 if (--dice->dev_lock_count == 0) in snd_dice_stream_lock_release()
707 spin_unlock_irq(&dice->lock); in snd_dice_stream_lock_release()