Commit e7a3484d authored by Vinod Koul's avatar Vinod Koul Committed by Takashi Iwai

ALSA: hda: add hdac_ext stream creation and cleanup routines

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: default avatarJeeja KP <jeeja.kp@intel.com>
Signed-off-by: default avatarVinod Koul <vinod.koul@intel.com>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent d39513f8
...@@ -87,6 +87,9 @@ struct hdac_ext_stream { ...@@ -87,6 +87,9 @@ struct hdac_ext_stream {
void snd_hdac_ext_stream_init(struct hdac_ext_bus *bus, void snd_hdac_ext_stream_init(struct hdac_ext_bus *bus,
struct hdac_ext_stream *stream, int idx, struct hdac_ext_stream *stream, int idx,
int direction, int tag); 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 hdac_ext_stream *snd_hdac_ext_stream_assign(struct hdac_ext_bus *bus,
struct snd_pcm_substream *substream, struct snd_pcm_substream *substream,
int type); int type);
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
*/ */
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/slab.h>
#include <sound/pcm.h> #include <sound/pcm.h>
#include <sound/hda_register.h> #include <sound/hda_register.h>
#include <sound/hdaudio_ext.h> #include <sound/hdaudio_ext.h>
...@@ -53,6 +54,55 @@ void snd_hdac_ext_stream_init(struct hdac_ext_bus *ebus, ...@@ -53,6 +54,55 @@ void snd_hdac_ext_stream_init(struct hdac_ext_bus *ebus,
} }
EXPORT_SYMBOL_GPL(snd_hdac_ext_stream_init); 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 * snd_hdac_ext_stream_decouple - decouple the hdac stream
* @ebus: HD-audio ext core bus * @ebus: HD-audio ext core bus
......
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