Commit 0fcd9f4b authored by Takashi Iwai's avatar Takashi Iwai

ALSA: control: Embed struct device

This patch embeds a struct device for the control device into the card
object and avoid the device creation at registration time.
Reviewed-by: default avatarJaroslav Kysela <perex@perex.cz>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 4b440be6
...@@ -109,6 +109,7 @@ struct snd_card { ...@@ -109,6 +109,7 @@ struct snd_card {
private data */ private data */
struct list_head devices; /* devices */ struct list_head devices; /* devices */
struct device ctl_dev; /* control device */
unsigned int last_numid; /* last used numeric ID */ unsigned int last_numid; /* last used numeric ID */
struct rw_semaphore controls_rwsem; /* controls list lock */ struct rw_semaphore controls_rwsem; /* controls list lock */
rwlock_t ctl_files_rwlock; /* ctl_files list lock */ rwlock_t ctl_files_rwlock; /* ctl_files list lock */
......
...@@ -1660,19 +1660,10 @@ static const struct file_operations snd_ctl_f_ops = ...@@ -1660,19 +1660,10 @@ static const struct file_operations snd_ctl_f_ops =
static int snd_ctl_dev_register(struct snd_device *device) static int snd_ctl_dev_register(struct snd_device *device)
{ {
struct snd_card *card = device->device_data; struct snd_card *card = device->device_data;
int err, cardnum;
char name[16];
if (snd_BUG_ON(!card)) return snd_register_device_for_dev(SNDRV_DEVICE_TYPE_CONTROL, card,
return -ENXIO; -1, &snd_ctl_f_ops, card,
cardnum = card->number; &card->ctl_dev, NULL, NULL);
if (snd_BUG_ON(cardnum < 0 || cardnum >= SNDRV_CARDS))
return -ENXIO;
sprintf(name, "controlC%i", cardnum);
if ((err = snd_register_device(SNDRV_DEVICE_TYPE_CONTROL, card, -1,
&snd_ctl_f_ops, card, name)) < 0)
return err;
return 0;
} }
/* /*
...@@ -1682,13 +1673,6 @@ static int snd_ctl_dev_disconnect(struct snd_device *device) ...@@ -1682,13 +1673,6 @@ static int snd_ctl_dev_disconnect(struct snd_device *device)
{ {
struct snd_card *card = device->device_data; struct snd_card *card = device->device_data;
struct snd_ctl_file *ctl; struct snd_ctl_file *ctl;
int err, cardnum;
if (snd_BUG_ON(!card))
return -ENXIO;
cardnum = card->number;
if (snd_BUG_ON(cardnum < 0 || cardnum >= SNDRV_CARDS))
return -ENXIO;
read_lock(&card->ctl_files_rwlock); read_lock(&card->ctl_files_rwlock);
list_for_each_entry(ctl, &card->ctl_files, list) { list_for_each_entry(ctl, &card->ctl_files, list) {
...@@ -1697,10 +1681,7 @@ static int snd_ctl_dev_disconnect(struct snd_device *device) ...@@ -1697,10 +1681,7 @@ static int snd_ctl_dev_disconnect(struct snd_device *device)
} }
read_unlock(&card->ctl_files_rwlock); read_unlock(&card->ctl_files_rwlock);
if ((err = snd_unregister_device(SNDRV_DEVICE_TYPE_CONTROL, return snd_unregister_device(SNDRV_DEVICE_TYPE_CONTROL, card, -1);
card, -1)) < 0)
return err;
return 0;
} }
/* /*
...@@ -1717,6 +1698,7 @@ static int snd_ctl_dev_free(struct snd_device *device) ...@@ -1717,6 +1698,7 @@ static int snd_ctl_dev_free(struct snd_device *device)
snd_ctl_remove(card, control); snd_ctl_remove(card, control);
} }
up_write(&card->controls_rwsem); up_write(&card->controls_rwsem);
put_device(&card->ctl_dev);
return 0; return 0;
} }
...@@ -1731,10 +1713,20 @@ int snd_ctl_create(struct snd_card *card) ...@@ -1731,10 +1713,20 @@ int snd_ctl_create(struct snd_card *card)
.dev_register = snd_ctl_dev_register, .dev_register = snd_ctl_dev_register,
.dev_disconnect = snd_ctl_dev_disconnect, .dev_disconnect = snd_ctl_dev_disconnect,
}; };
int err;
if (snd_BUG_ON(!card)) if (snd_BUG_ON(!card))
return -ENXIO; return -ENXIO;
return snd_device_new(card, SNDRV_DEV_CONTROL, card, &ops); if (snd_BUG_ON(card->number < 0 || card->number >= SNDRV_CARDS))
return -ENXIO;
snd_device_initialize(&card->ctl_dev, card);
dev_set_name(&card->ctl_dev, "controlC%d", card->number);
err = snd_device_new(card, SNDRV_DEV_CONTROL, card, &ops);
if (err < 0)
put_device(&card->ctl_dev);
return err;
} }
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment