ALSA: hda: add hdac_ext stream creation and cleanup routines
authorVinod Koul <vinod.koul@intel.com>
Wed, 17 Jun 2015 05:50:16 +0000 (11:20 +0530)
committerTakashi Iwai <tiwai@suse.de>
Wed, 17 Jun 2015 10:29:26 +0000 (12:29 +0200)
HDAC extended core should create streams for an extended bus and also free
up those on cleanup. So introduce snd_hdac_ext_stream_init_all and
snd_hdac_stream_free_all routines

Signed-off-by: Jeeja KP <jeeja.kp@intel.com>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
include/sound/hdaudio_ext.h
sound/hda/ext/hdac_ext_stream.c

index 202350a8eddb6fc29b3044996221e0b82be4d368..8776616293227f7cc5d706481650c61ba3c62952 100644 (file)
@@ -87,6 +87,9 @@ struct hdac_ext_stream {
 void snd_hdac_ext_stream_init(struct hdac_ext_bus *bus,
                                struct hdac_ext_stream *stream, int idx,
                                int direction, int tag);
+int snd_hdac_ext_stream_init_all(struct hdac_ext_bus *ebus, int start_idx,
+               int num_stream, int dir);
+void snd_hdac_stream_free_all(struct hdac_ext_bus *ebus);
 struct hdac_ext_stream *snd_hdac_ext_stream_assign(struct hdac_ext_bus *bus,
                                           struct snd_pcm_substream *substream,
                                           int type);
index 0677bb65a49401fbd7e0b5a4cb2daecbc15c1713..f8ffbdbb450d785e281bd7a0aae3c6d8a8c2a2ab 100644 (file)
@@ -18,6 +18,7 @@
  */
 
 #include <linux/delay.h>
+#include <linux/slab.h>
 #include <sound/pcm.h>
 #include <sound/hda_register.h>
 #include <sound/hdaudio_ext.h>
@@ -53,6 +54,55 @@ void snd_hdac_ext_stream_init(struct hdac_ext_bus *ebus,
 }
 EXPORT_SYMBOL_GPL(snd_hdac_ext_stream_init);
 
+/**
+ * snd_hdac_ext_stream_init_all - create and initialize the stream objects
+ *   for an extended hda bus
+ * @ebus: HD-audio ext core bus
+ * @start_idx: start index for streams
+ * @num_stream: number of streams to initialize
+ * @dir: direction of streams
+ */
+int snd_hdac_ext_stream_init_all(struct hdac_ext_bus *ebus, int start_idx,
+               int num_stream, int dir)
+{
+       int stream_tag = 0;
+       int i, tag, idx = start_idx;
+
+       for (i = 0; i < num_stream; i++) {
+               struct hdac_ext_stream *stream =
+                               kzalloc(sizeof(*stream), GFP_KERNEL);
+               if (!stream)
+                       return -ENOMEM;
+               tag = ++stream_tag;
+               snd_hdac_ext_stream_init(ebus, stream, idx, dir, tag);
+               idx++;
+       }
+
+       return 0;
+
+}
+EXPORT_SYMBOL_GPL(snd_hdac_ext_stream_init_all);
+
+/**
+ * snd_hdac_stream_free_all - free hdac extended stream objects
+ *
+ * @ebus: HD-audio ext core bus
+ */
+void snd_hdac_stream_free_all(struct hdac_ext_bus *ebus)
+{
+       struct hdac_stream *s;
+       struct hdac_ext_stream *stream;
+       struct hdac_bus *bus = ebus_to_hbus(ebus);
+
+       while (!list_empty(&bus->stream_list)) {
+               s = list_first_entry(&bus->stream_list, struct hdac_stream, list);
+               stream = stream_to_hdac_ext_stream(s);
+               list_del(&s->list);
+               kfree(stream);
+       }
+}
+EXPORT_SYMBOL_GPL(snd_hdac_stream_free_all);
+
 /**
  * snd_hdac_ext_stream_decouple - decouple the hdac stream
  * @ebus: HD-audio ext core bus