aboutsummaryrefslogtreecommitdiffstats
path: root/sound
diff options
context:
space:
mode:
authorJaroslav Kysela <perex@suse.cz>2005-01-03 16:10:46 +0100
committerJaroslav Kysela <perex@suse.cz>2005-01-03 16:10:46 +0100
commitec3acaa892807736510bdd1a47280f766fc18273 (patch)
tree98aed3f81bfc713561a696a77ec06ea9f032abba /sound
parent47393b6a18917db45398bf6c3ebc4544da842f58 (diff)
downloadhistory-ec3acaa892807736510bdd1a47280f766fc18273.tar.gz
[ALSA] Fix the release of resources at error path
Control Midlevel Implemented free callback to fix the release of control resources before calling register. Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound')
-rw-r--r--sound/core/control.c27
1 files changed, 19 insertions, 8 deletions
diff --git a/sound/core/control.c b/sound/core/control.c
index e9e0c2788265db..903469fabe81ea 100644
--- a/sound/core/control.c
+++ b/sound/core/control.c
@@ -1324,19 +1324,13 @@ static int snd_ctl_dev_disconnect(snd_device_t *device)
}
/*
- * de-registration of the control device
+ * free all controls
*/
-static int snd_ctl_dev_unregister(snd_device_t *device)
+static int snd_ctl_dev_free(snd_device_t *device)
{
snd_card_t *card = device->device_data;
- int err, cardnum;
snd_kcontrol_t *control;
- snd_assert(card != NULL, return -ENXIO);
- cardnum = card->number;
- snd_assert(cardnum >= 0 && cardnum < SNDRV_CARDS, return -ENXIO);
- if ((err = snd_unregister_device(SNDRV_DEVICE_TYPE_CONTROL, card, 0)) < 0)
- return err;
down_write(&card->controls_rwsem);
while (!list_empty(&card->controls)) {
control = snd_kcontrol(card->controls.next);
@@ -1347,12 +1341,29 @@ static int snd_ctl_dev_unregister(snd_device_t *device)
}
/*
+ * de-registration of the control device
+ */
+static int snd_ctl_dev_unregister(snd_device_t *device)
+{
+ snd_card_t *card = device->device_data;
+ int err, cardnum;
+
+ snd_assert(card != NULL, return -ENXIO);
+ cardnum = card->number;
+ snd_assert(cardnum >= 0 && cardnum < SNDRV_CARDS, return -ENXIO);
+ if ((err = snd_unregister_device(SNDRV_DEVICE_TYPE_CONTROL, card, 0)) < 0)
+ return err;
+ return snd_ctl_dev_free(device);
+}
+
+/*
* create control core:
* called from init.c
*/
int snd_ctl_create(snd_card_t *card)
{
static snd_device_ops_t ops = {
+ .dev_free = snd_ctl_dev_free,
.dev_register = snd_ctl_dev_register,
.dev_disconnect = snd_ctl_dev_disconnect,
.dev_unregister = snd_ctl_dev_unregister