Commit 53f4f6b4 authored by Pierre-Louis Bossart's avatar Pierre-Louis Bossart Committed by Takashi Iwai

ALSA: hda: ext: simplify logic for stream assignment

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: default avatarPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: default avatarBard Liao <yung-chuan.liao@linux.intel.com>
Reviewed-by: default avatarPéter Ujfalusi <peter.ujfalusi@linux.intel.com>
Reviewed-by: default avatarKai Vehmanen <kai.vehmanen@linux.intel.com>
Link: https://lore.kernel.org/r/20220919121041.43463-7-pierre-louis.bossart@linux.intel.comSigned-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 24ad3835
...@@ -267,19 +267,15 @@ hdac_ext_link_stream_assign(struct hdac_bus *bus, ...@@ -267,19 +267,15 @@ hdac_ext_link_stream_assign(struct hdac_bus *bus,
if (hstream->direction != substream->stream) if (hstream->direction != substream->stream)
continue; continue;
/* check if decoupled stream and not in use is available */ /* check if link stream is available */
if (hext_stream->decoupled && !hext_stream->link_locked) {
res = hext_stream;
break;
}
if (!hext_stream->link_locked) { if (!hext_stream->link_locked) {
snd_hdac_ext_stream_decouple_locked(bus, hext_stream, true);
res = hext_stream; res = hext_stream;
break; break;
} }
} }
if (res) { if (res) {
snd_hdac_ext_stream_decouple_locked(bus, res, true);
res->link_locked = 1; res->link_locked = 1;
res->link_substream = substream; res->link_substream = substream;
} }
...@@ -308,13 +304,12 @@ hdac_ext_host_stream_assign(struct hdac_bus *bus, ...@@ -308,13 +304,12 @@ hdac_ext_host_stream_assign(struct hdac_bus *bus,
continue; continue;
if (!hstream->opened) { if (!hstream->opened) {
if (!hext_stream->decoupled)
snd_hdac_ext_stream_decouple_locked(bus, hext_stream, true);
res = hext_stream; res = hext_stream;
break; break;
} }
} }
if (res) { if (res) {
snd_hdac_ext_stream_decouple_locked(bus, res, true);
res->hstream.opened = 1; res->hstream.opened = 1;
res->hstream.running = 0; res->hstream.running = 0;
res->hstream.substream = substream; res->hstream.substream = substream;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment