sound: Use sound_register_*() for additional OSS minor devices
authorTakashi Iwai <tiwai@suse.de>
Wed, 9 Mar 2011 16:33:48 +0000 (17:33 +0100)
committerTakashi Iwai <tiwai@suse.de>
Wed, 9 Mar 2011 19:10:37 +0000 (20:10 +0100)
Since OSS driver creates the device entries for /dev/audio* and
/dev/dspW* by itself without coping with sound_core, it leads to
conflicts with others and let sysfs spewing warnings.

This patch rewrites the registration part of OSS driver to use
the standard method also for additional minor devices.

Reported-by: Steven Rostedt <rostedt@goodmis.org> (with ktest.pl)
Tested-by: Steven Rostedt <rostedt@goodmis.org> (with ktest.pl)
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/oss/soundcard.c
sound/sound_core.c

index fcb14a09982262d473842aeb55f365b031ebeb70..7c7793a0eb25ad29c0c7f724ada99b48cdfa98c9 100644 (file)
@@ -526,31 +526,21 @@ bad:
 }
 
 
-/* These device names follow the official Linux device list,
- * Documentation/devices.txt.  Let us know if there are other
- * common names we should support for compatibility.
- * Only those devices not created by the generic code in sound_core.c are
- * registered here.
- */
-static const struct {
-       unsigned short minor;
-       char *name;
-       umode_t mode;
-       int *num;
-} dev_list[] = { /* list of minor devices */
-/* seems to be some confusion here -- this device is not in the device list */
-       {SND_DEV_DSP16,     "dspW",      S_IWUGO | S_IRUSR | S_IRGRP,
-        &num_audiodevs},
-       {SND_DEV_AUDIO,     "audio",     S_IWUGO | S_IRUSR | S_IRGRP,
-        &num_audiodevs},
-};
-
 static int dmabuf;
 static int dmabug;
 
 module_param(dmabuf, int, 0444);
 module_param(dmabug, int, 0444);
 
+/* additional minors for compatibility */
+struct oss_minor_dev {
+       unsigned short minor;
+       unsigned int enabled;
+} dev_list[] = {
+       { SND_DEV_DSP16 },
+       { SND_DEV_AUDIO },
+};
+
 static int __init oss_init(void)
 {
        int             err;
@@ -571,18 +561,12 @@ static int __init oss_init(void)
        sound_dmap_flag = (dmabuf > 0 ? 1 : 0);
 
        for (i = 0; i < ARRAY_SIZE(dev_list); i++) {
-               device_create(sound_class, NULL,
-                             MKDEV(SOUND_MAJOR, dev_list[i].minor), NULL,
-                             "%s", dev_list[i].name);
-
-               if (!dev_list[i].num)
-                       continue;
-
-               for (j = 1; j < *dev_list[i].num; j++)
-                       device_create(sound_class, NULL,
-                                     MKDEV(SOUND_MAJOR,
-                                           dev_list[i].minor + (j*0x10)),
-                                     NULL, "%s%d", dev_list[i].name, j);
+               j = 0;
+               do {
+                       unsigned short minor = dev_list[i].minor + j * 0x10;
+                       if (!register_sound_special(&oss_sound_fops, minor))
+                               dev_list[i].enabled = (1 << j);
+               } while (++j < num_audiodevs);
        }
 
        if (sound_nblocks >= MAX_MEM_BLOCKS - 1)
@@ -596,11 +580,11 @@ static void __exit oss_cleanup(void)
        int i, j;
 
        for (i = 0; i < ARRAY_SIZE(dev_list); i++) {
-               device_destroy(sound_class, MKDEV(SOUND_MAJOR, dev_list[i].minor));
-               if (!dev_list[i].num)
-                       continue;
-               for (j = 1; j < *dev_list[i].num; j++)
-                       device_destroy(sound_class, MKDEV(SOUND_MAJOR, dev_list[i].minor + (j*0x10)));
+               j = 0;
+               do {
+                       if (dev_list[i].enabled & (1 << j))
+                               unregister_sound_special(dev_list[i].minor);
+               } while (++j < num_audiodevs);
        }
        
        unregister_sound_special(1);
index 5580aced87308202e00d181194a6d4aa6689b920..6ce277860fd73c9231da9af6f6dfb1048d4bd0c4 100644 (file)
@@ -384,6 +384,9 @@ int register_sound_special_device(const struct file_operations *fops, int unit,
            case 4:
                name = "audio";
                break;
+           case 5:
+               name = "dspW";
+               break;
            case 8:
                name = "sequencer2";
                if (unit >= SOUND_STEP)