[PATCH] V4L: Fix hotplugging issues with saa7134
[pandora-kernel.git] / drivers / media / video / saa7134 / saa7134-oss.c
index fd9ed11..2990469 100644 (file)
@@ -903,22 +903,22 @@ int saa7134_dsp_create(struct saa7134_dev *dev)
 {
        int err;
 
-                        err = dev->dmasound.minor_dsp =
-                                register_sound_dsp(&saa7134_dsp_fops,
-                                                   dsp_nr[dev->nr]);
-                        if (err < 0) {
-                                goto fail;
-                        }
-                        printk(KERN_INFO "%s: registered device dsp%d\n",
-                               dev->name,dev->dmasound.minor_dsp >> 4);
-
-                        err = dev->dmasound.minor_mixer =
-                                register_sound_mixer(&saa7134_mixer_fops,
-                                                     mixer_nr[dev->nr]);
-                        if (err < 0)
-                                goto fail;
-                        printk(KERN_INFO "%s: registered device mixer%d\n",
-                               dev->name,dev->dmasound.minor_mixer >> 4);
+       err = dev->dmasound.minor_dsp =
+               register_sound_dsp(&saa7134_dsp_fops,
+                                       dsp_nr[dev->nr]);
+       if (err < 0) {
+               goto fail;
+       }
+       printk(KERN_INFO "%s: registered device dsp%d\n",
+               dev->name,dev->dmasound.minor_dsp >> 4);
+
+       err = dev->dmasound.minor_mixer =
+               register_sound_mixer(&saa7134_mixer_fops,
+                                       mixer_nr[dev->nr]);
+       if (err < 0)
+               goto fail;
+       printk(KERN_INFO "%s: registered device mixer%d\n",
+               dev->name,dev->dmasound.minor_mixer >> 4);
 
        return 0;
 
@@ -929,6 +929,31 @@ fail:
 
 }
 
+static int oss_device_init(struct saa7134_dev *dev)
+{
+       dev->dmasound.priv_data = dev;
+       saa7134_oss_init1(dev);
+       saa7134_dsp_create(dev);
+       return 1;
+}
+
+static int oss_device_exit(struct saa7134_dev *dev)
+{
+
+       unregister_sound_mixer(dev->dmasound.minor_mixer);
+       unregister_sound_dsp(dev->dmasound.minor_dsp);
+
+       saa7134_oss_fini(dev);
+
+       if (dev->pci->irq > 0) {
+               synchronize_irq(dev->pci->irq);
+               free_irq(dev->pci->irq,&dev->dmasound);
+       }
+
+       dev->dmasound.priv_data = NULL;
+       return 1;
+}
+
 static int saa7134_oss_init(void)
 {
         struct saa7134_dev *dev = NULL;
@@ -939,9 +964,7 @@ static int saa7134_oss_init(void)
         list_for_each(list,&saa7134_devlist) {
                 dev = list_entry(list, struct saa7134_dev, devlist);
                if (dev->dmasound.priv_data == NULL) {
-                       dev->dmasound.priv_data = dev;
-                       saa7134_oss_init1(dev);
-                       saa7134_dsp_create(dev);
+                       oss_device_init(dev);
                } else {
                        printk(KERN_ERR "saa7134 OSS: DMA sound is being handled by ALSA, ignoring %s\n",dev->name);
                        return -EBUSY;
@@ -951,6 +974,9 @@ static int saa7134_oss_init(void)
         if (dev == NULL)
                 printk(KERN_INFO "saa7134 OSS: no saa7134 cards found\n");
 
+       dmasound_init = oss_device_init;
+       dmasound_exit = oss_device_exit;
+
         return 0;
 
 }
@@ -967,18 +993,7 @@ void saa7134_oss_exit(void)
                if (!dev->dmasound.minor_dsp)
                        continue;
 
-                unregister_sound_mixer(dev->dmasound.minor_mixer);
-                unregister_sound_dsp(dev->dmasound.minor_dsp);
-
-               saa7134_oss_fini(dev);
-
-               if (dev->pci->irq > 0) {
-                       synchronize_irq(dev->pci->irq);
-                       free_irq(dev->pci->irq,&dev->dmasound);
-               }
-
-               dev->dmasound.priv_data = NULL;
-
+               oss_device_exit(dev);
         }
 
         printk(KERN_INFO "saa7134 OSS driver for DMA sound unloaded\n");