ALSA: firewire-tascam: code refactoring for registration of isochronous channels
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Sun, 2 Jun 2019 07:12:45 +0000 (16:12 +0900)
committerTakashi Iwai <tiwai@suse.de>
Tue, 11 Jun 2019 09:36:17 +0000 (11:36 +0200)
This commit is a part of preparation to perform allocation/release
of isochronous channels in pcm.hw_params/hw_free callbacks.

The registration of isochronous channels is done just after allocation
of isochronous resources. This commit separates the registration just
before starting packet streaming.

Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/firewire/tascam/tascam-stream.c

index f1657a4e0621ef4999349477ce6e71fdbcd7f411..7cddd9ece4eecb755938a9dd9788400ed769c16e 100644 (file)
@@ -195,6 +195,19 @@ static void finish_session(struct snd_tscm *tscm)
                           TSCM_ADDR_BASE + TSCM_OFFSET_ISOC_RX_ON,
                           &reg, sizeof(reg), 0);
 
+       // Unregister channels.
+       reg = cpu_to_be32(0x00000000);
+       snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST,
+                          TSCM_ADDR_BASE + TSCM_OFFSET_ISOC_TX_CH,
+                          &reg, sizeof(reg), 0);
+       reg = cpu_to_be32(0x00000000);
+       snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST,
+                          TSCM_ADDR_BASE + TSCM_OFFSET_UNKNOWN,
+                          &reg, sizeof(reg), 0);
+       reg = cpu_to_be32(0x00000000);
+       snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST,
+                          TSCM_ADDR_BASE + TSCM_OFFSET_ISOC_RX_CH,
+                          &reg, sizeof(reg), 0);
 }
 
 static int begin_session(struct snd_tscm *tscm)
@@ -202,6 +215,30 @@ static int begin_session(struct snd_tscm *tscm)
        __be32 reg;
        int err;
 
+       // Register the isochronous channel for transmitting stream.
+       reg = cpu_to_be32(tscm->tx_resources.channel);
+       err = snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST,
+                                TSCM_ADDR_BASE + TSCM_OFFSET_ISOC_TX_CH,
+                                &reg, sizeof(reg), 0);
+       if (err < 0)
+               return err;
+
+       // Unknown.
+       reg = cpu_to_be32(0x00000002);
+       err = snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST,
+                                TSCM_ADDR_BASE + TSCM_OFFSET_UNKNOWN,
+                                &reg, sizeof(reg), 0);
+       if (err < 0)
+               return err;
+
+       // Register the isochronous channel for receiving stream.
+       reg = cpu_to_be32(tscm->rx_resources.channel);
+       err = snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST,
+                                TSCM_ADDR_BASE + TSCM_OFFSET_ISOC_RX_CH,
+                                &reg, sizeof(reg), 0);
+       if (err < 0)
+               return err;
+
        reg = cpu_to_be32(0x00000001);
        err = snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST,
                                 TSCM_ADDR_BASE + TSCM_OFFSET_START_STREAMING,
@@ -216,7 +253,7 @@ static int begin_session(struct snd_tscm *tscm)
        if (err < 0)
                return err;
 
-       /* Set an option for unknown purpose. */
+       // Set an option for unknown purpose.
        reg = cpu_to_be32(0x00002000);
        err = snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST,
                                 TSCM_ADDR_BASE + TSCM_OFFSET_SET_OPTION,
@@ -224,7 +261,7 @@ static int begin_session(struct snd_tscm *tscm)
        if (err < 0)
                return err;
 
-       /* Start multiplexing PCM samples on packets. */
+       // Start multiplexing PCM samples on packets.
        reg = cpu_to_be32(0x00000001);
        return snd_fw_transaction(tscm->unit,
                                  TCODE_WRITE_QUADLET_REQUEST,
@@ -234,30 +271,13 @@ static int begin_session(struct snd_tscm *tscm)
 
 static void release_resources(struct snd_tscm *tscm)
 {
-       __be32 reg;
-
-       /* Unregister channels. */
-       reg = cpu_to_be32(0x00000000);
-       snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST,
-                          TSCM_ADDR_BASE + TSCM_OFFSET_ISOC_TX_CH,
-                          &reg, sizeof(reg), 0);
-       reg = cpu_to_be32(0x00000000);
-       snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST,
-                          TSCM_ADDR_BASE + TSCM_OFFSET_UNKNOWN,
-                          &reg, sizeof(reg), 0);
-       reg = cpu_to_be32(0x00000000);
-       snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST,
-                          TSCM_ADDR_BASE + TSCM_OFFSET_ISOC_RX_CH,
-                          &reg, sizeof(reg), 0);
-
-       /* Release isochronous resources. */
+       // Release isochronous resources.
        fw_iso_resources_free(&tscm->tx_resources);
        fw_iso_resources_free(&tscm->rx_resources);
 }
 
 static int keep_resources(struct snd_tscm *tscm, unsigned int rate)
 {
-       __be32 reg;
        int err;
 
        /* Keep resources for in-stream. */
@@ -280,30 +300,6 @@ static int keep_resources(struct snd_tscm *tscm, unsigned int rate)
        if (err < 0)
                return err;
 
-       /* Register the isochronous channel for transmitting stream. */
-       reg = cpu_to_be32(tscm->tx_resources.channel);
-       err = snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST,
-                                TSCM_ADDR_BASE + TSCM_OFFSET_ISOC_TX_CH,
-                                &reg, sizeof(reg), 0);
-       if (err < 0)
-               goto error;
-
-       /* Unknown */
-       reg = cpu_to_be32(0x00000002);
-       err = snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST,
-                                TSCM_ADDR_BASE + TSCM_OFFSET_UNKNOWN,
-                                &reg, sizeof(reg), 0);
-       if (err < 0)
-               goto error;
-
-       /* Register the isochronous channel for receiving stream. */
-       reg = cpu_to_be32(tscm->rx_resources.channel);
-       err = snd_fw_transaction(tscm->unit, TCODE_WRITE_QUADLET_REQUEST,
-                                TSCM_ADDR_BASE + TSCM_OFFSET_ISOC_RX_CH,
-                                &reg, sizeof(reg), 0);
-       if (err < 0)
-               goto error;
-
        return 0;
 error:
        release_resources(tscm);