V4L/DVB (3200): Fix saa7134 ALSA/OSS collisions
authorRicardo Cerqueira <v4l@cerqueira.org>
Tue, 20 Dec 2005 20:26:26 +0000 (18:26 -0200)
committerMauro Carvalho Chehab <mchehab@brturbo.com.br>
Thu, 22 Dec 2005 09:55:06 +0000 (07:55 -0200)
- When ALSA or OSS are loaded, check if the other is present
Fixed hotplug notifiers cleanup on module removal
- The saa7134 DMA sound modules now have their own Kconfig entries, and
if built statically enforce exclusivity
- SND_PCM_OSS isn't necessary for the OSS driver

Signed-off-by: Ricardo Cerqueira <v4l@cerqueira.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@brturbo.com.br>
drivers/media/video/saa7134/Kconfig
drivers/media/video/saa7134/Makefile
drivers/media/video/saa7134/saa7134-alsa.c
drivers/media/video/saa7134/saa7134-oss.c

index c512c4411b38319b513b9bc9bfb7ac80bfda2c59..c0f604a6fe42be25651750f5d239b9ad6b0ddd37 100644 (file)
@@ -1,11 +1,10 @@
 config VIDEO_SAA7134
        tristate "Philips SAA7134 support"
-       depends on VIDEO_DEV && PCI && I2C && SOUND && SND
+       depends on VIDEO_DEV && PCI && I2C
        select VIDEO_BUF
        select VIDEO_IR
        select VIDEO_TUNER
        select CRC32
-       select SND_PCM_OSS
        ---help---
          This is a video4linux driver for Philips SAA713x based
          TV cards.
@@ -13,6 +12,29 @@ config VIDEO_SAA7134
          To compile this driver as a module, choose M here: the
          module will be called saa7134.
 
+config VIDEO_SAA7134_ALSA
+       tristate "Philips SAA7134 DMA audio support"
+       depends on VIDEO_SAA7134 && SOUND && SND && (!VIDEO_SAA7134_OSS || VIDEO_SAA7134_OSS = m)
+       select SND_PCM_OSS
+       ---help---
+         This is a video4linux driver for direct (DMA) audio in
+         Philips SAA713x based TV cards using ALSA
+
+         To compile this driver as a module, choose M here: the
+         module will be called saa7134-alsa.
+
+config VIDEO_SAA7134_OSS
+       tristate "Philips SAA7134 DMA audio support (OSS, DEPRECATED)"
+       depends on VIDEO_SAA7134 && SOUND_PRIME && (!VIDEO_SAA7134_ALSA || VIDEO_SAA7134_ALSA = m)
+       ---help---
+         This is a video4linux driver for direct (DMA) audio in
+         Philips SAA713x based TV cards using OSS
+
+         This is deprecated in favor of the ALSA module
+
+         To compile this driver as a module, choose M here: the
+         module will be called saa7134-oss.
+
 config VIDEO_SAA7134_DVB
        tristate "DVB/ATSC Support for saa7134 based TV cards"
        depends on VIDEO_SAA7134 && DVB_CORE
index 134f83a962188f7d8da5b0d45db4c5cb380455a3..1ba998424bbdcb376fbf6901028f765031aa1e32 100644 (file)
@@ -4,8 +4,11 @@ saa7134-objs :=        saa7134-cards.o saa7134-core.o saa7134-i2c.o    \
                saa7134-video.o saa7134-input.o
 
 obj-$(CONFIG_VIDEO_SAA7134) +=  saa7134.o saa7134-empress.o \
-                               saa6752hs.o saa7134-alsa.o \
-                               saa7134-oss.o
+                               saa6752hs.o
+
+obj-$(CONFIG_VIDEO_SAA7134_ALSA) += saa7134-alsa.o
+obj-$(CONFIG_VIDEO_SAA7134_OSS) += saa7134-oss.o
+
 obj-$(CONFIG_VIDEO_SAA7134_DVB) += saa7134-dvb.o
 
 EXTRA_CFLAGS += -I$(src)/..
index 6752dd1c1e8a48c4401fc2aa511657603fb78f77..ade05f75fdb05d2c23165c42091913ca56f67859 100644 (file)
@@ -989,6 +989,14 @@ static int saa7134_alsa_init(void)
        struct saa7134_dev *dev = NULL;
        struct list_head *list;
 
+       if (!dmasound_init && !dmasound_exit) {
+               dmasound_init = alsa_device_init;
+               dmasound_exit = alsa_device_exit;
+       } else {
+               printk(KERN_WARNING "saa7134 ALSA: can't load, DMA sound handler already assigned (probably to OSS)\n");
+               return -EBUSY;
+       }
+
        printk(KERN_INFO "saa7134 ALSA driver for DMA sound loaded\n");
 
        list_for_each(list,&saa7134_devlist) {
@@ -1001,9 +1009,6 @@ static int saa7134_alsa_init(void)
                }
        }
 
-       dmasound_init = alsa_device_init;
-       dmasound_exit = alsa_device_exit;
-
        if (dev == NULL)
                printk(KERN_INFO "saa7134 ALSA: no saa7134 cards found\n");
 
@@ -1023,6 +1028,8 @@ static void saa7134_alsa_exit(void)
                snd_card_free(snd_saa7134_cards[idx]);
        }
 
+       dmasound_init = NULL;
+       dmasound_exit = NULL;
        printk(KERN_INFO "saa7134 ALSA driver for DMA sound unloaded\n");
 
        return;
index c450d57b294971bfaff29e6024c6a99fc42fe8ff..8badd2a9cb2ff08d1e5fe07661999c245e6708eb 100644 (file)
@@ -959,8 +959,17 @@ static int saa7134_oss_init(void)
        struct saa7134_dev *dev = NULL;
        struct list_head *list;
 
+       if (!dmasound_init && !dmasound_exit) {
+               dmasound_init = oss_device_init;
+               dmasound_exit = oss_device_exit;
+       } else {
+               printk(KERN_WARNING "saa7134 OSS: can't load, DMA sound handler already assigned (probably to ALSA)\n");
+               return -EBUSY;
+       }
+
        printk(KERN_INFO "saa7134 OSS driver for DMA sound loaded\n");
 
+
        list_for_each(list,&saa7134_devlist) {
                dev = list_entry(list, struct saa7134_dev, devlist);
                if (dev->dmasound.priv_data == NULL) {
@@ -974,9 +983,6 @@ 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;
 
 }
@@ -997,6 +1003,9 @@ static void saa7134_oss_exit(void)
 
        }
 
+       dmasound_init = NULL;
+       dmasound_exit = NULL;
+
        printk(KERN_INFO "saa7134 OSS driver for DMA sound unloaded\n");
 
        return;