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: Jeeja KP <jeeja.kp@intel.com> Signed-off-by: Vinod Koul <vinod.koul@intel.com> Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
d39513f851
commit
e7a3484dc5
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue