diff options
author | Jaroslav Kysela <perex@suse.cz> | 2005-01-03 16:10:46 +0100 |
---|---|---|
committer | Jaroslav Kysela <perex@suse.cz> | 2005-01-03 16:10:46 +0100 |
commit | ec3acaa892807736510bdd1a47280f766fc18273 (patch) | |
tree | 98aed3f81bfc713561a696a77ec06ea9f032abba /sound | |
parent | 47393b6a18917db45398bf6c3ebc4544da842f58 (diff) | |
download | history-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.c | 27 |
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 |