Commit 8350132e authored by Takashi Sakamoto's avatar Takashi Sakamoto Committed by Takashi Iwai

ALSA: firewire-motu: add helper function to keep isochronous resources

This commit is a part of preparation to perform allocation/release
of isochronous resources in pcm.hw_params/hw_free callbacks.

This commit adds a helper function to allocate isochronous resources.
Signed-off-by: default avatarTakashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent f6341db6
...@@ -26,48 +26,55 @@ ...@@ -26,48 +26,55 @@
#define RX_PACKET_EXCLUDE_DIFFERED_DATA_CHUNKS 0x00000040 #define RX_PACKET_EXCLUDE_DIFFERED_DATA_CHUNKS 0x00000040
#define TX_PACKET_TRANSMISSION_SPEED_MASK 0x0000000f #define TX_PACKET_TRANSMISSION_SPEED_MASK 0x0000000f
static int start_both_streams(struct snd_motu *motu, unsigned int rate) static int keep_resources(struct snd_motu *motu, unsigned int rate,
struct amdtp_stream *stream)
{ {
struct fw_iso_resources *resources;
struct snd_motu_packet_format *packet_format;
unsigned int midi_ports = 0; unsigned int midi_ports = 0;
__be32 reg;
u32 data;
int err; int err;
if ((motu->spec->flags & SND_MOTU_SPEC_RX_MIDI_2ND_Q) || if (stream == &motu->rx_stream) {
(motu->spec->flags & SND_MOTU_SPEC_RX_MIDI_3RD_Q)) resources = &motu->rx_resources;
midi_ports = 1; packet_format = &motu->rx_packet_formats;
/* Set packet formation to our packet streaming engine. */ if ((motu->spec->flags & SND_MOTU_SPEC_RX_MIDI_2ND_Q) ||
err = amdtp_motu_set_parameters(&motu->rx_stream, rate, midi_ports, (motu->spec->flags & SND_MOTU_SPEC_RX_MIDI_3RD_Q))
&motu->rx_packet_formats); midi_ports = 1;
if (err < 0) } else {
return err; resources = &motu->tx_resources;
packet_format = &motu->tx_packet_formats;
if ((motu->spec->flags & SND_MOTU_SPEC_TX_MIDI_2ND_Q) || if ((motu->spec->flags & SND_MOTU_SPEC_TX_MIDI_2ND_Q) ||
(motu->spec->flags & SND_MOTU_SPEC_TX_MIDI_3RD_Q)) (motu->spec->flags & SND_MOTU_SPEC_TX_MIDI_3RD_Q))
midi_ports = 1; midi_ports = 1;
else }
midi_ports = 0;
err = amdtp_motu_set_parameters(&motu->tx_stream, rate, midi_ports, err = amdtp_motu_set_parameters(stream, rate, midi_ports,
&motu->tx_packet_formats); packet_format);
if (err < 0) if (err < 0)
return err; return err;
/* Get isochronous resources on the bus. */ return fw_iso_resources_allocate(resources,
err = fw_iso_resources_allocate(&motu->rx_resources, amdtp_stream_get_max_payload(stream),
amdtp_stream_get_max_payload(&motu->rx_stream),
fw_parent_device(motu->unit)->max_speed); fw_parent_device(motu->unit)->max_speed);
}
static int start_both_streams(struct snd_motu *motu, unsigned int rate)
{
__be32 reg;
u32 data;
int err;
err = keep_resources(motu, rate, &motu->tx_stream);
if (err < 0) if (err < 0)
return err; return err;
err = fw_iso_resources_allocate(&motu->tx_resources, err = keep_resources(motu, rate, &motu->rx_stream);
amdtp_stream_get_max_payload(&motu->tx_stream),
fw_parent_device(motu->unit)->max_speed);
if (err < 0) if (err < 0)
return err; return err;
/* Configure the unit to start isochronous communication. */ // Configure the unit to start isochronous communication.
err = snd_motu_transaction_read(motu, ISOC_COMM_CONTROL_OFFSET, &reg, err = snd_motu_transaction_read(motu, ISOC_COMM_CONTROL_OFFSET, &reg,
sizeof(reg)); sizeof(reg));
if (err < 0) if (err < 0)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment