Commit 416c1079 authored by Clemens Ladisch's avatar Clemens Ladisch Committed by Jaroslav Kysela

[ALSA] Nest sound devices

Modules: ALSA Core

Make the control device parent of all other ALSA devices of a card.
Signed-off-by: default avatarClemens Ladisch <clemens@ladisch.de>
parent 156b2aa3
...@@ -134,6 +134,7 @@ struct snd_card { ...@@ -134,6 +134,7 @@ struct snd_card {
wait_queue_head_t shutdown_sleep; wait_queue_head_t shutdown_sleep;
struct work_struct free_workq; /* for free in workqueue */ struct work_struct free_workq; /* for free in workqueue */
struct device *dev; struct device *dev;
struct class_device *parent_device;
#ifdef CONFIG_PM #ifdef CONFIG_PM
unsigned int power_state; /* power state */ unsigned int power_state; /* power state */
......
...@@ -193,7 +193,7 @@ int snd_device_register_all(struct snd_card *card) ...@@ -193,7 +193,7 @@ int snd_device_register_all(struct snd_card *card)
int err; int err;
snd_assert(card != NULL, return -ENXIO); snd_assert(card != NULL, return -ENXIO);
list_for_each(list, &card->devices) { list_for_each_prev(list, &card->devices) {
dev = snd_device(list); dev = snd_device(list);
if (dev->state == SNDRV_DEV_BUILD && dev->ops->dev_register) { if (dev->state == SNDRV_DEV_BUILD && dev->ops->dev_register) {
if ((err = dev->ops->dev_register(dev)) < 0) if ((err = dev->ops->dev_register(dev)) < 0)
......
...@@ -245,6 +245,7 @@ int snd_register_device(int type, struct snd_card *card, int dev, ...@@ -245,6 +245,7 @@ int snd_register_device(int type, struct snd_card *card, int dev,
int minor; int minor;
struct snd_minor *preg; struct snd_minor *preg;
struct device *device = NULL; struct device *device = NULL;
struct class_device *class_device = NULL;
snd_assert(name, return -EINVAL); snd_assert(name, return -EINVAL);
preg = kmalloc(sizeof(struct snd_minor) + strlen(name) + 1, GFP_KERNEL); preg = kmalloc(sizeof(struct snd_minor) + strlen(name) + 1, GFP_KERNEL);
...@@ -272,9 +273,15 @@ int snd_register_device(int type, struct snd_card *card, int dev, ...@@ -272,9 +273,15 @@ int snd_register_device(int type, struct snd_card *card, int dev,
snd_minors[minor] = preg; snd_minors[minor] = preg;
if (type != SNDRV_DEVICE_TYPE_CONTROL || preg->card >= cards_limit) if (type != SNDRV_DEVICE_TYPE_CONTROL || preg->card >= cards_limit)
devfs_mk_cdev(MKDEV(major, minor), S_IFCHR | device_mode, "snd/%s", name); devfs_mk_cdev(MKDEV(major, minor), S_IFCHR | device_mode, "snd/%s", name);
if (card) if (card) {
device = card->dev; device = card->dev;
class_device_create(sound_class, NULL, MKDEV(major, minor), device, "%s", name); class_device = card->parent_device;
}
class_device = class_device_create(sound_class, class_device,
MKDEV(major, minor), device,
"%s", name);
if (type == SNDRV_DEVICE_TYPE_CONTROL)
card->parent_device = class_device;
up(&sound_mutex); up(&sound_mutex);
return 0; return 0;
......
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