|
@@ -1660,19 +1660,10 @@ static const struct file_operations snd_ctl_f_ops =
|
|
|
static int snd_ctl_dev_register(struct snd_device *device)
|
|
|
{
|
|
|
struct snd_card *card = device->device_data;
|
|
|
- int err, cardnum;
|
|
|
- char name[16];
|
|
|
|
|
|
- if (snd_BUG_ON(!card))
|
|
|
- return -ENXIO;
|
|
|
- cardnum = card->number;
|
|
|
- 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;
|
|
|
+ return snd_register_device_for_dev(SNDRV_DEVICE_TYPE_CONTROL, card,
|
|
|
+ -1, &snd_ctl_f_ops, card,
|
|
|
+ &card->ctl_dev, NULL, NULL);
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -1682,13 +1673,6 @@ static int snd_ctl_dev_disconnect(struct snd_device *device)
|
|
|
{
|
|
|
struct snd_card *card = device->device_data;
|
|
|
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);
|
|
|
list_for_each_entry(ctl, &card->ctl_files, list) {
|
|
@@ -1697,10 +1681,7 @@ static int snd_ctl_dev_disconnect(struct snd_device *device)
|
|
|
}
|
|
|
read_unlock(&card->ctl_files_rwlock);
|
|
|
|
|
|
- if ((err = snd_unregister_device(SNDRV_DEVICE_TYPE_CONTROL,
|
|
|
- card, -1)) < 0)
|
|
|
- return err;
|
|
|
- return 0;
|
|
|
+ return snd_unregister_device(SNDRV_DEVICE_TYPE_CONTROL, card, -1);
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -1717,6 +1698,7 @@ static int snd_ctl_dev_free(struct snd_device *device)
|
|
|
snd_ctl_remove(card, control);
|
|
|
}
|
|
|
up_write(&card->controls_rwsem);
|
|
|
+ put_device(&card->ctl_dev);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -1731,10 +1713,20 @@ int snd_ctl_create(struct snd_card *card)
|
|
|
.dev_register = snd_ctl_dev_register,
|
|
|
.dev_disconnect = snd_ctl_dev_disconnect,
|
|
|
};
|
|
|
+ int err;
|
|
|
|
|
|
if (snd_BUG_ON(!card))
|
|
|
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;
|
|
|
}
|
|
|
|
|
|
/*
|