]> www.infradead.org Git - users/willy/xarray.git/commitdiff
ALSA: firewire-motu: add helper function to keep isochronous resources
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Mon, 17 Jun 2019 08:15:03 +0000 (17:15 +0900)
committerTakashi Iwai <tiwai@suse.de>
Tue, 18 Jun 2019 06:45:28 +0000 (08:45 +0200)
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: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/firewire/motu/motu-stream.c

index c136d7f8c49c259edb3a7f37c50ece3d9994b590..35b4e0f72fe21c382bf7eefdbf4217db22de5468 100644 (file)
 #define  RX_PACKET_EXCLUDE_DIFFERED_DATA_CHUNKS        0x00000040
 #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;
-       __be32 reg;
-       u32 data;
        int err;
 
-       if ((motu->spec->flags & SND_MOTU_SPEC_RX_MIDI_2ND_Q) ||
-           (motu->spec->flags & SND_MOTU_SPEC_RX_MIDI_3RD_Q))
-               midi_ports = 1;
+       if (stream == &motu->rx_stream) {
+               resources = &motu->rx_resources;
+               packet_format = &motu->rx_packet_formats;
 
-       /* Set packet formation to our packet streaming engine. */
-       err = amdtp_motu_set_parameters(&motu->rx_stream, rate, midi_ports,
-                                       &motu->rx_packet_formats);
-       if (err < 0)
-               return err;
+               if ((motu->spec->flags & SND_MOTU_SPEC_RX_MIDI_2ND_Q) ||
+                   (motu->spec->flags & SND_MOTU_SPEC_RX_MIDI_3RD_Q))
+                       midi_ports = 1;
+       } else {
+               resources = &motu->tx_resources;
+               packet_format = &motu->tx_packet_formats;
 
-       if ((motu->spec->flags & SND_MOTU_SPEC_TX_MIDI_2ND_Q) ||
-           (motu->spec->flags & SND_MOTU_SPEC_TX_MIDI_3RD_Q))
-               midi_ports = 1;
-       else
-               midi_ports = 0;
+               if ((motu->spec->flags & SND_MOTU_SPEC_TX_MIDI_2ND_Q) ||
+                   (motu->spec->flags & SND_MOTU_SPEC_TX_MIDI_3RD_Q))
+                       midi_ports = 1;
+       }
 
-       err = amdtp_motu_set_parameters(&motu->tx_stream, rate, midi_ports,
-                                       &motu->tx_packet_formats);
+       err = amdtp_motu_set_parameters(stream, rate, midi_ports,
+                                       packet_format);
        if (err < 0)
                return err;
 
-       /* Get isochronous resources on the bus. */
-       err = fw_iso_resources_allocate(&motu->rx_resources,
-                               amdtp_stream_get_max_payload(&motu->rx_stream),
+       return fw_iso_resources_allocate(resources,
+                               amdtp_stream_get_max_payload(stream),
                                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)
                return err;
 
-       err = fw_iso_resources_allocate(&motu->tx_resources,
-                               amdtp_stream_get_max_payload(&motu->tx_stream),
-                               fw_parent_device(motu->unit)->max_speed);
+       err = keep_resources(motu, rate, &motu->rx_stream);
        if (err < 0)
                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,
                                        sizeof(reg));
        if (err < 0)