V4L/DVB (9533): cx88: Add support for TurboSight TBS8910 DVB-S PCI card
[cascardo/linux.git] / sound / i2c / other / tea575x-tuner.c
index 83e9005..549b4eb 100644 (file)
@@ -18,7 +18,7 @@
  *   along with this program; if not, write to the Free Software
  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  *
- */      
+ */
 
 #include <asm/io.h>
 #include <linux/delay.h>
@@ -87,10 +87,9 @@ static void snd_tea575x_set_freq(struct snd_tea575x *tea)
 static int snd_tea575x_ioctl(struct inode *inode, struct file *file,
                             unsigned int cmd, unsigned long data)
 {
-       struct video_device *dev = video_devdata(file);
-       struct snd_tea575x *tea = video_get_drvdata(dev);
+       struct snd_tea575x *tea = video_drvdata(file);
        void __user *arg = (void __user *)data;
-       
+
        switch(cmd) {
                case VIDIOCGCAP:
                {
@@ -111,9 +110,9 @@ static int snd_tea575x_ioctl(struct inode *inode, struct file *file,
                case VIDIOCGTUNER:
                {
                        struct video_tuner v;
-                       if (copy_from_user(&v, arg,sizeof(v))!=0) 
+                       if (copy_from_user(&v, arg,sizeof(v))!=0)
                                return -EFAULT;
-                       if (v.tuner)    /* Only 1 tuner */ 
+                       if (v.tuner)    /* Only 1 tuner */
                                return -EINVAL;
                        v.rangelow = (87*16000);
                        v.rangehigh = (108*16000);
@@ -145,24 +144,24 @@ static int snd_tea575x_ioctl(struct inode *inode, struct file *file,
                        snd_tea575x_set_freq(tea);
                        return 0;
                case VIDIOCGAUDIO:
-               {       
+               {
                        struct video_audio v;
                        memset(&v, 0, sizeof(v));
                        strcpy(v.name, "Radio");
                        if(copy_to_user(arg,&v, sizeof(v)))
                                return -EFAULT;
-                       return 0;                       
+                       return 0;
                }
                case VIDIOCSAUDIO:
                {
                        struct video_audio v;
-                       if(copy_from_user(&v, arg, sizeof(v))) 
-                               return -EFAULT; 
+                       if(copy_from_user(&v, arg, sizeof(v)))
+                               return -EFAULT;
                        if (tea->ops->mute)
                                tea->ops->mute(tea,
                                               (v.flags &
                                                VIDEO_AUDIO_MUTE) ? 1 : 0);
-                       if(v.audio) 
+                       if(v.audio)
                                return -EINVAL;
                        return 0;
                }
@@ -175,6 +174,21 @@ static void snd_tea575x_release(struct video_device *vfd)
 {
 }
 
+static int snd_tea575x_exclusive_open(struct inode *inode, struct file *file)
+{
+       struct snd_tea575x *tea = video_drvdata(file);
+
+       return test_and_set_bit(0, &tea->in_use) ? -EBUSY : 0;
+}
+
+static int snd_tea575x_exclusive_release(struct inode *inode, struct file *file)
+{
+       struct snd_tea575x *tea = video_drvdata(file);
+
+       clear_bit(0, &tea->in_use);
+       return 0;
+}
+
 /*
  * initialize all the tea575x chips
  */
@@ -193,9 +207,10 @@ void snd_tea575x_init(struct snd_tea575x *tea)
        tea->vd.release = snd_tea575x_release;
        video_set_drvdata(&tea->vd, tea);
        tea->vd.fops = &tea->fops;
+       tea->in_use = 0;
        tea->fops.owner = tea->card->module;
-       tea->fops.open = video_exclusive_open;
-       tea->fops.release = video_exclusive_release;
+       tea->fops.open = snd_tea575x_exclusive_open;
+       tea->fops.release = snd_tea575x_exclusive_release;
        tea->fops.ioctl = snd_tea575x_ioctl;
        if (video_register_device(&tea->vd, VFL_TYPE_RADIO, tea->dev_nr - 1) < 0) {
                snd_printk(KERN_ERR "unable to register tea575x tuner\n");
@@ -225,11 +240,11 @@ static int __init alsa_tea575x_module_init(void)
 {
        return 0;
 }
-        
+
 static void __exit alsa_tea575x_module_exit(void)
 {
 }
-        
+
 module_init(alsa_tea575x_module_init)
 module_exit(alsa_tea575x_module_exit)