[PATCH] ALSA: Fix sysfs breakage
The recent change for a new sysfs tree with card* object breaks the /sys/class/sound tree if CONFIG_SYSFS_DEPRECATED is enabled. The device in each entry doesn't point the correct device object: /sys/class/sound ... |-- pcmC0D0c | |-- dev | |-- device -> ../../../class/sound/card0 | |-- pcm_class | |-- power | | `-- wakeup | |-- subsystem -> ../../../class/sound | `-- uevent Also, this change breaks some drivers (like sound/arm/*) referring card->dev directly to obtain the device object for memory handling. This patch reverts the semantics of card->dev to the former version, which points to a real device object. The card* object is stored in a new card->card_dev field, instead. The device parent is chosen either card->dev or card->card_dev according to CONFIG_SYSFS_DEPRECATED to keep the tree compatibility. Also, card* isn't created if CONFIG_SYSFS_DEPRECATED is enabled. The reason of card* object is a root of all beloing devices, and it makes little sense if each sound device points to the real device object directly. Signed-off-by: Takashi Iwai <tiwai@suse.de> Acked-by: Monty Montgomery <xiphmont@gmail.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
5263bf65d6
commit
7d2aae1e88
@@ -361,8 +361,10 @@ static int snd_card_do_free(struct snd_card *card)
|
||||
snd_printk(KERN_WARNING "unable to free card info\n");
|
||||
/* Not fatal error */
|
||||
}
|
||||
if (card->dev)
|
||||
device_unregister(card->dev);
|
||||
#ifndef CONFIG_SYSFS_DEPRECATED
|
||||
if (card->card_dev)
|
||||
device_unregister(card->card_dev);
|
||||
#endif
|
||||
kfree(card);
|
||||
return 0;
|
||||
}
|
||||
@@ -497,12 +499,14 @@ int snd_card_register(struct snd_card *card)
|
||||
int err;
|
||||
|
||||
snd_assert(card != NULL, return -EINVAL);
|
||||
if (!card->dev) {
|
||||
card->dev = device_create(sound_class, card->parent, 0,
|
||||
"card%i", card->number);
|
||||
if (IS_ERR(card->dev))
|
||||
card->dev = NULL;
|
||||
#ifndef CONFIG_SYSFS_DEPRECATED
|
||||
if (!card->card_dev) {
|
||||
card->card_dev = device_create(sound_class, card->dev, 0,
|
||||
"card%i", card->number);
|
||||
if (IS_ERR(card->card_dev))
|
||||
card->card_dev = NULL;
|
||||
}
|
||||
#endif
|
||||
if ((err = snd_device_register_all(card)) < 0)
|
||||
return err;
|
||||
mutex_lock(&snd_card_mutex);
|
||||
|
Reference in New Issue
Block a user