[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
@@ -132,8 +132,10 @@ struct snd_card {
|
||||
int shutdown; /* this card is going down */
|
||||
int free_on_last_close; /* free in context of file_release */
|
||||
wait_queue_head_t shutdown_sleep;
|
||||
struct device *parent;
|
||||
struct device *dev;
|
||||
struct device *dev; /* device assigned to this card */
|
||||
#ifndef CONFIG_SYSFS_DEPRECATED
|
||||
struct device *card_dev; /* cardX object for sysfs */
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
unsigned int power_state; /* power state */
|
||||
@@ -191,6 +193,16 @@ struct snd_minor {
|
||||
struct device *dev; /* device for sysfs */
|
||||
};
|
||||
|
||||
/* return a device pointer linked to each sound device as a parent */
|
||||
static inline struct device *snd_card_get_device_link(struct snd_card *card)
|
||||
{
|
||||
#ifdef CONFIG_SYSFS_DEPRECATED
|
||||
return card ? card->dev : NULL;
|
||||
#else
|
||||
return card ? card->card_dev : NULL;
|
||||
#endif
|
||||
}
|
||||
|
||||
/* sound.c */
|
||||
|
||||
extern int snd_major;
|
||||
@@ -257,7 +269,7 @@ int snd_card_file_add(struct snd_card *card, struct file *file);
|
||||
int snd_card_file_remove(struct snd_card *card, struct file *file);
|
||||
|
||||
#ifndef snd_card_set_dev
|
||||
#define snd_card_set_dev(card,devptr) ((card)->parent = (devptr))
|
||||
#define snd_card_set_dev(card,devptr) ((card)->dev = (devptr))
|
||||
#endif
|
||||
|
||||
/* device.c */
|
||||
|
Reference in New Issue
Block a user