V4L/DVB (3200): Fix saa7134 ALSA/OSS collisions

- 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>

authored by Ricardo Cerqueira and committed by Mauro Carvalho Chehab 7bb95296 d5ea4e26

+51 -10
+24 -2
drivers/media/video/saa7134/Kconfig
··· 1 config VIDEO_SAA7134 2 tristate "Philips SAA7134 support" 3 - depends on VIDEO_DEV && PCI && I2C && SOUND && SND 4 select VIDEO_BUF 5 select VIDEO_IR 6 select VIDEO_TUNER 7 select CRC32 8 - select SND_PCM_OSS 9 ---help--- 10 This is a video4linux driver for Philips SAA713x based 11 TV cards. 12 13 To compile this driver as a module, choose M here: the 14 module will be called saa7134. 15 16 config VIDEO_SAA7134_DVB 17 tristate "DVB/ATSC Support for saa7134 based TV cards"
··· 1 config VIDEO_SAA7134 2 tristate "Philips SAA7134 support" 3 + depends on VIDEO_DEV && PCI && I2C 4 select VIDEO_BUF 5 select VIDEO_IR 6 select VIDEO_TUNER 7 select CRC32 8 ---help--- 9 This is a video4linux driver for Philips SAA713x based 10 TV cards. 11 12 To compile this driver as a module, choose M here: the 13 module will be called saa7134. 14 + 15 + config VIDEO_SAA7134_ALSA 16 + tristate "Philips SAA7134 DMA audio support" 17 + depends on VIDEO_SAA7134 && SOUND && SND && (!VIDEO_SAA7134_OSS || VIDEO_SAA7134_OSS = m) 18 + select SND_PCM_OSS 19 + ---help--- 20 + This is a video4linux driver for direct (DMA) audio in 21 + Philips SAA713x based TV cards using ALSA 22 + 23 + To compile this driver as a module, choose M here: the 24 + module will be called saa7134-alsa. 25 + 26 + config VIDEO_SAA7134_OSS 27 + tristate "Philips SAA7134 DMA audio support (OSS, DEPRECATED)" 28 + depends on VIDEO_SAA7134 && SOUND_PRIME && (!VIDEO_SAA7134_ALSA || VIDEO_SAA7134_ALSA = m) 29 + ---help--- 30 + This is a video4linux driver for direct (DMA) audio in 31 + Philips SAA713x based TV cards using OSS 32 + 33 + This is deprecated in favor of the ALSA module 34 + 35 + To compile this driver as a module, choose M here: the 36 + module will be called saa7134-oss. 37 38 config VIDEO_SAA7134_DVB 39 tristate "DVB/ATSC Support for saa7134 based TV cards"
+5 -2
drivers/media/video/saa7134/Makefile
··· 4 saa7134-video.o saa7134-input.o 5 6 obj-$(CONFIG_VIDEO_SAA7134) += saa7134.o saa7134-empress.o \ 7 - saa6752hs.o saa7134-alsa.o \ 8 - saa7134-oss.o 9 obj-$(CONFIG_VIDEO_SAA7134_DVB) += saa7134-dvb.o 10 11 EXTRA_CFLAGS += -I$(src)/..
··· 4 saa7134-video.o saa7134-input.o 5 6 obj-$(CONFIG_VIDEO_SAA7134) += saa7134.o saa7134-empress.o \ 7 + saa6752hs.o 8 + 9 + obj-$(CONFIG_VIDEO_SAA7134_ALSA) += saa7134-alsa.o 10 + obj-$(CONFIG_VIDEO_SAA7134_OSS) += saa7134-oss.o 11 + 12 obj-$(CONFIG_VIDEO_SAA7134_DVB) += saa7134-dvb.o 13 14 EXTRA_CFLAGS += -I$(src)/..
+10 -3
drivers/media/video/saa7134/saa7134-alsa.c
··· 989 struct saa7134_dev *dev = NULL; 990 struct list_head *list; 991 992 printk(KERN_INFO "saa7134 ALSA driver for DMA sound loaded\n"); 993 994 list_for_each(list,&saa7134_devlist) { ··· 1008 return -EBUSY; 1009 } 1010 } 1011 - 1012 - dmasound_init = alsa_device_init; 1013 - dmasound_exit = alsa_device_exit; 1014 1015 if (dev == NULL) 1016 printk(KERN_INFO "saa7134 ALSA: no saa7134 cards found\n"); ··· 1028 snd_card_free(snd_saa7134_cards[idx]); 1029 } 1030 1031 printk(KERN_INFO "saa7134 ALSA driver for DMA sound unloaded\n"); 1032 1033 return;
··· 989 struct saa7134_dev *dev = NULL; 990 struct list_head *list; 991 992 + if (!dmasound_init && !dmasound_exit) { 993 + dmasound_init = alsa_device_init; 994 + dmasound_exit = alsa_device_exit; 995 + } else { 996 + printk(KERN_WARNING "saa7134 ALSA: can't load, DMA sound handler already assigned (probably to OSS)\n"); 997 + return -EBUSY; 998 + } 999 + 1000 printk(KERN_INFO "saa7134 ALSA driver for DMA sound loaded\n"); 1001 1002 list_for_each(list,&saa7134_devlist) { ··· 1000 return -EBUSY; 1001 } 1002 } 1003 1004 if (dev == NULL) 1005 printk(KERN_INFO "saa7134 ALSA: no saa7134 cards found\n"); ··· 1023 snd_card_free(snd_saa7134_cards[idx]); 1024 } 1025 1026 + dmasound_init = NULL; 1027 + dmasound_exit = NULL; 1028 printk(KERN_INFO "saa7134 ALSA driver for DMA sound unloaded\n"); 1029 1030 return;
+12 -3
drivers/media/video/saa7134/saa7134-oss.c
··· 959 struct saa7134_dev *dev = NULL; 960 struct list_head *list; 961 962 printk(KERN_INFO "saa7134 OSS driver for DMA sound loaded\n"); 963 964 list_for_each(list,&saa7134_devlist) { 965 dev = list_entry(list, struct saa7134_dev, devlist); ··· 982 983 if (dev == NULL) 984 printk(KERN_INFO "saa7134 OSS: no saa7134 cards found\n"); 985 - 986 - dmasound_init = oss_device_init; 987 - dmasound_exit = oss_device_exit; 988 989 return 0; 990 ··· 1002 oss_device_exit(dev); 1003 1004 } 1005 1006 printk(KERN_INFO "saa7134 OSS driver for DMA sound unloaded\n"); 1007
··· 959 struct saa7134_dev *dev = NULL; 960 struct list_head *list; 961 962 + if (!dmasound_init && !dmasound_exit) { 963 + dmasound_init = oss_device_init; 964 + dmasound_exit = oss_device_exit; 965 + } else { 966 + printk(KERN_WARNING "saa7134 OSS: can't load, DMA sound handler already assigned (probably to ALSA)\n"); 967 + return -EBUSY; 968 + } 969 + 970 printk(KERN_INFO "saa7134 OSS driver for DMA sound loaded\n"); 971 + 972 973 list_for_each(list,&saa7134_devlist) { 974 dev = list_entry(list, struct saa7134_dev, devlist); ··· 973 974 if (dev == NULL) 975 printk(KERN_INFO "saa7134 OSS: no saa7134 cards found\n"); 976 977 return 0; 978 ··· 996 oss_device_exit(dev); 997 998 } 999 + 1000 + dmasound_init = NULL; 1001 + dmasound_exit = NULL; 1002 1003 printk(KERN_INFO "saa7134 OSS driver for DMA sound unloaded\n"); 1004