ALSA: hda: Allow for compress stream to hdac_ext_stream assignment
authorCezary Rojewski <cezary.rojewski@intel.com>
Fri, 2 Dec 2022 15:28:26 +0000 (16:28 +0100)
committerMark Brown <broonie@kernel.org>
Mon, 5 Dec 2022 14:05:18 +0000 (14:05 +0000)
Currently only PCM streams can enlist hdac_stream for their data
transfer. Add cstream field to hdac_ext_stream to expose possibility of
compress stream assignment in place of PCM one.
Limited to HOST-type only as there no other users on the horizon.

Signed-off-by: Cezary Rojewski <cezary.rojewski@intel.com>
Acked-by: Takashi Iwai <tiwai@suse.de>
Link: https://lore.kernel.org/r/20221202152841.672536-2-cezary.rojewski@intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
include/sound/hdaudio_ext.h
sound/hda/ext/hdac_ext_stream.c

index 68ab892..511211f 100644 (file)
@@ -75,6 +75,8 @@ struct hdac_ext_stream *snd_hdac_ext_stream_assign(struct hdac_bus *bus,
                                           struct snd_pcm_substream *substream,
                                           int type);
 void snd_hdac_ext_stream_release(struct hdac_ext_stream *hext_stream, int type);
+struct hdac_ext_stream *snd_hdac_ext_cstream_assign(struct hdac_bus *bus,
+                                                   struct snd_compr_stream *cstream);
 void snd_hdac_ext_stream_decouple_locked(struct hdac_bus *bus,
                                         struct hdac_ext_stream *hext_stream, bool decouple);
 void snd_hdac_ext_stream_decouple(struct hdac_bus *bus,
index 2a071a0..11b7119 100644 (file)
@@ -14,6 +14,7 @@
 #include <sound/pcm.h>
 #include <sound/hda_register.h>
 #include <sound/hdaudio_ext.h>
+#include <sound/compress_driver.h>
 
 /**
  * snd_hdac_ext_stream_init - initialize each stream (aka device)
@@ -367,3 +368,43 @@ void snd_hdac_ext_stream_release(struct hdac_ext_stream *hext_stream, int type)
 
 }
 EXPORT_SYMBOL_GPL(snd_hdac_ext_stream_release);
+
+/**
+ * snd_hdac_ext_cstream_assign - assign a host stream for compress
+ * @bus: HD-audio core bus
+ * @cstream: Compress stream to assign
+ *
+ * Assign an unused host stream for the given compress stream.
+ * If no stream is free, NULL is returned. Stream is decoupled
+ * before assignment.
+ */
+struct hdac_ext_stream *snd_hdac_ext_cstream_assign(struct hdac_bus *bus,
+                                                   struct snd_compr_stream *cstream)
+{
+       struct hdac_ext_stream *res = NULL;
+       struct hdac_stream *hstream;
+
+       spin_lock_irq(&bus->reg_lock);
+       list_for_each_entry(hstream, &bus->stream_list, list) {
+               struct hdac_ext_stream *hext_stream = stream_to_hdac_ext_stream(hstream);
+
+               if (hstream->direction != cstream->direction)
+                       continue;
+
+               if (!hstream->opened) {
+                       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.cstream = cstream;
+       }
+       spin_unlock_irq(&bus->reg_lock);
+
+       return res;
+}
+EXPORT_SYMBOL_GPL(snd_hdac_ext_cstream_assign);