ALSA: hda: ext: simplify logic for stream assignment
authorPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Mon, 19 Sep 2022 12:10:39 +0000 (14:10 +0200)
committerTakashi Iwai <tiwai@suse.de>
Tue, 20 Sep 2022 06:08:14 +0000 (08:08 +0200)
The logic is needlessly complicated, the basic rule is:

The host streams can be found by checking the 'opened' boolean.
The link streams can be found by checking the 'link_locked' boolean.

Once a stream is found, it can be unconditionally decoupled. The
snd_hdac_ext_stream_decouple_locked() routine will make sure the
register status is modified as needed and the 'decoupled' boolean set.

Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com>
Reviewed-by: Péter Ujfalusi <peter.ujfalusi@linux.intel.com>
Reviewed-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
Link: https://lore.kernel.org/r/20220919121041.43463-7-pierre-louis.bossart@linux.intel.com
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/hda/ext/hdac_ext_stream.c

index 9419abd7fc0363aa150b702f13b622107d7a685c..254df9a67bd2b5b5aee6dfaf2aed5ecb735a1502 100644 (file)
@@ -267,19 +267,15 @@ hdac_ext_link_stream_assign(struct hdac_bus *bus,
                if (hstream->direction != substream->stream)
                        continue;
 
-               /* check if decoupled stream and not in use is available */
-               if (hext_stream->decoupled && !hext_stream->link_locked) {
-                       res = hext_stream;
-                       break;
-               }
-
+               /* check if link stream is available */
                if (!hext_stream->link_locked) {
-                       snd_hdac_ext_stream_decouple_locked(bus, hext_stream, true);
                        res = hext_stream;
                        break;
                }
+
        }
        if (res) {
+               snd_hdac_ext_stream_decouple_locked(bus, res, true);
                res->link_locked = 1;
                res->link_substream = substream;
        }
@@ -308,13 +304,12 @@ hdac_ext_host_stream_assign(struct hdac_bus *bus,
                        continue;
 
                if (!hstream->opened) {
-                       if (!hext_stream->decoupled)
-                               snd_hdac_ext_stream_decouple_locked(bus, hext_stream, true);
                        res = hext_stream;
                        break;
                }
        }
        if (res) {
+               snd_hdac_ext_stream_decouple_locked(bus, res, true);
                res->hstream.opened = 1;
                res->hstream.running = 0;
                res->hstream.substream = substream;