]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - sound/core/pcm_native.c
ALSA: pcm: Unify snd_pcm_group initialization
[linux.git] / sound / core / pcm_native.c
index c72dfd1fc1ed94b36d4dbf52394f03df0da001e3..9e4e289e57034a70bc0d0adf271835f48417ef87 100644 (file)
@@ -100,6 +100,13 @@ static inline void down_write_nonfifo(struct rw_semaphore *lock)
                msleep(1);
 }
 
+void snd_pcm_group_init(struct snd_pcm_group *group)
+{
+       spin_lock_init(&group->lock);
+       mutex_init(&group->mutex);
+       INIT_LIST_HEAD(&group->substreams);
+}
+
 #define PCM_LOCK_DEFAULT       0
 #define PCM_LOCK_IRQ   1
 #define PCM_LOCK_IRQSAVE       2
@@ -1969,11 +1976,12 @@ static int snd_pcm_link(struct snd_pcm_substream *substream, int fd)
        }
        pcm_file = f.file->private_data;
        substream1 = pcm_file->substream;
-       group = kmalloc(sizeof(*group), GFP_KERNEL);
+       group = kzalloc(sizeof(*group), GFP_KERNEL);
        if (!group) {
                res = -ENOMEM;
                goto _nolock;
        }
+       snd_pcm_group_init(group);
        down_write_nonfifo(&snd_pcm_link_rwsem);
        write_lock_irq(&snd_pcm_link_rwlock);
        if (substream->runtime->status->state == SNDRV_PCM_STATE_OPEN ||
@@ -1989,9 +1997,6 @@ static int snd_pcm_link(struct snd_pcm_substream *substream, int fd)
        if (!snd_pcm_stream_linked(substream)) {
                substream->group = group;
                group = NULL;
-               spin_lock_init(&substream->group->lock);
-               mutex_init(&substream->group->mutex);
-               INIT_LIST_HEAD(&substream->group->substreams);
                list_add_tail(&substream->link_list, &substream->group->substreams);
                substream->group->count = 1;
        }