ALSA: oxfw: don't add MIDI/PCM interface when packet streaming is unavailable
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Mon, 13 Jan 2020 07:34:17 +0000 (16:34 +0900)
committerTakashi Iwai <tiwai@suse.de>
Mon, 13 Jan 2020 09:42:14 +0000 (10:42 +0100)
Stanton SCS.1d doesn't support packet streaming even if it has plugs for
isochronous communication.

This commit is a preparation for this case. The 'has_input' member is
added to specific structure, and MIDI/PCM interfaces are not added when
the member is false.

Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Link: https://lore.kernel.org/r/20200113073418.24622-3-o-takashi@sakamocchi.jp
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/firewire/oxfw/oxfw-stream.c
sound/firewire/oxfw/oxfw.c
sound/firewire/oxfw/oxfw.h

index 6923246..36c3dd8 100644 (file)
@@ -772,6 +772,8 @@ int snd_oxfw_stream_discover(struct snd_oxfw *oxfw)
                        if (formation.midi > 0)
                                oxfw->midi_output_ports = 1;
                }
+
+               oxfw->has_input = true;
        }
 end:
        return err;
index fb6df3f..1f1e323 100644 (file)
@@ -118,7 +118,8 @@ static void oxfw_card_free(struct snd_card *card)
 {
        struct snd_oxfw *oxfw = card->private_data;
 
-       snd_oxfw_stream_destroy_duplex(oxfw);
+       if (oxfw->has_output || oxfw->has_input)
+               snd_oxfw_stream_destroy_duplex(oxfw);
 }
 
 static int detect_quirks(struct snd_oxfw *oxfw)
@@ -206,23 +207,25 @@ static void do_registration(struct work_struct *work)
        if (err < 0)
                goto error;
 
-       err = snd_oxfw_stream_init_duplex(oxfw);
-       if (err < 0)
-               goto error;
+       if (oxfw->has_output || oxfw->has_input) {
+               err = snd_oxfw_stream_init_duplex(oxfw);
+               if (err < 0)
+                       goto error;
 
-       err = snd_oxfw_create_pcm(oxfw);
-       if (err < 0)
-               goto error;
+               err = snd_oxfw_create_pcm(oxfw);
+               if (err < 0)
+                       goto error;
 
-       snd_oxfw_proc_init(oxfw);
+               snd_oxfw_proc_init(oxfw);
 
-       err = snd_oxfw_create_midi(oxfw);
-       if (err < 0)
-               goto error;
+               err = snd_oxfw_create_midi(oxfw);
+               if (err < 0)
+                       goto error;
 
-       err = snd_oxfw_create_hwdep(oxfw);
-       if (err < 0)
-               goto error;
+               err = snd_oxfw_create_hwdep(oxfw);
+               if (err < 0)
+                       goto error;
+       }
 
        err = snd_card_register(oxfw->card);
        if (err < 0)
@@ -274,9 +277,11 @@ static void oxfw_bus_reset(struct fw_unit *unit)
        fcp_bus_reset(oxfw->unit);
 
        if (oxfw->registered) {
-               mutex_lock(&oxfw->mutex);
-               snd_oxfw_stream_update_duplex(oxfw);
-               mutex_unlock(&oxfw->mutex);
+               if (oxfw->has_output || oxfw->has_input) {
+                       mutex_lock(&oxfw->mutex);
+                       snd_oxfw_stream_update_duplex(oxfw);
+                       mutex_unlock(&oxfw->mutex);
+               }
 
                if (oxfw->entry->vendor_id == OUI_STANTON)
                        snd_oxfw_scs1x_update(oxfw);
index c30e537..fa2d7f9 100644 (file)
@@ -45,6 +45,7 @@ struct snd_oxfw {
 
        bool wrong_dbs;
        bool has_output;
+       bool has_input;
        u8 *tx_stream_formats[SND_OXFW_STREAM_FORMAT_ENTRIES];
        u8 *rx_stream_formats[SND_OXFW_STREAM_FORMAT_ENTRIES];
        bool assumed;