From: Greg KH Adds sysfs sound class support for all OSS drivers Note, this is based on a previous patch from Leann Ogasawara , but modified a lot by me. 25-akpm/sound/oss/soundcard.c | 13 ++++++++++++- 25-akpm/sound/sound_core.c | 10 ++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff -puN sound/oss/soundcard.c~sysfs-add-oss-class sound/oss/soundcard.c --- 25/sound/oss/soundcard.c~sysfs-add-oss-class Wed Jan 7 16:11:46 2004 +++ 25-akpm/sound/oss/soundcard.c Wed Jan 7 16:11:46 2004 @@ -73,6 +73,7 @@ static char dma_alloc_map[MAX_DMA_CH unsigned long seq_time = 0; /* Time for /dev/sequencer */ +extern struct class sound_class; /* * Table for configurable mixer volume handling @@ -569,6 +570,9 @@ static int __init oss_init(void) devfs_mk_cdev(MKDEV(SOUND_MAJOR, dev_list[i].minor), S_IFCHR | dev_list[i].mode, "sound/%s", dev_list[i].name); + simple_add_class_device(&sound_class, + MKDEV(SOUND_MAJOR, dev_list[i].minor), + NULL, "%s", dev_list[i].name); if (!dev_list[i].num) continue; @@ -578,6 +582,10 @@ static int __init oss_init(void) dev_list[i].minor + (j*0x10)), S_IFCHR | dev_list[i].mode, "sound/%s%d", dev_list[i].name, j); + simple_add_class_device(&sound_class, + MKDEV(SOUND_MAJOR, dev_list[i].minor + (j*0x10)), + NULL, + "%s%d", dev_list[i].name, j); } } @@ -593,10 +601,13 @@ static void __exit oss_cleanup(void) for (i = 0; i < sizeof (dev_list) / sizeof *dev_list; i++) { devfs_remove("sound/%s", dev_list[i].name); + simple_remove_class_device(MKDEV(SOUND_MAJOR, dev_list[i].minor)); if (!dev_list[i].num) continue; - for (j = 1; j < *dev_list[i].num; j++) + for (j = 1; j < *dev_list[i].num; j++) { devfs_remove("sound/%s%d", dev_list[i].name, j); + simple_remove_class_device(MKDEV(SOUND_MAJOR, dev_list[i].minor + (j*0x10))); + } } unregister_sound_special(1); diff -puN sound/sound_core.c~sysfs-add-oss-class sound/sound_core.c --- 25/sound/sound_core.c~sysfs-add-oss-class Wed Jan 7 16:11:46 2004 +++ 25-akpm/sound/sound_core.c Wed Jan 7 16:11:46 2004 @@ -65,6 +65,11 @@ extern int msnd_classic_init(void); extern int msnd_pinnacle_init(void); #endif +struct class sound_class = { + .name = "sound", +}; +EXPORT_SYMBOL(sound_class); + /* * Low level list operator. Scan the ordered list, find a hole and * join into it. Called with the lock asserted @@ -171,6 +176,8 @@ static int sound_insert_unit(struct soun devfs_mk_cdev(MKDEV(SOUND_MAJOR, s->unit_minor), S_IFCHR | mode, s->name); + simple_add_class_device(&sound_class, MKDEV(SOUND_MAJOR, s->unit_minor), + NULL, s->name+6); return r; fail: @@ -193,6 +200,7 @@ static void sound_remove_unit(struct sou spin_unlock(&sound_loader_lock); if (p) { devfs_remove(p->name); + simple_remove_class_device(MKDEV(SOUND_MAJOR, p->unit_minor)); kfree(p); } } @@ -556,6 +564,7 @@ static void __exit cleanup_soundcore(voi empty */ unregister_chrdev(SOUND_MAJOR, "sound"); devfs_remove("sound"); + class_unregister(&sound_class); } static int __init init_soundcore(void) @@ -565,6 +574,7 @@ static int __init init_soundcore(void) return -EBUSY; } devfs_mk_dir ("sound"); + class_register(&sound_class); return 0; } _