]> err.no Git - linux-2.6/blobdiff - sound/core/control.c
Merge branch 'splice' of git://brick.kernel.dk/data/git/linux-2.6-block
[linux-2.6] / sound / core / control.c
index 9742bdba0de12c9debdf5417270ed98b6c8bee21..22565c9b9603ea3b43b6794ef7f09b724d338122 100644 (file)
@@ -309,28 +309,29 @@ int snd_ctl_add(struct snd_card *card, struct snd_kcontrol *kcontrol)
 {
        struct snd_ctl_elem_id id;
        unsigned int idx;
+       int err = -EINVAL;
 
-       snd_assert(card != NULL, return -EINVAL);
        if (! kcontrol)
-               return -EINVAL;
-       snd_assert(kcontrol->info != NULL, return -EINVAL);
+               return err;
+       snd_assert(card != NULL, goto error);
+       snd_assert(kcontrol->info != NULL, goto error);
        id = kcontrol->id;
        down_write(&card->controls_rwsem);
        if (snd_ctl_find_id(card, &id)) {
                up_write(&card->controls_rwsem);
-               snd_ctl_free_one(kcontrol);
                snd_printd(KERN_ERR "control %i:%i:%i:%s:%i is already present\n",
                                        id.iface,
                                        id.device,
                                        id.subdevice,
                                        id.name,
                                        id.index);
-               return -EBUSY;
+               err = -EBUSY;
+               goto error;
        }
        if (snd_ctl_find_hole(card, kcontrol->count) < 0) {
                up_write(&card->controls_rwsem);
-               snd_ctl_free_one(kcontrol);
-               return -ENOMEM;
+               err = -ENOMEM;
+               goto error;
        }
        list_add_tail(&kcontrol->list, &card->controls);
        card->controls_count += kcontrol->count;
@@ -340,6 +341,10 @@ int snd_ctl_add(struct snd_card *card, struct snd_kcontrol *kcontrol)
        for (idx = 0; idx < kcontrol->count; idx++, id.index++, id.numid++)
                snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_ADD, &id);
        return 0;
+
+ error:
+       snd_ctl_free_one(kcontrol);
+       return err;
 }
 
 /**
@@ -659,7 +664,7 @@ static int snd_ctl_elem_info_user(struct snd_ctl_file *ctl,
        if (copy_from_user(&info, _info, sizeof(info)))
                return -EFAULT;
        snd_power_lock(ctl->card);
-       result = snd_power_wait(ctl->card, SNDRV_CTL_POWER_D0, NULL);
+       result = snd_power_wait(ctl->card, SNDRV_CTL_POWER_D0);
        if (result >= 0)
                result = snd_ctl_elem_info(ctl, &info);
        snd_power_unlock(ctl->card);
@@ -713,7 +718,7 @@ static int snd_ctl_elem_read_user(struct snd_card *card,
                return -EFAULT;
        }
        snd_power_lock(card);
-       result = snd_power_wait(card, SNDRV_CTL_POWER_D0, NULL);
+       result = snd_power_wait(card, SNDRV_CTL_POWER_D0);
        if (result >= 0)
                result = snd_ctl_elem_read(card, control);
        snd_power_unlock(card);
@@ -778,7 +783,7 @@ static int snd_ctl_elem_write_user(struct snd_ctl_file *file,
        }
        card = file->card;
        snd_power_lock(card);
-       result = snd_power_wait(card, SNDRV_CTL_POWER_D0, NULL);
+       result = snd_power_wait(card, SNDRV_CTL_POWER_D0);
        if (result >= 0)
                result = snd_ctl_elem_write(card, file, control);
        snd_power_unlock(card);