@@ -72,7 +72,7 @@ struct cadet {
struct timer_list readtimer;
__u8 rdsin, rdsout, rdsstat;
unsigned char rdsbuf[RDS_BUFFER];
- struct mutex lock;
+ struct mutex v4l2_lock;
int reading;
};
@@ -91,17 +91,13 @@ static __u16 sigtable[2][4] = {
static int cadet_getstereo(struct cadet *dev)
{
- int ret = V4L2_TUNER_SUB_MONO;
-
if (dev->curtuner != 0) /* Only FM has stereo capability! */
return V4L2_TUNER_SUB_MONO;
- mutex_lock(&dev->lock);
outb(7, dev->io); /* Select tuner control */
if ((inb(dev->io + 1) & 0x40) == 0)
- ret = V4L2_TUNER_SUB_STEREO;
- mutex_unlock(&dev->lock);
- return ret;
+ return V4L2_TUNER_SUB_STEREO;
+ return V4L2_TUNER_SUB_MONO;
}
static unsigned cadet_gettune(struct cadet *dev)
@@ -112,9 +108,6 @@ static unsigned cadet_gettune(struct cadet *dev)
/*
* Prepare for read
*/
-
- mutex_lock(&dev->lock);
-
outb(7, dev->io); /* Select tuner control */
curvol = inb(dev->io + 1); /* Save current volume/mute setting */
outb(0x00, dev->io + 1); /* Ensure WRITE-ENABLE is LOW */
@@ -136,8 +129,6 @@ static unsigned cadet_gettune(struct cadet *dev)
* Restore volume/mute setting
*/
outb(curvol, dev->io + 1);
- mutex_unlock(&dev->lock);
-
return fifo;
}
@@ -176,8 +167,6 @@ static void cadet_settune(struct cadet *dev, unsigned fifo)
int i;
unsigned test;
- mutex_lock(&dev->lock);
-
outb(7, dev->io); /* Select tuner control */
/*
* Write the shift register
@@ -196,7 +185,6 @@ static void cadet_settune(struct cadet *dev, unsigned fifo)
test = 0x1c | ((fifo >> 23) & 0x02);
outb(test, dev->io + 1);
}
- mutex_unlock(&dev->lock);
}
static void cadet_setfreq(struct cadet *dev, unsigned freq)
@@ -231,10 +219,8 @@ static void cadet_setfreq(struct cadet *dev, unsigned freq)
* Save current volume/mute setting
*/
- mutex_lock(&dev->lock);
outb(7, dev->io); /* Select tuner control */
curvol = inb(dev->io + 1);
- mutex_unlock(&dev->lock);
/*
* Tune the card
@@ -242,10 +228,8 @@ static void cadet_setfreq(struct cadet *dev, unsigned freq)
for (j = 3; j > -1; j--) {
cadet_settune(dev, fifo | (j << 16));
- mutex_lock(&dev->lock);
outb(7, dev->io); /* Select tuner control */
outb(curvol, dev->io + 1);
- mutex_unlock(&dev->lock);
msleep(100);
@@ -261,28 +245,20 @@ static void cadet_setfreq(struct cadet *dev, unsigned freq)
static int cadet_getvol(struct cadet *dev)
{
- int ret = 0;
-
- mutex_lock(&dev->lock);
-
outb(7, dev->io); /* Select tuner control */
if ((inb(dev->io + 1) & 0x20) != 0)
- ret = 0xffff;
-
- mutex_unlock(&dev->lock);
- return ret;
+ return 0xffff;
+ return 0;
}
static void cadet_setvol(struct cadet *dev, int vol)
{
- mutex_lock(&dev->lock);
outb(7, dev->io); /* Select tuner control */
if (vol > 0)
outb(0x20, dev->io + 1);
else
outb(0x00, dev->io + 1);
- mutex_unlock(&dev->lock);
}
static void cadet_handler(unsigned long data)
@@ -290,7 +266,7 @@ static void cadet_handler(unsigned long data)
struct cadet *dev = (void *)data;
/* Service the RDS fifo */
- if (mutex_trylock(&dev->lock)) {
+ if (mutex_trylock(&dev->v4l2_lock)) {
outb(0x3, dev->io); /* Select RDS Decoder Control */
if ((inb(dev->io + 1) & 0x20) != 0)
printk(KERN_CRIT "cadet: RDS fifo overflow\n");
@@ -302,7 +278,7 @@ static void cadet_handler(unsigned long data)
else
dev->rdsin++;
}
- mutex_unlock(&dev->lock);
+ mutex_unlock(&dev->v4l2_lock);
}
/*
@@ -328,7 +304,6 @@ static ssize_t cadet_read(struct file *file, char __user *data, size_t count, lo
unsigned char readbuf[RDS_BUFFER];
int i = 0;
- mutex_lock(&dev->lock);
if (dev->rdsstat == 0) {
dev->rdsstat = 1;
outb(0x80, dev->io); /* Select RDS fifo */
@@ -339,15 +314,14 @@ static ssize_t cadet_read(struct file *file, char __user *data, size_t count, lo
add_timer(&dev->readtimer);
}
if (dev->rdsin == dev->rdsout) {
- mutex_unlock(&dev->lock);
if (file->f_flags & O_NONBLOCK)
return -EWOULDBLOCK;
+ mutex_unlock(&dev->v4l2_lock);
interruptible_sleep_on(&dev->read_queue);
- mutex_lock(&dev->lock);
+ mutex_lock(&dev->v4l2_lock);
}
while (i < count && dev->rdsin != dev->rdsout)
readbuf[i++] = dev->rdsbuf[dev->rdsout++];
- mutex_unlock(&dev->lock);
if (copy_to_user(data, readbuf, i))
return -EFAULT;
@@ -527,11 +501,9 @@ static int cadet_open(struct file *file)
{
struct cadet *dev = video_drvdata(file);
- mutex_lock(&dev->lock);
dev->users++;
if (1 == dev->users)
init_waitqueue_head(&dev->read_queue);
- mutex_unlock(&dev->lock);
return 0;
}
@@ -539,13 +511,11 @@ static int cadet_release(struct file *file)
{
struct cadet *dev = video_drvdata(file);
- mutex_lock(&dev->lock);
dev->users--;
if (0 == dev->users) {
del_timer_sync(&dev->readtimer);
dev->rdsstat = 0;
}
- mutex_unlock(&dev->lock);
return 0;
}
@@ -654,7 +624,7 @@ static int __init cadet_init(void)
int res;
strlcpy(v4l2_dev->name, "cadet", sizeof(v4l2_dev->name));
- mutex_init(&dev->lock);
+ mutex_init(&dev->v4l2_lock);
/* If a probe was requested then probe ISAPnP first (safest) */
if (io < 0)
@@ -688,6 +658,7 @@ static int __init cadet_init(void)
dev->vdev.fops = &cadet_fops;
dev->vdev.ioctl_ops = &cadet_ioctl_ops;
dev->vdev.release = video_device_release_empty;
+ dev->vdev.lock = &dev->v4l2_lock;
video_set_drvdata(&dev->vdev, dev);
if (video_register_device(&dev->vdev, VFL_TYPE_RADIO, radio_nr) < 0) {