ALSA: bebob: support AMDTP domain
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Sun, 4 Aug 2019 06:21:30 +0000 (15:21 +0900)
committerTakashi Iwai <tiwai@suse.de>
Mon, 5 Aug 2019 17:57:23 +0000 (19:57 +0200)
This commit adds AMDTP domain support for ALSA bebob driver.

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

index 9e0b689fe34a3796cfc8573011b2d9f9d8b447e6..356d6ba609590750a7b08e29de5bd263df5fc80d 100644 (file)
@@ -115,6 +115,8 @@ struct snd_bebob {
 
        /* For BeBoB version quirk. */
        unsigned int version;
+
+       struct amdtp_domain domain;
 };
 
 static inline int
index 334dc7c96e1d5131b08a05b23cfc52649c97ce15..73fee991bd75a500d25f074d78d6c71843505881 100644 (file)
@@ -445,10 +445,9 @@ start_stream(struct snd_bebob *bebob, struct amdtp_stream *stream)
                        goto end;
        }
 
-       /* start amdtp stream */
-       err = amdtp_stream_start(stream,
-                                conn->resources.channel,
-                                conn->speed);
+       // start amdtp stream.
+       err = amdtp_domain_add_stream(&bebob->domain, stream,
+                                     conn->resources.channel, conn->speed);
 end:
        return err;
 }
@@ -523,7 +522,13 @@ int snd_bebob_stream_init_duplex(struct snd_bebob *bebob)
                return err;
        }
 
-       return 0;
+       err = amdtp_domain_init(&bebob->domain);
+       if (err < 0) {
+               destroy_stream(bebob, &bebob->tx_stream);
+               destroy_stream(bebob, &bebob->rx_stream);
+       }
+
+       return err;
 }
 
 static int keep_resources(struct snd_bebob *bebob, struct amdtp_stream *stream,
@@ -566,9 +571,7 @@ int snd_bebob_stream_reserve_duplex(struct snd_bebob *bebob, unsigned int rate)
        if (rate == 0)
                rate = curr_rate;
        if (curr_rate != rate) {
-               amdtp_stream_stop(&bebob->tx_stream);
-               amdtp_stream_stop(&bebob->rx_stream);
-
+               amdtp_domain_stop(&bebob->domain);
                break_both_connections(bebob);
 
                cmp_connection_release(&bebob->out_conn);
@@ -620,9 +623,7 @@ int snd_bebob_stream_start_duplex(struct snd_bebob *bebob)
        // packet queueing error or detecting discontinuity
        if (amdtp_streaming_error(&bebob->rx_stream) ||
            amdtp_streaming_error(&bebob->tx_stream)) {
-               amdtp_stream_stop(&bebob->rx_stream);
-               amdtp_stream_stop(&bebob->tx_stream);
-
+               amdtp_domain_stop(&bebob->domain);
                break_both_connections(bebob);
        }
 
@@ -640,11 +641,16 @@ int snd_bebob_stream_start_duplex(struct snd_bebob *bebob)
                        return err;
 
                err = start_stream(bebob, &bebob->rx_stream);
-               if (err < 0) {
-                       dev_err(&bebob->unit->device,
-                               "fail to run AMDTP master stream:%d\n", err);
+               if (err < 0)
+                       goto error;
+
+               err = start_stream(bebob, &bebob->tx_stream);
+               if (err < 0)
+                       goto error;
+
+               err = amdtp_domain_start(&bebob->domain);
+               if (err < 0)
                        goto error;
-               }
 
                // NOTE:
                // The firmware customized by M-Audio uses these commands to
@@ -660,21 +666,8 @@ int snd_bebob_stream_start_duplex(struct snd_bebob *bebob)
                }
 
                if (!amdtp_stream_wait_callback(&bebob->rx_stream,
-                                               CALLBACK_TIMEOUT)) {
-                       err = -ETIMEDOUT;
-                       goto error;
-               }
-       }
-
-       if (!amdtp_stream_running(&bebob->tx_stream)) {
-               err = start_stream(bebob, &bebob->tx_stream);
-               if (err < 0) {
-                       dev_err(&bebob->unit->device,
-                               "fail to run AMDTP slave stream:%d\n", err);
-                       goto error;
-               }
-
-               if (!amdtp_stream_wait_callback(&bebob->tx_stream,
+                                               CALLBACK_TIMEOUT) ||
+                   !amdtp_stream_wait_callback(&bebob->tx_stream,
                                                CALLBACK_TIMEOUT)) {
                        err = -ETIMEDOUT;
                        goto error;
@@ -683,8 +676,7 @@ int snd_bebob_stream_start_duplex(struct snd_bebob *bebob)
 
        return 0;
 error:
-       amdtp_stream_stop(&bebob->tx_stream);
-       amdtp_stream_stop(&bebob->rx_stream);
+       amdtp_domain_stop(&bebob->domain);
        break_both_connections(bebob);
        return err;
 }
@@ -692,9 +684,7 @@ error:
 void snd_bebob_stream_stop_duplex(struct snd_bebob *bebob)
 {
        if (bebob->substreams_counter == 0) {
-               amdtp_stream_stop(&bebob->rx_stream);
-               amdtp_stream_stop(&bebob->tx_stream);
-
+               amdtp_domain_stop(&bebob->domain);
                break_both_connections(bebob);
 
                cmp_connection_release(&bebob->out_conn);
@@ -708,6 +698,8 @@ void snd_bebob_stream_stop_duplex(struct snd_bebob *bebob)
  */
 void snd_bebob_stream_destroy_duplex(struct snd_bebob *bebob)
 {
+       amdtp_domain_destroy(&bebob->domain);
+
        destroy_stream(bebob, &bebob->tx_stream);
        destroy_stream(bebob, &bebob->rx_stream);
 }